1. 3

    When using the datastore concept, one often ends up with a module for each of the “row kinds”. This can be a good pattern – often more performant and more convenient – but it is still OOP: the module encapsulates state and behavior.

    One advantage of the module-per-row-kind strategy is that it allows for a narrower API and in particular lets one define just a few bulk operations which are implemented in a performant way. Having an-object-per-row lets you perform any bulk operation – for item in arbitrary_selection: do something – but the affordance it provides is guaranteed to offer low performance, be unreliable, and hold locks for long periods of time, blocking out other users of the database.

    Many will say, that good OOP is not necessarily creating a Car class just because you are building a CRM for a car dealership – which is to say, naively mapping business objects to classes is not the only way to OOP. Bad OOP is still OOP; but good OOP is also still OOP. Is the datastore-oriented style something more than just a better OOP design?

    1. 2

      Described features like sum types are cool and useful, but once you get language with static types, it’s all going down the rabbit hole: eventually, to express your domain model, you’re going to need ad-hoc polymorphism, higher-kinded types, GADTs, existential types, etc. Or to think how to overcome lack of some of these features in language.

      It would be interesting to read about experience in building “real-world” applications with reason/ocaml and how it feels to use language without ad-hoc polymorphism and some other features. If going from plain JS, everyone is accustomed to using overridden methods and just plain duck typing, which is a form of ad-hoc polymorphism, but with Reason, there’s no such feature. It would be interesting to hear how to deal with that.

      1. 8

        OCaml has (multiple) inheritance, you can pass records of closures if you want, and you can parameterize modules over other modules. There are a lot of options here already. Reason doesn’t really advertise the class based features so much but it’s still supported.

        1. 5

          …but once you get language with static types, it’s all going down the rabbit hole: eventually, to express your domain model, you’re going to need ad-hoc polymorphism, higher-kinded types, GADTs, existential types, etc. Or to think how to overcome lack of some of these features in language.

          One isn’t required to express the whole domain model with types, just because the language has them. There is a middle way.

          1. 2

            In a language without ad-hoc polymorphism, you’d write a map function for each type instead of an instance of Functor for each type, etc. It would be mostly as simple as that.

          1. 1

            I as confused by this part:

            PostgreSQL supports three join strategies, and they benefit from parallelism as follows:

            • Nested Loop Join has no parallel-aware mode, but it doesn’t matter…
            • Hash Join previously suffered from the same problem as Merge Join, but that is solved by Parallel Hash. You can think of Hash Join as a kind of Nested Loop Join…

            Does “Nested Loop Join has no parallel-aware mode, but it doesn’t matter…” mean there’s no parallelism for nested loop joins, or that a node lower down in the plan (like a sequential scan) takes care of it?

            1. 8

              Imagining a time where I can go to the local maker space and print some open source garments that I have modified to have larger pockets.

              In the present, I just stick to what works and get a lot of stuff from the same brand, since I know it fits me and my essential items well.

              1. 5

                Programmable sewing machine would be quite amazing.

                1. 1


                  Softwear’s revolutionary digital t-shirt SEWBOT® Workline is fully autonomous and requires a single operator, producing one complete t-shirt every 22 seconds…

                  1. 1

                    Found this as well: https://www.youtube.com/watch?v=qXFUqCijkUs Seems like clothes would have be ‘re-architected’ for this method.

                    1. 1

                      Why would they need to be rearchitected? The video doesn’t seem to point to that directly.

                      1. 1

                        Not all clothes are assembled from fabric panels that stack neatly on top of each other, consider the crotch of the common pants, or double inner seam of jeans.

                  2. 1

                    Ha, there’s actually some work on this, I think there’s a DARPA project as well, robotic garment assembly. I’ve given this topic a lot of thought myself. Robots can wield, why not sew?

                1. 3

                  Pockets, unlike purses, are hidden, private spaces.

                  This seems backwards. One’s bag does a much better job of concealing the outline and even the presence of objects.

                  1. 1

                    Yes but then you need to carry a bag, which most men don’t need too. Many men may carry a bag to work, but going to dinner or the game on the weekend most men will not be carrying anything outside of their pockets.

                  1. 4

                    The First Amendment covers more than literal speech: source code and technical data is a form of expression just as much as a poem or song, and are equally protected.

                    There is no principled endpoint to this – if you followed this sort of reasoning, then everything would be protected under free speech, including all physical objects. That being said, I am not optimistic for the government’s prospects in this case. At least two appeals courts, the 9th circuit (Bernstein v. US), and the 6th circuit (Junger v. Daley) have already explicitly held that source code is free speech. It is only a matter of time before CAD files (imo, incorrectly) will be interpreted as closer to source code than physical objects.

                    1. 2

                      if you followed this sort of reasoning, then everything would be protected under free speech, including all physical objects

                      Source code, technical data, poems, and songs are all intangible; you could conceivably speak the information aloud. Where is the slippery slope to physical objects?

                      1. 1

                        If you agree with the following three statements:

                        • Source code is free speech.
                        • CAD files are a form of source code.
                        • The government should not restrict free speech.

                        then, I think, you are logically forced into accepting that it will be impossible to regulate any 3D printed objects, since it is (both legally and practically) infeasible to restrict what people do on their own 3D printers in their own homes.

                        1. 3

                          …you are logically forced into accepting that it will be impossible to regulate any 3D printed objects, since it is (both legally and practically) infeasible to restrict what people do on their own 3D printers in their own homes.

                          It’s not legally impossible to restrict use of 3D printers anymore than it is to restrict use of CNC machines. “Shop guns” are a thing and if unregistered are manifestly illegal in California.

                          1. 2

                            Oh, I see what you mean. That doesn’t lead to “everything” being protected by free speech; 3D printed objects are a subset of all physical objects. You can’t 3D-print uranium, for instance.

                            It would be impossible to regulate plastic shapes… but so what?

                            1. 2

                              I don’t think that logically follows, free speech doesn’t mean you can say anything you want.

                              1. 1

                                Absent imminent lawless action, I think it does. What do you think it means?

                                1. 2

                                  Imminent lawless action is one of a few categories of unprotected speech. Others include libel and false advertising.

                                  1. 1

                                    This is in the context of safety/secuity-based restrictions on free speech (i.e. guns). Should have made that clearer.

                        1. 4

                          Some of the comments indicate confusion with the laws involved. Like:

                          You cannot put nuclear bomb plans on the Internet, that’s illegal and on the ‘black’ end of the scale. Webcomics and news sites tend to stay white, in the free-speech, fully-legal territory.

                          Putting those kinds of plans on the internet isn’t “not free speech” – it’s a violation of (doubtless numerous) laws governing classified information. There aren’t laws against sharing “bad information” but there are definitely laws against sharing things the government has generated itself and maintained in a classified way.

                          There’s nothing secret about plans for simple weapons, though. The plans and process of assembly for many ubiquitous service weapons – Glocks and AR-15s and all the rest – are known throughout the world.

                          On the one hand, precision manufacturing gets easier and cheaper every year. On the other, there is a practical need to limit dangerous use of this technology. It seems like some people are banking on ignorance as a solution.

                          1. 1

                            This seems to be based on the idea, that one has an absolute right to license one’s creation as one sees fit. This implies a kind of individual sovereignty, but there is no basis for that in the law of any nation. The government can seize anything it wants, with sound justification. Economic development is sound enough – witness eminent domain. National defense has led to substantial seizures in the past, and not unlawfully, because the conduct of war abuts the outer edges of the legal system and in a very real sense takes precedence over it.

                            1. 5

                              I like several bits of this and dislike several other bits, but one thing that stands out to me is the seemingly continual refusal to place responsibility on the people consuming and using tech:

                              When software encourages us to take photos that are square instead of rectangular, or to put an always-on microphone in our living rooms, or to be reachable by our bosses at any moment, it changes our behaviors, and it changes our lives.

                              Users volunteer for this. Most of the people taken advantage of by tech do so by sleepwalking, like lemmings, into the grim meathook future some of us create to monetize them. Nobody holds a gun to their head and says “Put Amazon Echo in your house or you get shot by the Bezostruppen.” Nobody says “Hey you should totally enter a multiyear contract for this smartphone that will bleed you dry and spy on you instead of using a cheapo burnerphone or else we will put you in jail.” There is no national law that says “Cititzen, you must participate in the two-minutes hate on Twitter or else your voting privileges will be revoked.”

                              There is no end of the trouble we get into if we ignore the actions, the real actions, that got us here.

                              1. 11

                                Interestingly, lemmings don’t actually walk to their death as their environment typically only contains lakes they can swim across. Put them in front of an ocean though…

                                Which is actually the perfect metaphor. Put people into environments they are unfamiliar with, maladapated to, and unable to even ask the right questions and it isn’t all that surprising that they won’t ultimately act in their interests.

                                But I guess we can blame the people who software hurts for being hurt by that software, which they couldn’t hope to understand without deep study.

                                1. 4

                                  When there is minimal consumer choice, it’s hard to blame consumers for making the wrong choice. Robust consumer choice would be something close to feature-by-feature optionality: smartphones without spy powers, or only with photo spy powers, for example. In point of fact, even a smartphone with a hardware keyboard is a non-option nowadays.

                                  This is in due in no small part to the limits and strengths of mass manufacturing: if everyone buys the smartphone that’s good for 51% of the people, we all enjoy a better phone for less money – but that puts the power of feature selection out of consumers’ hands. They get the phone that the designers designed: take it or leave it.

                                  The responsibility – moral and otherwise – for those features rests squarely with those who made the phone, not those who bought it.

                                  1. 4

                                    Nobody says “Hey you should totally enter a multiyear contract for this smartphone that will bleed you dry and spy on you instead of using a cheapo burnerphone or else we will put you in jail.”

                                    No, sure. But (to take just this example) the contract and the undeniable benefits of the smartphone, obviously without any reference to any potential downsides, are what’s advertised, sold, heavily pushed, to the extent that many won’t even realise there’s an alternative - and when availability of the features and capabilities provided are normalised to the extent that getting by without them involves significant extra effort, then in the majority sections of world outside of “people who understand, and can either afford or have to spend significant parts of their time understanding, technology”, that’s effectively all that exists.

                                    1. 1

                                      Exactly. Ill add this is true even when the constraints between two solutions are similar enough that the safer/quality/free-er one requires no sacrifice or less. Getting people to switch from texts to IM… important since texts were a downgrade from IM (esp with delays)… was hard despite equivalent usability, better thing being free, better thing having more features (optional though), some being private, and so on.

                                      An uphill battle even when supplier went above and beyond expectations making a better product for them. Usually laziness or apathy was reason when other factors were eliminated.

                                    1. 2

                                      But abandoning the comfort that comes with displacing damage into distant landscapes also means reckoning with the convenient poetry of magic dust and the idea that there is anything unique or rare about an age fueled by colonialist fictions and extractive regimes. If anything about this age is rare, perhaps it is the possibility that our fraught networked systems have finally reached such a unique point, with their environmental and social consequences so visibly intertwined, that they have become impossible to ignore.

                                      Accepting this at face value it seems we must say: the more things change, the more they stay the same.

                                      1. 2

                                        Does a change like this reduce or increase contention in for SERIALIZABLE transaction isolation? Or does it have no effect?

                                        1. 2

                                          not really the point of the article, but the one thing i’ve never found a good tool for is deploying my application. its something that i absolutely don’t want to build, but keep on reinventing for every project i work on.

                                          1. 2

                                            I’d like to solve this problem, but I have very strong opinions about how it should be done.

                                            1. 2

                                              Write down the problem/requirements in a blog post and submit it here. I love to read about unsolved problems. Maybe someone even knows a solution.

                                              1. 1

                                                Having written these things for a few startups (Instacart, Airbnb) I can say, it’s tough to make a clean API for it and that makes generality, reusability and consistency (all requirements for a “tool” instead of a “solution”) very difficult.

                                              1. 7

                                                The Big Co’s of the world are rife with this problem. Even worse, in the meetings I attend I know who these people are, but there is little I can do about it. I was really hoping the countermeasures section was written as part of this post, because I’d really like some idea here, other than just bluntly calling out the saboteurs.

                                                1. 4

                                                  The trick is to establish consensus on what is to be done before the meeting, and make sure the chair is on board.

                                                  1. 1

                                                    Well, having an agenda and goals are important for every meeting…but when a saboteur derails a group, even for a moment, getting back on track to complete the stated purpose within the timebox is not easy.

                                                    1. 1

                                                      Not with a capable chair.

                                                  2. 3

                                                    It’s probably something well beyond the Big Co’s of the world. My wife recognized these as a teacher in a small department in a mid-sized school. I recognize these tactics from a variety of different jobs in manual labour.

                                                    1. 1

                                                      Sometimes making the same “reasonable” suggestions, or amplifying them, puts them in a spot where they can’t go forward and so, to maintain momentum, have to go back.

                                                    1. 2

                                                      This is a two cultures thing.

                                                      In San Francisco there are many small companies where interesting product work and good taste count for so much relative to the fundamentals.

                                                      1. 2

                                                        I wonder if ARC is good enough for the kinds of programs Raymond is discussing.

                                                        1. 3

                                                          There is some innate affinity for computer programming which you must be born with, and cannot be taught

                                                          It’s hard to say whether this is true or false, or even what people believe.

                                                          On the one hand, people are not all equally good at everything.

                                                          On the other, even if they were, becoming good at things takes time; and if that length of time is long enough than it is hard to say what the practical difference is between not having an innate ability and simply not having the skill at present.

                                                          1. 2

                                                            This code speaks to Haskell’s really strength – the ability to author clear, re-useable abstractions. It is only half in jest that Simon Peyton-Jones called Haskell “…the world’s most beautiful imperative language.”.

                                                            The strength of Haskell’s abstracting power can also be a weakness. The author writes:

                                                            …this site exclusively uses the async package and the stm package for concurrency. Concurrency is represented explicitly and used in IO.


                                                            …in order to make it easier for non-Haskell users, several famous utility functions and excessive point-free style are avoided.

                                                            You can do everything you do in Go in Haskell, in a very similar way; but you can also do it in a totally different way; and it’s hard to say what you’ll see in the wild.

                                                            The fact that Haskell doesn’t bake in try ... catch doesn’t mean you won’t see code with exceptions. For awhile, what it meant was that one saw many similar-but-not-the-same-approaches to this kind of error handling – and anyone could code their own.

                                                            1. 1

                                                              This makes me appreciate zero values in Go. Instead of having to write a builder, I’d just declare a variable and set fields on it. I realize Rust insists on explicit initialization, but you could at least approximate that here: just write a function that returns a struct and set fields on that. What’s the advantage of the with_whatever methods?

                                                              1. 14

                                                                If this is your use case, Rust has a protocol around the Default trait and field initialization syntax.

                                                                struct Foo {
                                                                  field1: u32,
                                                                  field2: u32
                                                                fn main() {
                                                                  let foo = Foo {
                                                                    field1: 1,
                                                                    .. Foo::default()

                                                                Alternatively, you can implement Default on that.

                                                                impl Default for Foo {
                                                                  fn default() -> Foo {
                                                                    Foo { field1: 3, field2: 2 }

                                                                The advantage of Builders is that they are lazy and can be passed around. So, for example, I can have a library that pre-builds requests in a certain fashion and then hand them off to a user defined function that sets additional data.

                                                                1. 1

                                                                  I don’t get it. I can pass around an object and set fields on it too, what’s the advantage?

                                                                  1. 10

                                                                    Struct fields in Rust are private by default, so having it leave scope might lead to people not being allowed to assign those fields.

                                                                    Additionally, if forgot this: Rust is a generic language and patterns like the following aren’t uncommon.

                                                                    fn with_path<P: AsRef<Path>>(&mut self, pathlike: P) {

                                                                    Which means that the method takes anything that can be turned into a (filesystem)-Path. A string, a path, an extensible pathbuffer, etc.

                                                                    It enables you strictly more things to do. Yes, at the cost of some verbosity, which you can avoid in simple cases.

                                                                    1. 5

                                                                      A TBuilder doesn’t type check as a valid T object. This is the real value of the builder pattern (in Rust and Go and Java and…Haskell): one can write a fairly strict definition for T, and wherever one has a function that accepts a T, one can be sure that the T is fully constructed and valid to use. The TBuilder is there for your CLI parser, web API, or chatbot to use, while stitching together a full object from defaults+input, or some other combination of sources.

                                                                      Distinguishing between T and TBuilder prevents a partial object from masquerading as a full object.

                                                                  2. 7

                                                                    This is an orthogonal thing for the most part. For example, sometimes I use builders in Go when the initialization logic is more complicated.

                                                                  1. 5

                                                                    The post in question Big-O: how code slows as data grows

                                                                    The comment by ‘pyon’:

                                                                    You should be ashamed of this post. How dare you mislead your readers? In amortized analysis, earlier cheap operations pay the cost of later expensive ones. By the time you need to perform an expensive operation, you will have performed enough cheap ones, so that the cost of the entire sequence of operations is bounded above by the sum of their amortized costs. To fix your list example: a sequence of cheap list inserts pays the cost of the expensive one that comes next.

                                                                    If you discard the emotion, he gives out a fairly interesting additional note about what amortized analysis means. Instead of giving the information value, Ned reacts on the part that questions his authority. Such a brittle ego that puts you to writing a small novel worth’s of rhetoric instead of shrugging it off. Childish.

                                                                    1. 52

                                                                      If @pyon had just phrased the first part of the comment like “You’re making a number of simpliications regarding “amortization” here that I believe are important…” this would probably not have escalated. This is what Ned means with being toxic - being correct, and being a douche about it.

                                                                      1. 10

                                                                        Indeed; the original article appeared on Lobsters and featured a thoughtful discussion on amortization.

                                                                        1. 2

                                                                          I wonder whether better word choice without changing the meaning would help one step earlier: the original post did include «you may see the word “amortized” thrown around. That’s a fancy word for “average”», which sounds a bit dismissive towards the actual theory. Something like «Notions of ‘‘amortized’’ and ‘‘average’’ complexity are close enough for most applications» would sound much more friendly.

                                                                          (And then the follow-up paints the previous post as if it was a decision to omit a detail, instead of a minor incorrectness in the text as written, which can be (maybe unconsciously) used to paint the situation as «correctness versus politeness», and then options get represented as if they were mutually exclusive)

                                                                          1. 4

                                                                            I feel like that would have put the author in a more defensible position on this specific point, yes. Being clear about where additional nuance exists and where it doesn’t is something that anyone writing about technical subjects should strive for, simply because it’s useful to the reader.

                                                                            I don’t think it’s likely that that clarification would have much of an effect on most readers, since the hypothetical reader who’s mislead would have to study complexity theory for some years to get to the point where it’s relevant, and by that time they’ll probably have figured it out some other way. We should all be so lucky as to write things that need several years of study before their imperfections become clear. :)

                                                                            But more to the point, while I can’t know anything about this specific commenter’s intent, somebody who’s determined to find fault can always do so. Nobody is perfect, and any piece of writing can be nit-picked.

                                                                            1. 1

                                                                              Several years sounds like an upper bound for an eventually succesful attempt. A couple months can be enough to reach the point in a good algorithms textbook where this difference becomes relevant and clear (and I do not mean that someone would do nothing but read the textbook).

                                                                              I would hope that the best-case effect on the readers could be a strong hint that there is something to go find in a textbook. If someone has just found out that big-O notation exists and liked how it allows to explain the practical difference between some algorithms, it is exactly the time to tell them «there is much more of this topic to learn».

                                                                              These two posts together theoretically could — as a background to the things actually discussed in them — create an opposite impression, but hopefully it is just my view as a person who already knows the actual details and no newbie will actually get the feeling that the details of the theory are useless and not interesting.

                                                                              As for finding something to nitpick — my question was whether the tone of the original paragraph could have made it not «finding» but «noticing the obvious». And whether the tone may have changed — but probably nobody will ever know, even the participants of the exchange — the desire to put a «well, actually…» comment into the desire to complain.

                                                                              1. 3

                                                                                Not having previous familiarity with this subject matter, I was guessing at how advanced the material was. :)

                                                                                I agree about your best case, and that it’s worth trying for whenever we write.

                                                                                I’ve never found anything that avoids the occasional “well, actually”, and not for want of trying. This is not an invitation to tell me how to; I think it’s best for everyone if we leave the topic there. :)

                                                                                1. 1

                                                                                  I consider a polite «well, actually» a positive outcome… (Anything starting with a personal attack is not that, of course)

                                                                        2. 25

                                                                          It’s possible to share a fairly interesting additional note without also yelling at people. Regardless of what Pyon had to say, he was saying it in a very toxic manner. That’s also childish.

                                                                          1. 5

                                                                            Correct. But I don’t just care about the emotion. I care about the message.

                                                                            Instead of trying to change web into a safe haven of some kind, why not admire it in its colors? Colors of mud and excrete among the colors of flowers and warmth, madness and clarity. You have very little power over having people get angry or aggressive about petty things. Though you can change a lot yourself and not take up about everything that’s said. Teaching your community this skill is also a pretty valuable in life overall.

                                                                            1. 32

                                                                              I don’t want my community to be defined by anger and aggression. I want beginners to feel like they can openly ask questions without being raged or laughed at. I want people to be able to share their knowledge without being told they don’t deserve to program. I want things to be better than they currently are.

                                                                              Maintaining a welcoming, respectful community is hard work and depends on every member being committed to it. Part of that hard work is calling out toxic behavior.

                                                                              1. 5

                                                                                I want beginners to feel like they can openly ask questions without being raged or laughed at.

                                                                                While I agree this is critically important, it’s not entirely fair to conflate “beginners asking questions” and “people writing authoritative blog posts”.

                                                                              2. 10

                                                                                Yeah. That kind of self-regulation and dedication to finding signal in noise are endlessly rewarding traits worth practicing. And to extend your metaphor, we weed the garden because otherwise they’ll choke out some of the flowers.

                                                                                1. 5

                                                                                  But I don’t just care about the emotion. I care about the message.

                                                                                  I’m with you unless the message includes clear harm. I’ll try to resist its affect on me but advocate such messages are gone. That commenter was being an asshole on top of delivering some useful information. Discouraging the personal attacks increases number of people who will want to participate and share information. As Ned notes, such comment sections or forums also get more beginner friendly. I’m always fine with a general rule for civility in comments for such proven benefits.

                                                                                  Edit: While this is about a toxic @pyon comment, I think I should also illustrate one like I’m advocating for that delivers great information without any attacks. pyon has delivered quite a lot of them in discussions on programming language theory. Here’s one on hypergraphs:


                                                                                  1. 5

                                                                                    I personally always care about the emotion (as an individual, not as a site moderator), it’s an important component of any communication between humans. But I understand your perspective as well.

                                                                                    1. 3

                                                                                      I may have been unclear. I do too. I was just looking at it from other commenters’ perspective of how Id think if I didnt care about it but wanted good info and opportunities in programming sphere. Id still have to reduce harm/toxicity to other people by ground rules to foster good discussion and bring more people in.

                                                                                      So, whether emotional or not, still cant discount the emotional effect of comments on others. Still should put some thought into that with reducing personal attacks being among easiest compromise as they add nothing to discussions.

                                                                                      1. 2

                                                                                        Ah! Okay. I misunderstood then, and it sounds like we’re in agreement.

                                                                                  2. 4

                                                                                    It’s ridiculous to say that if someone cannot ignore personal attacks, they have a brittle ego and are childish. While also defending personal attacks and vitriol as being the thing that we should celebrate about the internet. Rather, we should critique people for being assholes. The comment was critiquing the manner and tone in which he explained amortized analysis, but he’s not allowed to say that the comment’s manner and tone was bad? It’s ridiculous. The comment was bad, not because of the point it made, but because it made the point badly.

                                                                                2. 22

                                                                                  Compare this approach:

                                                                                  I believe this post simplifies the idea incorrectly. In amortized analysis, earlier (cheap) operations pay the cost of later (expensive) ones. When you need to perform an expensive operation, you will have performed enough cheap ones that the cost of the entire sequence of operations is bounded by the sum of their amortized costs. In the context of your list example, a sequence of cheap list inserts would pay the cost of the expensive one that comes next.

                                                                                  This is the same content, free of “shame” and accusations of “misleading.” The original comment is a perfect example of the terrible tone that people take, as discussed in this post and in my previous post of Simon Peyton-Jones’ email.

                                                                                  1. 4

                                                                                    Instead of giving the information value, Ned reacts on the part that questions his authority.

                                                                                    The author does give it value. You’ve missed the point. The author isn’t saying it’s incorrect or not valuable; he’s saying that this attitude from experts (who use their expertise as a tool to put others down) is highly toxic.

                                                                                    1. 4

                                                                                      If you discard the emotion, he gives out a fairly interesting additional note about what amortized analysis means. Instead of giving the information value, Ned reacts on the part that questions his authority.

                                                                                      It’s not clear that Ned interprets pyon as questioning his authority. His criticism is of pyon‘s tone, which is histrionic. The cutting intro isn’t bad if we discard it; but what is the effect if we include it? It would be more balanced for Ned to discuss the details and value of pyon’s post, but that does not invalidate Ned’s point.

                                                                                    1. 1