Hacker Newsnew | past | comments | ask | show | jobs | submit | more shellac's commentslogin

Academic publishing is _notoriously_ profitable. Authorship and the bulk of the editorial process is done by others for free, and these days you often aren't even creating a physical copy. Their overheads are really pretty minimal. What the money (subscriptions and / or APCs) gets is the kudos associated with the publication.

It is reasonable to say: well if they aren't providing anything of value then the market ought to bypass them. The reality is that the publishers have been very canny in protecting their position, and sharp practice is rife.


> Instead of journals getting revenue from subscribers, they charge authors an “Article Processing Charge” (APC)

Just to be clear this is specifically _gold open access_. There are other options like green (author can make article available elsewhere for free) and diamond (gold with no charge).


> QL-looking for the Spectrum

I was going to object, but probably right to just skip the horror of the true Spectrum keyboard.


Maybe they meant the ZX Spectrum II, known to some as “The Toaster” for some reason.

Rubber keyboard, I heard it referred to as dead-flesh.

It put me off computing for a few years, that and all the bloody modes for different keywords.


You are mixing up several different computers here.

> Maybe they meant the ZX Spectrum II

No. There was never never a "Spectrum II".

The second model after the original 16K and 48K was the ZX Spectrum Plus, in a keyboard derived from the 1984 Sinclair QL design.

http://www.retro8bitcomputers.co.uk/Sinclair/ZXSpectrumPlus

Then the 3rd model was the ZX Spectrum 128, in the same keyboard, but with more ports and a large external heatsink.

https://www.computinghistory.org.uk/det/2584/sinclair-zx-spe...

> known to some as “The Toaster” for some reason.

Nope. The 128 was known as the "toastrack" for the heatsink.

> Rubber keyboard, I heard it referred to as dead-flesh.

Not since the Plus model, no.

After the 128, Amstrad bought the brand. It launched the ZX Spectrum +2 and +3.

https://www.computinghistory.org.uk/det/3648/Sinclair-ZX-Spe...

https://www.computinghistory.org.uk/det/509/Sinclair-ZX-Spec...

Those are the closest to the nonexistent model number "II" but they do not have the QL-derived keyboard.


It sounds like this will include Teesworks, one of the dodgiest land deals of recent years. For a small investment two people essentially held the entire thing to ransom and secured options on an astonishing amount government money.

You can hear Richard Brooks summarise the situation (in 2023) here: https://www.private-eye.co.uk/podcast/76


The author works in Google developer relations, and while devrel aren't quite marketing they will use the latest and greatest Google hammer.


His demo is pretty slick, though. Less than 100 lines of code to get “the box I want on literally every customer service site.”


Less than 100 lines of code to give the overwhelming majority of consumers "LanguageModel is not available." and a free snipe hunt for 0.5% of them to try to figure out how to enable it via chrome flags or snapshot browsers.


Provided one is using ChromeOS "standards".


Yeah maybe it is overkill but this would be a semi hard computer vision task not too long ago, it is pretty amazing you can get it that easily nowadays


So now marketing is working through the disgruntled-at-stupid-tech HN bait (as someone who works on the built-in AI team)? Or wait, how long have they been doing that?


The article states "I currently run an Ampere Arm server in my rack with Linux and ZFS as my primary storage server" and this is just explaining how to try it out on the Pi, which I found surprisingly interesting. I am glad people like the N100s and wish they would find more relevant articles to talk about them.


Well, I am curious about compact SATA options, and have a peer response to yours that is eminently useful, so… I’d say it’s still on topic.


> Are there any good Linux distros left with 32-bit x86 support?

When your kernel stopped support over a decade ago (iirc) it does seem inevitable that distros will slowly evaporate.


Linux didn't drop support for 32bit x86.

You might be thinking of i386 or something.


It's a minor thing, but:

> Most of my open source work followed Unix philosophy, so the packages did one thing at a time.

Nobody has suggested that libc -- to take the most obvious example -- is against the Unix philosophy. Debates occur around whether whether commands / daemons do too much (recent poster child being systemd) or aren't composable.


If anything, the left-pad debacle has shown that NPM package granularity has gone way too small, at a point where package overhead was outweighing the package simplicity benefits.


Left-pad was made at a time when tree-shaking wasn't really around, so it was good practice to only include the functions you needed to avoid making websites too heavy. If you just needed a small function then it'd be silly to include a huge utility library like Underscore.


You're missing the point. Nobody with a serious background in software development should ever need to pull in a package to pad a string or check if a number is even or odd. If someone is smart enough to use a package manager, they should be more than capable to write a function to pad a string (assuming the standard library doesn't include one already)!


How does serious background help the argument for wasting your time writing code that's already been written. By the way, why should serious people use padding from the standard library?


I would argue that a leftpad/is-odd package is the equivalent of writing a for loop. The time it cost you to search the internet, download the package, and rerun your build script cost more than the time to write the function from scratch and the behavior is indentical.

