CRTs do not have pixels. At all. The shapes you might see on the screen if you look really closely at it are solely different bands of color phosphors. CRTs are capable of drawing arbitrary beam shapes on them in one color[0]; but you need regularly spaced filters and phosphor patterns in order to get multiple colors. If these """pixels""" were bigger, you'd see a perfectly normal red part of the image, next to a perfectly normal green part of the image, next to a perfectly normal blue part of the image.
What a CRT actually draws, though, are lines. Analog television is a machine that chops up a 2D plane into a stack of lines, which are captured, broadcasted, and drawn to the screen with varying intensity. Digital television - and, for that matter, any sort of computer display - absolutely does need that line to be divided into timesteps, which become our pixels. But when that gets displayed back on a CRT, the "pixels" stop mattering.
In the domain of analog television, the only property of the video that's actually structural to the signal are the vertical and horizontal blanking frequencies - how many frames and lines are sent per second. The display's shape is implicit[1], you just have to send 480 lines, and then those lines get stretched to fit the width[2] of the screen. A digital signal being converted to analog can be anything horizontally. A 400x480 and a 720x480 picture will both be 4:3 when you display it on a 4:3 CRT.
Pixel aspect ratio (PAR) is how the digital world accounts for the gap between pixels and lines. The more pixels you send per line, the thinner the pixels get. If you send exactly as many horizontal pixels as the line count times the display's aspect ratio, you get square pixels. For a 4:[3] monitor, that's 640 pixels, or 640x480. Note that that's neither the DVD nor the SD cable standard - so both had non-square pixels.
Note that there is a limit to how many dots you can send. But this is a maximum - a limitation of the quality of the analog electronics and the amount of bandwidth available to the system. DVD and SD cable are different sizes from each other, but they both will display just fine even on an incredibly low-TVL[4] blurry mess of a 60s CRT.
[0] There were some specialty tubes that could do "penetrative color", i.e. increasing the amplitude of the electron gun beyond a certain voltage value would change to a different color. This did not catch on.
[1] As well as how many lines get discarded during vertical blanking, how big the overscan is, etc.
[2] Nothing physical would stop you from making a CRT that scans the other way, but AFAIK no such thing exists. Even arcade cabinets with portrait (tate) monitors were still scanning by the long side of the display.
[3] There's a standard for analog video transmission from 16:9 security cameras that have 1:1 pixel aspect ratio - i.e. more pixels per line. It's called 960H, because it sends... 960 horizontal pixels per line.
[4] Television lines - i.e. how many horizontal lines can the CRT display correctly? Yes, this terminology is VERY CONFUSING and I don't like it. Also, it's measured differently from horizontal pixels.
Yes I know all of that, but I think it still doesn't answer my question.
I know you are arguing semantics and I hoped people would see past the "pixels aren't pixels" debate and focus on what I was actually asking, which is how physical dot/pixel/phosphor/mask/whatever patterns have anything to do with frame sizes of a digital video format, and I still assert that they don't, inherently... short of some other explanation I am not aware of.
All I was trying to say was that I thought OP was conflating physical "pixel" geometry with aspect ratios. Perhaps my question was too simple and people were taking it to mean more than I did, or thought I was misunderstanding something else.
> which is how physical dot/pixel/phosphor/mask/whatever patterns have anything to do with frame sizes of a digital video format,
In that context, the answer is: They don't really have any relationship at all.
Plenty of TVs of the past (from any continent) also had no physical dots/pixels/patterns at all. These were monochrome, aka black and white. :)
They had an inflexible number of lines that could be displayed per field, but there was no inherent delineation within each line as to what a pixel meant. It was just a very analog electron beam that energized a consistently-coated phosphorescent screen with a continuously-variable intensity as it scanned across for each raster line.
Pixels didn't really happen until digital sources also happened. A video game system (like an Atari or NES, say) definitely seeks to deliver pixels at its video output, and so does a digital format like DVD.
But the TV doesn't know the difference. It doesn't know that it's displaying something that represents pixels instead of a closed-circuit feed from a completely-analog pixel-free tube-based camera.
The "non-square pixel" part is just a practical description: When we have a digital framebuffer (as we do with a DVD player), that framebuffer has defined horizontal and vertical boundaries -- and a grid of pixels within those boundaries -- because that's just how digital things be.
When we smoosh the pixels of a DVD player's 720x480 framebuffer into an analog display with an aspect ratio of 4x3, we wind up with a combined system, with pixels, and those pixels aren't square.
---
And that's perfectly OK, though it does lead to weirdness.
For example: To produce a display of a perfect square that is 100 lines high using a 4x3 NTSC DVD is actually impossible. It'd have to be 100 pixels high and 112.5 pixels wide, which we can't accomplish since the format doesn't have that kind of precision. It's impossible with an LCD, and it's impossible with an analog set from 1955 just the same.
It's a DVD limitation, not a display limit. There's no great trick to producing a perfect square with analog gear, where pixels aren't a thing -- but we can't get there with the DVD's non-square pixels.
That weirdness doesn't have anything at all to do with how the display is constructed, though: Again, the TV has no concept of what a pixel even is (and a shadow mask doesn't necessarily exist at all).
Banning lobbying would be effectively a ban on all political speech. Because that's what lobbying is: political speech. For example, yesterday I sent a bunch of letters to my elected politicians talking about the Rio Grande Plan[0]. That makes me a Rio Grande Plan lobbyist. Louis Rossmann spent several years traveling across-country to speak about right-to-repair[1] laws. That makes him a right-to-repair lobbyist.
What we actually are angry about is the presence of money in politics. American political campaigns burn money like nothing else, which is akin to being in a government meeting where everyone is shouting over one another, like to the point where people are bringing in loudspeakers and megaphones. If that example were a real situation, it would be entirely legal to go and have police officers take away the megaphones, and tell people to quiet down and take their turn.
But because money is involved, SCOTUS says that, no, shouting over everyone else with a big pile of cash is TOTALLY protected speech. Any money at all that is to effect political speech is inherently protected. And so we have campaign seasons that burn billions of dollars, and people who are basically not listened to, because all the anti-bribery law that was supposed to stop the election fundraising arms race got thrown out over a decade ago.
[0] A citizen-led plan to reactivate Salt Lake City's historic train station and reroute our regional rail service over to it.
[1] Laws that would make it easier to purchase repair parts for broken electronics and prohibit the use of digital locks to prevent the repair of said electronics.
Taking that as true, that doesn't address the actual problem. The US tax code has so many loopholes and specific rules that only ever apply to a handful of people that we might as well be talking about two different sets of laws.
Even calling them "the 1%" is not particularly helpful, because 1% of America is still, like, three and a half million people. These are small business owners and the like; the kinds of people who are well off but still actually doing real productive work. Like, of course they pay the most taxes.
Once you start getting into the 1% of the 1% - "the 0.01%" - then you can afford to hire an accountant who can engineer you a favorable tax situation. And so your tax share starts falling.
But at the level of the 1% of the 0.01% - "the 0.0001%" - you can get custom-designed tax loopholes to favor you and you alone. Because at this level, you're talking about around 348 Americans, all with astronomically high wealth, paying almost no taxes. At this level, the amount of material wealth doesn't even matter; it's all bound up in hypotheticals and illiquid assets. Some of them might be CEOs, or interlocking directors, or politicians. But their real value is all in social capital - their connectedness to other 0.0001%ers who collectively own the economy and can move mountains in their favor.
These statements are meaningless without considering who is being targeted by these rules. For context, Germany has a long-standing constitutional ban on Nazis. This isn't anything new; what is new is that one party (the AfD) is trying to find ways around the ban.
If you're arguing that the AfD aren't Nazis, I'm not sure I agree. They're already privately talking about deporting German citizens.
If you are arguing that banning a political party[0] is inherently wrong... sure. I'll agree with you, with one caveat. How do you meaningfully stop people from doing that? Just saying "Well, that would be illegal, so just disobey the illegal order" is not good enough. That's what you do for otherwise normal politicians that fuck up drafting the law[1]. But the people who are doing this shit are malicious. They need to be removed from power or they will just keep trying until they get their way. And that effectively means banning the political party trying to ban everyone else. Only a stand user can beat another stand user. Hence, the constitutional ban on Nazis.
[0] I should not have to explain to people that the Nazis banned other political parties.
[1] see also, the US 1st Amendment, which prohibits laws that restrict speech without specifying any meaningful punishment for politicians that attempt to restrict speech.
>They're already privately talking about deporting German citizens.
That's not specifically a Nazi policy.
In fact, remigration is an increasingly popular political idea in various Western countries that don't have any specific Nazi past (US, the UK, Australia, etc.)
(Remigration is also frequently done by non-Western countries as well.)
> They're already privately talking about deporting German citizens.
So is immigration policy supposed to be irreversible? One side can grant citizenship willy nilly, but undoing their actions is Nazism and illegal? Would not granting those citizenships in the first place also have been Nazism? The bar for branding someone a Nazi is low, and ~80% or more of the allied forces that fought in WWII would be Nazis under today's definition:
Citizenship has to be irreversible, or very close to it, for one simple reason: revoking citizenship is equivalent to stripping someone of their constitutionally-protected rights. Even if you have a well-defined and protected concept of free speech in the law, if the administration or government can just identify and deport people saying things they don't like, then their free speech is meaningless. Punishment and reprisal is an adequate substitute for silencing. You don't have freedoms anymore, you have franchise, a thing that can be taken away at the whim of the state[0].
Reversing a change to visa policy or not granting citizenship to migrants in the future is a different question. But it's far less problematic to not grant citizenship or visas than it is to revoke them after the fact.
As for "granting citizenship willy nilly", that wasn't done by "one side". The law is such that the choice of whether or not to admit an asylum seeker is a purely legalistic one with no political control afforded. The only thing Merkel (for better and for worse) did was smile and wave at the migrants you don't like. She had no power to stop them either. The reason why the law works this way is, again, because of WWII and Nazis. People fleeing Hitler were stopped by immigration policies at every turn. So we got every country to sign a bunch of international agreements that basically say "we will not attempt to stop people fleeing despotic regimes from entering our country".
Now, I get the feeling you want to shit on this policy, and I actually do think there's a valid critique of it. Specifically, only admitting immigrants during a time of crisis is almost guaranteed to generate resentment, both from the native-born and immigrant populations. You see, while Germany pledged to hand out passports like candy to asylum seekers, the rest of German immigration policy is rigidly inflexible and their society even more so[1].
The AfD getting banned under Germany's anti-Nazi policy is not at all unprecedented. Actually, they've had to use that same policy against the immigrants they're admitting. There's biker gangs run by Turkish immigrants that are illegal in Germany because they're too far-right. The case of Turkish immigrants to Germany is particularly illuminating. Turks in Germany have a higher rate of support for Erdogan than they do in Turkiye. Germany has managed to create a society that reliably turns poor immigrants into far-right stooges.
Do you want to know what country turns Turkish immigrants away from Islamist dictators? America.
Trump regime notwithstanding[2], the USA immigration system is unusually flexible and permissive for a rich country, and it has very generous family reunification visa programs. The family visas are, effectively, outsourcing the decision of what immigrants to admit to citizens that know the people they're sponsoring. It's an invite system. And since we've been doing this consistently for 50 years, we have immigrant communities from basically every country on the planet. So there's a very smooth gradient to integration. The "marginal cost" of an additional immigrant is basically zero. We imported the third world, but the third world became us.
> The bar for branding someone a Nazi is low, and ~80% or more of the allied forces that fought in WWII would be Nazis under today's definition:
This isn't related to the merits of the German constitutional ban on Nazis at all, but since I just spent a paragraph glazing modern American immigration policy, I feel obligated to completely dynamite America's moral foundations. I mean, even the family visas weren't intended to do what they're doing. Actually, they were created specifically to give white immigrants a fast lane through the system! The prior policy was basically "white immigrants only" and this was meant to appease people who opposed deracializing the immigration system.
To be frank, America's the country Hitler got all his worst ideas from. WWII happened right after the nadir of American race relations. The """liberal""" business establishment was planning assassinations and coups against the President. Hell, we were not that far off from joining the Axis. FDR had to bait Japan into attacking us to get the American people on board with fighting WWII. And even then he couldn't resist throwing shittons of Japanese immigrants into concentration camps in a blatant land grab.
There's a funny (in the "two nickels" sense) quirk of American history in that America will absolutely tolerate and engage in morally detestable bullshit until a war or other crisis makes it undeniably wrong. Lincoln ran on an abolitionist platform, but the actual moral opinion didn't change against slavery until Union soldiers were marching on plantations and actually seeing the horrors of slavery with their own eyes. Likewise, while we were nominally fighting an evil tyrant, that didn't hit home for a lot of soldiers until they were literally marching on Auschwitz and smelling dead bodies.
[0] The root word of "franchise" is "French", as in, the process of making one into a Frenchman. The linguistic association between France and temporary / revocable permission is because that's how freedom worked there at one point. Probably under a king named Louis.
[1] This is the same country where an announced rail detour becomes a passenger kidnapping because the driver couldn't be arsed to clear the extra stops up the chain.
[2] Part of the reason why the Trump regime is so polarizing in America is because European-style immigration enforcement is so alien to us.
>Citizenship has to be irreversible, or very close to it,
Australia at least states that expulsion is compatible with human rights.
"The Bill is compatible with human rights because, to the extent that it may limit some human rights, those limitations are reasonable, necessary and proportionate in achieving the legitimate objective of protecting the Australian community."
Australian Citizenship Amendment (Citizenship Repudiation) Bill 2023
Attachment A Statement of Compatibility with Human Rights
> The law is such that the choice of whether or not to admit an asylum seeker is a purely legalistic one with no political control afforded.
Right, and laws are not the result of politics, but are handed to us by God on stone tablets.
Your framing is also misleading - admitting refugees [0], and granting them citizenship, are very different. Relaxing citizenship requirements to a mere 5 years of residing in Germany (or just 3 with German language proficiency) is also very much political, as was the admission of 3 million explicitly economic migrant Turks.
We're asked to believe immigration and immigration policy is something that just happens, like the tides, in response to economic and geopolitical events, and politics can do nothing about it. Meanwhile Iran has deported 1.3 million Afghans, and plans to deport 2 million more [2]. So they are "afforded political control". As is China, which, despite being a growing economy and with significantly below-replacement fertility, has a population of just 0.1% immigrants [3].
[0] I wouldn't even call them that, since they passed through many safe countries before even reaching the EU, let alone Germany.
If I am running a business in the US and I want to set up shop in Canada or France, I have to register a second business in that country and have my US headquarters own it. What I want is for ownership of the foreign subsidiary to directly mirror the primary company's, and the most efficient way to do it is to just have the US company own the foreign one.
If companies can't own companies, then instead I have to directly transfer ownership over the subsidiary to the shareholders of the primary company. That means they can sell their shares of the foreign subsidiary independently of the headquarters, and the two companies' ownership will diverge over time. I am effectively forced to IPO the foreign subsidiary at the moment of their creation.
You can't assign ownership to the current CEO or board members, because that creates a conflict of interest. They'd be able to take a US company they manage and turn it into a foreign subsidiary they own.
This would also make joint ventures, mergers, and acquisitions far more difficult and complicated, if not impossible.
This is Germany we're talking about, right? Something like half the population already speaks English to some degree and that is specifically concentrated in the part of the country that is already highly educated and would be working with those immigrants.
Rust only supports & and &mut references. This was a deliberate choice early in the development of the language.
&own, &pin, and &uninit are proposals for additional pointer types. They don't actually exist in the type system right now, but other parts of the compiler do have to care about them. Another blog post that floated around here about a month ago called these "inconceivable types"[0]; adding them to the type system would allow formally extending these behaviors across function boundaries.
Like, right now, implementers of Drop can't actually move anything out of the value that's about to be destroyed. The Drop trait gets a &mut, but what we really want is to say "destroy this value over there". Rust's type system cannot understand that you own the value but not the place it lives in. What you need is an "owned reference" - i.e. &own, where the borrow checker knows that you can safely move out of it because it's going to get destroyed anyway.
Rust also can't support constructors, for the same reason. What we really have are factory functions: you call them, they return a value, you put it somewhere. This is good enough that Rust users just treat factory functions as if they were constructors, but we can't do "placement new" type construction with them, or partial initialization. At least not in a way the type system can actually check.
&pin is a first-class version of Pin<T>. Rust was originally designed under the assumption that any type can be memcpy'd at any time; but it turns out not being able to move types is actually super useful. Fortunately, it also turned out you could use smart pointers to pin types, which was 'good enough' for what it was being used for - async code.
Actually, the blog post that coined "inconceivable types" was specifically talking about writing async functions without async. It turns out Future impls encode a lot of details Rust's type system can't handle - notably, self-borrows. If a value is borrowed across an await, what's the type of the variable that got borrowed from? It's really a negative type: borrowing T to get &T also turns T into !'a T that you can't access until 'a ends. Each borrowed reference is paired to a debt that needs to be paid back, and to do that you need lifetime variables and syntax to explicitly say "pay back this debt by ending this borrow's lifetime".
How much of this complexity is actually needed is another question. There's a problem that each and every one of these reference types (or, anti-types) is intended to solve. Obviously if we added all of them, we'd overcomplicate the type system. But at the same time, the current Rust type system is already known to be oversimplified, to the point where we had to hack in pinning for async. And it's already kind of ridiculous to say "Well, async is all special compiler magic" because it prevents even reasonable-sounding tweaks to the system[1].
[1] For example, async does not currently have a way to represent "ambient context" - i.e. things we want the function to be able to access but NOT hold onto across yields. That would require a new Future trait with a different poll method signature, which the current Rust compiler doesn't know how to fill or desugar to. So you have to use the core Future trait and signature which doesn't support this kind of context borrow.
I was wondering if this was even legal[0], so I went to the repo and noticed that their licensing[1] seems to be... a mess?
It says you can use "compiled versions" under the MIT License. Then it says you can use the source code under AGPL 3.0. And then it additionally says that they won't enforce the AGPL 3.0 copyleft if you haven't modified the source and don't link the Mattermost Platform directly. This is at best a bunch of tautologies that render the Affero clause moot and at worst enable a really stupid workaround to copyleft.
First off, the Affero clause - number 13 - in the AGPL only applies if you modify the source. There is no legal requirement to convey source code on a network server otherwise. So this is downgrading the license to GPL with extra steps.
Second, "linking directly" isn't legally meaningful with regards to the GPL. GPL cares about whether or not your derivative work forms a single "program" - which is deliberately left ambiguous, but almost certainly does not refer to the concept of an address space alone, or even a Go import. I guess what they wanted was to treat the Mattermost Admin and Configuration files under terms that are sort of LGPL-like? But that portion of the binary is already dual-licensed Apache 2.0. So there's no reason to argue
Third, and more importantly... the compiled versions license basically renders the source code requirement of the GPL family null and void. Like, in a normal use of the GPL, if you distribute binaries you're required to offer source. But here, they've weakened that clause.
The most speculative argument I have is that one could disassemble a compiled Go binary to obtain a "compiled version" under MIT terms that is no longer subject to any copyleft whatsoever. This is obviously contrary to the intent of the license, so I'm not sure if a judge would bother listening to this argument, but it's still really bad drafting. I suspect this license document was written by a business strategy guy, not a lawyer.
[0] If this code actually expressed their license requirements, then posting this Git diff is a violation of DMCA 1201, and you'd be liable for jail time. Er, well, except GPL version 3 (only) has a specific anti-1201 clause. But who knows if that's even applicable given the five different licenses at play?
The majority of 16"+ machines are being made specifically as portable desktops. The target audience is college kids. If you live in a dorm that you have to move in and out of yearly, it is leagues easier to travel with a bulky laptop than even a small form factor desktop machine, because of all the peripherals needed to run it.
reply