264 karma · joined January 1, 2022
https://meipouchou.com
Every three years, the US Copyright Office considers petitions for exemptions to the DMCA. The big famous example that everyone talks about is in 2015, teachers won the right to bypass DVD copy protection to preserve teaching materials. This exemption had been rejected at least twice previously, but they finally won approval in 2015.
Every three years though, it's a fight. Previous exemptions can also be withdrawn during these proceedings if the Copyright Office or the Librarian of Congress believes that the exemptions are not working as planned and are harming the market.
For a long time now, folks like the Internet Archive have been petitioning to legally allow digital lending of all kinds of content, including video games. This is far from the first time this exemption has been considered. However, these proceedings include testimony and discussion, and the Entertainment Software Association (ESA) always sends lobbyists to oppose the exemptions.
In the past, one of their main arguments that worked was that those who wanted to allow digital lending were customers and enthusiasts who wanted to open their own digital arcades. There was no serious scholarship behind it.
They also were able to imply that video games weren't culturally important like books or movies because they were purely entertainment, and therefore not worth studying or preserving. And this argument worked because indeed, the Registrar of Copyrights saw video games as lesser cultural artifacts.
That's one of the reasons why organizations like the VGHF became so important to the fight. By proving that there is an academic community and non-profits engaged in treating video games as seriously as they deserve. Because of that the ESA shifted its argument completely to the economic harms to the retro game market.
To counteract that argument, the VGHF performed a study last year showed that 87% of video games are no longer commercially available, so there's there's no market to ruin if those 87% were allowed to lend. They even proposed a lot of safeguards to limit the number of copies lent and DRM schemes to prevent borrowers from dumping the ROMs (which are out there anyway).
The ESA countered that those games would still be competing with retro games that are still being sold on the market, and that the protections weren't good enough. DRM can be cracked, and they don't trust the people who want to lend the games to not introduce side-channels to get around the restrictions. In their argument, only the rights holders can properly protect their games, and only with help from the DMCA.
It's worth noting that the Registrar of Copyright is famously even more strict than rights holders at these arguments sometimes. In 2012, they denied the request for teachers to break DVD encryption, even though lobbyists for the motion picture industry said they would accept it.
And so that's what this news is about. Despite the lobbying and the studies, they sided with the ECA, seemingly taking their arguments all at face value.
I should also note that publishers do often go after libraries for lending books. It's often said in these circles that if lending books through a library weren't already common when the DMCA was enacted, we'd have to fight just as hard every 3 years to get exemptions for what libraries have always done, and we still probably wouldn't get everything.
> Google doesn’t know or care about who’s using it at that point
is incorrect.
Google Drive uses OAuth. Users don't register API keys, apps do, and then users just log in with their Google account.
Google now requires apps to go through manual approval to actually use their OAuth keys, if those apps request certain endpoints. Doesn't matter if the app is local or cloud-hosted, if it makes certain REST requests, it needs special access, and Google controls which API keys get that special access.
See https://developers.google.com/drive/api/guides/api-specific-...
Last time I used it, the file picker was by file, not folder, and was fairly janky. By that I mean it was slow and cumbersome to use. Selecting one file was bad enough, let alone multiple.
But selecting an entire folder would definitely be better, assuming that the experience could be much improved. I still think there needs to be a way to bypass it for apps that truly need access to every single file--even at the risk of attackers exploiting the app or the developer deciding to turn evil--but that's getting sidetracked from the real argument. So for now, let's assume I agree that the select a folder solution is perfect.
The real issue is that Google should not be the arbiter of what apps are allowed that kind of access, and they certainly shouldn't be making small developers jump through the expensive, ineffective CASA hoop to get it.
That's the real reason iA's discontinuing development on Android, and they're right to do so. Google Drive should have a permissions model that allows for users to control how much access an app should have. That would solve the issue without the unnecessary bureaucracy, the mistakes (like suggesting an editor be read-only), and added expense that other platforms don't put on third-party developers.
I could see your point if this was some fly-by-night web app accessing Google documents. But this is a native app I'm running on my phone or computer. I may have legitimate reasons to access those photos, to embed them into a document.
Then I think we have completely opposite expectations of what a native editor should do here. I don't want to use iA to create an app-specific folder for all of its files, I want to use it to edit all of my existing files in all of my buckets. Who organizes their files by app? Imagine if VS Code could only edit projects in a folder it created to manage files? What about Photoshop? Should I be forced to save images in the Photoshop folder and then move them to my VS Code folder?
I would never "create one or multiple buckets per app," because my life isn't app-centric, it's document-centric.
On S3, I organize my buckets by project, or sometimes by client. On Docs, that's how I organize my folders. If I download a new editor, I expect it to be able to edit any and all of the files without fuss, whether they're on my local disk, on S3, or on Google Drive.
If I'm running an editor, it really does need to "access everything I have in there," including files, created by other apps or uploaded by the user directly.
EDIT: I'm not trying to question the intentions of those who think apps that access all files should be more secure. But the current process is untenable for independent developers, and in my experience, does little to actually improve the security of the app. iA is correct to drop drive support rather than attempt to shoehorn their app into a scope it's not designed for or waste time and money jumping through these useless hoops.
> I suspect this is why Google took away the free option and are requiring a review by a security lab.
Arguably, I'm not as familiar with iA as I should be, having only tried it briefly a while ago, but IIRC it basically mounts your file store as if it were a filesystem and allows you to completely manage files. Add, rename, delete, etc. And it's not just limited to iA's App's data. Part of the sales point is to be able to go between iA and Google Docs.
And it allows you to search for a string in every file in a folder. Sure, it has to download every file to do that, and that can be a bad idea, but it if you have a folder of 100 files, 100 KB each, that's reasonable. But with drive.file, what are you going to do? Show a picker for each of those 100 files?
And this is for a native app. It would have to load up a web view to show the picker.
> With S3, you only get access to your app’s data, not everything user has.
This is incorrect. With the S3 API, you could implement the search every file in a folder feature I mentioned above, no pickers required. Just use ListObjects (or ListBucket) along with GetObject.
And again, Google is locking this kind of access behind a CASA review, and while I don't want to insult anyone's intentions, CASA review is fairly useless. Even the paid option is more security theater than anything else. And it's a burden put on developers that other services don't require.
Part of my disagreement comes from the fact that the process is inconsistent and time-consuming from Google's end. If you read more of the article, you can get a glimpse of how poorly it's run. And iA have been lucky here. Some apps submit to Google for OAuth approval and get stuck waiting for approval for years.
But another part comes from the fact that drive.file access is not enough for some apps, and iA Writer falls into that category. Some apps really do need full access. (But Google told them they only need read-only access, lol.)
Additionally, having been though the CASA process, it has been pure security theater. No offense to the people working on it, because I'm sure they have good intentions, but letting developers run a python script on their app to self-report vulnerabilities really doesn't solve anything. I suspect this is why Google took away the free option and are requiring a review by a security lab.
The problems with this is that Google only guarantees a minimum cost, not a maximum cost, and that not every company is in a position to let the lab Google has partnered with see their code. And finally, I'm skeptical at how much a security lab is going to find with a quick check on a small payment.
And frankly, Google Drive access is not worth the cost. Even if it's $500/year in fees, + time working with the lab (which, as iA pointed out, can be a huge opportunity cost), in most cases, the kinds of apps that need full access won't suffer $500/year in damages by removing Google Drive support.
And Google Drive doesn't exist in a vacuum. There are other cloud storage solutions out there. Amazon doesn't make developers jump through their ridiculous hoops to access the S3 API.
(Yes, there's arguments that untyped throws are better for library code because it leaves you more room to add more errors as you become aware of the need for them without breaking the contract with your users, but really, client code is going to be written to the errors you're throwing anyway (i.e. Hyrum's Law). I much prefer my errors to be typed so that if an error is added, the library version has to be bumped to indicate the new incompatibility with old code. And for my own, non-library code, typed errors make sure I'm handling all the error cases.)
And there's a lot of reasons for this. Measure 110, which decriminalized possession and usage of drugs, envisioned funding treatment with money from the tax on legal marijuana sales. There are a variety of reasons it failed, but the tl;dr is that it took $100 million from other state programs handed it to the state, and said, "Here you go. Create treatment programs." And the state replied, "But how do we do that?" The legislative branches of the Oregon state government is generally incompetent at administering programs it's been running for years (e.g. public defense). They had no idea how to even go about creating a treatment program or what one even looked like.
And Measure 110 also created a weird bureaucratic structure for dispersing the funds across multiple entities. IIRC 10% would go to the cities. And there's some 200+ cities. I'm sure they tried to allocate the money proportionally, but imagine being a small or medium sized city and the government says, "here's $30,000 for you to establish a drug treatment program." What are you going to do with that? Probably look at it, confused, and put it in a bank account where you'll forget about it.
There were lots of other reasons the attempts to establish treatment programs failed. NIMBYism of people not wanting treatment centers near them, for one. For another, few people ever actually expressed interest in treatment, which became a topic of much time-consuming debate about why we're spending this money on programs addicts don't want. And part of that was because the police basically never enforced the part of the law where they would ticket public users. The users would either pay a fine or call a substance abuse hotline. There are multiple reasons the police never felt it was worth their time to hand out the citations, and that's a topic for another time, but the fact that the treatment centers were being funded by tax money that went to law enforcement before decriminalization probably didn't help.
So yeah, can't swamp treatment facilities that don't exist.
For me personally, I tend to notice and obsess over an image's details when I see something's off. When AI art catches my attention this way, I end up going over it for a few minutes, which detracts from the time I have to read the actual article. In some cases, I just decide I've spent too much time and close the tab.
The image should be there to support your article, not distract from it. If you're going to use AI art, make sure it's indistinguishable from non-AI art.
That said, as I mentioned in a different reply, I should have stuck to the legal implications around impeachment, rather than the practical. This decision states that the only remedy for a president breaking some laws is impeachment. At the same time, it says the president now has a legal, if not entirely reliable, means to avoid impeachment: Order the military to kill those who would impeach them.
Yes, that was always a theoretically practical option, but now it's also a legal option, and that's bad. A strong nation requires a strong legal system.
Yes, this is true. However, the ruling very explicitly separates "core constitutional powers" from the rest of the president's constitutional responsibilities. There's basically 3 categories of action here.
1. "Core constitutional powers" 2. "His remaining official actions" 3. "unofficial acts"
OK, so I separated it out to 3 categories where the Court recognizes 2: official and unofficial. But I did so to point out that the Court ruled that "core constitutional powers" are always official acts, and it's up to the prosecution to prove that the act was unofficial, which thus means proving it wasn't a "core constitutional power."
And commanding the army to do something is a core constitutional power. The constitution is silent on what the president may not order the army to do.
This is how I read it, and I could be mistaken, but it's also how Sotomayor reads it, and she's a much sharper legal mind than I. Even if I'm wrong, it's frightening to be in a situation where top legal minds can interpret it this way. It means it's far from explicit, or safe.
As for the Guardian article, I'm not seeing where this has been tested in court. The article even mentions that the SC doesn't consider killing non-US citizens by the government to be forbidden by the constitution. Fair enough. Couldn't fight wars otherwise. But even if we assume they would rule extra-judicial killings of US citizens illegal, we're left with.
1. It's illegal for the president to kill a US citizen 2. But it's not illegal for them to order the military to do it (core constitutional power) 3. It's illegal for the military to carry it out 4. But the president can pardon them 5. And it's not illegal for the president to pardon them (core constitutional power) 6. Only federal laws apply if it's done in D.C.
As I read it, simply ordering the military to do something makes it an official act. But should it come to trial, Biden could argue that he was doing it to defend the constitution from those trying to undermine it. That he wasn't merely justified, but required to do so, and thus, it was a legitimate order to give, and thus a core constitutional power. Trump could claim the same: He was doing it to protect the constitution from the deep state which is illegally changing the vote totals.
So it's a bit less explicit than I remember from my first scan-through. What I was remembering was from one of the dissents, which reads:
> When he uses his official powers in any way, under the majority’s reasoning, he now will be insulated from criminal prosecution. Orders the Navy’s Seal Team 6 to assassinate a political rival? Immune. Organizes a military coup to hold onto power? Immune.
Barrett's concurring opinion touches on the idea that the president is immune from prosecution when ordering the military or police to kill, but only to show that the bar to presidential prosecution has historically been high.
As for the opinion itself, I believe the most relevant line is
> At least with respect to the President’s exercise of his core constitutional powers, this immunity must be absolute.
As far as core constitutional powers go, it doesn't get much more core than
> The President shall be Commander in Chief of the Army and Navy of the United States
It's even in the same section as the president's power to pardon.
Combined with the opinion, the president cannot be prosecuted for ordering the army or navy, no matter what those orders are.
> The problem I have with this logic - if the president can get a large enough group of the military to go along with a Junta takeover, it doesn't really matter at all what the court or prosecutors think anyway.
This is a practical matter rather than a legal one, and I should have kept to legal matters in my other reply. After all, a strong nation requires a strong legal system. What I was replying to was the idea that the only check remaining on the president's core constitutional power is impeachment. However, this ruling makes it legal for the president to bypass impeachment through the military. So as a legal, not practical matter, impeachment is now severely weakened.
By as a practical matter, I don't think you need a very large group within the military at all to take out 6 (or 9, if you want to go that far) supreme court justices, and threaten one or two senators so you can railroad your preferred replacements in.
As we saw during the first trump administration, the army was unwilling to go along with his every desire. A general even apologized for getting pulled into a photo op.
The US military is large and geographically diverse. I suspect that most would not carry out such an order. But you don't need most. You only need enough.
The problem for a theoretical coup group has always been what happens afterwards. Even if they were carrying out official orders from the president, you still potentially had to face the judiciary. The rest of the military might not come after you if the president orders them to stand down, but that still left the police open as an option.
The SC has now ruled that's not an issue.
I do understand a lot of the logic that the executive couldn't function if every action was litigated. But I look at other countries, such as the UK, where the prime minister in fact can be jailed for crimes, and I don't see it really being an issue. Seems better to me if no one is strictly above the law. Post WW2, we recognize that the military can issue and carry out illegal orders. We should extend that to the presidency.
The SC has essentially handed Biden a loaded gun. If I were him, I'd point it at the SC and fire, then point it at congress and appoint a new court that will take the loaded gun away from him. Because if Trump wins in November, you can be sure he will attempt to fire it.
So a president determined enough to prevent impeachment could avoid it as long as he or she were able to find a large enough group within the military willing to go along with it.
The idea that Congress could and pass regulations in a timely manner is a nice one. Unfortunately, Congress is almost completely dysfunctional, so there's a near-zero chance of that happening.
Many of the recent Supreme Court rulings seem to hinge on this idea that Congress can and should fulfill its role. And while that would be great, it completely ignores the reality of modern Congress. I fear we're going to suffer some extreme effects because the court is ruling based on how they think things ought to be, rather than what things are.
1: https://hbr.org/2023/02/banning-noncompetes-is-good-for-inno...
As for corruption, I suspect agencies may be more or less corrupt on an individual basis. I don't have any hard data, but I suspect they're less corrupt on average. The Supreme Court has, repeatedly, given Congress members the go-ahead to be almost as corrupt as they want, while they're harsher on executive branch agencies.
It's the Kafkaesque app review process and the inversion of power between platform holders and third-party developers.
I remember a time when I sold my software directly to users over the web. It certainly didn't cost me 15% of my revenue to process payments and refunds, but I'm actually fine paying Apple a few extra percent to cake care of that internationally.
Back in those days, the prevailing wisdom was that platforms competed for third-party devs in order to make their platforms useful for their users and increase market share. If you read the arguments around the new EU rules for platforms, there's a lot of talk about the platform holders' "rights" to "monetize their IP" or similar language. Apple says it. Google says it. Gruber and other influencers parrot it. I hate it.
Developing the OS isn't free, but the revenue from end users more than pays for it. Developing the developer tools isn't free, but the $99/year revenue from developers more than pays for it. Combined, they probably more than pay for development and hosting of the App Store.
I get that Apple has no shortage of people wanting to develop for their platform, so they don't need to compete for third-party developers anymore. I don't like it, but I understand it.
I just wish they wouldn't try to rent-seek on top of it. I wish app review weren't so complicated, self-serving, inconsistent, and useless. Apple likes to publish statistics on how many fraud apps they keep off the App Store, but in my opinion, it still has far too much trash and scam apps to argue that app review works well for anyone but Apple.
I tried that with the two examples from before. Mixed results.
Still had one comment telling me to finish it myself in the SNES PPU example, but that's a lot fewer than before. Unfortunately, when I told it to do the work, it gave me a more complete, but not totally complete header without mentioning that it was incomplete. It also took a few tries and I had to regenerate a response that started generating garbage code and then error'd out.
I checked to make sure that ChatGPT had no memory of previous conversations related to the SNES PPU. So I suspect this has more to do with the task given than the prompting style.
https://chat.openai.com/share/8703a48a-af72-4a9f-976e-688a26...
The parser was more interesting. I didn't remove the details of our toy language discussion from ChatGPT's memory, but I also didn't specify much in the way of what I wanted. It created some funky parser code, and I didn't try to compile it to see if it was correct, but it didn't appear to display the lazy behavior I saw before. It also titled the conversation in Spanish, even though I've never chatted in Spanish with it and I'm not fluent.
I suspect I could have gotten more correct output by giving a more detailed description of what I wanted, but I was trying to keep it simple to match your prompting style.
https://chat.openai.com/share/ccc23d98-6d4f-4be5-b9b6-b4464f...
> Let's write a compiler in C that tokenizes a single file in this language, parses it into a syntax tree, and emits an object file in LLVM IR. I'd like the compiler to be readable and understandable by a human, but execute as fast as possible.
The tokenizer it wrote was good, but when it got to the operators, it implemented + and -, and then contained this comment:
// Add other operators and delimiters
When I asked it to fill in the operators, it actually did a good job. However, this was the parser it gave me.
typedef struct ASTNode { TokenType type; char* value; struct ASTNode* left; struct ASTNode* right; } ASTNode;
ASTNode* parse(Token* tokens) { // Example parsing logic, build your AST based on the tokens return NULL; // Placeholder }
Obviously, it's leaving building the entire AST up to me. So I asked it:
> Now implement the complete parser.
The result was long, so I won't paste it here, but it contained all kinds of comments:
// Skipping parameter parsing for simplicity // parameters would go here // Simple implementation: only supports return statements for now // Simple expression parsing: only literals for now // Add more parsing functions as needed...
So I said:
> Seriously, I want you to implement the entire thing, not an outline or a framework.
And it gave be a code with fewer, but more complete parsing functions. The expression function still had this comment.
// Assume we're only parsing integers and binary +,- operations for simplicity
And then at the bottom:
// Assume the rest of the necessary parsing functions are implemented similarly
OK, here's one. I was initially talking with it about how to best simulate restrictions from older consoles in an indie game. We chatted a bit how to most efficiently do paletted drawing on modern graphics architectures in various APIs (e.g. Vulkan, SDL). I got to asking it how exactly the SNES stored data in VRAM, and asked it to list all the PPU registers in the SNES and what they're used for. It gave me a correct answer (I double-checked). I then asked this:
> Can you write a header for a C++ file named PPU.hpp with methods to read and write these registers?
And it responded with this. Note that the response includes a couple "add more as needed" comments.
Here's a basic outline for PPU.hpp:
#ifndef PPU_HPP #define PPU_HPP
#include <cstdint>
class PPU { public: // Constructor and Destructor PPU(); ~PPU();
// Methods to read and write PPU registers
uint8_t readRegister(uint16_t address);
void writeRegister(uint16_t address, uint8_t value);
// Specific methods for different PPU functionalities
void setMode(uint8_t mode);
void setBGTileSize(uint8_t bg, bool size16x16);
void setBGCharacterBaseAddress(uint8_t bg, uint16_t address);
void setBGScreenBaseAddress(uint8_t bg, uint16_t address);
void setMosaicSize(uint8_t size);
void setBGScroll(uint8_t bg, uint16_t horizontalOffset, uint16_t verticalOffset);
// Add more methods as needed...
private:
// Memory-mapped PPU registers
// Assuming a representation of the PPU register space
uint8_t ppuRegisters[/* size of the PPU register space */]; // Helper methods to manipulate specific bits/flags in the registers
// Example: void setBit(uint16_t address, uint8_t bit, bool value);
// Example: bool getBit(uint16_t address, uint8_t bit);
// Add more helper methods as needed...
};#endif // PPU_HPP
By far, the most common problem is that I will ask ChatGPT 4 to write a small problem that does X, and it will create a skeleton. Lots of functions that implement at most some paramater validation and then contain comments like // Implement the rest of this function.
With enough prodding, I can sometimes get it to actually fill in the function implementations one-by-one. But often times it will implement part of it and then put another one of those "implement the rest" comments in. Like for example, if I asked it to write a function to draw three circles, after prodding, it would write code to draw the first circle and then stop. Obviously, the answer here is for it to create a function that draws 1 circle and call it 3 times, but I can't fault it for taking my instructions very literally.
Even when I do get it to implement full functions, when I later ask it for the full code listing, it's back to printing out functions that have "implement this" comments in them.
Perhaps the fault is mine for asking it to do tasks that there aren't hundreds of implementations of on the internet.
Contraception was widely illegal in the USA starting in the 1870s into the 1930s. but even then, some states continued to prohibit the use of contraception. It wasn't until 1965 that the Supreme Court ruled that the government ruled that states could not prevent married couples from using contraception, as was the case in Connecticut at the time. It wasn't until 1972 that the Supreme Court did the same for unmarried couples.
That's only one year before Roe vs. Wade legalized abortion nationwide.
The people who remember what it was like before these things were legal are aging, but they often warn that the overturn of abortion access is a slippery slope. The goals of many political movements opposed to abortion don't stop there. Many would also like to ban contraception.
In that sense, "reproductive rights" are synonymous with abortion because that's what's still contentious. After enough time has passed for illegal abortion to become the norm, that's when the slope can start slipping towards contraceptives. Reproductive rights supporters know this, and are fighting not just for abortion, but for many other rights as well.
And that includes the right to have children. In modern days, that's most commonly seen in the fight for IVF, but it also includes the right against forced sterilization.
"Reproductive rights" is a movement that doesn't say "we want to kill babies", but rather that "the government has no business whatsoever in individual reproductive decisions or health." It's not just about abortion.
To outside observers, I was a fairly spoiled kid. I didn't have any jobs in high school, and I had a light load of chores. It's not that my parents were particularly wealthy, but I pushed back hard and was generally difficult with them, for the sake of preserving my study time, my free time, and getting a good night's sleep.
But it paid off. I got a scholarship, and went to a state university. Classes started a few days after I turned eighteen. I went out and got a part-time job immediately to pay for living expenses. I worked hard and did my job well, graduated, and landed a job that paid better than my parents.
From the get-go, I was a serious worker who put everything I had into the job while I was on the clock. I'm still that way today, and I find that people are either like that or they aren't. I find there's no correlation between the people who had jobs as teens and how serious, responsible, and industrious they are.
And I never said Russia's economy is doing terribly. It did grow. Some fear that it's being propped up by war manufacturing, or is otherwise in a pattern that it can't hold indefinitely, but I don't have enough insight into it. My point was actually to assume that Russia will continue to be able to produce weapons and ammo for the duration of the war, but it could still lose a war of of attrition when it becomes too costly in human lives to continue.
And yes, Putin might nuke Ukraine. The Russians were floating a plan of detonating a single nuke to "shock" Western Europe into fearful inaction. I don't think that will work. If anything, it will only further anti-Russian sentiment and possibly lead to war.
Yes, the West has set and ignored red lines with Russia in the past, to their own detriment. But this will different. If Russia detonates a nuke after failing a military operation that they themselves started, it will show they're not good stewards of a nuclear arsenal. Essentially, they would have proven to the world that they can hold it nuclear hostage to their whims. To not reply in force would throw the MAD doctrine into doubt.
Many lessons came out of the first two world wars about how modern warfare would be fought. One of them was that it didn't matter how many well-rested soldiers you had willing to fight. If you ran out of ammunition and your opponents have enough left to annihilate you, you'll probably lose.
We'll never know for certain, but there's a real possibility that if it hadn't been for the Lend-Lease program, the USSR would have run out of weapons and supplies, and Hitler would have defeated the Soviets.
Obviously, there's limits. One soldier sitting on warehouses of ammo isn't going to take out a force of ten thousand. But at the outset of the war, active Russian troops outnumbered Ukrainian troops by only 4 to 1. In the right circumstances, those are winnable numbers. And even better for the Ukrainians, Russia couldn't send all of their troops in. They needed to keep the bulk of them in Russia for defense.
Estimates of causalities in the war range from 1:3 to 1:5 in favor of Ukraine. So even if Russian troops outnumbered Ukrainian troops 2:1, all Ukraine has to do is continue killing Russian soldiers at the same rate, and eventually Russia will run out of soldiers to send.
That's what "winning" looks like for Ukraine. This is a war of attrition. They win by exhausting the enemy before the enemy exhausts them.
But it relies on Ukraine continuing to have enough ammo to kill the Russian soldiers at that rate. This is a war of attrition. Russia's firmly on a wartime economy, and unless the bottom falls out on them, they'll continue to produce weapons and ammo for the duration of the war. Enough for every solider they field? Maybe, maybe not, but they won't run out.
Ukraine, on the other hand, relies on the West for weapons and ammo. If it runs out, it loses, and that's why so many people are upset about Western countries dropping support. It's a winnable war for Ukraine, but only if Russia's enemies stay committed.