It's my understanding that a big part of WSL1 performance loss comes from the relatively thick layered filesystem architecture on Windows.
Since git and nodejs are both common in modern development and are expected to work efficiently with huge numbers of files, this was a real bottleneck and it couldn't easily be tackled without threatening backward compatibility.
It only goes into the factory owner's pocket to the degree that the factory has no competitors (has pricing power) and the factory owners don't work for the factory (i.e. RSUs and the like).
Marx is great at building a narrative that generates resentment if you buy his frame. But you don't need to buy his frame, and if you don't, you suffer a lot less resentment. It's no way to live.
The poor capitalists with all the money and power, making the decisions at the highest levels, guiding society's direction... can you imagine they might be responsible for the shittier and shittier turns our world is taking?
Class is the shape of power and exploitation under capitalism. Some own, others work to enrich those that own. That's all class is. Being frank about the real power differences in our society and our world isn't an ism.
There is a spectrum between an employer’s monopoly/oligopoly over labor that Marx’s narrative presupposes and a perfectly competitive labor market your narrative presupposes.
Reality varies between these two extremes in different labor markets. In some labor markets, the employer has so much leverage they’re essentially a local monopolist; in other markets, employees have enough leverage that the respective labor market is close to perfectly efficient.
Thusly, both yours and Marx’s narratives about the labor markets are typically wrong, but serve good extremes on a spectrum. These extremes help you calibrate the respective spectrum and as you turn the dial between the amount of power the employee vs employer has in a respective market, you can induce how well employees get treated.
Moreover, if there exists a mismatch between employee treatment and their respective leverage, there essentially exists an arbitrage opportunity to exploit. For example, in 2022 Musk (especially when he bought Twitter and laid of 80% of the workforce) and other tech oligarchs conjectured that tech workers were being overcompensated and that employers had enough leverage to start treating them worse. Largely this bet paid off whether or not it was justified during the time. On the other hand, RenTech saw that highly skilled people were being under compensated and was able to get top tier talent without having to compete with others firms that much since they were undervaluing this labor.
I think right now tech labor is being undervalued by the market and that there is an arbitrage opportunity to get highly skilled people since the cut-throat competition for these workers is much less than it was in 2021. That is my conjecture. Regardless if my conjecture is true, I hope I sufficiently illustrated why this spectrum mental model is more useful than presupposing a monopoly labor market or a perfectly efficient labor market: both of these are unlikely to be true and are just meant to be oversimplified mental models with strong assumptions that can be loosened later. From these strong assumptions, we can loosen them to build more robust mental models as I describe above.
But in a perfectly efficient market, the good would be traded at its marginal price. And the marginal price of labour is the sustenance wage, not the marginal product of labor as neoclassical economists seem to believe.
> It only goes into the factory owner's pocket to the degree that the factory has no competitors
Nope! Marx explicitly presupposes fully free market, where everything (including labour) is bought and sold at the marginal cost. But the marginal cost of labour is less than what that labour produces — workers produce more than they get to consume, you know, otherwise we wouldn't have been able to feed the children, the elderly, the politicians, the priests, etc.
You had to deal with two flavors of pointer, near and far. Far pointers came with segment selector, for accessing more than 64k. Your choice of memory model influenced the defaults. You might use near pointers for internal references in a module, and far pointers for external references.
I guess it was awkward to use languages that had higher level than assembly in order to write 16-bit programs that required more than 64KiB of memory. And also not quite portable, since they were all tied to x86 CPU. Those were messy times I guess. A somewhat similar story was 32-bit PAE, where the the CPU could address more than 4GiB physical memory, but software was still 32-bit and virtual addresses were capped at 4GiB. Linus was right that you must have more virtual memory (preferably 10+ times more) than physical, otherwise you have to jump through hoops. https://cl4ssic4l.wordpress.com/2011/05/24/linus-torvalds-ab...
All software is portable by that former definition.
When people talked about portable before, they meant code that used an abstraction that was platform agnostic. And that’s how it’s still used today. It’s just we have better abstractions now so our expectations of what is “portable” have gotten stricter.
Eg the P in POSIX (which is nearly 40 years old now) is “portable”. The point of POSIX was to provide common abstractions that one could build against to run on multiple different operating systems. It wasn’t about porting software, it was about preventing people from needing to constantly write platform-specific ports.
It was about making software easier to port. You still couldn't necessarily just write software for all operating systems at once, but you had less porting work because less stuff was different because of the standardisation. So open(argv[1], O_RDONLY) works on all POSIX systems, but if you want to create a pseudoterminal, it's different on each, and if you want to create a container, they don't even use the same concepts.
> but if you want to create a pseudoterminal, it's different on each
This is somewhat outdated information. POSIX.1-2001 added "posix_openpt" to create a pseudoterminal, and most POSIX implementations now support it–at least Linux, macOS, FreeBSD, NetBSD, OpenBSD, Solaris, z/OS, AIX, HP-UX, QNX, Minix and Cygwin do. (Of course, that's only true of current versions, if you go back a decade or more you'll find many of them hadn't implemented it yet.)
But you’re now arguing the same point I am: Portable means low effort porting.
Saying something “can” be ported doesn’t make it portable. People would port games from the NES to the Master System, to 8 bit Micros but in most cases they were effectively complete rewrites because there wasn’t any common abstractions between those platforms.
Where as tools like POSIX provided abstractions to make code portable.
As I said before, the only reason you think the term has changed over the years is because the abstractions have gotten better and thus people’s expectations for how much effort should be required to port have gotten stricter. But that doesn’t mean the term means something totally new.
And by the way, I have authored portable terminal emulators and $SHELLs. ;)
Containment of the execution environment isn't really the issue. It's API tokens that were designed with coarse permission scoping so agents get more power than they need. The risk isn't that your machine gets hacked. It's that your email gets deleted, or forwarded to someone who uses it to break into your other accounts via password recovery.
A statement that some proposition is true or false is usually less useful than a new framework for understanding the class of problem.
A machine that takes longer and longer to prove propositions in ever more inscrutable ways is hardly useful at all.
The machine too needs to produce more generalizable and comprehensible systems, for it to scale up its own conceptualization. Needing to load all the new mathematics in the context window won't be great either.
Rear view cameras are not a replacement for rear view mirrors, is my point. You use the two for different things. A rear view camera trying to replace a mirror would need a cleaning and wiping solution, something that we use rear window wipers for with analogue mirrors.
I learned about machine code and two's complement from the Machine Code for Beginners book. It gave me a head start in college 10 years later. With it, I got my Amstrad CPC 464 to run a loop maybe 100 faster than BASIC, and I was enlightened.
The Usborne books were the single strongest teacher I had getting into coding. I never owned any; I relied on the library.
In the earliest days, I didn't have a computer either. I'd read an Usborne book, then hang around computer stores poking at the 4+ years out of date Commodore 64s and CPC 464s and even the Acorn Archimedes (fanciest most capable BASIC), putting what I learned into practice. I'd even practice on VTech devices with two monochrome LCD lines of text, in toy shops, to get my fix.
I don't think I'd be where I am today without those books.
Immature kids - and kids are by definition immature - make dumb decisions.
Certainly there needs to be repercussions, the kids need to learn, and need to be warned in advance, but kids will do dumb things.
You can talk about news coverage, but you can't force 12 year olds to watch the news, or understand how their actions have consequences. When the consequences do come, the focus needs to be primary on rehabilitation and restitution for the first instance.
Since git and nodejs are both common in modern development and are expected to work efficiently with huge numbers of files, this was a real bottleneck and it couldn't easily be tackled without threatening backward compatibility.
reply