Duplicate code across the ecosystem is fine. Not every function must be unique for an entire programming language.


What about the time it cost you to search the internet, read the docs, and use the one from std? How many seconds does each variant take (with hot/cold memory cache?)

And the behavior could also be worse, there is no guarantee of perfection.

The last argument is too generic to offer any guidance. Why is it better for this function be duplicated?? Should it not be part of std to avoid uniqueness?


> Should it not be part of std to avoid uniqueness?

> > > > (assuming the standard library doesn't include one already)


This doesn't address the should


The standard library is a far less risky dependency than third-party libraries. It's far more reliable in presence and behavior.


While you are correct, the problem compounds when popular package developers choose to use tiny packages.

I don't need left-pad.

But maybe I need react-starter-kit.

Now, imagine that react-starter-kit has a dependency to markdown-js-blobber, which has a dependency to make-text-nice, which has a dependency to left-pad.

In this scenario I am now "pulling in a package to pad a string". If I am "smart enough to use a package manager", I should be "more than capable to write..." an alternative to react-starter-kit..?


The onus there is on the "make-text-nice" developer, not an eventual user of "make-text-nice".


I don't place any blame here on the person using `react-starter-kit` and I think you're being a bit obtuse to suggest otherwise. It's the original person who pulled in a package for <10 lines of code who is to blame.


I provided the real reason for the high download counts of these packages.


However, JavaScript never had a proper standard library.

Combine this to mainstream education teaching that you should always reuse code when possible instead of "reinventing the wheel", and web shops agreeing to it because "using libraries saves time", and it's easy to understand the "popularity" of left-pad.

To a certain extent, and to the best of my knowledge, those things haven't really changed.


Ironically I feel like this is something LLMs will improve. Now anyone can type "create left pad function" and it will essentially just vendor in the existing code.


What does the size or granularity have to do with the incident? If the author had combined all his 350+ packages into one (or had had a more comprehensive text-utils.js package) and pulled that instead, the issue would have been at least as severe?

I don’t think such small packages are sensible, in particular when versioned separately, but I also don’t see how the left-pad debacle has shown that.


[flagged]


Instead of teasing, can you just tell us what the difference is between unpublishing N small packages versus one large package containing the same set of functionality?


Well, I sure can!

When you develop software by gluing together 1000000 small packages, you now have 1000000 points of failure.

When you develop software by... you know, writing trivial things by yourself instead of downloading a package... you have maybe 100 points of failure instead of 1000000 points of failure.

Having 100 points of failure is better than having 1000000 points of failure.

Note that in this example you are writing trivial things by yourself instead of adding a package. So we're not taking the same set of code as dependencies, slicing it into different number of slices, instead we're taking less code as dependencies.


These seem like two independent concerns:

1. How the dependencies are broken up

2. Whether to take dependencies at all ("buy or build")

It's still not clear to me how taking a larger dependency (with things I might not need) is inherently better than taking smaller dependencies. That seems like a question of trade-offs. What if there's an issue or security hole in a portion of the larger dependency that I didn't even use? For example, that log4j LDAP debacle, what if that were broken down into smaller dependencies so that you didn't even have the LDAP thing if you weren't using it?


I don’t quite follow the reasoning. You can reverse the argument: When one package breaks, then — all else being equal — more dependents are likely to be affected if it is a large package with many functions than if it is a tiny package with just one function.

What made the left-pad incident prominent is that the package had so many dependents. That’s due to how frequently its functionality is useful, not due to its size. And in general these are inversely correlated characteristics.

Yet another argument: If any given function breaks, then the affected dependents are invariant under the granularity of packaging. Exactly those dependents will break that make use of the given function, regardless of the packaging.

The one argument I could buy is that depending on a larger number of packages increases the likelihood of depending on unreliable maintainers. Still, in the case of left-pad that isn’t entirely convincing, since the maintainer in question maintained so many packages.


I specifically said in my post that I did not make the argument you think I made.

Here is a copypaste of the part where I clarified that:

> So we're not taking the same set of code as dependencies, slicing it into different number of slices, instead we're taking less code as dependencies.


> Nobody has suggested that libc -- to take the most obvious example -- is against the Unix philosophy.

Plenty of people have suggested that. I'll suggest it for you now if you like. The modern form of libc is very much against the unix philosophy; traditional Unix had a much simpler libc where many functions were just syscalls; some parts of today's libc were hived off into separate libraries like libm, and other parts like NSS and convoluted DNS resolution frameworks just didn't exist at all.


The obverse to 'do one thing' is that you have to do the whole thing.


The "unix philosophy" is a useless philosophy - perhaps worse than useless even - because "one thing" is not well defined, so in practice it adds nothing and just leads to arguments.

You could say that Eclipse does "one thing" - being an IDE platform - but I don't think anyone thinks that's what the Unix devs meant. Similarly I don't think they meant for people to write libraries that contain one 11-line function.

The actual advice should be something like "programs/libraries shouldn't try to do too much or too little". How do you know how much is too much or too little? Like so many programming guidelines the answer is you need taste and experience.


I feel like "do one thing and do it well" is an oversimplification:

(i) Make each program do one thing well. To do a new job, build afresh rather than complicate old programs by adding new "features".

(ii) Expect the output of every program to become the input to another, as yet unknown, program. Don't clutter output with extraneous information. Avoid stringently columnar or binary input formats. Don't insist on interactive input.

(iii) Design and build software, even operating systems, to be tried early, ideally within weeks. Don't hesitate to throw away the clumsy parts and rebuild them.

(iv) Use tools in preference to unskilled help to lighten a programming task, even if you have to detour to build the tools and expect to throw some of them out after you've finished using them

---

[1] https://archive.org/details/bstj57-6-1899/page/n3/mode/2up


I agree with that. And like most rule of thumbs, it's very useful to go beyond the prescriptive part and ask yourself "why". And as qsort described, doing "one thing well" enables you to have desirable traits (easy testability, low cost refactoring, etc.).


> because "one thing" is not well defined

That's what a philosophy is, gives you some general guideline and you have to use your thinking to figure out how to apply it in specific circumstances. It does not substitute that thinking neither does it prevent stupid choices, it helps guide you in a higher/strategic level. It is not responsible for people making stupid decisions.


Sure but my point is that the Unix philosophy is so ambiguous that it leads to more confusion than it helps.

Stating it in a way that makes the ambiguity obvious - "don't make your program do too much" - reveals how little value it contains.


If you consider it from the point of view of how "clear is the scope?" Then it makes more sense.

Libc implementations have a very clear scope, clear enough that you can point to the specification. That is their 'one thing' do what that spec says.

Eclipse however, doesn't have that singular goal. You would be hard pressed to say how many of Eclipse's tentacles is a clear push towards being an ide. What should a completely finished version of Eclipse that met all it's goals look like?

Similarly the one thing could be "be a c preprocessor" or be a full "c compiler" these are both "one thing"s even while one is a subset of the other.

The intention of "do one thing, and do it well" is not to limit the scope but to show the boundary of the scope and to commit to doing everything within that boundary

By making your one thing "a full c compiler" you should be committing to doing everything that someone making a c preprocessor is doing, and to the same standard. The Unix philosophy should be considered a warning not to neglect components because you are working on a larger system.

You can't do everything, but you don't have to. If others are following the same principles then many of the parts of what you need will be done to a high standard by others.


> Libc implementations have a very clear scope, clear enough that you can point to the specification. That is their 'one thing' do what that spec says.

No you can't get out of it my just saying the "one thing" is to do what the spec says. Who decided what's in the spec?

Would Eclipse be fine if someone just wrote a spec for it?


It doesn't matter who decided what's in the spec. What matters is that you decided to implement it to a high standard. It's usefulness to others will be related to what they think of the spec. Nobody has to use your tool, but it's good for everyone to know exactly what the tool is.

Eclipse would be fine if it had a spec, committing to implementing that might be a task to arduous for some. A full spec would also lay bare what its goal is. Which in turn might lead to people deciding the tool they need is not this one. But yes, if was clear what it should be doing and it did that well then everyone benefits.


So the Unix philosophy doesn't apply if you have a written specification for you program? That's a pretty out-there view. I don't see why having a spec is related to what the Unix philosophy is trying to achieve.


The Unix philosophy tells you how to get a powerful interactive programming environment on a 16-bit minicomputer where the maximum text segment size was 64KiB. The libc I'm using on this cellphone is 1MiB, 16× bigger. So at least 90% of libc is against the Unix philosophy.

I don't see how anyone could read the Lions book or APUE, on one hand, and the pthreads manual or the ANSI C specification of setlocale(), on the other, and come to the conclusion that they represent the same philosophy. It's like thinking Ayn Rand is an exponent of the same philosophy as Epicurus; it betrays a staggering lack of sincere engagement with either one.


> Containerization executes each Linux container inside of its own lightweight virtual machine.

That’s an interesting difference from other Mac container systems. Also (more obvious) use Rosetta 2.


Podman Desktop, and probably other Linux-containers on macOS tools, can already create multiple VMs, each hosting a subset of the containers you run on your Mac.

What seems to be different here, is that a VM per each container is the default, if not only, configuration. And that instead of mapping ports to containers (which was always a mistake in my opinion), it creates an externally routed interface per machine, similar to how it would work if you'd use macvlan as your network driver in Docker.

Both of those defaults should remove some sharp edges from the current Linux-containers on macOS workflows.


If I had to guess, colima? But there are a number of open source projects using Apple's virtualisation technologies to run a linux VM to host docker-type containers.

Once you have an engine podman might be the best choice to manage containers, or docker.


Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: