HN user

nlitened

1,941 karma

https://www.latypoff.com/

Posts5
Comments689
View on HN

That’s kinda my point. We don’t have usage caps not because they are technically hard or impossible to implement (they’re not). It’s because the leadership thinks (likely correctly) that implementing them would just hurt company’s bottom line.

I am very sure what you’re saying is not true. It’s a viable-looking technical excuse, but you can easily understand that it’s false.

Let’s make a thought experiment.

CEO of Cloudflare introduces hard billing caps at a _business_ (not technical) level. Your organization will never be billed more than the level you set. Your app may stop, or may continue running, but above the monthly cap it’s free for you, it becomes Cloudflare’s expense if they didn’t pause the services.

I guarantee you that in this case, all technical issues you’re talking about would be solved in three weeks, and your service would go down within 3 seconds after hitting the cap.

If CEO decision were that any over-usage above the cap is deducted from employee bonuses from the specific product division that didn’t stop spending in time — all technical challenges would be solved in 48 hours.

Currently, there are literally zero organizational incentives for CloudFlare to develop any usage caps

About three weeks ago I was seduced by people singing praise to OpenClaw, and also by the fact that OpenClaw team burns millions of dollars of tokens per month on developing it — surely it must be good.

It turned out to be probably the crappiest, glitchiest piece of software I’ve used in the past few years. Its basic onboarding workflow was completely broken, GUI was a hallucinated mess.

Also it turned out that not a single person I know who dedicated time to configuring it, ever achieved anything remotely interesting as a result.

They don't force anybody though. People who think that the renting is too expensive and is not worth paying, are free to either 1) move to a place that has cheaper rent, or 2) build a new house from scratch since it's cheaper than renting.

Price of rent increasing in desirable locations is not due to greed or collusion of bad actors (as long as government prevents monopolies), it's due to more people competing to live in a place that can house only a limited number. Of course everybody wants to live in big cities in the US. But rent is very cheap in dying small towns in the middle of nowhere.

people like AOC who are working in the interest of society

People like AOC just pander to uneducated populace who'd prefer to use force to take free stuff of other people who work instead of working themselves.

Very easy to keep electing such politicians — just continue giving out more free stuff, so that people think it's the norm, and working is not required, just always taking is fine. People will vote accordingly

Instead of doing that, the effort should go into making all companies act that way.

That's because creating a business is a lot of hard work and risk, and surely you'd instead better virtue signal in your free time to look better to other people who are also lazy.

But then again you're very young.

A more equitable distribution of company profits does not imply the company loses money. It does not imply useless make-work jobs.

I fully agree, and remind you it's completely legal and simple for you to go and start a company that does equitable distribution of company profits. More people should do it instead of complaining that few people do.

Why Janet? (2023) 2 months ago

Square brackets’ use is very consistent and rather logical in how they are used in Clojure’s syntax.

When round brackets are used, the first element in the list defines how the rest of the list is interpreted, for example:

(func a b c) — run a function with its parameters

(macro x y z) — expand a macro with its parameters

([p q r] …) — “bare” function body that starts with a vector of parameters, and executable forms follow.

Square brackets are used where elements are the same “kind”, and the first one is not special, e.g.:

(defn f [a b c] …) — a collection of same-kind parameters, the first parameter is not special

(let [a 1 b 2] …) — a collection of bindings, the first binding is not special

The only exception that comes to mind is grouping multiple matching elements in `case`, but it for ergonomics.

Once I got the logic, when which is used, I changed my mind, and ever since I’ve felt it’s beautiful.

As I understand, earlier forms of life used RNAs as building blocks (instead of proteins encoded in DNA->RNA), so protein-based life _was_ a completely different form of life.

Some of the oldest replication machinery in our cells still uses the good old rusty RNA building blocks at its core (however nowadays they're propped up with proteins), and the newer machinery is almost entirely "high tech" proteins.

So you could say that in the billions of years, entirely new life forms were created, and they just completely displaced the older, less effecient ones. Probably pure-RNA life forms were not even the first ones, and they completely displaced even more primitive prior biotechnology when they appeared.

I feel like people who program in JavaScript or whose projects pull megabytes of dependencies, don’t get a moral right to complain about this. You guys just sit and calm down this time, you already said what you could.

Your app takes 20 seconds to load, pulling 50 megabytes of minified JS. Your backend is a mess of 20 Rust microservices, 300 megabytes docker image each.

Nobody has actually been reading and understanding code in your org for the past 15 years. And nobody has ever been responsible, everybody has just been job hopping for a 15% total comp bump.

Now the secret is out.

[dead] 2 months ago

Now we’re the forum for captcha-evading scrapers, boys

The way I see it, Clojure was created to address most of the philosophical problems highlighted in the article, and its ecosystem has developed under the influence of such ideas.

It embraces the dynamic nature of things. Every program that must do I/O is dynamically typed at the edges - so statically-typed languages must have both the facilities for dealing with dynamic types and static types, and use those differently for "inner" and "outer" parts of the program. The Clojure ecosystem makes it more approachable to work with dynamic data, and as a result, program's parts (modules, even functions) use the same machinery as the program as a whole. What helps, off the top of my head:

1. Immutability of values, persistent data structures, explicit state management - it turns out most of the "problems" with dynamic types are not due to the fact that types are unknown, but the fact that they may change over time. Most of concurrency problems also become irrelevant with immutable values.

2. Powerful data specs/schemas allowing to express full business requirements and constraints on expressible values (not possible with static typing anyway) — making invalid states unrepresentable and actually meaning it.

3. Concise unified model for working with different logical data structures, also nested data structures.

4. Simple asynchronous communication mechanisms and patterns between independent modules of a programs.

5. Rich extensible aggregates of data with namespaced keys as the object model.

6. An ethos of extreme backward compatibility (and tools for achieving and maintaining it) through accretion of novel values/parameters/features, enabling reloadable workflows, which makes it easy not only to redefine functions in code while program is running, but also updating individual programs while interconnected system is running, without breaking things.

The downside is that tools that reduce complexity are not very easy to use for people with less experience, so they cannot be too popular. People tend to overcomplicate, and to be quick to dismiss well-thought-out solutions.

You end up rebuilding semantics over and over again (validation, mapping, enrichment), and a lot of failures only show up at runtime.

I think die-hard fans of static typing mostly fail to acknowledge this objective reality and its implications. Every time they encounter this problem again and again, they approach it as if nobody thought of this before, and didn’t develop reliable abstractions to productively work in these environments.

ChatGPT Images 2.0 3 months ago

Yep, that’s the irony, that’s why I’m being tongue in cheek about Marxists’ “seize the means of production”, because people who produce capital also work very hard

ChatGPT Images 2.0 3 months ago

It’s about time we shaft the gatekeepers of talent, and redistribute and socialize the means of art production.

"count" is an incomplete type, the same as "array" is an incomplete type. "count of fruit" would be a complete type, compare to "Array of int64".

Javascript has arrays of unspecified types, and count of items of such arrays. I don’t think your analogy holds

No, rewriting in any language is bad by itself. What Fil-C gives you is that you don’t need to rewrite old programs. You spend zero effort, and immediately your battle-tested program is memory safe and free of any potential future vulnerabilities. With Rust you spend man-years on a rewrite, and as a result you have a new untested program full of subtle bugs, which you need to spend another 10 years of real-world use to uncover.