A Modern App Developer and an Old-Timer System Developer Walk into a Bar - <AUTHOR> http://zhen.org/blog/two-developers-walk-into-a-bar/ <comment><USER2> I suppose I'm a modern app developer, so here's what I would actually do:

Postgres.

1) I'm not going to invent my own system. I am not the first person who wants to store addresses and boolean values. If I'm looking at this occasionally over many months, I don't want to keep relearning my elegant bit-structure.

2) SQL is great, Postgres is even better with built-in network operators[1] for the more specific queries (e.g. subnets.)

3) Bitfields are all fun and games until you want to change things. I'm already having flashbacks to rails `has_bitfield` columns. Also, fewer people can confidently twiddle bits than can understand boolean SQL columns.

4) The author mentions possible compression methods. I'd rather a tested project like Postgres think about everything to do with storing my data.

I understand the criticism, but with cloud storage so cheap it feels like optimization just to show off. I'd rather save time than bits. If there is a satire that involves me using Postgres when I shouldn't, that would be welcome.

[1] [http://www.postgresql.org/docs/current/static/functions- net....](http://www.postgresql.org/docs/current/static/functions-net.html)

<comment><USER3> Exactly. Change "json" to "relational DB" and it's not close as ridiculous as author implies. All questions mentioned _could_ be answered with a single SQL: although it will take quite a while. And it is much more extendable than this "huge array" approach.

The only thing is that by saying "Postgres" you say pretty much nothing: the real question here is how'd you structure the db. 300M a month is pretty huge, so it's really worth to think if we should just pile everything in 1 table (unique key ip+month, all ports are columns) or if we can denormalize something.

<comment><USER4> 300M per month doesn't sound like all that much to me?

<comment><USER3> Well, it will be quite a table to do your selects against. Assuming that your hardware for such a project is fairly modest, after a couple of months index won't really fit into the memory, and even selecting a record by the key would take 30 jumps over that table just after 4 months. And most of the tasks in question require running through the _whole_ thing. Not a tragedy, but well worth considering aggregating some data as it comes, especially as it costs pretty much nothing at this point (nmap takes longer anyway). Like counting number of IPs with the open port 22 would be just incrementing some number at the dedicated table by simple rule in the code. Maybe it's worth to invent some more interesting denormalization in order to be able to run more complex queries easily.

Maybe I'm wrong: I'd have to try out that to see how fast it actually computes, but I remember having problems with much smaller tables: like these 300M in total, maybe. Although, it was much "wider", with varchars and stuff.

<comment><USER5> Not straight Postgres, but this dataset would be ideal for a columnstore index with compression - huge runs of the same value are readily compressed with run-length encoding.

Partition the whole thing by the status of the up flag, perhaps additionally by month, and the SELECTs can be pretty well optimized.

</comment></comment></comment></comment></comment><comment><USER6> I'm not really sure what the point of this article is. If you're clever, you can represent any data as a bit array. And once you're there, counting bits or XORing them together is easy. But is that system easy to understand? Is the code easy to read for the rest of the developers who work on the project? Or for future hires? What happens if the data set becomes too large to fit in memory on a single machine? Storage is cheap and getting cheaper every day. The whole data set described in this problem (done the "inefficient" way) fits on a flash drive at today's capacities.

There are always tradeoffs when it comes to architecture design. Speed and storage space are only two of the many factors that require consideration.

<comment><USER7> I don't understand this argument. Is it really likely that a spaghetti nest of Python, json, Hadoop, and Elasticsearch is easier to understand and to maintain than maybe 100-200 lines of self-contained Go code with minimal (no?) outside dependencies?

Or that new hires are going to think bit counting and XOR are ninja CS voodoo, while everyone already knows how to Elasticsearch?

How about cost? What's the monthly all-in cost for each approach?

This is a nice satire. It points out why modern software can be faddy, inefficient, fragile, hard to maintain, and expensive to run, with no obvious benefits (including "easy to understand", which seems to be code for "I already know how to use all those dependencies and APIs, so let's assume new hires will too.")

<comment><USER6> Not at all. I can appreciate an elegant, problem-specific solution as much as anyone else. The point is that there are always tradeoffs.

What's the query interface like for the bit array? Does it even have one? Seems like you'd have to sit down and add more code whenever you wanted to know something new about the data. Would you write your own query layer? Would you eventually need a dedicated team to maintain it? You may say that is an extreme conclusion, but I've seen this very story play out multiple times in large dev organizations.

As amorphic pointed out, indexing the data with ES makes it easy to access even for non-technical users. Each layer of abstraction comes with its own costs – of course – but also its own benefits. Tradeoffs.

<comment><USER8> > What's the query interface like for the bit array?

I don't see any request for a query interface in the list of requirements.

The point of the packed-bit array is that you _don 't need_ any kind of query interface other than a few accessor macros. It's a memory-mapped array of 64-bit integers; you just index into the array and use a macro to mask out the bits you're interested in.

The "old-timer" solution - which actually solves the stated problem instead of a hypothetical future problem with lots of extra requirements - can be written in a few pages of C. It shouldn't take more than an hour, perhaps two (plus some time for testing).

If _and only if_ the requirements change0 to something significantly more complex would something like a query interface make sense (YAGNI). The task _as stated_ just isn't very hard.

</comment></comment></comment></comment><comment><USER9> "I can perform a simple AND operation on the 3 monthly bit arrays, and then count the number of "1" bits."

I think an old-timer would tell you that he'd be using an "OR" operation to count the number of hosts seen in the last three months.

As a long-time embedded systems engineer, you learn to guard every CPU cycle and memory location jealously. That behavior, along with avoiding needless abstractions that complicate the system AND cost CPU and memory, have served me well as I've switched to higher-level software.

As an aside, memory resident databases are now practical even for problems of this size. I've used the CERN Colt library to provide sparse arrays stored in memory in place of databases several times now. My current pet project is processing a mouse genome for my daughter's lab. With the amount of data being read, I'd always be I/O bound if I wasn't packing a lot of working data into memory. This is the programmers equivalent of the CPU's cache, but one we can easily control. Give it a try!

<comment><USER10> It may be because I haven't had my coffee yet, but how would using OR help here? 1 OR 0 OR 0 returns 1, but the host was offline in 2 of the past 3 months, which means that it should be 0...

<comment><USER9> You might be right ... but it's entirely dependent upon what the author meant. The problem statement was "How Many Total Hosts Were Seen as "Up" in the Past 3 Months" which I read as "How Many Total Hosts Were Seen as "Up" in __any of __the Past 3 Months ". You've correctly pointed out that the author might have meant "How Many Total Hosts Were Seen as "Up" in __all of __the Past 3 Months ".

This sort of ambiguity is why BDUF is so hard to pull off. Only lawyers are trained to write completely unambiguous prose (and they fall back to having very precise meanings for words to help them succeed).

<comment><USER11> Given that the modern app developer did a de-dupe operation for his solution, and that the most plain reading of the English text is "in any of the scans", I think the OR is correct.

</comment></comment></comment></comment><comment><USER12> Why wouldn't you want to use an SQL database with an index to store this data? Just have a column for the ports and a boolean flag for the status of the port?

Honestly, I'd probably use bash/nmap/ping and psql to insert data. Want to query? psql and grep.

These examples seem like a great way to re-invent the wheel with modern buzzwords.

<comment><USER13> Why not SQLite ?

<comment><USER14> I'd just take that as favorite tool for the job, SQLite's pretty interchangeable. Also, if you've already gotten a database engine running, it's probably best to just keep everything there. Otherwise, you get into the situation I was in at a previous job in which certain page loads from an app written before I started there required a sun jsp app for the main part of the page, which made requests to pull some data from an Oracle database, some data from an apache mod_perl app that queried from a mysql database, some data from an apache mod_jk app that pulled from a c++ app with its own database format, and some data from an apache mod_jk app that stored and retrieved from a postgresql instance. Everything was nice and well-documented, but mein gott was that a lot of moving parts.

</comment></comment></comment><comment><USER15> Business Guy shakes his head and gets a subscription on [https://www.shodan.io/](https://www.shodan.io/)

<comment><USER16> I was afraid I was going to miss the joke until I clicked the link and got a real chuckle.

</comment></comment><comment><USER17> Lost me at "Old-Timer Developer: I will use Go."

The old-timers in your vicinity must be different than the ones in mine.

<comment><USER18> I think we might come from a similar vicinities. Here I am thinking go was modern. I expected old timer to be using c. As that's probably what I would have done

<comment><USER17> _" What's this Go? C for people that are afraid of malloc() ?"_

</comment></comment></comment><comment><USER19> Ah. Thank god the imaginary old school guy is better than the imaginary straw man modern guy! I'd better go learn Go immediately.

Personally I'd start off by looking into using Cython or Numpy and maybe pickle to disk for storage.

Does that make me the old guy or the new guy or is it a false dichotomy?

</comment><comment><USER20> Funny quote from the article: "This is a big data problem." Hmm maybe on a raspberry pi, or some kind of retrocomputing challenge (Do this on a simulated IBM 1130!).

I don't know how an app developer thinks, but I know the article characterization of the old developer is wrong, we'd chuck it into the existing relational DB, maybe spin up a new cloud instance and reserve some NAS space if necessary but this is a pretty small data set by modern standards so probably nothing special is required. All the reporting devolves into silly SQL onliner competition. The first question is a COUNT(*) and GROUP BY. The second question is a ridiculously simple SELECT. The third question is another simple select if you stored your ip addr bytes in separate columns, even if you allow non /24 addrs. The fourth is another GROUP BY.

The article does fit the stereotype I've seen that new programmers prioritize ease of storing data over ease of reporting, and old timers vice versa. Like the difference between coming up with the fastest next move in checkers vs "solving" checkers in the game theory sense.

</comment><comment><USER21> Maybe this is a stupid question, but why not just use a relational database?

<comment><USER22> Because then it would seem that modern app developers are actually competent, and that's not the author's intent.

</comment></comment><comment><USER23> Is this post Go biased? Why not C++ or Erlang? :) You can do the same with Python

<comment><USER21> Agreed, I think very few "Old-timers" would be using go.

</comment></comment><comment><USER24> A couple of errors near the end for "How Many Hosts Were "Up" Last Month But Now It's "Down"" and vice versa. The error is that using xor on the same item twice is a no-op...

(A xor B) xor A == B.

The correct equations would be,

!this_month and last_month = "up" last month, down now.

and

this_month and !last_month = "down" last month, up now.

</comment><comment><USER25> This just compares a decent programmer with a terrible one. Not a modern app developer with an old timer. This is especially evident where the systems programmer is aware enough to use Go (which is a debatable choice, but certainly displays good awareness), but the modern app dev doesn't know when (not) to use Big Data and when to try optimizing things (e.g. the JSON choice).

The only "mistake" I see a modern app developer making might be using Python, but hey, computers are fast (so python should still be fine). Most would probably come up with a similar bit-twiddly solution or a simple DB-based solution. No biggie.

There's no dearth of horrible systems code out there either. It might be less likely for a systems programmer (even a horrible one) to mess up this exercise, but you could probably choose an exercise which would have the reverse effect. In the end, it's a toy exercise, not one where you actually design a significant piece of software.

There is a point buried in all of this; which is that learning systems programming will probably make you a better modern app developer since you get the correct mindset to tackle problems like this (also, vice versa?). But there's too much hyperbole obscuring it.

There's also the other point about _how_ systems programming is done vs modern app dev. It's a valid one, but there are benefits to both approaches, and it boils down to each being useful in its own domain.

</comment><comment><USER26> As VCs often look for keywords, I suppose the trick is to build the old-timer system but describe it as the modern web developer.

<comment><USER27> Lol store the bits in a file called hadoop.txt. if anyone asks how you did a query say you looked in hadoop.

</comment></comment><comment><USER28> Couple of defensive, bruised egos here in the responses. Lighten up, it's funny! We all know that one guy for whom the answer to every question is HADOOP MAP REDUCE!! I thought the writing was fun.

</comment><comment><USER29> Unfortunately our hero the array developer got a bit too clever, pun intended, and produced an incorrect program. The last two of the XOR tricks won't work the way he thought.

</comment><comment><USER30> Point of this article is not the point of this article. The clever bit was:

> ...the IPv4 address will convert into a number...

Many fancy, post-modern app developers might insist, "You won't do math with an address; it's not a number." But some things _are_ numbers, with a scheme and pattern you can exploit.

</comment><comment><USER31> Old-time _system_ developers use C.

<comment><USER32> Old-time system developers wrote Go.

</comment></comment><comment><USER33> There's no simple solution without a lot of context. [http://mockingeye.com/a-classic-of-soviet- engineering/](http://mockingeye.com/a-classic-of-soviet-engineering/)

</comment><comment><USER32> It's fascinating how many people here are defending the "modern app developer" approach, mostly with arguments about flexibility, maintainability, ability to pass on the code to junior developers, and the like. If you think about what the "old-timer's" code here would _actually be_ , these kinds of objections make no sense at all.

Assuming the code to run nmap itself would be equivalent either way and we're interested in the data storage and analysis functions here, the old-timer would write that entire part of the program in about one screen of any decent programming language in perhaps 10 minutes. The functions would be short and simple, needing only basic iteration and bitwise arithmetic. Any junior programmer who's going to get anywhere in this industry would be able to understand that code in moments with no specialist knowledge or additional training. Nothing about the code would get in the way of any reasonable commenting or testing policy either.

If in the future someone didn't find the compact data structure appropriate for some new application, they could easily convert the data to a more suitable alternative format, because the current format would be well- specified, simple, efficient, and without external dependencies.

Hypothetical arguments about scalability are silly. The problem is fundamentally built around _IPv4 addresses_ , which have been 32 bits wide since they were devised and will still be 32 bits wide tomorrow and next year. Designing for something more scalable is some horrible combination of scope creep, YAGNI violation, and worst of all, not giving even cursory thought to what the requirements actually mean. (I await the seemingly inevitable unintentionally amusing response about IPv6...)

The only thing I really quibble with here is the characterisation of the two types of developer. I don't think this is really about modern vs. old-timer. It's just about a good programmer -- who looks at each problem on its merits, chooses suitable tools for the job, and leaves their options open -- and the bad programmer, who does not.

Well, that and the fact that no self-respecting old-timer would misuse the word "performant" so heinously, but I digress. :-)

