Shared posts

26 Jul 19:30

Americans’ class ID shifts down

by Doug Henwood
Tom Roche

pullquote:
> 49% of those aged 18–34 call themselves working class, twice the share of the over-55s. Nice to see that clarity in the young.

The USA is the country where everyone feels middle-class, right? No.

Gallup is out with the latest edition of a question it’s asked ten times over the last twenty years: “If you were asked to use one of these five names for your social class, which would you say you belong in?” When they did the survey in April, the largest set of respondents said “middle,” 38%—but that’s not much more than a third. Almost as many, 35%, said “working” (a term that has often been pronounced obsolete).

Here’s some more detail:

Gallup class

A striking thing about the chart is its upward skew. The midpoint is just 4 points into the “middle” category, and “upper-middle” is nowhere near that midpoint—it begins about 5/6 of the way to the top. Still, it’s remarkable that in a country of alleged universal middle classness, almost half the population identifies as sub-middle.

Over the last 20 years, upper-middle and middle have declined by 8 percentage points and working and lower have risen by 9. If you start the clock in 2005, the peak of the housing bubble, the “middle” share has fallen by 9 points, with most going into “working.” The Great Recession that followed the bursting of that bubble has a lot to do with that trend, but ten years of expansion following that miserable downturn did nothing to change middle-class self-identification.

Gallup class ID over time

Before one gets encouraged by these stats into thinking proletarian class-consciousness is on the rise, a caveat: more Republicans (38%) are likely to identify as working class than Democrats (30%). But to conclude on a more encouraging note: 49% of those aged 18–34 call themselves working class, twice the share of the over-55s. Nice to see that clarity in the young.

 

28 May 20:26

558 - 9/11 Era, Pt. 1: The Pussification of the Western Male (9/14/21)

Tom Roche

works!

We celebrate 20 years of 9/11 by taking a 2-part look at the political and cultural insanity of the era immediately following the attacks. Today, we look at the hysterical jingoism, veneration of idiotic leaders, politically enforced censorship, and the seminal war-blogger classic “The Pussification of the Western Male”


We’ll continue on Thursday’s ep with looks at TV, Film and Culture from the era, plus another canonical 9/11 reading series. Stay tuned!


Get bonus content on Patreon

See acast.com/privacy for privacy and opt-out information.

28 May 20:06

Bonus: Dream of Californilection feat. Josh Androsky

Tom Roche

humorous/horrific hour (actually 71 min) well-spent on California (though almost entirely LA city and county) politics. Almost entirely Josh Androsky and Will, tiny bits from Matt, no Felix

Normal! Natural! Healthy! Sane! It’s an episode on the California primaries! Friend of the show Josh Androsky stops by to give you everything you need to know to vote responsibly in the upcoming elections in California. But fear not, non-Golden State residents, this episode has laffs for you as well: bumbling Dems, insane Republicans, cop buffoonery, a cavalcade of goofy names! Plus, Josh’s argument for building local power as a possible hope for escape from our dismal political reality.


Tickets to the Rally for LA, Tues 5/31 featuring Matt Christman, Los Dug Dug’s, Bill Corbett, Adam Conover, Jamie Loftus and more: bit.ly/rallyforla

Get bonus content on Patreon

Hosted on Acast. See acast.com/privacy for more information.

28 May 16:51

Rethinking air conditioning amid climate change

by Knowable Magazine
Tom Roche

good survey of issues, more depth than usual

Rethinking air conditioning amid climate change

Enlarge (credit: Jupiter Images | Getty)

It was a monumental day for the environmental movement more than 30 years ago when all 198 countries in the world agreed on something for the first and only time ever. They signed on to the Montreal Protocol, making a pact to phase out a roster of chemicals that damage the Earth’s ozone layer. Chief among these were the chlorofluorocarbons (CFCs) and hydrochlorofluorocarbons used by the cooling and refrigeration industry. Alternatives, such as hydrofluorocarbons (HFCs), were quickly found.

But in recent years, scientists have come to realize that the Montreal Protocol of 1987 might have traded an immediate problem for a long-term one. Though HFCs don’t cause the same damage to the ozone layer as CFCs do, the chemicals have warming potentials hundreds to thousands of times higher than that of CO2—making their growing global use a cause for concern.

The 20th-century industrial revolution saw a major boom in the air-conditioning and refrigeration industry in Europe and North America. Now, as developing nations boost their economies, countries such as China, India, and Nigeria are seeing skyrocketing demand for these appliances.

Read 50 remaining paragraphs | Comments

26 May 19:59

Radio War Nerd EP 330 — World of Wars: Ethiopia, Ukraine, Yemen

by mail@yashalevine.com (Gary Brecher)
Tom Roche

worth the listen, but quite notable that Ames and Dolan still have not grasped their analytical fails on the Tigray rebellion and on the US-NATO-Russia proxy war (being fought in Ukraine)

Co-hosts Gary Brecher & Mark Ames
26 May 17:59

Russiagate trial reveals, DHS 'disinformation' board stalls, and Bernie's Ukraine proxy war cave

Tom Roche

VERY EXCELLENT--132 min, but very worth your time

In this livestream, former CIA officer and longtime antiwar activist Ray McGovern joins Aaron Mate and Max Blumenthal on new revelations of Hillary Clinton's direct involvement in Russiagate lies, the demise of DHS Minister of Truth Nina Jankowicz, how Bernie Sanders backed a giant giveaway to the arms industry in the form of Ukraine aid, and the latest on the Russian-Ukrainian war.
25 May 21:57

A Carbon Dioxide Delivery Driver’s Long Journey to Expose Airgas

by David Dayen
Tom Roche

pullquote:
> “The level of criminality from the college class, they’re taught to be predators. Lazy-ass predators, but predators nonetheless.”

Globe, Arizona, is an old mining town in Gila County, about 90 miles east of Phoenix, dotted with canyons and gorges and 33 bridges, most constructed in or before the 1960s. Last July, Cyrus Coron, a thin, bleach-blond man with orange-tinted wraparound sunglasses, was about to pilot his Airgas National Carbonation bulk gas truck onto a particularly skinny overpass, running downhill on an 8 percent grade. As he dropped in, a red light in the shape of an engine lit up on the dashboard, with one word superimposed on it: “STOP.”

When that flashed, drivers knew the truck would soon stall. The problem was a faulty engine sensor that would often trip in winding hills and valleys, forcing a restart of the truck. When Coron and his colleagues would tell the manager of their Airgas branch about the issue, he might schedule an inspection, but would almost never take the truck out of service. The branch had no backup vehicle, and between 30 and 45 deliveries of food-grade carbon dioxide had to be made throughout Arizona every day.

There was no shoulder on the downhill road, and orange cones narrowed the bridge to two lanes, with no space to pull over. After crossing the V-shaped ravine, the road immediately veered to the right and climbed up the other side of the canyon. Coron was traveling at about 55 miles per hour. He figured he needed a working engine for eight more seconds to get over the bridge, make the right turn, and pull off onto the shoulder.

8, 7, 6 —

The stall would kill the power steering; Coron wouldn’t have the physical strength to negotiate that sharp right in a heavy truck.

5, 4, 3 —

He spun the wheel as the turn approached.

2, 1 —

The truck stalled just as Coron reached the shoulder. “If it happened literally one or two seconds earlier, I would not have been able to make that right-hand turn,” he told me over Zoom. “I don’t know if I would have had the physical ability to pull the steering wheel to stay in the lane or if I would have actually entered into oncoming traffic and killed myself.”

He told the story with a flat tone; for Coron, the near-death experience was just another day exposed to risk. Heavy-duty trucking saw the second-most fatalities of any profession in 2020, the last year studied, only narrowly behind construction, a sector with 3 million more workers. With nearly two decades of experience in the industry, Coron was used to being seen as a disposable part.

“People like me, we encounter that shit on a regular basis,” he said. “We have a nihilistic sense of humor about it. And it’s not a good thing. You shouldn’t be accustomed to what is not acceptable.”

What was really not acceptable to Coron was that he and his colleagues had been complaining for months to management about that “STOP” engine light. After reaching a safe spot to wait for a tow truck, Coron fired off an email with a picture of the scene. “Using a driver’s personal safety to test out whether or not the issue has been fixed is reckless,” he wrote.

The engine wasn’t the only problem, Coron said. Years earlier, Coron’s truck failed a pre-trip brake inspection; a copy of the inspection records an “ongoing unaddressed air leak.” When he reported it, the manager instructed him to leave the truck running during deliveries to keep the air pressure in the brakes from falling. At that point, Coron refused to drive the vehicle. Drivers knew it often took that kind of escalation to get a mechanic.

The Federal Motor Carrier Safety Administration conducts 3 million truck inspections annually, and Airgas actually has a pretty good safety record by the agency’s metrics. But with hundreds of millions of truck trips, regulators see just a fraction of what’s on the road. Coron said he was only pulled over for inspection with an Airgas vehicle twice in five years.

“A clean truck does not get inspected,” he told me. “Every weekend, every fucking truck in that yard gets fucking washed and cleaned. The ones that you’ll see with the worst records are the smaller operations that don’t pay for their shit to get cleaned on a regular basis.” In other words, Airgas literally whitewashed its safety issues. To hear Coron tell it, that wasn’t the only example.

Coron has done everything he can to raise attention to the problems at the company, from the inside and outside. Through emails, pictures, recordings of conference calls with upper management, and thousands of delivery tickets, Coron has captured a portrait of serious neglect at Airgas, the largest distributor of packaged gas in the United States, with over 1 million customers.

He also sent filings to three state and federal agencies, according to submissions reviewed by The American Prospect and The Intercept: a regional office of the Food and Drug Administration, the Arizona Department of Agriculture, and the Arizona Attorney General’s Office. All of his documentation has now been posted on a website, Airgasfraud.com, as Coron goes public with what he has been trying to tell the government for years.

Based on Coron’s information, not only were Airgas National Carbonation employees in Phoenix expected to drive dangerous vehicles, but they were also delivering unknown quantities of gases to customers while being ordered to issue inaccurate delivery tickets and purity tests to cover that up. In Coron’s retelling, these practices violated federal regulations and may have led to customers paying for products they did not receive.

Coron’s allegations were corroborated by another former ANC driver, Jim Bascone. “ANC was grossly understaffed and undertrucked, almost everywhere,” Bascone said in an interview. “That was the underlying issue.”

Though Coron’s evidence focuses mostly on carbon dioxide deliveries in Phoenix, there are several indications of wider problems. In a conference call last September, Eric Page, at the time Airgas’s senior compliance officer and today the chief financial officer for Airgas Safety, told Coron, “We have had conversations at the highest levels of leadership, the highest levels, about this issue [with the truck equipment].” Two top executives, Dennis Harris and Matt Sebuck, were fired in 2020, “because they’re not watching the fundamentals of the business, and that is the repair of the trucks.” But nothing changed, Coron said.

“ANC was grossly understaffed and undertrucked, almost everywhere. That was the underlying issue.”

Airgas spokesperson Kim Menard confirmed that the company investigated some of Coron’s allegations last year and “took appropriate action in response.” Menard said Airgas operates business “in accordance with high standards of professional and ethical conduct” and encourages whistleblowers to come forward with information about improper behavior, including through a confidential hotline. After being told about the allegations in this story, Menard said some of them were new to the company and that it has initiated a new investigation to review the matter. “Any required actions to remedy issues will be promptly implemented,” Menard said.

