10 interesting stories served every morning and every evening.
EFF last summer asked a federal judge to block the federal government from using Medicaid data to identify and deport immigrants.
We also warned about the danger of the Trump administration consolidating all of the government’s information into a single searchable, AI-driven interface with help from Palantir, a company that has a shaky-at-best record on privacy and human rights.
Now we have the first evidence that our concerns have become reality.
“Palantir is working on a tool for Immigration and Customs Enforcement (ICE) that populates a map with potential deportation targets, brings up a dossier on each person, and provides a “confidence score” on the person’s current address,” 404 Media reports today. “ICE is using it to find locations where lots of people it might detain could be based.”
The tool — dubbed Enhanced Leads Identification & Targeting for Enforcement (ELITE) — receives peoples’ addresses from the Department of Health and Human Services (which includes Medicaid) and other sources, 404 Media reports based on court testimony in Oregon by law enforcement agents, among other sources.
This revelation comes as ICE — which has gone on a surveillance technology shopping spree — floods Minneapolis with agents, violently running roughshod over the civil rights of immigrants and U. S. citizens alike; President Trump has threatened to use the Insurrection Act of 1807 to deploy military troops against protestors there. Other localities are preparing for the possibility of similar surges.
Different government agencies necessarily collect information to provide essential services or collect taxes, but the danger comes when the government begins pooling that data and using it for reasons unrelated to the purpose it was collected.
This kind of consolidation of government records provides enormous government power that can be abused. Different government agencies necessarily collect information to provide essential services or collect taxes, but the danger comes when the government begins pooling that data and using it for reasons unrelated to the purpose it was collected.
As EFF Executive Director Cindy Cohn wrote in a Mercury News op-ed last August, “While couched in the benign language of eliminating government ‘data silos,’ this plan runs roughshod over your privacy and security. It’s a throwback to the rightly mocked ‘Total Information Awareness’ plans of the early 2000s that were, at least publicly, stopped after massive outcry from the public and from key members of Congress. It’s time to cry out again.”
In addition to the amicus brief we co-authored challenging ICE’s grab for Medicaid data, EFF has successfully sued over DOGE agents grabbing personal data from the U. S. Office of Personnel Management, filed an amicus brief in a suit challenging ICE’s grab for taxpayer data, and sued the departments of State and Homeland Security to halt a mass surveillance program to monitor constitutionally protected speech by noncitizens lawfully present in the U.S.
But litigation isn’t enough. People need to keep raising concerns via public discourse and Congress should act immediately to put brakes on this runaway train that threatens to crush the privacy and security of each and every person in America.
...
Read the original on www.eff.org »
Play Video: Deutsche Telekom is throttling the internet. Let’s do something about it!
Play Video: Deutsche Telekom is throttling the internet. Let’s do something about it!
Epicenter.works, the Society for Civil Rights, the Federation of German Consumer Organizations, and Stanford Professor Barbara van Schewick are filing an official complaint with the Federal Network Agency against Deutsche Telekom’s unfair business practices.
Deutsche Telekom is creating artificial bottlenecks at access points to its network. Financially strong services that pay Telekom get through quickly and work perfectly. Services that cannot afford this are slowed down and often load slowly or not at all.
This means Telekom decides which services we can use without issues, violating net neutrality. We are filing a complaint with the Federal Network Agency to stop this unfair practice together!
...
Read the original on netzbremse.de »
A macOS app that blurs your screen when you slouch.
Posturr uses your Mac’s camera and Apple’s Vision framework to monitor your posture in real-time. When it detects that you’re slouching, it progressively blurs your screen to remind you to sit up straight. Maintain good posture, and the blur clears instantly.
* Real-time posture detection - Uses Apple’s Vision framework for body pose and face tracking
* Menu bar controls - Easy access to settings, calibration, and status from the menu bar
* Privacy-focused - All processing happens locally on your Mac
* No account required - No signup, no cloud, no tracking
brew tap tldev/tap
brew install –cask posturr
Download the latest Posturr-vX. X.X.dmg or .zip from the Releases page
Open the DMG and drag Posturr.app to your Applications folder
Launch normally - no Gatekeeper warnings (app is signed and notarized)
Posturr requires camera access to monitor your posture. When you first launch the app, macOS will ask for permission. Click “OK” to grant access.
If you accidentally denied permission, you can grant it later:
Once launched, Posturr appears in your menu bar with a person icon. The app continuously monitors your posture and applies screen blur when slouching is detected.
* Recalibrate - Reset your baseline posture (sit up straight, then click)
* Sensitivity - Adjust how sensitive the slouch detection is (Low, Medium, High, Very High)
* Dead Zone - Set the tolerance before blur kicks in (None, Small, Medium, Large)
* Compatibility Mode - Use public macOS APIs for blur (try this if blur doesn’t appear)
* Quit - Exit the application (or press Escape anywhere)
* Position your camera at eye level when possible
* Sit at a consistent distance from your screen
* The app works best when your shoulders are visible
Posture Analysis: Measures the vertical distance between nose and shoulders
The screen blur uses macOS’s private CoreGraphics API by default for efficient, system-level blur. If the blur doesn’t appear on your system, enable Compatibility Mode from the menu to use NSVisualEffectView instead.
git clone https://github.com/yourusername/posturr.git
cd posturr
./build.sh
The built app will be in build/Posturr.app.
# Standard build
./build.sh
# Build with release archive (.zip)
./build.sh –release
swiftc -O \
-framework AppKit \
-framework AVFoundation \
-framework Vision \
-framework CoreImage \
-o Posturr \
main.swift
* Detection accuracy: Works best with clear view of upper body/face
Write commands to /tmp/posturr-command. Responses appear in /tmp/posturr-response.
Posturr processes all video data locally on your Mac. No images or data are ever sent to external servers. The camera feed is used solely for posture detection and is never stored or transmitted.
Contributions are welcome! Please feel free to submit issues and pull requests.
* Uses private CoreGraphics API for blur, with NSVisualEffectView fallback
* Inspired by the need for better posture during long coding sessions
...
Read the original on github.com »
Until recently, I resisted using the F-word to describe President Trump. For one thing, there were too many elements of classical fascism that didn’t seem to fit. For another, the term has been overused to the point of meaninglessness, especially by left-leaning types who call you a fascist if you oppose abortion or affirmative action. For yet another, the term is hazily defined, even by its adherents. From the beginning, fascism has been an incoherent doctrine, and even today scholars can’t agree on its definition. Italy’s original version differed from Germany’s, which differed from Spain’s, which differed from Japan’s.
I accepted President Biden’s characterization of the MAGA movement as “semi-fascist” because some parallels were glaringly apparent. Trump was definitely an authoritarian, and unquestionably a patrimonialist. Beyond that, though, the best description seemed to be a psychological one propounded by John Bolton, Trump’s first-term national security adviser: “He listens to Putin, he listens to Xi, he listens to how they talk about governing unburdened by uncooperative legislatures, unconcerned with what the judiciary may do, and he thinks to himself, Why can’t I do that? This doesn’t amount to being a fascist, in my view, [or] having a theory of how you want to govern. It’s just Why can’t I have the same fun they have?”
Writing a year ago, I argued that Trump’s governing regime is a version of patrimonialism, in which the state is treated as the personal property and family business of the leader. That is still true. But, as I also noted then, patrimonialism is a style of governing, not a formal ideology or system. It can be layered atop all kinds of organizational structures, including not just national governments but also urban political machines such as Tammany Hall, criminal gangs such as the Mafia, and even religious cults. Because its only firm principle is personal loyalty to the boss, it has no specific agenda. Fascism, in contrast, is ideological, aggressive, and, at least in its early stages, revolutionary. It seeks to dominate politics, to crush resistance, and to rewrite the social contract.
Over Trump’s past year, what originally looked like an effort to make the government his personal plaything has drifted distinctly toward doctrinal and operational fascism. Trump’s appetite for lebensraum, his claim of unlimited power, his support for the global far right, his politicization of the justice system, his deployment of performative brutality, his ostentatious violation of rights, his creation of a national paramilitary police—all of those developments bespeak something more purposeful and sinister than run-of-the-mill greed or gangsterism.
When the facts change, I change my mind. Recent events have brought Trump’s governing style into sharper focus. Fascist best describes it, and reluctance to use the term has now become perverse. That is not because of any one or two things he and his administration have done but because of the totality. Fascism is not a territory with clearly marked boundaries but a constellation of characteristics. When you view the stars together, the constellation plainly appears.
Demolition of norms. From the beginning of his first presidential run in 2015, Trump deliberately crashed through every boundary of civility; he mocked Senator John McCain’s war heroism, mocked fellow candidate Carly Fiorina’s face, seemingly mocked the Fox News host Megyn Kelly’s menstruation, slurred immigrants, and much more. Today he still does it, recently making an obscene gesture to a factory worker and calling a journalist “piggy.” This is a feature of the fascist governing style, not a bug. Fascists know that what the American Founders called the “republican virtues” impede their political agenda, and so they gleefully trash liberal pieties such as reason and reasonableness, civility and civic spirit, toleration and forbearance. By mocking decency and saying the unsayable, they open the way for what William Galston has called the “dark passions” of fear, resentment, and especially domination—the kind of politics that shifts the public discourse to ground on which liberals cannot compete.
Glorification of violence. Every state uses violence to enforce its laws, but liberal states use it reluctantly, whereas fascism embraces and flaunts it. Trump thus praises a violent mob; endorses torture; muses fondly about punching, body-slamming, and shooting protesters and journalists; and reportedly suggests shooting protesters and migrants. His recruitment ads for ICE glamorize military-style raids of homes and neighborhoods; his propaganda takes childish delight in the killing of civilians; and we have all seen videos of agents dragging people out of cars and homes—partly because the government films them. Like the demolition of civic decency, the valorization of violence is not incidental to fascism; it is part and parcel.
Might is right. Also characteristic of fascism is what George Orwell called “bully-worship”: the principle that, as Thucydides famously put it, “the strong do what they can and the weak suffer what they must.” This view came across in Trump’s notorious Oval Office meeting with Ukrainian President Volodymyr Zelensky, in which Trump showed open contempt for what he regarded as Ukraine’s weakness; it came across explicitly, and chillingly, when Stephen Miller, the president’s most powerful aide, told CNN’s Jack Tapper: “We live in a world, in the real world, that is governed by strength, that is governed by force, that is governed by power. These are the iron laws of the world that have existed since the beginning of time.” Those words, though alien to the traditions of American and Christian morality, could have come from the lips of any fascist dictator.
Politicized law enforcement. Liberals follow the law whether they like it or not; fascists, only when they like it. Nazism featured a “dual state,” where, at any moment, the protections of ordinary law could cease to apply. Trump makes no secret of despising due process of law; he has demanded countless times that his opponents be jailed (“Lock her up!” chants, with his endorsement, were a prominent feature of his 2016 campaign), and he has suggested the Constitution’s “termination” and said “I don’t know” when asked if he is required to uphold it. His single most dangerous second-term innovation is the repurposing of federal law enforcement to persecute his enemies (and shield his friends). No prior president has produced anything like Trump’s direct and public order for the Justice Department to investigate two former officials, or like his blatantly retaliatory prosecutions of James Comey and Letitia James. “At least 470 people, organizations and institutions have been targeted for retribution since Trump took office—an average of more than one a day,” Reuters reported in November (and today one can add others to the list, beginning with Federal Reserve Chair Jerome Powell). Had Trump done nothing else, his demolition of independent and apolitical law enforcement would still have moved the U. S. government closer than ever before to a fascistic model.
Dehumanization. Fascism draws its legitimacy from its claims of defending the people from enemies who are animals, criminals, brutes. Trump characterizes (for instance) political opponents as “vermin” and immigrants as “garbage” who are “poisoning the blood of our country” (language straight out of the Third Reich). Vice President Vance, as a senator, endorsed a book called Unhumans (a title that refers to the left). And who can forget his false claim that Haitians abduct and eat pet cats and dogs?
Police-state tactics. Trump has turned ICE into a sprawling paramilitary that roves the country at will, searches and detains noncitizens and citizens without warrants, uses force ostentatiously, operates behind masks, receives skimpy training, lies about its activities, and has been told that it enjoys “absolute immunity.” He more than doubled the agency’s size in 2025, and its budget is now larger than those of all other federal law-enforcement agencies combined, and larger than the entire military budgets of all but 15 countries. “This is going to affect every community, every city,” the Cato Institute scholar David Bier recently observed. “Really almost everyone in our country is going to come in contact with this, one way or the other.” In Minneapolis and elsewhere, the agency has behaved provocatively, sometimes brutally, and arguably illegally—behaviors that Trump and his staff have encouraged, shielded, and sent camera crews to publicize, perhaps in the hope of eliciting violent resistance that would justify further crackdowns, a standard fascist stratagem. Homeland Security Secretary Kristi Noem’s recent appearance with a sign reading One of ours, all of yours seemed to nod toward another fascist standby, collective punishment—as did the administration’s decision to flood Minneapolis with thousands of officers after residents there began protesting federal tactics, a prioritization that was explicitly retributive.
Undermining elections. Trump’s recent musing that there should be no 2026 election may or may not have been jocular (as the White House has maintained), but he and his MAGA supporters believe they never lose an election, period. They went to great lengths to overturn the 2020 election, as the prosecutor Jack Smith’s indictment of Trump and subsequent report detail ad nauseam. Rigging, stealing, or outright canceling elections is, of course, job one for fascists. Although Trump is term-limited, we must not expect that he and his MAGA loyalists will voluntarily turn over the White House to a Democrat in 2029, regardless of what the voters say—and the second insurrection will be far better organized than the first.
What’s private is public. Classical fascism rejects the fundamental liberal distinction between the government and the private sector, per Mussolini’s dictum: “No individuals or groups outside the State.” Among Trump’s most audacious (if only intermittently successful) initiatives are his efforts to commandeer private entities, including law firms, universities, and corporations. One of his first acts as president last year was to brazenly defy a newly enacted law by taking the ownership of TikTok into his own hands. Bolton understood this mentality when he said, “He can’t tell the difference between his own personal interest and the national interest, if he even understands what the national interest is.”
Attacks on news media. Shortly after taking office in 2017, Trump denounced the news media as “the enemy of the American people,” a phrase familiar from dictatorships abroad. His hostility never relented, but in his second term, it has reached new heights. Trump has threatened broadcast licenses, abused his regulatory authority, manipulated ownership deals, filed exorbitant lawsuits, played favorites with journalistic access, searched a reporter’s home, and vilified news outlets and journalists. Although Trump cannot dominate news media in the United States in the way that Prime Minister Viktor Orbán has done in Hungary, he is running the Orbán playbook. No other president, not even Richard Nixon (no friend of the media), has used such blatantly illiberal tactics against the press.
Territorial and military aggression. One reason I held out against identifying Trumpism with fascism in his first term was Trump’s apparent lack of interest in aggression against other states; if anything, he had seemed shy about using force abroad. Well, that was then. In his second term, he has used military force promiscuously. Of course, many presidents have deployed force, but Trump’s explicitly predatory use of it to grab Venezuela’s oil and his gangster-style threat to take Greenland from Denmark “the easy way” or “the hard way” were 1930s-style authoritarian moves. The same goes for his contempt for international law, binding alliances, and transnational organizations such as the European Union—all of which impede the state’s unconstrained exercise of its will, a central fascist tenet. (Mussolini: “Equally foreign to the spirit of Fascism … are all internationalistic or League superstructures which, as history shows, crumble to the ground whenever the heart of nations is deeply stirred by sentimental, idealistic or practical considerations.”)
Transnational reach. Like authoritarians generally, fascists love company; the world is safer for them if there are more of them. In his second term, Trump has broken with long-standing U. S. policy by dialing back support for human rights while praising and supporting authoritarian populists and illiberal nationalists in Serbia, Poland, Hungary, Germany, Turkey, El Salvador, and Slovakia, among other places—and by being weirdly deferential to the strongman Russian President Vladimir Putin. Even more striking is his de facto alignment against America’s liberal allies and their parties in Europe, which he holds in contempt.
Blood-and-soil nationalism. A fascist trademark is its insistence that the country is not just a collection of individuals but a people, a Volk: a mystically defined and ethnically pure group bound together by shared blood, culture, and destiny. In keeping with that idea, Trump has repudiated birthright citizenship, and Vance has called to “redefine the meaning of American citizenship in the 21st century” so that priority goes to Americans with longer historical ties: “the people whose ancestors fought in the Civil War,” as he put it, or people whom others on the MAGA right call “heritage Americans.” In other words, some Americans are more volkish than others.
White and Christian nationalism. While Vance, Trump, and MAGA do not propound an explicit ideology of racial hierarchy, they make no secret of pining for a whiter, more Christian America. Trump has found many ways to communicate this: for example, by making clear his disdain for “shithole” countries and his preference for white Christian immigrants; by pointedly accepting white South Africans as political refugees (while closing the door to most other asylum seekers); by renaming military bases to share the names of Confederate generals (after Congress ordered their names removed); by saying that civil-rights laws led to whites’ being “very badly treated.” In his National Security Strategy, he castigates Europe for allowing immigration to undermine “civilizational self-confidence” and proclaims, “We want Europe to remain European,” a rallying cry of white Christian nationalists across the continent. Taking his cue, the Department of Homeland Security has propagated unashamedly white-nationalist themes, and national parks and museums have scrubbed their exhibits of references to slavery.
Mobs and street thugs. The use of militias and mobs to harass, rough up, and otherwise intimidate opponents is a standard fascist stratagem (the textbook example being Hitler’s Kristallnacht pogrom in 1938). As few will need reminding, the Trump-MAGA parallel is the mob and militia violence against the U. S. Capitol on January 6, 2021. Trump knowingly laid groundwork for this operation, calling on militia forces to “stand back and stand by” in September 2020 and later dog-whistling “Be there, will be wild!” to his supporters. His pardon of all of the Capitol attackers—more than 1,500, including the most violent—only proved what we knew, which is that they had his blessing. While Trump has found state violence adequate to his purposes so far in his second term, street violence is self-evidently in his repertoire.
Leader aggrandizement. Since 2016, when he declared that “I alone can fix it” and bragged that his supporters would remain loyal if he shot someone on Fifth Avenue, Trump has cultivated a personality cult. Although some of his efforts at self-aggrandizement can seem comical (the gilding of the Oval Office, the renaming of the Kennedy Center, the proposed triumphal arch), he understands the centrality of leader worship in a fascist-style regime. In sharp contradistinction to the American presidential tradition since George Washington, he makes no pretense of serving the people or the Constitution. His mindset, his symbolism, and his rhetoric all underscore the point he made to The New York Times this month: his own mind and morality are the only limits on his global power. This is Fascism 101.
Alternative facts. As Orwell, Hannah Arendt, and practically every other scholar of authoritarianism have emphasized, creating a reality-distortion field is the first thing a fascistic government will do, the better to drive its own twisted narrative, confuse the citizenry, demoralize political opponents, and justify every manner of corruption and abuse. While other presidents (including some good ones) have lied, none have come close to Trump’s deployment of Russian-style mass disinformation, as I detail in my book The Constitution of Knowledge. From the start of his first term, Trump has made “alternative facts” a hallmark of his governing style, issuing lies, exaggerations, and half-truths at a rate of 20 a day. Predictably, his second term has brought more of the same. Following his lead, a MAGA-fied postmodern right gleefully trashes objectivity as elitism and truth as a mask for power.
Politics as war. A distinctive mark of fascism is its conception of politics, best captured by Carl Schmitt, an early-20th-century German political theorist whose doctrines legitimized Nazism. Schmitt rejected the Madisonian view of politics as a social negotiation in which different factions, interests, and ideology come to agreement, the core idea of our Constitution. Rather, he saw politics as a state of war between enemies, neither of which can understand the other and both of which feel existentially threatened—and only one of which can win. The aim of Schmittian politics is not to share the country but to dominate or destroy the other side. This conception has been evident in MAGA politics since Michael Anton (now a Trump-administration official) published his famous article arguing that the 2016 election was a life-and-death battle to save the country from the left (a “Flight 93” election: “charge the cockpit or you die”). In the speech given by Stephen Miller at Charlie Kirk’s memorial service, MAGA’s embrace of Schmittian totalism found its apotheosis: “We are the storm. And our enemies cannot comprehend our strength, our determination, our resolve, our passion … You are nothing. You are wickedness.”
Governing as revolution. Although born in revolution, the American liberal tradition, especially its conservative branch, prizes continuity, stability, and incremental change guided by reason. Fascism, by contrast, “is not reactionary but revolutionary,” as Mussolini insisted. It seeks to uproot and replace the old order and embraces bold, exhilarating action unshackled to rational deliberation. MAGA embraces its own revolutionary ethos, what Russell Vought, the administration’s Office of Management and Budget director and probably its most formidable intellect, has called “radical constitutionalism,” a doctrine that would vitiate many checks on presidential power. In pursuit of this vision, Vought told Tucker Carlson in a November 2024 interview, “The president has to move executively as fast and as aggressively as possible, with a radical constitutional perspective, to be able to dismantle that [federal] bureaucracy and their power centers” because “the bureaucracies hate the American people.” He predicted, “If you have a radical constitutionalism, it’s going to be destabilizing … But it’s also exhilarating.” He said he would put federal agencies “in trauma,” an idea echoed by Christopher Rufo, an architect of Trump’s attack on universities, which Rufo described as a “counterrevolution blueprint” to put universities “in an existential terror.” As Trump shuttered a congressionally mandated agency, renamed an international body of water, arrested an op-ed writer, deported immigrants to a foreign gulag, terrorized American cities, threatened an ally, and more, he showed how it looks when a radicalized state abandons rational deliberation and goes to war against itself.
One can object that there are elements of classical European fascism that are not found in Trumpism (mass rallies and public rituals, for example)—or that there are additional elements of Trumpism that belong on the list (MAGA’s hypermasculinity, misogyny, and co-option of Christianity all resemble fascist patterns). The exercise of comparing fascism’s various forms is not precise. If historians object that Trump is not a copy of Mussolini or Hitler or Franco, the reply is yes—but so what? Trump is building something new on old principles. He is showing us in real time what 21st-century American fascism looks like.
If, however, Trump is a fascist president, that does not mean that America is a fascist country. The courts, the states, and the media remain independent of him, and his efforts to browbeat them will likely fail. He may lose his grip on Congress in November. He has not succeeded in molding public opinion, except against himself. He has outrun the mandate of his voters, his coalition is fracturing, and he has neglected tools that allow presidents to make enduring change. He and his party may defy the Constitution, but they cannot rewrite it, thank goodness.
Read: How to tell if your president is a dictator
So the United States, once the world’s exemplary liberal democracy, is now a hybrid state combining a fascist leader and a liberal Constitution; but no, it has not fallen to fascism. And it will not.
In which case, is there any point in calling Trump a fascist, even if true? Doesn’t that alienate his voters? Wouldn’t it be better just to describe his actions without labeling him controversially?
Until recently, I thought so. No longer. The resemblances are too many and too strong to deny. Americans who support liberal democracy need to recognize what we’re dealing with in order to cope with it, and to recognize something, one must name it. Trump has revealed himself, and we must name what we see.
...
Read the original on www.theatlantic.com »
...
Read the original on consumerrights.wiki »
It’s almost your turn, get ready!
* Use WASD to move around and the arrow keys to look left and right.
* Space to shoot, Shift to sprint. E to interact with doors/objects.
* Number keys for selecting weapons. Escape/Enter for menu use.
* Press Tab to show the map. If you die, press E to respawn, noob.
So… what exactly is this?
You know the 1993 classic DOOM? I made it run on an earbud, then I connected it to the internet and made it possible for visitors like you to sit in a queue for hours play the game remotely!.
Yeah but it won’t just run on any old earbud, this only works with the Pinebuds Pro, the only earbuds with open source firmware.
Can I look at the code or run this on my own Pinebuds?
You sure can! There are two relevant repos:
* DOOMBuds for the DOOM port that will run on your earbud
* DOOMBUDS-JS to interact with the earbud through your browser
Wait, why am I looking at a twitch stream?
This was a necessary optimisation to avoid paying outgoing bandwidth fees, once you’re 5th in the queue, the twitch player will switch to a low-latency MJPEG stream.
wow this front end code is atrocious, state management is everywhe-
shhhh don’t look don’t look it’s ok just join the queue
Give us more info, how did you get this to work?
Let’s switch to a more readable font first.
I’ll put out an article / video diving deeper into this later, but here are a few bits of info:
This project is made up of four parts:
The DOOM port that runs on the earbuds
The ‘serial server’ that acts as a bridge between the earbuds and the web server and also transcodes the MJPEG stream to twitch
The web server that serves assets, manages the queue, forwards keypresses and displays the MJPEG stream
The static webpage that tells your browser what to display on the screen and how to communicate with the web server
The firmware pushes up against a few hardware limitations:
Serial Connection
Earbuds don’t have displays, so the only way to transfer data to/from them is either via bluetooth, or the UART contact pads.
Bluetooth is pretty slow, you’d be lucky to get a consistent 1mbps connection, UART is easily the better option.
DOOM’s framebuffer is (width * height) bytes, 320 * 200 = 96kB. (doom’s internal framebuffer is 8-bit not 24-bit)
The UART connection provides us with 2.4mbps of usable bandwidth. 2,400,000 / 8 / 96,000 gives us… 3 frames per second.
Clearly we need to compress the video stream. Modern video codecs like h264 consume way too much CPU and RAM.
The only feasible approach is sending the video as an MJPEG stream. MJPEG is a stream of JPEG images shown one after the other.
I found an excellent JPEG encoder for embedded devices here, thanks Larry!
A conservative estimate for the average HIGH quality JPEG frame is around 13.5KB, but most scenes (without enemies) are around 11kb.
Theoretical maximum FPS:
- Optimistic: `2,400,000 / (11,000 * 8)` = 27.3 FPS
- Conservative: `2,400,000 / (13,500 * 8)` = 22.2 FPS
CPU
The stock open source firmware has the CPU set to 100mhz, so I cranked that up to 300mhz and disabled low power mode.
The Cortex-M4F running at 300mhz is actually more than enough for DOOM, however it struggles with JPEG encoding.
This is why it maxes out at ~18fps, I don’t think there’s much else I can do to speed it up.
RAM
By default, we only have access to 768KB of RAM, after disabling the co-processor it gets bumped up to the advertised 992KB.
DOOM requires 4MB of RAM, though there are plenty of optimisations that can reduce this amount.
Pre-generating lookup tables, making variables const, reading const variables from flash, disabling DOOM’s caching system, removing unneeded variables. It all adds up!
FLASH
The shareware DOOM 1 wad (assets file) is 4.2MB and the earbuds can only store 4MB of data.
Thankfully, fragglet, a well-known doom modder, has already solved this issue for me.
Squashware is his trimmed-down DOOM 1 wad that is only 1.7MB in size.
With this wad file, everything comfortably fits in flash.
I thought you’d never ask! (please hire me)
...
Read the original on doombuds.com »
This text is for developers that have an intuitive knowledge of what database indexes are, but don’t necessarily know how they work internaly, what are the tradeoffs associated with indexes, what are the types of indexes provided by postgres and how you can use some of its more advanced options to make them more optimized for your use case.
Indexes are special database objects primarily designed to increase the speed of data access, by allowing the database to read less data from the disk. They can also be used to enforce constraints like primary keys, unique keys and exclusion. Indexes are important for performance but do not speedup a query unless the query matches the columns and data types in the index. Also, as a very rough rule of thumb, an index will only help if less than 15-20% of the table will be returned in the query, otherwise the query planner, a part of postgres used to determine how the query is going to be executed, might prefer a sequential scan. In fact, reality is much more complex than this rule of thumb. The query planner uses statistics and predefined costs associated with each type of scan to do its job, but we’re only going approach the query planner behavior tangentially in this article. So, if your query returns a large percentage of the table, consider refactoring it, using summary tables or other techniques before throwing an index at the problem. With that in mind, let’s give a closer look at how Postgres stores your data in the disk and how indexes help to speedup querying this data.
There are six types of indexes available in the default postgres installation and more types available through extensions. Typically, they work by associating a key value with a data location in one or more rows of the table containing that key. Each line is identified by a TID, or tuple id.
To understand indexes, it is important to first understand how postgres stores table data on disk. Every table in postgres has one or more corresponding files on disk, depending on its size. This set of files is called a heap and it is divided into 8kb pagesh. All table rows, internally referred to as “tuples”, are saved in these files and do not have a specific order. The index is a tree structure that links the indexes columns to the row locators, also known as ctid, in the heap. We’ll zoom into the index internals later.
To see the heap files we can use a few postgres internal tables to see where they’re located in the disk. First, we can enter psql and use show data_directory to show the directory Postgres uses to store databases physical files.
Now we can use the internal pg_class to find the file where the heap table is stored:
Finally, we can check the file on disk by running this command in the shell (ls $PGDATA/base/
The file has size 0 because we haven’t done any INSERTs in this table yet.
Let’s add a couple of rows to our table:
We can add the ctid field to the query to retrieve the ctid of each line. The ctid is an internal field that has the address of the line in the heap. Think of it as a pointer to the row location in the heap. It consists of a tuple in the format (m, n) where m is the block id and n is the tuple offset. “ctid” stands for “current tuple id”. Here you can note that the row with id one is stored in the page 0, offset 1.
Let’s add more players to the table so that the total rows is one million:
After adding more rows to the table its corresponding file is 30MB. Internally, it is divided into 8kb pages.
When we query a table without an index, Postgres reads all tuples in every page and apply a filter. For example, let’s analyze the command below that searches for rows whose name column value is equal to “Ronaldo” and show how the database performed this search. We use the explain command with the options (analyse, buffers). analyse will actually execute the query instead of just using cost estimates, and the buffers option shows how much IO work was done.
Note the in output the line starting with ” -> Parallel Seq scan on foo”. This line denotes that the database performed a sequential search and read all the rows in the table. The execution time for this query was 265.021ms. Also note the line that says “Buffers: shared hit=97 read=6272”. This mean that we needed to read 97 pages from memory, and 6272 pages from disk.
Now let’s add an index on the name column and see how the same query performs. We’re using the command create index concurrently because we don’t want to block the table for writes.
Here we see that the index was used and that in this case the execution time was reduced from 264.21 to 0.074 milliseconds, and the database only needed to read 4 pages! The reduction in execution time happens because, now, instead of reading all the rows in the table, the database uses the index. The index is a tree structure mapping the value “Ronaldo” to the ctid(s) of the rows that have this value in the name column (in our example we only have one such row). The ctid is then used to quickly locate these rows on the heap.
If we use \di+ to show the indexes in our database we can see that the index we’ve created occupies 30MB, roughly the same size as the foo table.
It is important to highlight that the extra speed brought by indices is associated with several costs that must be considered when deciding where and how to apply them.
Indexes are stored in a separate area of the heap and take up additional disk space. The more indexes a table has, the greater the amount of disk space required to store them. This incurs in additional storage costs for your database and for backups, increased replication traffic, and increased backup and failover recovery times. Bear in mind that its not uncommon for btree indexes to be larger than the table itself. Learning about partial indexes, and multicolumn indexes, as well as about other more space efficient index types such as BRIN can be helpful.
Also, there is a maintenance cost in writing operations such as UPDATE, INSERT and DELETE, if a field that is part of an index is modified, the corresponding index needs to be updated, which can add significant overhead to the writing process.
The query planner (also known as query optimizer) is the component responsible for determining the best execution strategy for a query. With more indexes available, the query planner has more options to consider, which can increase the time needed to plan the query, especially in systems with many complex queries or where there are many indexes available.
PostgreSQL maintains a portion of frequently accessed data and index pages in memory in its shared buffers. When an index is used, the relevant index pages are loaded into shared buffers to speed up access. The more indexes you have and the more they are used, the more shared buffer memory is necessary. Since shared buffers are limited and are also used for caching data pages, filling the shared buffers with indexes can lead to less efficient caching of table data. It’s also good to keep in mind that the whole indexed column is copied in every node of the btree, since there’s a limit in node size capacity, the larger the indexed column the deeper the tree will be.
Another aspect of memory usage is that PostgreSQL uses work memory when it executes queries that involves sorting or complex index scans (involving multi-column or covering indexes). Larger indexes require more memory for these operations. Also, indexes require memory to store some metadata about their structure, column names and statistics in the system catalog cache. And finally indexes require memory for maintainance operations like vacuuming and reindexing operations.
The B-Tree is a very powerful data structure, present not only in Postgres but in almost every database management system, since it is a very good general purpose index. It was invented by Rudolf Bayer and Edward M. McCreight while working at Boeing. Nobody really knows if the “B” in B-tree stands for Bayer, Boeing, balanced or better, and it doesn’t really matter. What really matters is that it enables us to search elements in the tree in O(log n) time. If you’re not familiar with Big-O notation, all you need to know is that is is really fast - you only need to make 20 comparisons in order to find an element in a set with 1 million items. Moreover, it can maintain O(log n) time complexity for data sets that are larger than the RAM available on a computer. This means that disks can be used to extend RAM, thanks to the btree efficient prevention of disk page accesses to find the desired data. In PostgreSQL the btree is the most common type of index and its the default, it’s also used to support system and TOAST indexes. Even an empty database has hundreds of btree indexes. It is the only index type that can be used for primary and unique key constraints.
In contrast with a binary tree, the BTree is a balanced tree and all of its leave nodes have the same distance from the root. The root nodes and inner nodes have pointers to lower levels, and the leaf nodes have the keys and pointers to the heap. Postgres btrees also have pointers to the left and right nodes for easier forward and backward scanning. Nodes can have multiple keys and these keys are sorted so that it’s easy to walk in ordered directions and to perform ORDER BY and JOIN operations. The values are only stored in the leaf nodes, this makes the tree more compact and facilitates a full traversal of the objects in a tree with just a linear pass through all the leaf nodes. This is just a simplified description of PostgreSQL Btree indexes, if you want to get into the low level details, I suggest you to read the README and the paper that inspired them. Below there’s a simplified illustration of a Postgres Btree.
Postgres can use multiple indexes to handle cases that cannot be handled by single index scans, by forming AND and OR conditions across several index scans with the support of bitmaps. The bitmaps are ANDed or ORed together as needed by the query and finally the table rows are visited and returned. Let’s say we have a query like this:
If the age and login_count columns are indexed, postgres scans index age for all pages with age=30 and makes a bitmap where the pages that might contain rows with age=30 are true. In a similar way, it builds a bitmap using the login_count index. It then ANDs the two bitmaps to form a third bitmap, and performs a table scan, only reading the pages that might contain candidate values, and only adding the rows where age=30 and login_count=100 to the result set.
Multi-column indexes are an alternative for using multiple indexes. They’re generaly going to be smaller and faster than using multiple indexes, but they’ll also be less flexible. That’s because the order of the columns matter, because the database can search for a subset of the indexed columns, as long as they are the leftmost columns. For example, if you have an index on column a and another index on column b, these indexes will serve all the of queries below:
On the other hand, only the first two queries would use an index if you created a multi-column index on (a, b) with a command like create index on my_table(a, b); So, when building multi-column indexes choose the order of the columns well so that your index can be used by the most queries possible.
Partial indexes allow you to use a conditional expression to control what subset of rows will be indexed, this can bring you many benefits:
* your index can be smaller and more likely fit in RAM.
* your index is shallower, so lookups are quicker
* less overhead for index/update/delete (but can also mean more overhead if the column you’re using to filter rows in/out of the index is updated very frequently triggering constant index maintenance)
They’re mostly useful in situations where you don’t care about some rows, or when you’re indexing on a column where the proportion of one value is much greater than others. I’ll give two examples below.
Let’s say you have a rules table where the rows can be marked as enabled/disabled, the vast majority of the rows are disabled and in your queries you only care about enabled rows. In this case, you would have a partial index, filtering out the disable rows like this:
Now imagine you’re building a todo application and the status column value can be either TODO, DOING, and DONE. Suppose you have 1M rows and this is the current distribution of rows in each status:
Since postgres keeps statistics about the distribution of values in your table columns and knows that the vast majority of the rows are in the TODO status, it would choose to do a sequential scan on the tasks table when you have status=‘TODO’ in the WHERE clause of your query, even if you have an index on status, leaving most part of the index unused and wasting space. In this case, a partial scan such as the one below is recommended:
If you have a query that selects only columns in an index, Postgres has all information needed by the query in the index and doesn’t need to fetch pages from the heap to return the result. This optimization is called index-only scan. To understand how it works, consider the following scenario:
In the first query, postgres can do an index-only scan and avoid fetching data from the heap because the values a and b are present in the index. In the second query, since c isn’t in the index, posgres needs to follow the reference to the heap to fetch its value. In the first query we allowed postgres do to an index-only scan with the help of a multi-column index, but we could also achieve the same result by using a covering index. The syntax for creating a covering index looks like this:
This is more space efficient than creating a multi-column index on (a, b, c), because c will only be inserted at the leaf nodes of the btree. Also, we might want to use a covering index in cases where we want an unique index and c would “break” the uniqueness of the index.
Expression indexes to index the result of an expression or function, rather than just the raw column values. This can be extremely useful when you frequently query based on a transformed version of your data. It is necessary if you use a function as part of a where clause as in the example below:
In this example above, Postgres won’t use the index because it was was built against the name column. In order to make it work, the index key has to call the lower function just like it’s used in the where clase. To fix it, do:
Now, when you run a query like this:
Now PostgreSQL can use the expression index to efficiently find the matching rows.
Expression indexes can be created using various types of expressions:
User-defined functions: As long as they are immutable.
The hash index differs from B-Tree in strucutre, it is much more alike a hashmap data structure present in most programming languages (e.g. dict in Python, array in php, HashMap in java, etc). Instead of adding the full column value to the index, a 32bit hash code is derived from it and added to the hash. This makes hash indexes much smaller than btrees when indexing longer data such as UUIDs, URLs, etc. Any data type can be indexed with the help of postgres hashing functions. If you type \df hash* and press TAB in psql, you’ll see that there are more then 50 hash related functions. Although it gracefully handles hash conflicts, it works better for even distribution of hash values and is most suited to unique or mostly unique data. Under the correct conditions it will not only be smaller than btree indexes, but also it will be faster for reads when compared with btress. Here’s what the official docs says about it:
“In a B-tree index, searches must descend through the tree until the leaf page is found. In tables with millions of rows, this descent can increase access time to data. The equivalent of a leaf page in a hash index is referred to as a bucket page. In contrast, a hash index allows accessing the bucket pages directly, thereby potentially reducing index access time in larger tables. This reduction in “logical I/O” becomes even more pronounced on indexes/data larger than shared_buffers/RAM.”
As for its limitations, it only supports equality operations and isn’t going to be helpful if you need to order by the indexed field. It also doesn’t support multi-column indexes and checking for uniqueness. For a in-depth analysis of how hash indexes fare in relation to btree, check Evgeniy Demin’s blog post on the subject.
BRIN stands for Block Range Index and its name tells a lot about how it is implemented. Nodes in BRIN indexes store the minimum and maximum values of a range of values present in the page referred by the index. This makes the index more compact and cache friendly, but restricts the use cases for it. If you have a very large in a work load that is heavy on writes and low on deletes and updates. You can think of a BRIN index as an optimizer for sequential scans of large amounts of data in very large databases, and is a good optimization to try before partitioning a table. For a BRIN index to work well, the index key should be a column that strongly correlates to the location of the row in the heap. Some good use cases for BRIN are append-only tables and tables storing time series data.
BRIN won’t work well for tables where the rows are updated constantly, due to the nature of MVCC that duplicates rows and stores them in a different part of the heap. This tuple duplication and moving affect the correlation negatively and reduces the effectiveness of the index. Using extensions such as pg_repack or pg_squeeze isn’t recommended for tables that use BRIN indexes, since they change the internal data layour fo the table and mess up the correlation. Also, this index is lossy in the sense that the index leaf nodes point to pages taht might contain a value within a particular range. For this reason a BRIN is more helpful if you need to return large subset of data, and a btree would be more read performant for queries that only return one or few rows. You can make the index more or less lossy by adjusting the page_per_range configuration, the trade off will be index size.
Generalized inverted index is appropriate for when you want to search for an item in composite data, such as finding a word in a blob of text, an item in an array or an object in a JSON. The GIN is generalized in the sense that it doesn’t need to know how it will acelerate the search for some item. Instead, there’s a set of custom strategies specific for each data type. Please note that in order to index an JSON value it needs to be stored in a JSONB column. Similarly, if you’re indexing text it’s better to store it as (or convert it to) tsvector or use the pg_trgm extension.
The Generalized Search Tree and the Space-Partitioned Generalized Search Tree are tree structures that can be use as a base template to implement indexes for specific data types. You can think of them as framework for building indexes. The GiST is a balanced tree and the SP-GiST allow for the development of non-balanced data structures. They are useful for indexing points and geometric types, inet, ranges and text vectors. You can find an extensive list of the built-in strategies shipped with postgres in the official documentation. If you need an index to enable full-text search in your application, you’ll have to choose between GIN and GiST. Roughly speaking, GIN is faster for lookups but it’s bigger and has greater building and maintainance costs. So the right index type for you will depend on your application requirements.
Understanding and effectively using indexes is crucial for optimizing database performance in PostgreSQL. While indexes can greatly speed up query execution and improve overall efficiency, it’s important to be mindful of their impact on write operations and storage. By carefully selecting the appropriate types of indexes based on your specific use cases you can ensure that your PostgreSQL database remains both fast and efficient. I hope this article taught you at least one or two things you didn’t know about Postgres indexes, and that you’re better equiped to deal with different scenarios involving databases from now on.
...
Read the original on dlt.github.io »
The Trump White House yesterday posted a manipulated photo of Nekima Levy Armstrong, a Minnesota civil rights attorney who was arrested after protesting in a church where a pastor is allegedly also an Immigration and Customs Enforcement (ICE) official.
Secretary of Homeland Security Kristi Noem posted what seems to be the original photo of Armstrong being led away by an officer yesterday morning. A half hour later, the official White House X account posted an altered version in which Armstrong’s face was manipulated to make it appear that she was crying.
“The White House shared an AI-edited photo of Nekima, depicting her in tears and scared when, in actuality, she was poised, determined, and unafraid,” NAACP President and CEO Derrick Johnson said yesterday.
Reader-added context on X said, “This photo has been digitally altered to make Nekima Levy Armstrong appear to be in distress. The Director of DHS herself posted the unedited photo in an earlier announcement.” White House Deputy Communications Director Kaelan Dorr defended the post after criticism of the image manipulation.
“Enforcement of the law will continue. The memes will continue. Thank you for your attention to this matter,” Dorr wrote. The White House post with the manipulated image called Levy Armstrong a “far-left agitator” who “orchestrated[ed] church riots in Minnesota.”
A DHS press release about the arrest used the same image posted by Noem, without the alteration.
Jordan Kushner, an attorney for Levy Armstrong, said, “It is just so outrageous that the White House would make up stories about someone to try and discredit them. She was completely calm and composed and rational. There was no one crying. So this is just outrageous defamation.”
Speaking to The Associated Press, Kushner also said that the “video Levy Armstrong’s husband shot ‘dismantles what they claim’ and that the video would be released soon.”
...
Read the original on arstechnica.com »
As many as 30,000 people could have been killed in the streets of Iran on Jan. 8 and 9 alone, two senior officials of the country’s Ministry of Health told TIME—indicating a dramatic surge in the death toll. So many people were slaughtered by Iranian security services on that Thursday and Friday, it overwhelmed the state’s capacity to dispose of the dead. Stocks of body bags were exhausted, the officials said, and eighteen-wheel semi-trailers replaced ambulances.
The government’s internal count of the dead, not previously revealed, far surpasses the toll of 3,117 announced on Jan. 21 by regime hardliners who report directly to Iran’s Supreme Leader Ali Khamenei. (Ministries report to the elected President.) The 30,000 figure is also far beyond tallies being compiled by activists methodically assigning names to the dead. As of Saturday, the U. S.-based Human Rights Activists News Agency said it had confirmed 5,459 deaths and is investigating 17,031 more.TIME has been unable to independently verify these figures.The Health Ministry’s two-day figure roughly aligns with a count gathered by physicians and first responders, and also shared with TIME. That surreptitious tally of deaths recorded by hospitals stood at 30,304 as of Friday, according to Dr. Amir Parasta, a German-Iranian eye surgeon who prepared a report of the data. Parasta said that number does not reflect protest-related deaths of people registered at military hospitals, whose bodies were taken directly to morgues, or that happened in locales the inquiry did not reach. Iran’s National Security Council has said protests took place in around 4,000 locations across the country.
“We are getting closer to reality,” Dr. Parasta said. “But I guess the real figures are still way higher.”That appears to be the reality implicit in the government’s internal figure of more than 30,000 deaths in two days. A slaughter on that scale, in the space of 48 hours, had experts on mass killing groping for comparisons.“Most spasms of killing are not from shootings,” said Les Roberts, a professor at Columbia University who specializes in the epidemiology of violent death. “In Aleppo [Syria] and in Fallujah [Iraq], when spasms of death this high have occurred over a few days, it involved mostly explosives with some shooting.”The only parallel offered by online databases occurred in the Holocaust. On the outskirts of Kyiv on Sept. 29 and 30, 1941, Nazi death squads executed 33,000 Ukrainian Jews by gunshot in a ravine known as Babyn Yar. In Iran, the killing fields extended across the country where, since Dec. 28, hundreds of thousands of citizens had assembled in the streets chanting first, for relief from an economy in freefall, and soon for the downfall of the Islamic regime. During the first week, security forces confronted some demonstrations, using mostly non-lethal force, but with officials also offering conciliatory language, the regime response was uncertain. That changed during the weekend commencing Jan. 8. Protests peaked, as opposition groups, including Reza Pahlavi, the exiled son of Iran’s former shah, urged people to join the throngs, and U.S. President Donald Trump repeated vows to protect them, though no help arrived.
Witnesses say millions were in the streets when authorities shut down the internet and all other communications with the outside world. Rooftop snipers and trucks mounted with heavy machine guns opened fire, according to eyewitnesses and cell phone footage. On Friday, Jan. 9, an official of the Islamic Revolutionary Guard Corps warned on state television to anyone venturing into the streets, “if … a bullet hits you, don’t complain.”It took days for the reality to penetrate the internet blackout. Images of the bloodied bodies trickled out via illicit Starlink satellite internet connections. The task of counting the dead was hampered, however, because the authorities had also cut off lines of communications inside Iran. The first firm information came from a Tehran doctor who told TIME that just six hospitals in the capital had recorded at least 217 protester deaths after Thursday’s assault. Health care workers in Iran estimated at least 16,500 protesters had been killed by Jan. 10, according to an earlier report by Dr. Parasta in Munich. Friday’s update built on that research, he said.
“I am genuinely impressed by how quickly this work was pulled together under extremely constrained and risky conditions,” said Paul B. Spiegel, a professor at the Johns Hopkins University International School of Health. Like Roberts, he expressed wariness of extrapolating from the figures provided by hospitals. Roberts, who traveled into war zones to research civilian death rates in Iraq and the Democratic Republic of Congo, said, “the 30,000 verified deaths are almost certainly an underestimate.”The emergence of the Ministry of Health numbers appears to confirm that—while underscoring the stakes for both Iranians and a regime that, in 1979, came to power when a sitting government was confronted by millions of people demanding its downfall. On Friday, Jan. 9, Sahba Rashtian, an aspiring animation artist, joined friends on the streets in Isfahan, a city in central Iran famous for its beauty. “Before anyone started chanting,” a friend told TIME, “Sahba was seen collapsed on the ground. Her sister noticed blood on her hand.”
Sahba died on an operating table at a nearby hospital. She was 23.
“She always joked about her beautiful name,” her friend said. “She’d laugh and say, ‘Sahba means wine, and I am forbidden in the Islamic Republic.’”
At the burial, the friend said, religious rites were barred, and Rashtian’s father wore white.
“Congratulations,” he told mourners, according to the friend. “My daughter became a martyr on the path to freedom.”
...
Read the original on time.com »
The Federal Aviation Administration has issued a nationwide security notice, effectively creating a moving drone no-fly zone around operations conducted by Immigration and Customs Enforcement (ICE) and other components of the Department of Homeland Security.
The notice, NOTAM FDC 6/4375, prohibits unmanned aircraft systems from operating within 3,000 feet laterally and 1,000 feet vertically of DHS facilities and mobile assets, including ground vehicle convoys and their escorts. The restriction applies nationwide and continuously, rather than at fixed locations or during defined time windows.
Because ICE operates under DHS and routinely conducts enforcement actions using mobile vehicle convoys in public spaces, the restriction functions as a drone no-fly zone around ICE operations, including arrests, transport activities and other field actions.
The FAA classifies the restricted airspace as “national defense airspace,” and cites its authority under federal security statutes. Drone operators who violate the restriction may face criminal prosecution, civil penalties, administrative enforcement actions, or revocation of FAA operating privileges. The notice also states that drones deemed a credible security threat may be intercepted, seized, damaged, or destroyed.
Unlike traditional Temporary Flight Restrictions, the NOTAM does not provide geographic coordinates, activation times, or public notification when the restriction is in effect near a specific location. Instead, the restricted airspace moves with DHS assets, meaning the no-fly zone can appear wherever ICE or other DHS units operate.
The new NOTAM replaces an earlier security notice, FDC 5/6378, which covered similar federal agencies but was less explicit about mobile operations. The updated version removes ambiguity by clearly stating that the restriction applies to moving DHS assets, including vehicles and convoys, and not just fixed facilities such as offices or bases.
That clarification has drawn attention from drone operators and civil liberties groups because it creates dynamic, invisible exclusion zones that may be impossible to identify in real time. The FAA does not publish public tracking of DHS or ICE movements, and the NOTAM does not include a mechanism for drone pilots to determine when covered assets are nearby.
In practical terms, a drone operator flying legally in a public area could unknowingly enter restricted airspace if an ICE convoy passes within the protected radius. The FAA instructs operators to “exercise caution” when flying near DHS facilities and mobile assets, but offers no specific guidance on how to do so in environments where enforcement activity is not publicly disclosed.
The notice mentions limited exceptions. Drone operations conducted in direct support of national defense, homeland security, law enforcement, firefighting, search and rescue, or disaster response missions may be authorized with advance coordination. Operators seeking approval are instructed to coordinate with DHS or other covered agencies, or contact the FAA’s System Operations Support Center.
The FAA cites multiple federal statutes as the legal basis for the restriction, including laws governing national defense airspace and counter-UAS mitigation.
...
Read the original on www.aerotime.aero »
To add this web app to your iOS home screen tap the share button and select "Add to the Home Screen".
10HN is also available as an iOS App
If you visit 10HN only rarely, check out the the best articles from the past week.
If you like 10HN please leave feedback and share
Visit pancik.com for more.