<comment><USER4> There's absolutely a scalability problem lurking there regarding ports, and what happens when you want to scan more than 21 of them.

<comment><USER32> How so? The old-timer's approach would scale trivially to several times that many ports before running out of RAM on a modern PC, or many times more just by introducing a memory-mapped file. It would still be simpler and quicker to implement than the kinds of external dependencies or formal database structures being proposed by others here, and the alternatives have significant scaling concerns of their own by that point, not least if you're paying for resources like CPU, storage and network data transfer on a metered scheme.

In any case, you'd probably reach a point where sparsity dictated a different choice of data structure for efficiency long before the dense representation actually broke, at which point the old-timer would most likely suggest a different solution rather than stubbornly sticking with the one that is no longer a good fit, and maybe the modern app developer would too.

Realistically, there are only a few hundred major protocols whose recognised standard ports you'd want to scan assuming we're talking about TCP here, so this still looks to me like inventing hypothetical future scenarios and over- engineering to allow for unlikely future requirements.

</comment></comment></comment><comment><USER34> That's actually a good comparison between different mindsets. Even if it reads a bit biased pro-go (or pro-old-time-system-developer) it doesn't tell what's the best way to implement this - and in my opinion it's neither one.

So what's actually the best way to implement this? What are the motivations for choosing one way?

"Modern App Developer Way": \+ adoptable, scalable, readable data formats \- storage, computation

"Old-Time System Developer Way": \+ storage, computation \- "locked-in" data formats

"Database Developer Way": \+ ease of implementation ? storage, computation

Any other options/ideas?

<comment><USER35> Use Redis?

</comment></comment><comment><USER36> > Old-Timer Developer:

> I will use [a language with mandatory garbage collection]

I lol'd

</comment><comment><USER37> As a relatively junior developer, I have been told my some of my senior colleagues that I sometimes miss the forest for the trees, and so this may be another instance of that.

But it doesn't seem "trivial" to me how one gets the output of nmap into whatever database, data structure one chooses here. I know nmap can produce XML, presumably there is a csv format, but it would seem like the XML/CSV -> JSON conversion (following our intrepid Modern App Developer) would be an easier more maintainable way to go, versus XML -> to bit array (memory map file). Also, is managing the nmap or masscan and whatever other ancillary processes required to execute this plan equally as onerous in either paradigm? Finally, and this is likely controversial, this particular problem "feels" like its stacked against the Modern App Developer, given that it isn't trying to solve a problem most Modern Apps try to solve (or try to solve as an end rather than a means to an end)

<comment><USER38> Or, if you want to use a binary format without having to deal with all of the complexities of inventing your own, you can also use Protocol Buffers. You can even use Protocol Buffers as a schema for JSON too as of 3.0.

</comment></comment><comment><USER39> Pentester: I'll use mass scan, someone else already solved this problem. [https://github.com/robertdavidgraham/masscan](https://github.com/robertdavidgraham/masscan)

</comment><comment><USER40> I'm betting on the modern app developers system being much easier to maintain and understand ( and pass off to junior programmers), at the cost of speed.

<comment><USER41> I don't know about that. I'm a front-end developer, so I know none of the above. I'd rather decipher some complex bit-counting scheme one person made (and documented) in a language I don't write, than to try to piece together a whole system of tools written by various people I can't talk to, and tied together by one person for this specific task.

Which one is going to require more reading? Which one is going to be easier to refactor? Although neither develop sounds like a teammate I'd hope to collaborate with, I'd much rather inherit Mr Old-Timer's code to maintain than Mr Modern Developer

</comment></comment><comment><USER42> If anybody is curious, the zmap project from the University of Michigan does this and more.