The situation reflects the uneven power relationship between the roughly 2 million heavy and tractor-trailer truck drivers in the U.S. and the companies they work for. Truckers who need steady work feel pressure to comply, no matter the repercussions to their safety or to customers. “The driver has the right to say no,” said Thomas Corsi, a professor of logistics at the University of Maryland. “But then the driver can be fired.”

Coron claims that he was retaliated against for trying to bring issues to management’s attention, threatened with more hazardous shifts and written up for disciplinary action. Airgas said it “does not permit any form of retaliation.” For unrelated reasons, Coron’s no longer at Airgas.

The documentary evidence, which spans five years of employment, is meticulously arranged. Coron sees it as his shield. “If I don’t have a record, it’s my word against their word,” he told me. “I’m white trash. I’m not credentialed. I’m a liar until I can prove that I’m not lying.”

Stand Tanks where bulk CO2 is stored.

Stand tanks storing bulk carbon dioxide.

Photo: Pablo Robles


Coron started at Airgas in 2016, after jobs toiling in the oil fields for Halliburton in Wyoming, hauling diesel fuel to copper mines for Sinclair Oil in Utah, and managing hazardous waste disposal for Clean Harbors in Phoenix. For Airgas, he worked out of region W-6, which covered part or all of five states in the Southwest. Though his branch was in Phoenix, his manager supervised remotely from Las Vegas.

The job entailed delivering food-grade carbon dioxide. Restaurants and truck stops and breweries need CO2 for soda and beer, and it’s also used in water treatment, health care, manufacturing, and agriculture (particularly cannabis production). Deliveries were made on demand and often guaranteed to customers within 24 hours. The Phoenix branch had just three drivers and two trucks to pull that off.

Coron expected Airgas to be hyperprofessional. “I thought it would be buttoned up because it’s so damn big,” he said. Airgas was founded in 1982 and formed through over 500 mergers, as it boasts on its website. One division sells gases, another sells welding helmets and MIG guns, another sells saw blades and other construction products, and still another sells safety items like first-aid kits. In 2016, Airgas was purchased by a French conglomerate named Air Liquide, which vies with Linde for the title of the world’s largest industrial gas company. Air Liquide had 23.3 billion euros (about $24.6 billion) in revenues in 2021.

The corporation’s byzantine structure, with numerous divisions and management layers, meant that there were no standard protocols for workers, Coron said. Accounting procedures, software, maintenance rules, and compliance benchmarks were confused and inconsistent.

Coron quickly saw this play out with his CO2 deliveries. On a typical day, drivers were supposed to fill their trucks at a stand tank, which could hold up to 28,000 pounds of gas. They were to test the CO2 for purity and then drive out to service customers. At the delivery sites, they would measure totals in customer tanks through an electronic meter on the truck. They would take pictures of the meter at the beginning and end of delivery, placing those onto a digital ticket that was automatically forwarded to customers, who were charged per pound of CO2.

The problem, Coron explained, is that none of the equipment required to do this job functioned consistently — not the stand tanks, not the truck gauges or meters, and not the testing equipment.

“The meter stopped working,” Coron wrote in an email to his manager, Luis Reyes, on September 23, 2019. “The volume gauge on the truck has never worked.”

Four months later, he emailed again: “This meter is malfunctioning on a daily basis. What will it take to get the parts ordered & installed?”

Then a month later: “Meter stopped working again for the umpteenth time.”

There are dozens of emails like this in Coron’s files: notices from Coron and his Phoenix branch colleague Bascone that the meters (which register how much gas is delivered to a customer) and volume gauges (which record how much gas is left in the truck) were faulty, uncalibrated, inaccurate, or just plain broken.

Last year, Coron took a video of a digital meter display on the truck showing 0 pounds of CO2 released, even as the hose connected from the truck to a tank is hopping, indicating gas moving through it.

The stand tank volume gauge was also broken, often reading as full regardless of the amount inside. (“The Phoenix drivers have been complaining to Luis about this for years,” Coron wrote in an August 2021 email.) One result was that the branch periodically ran out of CO2, because its supplier wouldn’t deliver to the stand tank if it read as full. The only way to find out if it was empty was to run the pump dry and burn it out; replacement pumps cost thousands of dollars.

But inaccurate counts were not limited to Phoenix. Monthly loss reports from 2019 to 2021 show discrepancies of up to 200 percent between the amounts loaded onto trucks and the amounts delivered to customers. One November 2019 report showed an overall net loss of 37.9 percent. That’s well beyond normal boil-off rates in CO2 tanks.

In a separate report in February 2021, a 52,000-pound stand tank in San Diego was listed as being short by 37,450 pounds. A truck in Renton, Washington, with a 7,500-pound capacity was short 17,061 pounds. A separate 7,000-pound truck in Oklahoma City was short 12,584 pounds. “Anything out of the main office was a mess,” Bascone said. “You had someone wearing six hats in charge of inventory.”

In demanding an explanation for these discrepancies, Reyes did not blame the broken equipment. “I understand truck meters need to be calibrated and Stand Tank gauges aren’t correct but I believe some amounts entered … are way off (Driver Error?),” he wrote in an August 2020 email.

“That’s literally corporate America all in one fucking short sentence,” Coron told me. “Broken meter, broken gauge, nothing on the truck works — it’s your fault.”

The roots of the problem were illuminated in an August 2020 message sent to Airgas National Carbonation branches from Hubert Booth, a fleet and compliance manager. “I have received several requests for meters today,” Booth wrote. “New meters are $6,000 to $8,000 depending on how much of the system you replace and the labor.”

Instead of incurring that expense, Booth said, Airgas would repair broken parts — although he noted that some of the meters were so old that the parts “have been discontinued.” Even if the refurbished meters were fixed, they wouldn’t stay fixed; for example, the repaired turbines would “stick” instead of turning as gas is released.

“You would send them back the old meter, they would send back another one more beat up,” Bascone explained. “We got one meter in [that] hadn’t been calibrated in 11 years.”

Attached to Booth’s email were manuals directing drivers how to troubleshoot and fix the meters themselves. But truckers aren’t certified mechanics, and expecting them to fix equipment didn’t work. In reply to Coron’s September 2019 email about the broken meter, Bascone, whose acerbic humor comes through, suggested: “maybe bang it with the orange hammer.” When Reyes directed instead to check the wiring connections, Bascone deadpanned, “I think the hammer is the better way to go.”

With no way to accurately gauge how much CO2 was being dispensed, the Phoenix branch had two options: take the trucks off the road until the meters were fixed or continue to deliver gas while guessing at the amounts. Which decision was made can be seen in over 2,800 delivery tickets from 2017 to 2021, which Coron kept.

All of them are missing the before-and-after meter pictures that confirm how much CO2 was delivered and therefore the amount owed. Some tickets show the meter reading at 0 pounds before delivery and a picture of a logbook after. Some have blank squares where the pictures should be. Coron and Bascone claim that this was a widespread practice and that Airgas would have “tens of thousands” more of these tickets from Phoenix deliveries.

According to them, drivers would make up numbers for the “total quantity delivered” line on the tickets, hypothesizing from past performance. If the meter was running 30 percent off, they would add 30 pounds per 100 to the order. Bascone once joked, “I hold the route sheets up to my forehead and come up with a number.” Reyes told drivers to use the volume gauges on the customer tanks, but they were often busted too.

The mismeasurement meant that thousands of customers were not necessarily getting what they were charged for. It’s impossible to know whether they were being overcharged or undercharged; that depends on how accurate the drivers’ guesses were. Bascone believed that his figures were reasonably accurate. But one ticket, from February 2020, may be instructive. It shows that Airgas delivered 8,022 pounds of CO2 to Alsco, a large laundry services company in Phoenix. That’s impossible: The trucks only carried 7,000 pounds.

impossible-ticket

An “impossible ticket.”

Obtained by The Intercept


Airgas prices of CO2 were not consistent and depended on contracts struck between sales agents and customers. The gas could be less than $1 per pound or as high as $6. As a dominant supplier of industrial gas, Airgas set the market rates itself.

So an overcharge of 1,022 pounds could translate to less than $1,000 in improper payment or as much as $7,000. With tens of thousands of records over years, that could add up. In his complaint to the Arizona Attorney General’s Office, Coron estimated customer overpayments in Phoenix at above $500,000.

For the first couple of years, Coron says he received verbal instructions from his manager to estimate delivery tickets. But later on, there are specific instances of the supervisor telling him to do so in writing.

In September 2019, Coron told Reyes that he was “literally making up #’s on deliveries.” Reyes told the drivers to “estimate the amount and take a pic of the [customer] tank if possible.” In March 2020, Reyes said the same thing: “Estimate readings based on prior fills.” In a separate email, he said, “Don’t use the meter readings for now until we figure out how to correct this.” At no time did Reyes instruct drivers not to deliver until problems were fixed. Customers were not informed on delivery tickets that the totals were estimates.

Coron alleges that during a March 2020 phone call, Reyes told him to put his finger in front of the camera lens he used to take pictures of the meters. Many of the delivery tickets going back to 2017 show black or red squares: If the flash was on, the finger over the lens would read as red. “It just looks like a glitch,” Coron said. “So that nobody can be blamed for what’s happening.” Bascone confirmed that “[drivers] just covered up the lens” to finish the delivery ticket.

There’s after-the-fact evidence of this happening in an August 2021 email, in which Reyes tells drivers that the meters were fixed for the time being. “In the future, if the meter goes out, don’t cover the screen when taking a picture of the meter but take a picture of the bulk tank contents gauge before and after a fill and note on the comments that the meter isn’t working properly,” Reyes wrote. (Reyes left the company last fall and could not be reached for comment.)

It was difficult for customers to notice what was going on, Coron explained. Deliveries were often made when businesses were closed, either early in the morning or late at night. Delivery tickets were supposed to be sent electronically to an email on file, but those emails were not regularly updated, and many companies didn’t have emails listed at all, Coron claimed.

Nevertheless, some customers did occasionally complain that their CO2 tanks would run out earlier than expected after a refill. Coron told Eric Page, the Airgas senior compliance officer, on their conference call that he had heard from a couple of customers about this. Page responded unwittingly with a completely different issue, one that Coron says he never saw: “During Covid … some of the bars and restaurants on account were getting billed for the same amount, but they weren’t open, they weren’t using CO2,” Page acknowledged.

The Prospect and The Intercept attempted to contact 70 businesses across Arizona that were listed on the delivery tickets, roughly 2.5 percent of the total Coron supplied. Most of the 11 businesses that responded said they rarely, if ever, saw delivery drivers.

One customer, a Shell gas station in Phoenix, said that Airgas prices had gone up recently and that “we have had a couple of emergency deliveries because we’ve had our gas run out” faster than expected. A Chick-fil-A in Prescott Valley also experienced shortages, overbilling, and underdelivery, to the extent that it found a different CO2 supplier. A McDonald’s in Florence, a Sonic in Phoenix, and a Fuddruckers in Mesa also had CO2 run out suddenly. Another Fuddruckers in Phoenix talked about issues with overbilling and underdelivery, though both Fuddruckers employees chalked it up to internal issues at the restaurant.

An employee at Marco’s Pizza in Flagstaff said they had experienced no problems, but that there wouldn’t be much recourse if they did. Speaking of Airgas, the employee said: “They’re the only game in town.”

airgas-embed-2

A carbon dioxide delivery to a commercial building.

Photo: Cyrus Coron


Coron made other allegations related to federal regulations. For example, from 2019 to 2020, Reyes put Phoenix drivers “on call” for $21 per day, answering outage emails and calling customers to schedule deliveries. If this forced drivers to work during their mandated off-duty rest period, that would violate Department of Transportation hours-of-service rules. “You’re talking about office work, that would be a violation,” said Dale Watkins, a regulatory affairs manager with the Owner-Operator Independent Drivers Association. “When you’re off duty you’re not supposed to be doing anything.”