[https://zmap.io](https://zmap.io)

</comment><comment><USER43> One could differentiate the two proposed solutions by the level of involvement of third parties (e.g., cloud hosting providers, authors of garbage collected or scripting languages, etc.). Some of these third parties have been involved since "old times", others have not.

</comment><comment><USER44> Based on my recent experiences, the modern app developer would write a slow, bloated web app that takes ages to produce a result but has a slick UI with awesome animations.

</comment><comment><USER45> Did this all happen while they were in the bar? Seriously though, both stereotypes are off-base (Go? really?)

</comment><comment><USER46> I think this is unfair because it's basically in the old-school systems domain of problems.

</comment><comment><USER47> basically just an example of how choosing a bad data structure can make your life a headache

</comment><comment><USER48> Am I the only one who thinks that there are far more efficient data structures than a bit array to represent this data ?

How about an RLE encoded list of hosts, for instance ? (since they're consecutive 32-bit integers). There'd be way less data than in a bitfield which will make most of these queries far faster than iterative bitfield lookups. Also, much more of the data would fit and stay in memory, which means that all queries that iterate over it will be 10x faster or maybe more.

Of course experimenting with data structures is not something you can do very efficiently in Go, as it'll be painfully verbose code. C++ would be far more useful.

But this is basically the old argument for/against optimizing code. The real problem with the "old timer" programmer is that there are quick ways to break his program. When new queries present themselves, the "old timer" will quickly find his datastructures not optimized for the queries, or that they require complex calculations, which means that for data analysis the modern app developer will probably "win".

When it comes to putting a product in production, it needs to be fast and cheap. Any company that doesn't hire an old-timer developer for that will quickly find their costs exploding. This may be acceptable for a few weeks when trying to find product/market fit but it won't last long.

</comment><comment><USER4> My background is much closer to the "old timer" but I think I'm definitely on the side of modernity here, along with everybody shouting "sql".

Also I don't see why the old timer needs both a bit array and a uint64 port array, they can put the up/down bit in the high bit of each uint64.

</comment><comment><USER49> Old timer spends rest of 2016 to implement his solution that saves $100 in computing resources.

<comment><USER32> Reality: OId timer spends about 10 minutes to implement his solution.

If the older timer's solution does save $100 in computing resources, then at that rate the the old timer is saving around $1M per year compared to the "modern" developer.

<comment><USER49> Given both are experts, point-and-click will always be faster to implement.</comment></comment></comment>


Samsung: We can't rely on Google, so we addressed Android IP issues on our own - <AUTHOR> http://thenextweb.com/google/2011/09/29/samsung-we-can%E2%80%99t-rely-on-google-so-we-addressed-android-ip-issues-on-our-own/

<comment><USER2> If Samsung is serious about becoming "world's top smartphone manufacturer by volume" then this is something they would have done anyway.

They may have been disappointed by google but it was never in the plan to "rely on google" for anything. Samsung relies on Samsung and it seems like they're quietly taking over the world.

Look at whats in the ipad and half the android phones out there hardware-wise. Its closer to the truth to say that everyone relies on Samsung.

I've been thinking recently that the lawyers are like their respective company's spoiled children. The adults quietly conduct their interrelated business while their kids loudly and publicly squabble over trivial matters and trade small beans back and forth.

</comment><comment><USER3> Samsung didn't say that, so don't make it sound like it's a quote from them.</comment>


Singapore abolishes school exam rankings (2018) - <AUTHOR> https://citinewsroom.com/2018/10/singapore-abolishes-school-exam-rankings-says-learning-is-not-competition/ <comment><USER2> This is brilliant! Learning should not be a competitive.

EDIT: Why would you want to have children compete with each other on learning abilities? How does it help anyone? If a child is going to take a tad bit longer to understand than another child, I would rather the child take a bit longer to master than force the child to acquire the knowledge within a set duration. If they score 90% of the marks would you be happy that they scored 90% or unhappy that they could not master the remaining 10% and will never be given a second chance to do so? And what if your child crosses the passing marks of say 40%? Would you be happy that your child scraped through with passing marks or be unhappy that it never got that extra time to learn the remaining 60%? Not every child has the same grasping power. And by making learning a competition you are taking away the right to learn from a majority of these young children.

I would rather the child compete with others on what it has learnt on a practical basis rather than theoretical! Currently, scores only determine how much of the theory the child has been able to master. There is no process that examines how that theoretical knowledge has been used effectively throughout the lifespan of the learner which is actually more important.

Let them learn at the pace they are comfortable with. By making sure more children are properly educated we will, as a society, automatically reap the benefits of their future contributions. With competition, you are restricting the scope to the "gifted few" who will then have to bear the burden of the rest.

<comment><USER3> That's exactly why my wife and I are still hesitating to bring back our kids in school in France.

Some of the teachers give back tests in grade order, allegedly to value the bests, but it has a bad impact on the less advanced kids. And comparing to each other is the norm.

Regardless, France education system is bad rated comparing to other countries...

<comment><USER4> My physics teacher in high school gave back tests in grading order, starting from the lowest. Really humiliating for a 13 year old.

<comment><USER3> Thinking of it, just the fact to give back the tests and saying the grade out loud isn't a good idea

<comment><USER4> He didn't say the votes out loud, but since the tests were sorted it was clear who did well and who did not.

</comment></comment></comment></comment></comment><comment><USER5> Makes total sense. If the kids are able to solve the problems at hand, why would there be a need to separate them? Just make sure you test whether people have learned what they're supposed to.

Along the same lines, why punish someone for being in a class with another competent kid?

As for worries about places in further education, it's easy to make things hard enough that your lecture halls aren't stuffed. Doesn't require you to rank everyone.

I think I'd have learned a lot more if everything had been pass/fail. Not just because it's easy to get to the pass line, but also that I'd challenge myself more with more advanced stuff.

</comment><comment><USER6> Without rankings how do you determine how to allocate scarce university spots.

I think there's much more potential for bias when every position is just based on some committee's prerogative in a way that is very difficult, if not impossible to measure.

<comment><USER7> Why are University spots scarce in the first place.

<comment><USER8> Not everyone should go to University. It makes it's value smaller

<comment><USER9> If the value becomes smaller, wouldn't it automatically result in fewer people going to university?

<comment><USER10> That sounds logical but it doesn't typically work like that. Instead you need to then do even more than get a bachelors degree.

Also known as education inflation.

</comment></comment></comment></comment></comment><comment><USER11> I helped to set up a syllabus for a part time coding bootcamp. One of the things we did was to eliminate any grading, although students who completed the project would get to graduate with honors.

The idea was that when I was in college, I found a lot of students avoiding the electives where they would learn a lot, in favor of electives where it was easier to get good grades.

The good part was that we could push them extremely hard. There's a point where most of them feel like it's not the right career choice and we can push them past that plateau. Since a lot of them are doing it at night and weekends, they don't always have a lot of willpower or commitment. The drop out rate is a little lower than expected.

The bad part is that they don't push themselves hard enough. A lot of the difficulty is in things that they can just grind through - loops, arrays, functions, conditionals. But they don't work hard enough at it, and don't become 'literate' enough to solve some basic problems.

The other downside is that a diploma sells certification, and not necessarily education. Something that's easy to pass is 'not recognized', even if the students learn more in the end.

</comment><comment><USER12> I'm rather skeptical of this news and perhaps just some typical PR effort by singapore government.

Remember Singapore has a notorious education system of sending children in different tracks at an age as early as 8. That is, in your 3rd year in primary school, you'll sit an exam that would probably determine your life trajectory.

If you do well, you'll be enrolled in better programs, better school and would go to college. If you don't, you'll be wrapped up and sent to classes with little resources and guidance and often times incompetent teachers, and what's more, you would not be qualified to sit an college entrance exam, which means, the best you can achieve is Polytechnic schools. In singapore's caste system, a Polytechnic student is at the very bottom.

The intention and justification of this system is that people are born with different levels of intelligence. To allow all people to have a college education is not merely a waste of resources, but also not useful and meaningful for those who are just average.

How do people cope with this system, well, rich people can either hire tutors or have mother work as full time educator(often in case when the mother is highly educated). Their children would win out in that race at age of 8 and would continue to win and would go to the same several elite high schools, which ends in a situation where the transportation minister has never taken public transportation ever in his/her life.

</comment><comment><USER13> > says learning is not competition

The children are still graded. Grading, or at least its interpretation, depends on the students performance. How is this not a competition?

</comment><comment><USER14> So did Zimbabwe for the very same reasons 2 years ago

</comment><comment><USER15> Competition is a good motivator. At the same time the feeling of continuously "losing" is not, so rankings should be used carefully as part of a wider pedagogical approach.

<comment> em-bee competition can be a good motivator, but generally it isn't. especially not when it comes to something as complex and vaguely defined as learning.

competition matters when there is something scarce to win. but if we apply that to education we already have a problem, because education should not be scarce. hence competition is not the right way to decide who should get access to it.

<comment><USER15> Competition drives people to push themselves, and can therefore play a useful role in education.

<comment> em-bee it can be, but it sets you up to learn for the wrong motivation. it would be better for students to learn to push themselves for their own sake and not for sake of competing with others.

it also will hurt them in the long run at work. while in many companies employees do compete, these kind of workplaces are always toxic and not a good place to work at.

in a good workplace people cooperate, and that is something they need to learn in school.

</comment></comment></comment></comment><comment><USER16> something I don't understand of this approach, how can one strive to get better if there is no better to get?

<comment><USER17> If you're learning to drive, or program, or whatever, is your objective to be able to do it efficiently, or to do it better than another person?

<comment><USER18> Both, I think but it depends on the situation. For many things in life competency is enough (although there are still tests involved in demonstrating this) but there aren't unlimited jobs in any field so being 'better' certainly makes you more desirable. A racing car driver is measurably better than me at driving but then driving is not a job for me and so proficiency alone is acceptable.

<comment><USER19> yet company has to pay a lot if they want a better candidate, technically speaking

or any country from 3rd world country can afford hiring silicon valley graduates at $300k per year just for a senior to tech lead level position?</comment></comment></comment></comment>


Obama Calls for Regulating Internet Like Phone Companies - <AUTHOR> http://www.bloomberg.com/news/2014-11-10/obama-calls-for-regulating-internet-like-phone-companies.html

<comment><USER2> Crappy site starts playing audio automatically. Immediate close tab.

</comment><comment><USER3> What could possibly go wrong?</comment>


Bitcoin cash mining profits jump - <AUTHOR> https://www.cnbc.com/2017/08/19/bitcoin-cash-soars-to-record-high-above-900-as-mining-profits-jump.html <comment><USER2> BCH is a hastily written hack job by a third rate team (I talked to some of them on twitter, they really don't understand a lot of what they are doing)... with a drastic difficulty retargeting algorithm. A bit of a pump combined with hash power manipulations lead to this.

This is all show to try and prop up the coin. Both the pump and the "profitability" of mining it.

%98 of the blocks of this coin are mined by an unknown entity-- in other words, it's not decentralized. It's trivial for that entity to manipulate the difficulty retargeting mechanism in his favor.

Stay away. This is not "bitcoin" in any sense.

<comment><USER3> This is all true, but none of it has ever affected interest in a cryptocurrency.

BTW, not even the one actual use case for bitcoin is interested in bcash: [https://www.reddit.com/r/DarkNetMarkets/comments/6s30ss/have...](https://www.reddit.com/r/DarkNetMarkets/comments/6s30ss/have_any_darknet_markets_announced_support_for/)

</comment></comment><comment><USER4> The next regular difficulty adjustment took weeks to reach after the mining power decreased. It was hours between blocks for a while. Now new blocks are mined every 10 minutes again, which makes mining cost-effective again and allows transactions to go through. With a lower difficulty and a $800+ price, Bitcoin Cash mining looks good right now.

The "market cap" for BCH has to be way overestimated. It assumes there's a BCH for every BTC. But there isn't. Not everybody got their converted asset out.

<comment><USER5> This is all completely hilarious. I mean think about what all of us are doing here. These coins only exist because we believe they exist and have value. I'm not naysaying -- it's legitimately funny. We're building rigs to "mine" internet coins like a slot machine that only costs electricity, and some of the world's smartest people have spent so much time thinking about it and building on it. And now we have Bitcoin Cash which is nipping at 25% the value of Bitcoin. That means anyone who bought at $300 just 3x'd their money. 3X! Do you know how hard it is for like almost anyone in the world to triple their money? I know BTC went up by like 130% in the last 60 days, but BCH is now theoretically a separate store of value. And you only 2x'd your money on that old crufty BTC. Cool kids got 3x on BCH.

The whole thing is just amazing and absurd and absurdly amazing.

<comment><USER6> By that same token (lol), isn't it hilarious what the U.S. is doing here? Money in our bank accounts only exists because we believe they exist and have value. The $100 bill in my back pocket would only be useful to wipe my ass if everyone else didn't value it.

Cryptocurrencies are brand new, so they're incredibly volatile, sure. But it can be "real money" just as much as money, because really what is money?

An idea.

<comment><USER5> Exactly. But holy smokes:

The fact that both BTC and BCH exist now means that there is ${BTC + BCH} market cap now, right?

If you put $3k into BCH and $3k into BTC, your investments will grow or fall independently of each other, depending on how BTC or BCH does. But if BCH reaches parity with BTC, that means the world now has ${2xBTC} of value in it, right? I mean yes, set aside the question of what "value" means, but that's what the numbers are showing?

In other words, BCH was one of the biggest things anyone could have done to grow the Cryptocoin ecosystem as a whole, then? Coinmarketcap shows $68B for BTC and $13B for BCH. Ethereum is $27B, and that took like four years to get to this point.

So, true or false: BCH just created half the total value of ETH within the last month or so?

What justifies this? Is everything going to explode? I need a mathematical or investment framework to think rationally about the implications of this.

Are we in danger of any kind of "pop"? The 2008 housing crash affected the world. Anyone know how big these babies need to grow before a pop would cause problems for the world economy?

I'm not even convinced it _will_ pop. But I've also read Madness of Crowds, and the temperament here reads identical to the worldwide investment craze portrayed in it. It didn't last forever. (I guess once all the naysayers stop naysaying about BTC, then it's time to worry. Till then, though...)

<comment><USER2> Instantaneous price is not value. The concept of "market cap" for these coins is ... fairly weak. It's not a good real measure.

We are going to have a massive crypto bubble-- this is fundamentally new technology so its going thru the technology adoption life cycle and pops every time it gets to a wider audience--- and it hasn't yet gone mainstream. Everyone knows about it, but nobody trusts it yet.

We're at the point like in the 1990s when the idea of using your credit card on the internet seemed foolish and just asking to lose your money.

Once people become comfortable with it we will have a massive bubble, fortunes will be made and lost and it will make 2001 and 2008 look positively sedate.

I don't think BCH will still be around by the time that happens, though.

</comment></comment></comment></comment></comment><comment><USER7> Is there any chance that Bitcoin Cash becomes the preferred fork of Bitcoin? How likely would that be to happen?

<comment><USER8> It is a possibility, of course, but I don't think it's very likely. Segwit is (finally) about to activate on BTC which means we'll eventually get Lightning Network on mainnet.

Segwit is not going to activate on BCH because the BCH proponents are ideologically opposed to Segwit.

Additionally, almost no businesses are taking payment in BCH. BCH has to build its ecosystem up from scratch like any other altcoin. I think it has similar chances of "overtaking Bitcoin" as, for example, Litecoin.

EDIT: I don't know why the BCH price has gone up so much. It's almost certainly in even more of a bubble than BTC is currently in.

<comment><USER9> Segwit is not necessary for Lightning Network. It's a false dichotomy: on- chain scaling does not preclude off-chain scaling (which is what LN is).

Bitcoin with Segwit will prioritize off-chain scaling (hence the 1MB blocksize limit and the current moves to prevent increasing it to 2mb), while Bitcoin Cash wants to enable on-chain scaling as the mainstay; but by no means are they mutually exclusive.

The Segwit activation raises new questions and concerns: the agreement to proceed with Segwit was a compromise known as Segwit2x (Segwit + 2mb blocks). Now it appears much of the Core team has no intention of honoring the 2x part (see core software 0.15 changelog: it will block any nodes signaling for segwit2x). Yet the 2x part is locked in - meaning we are currently headed towards a hard fork.

<comment><USER8> > Now it appears much of the Core team has no intention of honoring the 2x > part

It's not a case of "not honouring" the 2x part; no members of the core team were part of the NYA.

You can't come up with an agreement and then accuse people who didn't sign it of failing to honour your agreement!

<comment><USER9> I tried being as neutral as possible but you're right that my language implies that they signed it. I should've worded that differently. However, I still wouldn't let them off the hook entirely: intentionally blocking nodes signaling Segwit2x in 0.15 is definitely a political move. There are clear sides that are forming; and I don't mean to make any value judgment here on which side is "in the right." I'm simply trying to explain the volatility of the current situation and the various points of contention between the groups that are forming.

<comment><USER10> > intentionally blocking nodes signaling Segwit2x in 0.15 is definitely a > political move

This is incorrect. There was a straightforward technical reason given in the pull request -- not enacting this change would likely partition the bitcoin network when the split happens. A network partition could be a drastic event that if exploited would result in much lost money and bankruptcy.

<comment><USER9> Can you elaborate? What kind of partition are you referring to? Thanks.

<comment><USER10> A partition of the connectivity graph. Imagine we have two Bitcoin Core nodes connected by an intermediate Segwit2X [sic] node:

        1X(a)  -----  2X  -----  1X(b)

When the 2x node starts relaying post-fork blocks, it is seen as misbehaving by the 1x peers and dropped by both of its neighbors. The unattended consequence is that 1x(a) is no longer connected to 1x(b). If the mining network is only connected to one of these partitioned networks, then it is possible that the other will not hear of new blocks. The bitcoin nodes will have a different view of the network simply because they are not connected to each other. Worse there might be a few miners on the less hashrate side that still move the network forward a few blocks. If this situation persists, e.g. because network operators are asleep at the wheel, it could be exploited by selectively connecting and broadcasting double-spends to the two networks.

To prevent this from happening the Bitcoin Core team added code to 0.15 and higher that will per-emptively disconnect peers that advertise themselves as Segwit2x. Therefore a 0.15 node will only connect to peers that will relay good blocks from its perspective, and it is much less likely that such a network partition would occur. As long as there exists some nodes that don't auto-disconnect (e.g. old bitcoin nodes) then the Bitcoin Core 0.15+ and the Segwit2x networks will remain connected until the fork occurs.

<comment><USER9> Thanks, that was very helpful. This issue did not occur to me.

</comment></comment></comment></comment></comment></comment></comment></comment></comment><comment><USER11> Note that Bitcoin Cash will have a difficulty reduction at block 479808 (in 62 blocks as of this writing) projected around 30% further increasing the profitability vs Bitcoin [1]. It is now 52% more profitable to mine Bitcoin Cash [2].

[1]: [http://bitcointicker.co/bccnetworkstats/](http://bitcointicker.co/bccnetworkstats/)

[2]: [https://cash.coin.dance/blocks](https://cash.coin.dance/blocks)

<comment><USER12> There's a twist to this profitability statistic, which I haven't seen mentioned anywhere yet: your reward for mining a block can be spent only after many other blocks are mined on top of your block.

That changes the game significantly. What matters for a miner is not "it's more profitable with the current difficulty and price", but instead "it's more profitable with the current difficulty _and the price X blocks in the future_ ". Moreover, once they've mined a block on one chain, it's in their interest to keep that chain alive and working well for at least X blocks, so they can convert enough of their reward into fiat to pay their costs. The obvious way to do it would be to keep mining on the same chain, which generates yet more block rewards to be claimed later. All that might make the chain choice somewhat sticky for the miner: once on one chain, it's better to keep on the same chain instead of switching every time the price swings.

</comment></comment><comment><USER13> N00b/ELI5/Ask HN question : Where is all this money coming from?

<comment><USER14> Not all the quoted money is actually there.

The only real money being spend are the transactions on the exchanges. There, it becomes hard to differentiate many 'real' buys of bitcoin cash from someone just flipping back and forth between the two.

</comment></comment><comment><USER15> It seems the split created value. The derivative is worth what the original was worth not that long ago. Great in the short term but possibly means the combined value is less trustworthy. Derivatives of magic money I guess.

So what's to stop continued splitting until the public figures it out and then we all crash?

</comment><comment><USER16> I wonder if "forking" Bitcoin will become the default method for new coins to be created in the future. It seems like it has advantages, you can pretty much "prove" that you have not premined your coin (although implementation of the fork still would be very important).

</comment><comment><USER17> So, is the combined price of BTC and BCH in circulation still more than BTC alone before the fork?

<comment><USER18> As a result of the fork I now have independent currency on both chains?

If I think that Bitcoin Cash will ultimately not succeed, I should sell into this P&D, right?

<comment><USER19> If you actually have the private keys to your bitcoin (ie. you have your bitcoin in bitcoin wallet software on your computer such as in the official client or the electrum client), and you had them at the time of the fork (Aug 1), then yes. If you had your bitcoins held by a 3rd party like an exchange, then it's up to them to decide whether they want to support a fork like bitcoin cash at all and credit it to your account.

</comment></comment></comment><comment><USER20> Sadly, I exchanged my BCH for BTC before this occurred. I missed out on those 2x gains! (Of course, these are all coins I mined years ago, so it's free money anyway.)

</comment><comment><USER21> I resisted buying BCH because I just don't think it has the same long term value as BTH like almost any altcoin. Hope I don't regret this decision in 6 months

<comment><USER22> Trader here: It's a pump and dump. Don't worry about it

<comment><USER23> I assumed as much myself, but after a few weeks of BCH sustaining a non- trivial trading value, it's hard to keep faith in that hypothesis.

<comment><USER24> I mean, the main proponents of BCH did not mine it themselves to keep the difficulty down, it does not seem to have reached hashrate-price-difficulty equilibrium yet.

</comment></comment></comment></comment><comment><USER25> Worth noting that in the past 18 hours it has dropped about 25% from its recent high.</comment>


Moviebarcode – every frame of a movie condensed into a single image - <AUTHOR> http://moviebarcode.tumblr.com/

<comment><USER2> I actually had a very similar idea[1] and explored other forms of representing the color too. I took the average color of the frame for to represent a line and less data points. These are really beautiful though, much more refined.

[https://medium.com/@adrian_cooney/movie-plots- literally-8b82...](https://medium.com/@adrian_cooney/movie-plots- literally-8b8243f6f3f)

</comment><comment><USER3> Very hard to read page. If you can't find which title is for which movie, try this:

a = document.getElementsByTagName('a'); for (var i = 0; i < a.length; i++) { if (a[i].href.match('imdb')) { a[i].style.fontSize = '22px'; a[i].style.position = 'relative'; a[i].style.top = '-30px'; a[i].style.backgroundColor = 'white'; } }

</comment><comment><USER4> I was surprised how recognizable OK Go's I Won't Let You Down music video was:

[https://www.youtube.com/watch?v=u1ZB_rGFyeU](https://www.youtube.com/watch?v=u1ZB_rGFyeU)

[http://moviebarcode.tumblr.com/image/108362181481](http://moviebarcode.tumblr.com/image/108362181481)

</comment><comment><USER5> Can it be used as a reliable, searchable signature for a movie?

<comment><USER6> I think it could be, but I would also argue that it would be pretty expensive to scan and compare against a database.

<comment><AUTHOR> Curious something similar to the Shazam algorithm could be applied to images like this.

<comment><USER5> That's what I had in mind. You find a short scene of a movie on youtube and the signature enables you to find where it is coming from, even with a different resolution and encoding.

</comment></comment></comment></comment><comment><AUTHOR> To give credit, I saw this on reddit this morning.</comment>


Facebook removed 1.5M videos of the Christchurch attacks within 24 hours - <AUTHOR> https://www.washingtonpost.com/world/facebook-removed-15-million-videos-of-the-christchurch-attacks-within-24-hours--and-there-were-still-many-more/2019/03/17/fe3124b2-4898-11e9-b871-978e5c757325_story.html <comment><USER2> One point five million uploads and counting. What a fucking waste of time, CPU cycles, and bandwidth. For Facebook, it is Whack-a-mole on steroids and meth.

Yet politicians still seem to want more, something along the lines of no anonymity / fully moderated social media. Not going to happen in free countries.

<comment><USER3> Well ultimately platforms like Facebook should be held responsible for the content they distribute in the same way that newspapers were. The safe harbor provisions should not apply to platforms that do way more than just passively host content. Google and Facebook should not be able to hide behind algorithms if the real world outcomes of these algorithms are as bad as they currently are. If they can't find a way to police their platform automatically, they will have to change something else. One thing would be to require people to provide proof of real identity, so that anyone that redistributes content like this can be sued and it gets much harder to create fake profiles.

The amount of harm these platforms have caused is at this point much larger than any positive value they provide.

<comment><USER4>
       The amount of harm these platforms
       have caused is at this point much
       larger than any positive value they
       provide.

That is something for which you really need to provide some proof.

In addition I do not believe that someone watching that video is in any danger of any sort.

These calls for censorship are just taking advantage of an emotional situtation to impose very dangerous state control on information.

<comment><USER5> > The amount of harm these platforms have caused is at this point much larger > than any positive value they provide.

You want proof of this, but I think the standard should be higher - to prove that platforms like these cause greater harm than state censorship would. Censorship that has, even in the US, been used to criminalize anti-war activism: [https://en.wikipedia.org/wiki/Schenck_v._United_States](https://en.wikipedia.org/wiki/Schenck_v._United_States)

<comment><USER4> That's a stronger argument for sure.

</comment></comment></comment></comment></comment><comment><USER6> Apparently hosting this video is part of a violation of the law in New Zealand, population of 4 million.

For Facebook why not just block New Zealand? Looking for thoughtful responses

edit: seems there are reports of New Zealand ISPs blocking very many sites and web services. So for Facebook this is also a compelling option to just block the country and continue business as usual, focusing on important things like those user metrics. Censoring videos is an antiquated law forcing silly compliance burdens.

<comment><USER7> The PR would be great:

"Facebook asked to block snuff film, instead decides to block entire country and continue to distribute the snuff film."

Facebook clearly don't want to distribute snuff films, child porn, or other objectionable material, regardless of where in the world the operate.

<comment><USER6> They put themselves in this position of deciding to arbitrarily delete things such that this PR would even be possible.

If they weren't in the business of policing the network this way, the deletions would only be in response to a court order - which do happen. Then they would be in the PR favor by deciding to ignore "another country's" court order, and "exiting that market" if it was a better business decision.

This is one of the grand luxuries of international business, and Facebook is paying for it - in this case - instead of enjoying the privilege.

Someone should tell them PM to change her statement to "Our censorship laws are about to change"

<comment><USER8> You think refusing to delete a snuff film would give them _good_ PR? Presumably because they stuck to their principles???

What world do you live in? People by and large do not _actually_ want that level of free speech.

<comment><USER6> there are companies hosting the file, not sure what your point is because that is the world I live in</comment></comment></comment></comment></comment>


FF Aurora gets CSS Animations in time for FF 5 - <AUTHOR> http://functionsource.com/post/firefox-aurora-gets-css-animations-in-time-for-5

<comment><USER2> I've just updated my tutorial to include support for this: css3.bradshawenterprises.com . I know it's a bit of a plug, but I'm trying to make the definitive basic guide to all this stuff!</comment>


Humble People Make the Best Leaders - <AUTHOR> https://hbr.org/2017/04/if-humble-people-make-the-best-leaders-why-do-we-fall-for-charismatic-narcissists <comment><USER2> I always wonder, when people make such claims, if it is true.

So I am upvoting this for the simple reason that she spent so much time going over the research that demonstrates that humble leaders are more effective.

edit: p.s. alternative theory of why we choose Charisma over Consensus. Consensus minded people tend to pick many different leaders whereas the charisma influenced people, even though they are in the minority tend to end up picking the single leader who displays the most charisma (in the narrow sense of negative, narcissistic and authoritarian charisma defined in the article).

</comment><comment><USER3> Reminds me of something from my quotes.txt:

"The problem is that by standing for public office, the candidate is showing that they are unsuitable for the job."

<comment><USER4> I believe you're referring to this quote from the Hitchhiker's Guide to the Galaxy—

>> To summarize: it is a well-known fact that those people who must want to rule people are, ipso facto, those least suited to do it. To summarize the summary: anyone who is capable of getting themselves made President should on no account be allowed to do the job.

</comment></comment><comment><USER5> The US military tries to sort out the loudmouths from the competent officers. They don't always succeed, but there's an organized process.

China's leadership tends to be promoted step by step. Read Li Keqiang's resume.[1] Promotions are faster for the well connected (the "princelings"), but leaders go through a lot of jobs on the way up.

[1] [http://www.chinavitae.com/biography/Li_Keqiang/career](http://www.chinavitae.com/biography/Li_Keqiang/career)

<comment><USER6> Your description of the Chinese system reminds me of the cursus honorum[1] from Ancient Rome.

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

</comment></comment><comment><USER7> If you look back at the source for the "Humble People Make the Best Leaders" source, it's a little less straight forward than that. It's not about humble leaders, it's mainly a study about how _altruistic_ leaders make their employees feel:

[https://hbr.org/2014/05/the-best-leaders-are-humble- leaders](https://hbr.org/2014/05/the-best-leaders-are-humble-leaders)

And that supposedly helped in somewhat ambiguous fields: Uniqueness, Belongingess, Team Citizenship, and Innovation

<comment><USER8> That's not the only cited reference to back up this claim:

[http://journals.sagepub.com/doi/abs/10.1177/0149206315604187](http://journals.sagepub.com/doi/abs/10.1177/0149206315604187)

> Findings largely support our theoretical assertions, suggesting that CEO > humility has important implications for firm processes and outcomes.

</comment></comment><comment><USER9> "At the outbreak of the Civil War, Grant wanted back in the Army, but the Army wasn't interested. His reputation as a drunkard preceded him. Eventually they did offer him a unit to lead, one nobody else wanted. The 21st Illinois Artillery was one of the rowdiest, least disciplined, and most troubled units in the Union Army. When Grant took command on 14 June 1861, the restless men were only two weeks from the end of their enlistment. They couldn't wait to go home. Then they met Grant. At the end of June, nearly every man signed up for another three years. "We knew we had the best commander and the best regiment in the State," remarked one of them.

Grant turned the unit around by demonstrating a leadership style borrowed from Zachary Taylor in the Mexican-American War, marked by thoughtfulness, decisiveness, simple orders, and—above all—humility. This, his soldiers admired most of all. Grant shunned ostentation, flamboyance, and even a commander's uniform. He dressed like his men did and looked "plain as an old shoe," according to one Army doctor."

</comment><comment> 52-6F-62 It seems like people tend to listen to the loudest speakers first -- everybody else is forced to play keep up. Bla bla bla, something about portraying authority.

Brain's not on point for elucidating further. If somebody else understands or agrees and cares to take the mantle, I'd appreciate it.

<comment><USER10> So true. And for a good laugh (because this seems to be so true) here's a book many narcissistic leaders must have read and employ (even though it's suppose to be satire/comedic): 100 Tricks to Appear Smart in Meetings: How to Get By Without Even Trying

[http://amzn.to/2p0TuhC](http://amzn.to/2p0TuhC)

</comment></comment><comment><USER11> I think this is pretty much the thesis statement of "The Road to Character". Another interesting insight I am picking up from that book is that the best leaders are really the ones who know how to identify and pick the "Best Leaders". While those who are humble and reserved do a great job of actually doing the work of leadership, the absolute best leaders don't actually have those same virtues, but they recognize the quality and enable humble people to do good work.

</comment><comment><USER12> So, create crisis, stress, and confusion... then hire media to make you appear charismatic, and you could be the next president?

</comment><comment><USER13> Perhaps also because they tend make more money in the short term by sacrificing the long term? Sadly, a practice which aligns with the rest of modern society...</comment>


We built a distributed DB capable of running across 100s of global locations - <AUTHOR> https://www.macrometa.co/blog/why-global-edge-fabric <comment><USER3> Great work. Building a distributed database isn't easy at all and takes considerable effort. I'd like to see more on failure scenarios. Here's a few preliminary questions I have (admittedly, I haven't read the entire post, apologies if my queries are answered already):

What is the SLA for durability and availability of the db?

\- how are scenarios like edge locations going down for multiple minutes handled? Are the writes lost?

\- how many replicas of data at a single edge location?

\- Are there limits on the table size (how does one enforce this in a multi- master mode)?

\- what's the SLA on replication time to say, at least 50% edge locations, and then to 100%?

Are DDL operations allowed? If so, how are the conflicts handled?

If data is stored in LSMs underneath, how are geo location queries handled? Is there an index/materialised view? If so, how long does that take to generate?

What's the TPS/QPS supported for the KV interface?

\- Is there a scenario where a set of operations at X TPS across edge locations might then take a long time to converge globally?

It'd be great if you can list down scenarios where the db can lose write to 'true conflicts' in a FAQ somewhere.

\- For instance, what happens in a create-delete-create scenario where a table is created at one edge location, deleted at another, created at a third edge location; all the while when there's writes and reads happening globally?

Thanks.

<comment><AUTHOR> Thanks for the truly thoughtful questions - I will put together a short faq and post a link and a a tl/dr answer here.

We also have a more technical internals paper almost completed and will publish next week.

Thanks again! This is such a helpful comment.

</comment></comment><comment><USER4> Shouldn't this be a "Show HN", since the submitter is the company CEO/President?

<comment><USER5> Hi CharlesW - Thanks. Probably we will publish another post with details on how people can try out the global edge fabric. That probably would be good fit for "Show HN"?

Regards

</comment></comment><comment><AUTHOR> The TL/DR on how:

1\. Causal consistency with the ability to create collections (tables) with strict consistency - uses vector clocks and not wall clock timestamps for ordering DB operations

2\. Streams to propagate DB changes from one geo location (node) to another with guaranteed ordering and reliable delivery

3\. Generalized Operational CRDTs to make all DB operations Associative, Commutative, Idempotent and Distributed (the new ACID)

4\. One data model - multiple interfaces - store and query your data as Key/Value DB, DocumentDB, Graph DB, StreamDB, Geo location DB (query by lat/long/altitude)

5\. Automatic GraphQL and REST api generation for your schema

6\. Multi master - query and update any of our 25 global locations and get one consistent view of data globally

7\. Access via CLI, REST, GraphQL (built in server), client drivers for python, Javascript today (Java, Go, Ruby in the works)

<comment><USER6> This is buzzword salad, not a coherent technical summary.

<comment><AUTHOR> ok Take 2:

1\. We use causal consistency using vector clocks to establish the causal order of operations instead of using Time stamping and Network Time Protocol which are unreliable over WAN distances

2\. We share Database state changes/updates between each Point of Presence (POP) to the others in the cluster using Asynchronous Streams that use a pull model instead of a push to maintain ordering of messages over the network. This has the added benefit of allowing us to know exactly how current each PoP is with changes.

3\. We dont use Quorum for inter PoP to establish consistency - there's a white paper on our site that shows you the how and why of coordination free replication. Gist is we have developed a generalized operational CRDT model that allows us to get Associtive, Commutative, Idempotent convergence of changes between PoPs in the cluster without needing quorum

4\. the DB is a multi master - you can access and change data at any PoP. Its also multi model and lets you query your data across multiple interfaces such as key/value, documentDB (JSON), Graph etc

5\. the DB automatically creates GraphQL and REST APIs for your schema taking away the complexity and effort of a lot of boilerplate development on the backend

6\. The DB is available as a managed service in 25 PoPs today - you can request an account and we will give you one. WE will be generally available with a free tier in April and you can signup online and self administer your cluster

7\. You can access the DB via a CLI, GUI, or write code that accesses it via REST, GrapHQL or using native language drivers in JavaScript, Python today (we are working on other languages with a view on releasing them over the next few months)

hope this helps...

<comment><USER7> REST interface is good, but could we add business valdation before mutating data? Because bulk of the work backend does is this business logic. How could we do this?

<comment><AUTHOR> Hello and greetings the_arun.

The short answer is yes. Macrometa integrates a function as service (FaaS) which can be hooked into the database and be triggered by events on a stream or a data collection.

So you can for example do the following: Expose a RESTful or GraphAPI (included deep nested queries in graphQL) for one or more collections - <USER2> mutating, attach a validation function to the collection as a trigger that is called before the mutation is applied to the DB. You can also have a trigger that calls a function after the mutation is complete.

One can also do this on streams with functions being triggered to a specific topic.

Lastly - there is full support for running containers as well and you can use the endpoints exposed by the container as a trigger.

Oh and one more thing - the dB is real time. It will notify clients of updates to collections automatically (like firebase).

Hope this helps..

<comment><USER7> Thanks for the details. This sounds very similar to Amazon's DynamoDB? Are there features to make macrometa better than DynamoDB?

<comment><AUTHOR> Shares some feature overlap with dynamodb (key/value and document dB interfaces). Where we differentiate - global replications across all our 25 global POPs (50 by end of 2019). Integrated graphQL generator (rest as well), real-time: dB will notify clients of changes to data I.e. no need to poll, rightly integrated with streams and pub/sub, run functions and containers as triggers or stored procedures to the DB, geo query: query by lat/long/height, elastic search integrated (July 2019). There's more - will announce in April

</comment></comment></comment></comment></comment></comment></comment><comment><USER8> This is actually exciting. Most sales pitches for secret sauce services are much flimsier and don't ooze the actual technical possibilities and promises that this one does.

So, does it solve the double-spend problem or not? The prose is a bit ambiguous on that.

I don't want to work that out for myself. I want to be told one way or another, and perhaps given some simple examples like "users x and y both want to do z at roughly the same time; depending on several factors like the exact timings and network latencies, there are several outcomes. They are..." etc.

And of course we want to know what kind of realistic throughput and latency it gets, how easy it is to add and remove POPs (and what data gets lost when you do), etc.

Finally, it really needs to commission and publish a Jepsen analysis. Hasn't every database vendor learned how critical that is to winning the programming public's heart?

This seems to be a startup who is going to sell it as a service, and I hope them all the best. The DB world is full of better tech that didn't make the dent it technically deserved (hyperdex, tokudb, perhaps rethink etc) so a new startup has to be both vocal and embrace Jepsen from the beginning. I think HN is ripe for a new darling and whichever company becomes that darling might capture a lot of the ill-informed web-scale-before-we-have-a-customer market ;)

<comment><AUTHOR> Thanks for pointing out the ambiguous bits - I'll clean it up in the next few days.

Yes it does solve the double spend - it let's you mark (check box) a collection with a SPOT property (single point of truth) which restricts the number of edge region that collection is replicated across. Additionally the spot collection is replicated across two separate data centers (and separate availability zones in those data centers) to provide high availability. The developer doesn't need to deal with the complexity of where and how this is done - they continue to access the collection like a regular one and the DB will redirect the queries (and do things like joins) between the regular and spot collection.

I'm writing a faq and will include your questions there.

Jepsen is in the plans - we hope to get a report out in the summer.

</comment></comment><comment><USER9> This looks pretty neat!

Considering that there's a FaaS layer too, which could be used along with the DB layer offering, what degree of vendor-lockin are users getting into?

Also, this product seems only targeted at those direly needing edge computing, thus missing out on many who might be using Firebase and Serverless (Lambda/Functions etc) for the works. Is that intentional?

<comment><AUTHOR> You bring up a great point. One absolutely can use us as a firebase alternative. We have a few customers using us with lambda and container services directly on their favorite cloud provider in just 2 locations for high availability of their apps.

The edge computing position is intentional in that we think the edge is a way to build globally distributed apps and apis. Our goal is to make as simple to build and run an app in 25 regions as it is to build an app against say firebase or dynamodb.

</comment></comment><comment><USER10> So, does it actually have CRDT operations? Doesn't seem like any of the interfaces expose them. Can you use a convergent counter, for example?

Also product page [1] has some weird claims. There is no such thing as "Strong Session Consistency", this is just another name for weak consistency guarantees. And Strong Eventual Consistency, which is a thing, requires using mergeable conflict-free operations that you don't seem to expose? The "smart operation ordering using intent prioritization" is also neither strong eventual consistency nor strong consistency.

[1] [https://www.macrometa.co/product](https://www.macrometa.co/product)

<comment><USER5> Hi zzzcpan - Yes. The global edge fabric internally uses CRDT operations. It is a conscious choice to not expose the CRDT data types. The idea being the developer work with APIs & Query layer as they do with other databases and underneath the system take care of translating to necessary CRDT operations. Convergent counter is in the works and will be available shortly.

The system has strong consistency within a region (aka datacenter) and strong eventual consistency across data centers. Answering your question, yes we do converge (merge) the changes across regions using conflict-free operations.

Intent prioritization rules comes into picture only when it is impossible for the system to determine the intent of the developer when two conflicting changes occur across regions.

I hope the above helps.

Regards

</comment></comment><comment><USER11> Where do I create an account?</comment>


Tofu – The opposite of a font - <AUTHOR> https://github.com/JuanPotato/Tofu <comment><USER2> _WARNING: PLEASE DO NOT RUN THIS CODE ON A HARD DRIVE, I 'M NOT SURE HOW LONG IT WOULD TAKE. I USED A RAM DISK_

I haven't looked at the implementation, but this seems to imply it is very I/O intensive and already takes a very long time in RAM. Yet, nothing about the problem statement suggests it would be such a task --- it sounds like something that could be very straightforwardly done completely in memory.

<comment><AUTHOR> You're right and I should have added more details. fontforge only accepts file paths and not strings sadly

<comment><USER3> Libraries to treat strings as files are pretty common, in python they have one in the std:

[https://docs.python.org/2/library/stringio.html](https://docs.python.org/2/library/stringio.html)

<comment><AUTHOR> But that's a file, it accepts a file path. I already looked into this

</comment></comment></comment></comment><comment><USER4> "This is stupid. Yeah probably, but for its very specific use case it's not terribly bad."

Don't put your work down like this. You created something useful for yourself, and likely useful for others. I'd be surprised if someone called it stupid.

<comment><USER5> Yea I was surprised at that too. This is incredibly useful for debugging and trying to fiend weird security/unicode gotchas. I can think of a couple of use cases this might be worth trying.

</comment></comment><comment><USER6> That's great! When I first started trying to learn Chinese, I had a problem because I couldn't read the characters and sometimes couldn't copy-paste from some apps. I made a font that was similar, and then I could use the Unicode Hex Input keyboard. Your font looks so much better though!

<comment><AUTHOR> Thanks dude!

</comment></comment><comment><USER7> re: license, the SIL Open Font License is common and well-accepted. [http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=...](http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL)

</comment><comment><USER8> > WARNING: PLEASE DO NOT RUN THIS CODE ON A HARD DRIVE, I'M NOT SURE HOW LONG > IT WOULD TAKE. I USED A RAM DISK

How much disk IO does this program generate? Why?

In any case, the OS should cache stuff and give similar performance to using a ramdisk, provided you have enough spare ram.

<comment><USER9> > the OS should cache stuff

When I worked at Microsoft back in the 90's I inquired around building 26 as to why I couldn't create a ram disk on what was to become Windows 2000, and this was basically the answer. So yes, if caching doesn't solve this then caching hasn't been implemented correctly.

<comment><USER10> What if you're using a program that fsyncs? And the filesystem isn't just keeping writes cached and flushing only when full. So if I'm writing GB of temp files, I'm causing tons of disk load which may impact other programs. Can't seek to read while writing all my temp data...

<comment><USER11> > What if you're using a program that fsyncs?

Remove the fsync or use libeatmydata.

> So if I'm writing GB of temp files

The kind that won't fit on a ramdisk in the first place? And this particular use case shouldn't need that.

<comment><USER10> The scenario is I'm running a DB on the same system as temp program. Also, machines with many GB of ram are popular these days.

<comment><USER11> If fsync on one file forces all other files to disk, then it is 100% an OS performance problem.

If your temp files fit in ram along with running programs, then they _should_ stay cached. A ramdisk should only be needed in edge cases where you want to manually force other things out of memory, or because you particularly want to avoid extra writes to disk. In general performance is supposed to be boosted just as much by caching.

<comment><USER10> If your disk head is writing the temp file, then it can't be sitting idle waiting to fsync. And it'll eventually write as part of checkpointing.

</comment></comment></comment></comment></comment></comment></comment><comment><USER12> Might be interesting to compare SIL's "Unicode BMP Fallback Font",[1] which is significantly more compact (I believe it uses composite glyphs).

[1] [http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=...](http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=UnicodeBMPFallbackFont)

<comment><AUTHOR> I'm trying to find how to do this in fontforge

</comment></comment><comment><USER13> It is both reasonable and unfortunate that TrueType & OpenType fonts can have no more than 65,535 glyphs. That said, probably the logical font made of multiple physical fonts can be probably made to support all available planes.

<comment><USER2> _That said, probably the logical font made of multiple physical fonts can be probably made to support all available planes._

Yes, that's how you can fit all of Unicode into one "font" \-- use a collection of fonts with at most 64K glyphs each:

[https://graphicdesign.stackexchange.com/questions/73166/what...](https://graphicdesign.stackexchange.com/questions/73166/what- is-the-maximum-number-of-glyphs-an-opentype-collection-can-hold)

I'll leave it as an "exercise for the reader" to generate such a font.

<comment><USER5> Wow, I did not know about that limitation. That's pretty interesting.

</comment></comment></comment><comment><USER14> We had a bug some weeks ago which was caused by a missing `trim` and an invisible chararcter. Our tester copied some text from a webpage which had such characters. This font is helpful in those cases.

</comment><comment><USER15> Does anyone know the name of the app that's listing/displaying fonts? It looks pretty neat, and I haven't found anything good-looking like that for Linux/*nix.

<comment><USER16> It's GNOME's font manager: [https://fontmanager.github.io/](https://fontmanager.github.io/)

If you're using ubuntu, there's a package for it

<comment><USER15> Oh, thanks, cool.

It's designed with GNOME in mind, but not part of GNOME itself, so installing it doesn't require pulling a huge part of GNOME either, and that's a nice plus! :)

</comment></comment></comment><comment><USER17> very nice! this should be the default binary view on many, many things, especially debuggers/inspectors.

how does it handle combining characters? do they get everything in a single box or are going to be rendered as two boxes?

<comment><AUTHOR> They _should_ be treated as two separate boxes as I made it so that each glyph is certain to be full width regardless of the default.

</comment></comment><comment><USER18> I feel like I'm missing the punchline. How big is the generated font?

<comment><AUTHOR> ~20MB

</comment></comment><comment><USER19> I'd call it "Unfont" :-)

</comment><comment><USER20> how would one go about running code/operations on ram as opposed to the hd?

<comment><USER8> On most Linux distros, /tmp is a ramdisk.

<comment><USER21> But with only 1 GB capacity

<comment><USER22> It depends on your setup. The default when no size is given is to use half the RAM.

<comment><USER23> Half? That seems kind of excessive. Are you sure that's right?

<comment><USER24> I would guess that it's given that capacity, but the memory is allocated lazily.

<comment> yjftsjthsd-h Correct; tmpfs only _uses_ as much memory as as is used by the files it contains.

</comment></comment></comment></comment></comment></comment></comment><comment><USER25> TOFU = Terrified Of Fucking it Up.

e.g I wanna try it but i'm TOFU</comment>


When Debtors Decide to Default - <AUTHOR> http://www.nytimes.com/2009/07/26/weekinreview/26streitfeld.html?_r=1&emc=eta1

<comment><USER2> The reason why Bank of America (or any lender) jacks the interest rate up on people failing to pay is quite obvious - people will pay off the most expensive debt first and then work there way down to the low interest rate stuff. By positioning themselves as the highest interest rate, that lender gets paid first. But that makes the debtor more likely to simply default because the interest is killing any hope they had of escaping. Add in multiple lenders all trying to play the same game and it is no wonder so many are simply unable to get out of debt.

It would be nice if lenders really stopped giving loans and credit cards to these people in the future, but I think plenty of people will default and in 5 years be back on new credit cards and new mortgages that some will end up defaulting on again.

<comment><USER3> Or they go though it once and opt out of the system after that and live on cash. I know many people now that refuse to have a credit card as they became far too expensive in the long run.

</comment></comment><comment><USER4> People don't do it lightly, they do it because they are desperate and realistically the only consequence they really face is a crappy credit score. They are okay with that... many already have tanked credit before they start this.

<comment><USER5> Once millions of people have bad credit scores and bankruptcies in their credit histories, the social stigma of a bad creditor gets diluted. That becomes a self-reinforcing process. The more individuals default, the less defaulting looks bad.

I believe that it was social and moral norms rather than clear cut financial analyses that stopped people from defaulting. It seems those moral norms have changed.

People have simply lost faith in the system. They don't care about being nice little creditors, wrought by guilt if they overspent or made bad financial decisions, when the government is handing out hundreds of billions to to-big- to-fail banks.

Then as if mocking everyone, banks go ahead and hand out tens of millions as bonuses to their CEOs.

I cannot see anyone watching this circus feeling too guilty about screwing up and then not paying back $10000. Everyone, wants a bailout.

</comment></comment><comment><USER6> "With all the bailouts the government is giving everyone, no one has any personal accountability about their own debts."

So true. The sanctity of an obligation, as the article discusses, was destroyed when the government ruled one side of the obligation less sacrosanct than the other.

Is that an excuse for lenders to run away from their problems? Absolutely not. It is no more valid than the child's argument "he/she did it first!"

<comment><USER7> Not quite -- the money for the bailouts comes directly out of the taxpayers' pockets, in the form of taxes. So debtors, who are nominally also taxpayers, are effectively having to pay these companies twice. Once, because of their own poor decisions, and again, because of the lending companies' poor decisions.

In this case, I think that not paying is more a form of civil disobedience, Thomas Payne style, than anything else.

<comment><USER8> I didn't feel like working so that my neighbor can walk away from their mortgage and my relatives can walk away from their credit card debt. So I don't anymore.

<comment><USER9> I didn't come here to see mindless talking points parroted back at me.

If you want to actually talk about the complexities of debt and the problems on all sides of the issue, by all means do so. If you want to shout slogans, please go somewhere else.

<comment><USER8> It's really not that complicated.

People are walking away from debt obligations. \- mortgages (12% of all mortgage, 50% subprime, 50% options) \- credit cards (13% default) \- personal bankruptcies (up 28% in second quarter)

federal/states/local governments are walking away from debt obligation \- pension reduction \- massive printing of dollar, $250B treasury selling this week

Companies are walking away from debt obligation \- commercial mortgages delinquency up 586% this half \- pension discharged by bankruptcy

Guess who's paying for this. That's right; the taxpayers.

So. Are you the sucker that's gonna keep on paying taxes?

All these you can google yourself (too many links to list here) I didn't come here to list all the bad things, since I doubt you even comprehend 1% of the atrocities. Therefore, I kept it simple for you.

<comment><USER10> If society decides to declare a general "jubilee" year, and cancel all debts, and you decide to pay off yours, it is true that you are at a disadvantage.

If society decides in general to massively devalue the currency to help irresponsible borrowers, that will punish responsible savers.

However, these do not imply "not working". That can imply not valuing currency as much, so you consider your salary less, or defaulting on your own debts even though it is distasteful to you, or all sorts of things, but it is unlikely to work out well for you if you are on strike while the prolifigrate borrowers are not.

If you want to go on strike, you will have much more effect by going on a spending strike rather than a working strike. I have been considering getting a bumber sticker for my rusty 1988 VW that says "I am going to keep fixing and driving this POS until the bailout money is paid back".

<comment><USER3> While I will agree there a tons of irresponsible borrowers but I wish people would give some anger over the irresponsible lenders that helped create this mess.

There were far too many companies willing to throw as much credit around as it was more profitable to lend more than people could handle.

It was getting to the point that all you needed to get $10,000 of credit cards was a pulse... and even then that wasn't needed.

</comment></comment></comment></comment></comment></comment></comment><comment><USER11> This article is severely lacking in a discussion of consequences. Publishing an article like this, given the average intelligence level of Americans these days, is irresponsible. I have debts to repay (student loans!), and the idea of "just not paying" is very charming, but there are real consequences for these actions. It's not something to be done lightly or 'because I want to'.

<comment><USER12> The difference with Student Loans is you can't just avoid paying them. With most debt you can discharge it through a bankruptcy but since 1998 you can no longer discharge student loans unless it would be an "undue hardship". After you default they will simply attach your wages for up to 25% of you after tax salary.

</comment></comment><comment><USER10> I hope that society developes a different view of debt and consumer debt in particular through all this.

One thing to note, is that either the paying off or writing off of debt is deflationary -- something that was an asset on someone's books, either simply vanishes, or else is replaced by money that was extracted from the economy.

</comment><comment><USER13> The big winners are the businesses that sold products to these consumers. The losers are the banks and consumers themselves.

<comment><USER14> I think the biggest losers are actually "the rest of us": i.e. those of us who neither borrowed more than we could afford to pay back nor lent to those whom we knew could not afford to pay us back. There aren't many bailouts or special government programs (at least that I'm aware of) for people who acted responsibly in the midst of what was obviously foolishness.

<comment><USER15> Indeed. I feel very screwed over by all of this. Making the wrong decisions got people lots of free money. Making the right decisions got me nothing, except interest on my savings account is now so low that it barely makes up inflation. (It was nearly 5% before all this!)

All these people that don't pay off their credit cards ensure that those who _do_ get higher interest rates and fewer services. Thanks a lot, guys...

<comment><USER16> That doesn't make sense. The banks make money off people who carry a balance.

<comment><USER15> They don't make much money off people that rack up $25,000 of debt and then refuse to pay, or people that borrow $500,000 for a house that's worth $150,000 who then leave and stop paying the mortgage.

People that pay the minimum payment on their credit card every month are great -- if everyone did that, there would be no credit crisis. I would be getting my 5% on savings, and would probably be able to own a house.

<comment><USER17> Actually most banks did make money from those transactions. They knew it was a bad debt so they sold it before people defaulted. The US housing bubble actually ended up sucking up a lot of money from the rest of the world and dumping in on the US economy.

</comment></comment></comment></comment></comment></comment><comment><USER18> Why not lend only to people who have already shown that they can handle money? In other words, why not mandate large annual fees for credit cards and VERY high down payment requirements for mortgages?

And yes, in fact, I AM suggesting that we only loan money to people who already have some.

</comment><comment><USER19> During the Great Depression there was significant public sympathy for bank robbers as the banks were seen as having taken advantage of common people. I hope we're not headed for a similar breakdown in social order. Intentionally defaulting on a debt is one thing, but sticking a gun in a teller's face is something else altogether.

</comment><comment><USER20> 25% interest rate should not even legal in the first place. Do banks offer consumers 25% on savings interest? Not even close.

<comment><USER21> Usury laws have been around for hundreds of years. Why the hell don't we (the USA) have them anymore?

<http://en.wikipedia.org/wiki/Usury>

<comment><USER22> Usury doesn't mean that high-risk debtors will have access to credit with reasonable interest rates; it means they won't have access to credit at all. If you're in a situation where your best option is to take a 25% loan to pay for bills, that's a truly shitty situation, but how can it be improved by taking that option (which we just agreed was your best option) off the table?

Some of my thinking on this subject was the result of this excellent thread on payday lenders: <http://news.ycombinator.com/item?id=543086>

<comment><USER23> From personal experience with some people very close to me I believe that it is actually better not to have the option to borrow at 25%.

All it means is that they are able to live outside their means until they can no longer pay the minimum payment on their credit card, and at that point they are in deep trouble.

I firmly believe that the banks are too predatory these days. If a particular person is deemed too much of a risk to lend to then they _should not be lent money_. How is it a better idea to lend them money at a higher interest rate? All it does is (possibly)make more money for the bank and forces the rest of us to offset the risk in the form of higher interest rates.

<comment><USER24> > I believe that it is actually better not to have the option to borrow at > 25%.

I can think of thousands of reasons why I'd like to have that option.

On example:

My dog gets hit by a car and it will cost $4k to save her life. I have an extra $1k in my budget each month, but only $500 in cash reserves.

I'd pay 200% annual interest.

If I lived in a paternalistic "aarongough knows best" society, my dog would die.

Please don't be so quick to imagine that your preferences and resources (parents, friends with money, etc.) apply to everyone else.

<comment><USER10> Dude, let the dog go. That is not an appropriate decision. If it was a person who was hit, then it would be ok to borrow at that; but I pay property taxes so the county hospital will fix the broken bones of indigents.

Unless the dog brings in income comensurate with that, like a high-end herding or show dog, it is irresponsible to spend that much on a pet. Even if you had the $4,000 sitting right there.

If I were judging your credit card application or a loan application and I had your post in front of me, I would be inclined to think that you did not make responsible financial decisions and not approve your credit.

P.S. I like dogs.

<comment><USER25> The dog does not bring home money, but so do not, for example, overseas vacations or even going to the movies. Would it be irresponsible to spend money on movies or tourism because this money produces no income for the spender?

The dog does bring positive emotions, and the loss of a pet brings negative emotions. These emotions can easily be valued by a person (owner) way over the $4000.

P.S. I like cats.

<comment><USER10> There are many situations under which a person might spend $4,000 on a dog.

But we are talking about the specific situation in which you don't have $4,000 and intend to borrow it at 25% interest. In that case it is not socially acceptable to spend $4,000 on the dog. To note your other examples, it also irresponsible to borrow $4,000 at 25% interest to go to movies or spend on overseas tourism.

Note that I am not just claiming that it is unwise and irresponsible (it is); I am also claiming "social acceptance" in that society in some sense backs this up. My evidence is this: if you bring a child in need of $4,000 in care to a doctor, and don't have $4,000, the child will get the care; you may be dunned for the bills, but the child gets fixed.

You bring a dog into a vet, and you are indigent, the dog either gets given away to someone who will pay or it gets the needle.

My personal views go further, in that even someone who has $4,000 is being irresponsible by spending it on a dog (in most cases - a breed in threat of extinction or a highly trained dog might be worth it, I am sure many seeing eye dogs are worth $4,000 and not replaceable for that). But I know that many people hold the opposite, and would even say you should not own a dog if you are not willing and able to pay $4,000 on vet expenses.

If you have to borrow at 25%, then you fail the "able" part of "willing and able".

One of the things that will come out of the current economic situation is that our society is going to be less accepting of people who do things like borrow $4,000 to spend on pet bills.</comment></comment></comment></comment></comment></comment></comment></comment>


Macs now twice as likely to get infected by adware than PCs - <AUTHOR> https://www.pcgamer.com/macs-now-twice-as-likely-to-get-infected-by-adware-than-pcs-according-to-research/ <comment><USER2> In other words, malwarebytes isn't selling anything to Mac users, so they paid pcgamer.com for an advertisement.</comment>


Microsoft's domino effect: Poor PC sales could unravel company - <AUTHOR> http://www.zdnet.com/microsofts-domino-effect-poor-pc-sales-could-unravel-company-7000008209

<comment><AUTHOR> Essentially ...

"Microsoft tried, but something isn't working. The platform is crumbling; the ecosystem isn't being capitalized upon. The worry is that the decline in PC sales could hit other areas of Microsoft's business. PC sales hit Windows sales and Office sales, therefore ultimately server software sales."</comment>


U.S. giving UK's trade secrets away to Russia - <AUTHOR> http://www.telegraph.co.uk/news/worldnews/wikileaks/8304654/WikiLeaks-cables-US-agrees-to-tell-Russia-Britains-nuclear-secrets.html#

<comment><AUTHOR> They might not be trade UK secrets, but I would think again if I was Britain. What could Obama be thinking? Sure we want to help save a few lives. Lets just tell Russia (which is controlled by many a totalitarian heads of state) what a DEMOCRACY has for secrets.

I didn't mean to be political. But to me this touches on the HN culture because if it was one business giving away another business's trade secrets, it would be illegal. I only question, why isn't it here. Why isn't the UN doing something about this?

</comment><comment><USER2> Funny how the BBC has on his web site main page stories like "Border clash kills Thai soldier" "Key Hmong denied Arlington burial" and so on, ...but as much as you look for this one, there is not a single word. Not a single word.</comment>


Weekend Project: Get Your Open Source Media Center Groove On - <AUTHOR> http://ostatic.com/176987-blog/weekend-project-get-your-open-source-media-center-groove-on <comment><USER2> I'm currently using Coherence (<https://coherence.beebits.net/>) as a media source for my Xbox 360. It works quite well as a home media solution.</comment>