In addition, because some of the CO2 that Airgas delivered was used in beverages, it fell under regulation from the Food and Drug Administration. Following the “good manufacturing practice” guidelines for production and distribution, Airgas required food-grade CO2 to be tested for purity before delivery to customers. Drivers were instructed to hook up a Zahm & Nagel testing device as the truck was filled at the stand tank and fill out a form confirming a successful test. Airgas had drivers sign annual forms saying that they were trained to do testing and that they followed all protocols.

But drivers never were given the proper equipment to perform the test, Coron said. Sometimes the Zahm & Nagel kit was not in the truck. And the hose connecting the kit to the truck, an item that costs no more than $9, was lacking. A metal device that attaches to the testing port on the stand tank was also missing, so drivers couldn’t test at the stand tank.

“We were told it was Airgas’s policy to test each load. But it ended there.”

“Phoenix does not and has not tested a single CO2 load on truck #303672 since it arrived in Phoenix,” Coron wrote in an email to superiors in January 2018. “Truck #307243 hasn’t tested a single CO2 load since it arrived in Phoenix. … These are the only trucks we use.”

Bascone backed this up. “We were told it was Airgas’s policy to test each load,” he said. “But it ended there. They didn’t supply the equipment. Nobody was in charge of it.”

In September 2021, a regional operations manager, Vincent Wise, told drivers that a new Zahm & Nagel device would soon be shipped to Phoenix. In the same email, however, he admitted that other parts had not been ordered, meaning tests still could not be conducted. “I ask that you work with the Ops Manager … to see if we can source one,” Wise, himself the operations manager, wrote.

Instead of shutting down deliveries until testing equipment was made available, drivers were instructed to fill out the testing forms anyway, according to Coron. “We always wrote down 99.9 percent [pure], always,” he told me. “If it was less than that then you couldn’t make the delivery.” Bascone said that drivers would just transfer the purity figures from the supplier to the Airgas form.

“Is it acceptable for me to continue not testing bulk CO2 loads & write on the loading document that the test was actually performed and document testing results that don’t actually exist?” Coron asked in a 2018 email. He did not receive an answer, and loads continued to be delivered.

There is no indication that impure CO2 was delivered, nor were there any complaints of illnesses from drinking impure soda.

When Coron told higher-ups at Airgas National Carbonation about this, some were unaware that purity testing was even done on the CO2 loads. “I know that we test shit because I’m the one that tests it,” Coron said. “The people on top literally do not know the fundamentals about the business.”

“The people on top literally do not know the fundamentals about the business.”

The Airgas website touts that its food-grade gases comply with the Food Safety Modernization Act and other purity specifications. It adds that food-grade gas is tested “throughout the supply chain — from production to delivery.”

The FDA food-grade gas recommendations include that “training be provided annually and that manufacturers keep training records.” Those records were kept by the Phoenix branch and were available for review by FDA regional officers during audits. But in a 2018 email to a safety and compliance manager, Coron wrote, “All 3 of us drivers in Phoenix are untrained on the current testing protocol.” So for at least some of his employment, training wasn’t kept up.

Experts were unclear on the specifics of food-grade gas requirements, though Peter Lurie, a former FDA official who is now the executive director of the Center for Science in the Public Interest, said that the internal training records would be key. Lurie said it is always a problem when records reviewed by the FDA are not accurate. “I would think falsifying an attestation that ultimately came into the agency’s hands, that strikes me as criminal activity.”

From his earliest days with Airgas, Coron attempted to get upper management interested in safety and compliance issues in Phoenix. He showed me email exchanges with eight different compliance managers, senior vice presidents, and even the former president of Airgas National Carbonation, Dennis Harris.

In late 2017, Coron approached ANC Vice President Matt Sebuck and ANC safety compliance manager Scott Burgess. Coron was invited to a conference call with Harris and Burgess in early 2018, but after the call, Coron’s 2017 annual review asserted that he had “regress[ed]” over the year and included a number of negative comments. “Cyrus isn’t always content with management decisions on resolving issues. … Cyrus spends too much time writing long emails to management and Customer care. … Cyrus sought immediate resolution with upper management without consulting [Reyes, his supervisor] on several issues.” The review was signed by Reyes and Sebuck.

Coron added that Reyes made verbal threats to fire him, though the company never did so. I asked him why. “Those emails to corporate were crazy fucking detailed,” he responded. “Those weren’t like rando complaints. They knew that I had that.”

Despite the leverage, nothing changed in Phoenix. Years of back-and-forth complaints culminated in a phone call between Coron and Reyes in February 2020, which Coron memorialized in an email. “He gave me the ultimatum, if I did not stop questioning his judgment on safety issues … and ‘complaining’ about overcharging customers … then he would change my shift to a night shift, with the expectation that it would ‘force’ me to ‘quit.’” A night shift job is more dangerous, so Coron kept his mouth shut for a while.

But soon he started writing upper management again. Wise, the regional operations manager and Reyes’s supervisor, responded to specific concerns but never wrote Coron about his broader claims. Sean Eggett, a safety and compliance official, never wrote back. Amber Vanderkooy, vice president of operations at Airgas National Carbonation, never wrote back. Coron actually met with Mike Pelaez, another safety and compliance official, that June, and there were follow-up calls and emails. Pelaez thanked Coron for his feedback and ensured him that it would remain confidential. “This helps, but a quick fix is never quick,” Pelaez said after one email in August, two months after the initial contact.

Around the same time, Reyes and Wise wrote up Coron over allegedly not following safety protocols during a CO2 delivery at a McDonald’s in Chandler, Arizona. An “anonymous source” sent photos of Coron “inside the truck cab” during delivery, they said, with no safety cones around the truck. Coron disputes the characterization; how a random bystander would know to send photos of an Airgas employee in Arizona to a remote manager in Las Vegas was not explained.

Nevertheless, Reyes and Wise insisted that Coron sign a “coaching action form” confirming the write-up. The form was contradictory: It said that Coron acknowledged the failure to comply with protocols yet added, “Your signature does not indicate that you agree with the statement made.” Coron felt trapped. “I needed the job, my wife is in school full time,” he said. “I don’t have the luxury of going two weeks without a paycheck.” He signed the form.

Finally, Coron escalated to Page, Airgas’s senior director of compliance and controls, who got back immediately and promised to start an investigation. Coron gave him access to all of his files, and on September 3, 2021, Coron, Page, and Page’s colleague held an unusually candid hourlong conference call.

Page seemed aware of the meter calibration, inventory, and accounting issues. “There is definitely a sentiment that you’re absolutely right,” he said. “That’s why a couple [senior managers] were fired last year.”

“Dennis Harris and Matt Sebuck?” asked Coron.

“Yeah,” Page confirmed.

Would an isolated problem at one branch bring down such senior officials?

“I guarantee you that this is not just a one-off,” Coron told Page. “You’re only hearing from me because I’m a driver who comes from a highly regulated background where I’ve never seen this before so I’m not cool with it.”

Page did not question that assertion. His message was that management was interested in shaping up the organization. He told Coron that they would finish their investigation and expose it publicly throughout Airgas National Carbonation within the next couple of weeks. “I can tell you that the leadership at National Carbonation, especially the new president,” Page said, “recognize that things were ignored and they’re playing catch-up. They don’t know what’s out there, they’re still uncovering kind of the hidden secrets and the mess. … We’ll get to the bottom of it.”

Page and his colleague asked Coron for emails and files for about three weeks. Coron never heard anything after that.

airgas-embed-3

A carbon dioxide delivery truck.

Photo: Cyrus Coron


Coron also went outside the organization. Last September, he contacted the Denver FDA office that conducts compliance audits for the Phoenix branch. He spoke with Stephanie Chastagner, who confirmed some level of purity testing requirements and told Coron that the office would commence an investigation. The Prospect and The Intercept contacted the office, and FDA spokesperson Stephanie Caccomo replied, “The FDA does not confirm or comment on any potential investigations, per policy. We are not able to provide any information in this case.”

Coron then tried the Arizona Department of Agriculture’s Weights and Measures Services Division. After an initial phone call, he sent them information about the faulty meters and inaccurate deliveries. Associate Director Kevin Allen told The Prospect and The Intercept that the department “attempted to reach out to Airgas to witness a meter test and calibration, however we were unable to coordinate due to COVID-19 protocols.”

Once Coron got back in touch, the department suggested that he contact the consumer fraud division in the state attorney general’s office. Coron filed an online complaint, citing consumer fraud of over $500,000, and followed up with a unit manager in the consumer information section. While the office declined to initiate a criminal investigation, the case was assigned to a special investigator with the consumer section, Richard Perez, whom Coron met with in October 2021, giving him all the files on a thumb drive. Perez promised to follow up, but Coron hasn’t heard from him since last fall.

The attorney general’s office hasn’t responded to a request for comment.

By this time, Coron was on long-term leave from Airgas. He had picked up Covid from a co-worker and went on short-term disability when the symptoms didn’t go away. “Straight up, I had long Covid,” he told me. “I thought it was bogus until I actually had it.” He would get bouts of brain fog, and random parts of his body would suddenly go numb. Combined with the pressures of long workdays and the retaliation he was experiencing, it was too much. “I went to a neurologist,” Coron explained, “and the guy said, ‘You’ve got to get your ass out of a fucking truck, dude.’”

He never returned to Airgas. In January, he got a new job outside the trucking industry.

Although removed from Airgas, Coron wants the public to understand what is happening there and the structures that make corporate wrongdoing widespread. “Because I’m white trash, I don’t like people who expect me to break the law, it makes me really mad,” he told me. He sketched a vision of business school graduates in suits seeking market share, making decisions that push criminality down the ladder.

“I swear to God it’s like a class thing,” he added. “The level of criminality from the college class, they’re taught to be predators. Lazy-ass predators, but predators nonetheless.”

Jeffrey Dewey, Isabelle Gius, and Alex Weatherhead contributed reporting.

The post A Carbon Dioxide Delivery Driver’s Long Journey to Expose Airgas appeared first on The Intercept.

25 May 16:10

Brazil's Lula proposes creating Latin American currency to 'be freed of US dollar' dependency

Tom Roche

good short piece on current Brazilian politics, USD hegemony and its discontents (and how the discontented are once again mobilizing against it), and the return of South/Latin American economic integration frameworks

Benjamin Norton discusses the historic announcement by Brazil’s left-wing leader Lula da Silva that, if he wins the October 2022 presidential elections, “we are going to create a currency in Latin America,” called the Sur (“South”), to combat “the dependency on the dollar.” Read more here: https://multipolarista.com/2022/05/04/brazil-lula-latin-america-currency-us-dollar VIDEO: https://youtube.com/watch?v=bRTr8o8EYiE
25 May 16:08

He cooks, he clean, he feeds...but he has limits!

Tom Roche

Keith Pedro is IMHO always skippable. Erica Sigurdson is always funny ... but *this* segment is a repeat. It's still funny, but if you think you've heard it before on LoL, it's because you have.

From the Icebreakers Comedy Festival, father of twins Keith Pedro offers some questionable parenting tips and from Hecklers Comedy Club, Erica Sigurdson tells us how she LOVES children - but keep them to yourself please.
24 May 17:55

630 - Full Stomach, Heavy Heart, Will Lose (5/23/22)

Tom Roche

EXCELLENT: mostly just banter (since the ending Thomas Friedman reader is quite short) but the dudes are in fine form, esp regarding the US scam economy (particularly Elon Musk and Black Rifle Coffee)

Helllllloooo babies! Just as we anticipated, Eric Adams explores a run for president in 2024, so we look at the possibility of New York’s mayor taking his vibe revolution national. We also look at some juicy financial drama going on over at Black Rifle Coffee Company, plus, Tom Friedman’s sad, ominous lunch with the President.

Catch us a Pickathon August 6th, tickets at: www.pickathon.com

24 May 17:30

Democracy Now! 2022-05-24 Tuesday

Tom Roche

DN! has had an unusually-long string of duds, bricks, and klangers recently (sad to say) ... but /this/ show (on the history of Haiti--with the great Gerald Horne--and on Biden revving-up US-PRC tension) was consistently EXCELLENT

Democracy Now! 2022-05-24 Tuesday

  • Headlines for May 24, 2022
  • Debt, Coups & Colonialism in Haiti: France & U.S. Urged to Pay Reparations for Destroying Nation
  • Biden Says U.S. Will Defend Taiwan as China Accuses U.S. of Forming "Indo-Pacific Version of NATO"

Download this show

24 May 14:17

M. Rincón: Viewing Important Dates in Emacs

by M. Rincón
Tom Roche

links to [this elisp date library](https://github.com/foxfriday/date-functions). pullquote:
> Now I can open the calendar with M-x calendar, press m and the days that match the rule are colored with whatever color I choose. I can also press d and get some information on the date, in this case the string "Hello". To display the events in the fancy org-mode agenda along with holidays, I added the following to my configuration: (setq org-agenda-include-diary t)

For a while I tried to use org-mode to schedule appointments and keep track of my calendar. But eventually I gave up. I never found an effective way to coordinate with others. I still use Emacs to mark non-calendar-blocking events like market half days. My phone can easily keep track of regular events like birthdays. But recurrent events with more complicated rules are a pain. For example, crude oil futures expire the third business day before the 25th day of the month if the 25th is a business day, or the fourth prior day if the 25th is a holiday.
24 May 00:58

The Wood Age

Tom Roche

excellent

Roland Ennos believes that we take trees for granted, and that in fact wood and trees have played a significant role in human evolution. From when we lived in trees to using wood to create tools, fire, houses, boats and paper, wood has proved the most versatile of materials.
23 May 21:10

International Commission Votes to Allow Use of More Climate-Friendly Refrigerants in AC and Heat Pumps

by By Phil McKenna
Tom Roche

need to move from HFC-410a and HFC-32 toward ammonia and propane

The new guidelines could save the equivalent of billions of metric tons of carbon dioxide emissions by 2050, but the U.S. could prove slow to adopt them.

By Phil McKenna

A secretive vote in the arcane and Byzantine world of international safety standards late last month may lead to a dramatic reduction in greenhouse gas emissions from home heating and cooling systems in the coming years.

22 May 19:17

Manuel Uberti: DivestOS on my Fairphone 2

by Manuel Uberti
Tom Roche

opensource/privacy-protecting smartphone OSs!

One of the reasons I am not a heavy smartphone user is privacy concerns. However, the truth is that I have a smartphone and I use it, so clearly being aware of a problem and not acting on it is not going to fix it any time soon.

This is why I have finally decided to move on a different operative system for my Fairphone 2. After researching the right OS for my needs, I landed on DivestOS. I won’t go into the technical details underneath the software because the website is fairly rich in this regard. Let’s see the practicals, instead.

First of all, I backed up the important data on my phone. This means PGP keys, OTP settings, and everything else that Google was not already saving for me. I then downloaded the required fp2 images from Device Downloads. After that, I moved to the Bootloader/Installation page and went through the Prerequisites section by making sure USB debugging was enabled on my phone and by running the following command on my laptop:

sudo apt install android-tools-adb android-tools-fastboot

Since DivestOS is a fork of LineageOS, I preferred to follow the Install LineageOS on FP2 steps instead of the ones over at the Fastboot section of the Bootloader/Installation page. Why? Because I am a newbie at smartphone flashing and I wanted clear instructions on how to proceed.

The installation went smoothly. I then set up the few apps I need, making sure everything from my VPN to basic email was working as expected. The only problem I soon discovered is PosteID, which is the app I use to handle SPID, the digital identity system the Italian government offers to access online administration services. Luckily, there is a workaround to avoid the PosteID app which relies on good old SMS for part of the authentication process. It’s limited to 8 messages every 3 months, but that is enough for me.

When I started this de-googling project I knew I was sacrificing comfort in favour of more control over my digital life. How much the whole operation is worth only time will tell.

22 May 19:15

scripter.co | Emacs: Using Org Logbook Notes to record blog post updates

by Kaushal Modi
Tom Roche

excellent quick introduction to the Org drawer=:LOGBOOK: for adding metadata regarding updates/versioning

Quick introduction to Org mode’s :LOGBOOK: feature and how I use it to record time-stamped notes for blog post updates.

Most of my blog posts are mainly to serve as documentation for my future self This post will serve to remind me how to get the :LOGBOOK: notes working once again in case I end up with some issue there. . So when I get a chance, I try to fix outdated stuff in my old blog posts. And along with the act of updating things, adding brief notes describing those updates comes naturally to me.

Prior forms of adding post updates #

As I author my posts in Org mode, I can easy enter a date stamp using the org-time-stamp command (bound by default to C-c . RET) and follow that by the update note.

While that worked, that approach bothered me because those notes didn’t have consistent format across multiple posts. For example, I might type the update as “*Update (<time stamp>)*: <note>” in one post, while I might type the same in a description list form in another: “- <time stamp>) :: <note>”.

To solve the consistency problem, I came up with this Org macro:

#+macro: update - $1 :: $2
Code Snippet 1: {{{update(..)}}} Org Macro

This worked mostly … except when the update text needed to be a bit longer, like a paragraph. It didn’t look elegant in that case. Also, if the text had a comma character in there, it needed to be escaped with a backslash (\).

Introducing :LOGBOOK: #

So when I learned A little bit of history .. I learned about the :LOGBOOK: drawer when Adam Porter mentioned it in ox-hugo Issue # 203 back in September 2018. I wanted to use that feature, but I didn’t have time and/or know-how on how exactly I would parse those Org Drawers in ox-hugo until very recently (May 2022)! about the Org :LOGBOOK: drawer, it solved all those problems: (i) consistency in adding notes (ii) easy to add update notes – in fact much easier (iii) easy to type long form notes (iv) no comma escaping needed.

Org Drawers look like this:

Content before the drawer
:DRAWERNAME:
Content inside the drawer
:END:
Content after the drawer
Code Snippet 2: Org Drawers

and they can be inserted anywhere in your Org content using the org-insert-drawer command (bound by default to C-c C-x d).

:LOGBOOK: is a special kind of drawer that’s auto-inserted by Org mode when certain actions are detected, like changing the TODO state of a subtree, or adding a note . That latter action is what this blog post is about.

Adding notes to :LOGBOOK: #

You need to enable this feature using one of these methods:

  1. Set the org-log-into-drawer variable to a non-nil value (typically t) in your Emacs config, or as a file-local variable, or in your project’s .dir-locals.el (⭐ my preference).
  2. Set #+startup: logdrawer to enable this for the whole Org file.
  3. To enable this feature for only selected subtrees, set the :LOG_INTO_DRAWER: t property in the subtree (or one of its parent subtrees).

Once this is set, call the org-add-note command (bound by default to C-c C-z). That will open a window with ∗Org Note∗ buffer where-in you will type your post update and then C-c C-c to save it to the subtree’s :LOGBOOK: drawer. If that drawer didn’t exist already, it will be created directly under the subtree’s heading.

The note will get recorded in this format by default under the current subtree:

* Subtree title
:LOGBOOK:
- Note taken on <current date and time> \\
  <note text>
:END:
Code Snippet 3: Default format of a :LOGBOOK: note

As you see, you only type the note text, and the time-stamp is inserted automatically.

:LOGBOOK: Notes Example #

Here are the update notes from one of my posts:

:LOGBOOK:
- Note taken on <2018-08-26 Sun> \\
  Mention =org-babel-demarcate-block=, tweak the =org-meta-return= advice.
- Note taken on <2018-08-23 Thu> \\
  Use ~M-return~ instead of ~C-return~ for splitting blocks and
  support upper-case blocks (though I [[* Converting Org keywords to lower-case][don't prefer those]]!).
:END:
Code Snippet 4: Examples of post update notes added to the :LOGBOOK: drawer

You can see how they rendered at the top of the Splitting an Org block into two post.

If you are an ox-hugo user following the subtree-based export flow, and would like to export :LOGBOOK: notes in a similar fashion, check out the ox-hugo Manual: Drawers page for details.

References #

22 May 19:12

Gretzuni: Configuring an OS environment: An intro to Debian + GNU Guix

by Greta
Tom Roche

gotta look more at Guix someday--my package-management experience is limited to dpkg/APT (mostly) and rpm/yum (because I am ancient :-)

This is an anecdotal post on how I found myself installing GNU Guix on Sunday, even though my OS competence is such that installing Debian was a little challenge. The moral of this story is: moving towards software freedom even for the non-expert gives so many customizable options that I hope more people will talk about and experience this freedom.

22 May 19:06

Irreal: Emacs Completion Mechanisms

by jcs
Tom Roche

pullquote:
> [Mickey [Petersen] jumps in](https://www.reddit.com/r/emacs/comments/us51if/comment/i91ktsq/) with an excellent overview of the various [Emacs-based {autocomplete, templating, text-expansion}] methods and why you might want to use one or the other.

In a nice followup to yesterday’s post on Hippie Expand, deltille asks for clarification on the Emacs’ completion methods. His post was in response to Mickey’s article about hippie expand. Detille is a new Emacs user and is confused about when to use the various expansion Emacs mechanisms—there’s a lot of them—for completion.

Mickey jumps in with an excellent overview of the various methods and why you might want to use one or the other. To my mind, there’s a pretty bright line. If you want syntax-aware editing mediated by an LSP process then you should use completion-at-point or whatever your LSP package uses. If, like me, you’re mainly concerned with just minimizing typing, hippie-expand is the best bet. You can configure it to sequentially try any of the other methods. I use it many times a day and love it.

That leaves templates. If you want to expand a keyword into some text, perhaps with substitutions, then Yasnippet is a very nice solution. Mickey has some other recommendations but unless you have some special needs, Yasnippet is a good answer.

If, like many people, you’re confused by the plethora of completion/expander methods, take a look at this reddit post and Mickey’s answer.

22 May 14:43

Michael and Us: Just Asking Questions

Tom Roche

EXCELLENT, funny as usual

Dinesh D'Souza believes he has uncovered shocking proof that the Democratic Party stole the 2020 election in 2000 MULES (2022), a documentary so shoddy that even right-wing media is hesitant to publicize it. We follow the trail of Dinesh's conspiracy theory to its inevitable endpoint: a contempt for democracy itself. PLUS: we discuss the billionaire whose name is on everyone's lips, Elon Musk.


Michael and Us is a podcast about political cinema and our crumbling world hosted by Will Sloan and Luke Savage.



Hosted on Acast. See acast.com/privacy for more information.

22 May 14:42

How fractions distort our thinking

Tom Roche

good but misnamed--it's more about how humans (absent mathematical/statistical education) really suck at calculating or even understanding probabiity

James Zimring explains why our inability to fully understand and process fractions, percentages and numbers has profound ramifications not only for our lives and wellbeing but also in the way we think.
22 May 14:39

What is 'socialism with Chinese characteristics'? Inside China's economic model

Tom Roche

VERY EXCELLENT

What is "socialism with Chinese characteristics," and how does it differ from Western neoliberal capitalism? Economist John Ross, who has taught in China and written books about its economy, explains. VIDEO: https://youtube.com/watch?v=2wJwhkRz4Lk Follow John on Twitter: https://twitter.com/JohnRoss43
22 May 14:30

Ukrainian Journalist Exposes the Azov Battalion

by Matt Taibbi
Tom Roche

EXCELLENT

Click here for the full episode, including the extended interview with Lev Golinkin on disinformation, weapons manufacturers, and Aaron’s fight with a Nazi denier.

The Nation’s Lev Golinkin has an important message that most people in mainstream news can’t seem to wrap their heads around:

“Russia is committing war crimes. That is true. And not everyone who is fighting Russia is a good guy. That is also true.”

And some of these bad guys are Nazis.

Lev, who sees his home country being terrorized by Russia while also by it’s own neo-Nazi extremists, brings a new perspective to the war that is rarely shared.

And why is his voice stifled? Because of disinformation launderers like Nina Jankowicz, Orwellian head of Biden’s (now-paused) Disinformation Board, who have a pro-war agenda, whitewash Nazism, and smear anyone who disagrees with them.

Read Lev’s articles at the Nation, read his memoir, and watch Useful Idiots. It’s the last stand against the supercalifragicensors.

And become a Substack subscriber to see the full interview where we discuss disinformation, weapons manufacturers, and Aaron’s fight with a Nazi denier.

It’s all this, and more, on this week’s episode of Useful Idiots. Check it out.

Subscribe now

21 May 19:35

Mickey Petersen: Correcting Typos and Misspellings with Abbrev

by Mickey Petersen
Tom Roche

TODO: adapted from post: import [Wikipedia’s list of most common misspellings](https://en.wikipedia.org/wiki/Wikipedia:Lists_of_common_misspellings) into my `.emacs.d/personal/abbrev_defs`. See [Petersen's procedure](https://www.masteringemacs.org/article/correcting-typos-misspellings-abbrev#importing-the-common-misspellings-word-list) but note that it imports only from [Wikipedia's machine-readable list (MRL)](https://en.wikipedia.org/wiki/Wikipedia:Lists_of_common_misspellings/For_machines#The_Machine-Readable_List), which is a [flawed subset](https://en.wikipedia.org/wiki/Wikipedia:Lists_of_common_misspellings/For_machines#Generating_a_Machine-Readable_List) of the full list. Note WP currently (21 May 2022) says
> This machine-readable version of misspelled words is usually out-of-date compared to the actual listing pages for each of the individual, human-readable lists. (As of Feb. 14, 2020, there are no numbers at all in this machine-readable list, and every letter seems to have missing entries.)

I’ve previously talked about using Hippie Expand to expand text. It’s great; if you’ve not used it, you should give it a try. But it’s just one of many different ways of expanding the text at point and turning it into something else.

The most basic of these systems in Emacs is abbrev. Abbrev is, as its name may slyly allude to, intended for abbreviations or unconditional text replacements. It works as you type: you don’t need to do anything to trigger it, provided you’ve told abbrev to replace one word with another, either globally or locally to a particular major mode. Because abbrev silently expands stuff with no fanfare, that makes it great for auto-corrections.

Many moons ago, I borrowed Wikipedia’s list of most common misspellings and turned them into abbrev entries. It’s a total game changer. And the best thing about it is that it silently replaces the matches. Sure, it’s no replacement for a spell checker, but it’s good enough to catch a lot of common keyboard fumbles.

There are two ways of creating abbrev entries, and two ways of defining where they trigger. Abbrev entries trigger either in the major mode you define the abbrev in, or globally in all major modes.

In order to add abbrev entries you need to decide if you want to do it the inverted way – where you place point at the end of the word you want to replace – or the other way around.

Key Bind Purpose
C-x a g Define an abbrev globally
C-x a l Define an abbrev locally
C-x a i g Define an inverted abbrev globally
C-x a i l Define an inverted abbrev locally

You also need to enable it, as it’s not by default:

(setq-default abbrev-mode t)

I prefer the inverted approach as I’m more likely to catch the mistake in the buffer and then use C-x a i g to enter the correct word. Emacs commits the new abbrev and fixes your word at point. This workflow works well for fix-as-you-go typos.

If you find yourself wanting to prevent abbrev from expanding the word at point, you can insert a literal space with C-q SPC. That circumvents the abbrev trigger mechanism that one time.

Emacs will ask you when you exit if you want to save your abbrevs. But you can call M-x abbrev-edit-save-buffer to explicitly save it, and M-x edit-abbrevs to open the file directly for editing. I recommend you M-x customize-group abbrev as there’s a number of interesting settings you can tweak, like the filename for the abbrevs, and whether you want it to handle word casing.

As it’s designed for whole-word expansions, abbrev is therefore not able to expand your abbrev entries if they’re part of a larger word. There is a way to do this – using M-' as a marker to indicate that abbrev should expand anyway – but I find it more trouble than it’s worth.

Let’s quickly go over one (of many) ways you can import Wikipedia’s word list.

Importing the Common Misspellings Word List

As the link above shows, the word list looks like this:

...
countrie's->countries, countries', country's
...
manoeuverability->maneuverability
manouver->maneuver, manoeuvre
...

As you can see, the word list may offer up alternatives. Some of them with grammatical inflections or regional spelling variations.

If you don’t want to manually sift through which ones you prefer, I recommend you just delete the ones with multiple matches:

  1. C-x h to mark the whole buffer.
  2. M-x flush-lines RET , RET to flush anything with a , on the line.

And… done.

To load the remaining entries into your abbrev table, I would recommend a keyboard macro:

  1. Place point at the beginning of the buffer with M-<.
  2. F3 to start macro recording.
  3. Search for -> with isearch (C-s) and press RET at the first match.
  4. Your point is now after ->, so <backspace> twice to delete it.
  5. Type C-k to kill to the end of the line. (This obviously needs tweaking if you have kill-whole-line set… but this is yet another reason why you should never do that.)
  6. Type C-x a i g to correct the preceding word. At the prompt, press C-y to yank the previously-killed word into the buffer. Press RET to accept.
  7. Stop macro recording with F4.
  8. Type C-0 C-x e to execute the macro forever, until it reaches the end of the buffer. It might take 5-10 seconds.

You’re done. Don’t forget to save the changes and enable M-x abbrev-mode to test that it works.

21 May 19:25

Irreal: Looping Through Org Headings

by jcs
Tom Roche

pullquote:
> `org-map-entries` [is an elisp] mapping function [that loops] through each Org [heading visible in the Org buffer] and call a function (with no arguments) that can assume the point is at the beginning of the heading. You can filter the entries to look at by things such as tags, properties, or the level of the header. You can filter on the absence or presence of a tag or tags, or for any tags or properties satisfying a regular expression. [Kaushal Modi](https://scripter.co/) ends [his post](https://scripter.co/looping-through-org-mode-headings/) ([archived here](https://web.archive.org/web/20220519064636/https://scripter.co/looping-through-org-mode-headings/)) with an example of adding a property to each heading.

I’ve got several functions that do some sort of processing on Org files. Many of them were written years ago when I was just starting with Org-mode and as a result, they often take a naive approach to, say, locating Org top level headers. My typical solution was to do a regular expression search on something like ^\\*[ *].

There are, of course, better ways and Kaushal Modi over at A Scripter’s Notes shows us one of them. If you want to loop through all Org headers and do something to each entry, Org has a function just for that, org-map-entries. This mapping function will loop through each Org entry and call a function (with no arguments) that can assume the point is at the beginning of the heading.

You can filter the entries to look at by things such as tags, properties, or the level of the header. You can filter on the absence or presence of a tag or tags, or for any tags or properties satisfying a regular expression.

Modi ends his post with an example of adding a property to each heading. The org-map-entries function is versatile and useful and makes dealing with Org files programmatically a bit easier. If you do any Elisp programming involving Org files, be sure to take a look at Modi’s post.

21 May 05:04

Ep 259 War Planning in the Pacific feat Peter Lee

Tom Roche

excellent

Guest:  Peter Lee. We discuss two of Peter’s recent China Threat Report episodes titled Death By Oil: US Warplanning in the Pacific and The Escalation Solution with a focus on Taiwan. In a bonus segment, we talk about the escalation in Ukraine, timely catastrophes and why Peter now considers himself a “catastrophist”. 

Peter Lee has decades of experience in East Asia both as a businessman and as a writer. He produces Peter Lee’s China Threat Report and has been published at Asia Times, CounterPunch at his own blog, China Matters. FOLLOW @chinahand.  SUBSCRIBE to Peter Lee’s China Threat Report.

FOLLOW @chinahand.  SUBSCRIBE to Peter Lee’s China Threat Report.

Around the Empire aroundtheempire.com is listener supported, independent media.

SUBSCRIBE/FOLLOW on Rokfin rokfin.com/aroundtheempire, Patreon patreon.com/aroundtheempire, Paypal paypal.me/aroundtheempirepod, YouTube youtube.com/aroundtheempire, Spotify, iTunes, iHeart, Google Podcasts

FOLLOW @aroundtheempire and @joanneleon.  Join us on TELEGRAM https://t.me/AroundtheEmpire

Find everything on http://aroundtheempire.com  and linktr.ee/aroundtheempire

 

Recorded on May 6, 2022. Music by Fluorescent Grey.

Reference Links:

Death By Oil: US Warplanning in the Pacific, Peter Lee, China Threat Report

The Escalation Solution, Peter Lee, China Threat Report

20 May 15:45

629 - Night at the Opera feat. Tim Heidecker (5/19/22)

Tom Roche

just bants--definitely not great CTH--but amusing for an hour

Friend of the show Tim Heidecker stops by to mix it up on primary election results, George W. Bush goofs, Jojo Deep and Roger Hard, Elon Musk fuck ups, and the unknowable nature of comedy.

See Tim live on tour this Summer, dates and ticket links here: https://www.timheidecker.com/live

20 May 03:45

Turning that frown upside down, one comedy set at a time.

Tom Roche

Nour Hadidi (starts @ 8:00) is lowkey funny as usual. Before her, Ali Hassan does his material (not just hosting) which is listenable enough ... and skippable enough ... I dunno, listen to him if you like Seinfeldish comedy-about-nothing but definitely listen to Nour Hadidi

From the Icebreakers Comedy Festival, Nour Hadidi reminds us that depression - as serious and challenging as it it is - when talked about openly, an be great for comedy! And Host Ali Hassan gets some tips on how NOT to sunburn.
19 May 21:22

Jeffrey Sachs Presents Evidence of Possible Lab Origin of Covid-19

by Sharon Lerner
Tom Roche

Sachs, like Jimmy Carter, continuing to Do Good Work years after Committing Great Crimes (Carter with his presidency--which was the dress-rehearsal for the policies with which Reagan is mostly tarred, Sachs with the Shock Therapy that literally killed millions in the 1990s former USSR)

In an article published Thursday, economist Jeffrey Sachs called for an independent investigation of information held by U.S.-based institutions that could shed light on the origins of the Covid-19 pandemic. Writing in the Proceedings of the National Academy of Sciences, Sachs and his co-author, Neil Harrison, a Columbia University professor of molecular pharmacology and therapeutics, said that federal agencies and universities possess evidence that has not been adequately reviewed, including virus databases, biological samples, viral sequences, email communications, and laboratory notebooks. Sachs and Harrison also highlighted a tantalizing scientific detail that may be an indication that SARS-CoV-2, the coronavirus that causes Covid-19, originated in a laboratory: a sequence of eight amino acids on a critical part of the virus’s spike protein that is identical to an amino acid sequence found in cells that line human airways.

Sachs and Harrison are hardly the first to suggest that SARS-CoV-2 might have been created in a lab. Since its genetic sequence was first published in February 2020, scientists have puzzled over the furin cleavage site, an area on the virus’s spike that allows it to be cleaved by a protein on the membrane of human cells and makes the coronavirus particularly dangerous to people. Once split, the virus releases its genetic material into the cell and reproduces. While attaching to cells and spike cleavage is part of how all coronaviruses work, SARS-CoV-2 is the only one of its class, sarbecoviruses, that can use furin for the cleavage.

As with past discussion of a possible lab origin of SARS-CoV-2, this latest theory has already been met with considerable pushback. Even some scientists who are open to the idea that a lab accident could have sparked the pandemic remain unconvinced by the particular trail of evidence laid out by Sachs and Harrison.

The journal article offers a scientific road map for how this unusual sequence of amino acids could have made its way into the furin cleavage site, or FCS, of the virus. Sachs and Harrison acknowledge that the sequence could have arisen naturally. But they also lay out another possibility: that scientists might have purposefully inserted this particular string of amino acids into a bat coronavirus in the course of their work. They focus particularly on scientists who submitted an unfunded grant proposal to a division of the Defense Department called the Defense Advanced Research Projects Agency, or DARPA, laying out plans to insert a furin cleavage site into a bat coronavirus.

“We do not know whether the insertion of the FCS was the result of natural evolution — perhaps via a recombination event in an intermediate mammal or a human — or was the result of a deliberate introduction of the FCS into a SARS-like virus as part of a laboratory experiment,” Sachs and Harrison write. “We do know that the insertion of such FCS sequences into SARS-like viruses was a specific goal of work proposed by the EHA-WIV-UNC partnership within a 2018 grant proposal (“DEFUSE”) that was submitted to the US Defense Advanced Research Projects (DARPA).”

EHA is a reference to EcoHealth Alliance, a nonprofit research group based in New York City that has received more than $118 million in grants and contracts from federal agencies. WIV, or the Wuhan Institute of Virology, is a Chinese research organization that collaborated with EcoHealth Alliance in the past and was listed as a subcontractor on the DARPA grant. UNC is mentioned because Ralph Baric, a molecular biologist at the University of North Carolina, Chapel Hill, was to have conducted part of the work pitched to DARPA. The grant proposal touted Baric’s “two-decade track record of reverse engineering [coronavirus] and other virus spike proteins.”

The intent of the DARPA proposal was to prevent emerging pathogenic threats, but the work, if conducted, could have created a novel virus capable of infecting humans. “We will introduce appropriate human-specific cleavage sites and evaluate growth potential in [a type of mammalian cell commonly used in microbiology] and [human airway epithelial cell] cultures,” the proposal stated.

Several scientists interviewed about the DARPA proposal in September told The Intercept that scientists often begin research before seeking funding and thus that some of the experiments described in the proposal could have already been completed. But when asked about that possibility in an interview, Peter Daszak, the president of EcoHealth Alliance, rejected it: “The DARPA proposal was not funded. Therefore, the work was not done. Simple.”

A Rational Choice

As Sachs and Harrison note, the part of a protein on the cell membrane that shares its amino acid sequence with the bat coronavirus is critical for lung function. Known as an epithelial sodium channel-alpha, or ENaC-alpha, it is found in human airway cells, as well as in human kidneys and colons. Intriguingly, like SARS-CoV-2, ENaC-alpha, which facilitates the absorption of fluid in cells, is also activated by the unusual furin cleavage site. Harrison, a physiologist affiliated with Columbia’s Department of Molecular Pharmacology and Therapeutics, studies ion channels, the larger category to which ENaC-alpha belongs.

Other scientists have already pointed out the match between the amino acid series in the furin cleavage site of SARS-CoV-2 and the ENaC-alpha found in human airways. In 2020, a team from the biomedical company Nference suggested that the overlap between the virus and the sequence found in human lungs is part of the reason that Covid-19 is so damaging to the respiratory system. Those scientists described the sequence as having evolved naturally.

Sachs and Harrison, in contrast, suggest that researchers may have inserted the string of amino acids into a bat coronavirus precisely because of its known importance to lung function. “For a research team assessing the pandemic potential of SARS-related coronaviruses, the FCS of human ENaC — an FCS known to be efficiently cleaved by host furin present in the target location (epithelial cells) of an important target organ (lung), of the target organism (human) — might be a rational, if not obvious, choice of FCS to introduce into a virus in order to alter its infectivity, in line with other work performed previously,” they write.

Such a choice, they point out, would have been in keeping with another viral research project on which EcoHealth Alliance, the Wuhan Institute of Virology, and UNC’s Baric collaborated: a 2014 grant from the National Institute of Allergy and Infectious Diseases that involved increasing the transmissibility and pathogenicity of bat coronaviruses.

Ralph Baric, researcher and lab leader at North Carolina's Gillings School of Global Public Health, Chapel Hill, North Carolina, U.S., Feb. 14, 2020.

Ralph Baric, a researcher at the University of North Carolina’s Gillings School of Global Public Health, in Chapel Hill, N.C., on Feb. 14, 2020.

Photo: Christopher Janaro/Bloomberg via Getty Images

Growing List of Coincidences

The intriguing theory of viral engineering hinges on two observations: that the amino acid sequences match and that experts in both the ENaC-alpha furin cleavage site and the insertion of genetic sequences into bat coronaviruses happen to work at the same academic institution: the University of North Carolina, Chapel Hill.

Baric, whose work aims to prevent and create treatments for viral outbreaks, has previously inserted segments of DNA and RNA into viruses and created an infectious clone of SARS using his own patentedNo See’m” method of inserting genetic materials without a trace. He has also collaborated on coronavirus research with scientists from a center for lung studies at UNC-Chapel Hill who are knowledgeable about ENaC-alpha. In one 2016 study, the scientists created a new virus using the spike of a bat coronavirus that had been isolated and characterized by the Wuhan Institute of Virology. The experiment found that the new virus “replicated efficiently” in human airway cells that were cultured in a lab.

In another paper, published a year earlier, Baric, along with the Wuhan Institute of Virology’s Shi Zhengli and a lung expert at UNC-Chapel Hill’s lung institute, described creating a hybrid virus using a SARS-like virus from a bat and a “mouse-adapted” coronavirus. The new virus caused mice to get sicker than those exposed to the original virus. The goal of these experiments was to prepare for the possibility that a virus might jump naturally from animals to humans, as SARS had in 2003. But even before the pandemic, the experiment drew criticism from other scientists, who were concerned because the researchers had created a virus that was able to spread in humans.

Sachs and Harrison note that the scientists who co-authored the DARPA grant proposal would have been aware of research on coronavirus furin cleavage sites, including one 2006 experiment in which a furin cleavage site was inserted into a coronavirus. “The research team would also have some familiarity with the FCS sequence and the FCS-dependent activation mechanism of human ENaC, which was extensively characterized at UNC,” they write.

“The list of coincidences is getting verrrrrrrrrrry long.”

Still, both the overlap in the amino acid sequence and the fact that experts in the furin cleavage site of the ENaC-alpha and insertion of genetic material into bat coronaviruses work at the same university could be coincidental, as Harrison and Sachs acknowledge. Some virologists, though, say that the coincidence strains credulity.

“Could be,” Richard Ebright, a molecular biologist at Rutgers University, wrote in an email to The Intercept when asked about the possibility that these things are both chance occurrences. “But the list of coincidences is getting verrrrrrrrrrry long.”

Ebright, a proponent of investigating the origin of SARS-CoV-2 and of investigating both natural-spillover and research-related-spillover, whom Harrison and Sachs thank “for helpful commentary on the manuscript,” spelled out some of the other Covid coincidences that he considers questionable, including its initial outbreak in a city that, well before 2019, had already been pegged as a biosafety risk. Ebright also noted Wuhan’s 1,000-mile distance from the nearest wild bats that carry the type of SARS-related coronaviruses that caused the pandemic. And he pointed to the particular coding of the amino acids in the furin cleavage site of SARS-CoV2.

“The sequence encoding the FCS of the pandemic virus contained two consecutive CGG arginine codons,” Ebright explained in his email. (A codon, or a combination of three nucleotides, supplies the genetic code for a single amino acid, though most amino acids can be represented by multiple different codons. Each nucleotide is represented by a letter — for RNA, either A, C, U, or G.) “This codon usage is unusual for a natural bat SARS-related coronaviruses (for which fewer than 1 in 30 arginine codons are CGG) but is optimal for humans (for which most arginine codons are CGG codons).”

Still, Ebright said that at first he didn’t see the identical amino acid sequences as particularly suspicious. “I had known for more than a year that there was a perfect match to an eight-amino acid sequence present in human ENaC. What I had not known was that the sequence was known to be a functional furin cleavage site and that it was a sequence extensively studied at UNC,” he said. “The crucial point that the ENaC sequence was a known functional site, not just that there happens to be a match to a protein that happens to be in humans. … That suddenly turned it from what I thought to be largely irrelevant to being a logical and obvious choice to proceed.”

Ralph Baric and the University of North Carolina did not immediately respond to requests for comment.

Photo taken in Wuhan, China, on June 24, 2021, shows the Wuhan Institute of Virology. (Kyodo via AP Images) ==Kyodo

The Wuhan Institute of Virology in Wuhan, China, on June 24, 2021.

Photo: Kyodo via AP Images

Name Calling

Other scientists dismiss the idea that the ENaC sequence might have been purposefully inserted into a coronavirus. Scientists who are already convinced that the new coronavirus emerged naturally are unlikely to be persuaded by Sachs and Harrison’s article, which appears in the opinion section of the esteemed journal. Over the past year, many scientists involved in the debate over the origins of the pandemic have settled into an increasingly acrimonious, coarse, and unyielding opposition.

Some proponents of the natural origin theory became particularly dismissive of those open to the possibility of a lab leak after the February release of two pre-print studies mapping the early spread of the virus at the Huanan market in Wuhan. Angela Rasmussen, one of a team of virologists who worked on the project, described it on Twitter as “dispositive evidence of a zoonotic origin” that will “drive those with personal interest in the lab leak hypothesis out of their goddam minds.” In another tweet, Rasmussen referred to proponents of the lab-leak theory as a “pack of ghouls, who through gullibility, stupidity, & conspiracist thinking have decided this is their thing despite zero expertise.”

Although the pre-prints had not been peer-reviewed and may have simply illustrated the spread of the virus rather than its original outbreak, the New York Times ran a front-page story about them that quoted an epidemiologist as saying that the origins debate “has been settled with a very high degree of evidence.” The story, which was announced by a push notification from the paper, also noted a lack of direct evidence for a lab leak.

Meanwhile, Kristian Andersen, another co-author of the pre-prints and a virologist at the well-regarded Scripps Research Institute, used the “poop” emoji to criticize a deeply researched article by Katherine Eban about EcoHealth Alliance. On Twitter, Andersen tarred Eban, New York Times columnist Zeynep Tufekci, and others reporting on biosafety issues that could have led to the release of SARS-CoV-2 as “deep in conspiracy theories” and on the other side of “a clear split” from journalists who dismiss the possibility of a lab origin, whom Andersen referred to as “science-based.”

Even some scientists who have been vocal about the possibility that the pandemic may have been sparked by research have expressed skepticism about the theory suggested by Harrison and Sachs. “The pandemic virus might have been genetically engineered. However, this could have been done in various ways not limited to the specific theory by Harrison and Sachs. I’m not convinced that their hypothesis is the most plausible one,” said Alina Chan, a scientist who laid out a number of possible routes for how the coronavirus might have emerged through research-related incidents in her recent book “Viral: The Search for the Origin of Covid-19.”

“There’s no need for them to go hunting inside the human protein catalogue to look for cleavage sites to put into viruses.”

While she is open to the possibility that the furin cleavage site might have been purposefully inserted into the coronavirus, Chan said there was no reason to think that researchers would mine humans for such material. “These scientists literally had access to hundreds of SARS-like viruses and sequences,” said Chan, referring to the vast collection of coronaviruses from bats and other animals that researchers amassed at the Wuhan Institute of Virology. “There’s no need for them to go hunting inside the human protein catalogue to look for cleavage sites to put into viruses.”

Jack Nunberg, a virologist at the University of Montana, was also not immediately persuaded by the theory of engineering suggested by Sachs and Harrison. “It’s possible,” Nunberg said of the idea that the ENaC segment was inserted into a bat coronavirus as part of research designed to gauge the pandemic potential of a virus. “But I don’t find their evidence on ENaC compelling because furin cleavage sites have a lot of common amino acids, and therefore it may just have happened by chance.”

Others say that the article adds noteworthy information to the public conversation about the origins of the pandemic. “The defenders of the natural origin indicate that the virus on which this type of experiment could have been done — the backbone — has never been published and that specialists in the furin cleavage sites would have chosen a more commonly used furin cleavage site like RARR rather than PRRAR. The Proceedings of the National Academy of Sciences article contradicts this argument and indicates that specialists knew that the RRAR’SVAS site was efficiently cleaved by furin,” Etienne Decroly, director of virology research at the Aix-Marseille Université in France, wrote in an email to The Intercept.

Decroly added, “It is impossible to decide on the basis of the information currently available and it is urgent that the WHO Special Advisory Group for the Origins of Novel Pathogens investigate this question.”

On the suggestion of an investigation, Nunberg is in agreement. “You can’t argue with that,” he told The Intercept. “Who’s going to argue for burying one’s head in the sand?”

For their part, Sachs and Harrison emphasize that they’re not saying laboratory manipulation was involved in the emergence of the pandemic virus, only “that it could have been.” They also give a nod to other possibilities, including that an airborne virus might have infected a laboratory worker. Rather than argue that any of these conceivable scenarios happened, they present the clues of the matching amino acid sequences to argue for an independent and transparent scientific investigation of the U.S.-based evidence related to the origins of the virus.

Among the institutions that Sachs and Harrison list as possibly having “knowledge of the detailed activities that were underway in Wuhan and in the United States” are the National Institutes of Health; the Defense Threat Reduction Agency, which has provided grant funding to EcoHealth Alliance; the Department of Homeland Security; DARPA; the U.S. Agency for International Development, which funded the $200 million PREDICT program that catalogued potential pandemic viruses; and the University of California, Davis, which participated in that program.

The authors suggest that EcoHealth Alliance and UNC may have particularly important untapped resources. “The exact details of the fieldwork and laboratory work of the EHA-WIV-UNC partnership, and the engagement of other institutions in the US and China, has not been disclosed for independent analysis,” they write. “The precise nature of the experiments that were conducted, including the full array of viruses collected from the field and the subsequent sequencing and manipulation of those viruses, remains unknown.”

GettyImages-1230997557-covid-wuhan-peter-daszak-who

Peter Daszak, one of the members of the World Health Organization team investigating the origins of the Covid-19, on a balcony at a hotel in Wuhan, China, on Feb. 6, 2021.

Photo: Hector Retamal/AFP via Getty Images

A Reversal

The publication in the prestigious Proceedings of the National Academy of Sciences marks a reversal of sorts for Sachs, the chair of the Lancet Covid-19 Commission who, in November 2020, appointed Daszak, the EcoHealth Alliance president, to lead a task force to investigate the origins of the pandemic. Earlier that year, Daszak had signed on to a public statement published in The Lancet on behalf of scientists who said they “condemn conspiracy theories suggesting that COVID-19 does not have a natural origin.”

Yet that early certainty about the pandemic’s origins — and the sense of shared civic responsibility among members of the Lancet task force — soon disintegrated. In February 2021, emails revealed that Daszak coordinated the public statement in The Lancet tamping down suspicions of a lab leak. And by June 2021, Sachs was expressing his openness to the possibility of a lab origin, writing that NIH-funded research at the Wuhan Institute of Virology “deserves scrutiny under the hypothesis of a laboratory-related release of the virus.” Three months later, he disbanded the task force that had been organized to “carefully scrutinize the origin of the SARS-CoV-2 virus” in the hopes of preventing future disease outbreaks, explaining that he had concerns that several members of the commission had conflicts of interest because of their ties to EcoHealth Alliance.

After leading the mainstream scientific inquiry into the origins of the pandemic, Sachs is now skewering it. “A steady trickle of disquieting information has cast a darkening cloud over the agency,” he and Harrison write of the NIH, going on to accuse the entire federal government of not doing enough to explore the possible role of its grantees in the emergence of SARS-CoV-2 and investigate “overlooked details” such as the matching amino acid sequences.

Noting that the NIH has insisted that “the pandemic virus could not have resulted from the work sponsored by” the agency, Sachs and Harrison write that “blanket denials from the NIH are no longer good enough.”

Update: May 19, 2022

This article has been updated to clarify the opinions expressed by Richard Ebright and Alina Chan.

The post Jeffrey Sachs Presents Evidence of Possible Lab Origin of Covid-19 appeared first on The Intercept.

19 May 21:15

5/19/22: GOP & Dem Primary Results, DHS Board, Baby Formula, NATO Disparity, Dem Civil War, George Bush, & Peter Zeihan Interview!

Tom Roche

[sigh/] 8th/penultimate segment with alleged-geopolitics-expert Peter Zeihan (formerly Stratfor--need I say more) is probably the dumbest thing Breaking Points (possibly even Rising) has ever presented. Zeihan starts with the kind of natalist depopulation nonsense for which Ball and Enjeti have gotten all-too-fond. He then makes the bizarre claim that the Russia-Ukraine war (RUW) is 'taking offline' Russian bulk resources--not just that the EU is depriving itself of Russian 'commodities', but that *no one* outside Russia--and specifically PRC--will be able to consume them. Zeihan literally claims that the RUW is gonna force the PRC back to an agricultural economy: he ends segment with a long claim that Belt-and-Road is evidence of PRC industrial decline. Why won't the PRC (and India, rest of south Asia, rest of east Asia (including Japan, which Zeihan of course claims is an economic basketcase), Iran and central Asia, fill in the blanks) be able to trade with Russia? Ball and Enjeti never ask, Zeihan never tells. It's literally ridiculous.

Krystal and Saagar talk about the Dem and GOP primary results, GOP Gov nominee in PA, Madison Cawthorn losing, DHS board shutting down, Baby formula action from Biden, NATO countries free riding, Democrats civil war, and an interview on geopolitics with Peter Zeihan.


To become a Breaking Points Premium Member and watch/listen to the show uncut and 1 hour early visit: https://breakingpoints.supercast.com/


To listen to Breaking Points as a podcast, check them out on Apple and Spotify


Apple: https://podcasts.apple.com/us/podcast/breaking-points-with-krystal-and-saagar/id1570045623 


Spotify: https://open.spotify.com/show/4Kbsy61zJSzPxNZZ3PKbXl 


Merch: https://breaking-points.myshopify.com/


Peter Zeihan: https://bookshop.org/books/the-end-of-the-world-is-just-the-beginning-mapping-the-collapse-of-globalization/9780063230477 

Learn more about your ad choices. Visit megaphone.fm/adchoices

19 May 15:14

Mike Driscoll: How to Create a Command-line Application with argparse

Tom Roche

good, detailed article on commandline argument-parsing in Python (esp why to use `argparse` over `sys.argv`)

When you are creating an application, you will usually want to be able to tell your application how to do something. There are two popular methods for accomplishing this task. You can make your application accept command-line arguments or you can create a graphical user interface. Some applications support both.

Command-line interfaces are helpful when you need to run your code on a server. Most servers do not have a monitor hooked up, especially if they are Linux servers. In those cases, you might not be able to run a graphical user interface even if you wanted to.

Python comes with a built-in library called argparse that you can use to create a command-line interface. In this article, you will learn about the following:

  • Parsing Arguments
  • Creating Helpful Messages
  • Adding Aliases
  • Using Mutually Exclusive Arguments
  • Creating a Simple Search Utility

There is a lot more to the argparse module than what will be covered in this article. If you would like to know more about it, you can check out the documentation.

Now it's time to get started with parsing arguments from the command-line!

Parsing Arguments

Before you learn how to use argparse, it's good to know that there is another way to pass arguments to a Python script. You can pass any arguments to a Python script and access those arguments by using the sys module.

To see how that works, create a file named sys_args.py and enter the following code into it:

# sys_args.py

import sys

def main():
    print('You passed the following arguments:')
    print(sys.argv)

if __name__ == '__main__':
    main()

This code imports sys and prints out whatever is in sys.argv. The argv attribute contains a list of everything that was passed to the script with the first item being the script itself.

Here's an example of what happens when you run this code along with a couple of sample arguments:

$ python3 sys_args.py --s 45
You passed the following arguments:
['sys_args.py', '--s', '45']

The problem with using sys.argv is that you have no control over the arguments that can be passed to your application:

  • You can't ignore arguments
  • You can't create default arguments
  • You can't really tell what is a valid argument at all

This is why using argparse is the way to go when working with Python's standard library. The argparse module is very powerful and useful. Let's think about a common process that a command line application follows:

  • pass in a file
  • do something to that file in your program
  • output the result

Here is a generic example of how that might work. Go ahead and create file_parser.py and add the following code:

# file_parser.py

import argparse

def file_parser(input_file, output_file=''):
    print(f'Processing {input_file}')
    print('Finished processing')
    if output_file:
        print(f'Creating {output_file}')

def main():
    parser = argparse.ArgumentParser('File parser')
    parser.add_argument('--infile', help='Input file')
    parser.add_argument('--out', help='Output file')
    args = parser.parse_args()
    if args.infile:
        file_parser(args.infile, args.out)

if __name__ == '__main__':
    main()

The file_parser() function is where the logic for the parsing would go. For this example, it only takes in a file name and prints it back out. The output_file argument defaults to an empty string.

The meat of the program is in main() though. Here you create an instance of argparse.ArgumentParser() and give your parser a name. Then you add two arguments, --infile and --out. To use the parser, you need to call parse_args(), which will return whatever valid arguments were passed to your program. Finally, you check to see if the user used the --infile flag. If they did, then you run file_parser().

Here is how you might run the code in your terminal:

$ python file_parser.py --infile something.txt
Processing something.txt
Finished processing

Here you run your script with the --infile flag along with a file name. This will run main() which in turns calls file_parser().

The next step is to try your application using both command-line arguments you declared in your code:

$ python file_parser.py --infile something.txt --out output.txt
Processing something.txt
Finished processing
Creating output.txt

This time around, you get an extra line of output that mentions the output file name. This represents a branch in your code logic. When you specify an output file, you can have your code go through the process of generating that file using a new block of code or a function. If you do not specify an output file, then that block of code would not run.

When you create your command-line tool using argparse, you can easily add messages that help your users when they are unsure of how to correctly interact with your program.

Now it's time to find out how to get help from your application!

Creating Helpful Messages

The argparse library will automatically create a helpful message for your application using the information that you provided when you create each argument. Here is your code again:

# file_parser.py

import argparse

def file_parser(input_file, output_file=''):
    print(f'Processing {input_file}')
    print('Finished processing')
    if output_file:
        print(f'Creating {output_file}')

def main():
    parser = argparse.ArgumentParser('File parser')
    parser.add_argument('--infile', help='Input file')
    parser.add_argument('--out', help='Output file')
    args = parser.parse_args()
    if args.infile:
        file_parser(args.infile, args.out)

if __name__ == '__main__':
    main()

Now try running this code with the -h flag and you should see the following:

$ file_parser.py -h
usage: File parser [-h] [--infile INFILE] [--out OUT]

optional arguments:
  -h, --help       show this help message and exit
  --infile INFILE  Input file
  --out OUT        Output file

The help parameter to add_argument() is used to create the help message above. The -h and --help options are added automatically by argparse. You can make your help more informative by giving it a description and an epilog.

Let's use them to improve your help messages. Start by copying the code from above into a new file named file_parser_with_description.py, then modify it to look like this:

# file_parser_with_description.py

import argparse

def file_parser(input_file, output_file=''):
    print(f'Processing {input_file}')
    print('Finished processing')
    if output_file:
        print(f'Creating {output_file}')

def main():
    parser = argparse.ArgumentParser(
            'File parser',
            description='PyParse - The File Processor',
            epilog='Thank you for choosing PyParse!',
            )
    parser.add_argument('--infile', help='Input file for conversion')
    parser.add_argument('--out', help='Converted output file')
    args = parser.parse_args()
    if args.infile:
        file_parser(args.infile, args.out)

if __name__ == '__main__':
    main()

Here you pass in the description and epilog arguments to ArgumentParser. You also update the help arguments to add_argument() to be more descriptive.

When you run this script with -h or --help after making these changes, you will see the following output:

$ python file_parser_with_description.py -h
usage: File parser [-h] [--infile INFILE] [--out OUT]

PyParse - The File Processor

optional arguments:
  -h, --help       show this help message and exit
  --infile INFILE  Input file for conversion
  --out OUT        Converted output file

Thank you for choosing PyParse!

Now you can see the new description and epilog in your help output. This gives your command-line application some extra polish.

You can also disable help entirely in your application via the add_help argument to ArgumentParser. If you think that your help text is too wordy, you can disable it like this:

# file_parser_no_help.py

import argparse

def file_parser(input_file, output_file=''):
    print(f'Processing {input_file}')
    print('Finished processing')
    if output_file:
        print(f'Creating {output_file}')

def main():
    parser = argparse.ArgumentParser(
            'File parser',
            description='PyParse - The File Processor',
            epilog='Thank you for choosing PyParse!',
            add_help=False,
            )
    parser.add_argument('--infile', help='Input file for conversion')
    parser.add_argument('--out', help='Converted output file')
    args = parser.parse_args()
    if args.infile:
        file_parser(args.infile, args.out)

if __name__ == '__main__':
    main()

By setting add_help to False, you are disabling the -h and --help flags.

You can see this demonstrated below:

$ python file_parser_no_help.py --help
usage: File parser [--infile INFILE] [--out OUT]
File parser: error: unrecognized arguments: --help

In the next section, you'll learn about adding aliases to your arguments!

Adding Aliases

An alias is a fancy word for using an alternate flag that does the same thing. For example, you learned that you can use both -h and --help to access your program's help message. -h is an alias for --help, and vice-versa

Look for the changes in the parser.add_argument() methods inside of main():

# file_parser_aliases.py

import argparse

def file_parser(input_file, output_file=''):
    print(f'Processing {input_file}')
    print('Finished processing')
    if output_file:
        print(f'Creating {output_file}')

def main():
    parser = argparse.ArgumentParser(
            'File parser',
            description='PyParse - The File Processor',
            epilog='Thank you for choosing PyParse!',
            add_help=False,
            )
    parser.add_argument('-i', '--infile', help='Input file for conversion')
    parser.add_argument('-o', '--out', help='Converted output file')
    args = parser.parse_args()
    if args.infile:
        file_parser(args.infile, args.out)

if __name__ == '__main__':
    main()

Here you change the first add_argument() to accept -i in addition to --infile and you also added -o to the second add_argument(). This allows you to run your code using two new shortcut flags.

Here's an example:

$ python3 file_parser_aliases.py -i something.txt -o output.txt
Processing something.txt
Finished processing
Creating output.txt

If you go looking through the argparse documentation, you will find that you can add aliases to subparsers too. A subparser is a way to create sub-commands in your application so that it can do other things. A good example is Docker, a virtualization or container application. It has a series of commands that you can run under docker as well as docker compose and more. Each of these commands has separate sub-commands that you can use.

Here is a typical docker command to run a container:

docker exec -it container_name bash

This will launch a container with docker. Whereas if you were to use docker compose, you would use a different set of commands. The exec and compose are examples of subparsers.

The topic of subparsers are outside the scope of this tutorial. If you are interested in more details dive right into the documentation.

Using Mutually Exclusive Arguments

Sometimes you need to have your application accept some arguments but not others. For example, you might want to limit your application so that it can only create or delete files, but not both at once.

The argparse module provides the add_mutually_exclusive_group() method that does just that!

Change your two arguments to be mutually exclusive by adding them to a group object like in the example below:

# file_parser_exclusive.py

import argparse

def file_parser(input_file, output_file=''):
    print(f'Processing {input_file}')
    print('Finished processing')
    if output_file:
        print(f'Creating {output_file}')

def main():
    parser = argparse.ArgumentParser(
            'File parser',
            description='PyParse - The File Processor',
            epilog='Thank you for choosing PyParse!',
            add_help=False,
            )
    group = parser.add_mutually_exclusive_group()
    group.add_argument('-i', '--infile', help='Input file for conversion')
    group.add_argument('-o', '--out', help='Converted output file')
    args = parser.parse_args()
    if args.infile:
        file_parser(args.infile, args.out)

if __name__ == '__main__':
    main()

First, you created a mutually exclusive group. Then, you added the -i and -o arguments to the group instead of to the parser object. Now these two arguments are mutually exclusive.

Here is what happens when you try to run your code with both arguments:

$ python3 file_parser_exclusive.py -i something.txt -o output.txt
usage: File parser [-i INFILE | -o OUT]
File parser: error: argument -o/--out: not allowed with argument -i/--infile

Running your code with both arguments causes your parser to show the user an error message that explains what they did wrong.

After covering all this information related to using argparse, you are ready to apply your new skills to create a simple search tool!

Creating a Simple Search Utility

Before starting to create an application, it is always good to figure out what you are trying to accomplish. The application you want to build in this section should be able to search for files of a specific file type. To make it more interesting, you can add an additional argument that allows you to optionally search for specific file sizes as well.

You can use Python's glob module for searching for file types. You can read all about this module here:

There is also the fnmatch module, which glob itself uses. You should use glob for now as it is easier to use, but if you're interested in writing something more specialized, then fnmatch may be what you are looking for.

However, since you want to be able to optionally filter the files returned by the file size, you can use pathlib which includes a glob-like interface. The glob module itself does not provide file size information.

You can start by creating a file named pysearch.py and entering the following code:

# pysearch.py

import argparse
import pathlib


def search_folder(path, extension, file_size=None):
    """
    Search folder for files
    """
    folder = pathlib.Path(path)
    files = list(folder.rglob(f'*.{extension}'))

    if not files:
        print(f'No files found with {extension=}')
        return

    if file_size is not None:
        files = [
                f
                for f in files
                if f.stat().st_size >= file_size
                ]

    print(f'{len(files)} *.{extension} files found:')
    for file_path in files:
        print(file_path)

You start the code snippet above by importing argparse and pathlib. Next you create the search_folder() function which takes in three arguments:

  • path - The folder to search within
  • extension - The file extension to look for
  • file_size - What file size to filter on in bytes

You turn the path into a pathlib.Path object and then use its rglob() method to search in the folder for the extension that the user passed in. If no files are found, you print out a meaningful message to the user and exit.

If any files are found, you check to see whether file_size has been set. If it was set, you use a list comprehension to filter out the files that are smaller than the specified file_size.

Next, you print out the number of files that were found and finally loop over these files to print out their names.

To make this all work correctly, you need to create a command-line interface. You can do that by adding a main() function that contains your argparse code like this:

def main():
    parser = argparse.ArgumentParser(
            'PySearch',
            description='PySearch - The Python Powered File Searcher',
            )
    parser.add_argument('-p', '--path',
                        help='The path to search for files',
                        required=True,
                        dest='path')
    parser.add_argument('-e', '--ext',
                        help='The extension to search for',
                        required=True,
                        dest='extension')
    parser.add_argument('-s', '--size',
                        help='The file size to filter on in bytes',
                        type=int,
                        dest='size',
                        default=None)

    args = parser.parse_args()
    search_folder(args.path, args.extension, args.size)

if __name__ == '__main__':
    main()

This ArgumentParser() has three arguments added to it that correspond to the arguments that you pass to search_folder(). You make the --path and --ext arguments required while leaving the --size argument optional. Note that the --size argument is set to type=int, which means that you cannot pass it a string.

There is a new argument to the add_argument() function. It is the dest argument which you use to tell your argument parser where to save the arguments that are passed to them.

Here is an example run of the script:

$ python3 pysearch.py -p /Users/michael/Dropbox/python101code/chapter32_argparse -e py -s 650
6 *.py files found:
/Users/michael/Dropbox/python101code/chapter32_argparse/file_parser_aliases2.py
/Users/michael/Dropbox/python101code/chapter32_argparse/pysearch.py
/Users/michael/Dropbox/python101code/chapter32_argparse/file_parser_aliases.py
/Users/michael/Dropbox/python101code/chapter32_argparse/file_parser_with_description.py
/Users/michael/Dropbox/python101code/chapter32_argparse/file_parser_exclusive.py
/Users/michael/Dropbox/python101code/chapter32_argparse/file_parser_no_help.py

That worked quite well! Now try running it with -s and a string:

$ python3 pysearch.py -p /Users/michael/Dropbox/python101code/chapter32_argparse -e py -s python
usage: PySearch [-h] -p PATH -e EXTENSION [-s SIZE]
PySearch: error: argument -s/--size: invalid int value: 'python'

This time, you received an error because -s and --size only accept integers. Go try this code on your own machine and see if it works the way you want when you use -s with an integer.

Here are some ideas you can use to improve your version of the code:

  • Handle the extensions better. Right now it will accept *.py which won't work the way you might expect
  • Update the code so you can search for multiple extensions at once
  • Update the code to filter on a range of file sizes (Ex. 1 MB - 5MB)

There are lots of other features and enhancements you can add to this code, such as adding error handling or unittests.

Wrapping Up

The argparse module is full featured and can be used to create great, flexible command-line applications. In this chapter, you learned about the following:

  • Parsing Arguments
  • Creating Helpful Messages
  • Adding Aliases
  • Using Mutually Exclusive Arguments
  • Creating a Simple Search Utility

You can do a lot more with the argparse module than what was covered in this chapter. Be sure to check out the documentation for full details. Now go ahead and give it a try yourself. You will find that once you get the hang of using argparse, you can create some really neat applications!

The post How to Create a Command-line Application with argparse appeared first on Mouse Vs Python.