<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://www.robnagler.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://www.robnagler.com/" rel="alternate" type="text/html" /><updated>2026-03-08T17:30:01+00:00</updated><id>https://www.robnagler.com/feed.xml</id><title type="html">Rob Nagler</title><entry><title type="html">BookNotes: Nobody’s Girl: A Memoir of Surviving Abuse and Fighting for Justice</title><link href="https://www.robnagler.com/2025/12/13/Nobodys-Girl.html" rel="alternate" type="text/html" title="BookNotes: Nobody’s Girl: A Memoir of Surviving Abuse and Fighting for Justice" /><published>2025-12-13T15:00:00+00:00</published><updated>2025-12-13T15:00:00+00:00</updated><id>https://www.robnagler.com/2025/12/13/Nobodys-Girl</id><content type="html" xml:base="https://www.robnagler.com/2025/12/13/Nobodys-Girl.html"><![CDATA[<p>By Virginia Roberts Giuffre, Knopf, October 21, 2025</p>

<p>A very intense book, which I found easy to read. I couldn’t put it
down. It moves fast and covers so many important topics from her life
in the present day to the horrors of her past.</p>

<p>The book was written by <a href="https://www.amy-wallace.com">Amy Wallace</a> and
publish after Virginia killed herself. The introduction covers why,
which was helpful to me. Otherwise, it would have been a lingering
question while reading the book.</p>

<p>Sexual abuse is horrid. I know people who have been abused. All of
them struggle with it. One might think Virginia’s case is unusual, but
I don’t think so. I think human trafficking and sexual abuse are all
too common today. AI generated porn will probably only make it
worse. Abusers can never get enough as was the case with Jeffrey
Epstein who abused hundreds (thousands?) of women.</p>

<p>This book is a must-read. It may help people who have been abused to
heal. And, it will keep present what Virginia went through.</p>

<blockquote>
  <p>[k93] I want to say explicitly why Virginia opted not to stay silent,
which certainly would have been easier for her. From the beginning, she
told me she believed that her story would help other people–not just
survivors of Epstein’s cruelty, but any person, male or female, who’d
ever been coerced into sex against his or her will.</p>
</blockquote>

<blockquote>
  <p>[k162] Because despite the unspeakable cruelties she’d endured throughout
her life, Virginia opted to keep her heart open and, whenever possible,
to lead with love.</p>
</blockquote>

<blockquote>
  <p>[k175] “Life is not a private affair. A story and its lessons are only
made useful if shared.” Dan Millman, Way of the Peaceful Warrior
FIXME</p>
</blockquote>

<blockquote>
  <p>[k209] My breath catches, and the familiar thrum of a panic attack rolls
over me. Even as a child, I never liked to cause a scene. I would rather
envelop my pain, holding the turmoil in my chest, instead of risking more
danger by screaming and letting it out. So I stay quiet, trying to soothe
myself.</p>

  <blockquote>
    <p>[k212] I look down at my pretty fingernails–freshly manicured and
painted a glossy ivory. I read the bracelet on my left wrist, a gift from
a dear friend, that spells out “B-A-D-A-S-S” in lettered beads. I take
one careful step and then another. My stomach churns, but I keep going.
“Please,” I beg without speaking. “Please don’t let me faint in this
exquisite place.” I find a bench and sit, looking around for exit signs.
“I can make it,” I tell myself–a mantra I’ve relied on so many times
before. I know from experience that I should not yet try to run.</p>
  </blockquote>
</blockquote>

<blockquote>
  <p>[k362] When you grow up female, danger is everywhere. I’ve known that for
as long as I can remember.</p>
</blockquote>

<blockquote>
  <p>[k784] Every night, as I lay in my bed, dreading the now-familiar creak
of the door, I tried to remember a time when I’d been more than nothing.
I longed to be worth something again.</p>
</blockquote>

<blockquote>
  <p>[k950] I know this is a lot to take in. The violence. The neglect. The
bad decisions. The self-harm. Imagine if a trauma reel like this played
in your head all the time, as it does in mine, and not just on the pages
of a book you can put down if you need to, just for a moment, to steady
your nerves. But please don’t stop reading. I know exactly how to help
you get through these tough parts, just as I help myself: by focusing on
the present.</p>
</blockquote>

<blockquote>
  <p>[k1279] From the start, they manipulated me into participating in
behaviors that ate away at me, eroding my ability to comprehend reality
and preventing me from defending myself. From the start, I was groomed to
be complicit in my own devastation. Of all the terrible wounds they
inflicted, that forced complicity was the most destructive.</p>
</blockquote>

<blockquote>
  <p>[k1306] How can you complain about being abused, some have asked, when
you could so easily have stayed away? If you didn’t like feeling dirty,
you could simply have never gone back. But that stance wrongly discounts
what many of us had been through before we encountered Epstein, as well
as how good he was at spotting girls whose wounds made them vulnerable to
him.</p>
</blockquote>

<blockquote>
  <p>[k1311] A master manipulator who excelled at divining the desires of
others, he threw what looked like a lifeline to girls who were drowning,
girls who had nothing, girls who wished to be and do better.</p>
</blockquote>

<blockquote>
  <p>[k3999] Please don’t hear this as a plea for sympathy. No one ever
promised me that challenging my abusers would be easy.</p>
</blockquote>

<blockquote>
  <p>[k4402] For example, CHILD USA, a nonprofit focused on child-abuse
prevention, conducted a study of thousands of abuse victims who had been
Boy Scouts; only half of those came forward before they were fifty. More
and more, the public was coming to understand that being sexually abused
as a child could take decades to process. And it could take even longer
than that for a victim to imagine speaking publicly about that experience
and naming his or her abuser.</p>
</blockquote>

<blockquote>
  <p>[k4696] In the email, renowned computer scientist Richard Stallman
suggested that I had been a willing participant in my encounter with
Minsky. Stallman questioned whether Minsky “applied force or violence”
and seemed to be arguing that if he did not, I must have opted in. “The
most plausible scenario is that she presented herself to him as entirely
willing,” Stallman wrote of me.</p>
</blockquote>

<blockquote>
  <p>[k4704] Just as Stallman defended Minsky, many friends and colleagues of
MIT Media Lab director Joichi Ito defended him after it was revealed that
he had cultivated a close (and lucrative) relationship with Epstein.</p>
</blockquote>

<blockquote>
  <p>[k4715] “I did not like that he had meetings with Jeffrey Epstein, no. I
made that clear to him,” Melinda would tell King, adding that she herself
met with Epstein “exactly one time” because she “wanted to see who this
man was.” Her reaction: “I regretted it the second I walked in the door.
He was abhorrent. He was evil personified. My heart breaks for these
women.”</p>
</blockquote>

<blockquote>
  <p>[k5224] “And that’s true of every woman who ever complained about any
kind of harassment,” Maitlis, played by the actress Ruth Wilson,
continues. “Always uphill. Always against the tide. Always a battle
against the unspoken. You know, the look in their eyes that says,
‘Really? Did he really?’…When I sat down with Prince Andrew, I was only
ever hoping to ask the right questions. I didn’t know how he’d be or what
he’d say. But it was the arrogance. The entitlement. He just couldn’t
help himself. You know, the way that certain men, whatever their
sickness, assume certain rights without ever giving it a second thought.
Their want. Their need. Their impulse.”</p>
</blockquote>

<blockquote>
  <p>[k5260] you’ve read this far, I hope my story has moved you–to seek ways
to free yourself from a bad situation, say, to stand up for someone else
in need, or to simply reframe how you judge victims of sexual abuse. Each
one of us can make positive change.</p>
</blockquote>]]></content><author><name></name></author><summary type="html"><![CDATA[By Virginia Roberts Giuffre, Knopf, October 21, 2025]]></summary></entry><entry><title type="html">BookNotes: A Fever in the Heartland: The Ku Klux Klan’s Plot to Take Over America, and the Woman Who Stopped Them</title><link href="https://www.robnagler.com/2025/09/13/Fever-in-Heartland.html" rel="alternate" type="text/html" title="BookNotes: A Fever in the Heartland: The Ku Klux Klan’s Plot to Take Over America, and the Woman Who Stopped Them" /><published>2025-09-13T15:00:00+00:00</published><updated>2025-09-13T15:00:00+00:00</updated><id>https://www.robnagler.com/2025/09/13/Fever-in-Heartland</id><content type="html" xml:base="https://www.robnagler.com/2025/09/13/Fever-in-Heartland.html"><![CDATA[<p>By Timothy Egan, Viking, April 4, 2023</p>

<p>I finished this book at 4 a.m. That’s the endorsement. Read this book
if you think we live in a divisive and violent time. The KKK knew how
to sow real division. In the 1920’s, the KKK saw huge growth by
dividing people and constant violence.</p>

<p>At times the book reads like a historical novel. That’s why I couldn’t
put it down at the end. I had to find out how it happened. I knew the
conclusion from the subtitle, but I wanted to see how the trial played
out.</p>

<p>The heroes: Madge Oberholtzer, Patrick O’Donnell, George Dale, Rabbi
Feuerlicht, William REmy, and many others. I was going to name the
villain, but that just gives fame to the villain.</p>

<p>To me this quote from the book summarizes the real villain:</p>

<blockquote>
  <p>A vein of hatred was always there for the tapping. It’s there still,
and explains much of the madness threatening American life a hundred
years [later]. The Grand Dragon was a symptom, not a cause, of an
age that has been mischaracterized as one of Gatsby frivolity and
the mayhem of modernism.</p>
</blockquote>

<p>It’s a painful read. The subjugation of large parts of our society
through Jim Crow laws, mob violence, and daily shunning is hard to
read for me. I realize that’s trite, because people had to live it but
I live in different times. I can’t imagine what it was like to live
then even after having read very clearly what it was like.</p>

<blockquote>
  <p>[k111] Hoosiers were joiners. And in 1925, if you were not a knight of
the KKK, you did not belong.</p>
</blockquote>

<blockquote>
  <p>[k112] The Klan owned the state, and Stephenson owned the Klan. Cops,
judges, prosecutors, ministers, mayors, newspaper editors–they all
answered to the Grand Dragon.</p>
</blockquote>

<blockquote>
  <p>[k119] In the golden age of fraternal organizations, the Klan was the
largest and most powerful of the secret societies among American
men–bigger by far than the Odd Fellows, the Elks, or the Freemasons, and
vastly greater in number than the original Klan born in violence just
after the Civil War.</p>
</blockquote>

<blockquote>
  <p>[k193] A handful of Hoosiers were heroic–two rabbis, an African American
publisher born enslaved, a fearless Catholic lawyer, a small-town editor
repeatedly beaten and thrown in jail, a lone prosecutor. They were aided
by a gifted man of letters, a Black poet and Broadway composer who forced
an epic national political realignment with his eloquent defiance.</p>
</blockquote>

<blockquote>
  <p>[k292] Johnson, sworn in six weeks after Lincoln began his second term,
would have none of his predecessor’s vision. He ignored pleas from civil
authorities to go after the Klan, and he urged Southern politicians to
balk at expanding the Constitution.</p>
</blockquote>

<blockquote>
  <p>[k293] “Everyone would and must admit that the white race was superior
to the Black,” he said. He vetoed the Civil Rights Act of 1866, a
legislative attempt to extend real power to the formerly enslaved, but
was overridden by a strong majority in Congress.</p>
</blockquote>

<blockquote>
  <p>[k297] Violence escalated: lynching, arson, beatings, a reign of
orchestrated bloodshed for the last three years of Johnson’s chaotic
term.</p>
</blockquote>

<blockquote>
  <p>[k301] We are the law itself–the same boast would be heard in Indiana,
fifty years later, taking flight through the revelations of Madge
Oberholtzer.</p>
</blockquote>

<blockquote>
  <p>[k307] Grant promised to smash the Klan. There was nothing gallant or
noble about these midnight marauders. The president saw them for what
they were: killers in bedsheets who were “trying to reduce the colored
people to a condition closely akin to that of slavery,” he said.</p>
</blockquote>

<blockquote>
  <p>[k316] The enemy was “the most atrocious organization that the civilized
part of the world has ever known,” Grant’s Justice Department declared.
After Congress handed him the tools he needed, the president used the Ku
Klux Klan Acts to hammer the hooded order.</p>
</blockquote>

<blockquote>
  <p>[k321] Acknowledging defeat, the Klan formally disbanded under an order
from Forrest. He burned all records.</p>
</blockquote>

<blockquote>
  <p>[k380] Evansville was ripe for the Klan, the perfect place to plant the
flag in the North for the second coming of the Invisible Empire. And D.
C. Stephenson was the ideal missionary.</p>
</blockquote>

<blockquote>
  <p>[k402] One month after the attack on the bellhop, the Klan held a large
parade in downtown Dallas, marching with banners that read “Pure
Womanhood, Our Little Girls Must Be Protected” and “One Hundred Percent
American.”</p>
</blockquote>

<blockquote>
  <p>[k405] And the abduction and near killing of Alex Johnson? “As I
understand the case, the Negro was guilty of doing something which he had
no right to do,” said Sheriff Dan Harston. “There will be no
investigation by my department. He no doubt deserved it.”</p>
</blockquote>

<blockquote>
  <p>[k414] The Democrat, Samuel J. Tilden, won the popular vote but fell
short in the Electoral College because three states were in dispute. The
courts handed the mess off to Congress, which appointed a commission to
decide the outcome. As a bargaining chip to get him over the line,
Republican Rutherford B. Hayes promised to withdraw federal troops from
obstructionist Southern states. In return, he won the highest office in
the land by a single electoral vote. His presidency marked the close of
Reconstruction and ushered in nearly ninety years of disenfranchisement
and segregation for millions of American citizens. Shortly thereafter,
Tennessee passed the nation’s first Jim Crow law, separating passengers
on rail cars by skin color.</p>
</blockquote>

<blockquote>
  <p>[k423] With the abolition of slavery, Black people were no longer counted
as three-fifths but as a full person in the census. Ultimately, that gave
twenty-five additional congressional seats to a one-party South that
violently suppressed the vote of those newly recognized people.</p>
</blockquote>

<blockquote>
  <p>[k425] In 1880, 50 percent of Black men in the former Confederacy
voted. By 1920, less than 1 percent exercised this fundamental right.</p>
</blockquote>

<blockquote>
  <p>[k489] But what really drove the pair of promoters into the arms of the
twentieth-century Klan founder was money. In 1920, Clarke and Tyler cut a
deal with Simmons, granting them a significant share of every new
membership. The best way to make their fortune, they realized, was to
incentivize local recruiters on the ground by giving them a cut as well.</p>
</blockquote>

<blockquote>
  <p>[k492] In barely a year’s time, the number of Klansmen went from 3,000
to 100,000.</p>
</blockquote>

<blockquote>
  <p>[k492] In barely a year’s time, the number of Klansmen went from 3,000
to 100,000.</p>
</blockquote>

<blockquote>
  <p>[k517] All it took was a small bribe and a bit of Bible talk. The
constituency was vast. Evansville alone had seventy-two Protestant
churches. In short order, he paid off a dozen or so ministers to
evangelize on behalf of the Klan, spreading the word of hate along with
the word of God.</p>
</blockquote>

<blockquote>
  <p>[k526] In the America of 1922, fear of others generated a lot of anxious
energy. This collective unease had only to be corralled, sanctified, and
monetized.</p>
</blockquote>

<blockquote>
  <p>[k535] Violet had tried to make the union work, though her husband was
constantly cheating on her and made no secret of it. He said he could get
any woman he wanted with the snap of his fingers.</p>
</blockquote>

<blockquote>
  <p>[k584] Suddenly, members of the Horse Thief Detective Association were
breaking up parties and smashing liquor joints. They blocked roads,
searching vehicles for bottles, rousting those in passionate embrace.
They invaded private homes, looking for alcohol or card-playing. They
harassed businesses that opened on Sunday. They served as armed marshals
at Klan parades, taking over public streets, directing traffic, menacing
the occasional malcontent who booed at the men in white robes.</p>
</blockquote>

<blockquote>
  <p>[k604] At the close of three days of testimony, following a long and
impassioned soliloquy, Simmons stood and pointed his finger at his
congressional interrogators–they were the ones who should be shamed for
going after the family men of his organization. “I call upon the Father
to forgive those who have persecuted the Klan!” he shouted. And with
that, he fainted and fell to the ground. The politicians folded. Simmons
believed the hearing was the best thing that ever happened to the hooded
order. “It wasn’t until the newspapers began to attack the Klan that it
really grew,” he said. “And then Congress gave us the best advertising we
ever got.” Over the next year, the Klan expanded by 1.1 million members.</p>
</blockquote>

<blockquote>
  <p>[k638] That $10 initiation fee was more than the average factory worker
made in a day. Plus, there were quarterly dues and uniform requirements.
Stephenson got his cut of everything.</p>
</blockquote>

<blockquote>
  <p>[k644] The Birth of a Nation had done well in the North, just as D. W.
Griffith envisioned it would.</p>
</blockquote>

<blockquote>
  <p>[k650] At the end of the movie, the words of a title card filled the
screen: The former enemies of North and South are united again in common
defence of their Aryan birthright.</p>
</blockquote>

<blockquote>
  <p>[k679] By year’s end, Stephenson had accomplished something that the
initial Klan had not: his vigilantes were part of the system. They
operated freely and openly, and their crimes were not punished, just as
in Texas.</p>
</blockquote>

<blockquote>
  <p>[k687] The talented D. C. Stephenson had proved to be quite the prodigy,
as he said so himself.</p>
</blockquote>

<blockquote>
  <p>[k689] He discovered that if he said something often enough, no matter
how untrue, people would believe it.</p>
</blockquote>

<blockquote>
  <p>[k697] expectations. Now he promised to work the same magic in Michigan,
Kansas,</p>
</blockquote>

<blockquote>
  <p>[k712] For a majority of Dallas officers were now oath-bound members of
the hooded order–proof of Malcolm X’s later observation that the Klan
had “changed its bed sheets for a policeman’s uniform.”</p>
</blockquote>

<blockquote>
  <p>[k835] “The strongest argument in favor of prohibition is the imperative
necessity of keeping whiskey out of the reckless colored element,” said
the state’s leading dry newspaper, the Patriot Phalanx. “The Negro,
fairly docile and industrious, becomes, when filled with liquor,
turbulent and dangerous and a menace to life, property and the repose of
the community,” another paper wrote.</p>
</blockquote>

<blockquote>
  <p>[k857] Turning to other enemies, Barr said it was well known that the
Roman Catholic Church was training “,000 Negroes” to be priests.</p>
</blockquote>

<blockquote>
  <p>[k1033] What was not in dispute was the role of one town, in a state that
tried to censure human pleasure, in bringing big-time recorded jazz to
the world. Known as Harmony Hollow, Richmond was the only place between
New York and San Francisco with a decent recording studio. The Gennett
brothers, from Italian immigrant stock, ran the large Starr Piano
Company.</p>
</blockquote>

<blockquote>
  <p>[k1039] They also signed and promoted artists who were shunned by other
studios. Jazz came to them in 1923 and would be sold on the Gennett
label. So-called race records, though marketed to Black consumers, were
showing a large crossover appeal.</p>
</blockquote>

<blockquote>
  <p>[k1044] In late afternoon, about 6,000 hooded men assembled in a park a
mile away.</p>
</blockquote>

<blockquote>
  <p>[k1060] Armstrong was still new to lovers of music beyond a few precincts
of New Orleans and Chicago, and new to the North by only a year. But when
the disc he recorded in Richmond was released, he belonged to the ages.</p>
</blockquote>

<blockquote>
  <p>[k1077] The best-known enterprise was Madam C. J. Walker Manufacturing
Company, one of the most successful Black business empires in the world.</p>
</blockquote>

<blockquote>
  <p>[k1079] At the peak of her success, she employed 3,000 people, mostly
women, making and selling cosmetics for a population that other companies
ignored. She was the first Black woman to become a millionaire, one of
the first great female entrepreneurs in the United States.</p>
</blockquote>

<blockquote>
  <p>[k1082] For all of Madam Walker’s accomplishments, when she went to the
Isis Theater and gave the clerk her nickel to see the film, she was told
the price for Black moviegoers was five times the amount, and she would
have to sit in an isolated area to the side.</p>
</blockquote>

<blockquote>
  <p>[k1090] With Stephenson’s move into Indianapolis, the Klan vowed to keep
Black residents in a tight geographic box. The city had fifteen African
American physicians in 1923, but they were not allowed to attend to
patients at the main hospital.</p>
</blockquote>

<blockquote>
  <p>[k1112] Douglass died well before the horror of the Tulsa Race Massacre,
when a white mob destroyed thirty-five city blocks in a part of Oklahoma
known for its fine homes and businesses–the Black Wall Street.</p>
</blockquote>

<blockquote>
  <p>[k1116] Tulsa was a hotbed of Klansmen.</p>
</blockquote>

<blockquote>
  <p>[k1117] The marauders burned more than 1,200 homes, five hotels, a
dozen churches, thirty-one restaurants, four drugstores, a public
library, a hospital, and four doctors’ offices. A police detective urged
white fellow Tulsans to “get a gun and get busy and try to get a N—-.”</p>
</blockquote>

<blockquote>
  <p>[k1124] As in Dallas, there were no convictions of any of the killers,
thieves, and firebombers, no prison terms, no retribution. The Klan of
the 1920s had enough control of the legal system to ensure that those who
gutted the wealthiest Black community in the United States, a mass murder
of American citizens, would not face justice.</p>
</blockquote>

<blockquote>
  <p>[k1130] On Saint Patrick’s Day, a crowd filled basketball-rattled
Tomlinson Hall in Indianapolis to hear a fiery Irish American lawyer,
Patrick H. O’Donnell.</p>
</blockquote>

<blockquote>
  <p>[k1133] O’Donnell had grown up on stories of the British stripping his
people of their culture, their religion, their language, and their civil
rights in their native land. Now he saw the Klan trying to do the same
thing in the country his family had fled to from Ireland.</p>
</blockquote>

<blockquote>
  <p>[k1143] Klan secrecy, and the oaths never to reveal the names of fellow
members, gave O’Donnell an opening.</p>
</blockquote>

<blockquote>
  <p>[k1146] O’Donnell cultivated insiders, who got him membership rolls. “We
feel that the publication of the names of those who belong to the Klan
will be a blow that the masked organization cannot survive,” he wrote in
the inaugural issue of Tolerance, dated September 10, 1922.</p>
</blockquote>

<blockquote>
  <p>[k1152] Hundreds of families withdrew their money from the bank run by
the Klansman.</p>
</blockquote>

<blockquote>
  <p>[k1171] “We are going to drive the Klan out of Indiana!” he thundered.
“We are going to redeem Indiana and re-annex it to the American Union!”
In South Bend, on the same day that O’Donnell spoke, the Klan had a Saint
Patrick’s Day message of its own: flames for Notre Dame, Roman
Catholicism’s center of higher learning in America. Unlike most
communities in Indiana,</p>
</blockquote>

<blockquote>
  <p>[k1225] O’Donnell was now Stephenson’s main target in the press. He
fulminated against “Mad Pat” in the Fiery Cross, calling him “an Enemy of
America.” He ordered Klansmen to burn a cross in the township outside
Logansport, where O’Donnell grew up and some members of his family still
lived.</p>
</blockquote>

<blockquote>
  <p>[k1230] Fear of Catholics was brought to the American shores by British
Protestants steeped in dark conspiracies about the power of Papists.
Though many of the colonists were fleeing religious persecution, it
wasn’t long before some were practicing what had been preached against
them back in Europe.</p>
</blockquote>

<blockquote>
  <p>[k1235] Thomas Nast, the most influential newspaper cartoonist at the
time, stoked loathing of the faith of new immigrants with sketches
depicting bishops as crocodiles coming ashore.</p>
</blockquote>

<blockquote>
  <p>[k1470] Stephenson quoted extensively from the work of Dr. Harry H.
Laughlin, the chief eugenicist guiding the anti-immigration forces in
Congress.</p>
</blockquote>

<blockquote>
  <p>[k1473] He created a model human sterilization law, building on the
pioneering work from Indiana, that was drafted by more than thirty
states. Ultimately, about 70,000 people across the United States would be
forcibly sterilized. A special category of “degenerates” was added in
many of these states in order to sterilize homosexuals. Laughlin’s law
also drew strong interest from a circle of proto-Nazi scientists in
Germany. Laughlin himself would later praise Hitler for understanding
that “the central mission of all politics is race hygiene.”</p>
</blockquote>

<blockquote>
  <p>[k1478] If the United States were to become “darker in pigmentation,”
as the influential eugenicist Charles Davenport explained, the typical
American would eventually be “smaller in stature, more mercurial, more
attached to music and art, more given to crimes of larceny, kidnapping,
assault, murder, rape and sex-immorality.”</p>
</blockquote>

<blockquote>
  <p>[k1524] As Stephenson neared the end of that night’s speech, he
summarized what was at stake when “members of inferior races” were let
into the United States. “This is a struggle to save America,” he said.
“It’s a struggle perhaps even more serious than that between the states
in the Civil War.” The hundred percenters from the Heartland were at the
forefront of a war to prevent “the inevitable destruction of what may be
called the American race.”</p>
</blockquote>

<blockquote>
  <p>[k1650] Why, Coughlan wondered later as a writer trying to come to grips
with what had happened to his neighbors, “did the town take so
whole-heartedly to the Klan?” His answer was rooted in “the deadly tedium
of small-town life,” a militant religious fundamentalism “hot with
bigotry,” and “American moralistic blood lust that is half historical
determinism, and half Freud.”</p>
</blockquote>

<blockquote>
  <p>[k2188] In cities big and small, North and South, the blazing cross had
become as much a part of life as the soda fountain and the barbershop
pole. More than 10,000 turned out for a Klan picnic in Colorado. The Klan
terrorized Jewish, Italian, Black, and Latino neighborhoods in Denver,
and could count on brothers under the sheets in law enforcement to avoid
arrest. “They paid ten dollars to hate someone,” said a Denver judge,
“and they were determined to get their money’s worth.”</p>
</blockquote>

<blockquote>
  <p>[k2210] The National Origins Act of 1924, a Klan-blessed master design
for the future of America, passed in the House by an overwhelming margin
and sailed through the Senate with only six dissenting votes.</p>
</blockquote>

<blockquote>
  <p>[k2302] He noted that the 18th Amendment, outlawing alcohol, was fully
enforced with regular raids, while the 15th Amendment, upholding the
right to vote regardless of race, was given no protection. “The federal
government will use a navy to prevent a man from taking a drink, but will
not empower a deputy marshal to protect the Negro’s ballot,” said
Johnson.</p>
</blockquote>

<blockquote>
  <p>[k2325] Elsewhere, the Empire elected not just a governor in Colorado,
Clarence Morley, but a United States senator, Rice Means. In Denver, an
oath-bound Klansman, Ben Stapleton, survived a recall election in a city
where one in seven voters had taken the same vows. “I will work with the
Klan and for the Klan,” he pledged afterward. “I shall give the Klan the
kind of administration it wants.”</p>
</blockquote>

<blockquote>
  <p>[k2333] Forty years of Jim Crow in the South and voter restrictions aimed
at immigrants in the North were able to shrink the American electorate as
never before: just 48.9 percent of eligible voters cast a ballot in the
1924 presidential election–an all-time low.</p>
</blockquote>

<blockquote>
  <p>[k2413] Under Prohibition, people with a doctor’s note could buy a pint
for all that ailed them every ten days at a drugstore. This business made
a wealthy man out of Charles Walgreen, whose Chicago-based chain of
drugstores grew from nine in 1920 to 525 by the end of the decade.</p>
</blockquote>

<blockquote>
  <p>[k2492] At bus stops near Indiana Avenue, Black passengers were left
stranded. When they tried to board at other locations, the doors were
slammed in their faces. Drivers were specifically instructed not to pick
up Black bus riders.</p>
</blockquote>

<blockquote>
  <p>[k3184] “We’ve passed this immigration bill and built a stone wall around
the nation so tall, so deep, so strong, that the scum and riff-raff of
the old world cannot get into our gates,” he said.</p>
</blockquote>

<blockquote>
  <p>[k4043] Across the country, another prominent Klansman was embroiled in a
sordid tale that defied the hooded order’s professed values. Dr. Ellis O.
Willson, a dentist who’d been a leader of the large Klan chapter in La
Grande, Oregon, was charged with raping his clerical assistant, and then
killing her accidentally during a botched abortion.</p>
</blockquote>

<blockquote>
  <p>[k4049] In Colorado, three Klansmen were charged in separate cases of
child molestation and statutory rape. The Grand Dragon, Dr. John Galen
Locke, was implicated in the kidnapping of a nineteen-year-old who had
refused to marry his pregnant girlfriend–a violation of the Klan’s
professed values of sexual purity and the sanctity of marriage.</p>
</blockquote>

<blockquote>
  <p>[k4096] Democracy was a fragile thing, stable and steady until it was
broken and trampled. A man who didn’t care about shattering every
convention, and then found new ways to vandalize the contract that
allowed free people to govern themselves, could do unthinkable damage.</p>
</blockquote>

<blockquote>
  <p>[k4101] The Republican Party was outraged–not at the disclosures of
Stephenson’s web of graft, but at the press for reporting it. This
journalism was the work of Jews, party officials implied. Clyde A. Walb,
the Republican Party state chairman, said a syndicate of international
bankers was trying to bring down the GOP in Indiana. The party’s Central
Committee disowned Adams, a lifelong Republican.</p>
</blockquote>

<blockquote>
  <p>[k4173] In the end, Stephenson gave several exhaustive accounts of the
bribery scheme and how he pulled the levers of power in the state. This
evidence, along with testimony of other witnesses and canceled checks,
proved beyond a doubt that the Klan’s governor had been guilty, as the
judge said so himself in a directed verdict. But Jackson got off on a
technicality: the statute of limitations had expired. He finished out his
term and retired from politics.</p>
</blockquote>

<blockquote>
  <p>[k4188] At the conclusion of the Pennsylvania trial in 1928, Judge W. H.
S. Thompson issued a scathing indictment. He found that the Invisible
Empire of the Roaring Twenties, one that would later cast itself as a
Mayberry Klan of good fellowship and high Christian values, was “an
instrument of terror, oppression, violence and a menace to public peace.”
He called it an “unlawful organization, so destructive of the rights and
liberties of the people.” After noting that Imperial Wizard Evans and his
lawyers came to the court seeking relief “with filthy hands,” he awarded
them nothing.</p>
</blockquote>

<blockquote>
  <p>[k4203] Those days were gone–a shameful aberration in the American
story, the Chicago Tribune wrote in the wake of the crumbling Klan. The
paper sketched an outline that sounded like a bad fairy tale. “It came
about that American citizens in Indiana were judged by their religion,
condemned because of their race, illegally punished because of their
opinions, hounded because of their personal conduct, and a state of
terror was substituted for a state of law.” But was it really an
aberration?</p>
</blockquote>

<blockquote>
  <p>[k4250] But take away the courage of Madge Oberholtzer as she lay dying
from poison and the sadism of Stephenson, and there is no extinguisher of
the flames that enveloped the nation during the 1920s.</p>
</blockquote>

<blockquote>
  <p>[k4255] Without her, Stephenson might have been named to that vacant
United States Senate seat, and gone ahead with a run at the White House
while the Klan was still ascendant. There is always some peril in seeing
things in the past from a starting point of the present, as if every
molecule of chance was put in place by human design.</p>
</blockquote>

<blockquote>
  <p>[k4258] We should also think about another cause and effect, or lack
thereof. Stephenson was a charismatic con man–“the most talented
psychopath ever to tread the banks of the Wabash,” as one chronicler of
the age put it.</p>
</blockquote>

<blockquote>
  <p>[k4263] A vein of hatred was always there for the tapping. It’s there
still, and explains much of the madness threatening American life a
hundred years after Stephenson made a mockery of the moral principles of
the Heartland. The Grand Dragon was a symptom, not a cause, of an age
that has been mischaracterized as one of Gatsby frivolity and the mayhem
of modernism.</p>
</blockquote>

<blockquote>
  <p>[k4270] The Klan-sponsored Immigration Act of 1924, which sharply
restricted the number of Jews, Catholics, southern and eastern Europeans,
Asians, and Africans who could come to the United States, stayed on the
books for forty-one years.</p>
</blockquote>

<blockquote>
  <p>[k4278] Indiana had pioneered the world’s first compulsory sterilization
law. And a new measure that Governor Jackson signed in 1927 was enforced
until 1974, allowing the state to deny thousands of Hoosiers the ability
to bring children into the world. The same year that the new law went
into effect, the United States Supreme Court, in Buck v. Bell, upheld the
right to sterilize a “feeble-minded” woman in a mental institution.
“Three generations of imbeciles are enough,” wrote Justice Oliver Wendell
Holmes in the majority opinion. In the years that followed, about 70,000
Americans who were deemed a threat to the national gene pool–the deaf,
the blind, ethnic minorities, people with epilepsy, homosexuals, poor
people, and “promiscuous” women–were sterilized against their will. Nazi
Germany defended its own 1936 eugenics law by pointing to the United
States as a role model. In 1981, Oregon performed the nation’s last legal
forced sterilization.</p>
</blockquote>

<blockquote>
  <p>[k4360] In 2022, Congress finally passed, and President Joe Biden signed,
a bill making lynching a federal crime–122 years after the first such
legislation was introduced. According to the NAACP, nearly 5,000
lynchings took place between 1882 and 1968.</p>
</blockquote>]]></content><author><name></name></author><summary type="html"><![CDATA[By Timothy Egan, Viking, April 4, 2023]]></summary></entry><entry><title type="html">Python Global Interpreter Lock</title><link href="https://www.robnagler.com/2025/08/06/Python-Global-Interpreter-Lock.html" rel="alternate" type="text/html" title="Python Global Interpreter Lock" /><published>2025-08-06T20:00:00+00:00</published><updated>2025-08-06T20:00:00+00:00</updated><id>https://www.robnagler.com/2025/08/06/Python-Global-Interpreter-Lock</id><content type="html" xml:base="https://www.robnagler.com/2025/08/06/Python-Global-Interpreter-Lock.html"><![CDATA[<h3 id="gil-confusion">GIL Confusion</h3>

<p>The Python Global Interpreter Lock (GIL) is the source of much
confusion. You will see
<a href="https://github.com/pyepics/pyepics/blob/4a4caebd92b75ee21c774cfc33c05ae77f4d1f97/epics/ca.py#L260">code like this</a>:</p>

<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># The following sleep is here only to allow other threads the
# opportunity to grab the Python GIL. (see pyepics/pyepics#171)
</span><span class="n">time</span><span class="p">.</span><span class="nf">sleep</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
</code></pre></div></div>

<p>Calling <code class="language-plaintext highlighter-rouge">time.sleep</code> releases the CPU the thread is running on at the
kernel level, but it does not release the GIL, per se.</p>

<p>That <code class="language-plaintext highlighter-rouge">time.sleep(0)</code> hands control back to the OS scheduler, but the
GIL remains held by the interpreter. The confusion stems from
<a href="https://www.robnagler.com/2025/03/01/Coroutines.html#cooperative-vs-preemptive-multitasking">mixing up parallelism and concurrency</a>:
the GIL prevents parallel execution of Python bytecode, yet
allows threads to interleave execution cooperatively. A simple example
illustrates this.</p>

<h3 id="cpu-intense-example">CPU Intense Example</h3>

<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">threading</span><span class="p">,</span> <span class="n">time</span>

<span class="k">def</span> <span class="nf">_cpu_intense_function</span><span class="p">():</span>
    <span class="k">def</span> <span class="nf">_is_prime</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="nf">int</span><span class="p">(</span><span class="n">n</span><span class="o">**</span><span class="mf">0.5</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
            <span class="k">if</span> <span class="n">n</span> <span class="o">%</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
                <span class="k">return</span> <span class="bp">False</span>
            <span class="k">return</span> <span class="bp">True</span>

    <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">10000</span><span class="p">):</span>
        <span class="nf">_is_prime</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">_thread</span><span class="p">(</span><span class="n">inc</span><span class="p">):</span>
    <span class="k">global</span> <span class="n">shared_value</span>

    <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">500</span><span class="p">):</span>
        <span class="nf">_cpu_intense_function</span><span class="p">()</span>
        <span class="n">shared_value</span> <span class="o">+=</span> <span class="n">inc</span>

<span class="n">shared_value</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">ones</span> <span class="o">=</span> <span class="n">threading</span><span class="p">.</span><span class="nc">Thread</span><span class="p">(</span><span class="n">target</span><span class="o">=</span><span class="n">_thread</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="p">(</span><span class="mi">1</span><span class="p">,))</span>
<span class="n">ones</span><span class="p">.</span><span class="nf">start</span><span class="p">()</span>
<span class="n">millions</span> <span class="o">=</span> <span class="n">threading</span><span class="p">.</span><span class="nc">Thread</span><span class="p">(</span><span class="n">target</span><span class="o">=</span><span class="n">_thread</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="p">(</span><span class="mi">1000000</span><span class="p">,))</span>
<span class="n">millions</span><span class="p">.</span><span class="nf">start</span><span class="p">()</span>
<span class="k">while</span> <span class="n">shared_value</span> <span class="o">&lt;</span> <span class="mi">500000000</span><span class="p">:</span>
    <span class="n">time</span><span class="p">.</span><span class="nf">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
    <span class="nf">print</span><span class="p">(</span><span class="n">shared_value</span><span class="p">)</span>
</code></pre></div></div>

<p>The following output demonstrates that <code class="language-plaintext highlighter-rouge">shared_value</code> increases by
<code class="language-plaintext highlighter-rouge">ones</code> and <code class="language-plaintext highlighter-rouge">millions</code> simultaneously:</p>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>python cpu_intense.py
117000121
237000241
355000358
475000475
500000500
</code></pre></div></div>

<p>The GIL allows the two threads to interleave so <code class="language-plaintext highlighter-rouge">shared_value</code> changes
(almost) simultaneously in the ones and millions places. Neither
thread “releases” the CPU explicitly. The GIL allows the two threads
to run concurrently without corrupting the Python
interpreter. However, the GIL does <strong>not guarantee atomicity</strong> of
operations like <code class="language-plaintext highlighter-rouge">shared_value += inc</code> or any other single Python
statement.</p>

<p>Therefore, the program is not guaranteed to stop. There is a race
condition from the time <code class="language-plaintext highlighter-rouge">shared_value</code> is loaded to when it is stored
after being incremented (three Python opcodes). Since the window is
about 200 nanoseconds on modern processors, the program terminates
almost all of the time, especially since the majority of the time is
spent in <code class="language-plaintext highlighter-rouge">_cpu_intense_function</code>.</p>

<p>You would need to use a synchronization primitive like
<code class="language-plaintext highlighter-rouge">threading.Lock</code> to update <code class="language-plaintext highlighter-rouge">shared_value</code> atomically and to guarantee
the program will always stop. Again, the GIL does not ensure atomic
execution of Python statements.</p>

<h3 id="parallel-vs-concurrent">Parallel vs Concurrent</h3>

<p>The GIL does guarantee that only one Python thread is executing Python
statements at any one time. To demonstrate this, we’ll time the code
as written:</p>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">time </span>python cpu_intense.py
&lt;snip&gt;
real    0m4.418s
</code></pre></div></div>

<p>Then, with the <code class="language-plaintext highlighter-rouge">ones.start()</code> commented out:</p>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">time </span>python cpu_intense.py | <span class="nb">grep </span>real
&lt;snip&gt;
real    0m2.366s
</code></pre></div></div>

<p>The program runs in half the time, which means the two threads do not
run in <strong>parallel</strong>, even though they are running <strong>concurrently</strong>. On my
multicore laptop, a similar C program would run in about the same
amount of time in both cases. In other words, the C program scales
linearly and the Python program does not scale at all. This is why the
GIL is bandied about in the scientific programming community, and why
I’m writing this article: HPC is just one part of the story in
experimental physics software.</p>

<h3 id="interpreter-is-shared-state">Interpreter is Shared State</h3>

<p>In order to understand the GIL, we need to understand what the Python
interpreter is and isn’t. Firstly, the interpreter is not a thread;
it’s just code and data. The code is the CPython program and all its
libraries, and at first, the Python program it reads in is its only
data. The interpreter compiles the Python program and its libraries
into opcodes to be executed in the Python virtual machine.</p>

<p>When you execute <code class="language-plaintext highlighter-rouge">python cpu_intense.py</code>, the kernel starts a process,
which is the code, data, and a thread, known as the main thread in
Python. In the example above, the main thread executes the Python code
which starts the other two threads (<code class="language-plaintext highlighter-rouge">ones</code> and <code class="language-plaintext highlighter-rouge">millions</code>). In Linux,
the code is read-only and the data is, of course, writable. The GIL is
what keeps this data (the program, stacks, heap, etc.) from getting
corrupted.</p>

<p>In other words, the GIL is an instance of a synchronization primitive,
which is
<a href="https://github.com/python/cpython/blob/main/Python/ceval_gil.c">rather complex</a>
for
<a href="https://github.com/zpoint/CPython-Internals/blob/master/Interpreter/gil/gil.md">efficiency reasons</a>,
that is used to protect the shared state (Python program and data)
of the Python interpreter.</p>

<h3 id="preemption-vs-cooperation">Preemption vs Cooperation</h3>

<p>I have tried
<a href="https://www.robnagler.com/2025/03/01/Coroutines.html">to use coroutines</a>,
and decided that threading is the way to go in Python. That’s why I’m
writing this. I’m working on device control code right now, which uses
<a href="https://docs.epics-controls.org">EPICS</a>, and the first example code I
showed is from <a href="https://pyepics.github.io">PyEpics</a>, the Python
wrapper for the EPICS library written in C.</p>

<p>By and large, device control code is not CPU intense. Rather, it’s
asynchronous so it needs to be concurrent. In Python, there are three
types of concurrency:
<a href="https://docs.python.org/3/library/multiprocessing.html">multiprocessing</a>,
<a href="https://docs.python.org/3/library/threading.html">threading</a>, and
<a href="https://docs.python.org/3/library/asyncio.html">asyncio</a>. Confusingly,
the title of the <code class="language-plaintext highlighter-rouge">threading</code> library is “Thread-based parallelism”,
which is incorrect. The GIL as noted above, prevents parallelism in
Python. Two Python threads <strong>cannot</strong> execute in parallel. More
confusingly, <code class="language-plaintext highlighter-rouge">asyncio</code> does not support I/O in any sense –
concurrently or otherwise. <code class="language-plaintext highlighter-rouge">asyncio</code> would have been better called
<code class="language-plaintext highlighter-rouge">coroutines</code>, because that’s all it supports.  <code class="language-plaintext highlighter-rouge">multiprocessing</code> is
correctly described as “Process-based parallelism”, which is one way
to execute Python in parallel.</p>

<p><code class="language-plaintext highlighter-rouge">asyncio</code> supports <strong>cooperative multitasking</strong> using coroutines. When a
coroutine calls <code class="language-plaintext highlighter-rouge">await</code>, <code class="language-plaintext highlighter-rouge">asyncio</code> can switch to another coroutine, if
one is ready. Without <code class="language-plaintext highlighter-rouge">await</code>, the currently running coroutine would
hog the CPU, especially when it makes calls to C libraries. To
demonstrate to yourself, create two coroutines, start them running,
and have one call <code class="language-plaintext highlighter-rouge">time.sleep(5)</code>. The other coroutine will not run
for 5 seconds. However, change that to <code class="language-plaintext highlighter-rouge">await asyncio.sleep(5)</code>, and
the other coroutine will run.</p>

<p><code class="language-plaintext highlighter-rouge">threading</code> supports kernel-level threads which are <strong>preemptable
multitasking</strong>. The kernel controls when threads run, <strong>not</strong> the Python
interpreter. That’s what the <code class="language-plaintext highlighter-rouge">cpu_intense.py</code> example
demonstrates. The two threads run whenever the kernel
decides. However, the GIL prevents two threads from accessing their
(shared) Python interpreter at the same time. The GIL is designed to
release itself very frequently, not on every
<a href="https://github.com/python/cpython/blob/main/Lib/opcode.py">opcode</a>,
but close enough for our purposes. Even the simplest Python statement
is made up of several opcodes.</p>

<p>Python opcodes are to <code class="language-plaintext highlighter-rouge">threading</code> as CPU level instructions are to
Python’s <code class="language-plaintext highlighter-rouge">multiprocessing</code> module, that is, parallel execution of
<a href="https://en.wikipedia.org/wiki/Fork_(system_call)">forked instances</a>
of the Python interpreter. Just like the GIL, the kernel switches
processes (threads) at the CPU instruction level. On single core
computers (rare nowadays), this was just fine. Today, of course, we
want to take advantage of all the cores on a processor when we need
them. A Python opcode takes many CPU instructions to execute, which is
why <code class="language-plaintext highlighter-rouge">multiprocessing</code> is used to achieve CPU-level parallelism.
Python <code class="language-plaintext highlighter-rouge">multiprocessing</code> programs scale while <code class="language-plaintext highlighter-rouge">threading</code> programs to
not.</p>

<h3 id="asynchrony-vs-polling">Asynchrony vs Polling</h3>

<p>Our example program would run in parallel if we used <code class="language-plaintext highlighter-rouge">multiprocessing</code>
instead of <code class="language-plaintext highlighter-rouge">threading</code>. As noted above, I’m writing this article,
because I’m writing device control code, which needs to be
<a href="https://en.wikipedia.org/wiki/Asynchrony_(computer_programming)">asynchronous</a>,
not necessarily parallel. For the most part, device control code ends
up waiting for device events or control requests, that is, unless the
program is implemented using
<a href="https://en.wikipedia.org/wiki/Polling_(computer_science)">polling</a>.</p>

<p>Much Python EPICS control code uses polling, even though EPICS is
designed to be fully asynchronous.
<a href="https://pyepics.github.io/pyepics/advanced.html">PyEpics Advanced Topic with Python Channel Access</a>
suggests code be written like this:</p>

<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">pvnamelist</span> <span class="o">=</span> <span class="nf">read_list_pvs</span><span class="p">()</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">10</span><span class="p">):</span>
    <span class="n">values</span> <span class="o">=</span> <span class="n">epics</span><span class="p">.</span><span class="nf">caget_many</span><span class="p">(</span><span class="n">pvlist</span><span class="p">)</span>
    <span class="n">time</span><span class="p">.</span><span class="nf">sleep</span><span class="p">(</span><span class="mf">0.01</span><span class="p">)</span>
</code></pre></div></div>

<p>While this does work, it’s inefficient from a CPU utilization
perspective, and it creates unnecessary latency. In this case, the
code blocks for 100 milliseconds even when all the devices respond
immediately to their “channel access” requests (<code class="language-plaintext highlighter-rouge">caget</code>). Moreover,
it’s likely that this code will make too many <code class="language-plaintext highlighter-rouge">caget</code> requests,
because the actual values have not changed from the last <code class="language-plaintext highlighter-rouge">caget</code>.</p>

<p>The EPICS protocol is fully asynchronous, just like the vast majority
of device drivers in operating system kernels. Another term for
asynchronous programming is
<a href="https://en.wikipedia.org/wiki/Event-driven_programming">event-driven programming</a>. In
the kernel, events are device interrupts. In EPICS, events are
asynchronous messages from the programs managing one or more
devices. At the Python level, PyEpics allows Python code to
<a href="https://pyepics.github.io/pyepics/pv.html#pv.add_callback">register for callbacks</a>
to receive these messages so no polling is necessary. When the
callback occurs, new data is available from the device. This is why
<a href="https://en.wikipedia.org/wiki/Busy_waiting">polling shoudl be considered an anti-pattern</a>
in EPICS.</p>

<h3 id="gil-aware">GIL Aware</h3>

<p>While polling can
<a href="https://events.static.linuxfound.org/sites/events/files/slides/lemoal-nvme-polling-vault-2017-final_0.pdf">reduce latency in certain situations</a>,
in Python code, it is an anti-pattern due to the GIL, and, as noted,
each Python opcode requiring many CPU instructions to execute. When
Python is waiting on events from the operating system, it is like any
other program, compiled or interpreted. This is why writing device
control code in Python can be as efficient as programming C. (Note:
I’m not speaking about kernel device drivers, where C is a better
choice.) Polling in Python is <strong>self-inflicted contention</strong>, which is why
event-driven Python device programming is even more important than in
C.</p>

<p>EPICS uses the <a href="https://docs.python.org/3/library/ctypes.html">ctypes</a>
library to call the (multi-threaded) EPICS C library. Unlike other
types of Python extensions, which must release the GIL manually,
<code class="language-plaintext highlighter-rouge">ctypes</code>
<a href="https://docs.python.org/3/library/ctypes.html#ctypes.WinDLL">does this implicitly</a>:
<em>The Python global interpreter lock is released before calling any
function exported by these libraries, and reacquired afterwards.</em> Note
that properly written C extensions also release the GIL,
e.g. <a href="https://numpy.org/doc/stable/reference/thread_safety.html">numpy</a>
and
<a href="https://docs.scipy.org/doc/scipy/tutorial/thread_safety.html">scipy</a>. Finally,
<a href="https://peps.python.org/pep-0703/">disabling the GIL</a> is an
expiremental option in
<a href="https://www.python.org/downloads/release/python-3130/">Python 3.13</a>. This
will shorten the life of this article, but the points made are still
relevant, since the Python interpreter still needs to be locked.</p>

<p>Scientists use Python extensively, and they know the GIL prevents
Python code from executing in parallel. EPICS is the acronym for
Experimental Physics and Industrial Control System so the folks who
use it are (predominantly) scientists. I think this may be one source
of the confusion about the GIL. Often, the reason to use EPICS is to
perform intense computation with the results from EPICS requests. If
the computations need to be parallel, Python threading is the wrong
tool.  For HPC applications, it’s important to use packages like
<code class="language-plaintext highlighter-rouge">multiprocessing</code>, <a href="https://www.dask.org">dask</a>, and
<a href="https://www.mpi-forum.org/docs/">MPI</a> in Python to avoid issues with
the GIL.</p>

<p>The Device control code itself can be written in Python with
<code class="language-plaintext highlighter-rouge">threading</code>. For asynchronous Python, you can generally ignore the
GIL.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[GIL Confusion]]></summary></entry><entry><title type="html">Is It Real or Is It Memex?</title><link href="https://www.robnagler.com/2025/06/08/Is-It-Real-or-Is-It-Memex.html" rel="alternate" type="text/html" title="Is It Real or Is It Memex?" /><published>2025-06-08T12:00:00+00:00</published><updated>2025-06-08T12:00:00+00:00</updated><id>https://www.robnagler.com/2025/06/08/Is-It-Real-or-Is-It-Memex</id><content type="html" xml:base="https://www.robnagler.com/2025/06/08/Is-It-Real-or-Is-It-Memex.html"><![CDATA[<p>Last night I was at
<a href="https://www.dazzledenver.com/">Dazzle Jazz Denver</a> to hear
<a href="https://en.wikipedia.org/wiki/Cyrus_Chestnut">Cyrus Chestnut</a>.
His trio—bassist <a href="http://www.hermanburney.com">Herman Burney</a> and
drummer <a href="https://www.kdnmusic.com">Kelton Norris</a>—locked in from the
downbeat.  Years together give a band a shared brain; you can hear it
in the space between notes.</p>

<p>After the set I bumped into local players
<a href="https://larryvernecmusic.com/event/6089666/720758477/larry-vernec-adam-wolff">Larry Vernec</a>
(bass) and Adam Wolf (piano).  They have forty‑plus years together.
We traded small talk until close.  Late night for me, but those hours
are often when loose thoughts connect.</p>

<h3 id="ai-in-the-lounge">AI in the Lounge</h3>

<p>During the break the woman next to me, a retired high‑school music
teacher, asked about AI.  She’d just finished
<a href="https://en.wikipedia.org/wiki/Klara_and_the_Sun">Klara and the Sun</a>
and couldn’t shake the human‑robot friendship theme.</p>

<p>I told her AI can generate useful things—text, images, even music—but
I’ve never heard three computers improvise like Cyrus’s trio.  The
real magic was how they listened to one another, not the notes
themselves.</p>

<h3 id="a-billy-strings-detour">A Billy Strings Detour</h3>

<p>Earlier that day my childhood friend Ed texted a
<a href="https://www.youtube.com/watch?v=txZ7-4bYkTU">Billy Strings livestream</a>.
I replied with a link to
<a href="https://open.spotify.com/playlist/37i9dQZF1E4FpBmUcbuPW1?si=491fbf14c8d64a40">BT ALC Big Band Radio</a>
on Spotify—lots of current releases.  Ed loved the funk and said he
wished he could sit in with a horn section.  Same.</p>

<p>We used to play together as kids.  Watching the late‑night duo at
Dazzle—two friends still grooving decades later—I pictured us doing
the same.  Regret is a quiet instrument.</p>

<h3 id="when-the-band-isnt-a-band">When the Band Isn’t a Band</h3>

<p>Saturday morning I dug into the artists behind the songs I had saved.
One track, by
<a href="https://open.spotify.com/artist/21PAJwO0H94xCT4wStKtaE">Take Your Time</a>,
had a tight groove but no artist bio.  A search pulled up a Reddit
thread:
<a href="https://www.reddit.com/r/Music/comments/1is7jhk/take_your_time_on_spotify_ai_generated_music/">Take Your Time on Spotify — AI generated?</a>.
The creator confirmed:</p>

<blockquote>
  <p>“I prompt the style I want, pick the best parts, then clean
everything in Ableton and iZotope.  A few hours later the playlist
is done.”</p>
</blockquote>

<p>So the “band” is software.  The song
<a href="https://open.spotify.com/track/4cjO5jJRVqdy4oVitlItfy">Straight to the Point</a>,
had 6K listens.  The account pulls 105K monthly listeners. I’d
favorited the track before knowing any of this.</p>

<h3 id="sampling-lipsyncs-and-memex">Sampling, Lip‑Syncs, and Memex</h3>

<p>Music has blurred lines for decades.
<a href="https://en.wikipedia.org/wiki/Mocean_Worker">Mocean Worker</a> builds
tracks from samples.  Milli Vanilli lip‑synced.  The Monkees didn’t
play on their early records.  Technology keeps moving the line.</p>

<p>In 1945 <a href="https://en.wikipedia.org/wiki/Vannevar_Bush">Vannevar Bush</a>
sketched <a href="https://en.wikipedia.org/wiki/As_We_May_Think">the Memex</a>, a
desk that could summon any piece of media.  That future arrived faster
than he or the
<a href="https://www.reddit.com/r/GenX/comments/17qriu3/is_it_live_or_is_is_it_memorex/">Memorex marketers</a>
expected.</p>

<h3 id="is-it-real">Is It Real?</h3>

<p>Last night a flesh‑and‑blood trio proved chemistry still matters.
This morning an algorithm fooled me into toe‑tapping.  Both moments
were real because I experienced them.</p>

<p>If the groove connects, does the source matter?  Maybe that’s the
wrong question.  Better to ask, <em>does it resonate?</em> If yes, live
enough.</p>

<h3 id="bozos-on-the-bus">Bozos on the Bus</h3>

<p>Engineer <a href="https://en.wikipedia.org/wiki/Robert_W._Lucky">Robert Lucky</a>
captured this feeling back in 1996 in his IEEE Spectrum column
<a href="http://www.boblucky.com/reflect/july96.htm">Bozos on the Bus</a>.
Technology, he wrote, is a Greyhound hurtling into the fog.  None of
us—not even the people who built the engine—knows exactly where we’re
headed.  We just hang on, wide‑eyed, until the ride smooths out.</p>

<p>AI‑generated playlists are the latest swerve.  One night I’m sure I
can tell a living rhythm section from latent‑space funk; the next
morning an algorithm slips into my Favorites without a red flag.
Lucky’s point holds: every breakthrough turns us into bozos for a
minute, gawking until the novelty fades and the bus lurches again.</p>

<p>So when someone asks whether the music is “real,” I think of Lucky’s
shrug.  Stay on the bus, keep listening, and try not to spill your
coffee.</p>

<h3 id="acknowledgements">Acknowledgements</h3>

<p>This article was generated by
<a href="https://en.wikipedia.org/wiki/OpenAI_o3">ChatGPT o3</a>. I removed some
of the bold text in favor of links as is my style. ChatGPT got almost
all the links wrong except for the ones I provide. It rewrote some of
the quotes, changed context (I didn’t bump into Adam and Larry, just
listened), and generally fluffed it up, but kind of in my style.  An
interesting tidbit is that I never told ChatGPT Ed and I played horns
as kids.</p>

<p>The above paragraph was written entirely by yours truly. The entire
process took about 1.5 hours.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Last night I was at Dazzle Jazz Denver to hear Cyrus Chestnut. His trio—bassist Herman Burney and drummer Kelton Norris—locked in from the downbeat. Years together give a band a shared brain; you can hear it in the space between notes.]]></summary></entry><entry><title type="html">Python Coroutines: Words of Advice</title><link href="https://www.robnagler.com/2025/03/01/Coroutines.html" rel="alternate" type="text/html" title="Python Coroutines: Words of Advice" /><published>2025-03-01T23:00:00+00:00</published><updated>2025-03-01T23:00:00+00:00</updated><id>https://www.robnagler.com/2025/03/01/Coroutines</id><content type="html" xml:base="https://www.robnagler.com/2025/03/01/Coroutines.html"><![CDATA[<h3 id="the-initial-project">The Initial Project</h3>

<p>Around 2018 <a href="https://sirepo.com">Sirepo</a> had outgrown
<a href="https://docs.celeryq.dev">Celery</a> as a job management system. We
decided to implement a tailored solution to our problem, which
involves jobs running from a few seconds to a few days. We also
had a requirement to integrate with job managers on 3rd party
supercomputers with independent authentication.</p>

<p>To manage the events in a job manager, we would need to manage
asynchrony.
Python supports several mechanisms for asynchrony: coroutines,
threads, and multiprocessing. We had used
<a href="https://flask.palletsprojects.com">Flask</a>, which relies
on threads (and multiple processes) for asynchrony. Our
<a href="https://github.com/radiasoft/sirepo/issues?q=is%3Aissue+flask+NOT+release">experience with Flask</a>
was not great.</p>

<p>We also reasoned that multi-threading is hard to implement
correctly.
With
Python, the
<a href="https://en.wikipedia.org/wiki/Global_interpreter_lock">global interpreter lock</a>
always looms large in threading
discussions, anyway. We thought fully separate memory spaces
(processes) or cooperative multi-tasking (coroutines) would be more
reliable.</p>

<p>We had good experience in
<a href="https://github.com/biviosoftware/perl-Bivio">BOP</a> relying on
<a href="https://www.postgresql.org">PostgreSQL</a> for locking and inter-process
communication for jobs. However, Sirepo is different. It’s all about
the jobs whereas BOP applications are mostly about the database.</p>

<p>We considered a publish-subscribe database like Redis to solve the
queuing/locking problem with multiple processes. Even with pub-sub, we
realized we would need a process manager so that jobs
could be started, awaited on, cancelled, and timed out. An important
part of this change was being able to
<a href="https://www.sirepo.com/plans">charge</a> for different levels of CPU
resources.</p>

<p>Cancellation and timeouts led me to Nathaniel J Smith’s
<a href="https://vorpus.org/blog/timeouts-and-cancellation-for-humans/">Timeouts and cancellation for humans</a>.
It’s
well-written and worth a read. Nathaniel and I struck up a
conversation about coroutines. This further convinced me that
coroutines were the way to go, especially because they were
cancellable. I did not have experience with modern day coroutines so
we hired Nathaniel who helped us get started on the project. This was a
good call. I am very grateful for Nathaniel for helping me (in
particular) understand the ins and outs of
<a href="https://docs.python.org/3/library/asyncio.html">Python’s asyncio</a>.</p>

<p>Fast forward six years, the
<a href="https://github.com/radiasoft/sirepo/wiki/Job-system-architecture-overview">Sirepo job system</a>
has been in production for several years. Suffice it to say, we
have learned a thing or two about job management, coroutines,
cancellations, timeouts, locking, etc. This article collects our
experience.</p>

<h3 id="job-supervisor-and-coroutines">Job Supervisor and Coroutines</h3>

<p>Sirepo jobs run on our cluster and at <a href="https://nersc.gov">NERSC</a>,
which uses <a href="https://slurm.schedmd.com">Slurm</a> for job management. On
our cluster, we control CPU and memory utlization with containers.
We have paying customers with few complaints about the job system. The
“one-click” 3rd party supercomputer integration is a godsend to many
of our users. It is very nice to have happy customers.</p>

<p>And, we have had
<a href="https://github.com/radiasoft/sirepo/issues?q=is%3Aissue+label%3Asupervisor">many issues</a>
with the job supervisor. Many are the natural outcome of emergent design,
and others are intrinsic to coroutines in combination with Python’s
<a href="https://docs.python.org/3/glossary.html#term-EAFP">easier to ask forgiveness than permission</a>
approach to cancellation, timeouts, errors, and other exceptional
conditions.</p>

<p>We have expanded our use of coroutines to other
projects.  All new projects, which require asynchrony, use <a href="https://www.tornadoweb.org">Tornado</a>. We
<a href="https://github.com/radiasoft/sirepo/commit/6bfd0696fb09ef33b9af938f987c5c38a1c4e9c5">replaced Flask with Tornado</a>
for the API server so now all services rely on Tornado. Coroutines
work well. We have not encountered many bugs with Tornado or
asyncio. We think at this point we also know a bit better how to write
reliable services based on coroutines.</p>

<h3 id="cooperative-vs-preemptive-multitasking">Cooperative vs Preemptive Multitasking</h3>

<p>In order to understand coroutines, we need to separate
<a href="https://en.wikipedia.org/wiki/Concurrency_(computer_science)">concurrency</a>
from <a href="https://en.wikipedia.org/wiki/Parallel_computing">parallelism</a>,
and
<a href="https://en.wikipedia.org/wiki/Cooperative_multitasking">cooperative multitasking</a>
from <a href="https://en.wikipedia.org/wiki/Preemption_(computing)#Preemptive_multitasking">preemptive multitasking</a>.</p>

<p>For most programmers, concurrency implies preemptive
multitasking. Threads and multiprocessing are the most common form of
concurrent programming we encounter.  Coroutines while being an old
invention in programming, only recently started to become
popular. They weren’t added (formally) to Python
until 2015. Programming language courses do not emphasize them.  This
is why they are tricksy, and why we can easily confuse concurrency with
parallelism.</p>

<p>I think the confusion starts with the word concurrent, which
<a href="https://www.merriam-webster.com/dictionary/concurrent">Merriam-Webster</a>
defines as “operating or occurring at the same time.” Python
coroutines execute concurrently, but they do not execute “at the same
time”.</p>

<p>A better definition is found on the
<a href="https://en.wikipedia.org/wiki/Concurrency_(computer_science)">Wikipedia Concurrency page</a>:</p>

<blockquote>
  <p>In computer science, concurrency is the ability of different parts or
units of a program, algorithm, or problem to be executed out-of-order
or in partial order, without affecting the outcome. This allows for
parallel execution of the concurrent units.</p>
</blockquote>

<p>The word <em>allows</em> is key. Concurrency allows for out of order
execution. Coroutines can execute out of order, but their execution
does not happen <em>simultaneously</em> as with (preemptible) threads.</p>

<p>Parallelism is overlapping execution. Coroutines do not run in
parallel. They execute in a single Python thread.</p>

<p>Coroutine execution order is controlled by the
<a href="https://docs.python.org/3/library/asyncio-eventloop.html">asyncio event loop</a>
Coroutines are cooperative, not preemptive multitasking.  That’s their
main attraction: there can be no
<a href="https://en.wikipedia.org/wiki/Race_condition#In_software">race conditions</a>.</p>

<p>Rob Pike’s talk
<a href="https://go.dev/blog/waza-talk">Concurrency is not parallelism</a> is
worth a watch. The caveat here is that Goroutines are not coroutines,
because they are <em>allowed</em> to execute in parallel, which Python
coroutines cannot. Still, the talk explains concurrency and
parallelism clearly and with some good examples.</p>

<h3 id="concurrency-requires-logging">Concurrency Requires Logging</h3>

<p>Let’s move on to something practical: Debugging concurrent code is
hard, precisely because execution is out of order.  Good logging is
essential in order to make it easy to debug, especially in production.</p>

<p>We have had numerous failures due to concurrency, most of which are
easily explainable in hindsight. Debugging consists of staring at logs
for hours on end, because the difficult to find defects only occur in
production, in real-time. They are difficult to reproduce.</p>

<p><a href="https://github.com/radiasoft/sirepo/issues/6779">Over</a>
<a href="https://github.com/radiasoft/sirepo/issues/6572">the</a>
<a href="https://github.com/radiasoft/sirepo/issues/6250">years</a>,
<a href="https://github.com/radiasoft/sirepo/issues/3658">we</a>
<a href="https://github.com/radiasoft/sirepo/issues/2169">have</a>
<a href="https://github.com/radiasoft/sirepo/issues/2135">had</a>
<a href="https://github.com/radiasoft/sirepo/issues/2055">to</a>
improve logging in the job system. Here are some
guidelines we use:</p>

<ul>
  <li>Always catch and log exceptions in coroutines with sufficient
context. Sufficient will become apparent over time.</li>
  <li>Use something like
<a href="https://docs.python.org/3/reference/datamodel.html#object.__repr__"><code class="language-plaintext highlighter-rouge">__repr__</code></a>
or the more robust <a href="https://github.com/radiasoft/pykern/blob/f5da92a963ef5e58f896eff236bcaf5762bef806/pykern/pkdebug.py#L125">pkdebug_str</a>
to create consistent context for objects in log message.</li>
  <li>Include detailed logs with timestamps in issues (bug reports). In
public repos, like Sirepo, use a
<a href="https://github.com/biviosoftware/home-env/blob/55605e8dad11f5a949a9724bb79059e8498cfda8/bin/journal_trim">log trimmer</a>
to avoid exposing
<a href="https://www.gsa.gov/reference/gsa-privacy-program/rules-and-policies-protecting-pii-privacy-act">personally identifiable information (PII)</a>.</li>
</ul>

<p>Here’s how <code class="language-plaintext highlighter-rouge">job_supervisor._Op</code> <a href="https://github.com/radiasoft/sirepo/blob/06ae456eca538aaa577e6cf9abe83e17518aefa1/sirepo/job_supervisor.py#L1306">logs its context</a>:</p>

<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">pkdebug_str</span><span class="p">(</span><span class="n">self</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">_internal_error</span><span class="p">():</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="n">self</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">internal_error</span><span class="sh">"</span><span class="p">):</span>
            <span class="k">return</span> <span class="sh">""</span>
        <span class="k">return</span> <span class="sh">"</span><span class="s">, internal_error={self.internal_error}</span><span class="sh">"</span>

    <span class="k">return</span> <span class="nf">pkdformat</span><span class="p">(</span>
        <span class="sh">"</span><span class="s">_Op({}{}, {:.4}{})</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">DESTROYED, </span><span class="sh">"</span> <span class="k">if</span> <span class="n">self</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">is_destroyed</span><span class="sh">"</span><span class="p">)</span> <span class="k">else</span> <span class="sh">""</span><span class="p">,</span>
        <span class="n">self</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">op_name</span><span class="sh">"</span><span class="p">),</span>
        <span class="n">self</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">op_id</span><span class="sh">"</span><span class="p">),</span>
        <span class="nf">_internal_error</span><span class="p">(),</span>
    <span class="p">)</span>
</code></pre></div></div>

<h3 id="track-object-life-cycle">Track Object Life Cycle</h3>

<p>Note the <code class="language-plaintext highlighter-rouge">is_destroyed</code> flag in the previous code snippet. In
shared-memory, asynchronous code, an object can be destroyed by one
coroutine while it still is being used by another. This is the
cause of numerous failures: using state when it is no longer
valid.</p>

<p>For example, in the supervisor, a job might be canceled asynchronously
by an API call triggered by a user pressing a cancel button. The
coroutine handling the request that cancels the job is not the
coroutine which is monitoring the job. The coroutine monitoring the
job holds a copy of the job object, which is destroyed by the
coroutine canceling the job.</p>

<p>That’s why in Sirepo asynchronous code, objects that are referenced
concurrently by two coroutines are destroyed explicitly. Coroutines
are obligated to check object’s <code class="language-plaintext highlighter-rouge">is_destroyed</code> flag to determine the
object’s validity after an <code class="language-plaintext highlighter-rouge">await</code>. This means state management can
get complicated.</p>

<p>In <code class="language-plaintext highlighter-rouge">_send</code>,
<a href="https://github.com/radiasoft/sirepo/blob/06ae456eca538aaa577e6cf9abe83e17518aefa1/sirepo/job_supervisor.py#L1103"><code class="language-plaintext highlighter-rouge">is_destroyed</code> is checked</a>:</p>

<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">async</span> <span class="k">def</span> <span class="nf">_send</span><span class="p">(</span><span class="n">op</span><span class="p">):</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="k">await</span> <span class="n">op</span><span class="p">.</span><span class="nf">prepare_send</span><span class="p">()</span> <span class="ow">or</span> <span class="n">op</span><span class="p">.</span><span class="n">is_destroyed</span><span class="p">:</span>
        <span class="k">return</span> <span class="bp">None</span><span class="p">,</span> <span class="bp">False</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">op</span><span class="p">.</span><span class="nf">send</span><span class="p">():</span>
        <span class="k">return</span> <span class="bp">None</span><span class="p">,</span> <span class="bp">False</span>
    <span class="nf">if </span><span class="p">(</span><span class="n">r</span> <span class="p">:</span><span class="o">=</span> <span class="k">await</span> <span class="n">op</span><span class="p">.</span><span class="nf">reply_get</span><span class="p">())</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
        <span class="k">return</span> <span class="bp">None</span><span class="p">,</span> <span class="bp">False</span>

</code></pre></div></div>

<p>This check ensures that <code class="language-plaintext highlighter-rouge">op</code> has not been canceled. Once checked, we
know that <code class="language-plaintext highlighter-rouge">op</code> can’t be destroyed until after the <code class="language-plaintext highlighter-rouge">await
op.reply_get</code>.</p>

<h3 id="asynciotaskcancel">asyncio.Task.cancel</h3>

<p>That’s a lot of code and logic just to send and get a reply. Why not
just
<a href="https://docs.python.org/3/library/asyncio-task.html#task-cancellation">Task.cancel</a>
the <code class="language-plaintext highlighter-rouge">_send</code> coroutine?
After all, as the documentation says, “Tasks can easily and safely be cancelled.”
<a href="https://github.com/radiasoft/sirepo/issues/2346">We</a>
<a href="https://github.com/radiasoft/sirepo/issues/2570">did</a>
<a href="https://github.com/radiasoft/sirepo/issues/3753">not</a>
<a href="https://github.com/radiasoft/sirepo/issues/2712">find</a>
<a href="https://github.com/radiasoft/sirepo/issues/2664">Task.cancel</a>
<a href="https://github.com/radiasoft/sirepo/issues/2375">to</a>
be easy to manage.  It
is very hard to write correct cancellation code.
We found <a href="https://github.com/radiasoft/sirepo/issues/2375">one defect</a>
related to cancel in Tornado itself. Admittedly, Tornado was written
well before asyncio, and before tasks could be canceled.</p>

<p>Cancelling is hard. For example,
you can only cancel a
<a href="https://docs.python.org/3/library/concurrent.futures.html#future-objects">concurrent.futures.Future</a>
when it is pending. Already executing futures cannot be canceled,
even when they are waiting on another coroutine.</p>

<p>Another example is
<a href="https://docs.python.org/3/library/threading.html#threading.Timer.cancel">threading.Timer.cancel</a>,
which “will only work if the timer is still in its waiting stage.”</p>

<p>You cannot cancel a
<a href="https://docs.python.org/3/library/threading.html"><code class="language-plaintext highlighter-rouge">threading.Thread</code></a>:
“threads cannot be destroyed, stopped, suspended, resumed, or interrupted.”</p>

<p>And, you guessed it, you can’t kill a Goroutine, a Rust thread, a Java
thread, etc. Indeed, Java had <code class="language-plaintext highlighter-rouge">Thread.stop</code>,
and it was removed for
<a href="https://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html">good reasons</a>.</p>

<p>That’s why canceling a Python coroutine is problematic,
too. Cancelling coroutines is hard. In Python 3.11,
<a href="https://docs.python.org/3/library/asyncio-task.html#asyncio.Task.uncancel">Task.uncancel</a>
and
<a href="https://docs.python.org/3/library/asyncio-task.html#asyncio.Task.cancelling">Task.cancelling</a>
were added, which to me is yet another clue that it is hard to implement
cancelling. Piling on more methods, doesn’t fix the fundamental issue.</p>

<h3 id="use-asyncioqueue">Use asyncio.Queue</h3>

<p>We have settled on
<a href="https://docs.python.org/3/library/asyncio-queue.html"><code class="language-plaintext highlighter-rouge">asyncio.Queue</code></a>
as the sole means of communication and synchronization in
coroutines. The advantage of Queues over
<a href="https://docs.python.org/3/library/asyncio-sync.html#asyncio.Lock">Locks</a>
and
<a href="https://docs.python.org/3/library/asyncio-sync.html#asyncio.Event">Events</a>
is that a Queue allows you to pass values. As you saw in the example
above,
<a href="https://github.com/radiasoft/sirepo/blob/06ae456eca538aaa577e6cf9abe83e17518aefa1/sirepo/job_supervisor.py#L1343"><code class="language-plaintext highlighter-rouge">reply_get</code> returns None</a>
when there is no reply, and that only happens when the send was
canceled. This is a clean way to communicate out-of-band state. With
Events and Locks, there’s no value – just one state change. This
means you have to have some other value to release a Lock or Event in
a way that clearly communicates this alternative state.</p>

<p>Python 3.13 added
<a href="https://docs.python.org/3/library/asyncio-queue.html#asyncio.Queue.shutdown">Queue.shutdown</a>,
which makes this communication even clearer. Here’s the code in
<a href="https://github.com/radiasoft/pykern/blob/79511e45c374c25d6971cef834a316769bd29427/pykern/api/client.py#L254">pykern.api.client</a>,
to destroy and API call:</p>

<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">if</span> <span class="n">x</span> <span class="p">:</span><span class="o">=</span> <span class="nf">getattr</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">_reply_q</span><span class="p">,</span> <span class="sh">"</span><span class="s">shutdown</span><span class="sh">"</span><span class="p">,</span> <span class="bp">None</span><span class="p">):</span>
    <span class="n">x</span><span class="p">.</span><span class="nf">shutdown</span><span class="p">(</span><span class="n">immediate</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
    <span class="c1"># Inferior to shutdown, but necessary pre-Python 3.13
</span>   <span class="n">self</span><span class="p">.</span><span class="n">_reply_q</span><span class="p">.</span><span class="nf">put_nowait</span><span class="p">(</span><span class="bp">None</span><span class="p">)</span>
</code></pre></div></div>

<p>And, the corresponding code in:
<a href="https://github.com/radiasoft/pykern/blob/79511e45c374c25d6971cef834a316769bd29427/pykern/api/client.py#L267">result_get</a>:</p>

<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">try</span><span class="p">:</span>
    <span class="n">rv</span> <span class="o">=</span> <span class="k">await</span> <span class="n">self</span><span class="p">.</span><span class="n">_reply_q</span><span class="p">.</span><span class="nf">get</span><span class="p">()</span>
<span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
    <span class="nf">if </span><span class="p">(</span><span class="n">x</span> <span class="p">:</span><span class="o">=</span> <span class="nf">getattr</span><span class="p">(</span><span class="n">asyncio</span><span class="p">,</span> <span class="sh">"</span><span class="s">QueueShutDown</span><span class="sh">"</span><span class="p">,</span> <span class="bp">None</span><span class="p">))</span> <span class="ow">and</span> <span class="nf">isinstance</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
        <span class="k">raise</span> <span class="n">util</span><span class="p">.</span><span class="nc">APIDisconnected</span><span class="p">()</span>
    <span class="k">raise</span>
</code></pre></div></div>

<p>This code allows for clean communication that the
<code class="language-plaintext highlighter-rouge">APIDisconnected</code>, and the API call did not complete.</p>

<h3 id="coroutines-block-on-io">Coroutines Block on I/O</h3>

<p>Calls to <code class="language-plaintext highlighter-rouge">open</code>, <code class="language-plaintext highlighter-rouge">read</code>, etc. are blocking, that is, they block <em>all</em>
coroutines until the operating system fulfills the I/O
operation(s). You need parallelism in order to implement asynchronous
I/O in Python. (I have no idea why they call the coroutine module
<code class="language-plaintext highlighter-rouge">asyncio</code>, since it does not support I/O.)</p>

<p>A Tornado specific problem is that reply functions block and
<a href="https://www.tornadoweb.org/en/stable/web.html#thread-safety-notes">are not thread safe</a>.
This means a single response blocks the entire server.
Sirepo has an
<a href="https://github.com/radiasoft/sirepo/issues/5326">outstanding issue</a>
with sending data without blocking. With websockets, we will
eventually chunk messages to avoid this issue.</p>

<p>We use <a href="https://github.com/aio-libs/aiohttp"><code class="language-plaintext highlighter-rouge">aiohttp</code></a> and
<a href="https://github.com/Tinche/aiofiles"><code class="language-plaintext highlighter-rouge">aiofiles</code></a> to avoid
blocking on other types of I/O. The implementation uses
<a href="https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor">ThreadPoolExecutor</a>
to parallelize the I/O operations.</p>

<p>To achieve true parallelism in production, we run
<a href="https://www.tornadoweb.org/en/stable/guide/running.html#processes-and-ports">Tornado in multiple processes</a>
behind a proxy. This is true for any <code class="language-plaintext highlighter-rouge">asyncio</code>-based web server.</p>

<h3 id="backfitting-is-hard">Backfitting is Hard</h3>

<p>When an existing function is converted into a coroutine, all callers
have to be modified. This makes updating exiting code very
difficult. This is by design. It also is annoying, let’s face it.</p>

<p>One way to fix this problem is to create a new function that calls the
async function with
<a href="https://docs.python.org/3/library/asyncio-runner.html#asyncio.run">asyncio.run</a>,
which allows non-async functions to call coroutines. This allows you
to deprecate the usage and migrate your code slowly. Here’s a simple
example
<a href="https://github.com/radiasoft/sirepo/blob/06ae456eca538aaa577e6cf9abe83e17518aefa1/sirepo/quest.py#L94">from Sirepo</a>:</p>

<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">call_api_sync</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
    <span class="kn">import</span> <span class="n">asyncio</span>

    <span class="k">return</span> <span class="n">asyncio</span><span class="p">.</span><span class="nf">run</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="nf">call_api</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">))</span>
</code></pre></div></div>

<p>This allows non-async code to use <code class="language-plaintext highlighter-rouge">call_api</code>, which is async.</p>

<h3 id="programmers-infer-parallelism">Programmers Infer Parallelism</h3>

<p>The way coroutines work is more than semantics. It directly affects
what is going on in programs that use them. I think programmers infer
parallelism from the asyncio objects, e.g. Lock and Semaphore. These
are words we learn in operating system courses. Coroutines execute
in a single thread.</p>

<p>When you write some asyncio code that reads from a file in an
asyncio-based web server such as Tornado, no other coroutine can
preempt the read loop unless there is a call to <code class="language-plaintext highlighter-rouge">await</code>.</p>

<p>This may seem
obvious in the context of this article, but the language of preemption
is implied in the
<a href="https://docs.python.org/3/library/asyncio-sync.html">asyncio documentation</a>:</p>

<blockquote>
  <p>asyncio synchronization primitives are designed to be similar to those
of the threading module with two important caveats:</p>

  <ul>
    <li>asyncio primitives are not thread-safe, therefore they should not be
used for OS thread synchronization (use threading for that);</li>
    <li>methods of these synchronization primitives do not accept the timeout
argument; use the asyncio.wait_for() function to perform operations
with timeouts.</li>
  </ul>
</blockquote>

<p>To me, the most important caveat is that coroutines are not
parallel. The language implies an equivalence to threads, which are
totally unrelated. All asyncio operations are not thread safe except
<a href="https://docs.python.org/3/library/asyncio-eventloop.html#asyncio.loop.call_soon_threadsafe">call_soon_threadsafe</a>.</p>

<h3 id="yield-to-the-event-loop">Yield to the Event Loop</h3>

<p>You have to pay attention when coding coroutines. Cooperative
multitasking requires yielding to the event loop whenever real work is
being done. By real work, this could be blocking I/O or
computation. Blocking I/O is solved by <code class="language-plaintext highlighter-rouge">aiofiles</code> (discussed
above).</p>

<p>If a coroutine has a loop, it needs yield to the event loop in its
loop unless the loop is “fast” or calls <code class="language-plaintext highlighter-rouge">await</code> in the loop. The
meaning of “fast” is obviously in the eye of the beholder.</p>

<p>In the <code class="language-plaintext highlighter-rouge">job_supervisor</code> we yield to the event loop <a href="https://github.com/radiasoft/sirepo/blob/06ae456eca538aaa577e6cf9abe83e17518aefa1/sirepo/job_supervisor.py#L595">when garbage
collecting old jobs</a>:</p>

<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">for</span> <span class="n">u</span><span class="p">,</span> <span class="n">jids</span> <span class="ow">in</span> <span class="p">(</span><span class="k">await</span> <span class="nf">_uids_to_jids</span><span class="p">(</span><span class="n">too_old</span><span class="p">,</span> <span class="n">qcall</span><span class="p">)).</span><span class="nf">items</span><span class="p">():</span>
    <span class="k">with</span> <span class="n">qcall</span><span class="p">.</span><span class="n">auth</span><span class="p">.</span><span class="nf">logged_in_user_set</span><span class="p">(</span><span class="n">u</span><span class="p">):</span>
        <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="n">jids</span><span class="p">:</span>
            <span class="nf">_purge_job</span><span class="p">(</span><span class="n">jid</span><span class="o">=</span><span class="n">j</span><span class="p">,</span> <span class="n">too_old</span><span class="o">=</span><span class="n">too_old</span><span class="p">,</span> <span class="n">qcall</span><span class="o">=</span><span class="n">qcall</span><span class="p">)</span>
    <span class="k">await</span> <span class="n">sirepo</span><span class="p">.</span><span class="n">util</span><span class="p">.</span><span class="nf">yield_to_event_loop</span><span class="p">()</span>
</code></pre></div></div>

<p><a href="https://github.com/radiasoft/sirepo/blob/06ae456eca538aaa577e6cf9abe83e17518aefa1/sirepo/util.py#L511"><code class="language-plaintext highlighter-rouge">sirepo.util.yield_to_event_loop</code></a>
is wrapper, which allows us to document this magic:</p>

<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">async</span> <span class="k">def</span> <span class="nf">yield_to_event_loop</span><span class="p">():</span>
    <span class="k">await</span> <span class="n">asyncio</span><span class="p">.</span><span class="nf">sleep</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
</code></pre></div></div>

<p><a href="https://docs.python.org/3/library/asyncio-task.html#asyncio.sleep"><code class="language-plaintext highlighter-rouge">asyncio.sleep(0)</code> has special semantics</a>:</p>

<blockquote>
  <p>Setting the delay to 0 provides an optimized path to allow other
tasks to run. This can be used by long-running functions to avoid
blocking the event loop for the full duration of the function call.</p>
</blockquote>

<p>(Nit: I hate tricks like this. They should just have provided
<code class="language-plaintext highlighter-rouge">asyncio.yield_to_event_loop</code>.)</p>

<h3 id="await-does-not-always-yield"><code class="language-plaintext highlighter-rouge">await</code> does not Always Yield</h3>

<p>The use of <code class="language-plaintext highlighter-rouge">await</code> does mean “yield to the event loop”. In the
following code <code class="language-plaintext highlighter-rouge">await some_func()</code> executes completely synchronously:</p>

<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">async</span> <span class="k">def</span> <span class="nf">some_func</span><span class="p">():</span>
    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">1000</span><span class="p">):</span>
        <span class="k">await</span> <span class="nf">sync_func</span><span class="p">()</span>

<span class="k">async</span> <span class="k">def</span> <span class="nf">sync_func</span><span class="p">():</span>
    <span class="k">pass</span>
</code></pre></div></div>

<p>This code would execute the same in the event loop if we removed
<code class="language-plaintext highlighter-rouge">async</code> and <code class="language-plaintext highlighter-rouge">await</code> keywords. This may seem obvious in this simple
example, it’s not obvious in any non-trivial coroutine.</p>

<p>This is important, because unless you know exactly what the coroutine
being awaited on does, there’s no guarantee that a loop which contains
an <code class="language-plaintext highlighter-rouge">await</code> actually releases the processor. This means you have to
break the abstraction of any coroutines you call, or you have to
always call <code class="language-plaintext highlighter-rouge">yield_to_event_loop</code>. This would be annoying, and it’s a
real problem in asyncio-based code. This is a Python specific issue,
and is a design flaw in my opinion.</p>

<h3 id="tornadoon_message">Tornado.on_message</h3>

<p>When we first wrote the supervisor, we assumed that
<a href="https://www.tornadoweb.org/en/stable/websocket.html#tornado.websocket.WebSocketHandler.on_message"><code class="language-plaintext highlighter-rouge">WebSocketHandler.on_message</code></a>
is a coroutine, because it can be defined that way. This is another
example of inferring something the behavior of coroutines, which I
believe would true for thread-based web server.
There’s an
<a href="https://github.com/tornadoweb/tornado/issues/2941">open issue</a> about
this in Tornado so we aren’t the only ones who made this assumption.</p>

<p>The fix is to simply create a task in <code class="language-plaintext highlighter-rouge">on_message</code> as is
<a href="https://github.com/radiasoft/pykern/blob/79511e45c374c25d6971cef834a316769bd29427/pykern/api/server.py#L239">done in <code class="language-plaintext highlighter-rouge">pykern.api.server</code></a>:</p>

<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">async</span> <span class="k">def</span> <span class="nf">on_message</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">msg</span><span class="p">):</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="c1"># WebSocketHandler only allows one on_message at a time
</span>        <span class="n">pykern</span><span class="p">.</span><span class="n">pkasyncio</span><span class="p">.</span><span class="nf">create_task</span><span class="p">(</span>
            <span class="n">self</span><span class="p">.</span><span class="n">pykern_api_connection</span><span class="p">.</span><span class="nf">handle_on_message</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
        <span class="p">)</span>
    <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
        <span class="nf">pkdlog</span><span class="p">(</span><span class="sh">"</span><span class="s">exception={} stack={}</span><span class="sh">"</span><span class="p">,</span> <span class="n">e</span><span class="p">,</span> <span class="nf">pkdexc</span><span class="p">())</span>
</code></pre></div></div>

<p>I want to emphasize again the importance of logging at this level. If
there is an exception in <code class="language-plaintext highlighter-rouge">handle_on_message</code>, a stack trace will be
logged. The exception is not raised, because there’s no value in
having Tornado process the exception. WebSocket messages are
simple. There are no replies so there’s nothing for Tornado to do, and
it has no useful context for this problem (in our code).</p>

<h3 id="debugging">Debugging</h3>

<p>In our experience, debugging coroutines is just as hard as threads,
and possibly harder. A coroutine is not visible to the operating
system. If a thread is an infinite loop, for example, you can easily
see that with a operating system thread monitoring tool like
<a href="https://man7.org/linux/man-pages/man1/top.1.html"><code class="language-plaintext highlighter-rouge">top</code></a>. Coroutines
can’t be monitored externally. All you see is the whole process is
busy computing.</p>

<p>Coroutines do not have race conditions, which eliminates one very
difficult class of defect. However, they can deadlock.  When two or
more coroutines are deadlocked, there’s no insight with normal
operating system tools. There are tools to see threads which are
blocked, which greatly helps debugging.</p>

<p>The way we debug is to have very good logging. Every new hard to debug
defect usually results in improved log messages either to include more
context or messages in places that were missing.</p>

<p>Sirepo uses
<a href="https://github.com/radiasoft/pykern/blob/79511e45c374c25d6971cef834a316769bd29427/pykern/pkdebug.py"><code class="language-plaintext highlighter-rouge">pykern.pkdebug</code></a>
which allows (real-time) control of logging on a per line, function,
or module basis. A regular expression controls the output. If the
controlling regular expression is not set (normal case), the log
function does nothing, which is efficient. This type of logging can be
useful in particularly difficult defects, where you don’t want to
flood the production logs when the system is running normally.</p>

<p><code class="language-plaintext highlighter-rouge">asyncio</code> has a static environment variable
<a href="https://docs.python.org/3/library/asyncio-dev.html"><code class="language-plaintext highlighter-rouge">PYTHONASYNCIODEBUG</code></a>,
which logs interesting information about coroutines, e.g. long running
coroutines, not awaited coroutines (common problem), and exceptions
raised when calling asyncio APIs from the wrong thread.</p>

<h3 id="summary">Summary</h3>

<p><code class="language-plaintext highlighter-rouge">asyncio</code> is part of Python now, and more and more code will use
it. Hopefully this article helps you write more effective
coroutines. It’s not as easy as it looks, but as you develop your own
coroutine coding patterns, it becomes manageable.</p>

<p>Other people have written extensively about coroutines. Here are some
useful references in alphabetical order:</p>

<ul>
  <li><a href="https://www.bitecode.dev/p/asyncio-twisted-tornado-gevent-walk">Asyncio, twisted, tornado, gevent walk into a bar…</a></li>
  <li><a href="https://bhch.github.io/posts/2017/12/serving-large-files-with-tornado-safely-without-blocking/">Serving large files with Tornado safely without blocking</a></li>
  <li><a href="https://stackoverflow.com/a/59780868">Stack Overflow: Does <code class="language-plaintext highlighter-rouge">await</code> in Python yield to the event loop?</a></li>
  <li><a href="https://forum.unity.com/threads/why-do-people-hate-coroutines.260160/page-3#post-1722915">Unity Forum: Why do people hate Coroutines?</a></li>
  <li><a href="https://dev.to/martinhaeusler/why-i-stopped-using-coroutines-in-kotlin-kg0">Why I stopped using Coroutines in Kotlin</a></li>
</ul>]]></content><author><name></name></author><summary type="html"><![CDATA[The Initial Project]]></summary></entry><entry><title type="html">Flukes, Flaws, &amp;amp; Goblin’s BandBox</title><link href="https://www.robnagler.com/2024/04/28/Flukes-Flaws-BandBox.html" rel="alternate" type="text/html" title="Flukes, Flaws, &amp;amp; Goblin’s BandBox" /><published>2024-04-28T12:00:00+00:00</published><updated>2024-04-28T12:00:00+00:00</updated><id>https://www.robnagler.com/2024/04/28/Flukes-Flaws-BandBox</id><content type="html" xml:base="https://www.robnagler.com/2024/04/28/Flukes-Flaws-BandBox.html"><![CDATA[<p>This was going to be a simple article about how to build
<a href="https://www.goblinsgym.com/bandbox.pdf">Goblin’s BandBox</a>, which is a
clever piece of exercise equipment created by
<a href="https://www.instagram.com/goblinsgym/">Pascal Dornier</a>. The dice of
life didn’t roll as I had hoped. What follows includes the
instructions and my quixotic quest for perfection. It
even involves a car chase.</p>

<h3 id="goblins-bandbox">Goblin’s BandBox</h3>

<p>I have been expanding my home gym. I wanted to do trap bar deadlifts,
but I didn’t want a big trap bar and weights just for deadlifts. One
way to do this is with resistance bands.</p>

<p>My friend Devon, whom I recently visited, likes to travel light and
uses resistance bands exclusively for working out. He’s in great shape
so I thought I’d try them, too.  I tried deadlifting with them under
my feet. Then I tried with a board under my feet to hold down the
resistance bands, but it was awkward.</p>

<p>Then I discovered Goblin’s BandBox.  You can watch
<a href="https://youtu.be/iMhuDaR_hwU?si=KNiFkt-9So77Klh7">Pascal in an instructional video</a>
to see how it works. Very cool. He even provides an
<a href="https://www.goblinsgym.com/bandbox.pdf">instruction manual</a>.</p>

<p id="finished-bandbox">Here’s what mine looks like from the top:</p>

<p><a href="/assets/i/20240428/finished-bandbox-top.jpg"><img src="/assets/i/20240428/finished-bandbox-top.jpg" alt="Finished BandBox Top" width="600" /></a></p>

<p>And, the bottom:</p>

<p><a href="/assets/i/20240428/finished-bandbox-under.jpg"><img src="/assets/i/20240428/finished-bandbox-under.jpg" alt="Finished BandBox Underneath" width="600" /></a></p>

<p>You might see some flaws, e.g. the notches on the top are a
mistake. There are many others. It makes me sad to look at it, because
I worked very hard to get here. The important thing I have to remember
is that it works well, and I don’t have to have a trap bar and plates.</p>

<h3 id="bandbox-fixation">BandBox Fixation</h3>

<p>One alternative to the BandBox is to use a board with feet so the
bands can slide underneath. You
<a href="https://wittersmanufacturing.com/shop/ols/products/the-masterplate">can buy one for $300</a>.
Some people built the same thing using a
<a href="https://youtu.be/tmEIG3b0-8Q?t=173s">plastic cutting board with hockey pucks for the feet</a>. However,
Goblin’s BandBox is better and allows for other activies like side
pulls.</p>

<p>My BandBox fixation became acute. I sought out what Pascal calls “idle
rollers”, which are called “gravity rollers” in the US. I should
mention that Pascal is Swiss, and you might notice the quality of the
rollers. I wanted to find those, and I couldn’t. I honed in on
<a href="https://www.amazon.com/dp/B06XNN8PGY">15 inch rollers</a> after a bit,
and ordered those. Pascal
<a href="https://www.reddit.com/r/ResistanceBand/comments/xna9bd/comment/iptedso/">said</a>
it is hard to find those, but that wasn’t the hard part for me.</p>

<p>The most difficult piece to get was the anti-slip phenolic resin
plywood, which I could only find in 4x8 sheets and nothing
local. (While finding links for this article, I ran into
<a href="https://www.etsy.com/listing/563485077/anti-slip-mesh-phenolic-birch-plywood">this on Etsy</a>,
which would have been a good option. Buffalo board is not a name I had
seen before, and that’s a good term to search for in the US.) I have a
<a href="https://www.amazon.com/dp/B07ZRCCNM9">plyo box</a> which is made out of
the same anti-slip plywood. I figured this was going to be my
cheapest and easiest option so I ordered one to use for this part.</p>

<p>All of this researching took quite a bit of time. I was quite fixated
on making the best possible BandBox, of course. I’m glad the research
phase was over.</p>

<h3 id="first-sketch">First Sketch</h3>

<p>The rollers arrived. They are solid and worked well. I started my first
sketch:</p>

<p><a href="/assets/i/20240428/sketch-1.jpg"><img src="/assets/i/20240428/sketch-1.jpg" alt="First BandBox Sketch" height="400" /></a></p>

<p>The initial depth (height in the sketch) was going to be 19 inches
which was large. The rollers are very long, and this meant the whole
box was going to be quite large. I wasn’t happy with the net weight of
the end product either. I felt like there had to be a better solution.</p>

<p>That’s when I did even more research to figure out a better
solution. I get kind of lost in these research activities so I spent
way more time than I needed to. A
<a href="https://www.reddit.com/r/ResistanceBand/comments/xna9bd/comment/ipwrygj/">Reddit post</a>
mentioned PVC and dowels instead of rollers. This is what I ended up
using. I’m happy with the solution, because it’s not as deep or as
heavy.</p>

<h3 id="wood-fixation">Wood Fixation</h3>

<p>The box hardware stores have crappy 2x4s. They are quite uneven or
damaged on one side. I spent too long going through stacks of 2x4s
trying to find the “right one”. I ended up buying a stair tread,
something I’ve used before for nice pine. They have to be straight and
clean or people are going to trip going up the stairs. They are
typically 1 inch thick, which was <em>almost</em> perfect. I had to
compromise.</p>

<p>This meant cutting a 1 inch piece of wood straight. These are the side
pieces of the BandBox and they have to be level so the box sits flat
and so the cross piece (where you place your feet) is level. I figured
a cutting experiment was in order. You can see the left over piece of
stair tread in the first picture. My cuts (without a table saw or
guide rail) were too uneven to work well. And anyway, 1 inch was a
little narrow for the dowel/PVC holes.</p>

<p>There are many lumber places near where I live. I was out driving near
one and stopped by.  It was pretty quiet outside. Of course, it turned
out to be just the warehouse even though Google Maps said it was a
retail store. An employee said the store was actually 5 miles farther
away. There were others nearby, but I decided to call them
first. Nobody had clean 2x4 pine in stock. Everybody in Denver
recommends <a href="https://www.austinhardwoods.com">Austin Hardwoods</a>, which
I decided was too far out of the way.</p>

<p>To cut my wood fixation short, I was in Boulder and went to
<a href="https://sterlinglbr.com">Sterling Lumber</a> (locals know this as
Boulder Lumber). They had very nice maple 1x4s so I bought 9 feet, had
them cut it in half to fit in my car, and went home.</p>

<h3 id="crooked-wood">Crooked Wood</h3>

<p>The maple cost $50 ($5.50 per linear foot) so I figured it <em>had</em> to be
straight. My motto: cut twice, measure once. I should have
checked. The piece was warped, and my idea of screwing two pieces of
wood together to form a 2x4 was going to take some work.</p>

<p>Aside. When you buy dimensional lumber in the US, e.g. 2x4s and 1x4s,
you get something less than advertised. A 1x4 is really .75 by 3.5
inches. A 2x4 is really 1.5 by 3.5 inches. You can’t be annoyed by
this, but you need to take this into account.</p>

<p>Interestingly, the single 1x4 was actually not 3.5 inches
wide. Rather, it was slightly tapered. This might not matter if you
are building something, but it was off enough that I was also going to
have a sanding job to even out the pieces for solid support.</p>

<p>I figured that it wouldn’t be too bad to screw and glue the wood
together so end wood fixation. Time to cut, I mean, measure.</p>

<h3 id="second-sketch">Second Sketch</h3>

<p>I ended up with 1.25 inch oak dowels. The PVC tubing is labeled as 1
1/4, which is actually 1.375 inch so a 1.25 inch dowel fits perfectly
for smooth rolling. It was time for a second sketch:</p>

<p><a href="/assets/i/20240428/sketch-2.jpg"><img src="/assets/i/20240428/sketch-2.jpg" alt="Second BandBox Sketch" height="400" /></a></p>

<p id="pascals-sketch">I was feeling quite good about the wood and dimensions. Things were
coming together. Take note of the quick three sets of parallel lines
where the three extra holes would go. I was following
<a href="https://www.goblinsgym.com/bandbox.pdf">Pascal’s diagram</a>
(included without permission):</p>

<p><a href="/assets/i/20240428/pascal-sketch.jpg"><img src="/assets/i/20240428/pascal-sketch.jpg" alt="Second BandBox Sketch" height="250" /></a></p>

<p>I’m referring here to holes 4A through 4F.</p>

<h3 id="cut-the-cake">Cut the Cake</h3>

<p>This project was taking quite a bit of time, and I was starting to get
annoyed with my perfectionism. That’s always a bad sign for me. I
needed to take some breaths. Thankfully Janis helped me see that the
product wasn’t as important as the process. I actually like building
things, but I still get upset at myself for taking so long doing
it. This is a common loop I get into. By writing this article, I hope
to help myself process this process.</p>

<p>The dowels were first. They had to be even, because they would form
part of the support of the box. I used a backsaw and cheap mitre box
that I’ve had for years. Oak is pretty tough to cut, and it took
longer than expected.</p>

<p>For the PVC, I broke out the reciprocating saw. The PVC was harder to
clamp so the backsaw wasn’t going to work. Naturally in my carefulness
about the PVC I got my thumb between the back of the shoe and the
chassis. Ouch!</p>

<p>The maple boards were next, and they went smoothly. I was careful to
clamp them together so that the two pieces would be the same length. A
little crooked on the end, since I was using a circular saw, free
hand.</p>

<h3 id="puzzling-over-the-plyobox">Puzzling over the Plyobox</h3>

<p>The anti-slip plywood was next. I needed to figure out how to get the
right pieces out of the plyo box, which comes in six pieces with lots
of logos and holes in the wrong places. Here’s a picture of the
<a href="https://www.amazon.com/dp/B07ZRCCNM9">assembled plyo box</a> (included
without permission):</p>

<p><a href="/assets/i/20240428/plyobox.jpg"><img src="/assets/i/20240428/plyobox.jpg" alt="Yes4All 20x18x16 Plyobox" height="250" /></a></p>

<p>What I had failed to think about was the length of each piece was not
20 inches or 18 inches. I needed two pieces that were 8 x 16
inches. That meant the 16 inch piece was right out, and the 18x16
piece was the best choice.</p>

<p>I screwed the two faces together, checking carefully that I would
get minimal writing on the foot plate. After screwing together the
resin coated faces to avoid messing up the resin, I ended up with
this:</p>

<p><a href="/assets/i/20240428/first-foot-plate.jpg"><img src="/assets/i/20240428/first-foot-plate.jpg" alt="First foot plate" height="250" /></a></p>

<p>This made me happy despite a few imperfections in the resin. I was
annoyed, but I wasn’t going to fuss over it.</p>

<h3 id="sanding-and-hands">Sanding and Hands</h3>

<p>The crooked maple pieces needed to be sanded to make them even. This
turned out to be quite a job. Maple is dense, and it takes a long time
to sand it down. I was using a vibrating sander which makes a mess,
and well, vibrates.</p>

<p>I had done all this in one day, because I wanted to be done with the
messy cutting and sanding. It was getting on 4 or 5 hours, which, back
in the day, would have been no problem for me. Given my age and lack
of recent woodworking, I should have not been surprised when my hands
cramped, like big time.</p>

<p>In the end, I had to accept the limits of my aging body, and stop for
the day. This was very frustrating, because there was plenty of
light and I wasn’t ready to stop.</p>

<p>This fluke in my process really hit me hard. I don’t like feeling my
age. I am generally fine with it, and I accept many limits. My hands
are the one thing that I worry about.</p>

<h3 id="dowelry">Dowelry</h3>

<p>With all pieces finally sanded, the next step was assembly. While I
was happy with the wood dowels, what I failed to think about was that
the 1.25 inch dowels were quite wide. Remember holes 4A through 4F in
<a href="#pascals-sketch">Pascal’s sketch</a>? Well, it was going to be really
hard to achieve that.</p>

<p>In hindsight, I should have used two different sized dowels. A
BandBox’s rollers need to be wide so the bands aren’t pinched when
looping over the roller. However, the in-between dowels are fixed, and
the bands aren’t intended to move over them. I probably could have
gotten away with 1 inch dowels all around, or even 0.75 inch dowels for
the removable pins which help when doing one sided exercises.</p>

<h3 id="third-sketch">Third Sketch</h3>

<p>The best plan was to have two holes underneat the foot plates instead
of three. Here’s the quick sketch I did:</p>

<p><a href="/assets/i/20240428/sketch-3.jpg"><img src="/assets/i/20240428/sketch-3.jpg" alt="Third BandBox Sketch" width="600" /></a></p>

<p>More compromises due to the randomness of the process. While it seemed
like I was planning thoroughly, I simply didn’t have the experience to
know to plan this part out fully. I didn’t want to sit in sketchup for
hours, and as it turns out, I’m glad I didn’t. I was in for more
chaos.</p>

<h3 id="hard-wood-drilling">Hard Wood Drilling</h3>

<p>Luckily my son has a drill press so I was able to cut precise holes in
the maple support pieces. I just needed to mark things out when I
realized that I had a 1 inch forstner drill bit and one that was 1.375
inches. The latter was what I was going to use for the holes for the
removable pins. That’s why I bought 1.25 inch dowels in the first
place.</p>

<p>Off to the hardware store to buy a 1.25 inch forstner drill bit. That
was an ouch of about $20 that I hadn’t planned for.</p>

<p>The drilling itself went quite well. I got the shopvac
out. Drilling large holes creates a lot of wood shavings. Drilling
into maple even more. The drill bit got hot. I would stop to vacuum up
the shavings. It was only after the third hole that I realized I could
hold the vacuum hose right next to the drill bit. I had done this in
the past, but being out of practice, I forgot. That made the mess
cleaner, but then I had to allow time for the bit to cool down.</p>

<p>It took about 5 minutes to drill one large hole. I had picked maple,
because I wanted it to look nice. It would have been much better to
use pine. Strong enough, and it would have looked good
enough. Drilling would have been faster and better.</p>

<p>The small holes for the screws were the worst. I should have regeared
the drill press, but I was too lazy. It went too fast and the wood
smoked. Going slowly didn’t seem to help. The smaller bit got much
hotter, faster than the forstner bits, which have much more mass and
better contact with the drill chuck which also dissipates the heat.</p>

<p>I should mention that I clamped the two inner support pieces of wood
face to face to make the first set of holes. Once the two end holes
were cut, I could put in some leftover dowel pieces to ensure all the
dowel holes would align. Here’s what the drilling looks like:</p>

<p><a href="/assets/i/20240428/drilling-side-pieces.jpg"><img src="/assets/i/20240428/drilling-side-pieces.jpg" alt="Drilling Support Pieces" height="250" /></a></p>

<h3 id="assembly">Assembly!</h3>

<p>With all the pieces cut, sanded, drilled, and sanded (again), it was time to
assemble everything. This was an evening activity, because assembly is
always simple after the hard work above. Here are all the parts
beautifully arranged:</p>

<p><a href="/assets/i/20240428/unassembled-parts.jpg"><img src="/assets/i/20240428/unassembled-parts.jpg" alt="Unassembled Parts" height="250" /></a></p>

<p>Be sure to go back and look at the
<a href="#finished-bandbox">finished BandBox</a> and compare the parts to see if
you can see a key difference between these parts and what finally got
assembled.</p>

<h3 id="cluttered-work-area-cluttered-mind">Cluttered Work Area, Cluttered Mind</h3>

<p>Again, I was getting annoyed with how long this project was
taking. Part of my frustration was that I don’t have a dedicated work
bench any more, because we needed space in the garage for both
cars. My work area was a mess:</p>

<p><a href="/assets/i/20240428/tool-mess.jpg"><img src="/assets/i/20240428/tool-mess.jpg" alt="Tools All Over the Place" height="250" /></a></p>

<p>I started assembling.</p>

<p>I screwed the side pieces together, and I quickly realized that I
wasn’t going to flatten the bent side pieces with screws. A couple of
screws broke so I was going to have to glue the pieces together. No
tragedy, and the end product would be stronger.</p>

<h3 id="screw-you-glue">Screw You Glue</h3>

<p>Since the screws broke in the first attempts at assembly, I went to
the hardware store one more time to get better screws. Unlike the
selection of the wood, I rushed the process. I also didn’t think
clearly. I bought some brass screws which looked better, but were
actually <em>weaker</em> than the steel screws I was using. They were also
longer, which was good, but that made them even more likely to break
off.</p>

<p>When I was screwing the wood together after gluing and clamping, I
broke off a head in the side piece. This got me pretty flustered. I
should have known brass screws were weaker. I started beating myself
up pretty badly.</p>

<p>If you have read
<a href="/1991/12/31/Zen-and-The-Art-of-Motorcycle-Maintenance.html">Zen and the Art of Motorcycle Maintenance</a>,
you will know that I was in a
<a href="https://en.wikipedia.org/wiki/Zen_and_the_Art_of_Motorcycle_Maintenance#Gumption_traps">gumption trap</a>,
and more mistakes were going to be made.</p>

<p>Finally, the first side piece was glued, and I was ready to call it a
night.</p>

<h3 id="devastation">Devastation</h3>

<p>As I mentioned, my garage was a mess. I needed a good place to put my
perfectly cut, drilled, and sanded pieces of wood that had yet to be
assembled while I was putting the one side piece together. What better
place than on top of the car? Not.</p>

<p>Yes, I forgot to move that off the car when I stopped for the
night. And, yes, someone drove off with the parts on top of the car
the next day.</p>

<p>I just happened to go into the garage midday (the glue was still
curing), and I just happened to see a piece of wood on the car after
the car <em>was back</em>. Unbelievably, one of the two side pieces were on top
of the car after having been driven over five miles with two
stops.</p>

<p>If I hadn’t seen that piece of wood at that time, I probably would
have completely chucked it in. As it was, I was completely devastated
by having to start over again. The one piece that was lost had 9 very
difficult to drill holes in it. I couldn’t imagine matching it up to
the other side piece that was being glued.</p>

<h3 id="car-chase">Car Chase</h3>

<p>After much encouragement by Janis, I went outside to look for the
wood piece thinking it had to have fallen off right next to the
house.</p>

<p>I came back in the house, and I told Janis I couldn’t find it. Janis
said, maybe it fell off nearby? I was distraught and angry with
myself. A great time to get into a car, I always say. Maybe I should
have grabbed a beer for the road.</p>

<p>No accidents, and yes, I found the other piece. It wasn’t too beat up
either. Just some minor dings on the corners:</p>

<p><a href="/assets/i/20240428/damaged-side-piece.jpg"><img src="/assets/i/20240428/damaged-side-piece.jpg" alt="Damaged Side Piece" height="250" /></a></p>

<p>I still cannot fathom how it stayed on the car for over 3 miles. It
fell off in a very safe place (for a piece of wood) on an overpass
crossing I-70 where there was a bit of shoulder, which no cars would
likely drive on.</p>

<p>The only word for this is a fluke, which also happens to be the name
of a
<a href="/2019/02/15/Fluke.html">book I recommend</a>.
This is simply the law or large numbers at work.</p>

<h3 id="the-missing-piece">The Missing Piece</h3>

<p>After gluing the other piece together, I was ready to put it all
together. I just had to drill some holes in the edges to match up the
predrilled holes in the foot plates that were – yes, you guessed it
– were lost a few days before.</p>

<p>For some reason, it didn’t occur to me that there were four pieces of
wood on top of the car: the two side pieces and the two foot
plates. The foot plates were gone, gone, gone. I was going out anyway,
and half-heartedly looked for them. Maybe they’ll show up on my front
door (fluke!) some day.</p>

<p>However, I had to accept them as missing. This meant I had to use the
20x18 sides of the plyo box that I was holding in reserve. These are
the ones with the big Yes4All written across them.</p>

<h3 id="the-last-flaw-not">The Last Flaw, Not!</h3>

<p>I matched up the pieces of wood carefully. Then I did the math, and I
said 20 minus 4 is 16, which is the length of the foot plate I
needed. I cut 4 inches off one side. When I went to cut the other
side, I realized that I had cut too much. Here’s what it ended up
looking like in the <a href="#finished-bandbox">finished product</a>:</p>

<p><a href="/assets/i/20240428/incorrect-cut.jpg"><img src="/assets/i/20240428/incorrect-cut.jpg" alt="Incorrectly Cut Plyobox" /></a></p>

<p>I thought about buying a new plyo box, but that would have been $90. I
also thought I could replace the piece if someday I happened upon some
anti-slip phenolic resin plywood. However, there would be one more
flaw.</p>

<h3 id="screwing-around">Screwing Around</h3>

<p>A big storm was coming in, and I wanted to be done with the messy
cutting parts that I wanted to do outside. Definitely should have
taken a breather, but I didn’t.  Instead, I broke off several screw
heads before I realized I was trying to go too deep into the maple. It
was not necessary. More mistakes:</p>

<p><a href="/assets/i/20240428/broken-screws.jpg"><img src="/assets/i/20240428/broken-screws.jpg" alt="Incorrectly Cut Plyobox" /></a></p>

<p>Once I switched to shorter screws and drilled out the wood a couple of
times (till the smoke stopped pouring out) that I was able to use
shorter (1.625 inch) deck screws without breaking
heads.</p>

<p>Good thing that the BandBox works as intended. Time to quit working
wood and start working out!</p>

<h3 id="new-dimensions">New Dimensions</h3>

<p>I hope this story was entertaining and/or informative. I rushed
through it mostly to get all the text written. I hope to get some
edits from you, dear reader. Unlike woodwooking, writing and software
are much more editable.</p>

<p>For those of you who want to attempt this, here are some dimensions on
the side pieces:</p>

<p><a href="/assets/i/20240428/inner-side-piece.jpg"><img src="/assets/i/20240428/inner-side-piece.jpg" alt="Inner Side Piece" /></a></p>

<p>The outside side pieces only have holes for the removable pins:</p>

<p><a href="/assets/i/20240428/outer-side-piece.jpg"><img src="/assets/i/20240428/outer-side-piece.jpg" alt="Outer Side Piece" /></a></p>

<p>Parts List (measurements in inches):</p>

<ul>
  <li>(4) 1x4 board 25W (supports)</li>
  <li>(2) 5/8 anti-slip phenolic resin plywood 16L x 8W (foot plates)</li>
  <li>(4) 1 1/4 PVC 12.75L</li>
  <li>(4) 1 1/4 dowel 14.5L (support PVC)</li>
  <li>(2) 1 1/4 dowel 18L (removable pins)</li>
  <li>(8) 1 5/8 deck screws</li>
  <li>(10) 1 1/4 flathead wood screws</li>
</ul>

<p>P.S. there were even more incorrect cuts, but I’ve already bored you enough.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[This was going to be a simple article about how to build Goblin’s BandBox, which is a clever piece of exercise equipment created by Pascal Dornier. The dice of life didn’t roll as I had hoped. What follows includes the instructions and my quixotic quest for perfection. It even involves a car chase.]]></summary></entry><entry><title type="html">Back in the S&amp;amp;P 500</title><link href="https://www.robnagler.com/2023/08/21/Back-in-the-SP500.html" rel="alternate" type="text/html" title="Back in the S&amp;amp;P 500" /><published>2023-08-21T12:00:00+00:00</published><updated>2023-08-21T12:00:00+00:00</updated><id>https://www.robnagler.com/2023/08/21/Back-in-the-SP500</id><content type="html" xml:base="https://www.robnagler.com/2023/08/21/Back-in-the-SP500.html"><![CDATA[<p><a href="/2020/07/21/Betting-on-Amazon.html">I bet it all on Amazon</a>
starting in July 2020. By February 2022, I realized I just didn’t have
the stomach for it. It was a big bet. During that period, I lost 3.0%
<a href="https://www.bivio.com/site-help/bp/Investment_Performance_Report_Help">AIRR</a>,
and the S&amp;P 500 gained 20.6% (AIRR), or a cummulative 40.6% loss in
comparison to the S&amp;P 500.</p>

<p>I wrote in 2020:</p>
<blockquote>
  <p>I wonder what I’ll be saying about this article in 10 years.</p>
</blockquote>

<p>“Ouch!” is what I say after three years.</p>

<p>However, if I had stayed in Amazon until today (August 2023), the AIRR
would be -4.4% in comparison 16% for the S&amp;P 500. Total cummulative
loss would have been 46.1%. Yay!</p>

<h2 id="jump-in">Jump In!</h2>

<p>For those of you who know me, I jump in to pretty much anything I do
with all four paws. It sometimes hurts a lot, and other times, it
feels great.</p>

<p>I don’t think of myself as impulsive. I think things through as best
as I can, and then I decide. If I had decided to keep half in the S&amp;P
500 and half in Amazon, I would have fared better, of course. That’s
just not me.</p>

<h2 id="hire-warren-buffett">Hire Warren Buffett</h2>

<p><a href="/2014/11/27/Lazy-Investing.html">In 2014, I wrote</a>:</p>
<blockquote>
  <p>You can be as lazy as me and hire Warren, too.</p>
</blockquote>

<p>I was all in on Berkshire Hathaway from about 2003 to about March 2020
when I panicked, and got out of the market due to the COVID-19
scare. Panicking is never good, and hiring Warren Buffet is pretty
much always a reasonable choice.</p>

<p>If I had stayed in Berkshire from August 2003 till today, my AIRR
would have been 10.2%, and the S&amp;P 500 would have been 9.7%. Betting
on Buffet wasn’t bad advice, and I regret that I didn’t.</p>

<h2 id="be-sensible">Be Sensible</h2>

<p>I often say that you can’t take “half the advice” when someone is
giving it. This is part of my “all in” philosophy.</p>

<p>Long ago, Warren Buffett said, “Consistently buy an S&amp;P 500 low-cost
index fund. I think it’s the thing that makes the most sense
practically all of the time.”</p>

<p>I have many decades of investing experience. I started out “right” in
the early 1980’s after reading the
<a href="https://www.amazon.com/dp/B09YRRNCL3">Only Investment Guide You’ll Ever Need</a>
by Andy Tobias,
and thinking index funds were the best investment. I have tried to
follow some of Tobias’s advice but not the index investing part. That
was probably the most import to follow.</p>

<h2 id="play-it-safe">Play It Safe</h2>

<p>In 2022, I wrote:</p>
<blockquote>
  <p>Diversification is thought to be safe, but it leads to owning a lot of
Day 2 companies.</p>
</blockquote>

<p>I think I am finally done trying to beat the advice of the Oracle of
Omaha and many other sages.</p>

<p>So that’s it. I’m all in on the S&amp;P 500, forever.</p>

<p>One more important point: It’s ok to make mistakes. Failure is an
option. You will recover from the vast majority of mistakes.
Just take the time to learn from them. If you are particularly wise,
take the time to learn from the mistakes of others, like mine.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[I bet it all on Amazon starting in July 2020. By February 2022, I realized I just didn’t have the stomach for it. It was a big bet. During that period, I lost 3.0% AIRR, and the S&amp;P 500 gained 20.6% (AIRR), or a cummulative 40.6% loss in comparison to the S&amp;P 500.]]></summary></entry><entry><title type="html">BookNotes: The Autobiography of Malcolm X</title><link href="https://www.robnagler.com/2022/02/20/Autobiography-of-Malcolm-X.html" rel="alternate" type="text/html" title="BookNotes: The Autobiography of Malcolm X" /><published>2022-02-20T21:00:00+00:00</published><updated>2022-02-20T21:00:00+00:00</updated><id>https://www.robnagler.com/2022/02/20/Autobiography-of-Malcolm-X</id><content type="html" xml:base="https://www.robnagler.com/2022/02/20/Autobiography-of-Malcolm-X.html"><![CDATA[<p>By Malcolm X, Ballantine, January 15, 1992, 0345376714</p>

<p>Alex Haley spent two years meeting with Malcolm X to produce The
Autobiography of Malcolm X, a brilliant work about a brilliant man. If
you don’t know anything about Malcom X other than he was a “radical”,
you should read this book. He was not a radical.</p>

<p>He had a horrible history (like the vast majority of blacks at the
time) which taught him many things: hate Whites and be strong. For
him, it was “enough is enough”. He overcame years of debauchery and
prison to become a leading light in the civil rights movement.</p>

<p>His flaws are evident, e.g. views of women. He was an
anti-integrationist, which on the one hand, makes sense, but it was
counter-productive and unrealistic. He complains about the
vainglorious white man, but he sounds vainglorious at times in the
book. Yet, he let us see his flaws in his autobiography. That’s
awesome.</p>

<p>I’m mixed on his views of Jews. I could argue he was angry that Jews
controlled the businesses frequented by Blacks (wouldn’t be the
first). I could also argue that he was singling out the Jews, just
because of what he saw. They didn’t own all (or even most) of the
businesses patronized by Blacks. He said he was antiexploitation,
which is fine, but he could have just pointed out (his conclusion)
that Blacks should have owned businesses. Fundamentally, Jews and
Blacks have a lot in common, down to the early history of Jews being
an enslaved people, which Malcom X knew well with his deep religious
studies.</p>

<p>All that aside, I enjoyed the book immensely. It’s critical to read
to get a good understanding of the civil rights movement in the 1960s
as well as another difficult personal story of an African American.</p>

<blockquote>
  <p>[k153] When my mother was pregnant with me, she told me later, a party of
hooded Ku Klux Klan riders galloped up to our home in Omaha, Nebraska,
one night. Surrounding the house, brandishing their shotguns and rifles,
they shouted for my father to come out.</p>
</blockquote>

<blockquote>
  <p>[k159] My father, the Reverend Earl Little, was a Baptist minister, a
dedicated organizer for Marcus Aurelius Garvey’s U.N.I.A. (Universal
Negro Improvement Association).</p>
</blockquote>

<blockquote>
  <p>[k169] Among the reasons my father had decided to risk and dedicate his
life to help disseminate this philosophy among his people was that he had
seen four of his six brothers die by violence, three of them killed by
white men, including one by lynching. What my father could not know then
was that of the remaining three, including himself, only one, my Uncle
Jim, would die in bed, of natural causes.</p>
</blockquote>

<blockquote>
  <p>[k178] Louise Little, my mother, who was born in Grenada, in the British
West Indies, looked like a white woman. Her father <strong>was</strong> white.</p>
</blockquote>

<blockquote>
  <p>[k179] Of this white father of hers, I know nothing except her shame
about it.</p>
</blockquote>

<blockquote>
  <p>[k185] The teaching of Marcus Garvey stressed becoming independent of the
white man.</p>
</blockquote>

<blockquote>
  <p>[k190] Soon, nearly everywhere my father went, Black Legionnaires were
reviling him as an “uppity nigger” for wanting to own a store, for living
outside the Lansing Negro district, for spreading unrest and dissention
among “the good niggers.”</p>
</blockquote>

<blockquote>
  <p>[k192] Shortly after Yvonne was born came the nightmare night in 1929,
my earliest vivid memory. I remember being suddenly snatched awake into a
frightening confusion of pistol shots and shouting and smoke and flames.</p>
</blockquote>

<blockquote>
  <p>[k197] The white police and firemen came and stood around watching as the
house burned down to the ground.</p>
</blockquote>

<blockquote>
  <p>[k203] After the fire, I remember that my father was called in and
questioned about a permit for the pistol with which he had shot at the
white men who set the fire.</p>
</blockquote>

<blockquote>
  <p>[k211] My father was also belligerent toward all of the children, except
me. The older ones he would beat almost savagely if they broke any of his
rules–and he had so many rules it was hard to know them all. Nearly all
my whippings came from my mother.</p>
</blockquote>

<blockquote>
  <p>[k233] The only Negroes who really had any money were the ones in the
numbers racket, or who ran the gambling houses, or who in some other way
lived parasitically off the poorest ones, who were the masses. No Negroes
were hired then by Lansing’s big Oldsmobile plant, or the Reo plant.</p>
</blockquote>

<blockquote>
  <p>[k277] I remember well how my mother asked me why I couldn’t be a nice
boy like Wilfred; but I would think to myself that Wilfred, for being so
nice and quiet, often stayed hungry. So early in life, I had learned that
if you want something, you had better make some noise. Not only did we
have our big garden, but we raised chickens.</p>
</blockquote>

<blockquote>
  <p>[k327] As the visitors tapered off, she became very concerned about
collecting the two insurance policies that my father had always been
proud he carried. He had always said that families should be protected in
case of death. One policy apparently paid off without any problem–the
smaller one.</p>
</blockquote>

<blockquote>
  <p>[k331] The company that had issued the bigger policy was balking at
paying off. They were claiming that my father had committed suicide.
Visitors came again, and there was bitter talk about white people: how
could my father bash himself in the head, then get down across the
streetcar tracks to be run over?</p>
</blockquote>

<blockquote>
  <p>[k343] She would go into Lansing and find different jobs–in housework,
or sewing–for white people. They didn’t realize, usually, that she was a
Negro. A lot of white people around there didn’t want Negroes in their
houses.</p>

  <p>She would do fine until in some way or other it got to people
who she was, whose widow she was. And then she would be let go.</p>
</blockquote>

<blockquote>
  <p>[k372] But there were times when there wasn’t even a nickel and we would
be so hungry we were dizzy. My mother would boil a big pot of dandelion
greens, and we would eat that.</p>
</blockquote>

<blockquote>
  <p>[k420] This was my first lesson about gambling: if you see somebody
winning all the time, he isn’t gambling, he’s cheating. Later on in life,
if I were continuously losing in any gambling situation, I would watch
very closely. It’s like the Negro in America seeing the white man win all
the time. He’s a professional gambler; he has all the cards and the odds
stacked on his side, and he has always dealt to our people from the
bottom of the deck.</p>
</blockquote>

<blockquote>
  <p>[k494] All I had done was to improve on their strategy, and it was the
beginning of a very important lesson in life–that anytime you find
someone more successful than you are, especially when you’re both engaged
in the same business–you know they’re doing something that you aren’t.</p>
</blockquote>

<blockquote>
  <p>[k500] Eventually my mother suffered a complete breakdown, and the court
orders were finally signed. They took her to the State Mental Hospital at
Kalamazoo.</p>
</blockquote>

<blockquote>
  <p>[k502] We were “state children,” court wards; he had the full say-so
over us. A white man in charge of a black man’s children! Nothing but
legal, modern slavery–however kindly intentioned.</p>
</blockquote>

<blockquote>
  <p>[k516] I truly believe that if ever a state social agency destroyed a
family, it destroyed ours. We wanted and tried to stay together. Our home
didn’t have to be destroyed. But the Welfare, the courts, and their
doctor, gave us the one-two-three punch. And ours was not the only case
of this kind.</p>
</blockquote>

<blockquote>
  <p>[k523] I have rarely talked to anyone about my mother, for I believe that
I am capable of killing a person, without hesitation, who happened to
make the wrong kind of remark about my mother.</p>
</blockquote>

<blockquote>
  <p>[k592] They all liked my attitude, and it was out of their liking for me
that I soon became accepted by them–as a mascot, I know now. They would
talk about anything and everything with me standing right there hearing
them, the same way people would talk freely in front of a pet canary.
They would even talk about me, or about “niggers,” as though I wasn’t
there, as if I wouldn’t understand what the word meant. A hundred times a
day, they used the word “nigger.” I suppose that in their own minds, they
meant no harm; in fact they probably meant well.</p>
</blockquote>

<blockquote>
  <p>[k603] What I am trying to say is that it just never dawned upon them
that I could understand, that I wasn’t a pet, but a human being. They
didn’t give me credit for having the same sensitivity, intellect, and
understanding that they would have been ready and willing to recognize in
a white boy in my position. But it has historically been the case with
white people, in their regard for black people, that even though we might
be <strong>with</strong> them, we weren’t considered of them. Even though they appeared to
have opened the door, it was still closed. Thus they never did really see
<strong>me</strong>.</p>

  <p>This is the sort of kindly condescension which I try to clarify
today, to these integration-hungry Negroes, about their “liberal” white
friends, these so-called “good white people”–most of them anyway.</p>
</blockquote>

<blockquote>
  <p>[k612] But I was no more than vaguely aware of anything like that in my
detention-home years. I did my little chores around the house, and
everything was fine.</p>
</blockquote>

<blockquote>
  <p>[k640] The one thing I didn’t like about history class was that the
teacher, Mr. Williams, was a great one for “nigger” jokes.</p>
</blockquote>

<blockquote>
  <p>[k643] Later, I remember, we came to the textbook section on Negro
history. It was exactly one paragraph long. Mr. Williams laughed through
it practically in a single breath, reading aloud how the Negroes had been
slaves and then were freed, and how they were usually lazy and dumb and
shiftless.</p>
</blockquote>

<blockquote>
  <p>[k649] Basketball was a big thing in my life, though. I was on the team;
we traveled to neighboring towns such as Howell and Charlotte, and
wherever I showed my face, the audiences in the gymnasiums “niggered” and
“cooned” me to death. Or called me “Rastus.”</p>
</blockquote>

<blockquote>
  <p>[k772] Mr. Ostrowski looked surprised, I remember, and leaned back in his
chair and clasped his hands behind his head. He kind of half-smiled and
said, “Malcolm, one of life’s first needs is for us to be realistic.
Don’t misunderstand me, now. We all here like you, you know that. But
you’ve got to be realistic about being a nigger. A lawyer–that’s no
realistic goal for a nigger. You need to think about something you <strong>can</strong>
be. You’re good with your hands–making things. Everybody admires your
carpentry shop work. Why don’t you plan on carpentry? People like you as
a person–you’d get all kinds of work.” The more I thought afterwards
about what he said, the more uneasy it made me. It just kept treading
around in my mind.</p>
</blockquote>

<blockquote>
  <p>[k781] They all reported that Mr. Ostrowski had encouraged what they had
wanted. Yet nearly none of them had earned marks equal to mine.</p>

  <p>It was a
surprising thing that I had never thought of it that way before, but I
realized that whatever I wasn’t, I <strong>was</strong> smarter than nearly all of those
white kids. But apparently I was still not intelligent enough, in their
eyes, to become whatever <strong>I</strong> wanted to be.</p>

  <p>It was then that I began to
change–inside.</p>
</blockquote>

<blockquote>
  <p>[k800] I went every Saturday to see my brothers and sisters in Lansing,
and almost every other day I wrote to Ella in Boston. Not saying why, I
told Ella that I wanted to come there and live.</p>

  <p>I don’t know how she did
it, but she arranged for official custody of me to be transferred from
Michigan to Massachusetts, and the very week I finished the eighth grade,
I again boarded the Greyhound bus for Boston.</p>
</blockquote>

<blockquote>
  <p>[k803] No physical move in my life has been more pivotal or profound in
its repercussions.</p>
</blockquote>

<blockquote>
  <p>[k807] Whatever I have done since then, I have driven myself to become a
success at it. I’ve often thought that if Mr. Ostrowski had encouraged me
to become a lawyer, I would today probably be among some city’s
professional black bourgeoisie, sipping cocktails and palming myself off
as a community spokesman for and leader of the suffering black masses,
while my primary concern would be to grab a few more crumbs from the
groaning board of the two-faced whites with whom they’re begging to
“integrate.”</p>

  <p>All praise is due to Allah that I went to Boston when I did.
If I hadn’t, I’d probably still be a brainwashed black Christian.</p>
</blockquote>

<blockquote>
  <p>[k822] Ella still seemed to be as big, black, outspoken and impressive a
woman as she had been in Mason and Lansing.</p>
</blockquote>

<blockquote>
  <p>[k1088] This was my first really big step toward self-degradation: when I
endured all of that pain, literally burning my flesh to have it look like
a white man’s hair. I had joined that multitude of Negro men and women in
America who are brainwashed into believing that the black people are
“inferior”–and white people “superior”–that they will even violate and
mutilate their God-created bodies to try to look “pretty” by white
standards.</p>
</blockquote>

<blockquote>
  <p>[k1131] White customers on the shine stand, especially, would laugh to
see my feet suddenly break loose on their own and cut a few steps. Whites
are correct in thinking that black people are natural dancers. Even
little kids are–except for those Negroes today who are so “integrated,”
as I had been, that their instincts are inhibited. You know those
“dancing jibagoo” toys that you wind up? Well, I was like a live
one–music just wound me up.</p>
</blockquote>

<blockquote>
  <p>[k1171] People like the sleep-in maid for Beacon Hill white folks who
used to come in with her “ooh, my deah” manners and order corn plasters
in the Jew’s drugstore for black folks.</p>
</blockquote>

<blockquote>
  <p>[k1426] Hundreds of Negro soldiers and sailors, gawking and young like
me, passed by. Harlem by now was officially off limits to white
servicemen. There had already been some muggings and robberies, and
several white servicemen had been found murdered. The police were also
trying to discourage white civilians from coming uptown, but those who
wanted to still did.</p>
</blockquote>

<blockquote>
  <p>[k1440] It didn’t take me a week to learn that all you had to do was give
white people a show and they’d buy anything you offered them. It was like
popping your shoeshine rag.</p>
</blockquote>

<blockquote>
  <p>[k1480] I never would forget that–that I couldn’t have whipped that
white man as badly with a club as I had with my mind.</p>
</blockquote>

<blockquote>
  <p>[k1599] Harlem’s numbers industry hummed every morning and into the early
afternoon, with the runners jotting down people’s bets on slips of paper
in apartment house hallways, bars, barbershops, stores, on the sidewalks.
The cops looked on; no runner lasted long who didn’t, out of his pocket,
put in a free “figger” for his working area’s foot cops, and it was
generally known that the numbers bankers paid off at higher levels of the
police department.</p>
</blockquote>

<blockquote>
  <p>[k1705] This shouldn’t reflect too badly on that particular building,
because almost everyone in Harlem needed some kind of hustle to survive,
and needed to stay high in some way to forget what they had to <strong>do</strong> to
survive.</p>
</blockquote>

<blockquote>
  <p>[k1713] I got my first schooling about the cesspool morals of the white
man from the best possible source, from his own women.</p>
</blockquote>

<blockquote>
  <p>[k1723] Domineering, complaining, demanding wives who had just about
psychologically castrated their husbands were responsible for the early
rush. These wives were so disagreeable and had made their men so tense
that they were robbed of the satisfaction of being men. To escape this
tension and the chance of being ridiculed by his own wife, each of these
men had gotten up early and come to a prostitute.</p>
</blockquote>

<blockquote>
  <p>[k1729] More wives could keep their husbands if they realized their
greatest urge is <strong>to be men</strong></p>
</blockquote>

<blockquote>
  <p>[k1737] All women, by their nature, are fragile and weak: they are
attracted to the male in whom they see strength.</p>

  <p>From time to time, Sophia would come over to see me from
Boston. Even among Harlem Negroes, her looks gave me status.</p>
</blockquote>

<blockquote>
  <p>[k1787] The white woman wanted to be comfortable, she wanted to be looked
upon with favor by her own kind, but also she wanted to have her
pleasure. So some of them just married a white man for convenience and
security, and kept right on going with a Negro.</p>
</blockquote>

<blockquote>
  <p>[k2455] He had never been able to keep a white woman any length of time,
though, because he was too good to them, and, as I have said, any woman,
white or black, seems to get bored with that.</p>
</blockquote>

<blockquote>
  <p>[k2498] Looking back, I think I really was at least slightly out of my
mind. I viewed narcotics as most people regard food. I wore my guns as
today I wear my neckties. Deep down, I actually believed that after
living as fully as humanly possible, one should then die violently. I
expected then, as I still expect today, to die at any time. But then, I
think I deliberately invited death in many, sometimes insane, ways.</p>
</blockquote>

<blockquote>
  <p>[k2704] The girls got low bail. They were still white–burglars or not.
Their worst crime was their involvement with Negroes. But Shorty and I
had bail set at $10,000 each, which they knew we were nowhere near able
to raise.</p>
</blockquote>

<blockquote>
  <p>[k2711] Before the judge entered, I said to one lawyer, “We seem to be
getting sentenced because of those girls.” He got red from the neck up
and shuffled his papers: “You had no business with white girls!”</p>

  <p>Later,
when I had learned the full truth about the white man, I reflected many
times that the average burglary sentence for a first offender, as we all
were, was about two years. But we weren’t going to get the average–not
for <strong>our</strong> crime.</p>
</blockquote>

<blockquote>
  <p>[k2717] But people are always speculating–why am I as I am? To
understand that of any person, his whole life, from birth, must be
reviewed. All of our experiences fuse into our personality. Everything
that ever happened to us is an ingredient.</p>
</blockquote>

<blockquote>
  <p>[k2735] I got ten years.</p>

  <p>The girls got one to five years, in the Women’s
Reformatory at Framingham, Massachusetts.</p>

  <p>This was in February, 1946. I wasn’t quite twenty-one. I had
not even started shaving.</p>

  <p>They took Shorty and me, handcuffed together,
to the Charlestown State Prison.</p>
</blockquote>

<blockquote>
  <p>[k2758] With some money sent by Ella, I was finally able to buy stuff for
better highs from guards in the prison. I got reefers, Nembutal, and
Benzedrine. Smuggling to prisoners was the guards’ sideline; every
prison’s inmates know that’s how guards make most of their living.</p>
</blockquote>

<blockquote>
  <p>[k2817] In prison, where so little breaks the monotonous routine, the
smallest thing causes a commotion of talk. It was being mentioned all
over the cell block by night that Satan didn’t eat pork.</p>
</blockquote>

<blockquote>
  <p>[k2822] My brothers and sisters in Detroit and Chicago had all become
converted to what they were being taught was the “natural religion for
the black man” of which Philbert had written to me. They all prayed for
me to become converted while I was in prison.</p>
</blockquote>

<blockquote>
  <p>[k2865] “The devil is also a man,” Reginald said.</p>

  <p>“What do you mean?”</p>
</blockquote>

<blockquote>
  <p>[k2867] “Them,” he said. “The white man is the devil.”</p>
</blockquote>

<blockquote>
  <p>[k2871] I said, “Without any exception?”</p>

  <p>“Without any exception.”</p>
</blockquote>

<blockquote>
  <p>[k2874] The white people I had known marched before my mind’s eye.</p>
</blockquote>

<blockquote>
  <p>[k2898] When Reginald left, he left me rocking with some of the first
serious thoughts I had ever had in my life: that the white man was fast
losing his power to oppress and exploit the dark world; that the dark
world was starting to rise to rule the world again, as it had before;
that the white man’s world was on the way down, it was on the way out.</p>
</blockquote>

<blockquote>
  <p>[k2908] They were all Muslims, followers of a man they described to me as
“The Honorable Elijah Muhammad,” a small, gentle man, whom they sometimes
referred to as “The Messenger of Allah.” He was, they said, “a black man,
like us.” He had been born in America on a farm in Georgia. He had moved
with his family to Detroit, and there had met a Mr. Wallace D. Fard who
he claimed was “God in person.”</p>
</blockquote>

<blockquote>
  <p>[k3020] I was to learn later that Elijah Muhammad’s tales, like this one
of “Yacub,” infuriated the Muslims of the East. While at Mecca, I
reminded them that it was their fault, since they themselves hadn’t done
enough to make real Islam known in the West. Their silence left a vacuum
into which any religious faker could step and mislead our people.</p>
</blockquote>

<blockquote>
  <p>[k3034] The hardest test I ever faced in my life was praying.</p>
</blockquote>

<blockquote>
  <p>[k3038] I had to force myself to bend my knees. And waves of shame and
embarrassment would force me back up.</p>

  <p>For evil to bend its knees,
admitting its guilt, to implore the forgiveness of God, is the hardest
thing in the world.</p>
</blockquote>

<blockquote>
  <p>[k3047] I’ve never been one for inaction. Everything I’ve ever felt
strongly about, I’ve done something about.</p>
</blockquote>

<blockquote>
  <p>[k3097] Available on the prison library’s shelves were books on just
about every general subject. Much of the big private collection that
Parkhurst had willed to the prison was still in crates and boxes in the
back of the library–thousands of old books.</p>
</blockquote>

<blockquote>
  <p>[k3105] No university would ask any student to devour literature as I did
when this new world opened to me, of being able to read and understand.</p>
</blockquote>

<blockquote>
  <p>[k3116] The teachings of Mr. Muhammad stressed how history had been
“whitened”–when white men had written history books, the black man
simply had been left out. Mr. Muhammad couldn’t have said anything that
would have struck me much harder. I had never forgotten how when my
class, me and all of those whites, had studied seventh-grade United
States history back in Mason, the history of the Negro had been covered
in one paragraph, and the teacher had gotten a big laugh with his joke,
“Negroes’ feet are so big that when they walk, they leave a hole in the
ground.”</p>
</blockquote>

<blockquote>
  <p>[k3193] America’s U.N. Ambassador Adlai Stevenson complained not long ago
that in the United Nations “a skin game” was being played. He was right.
He was facing reality. A “skin game” is being played. But Ambassador
Stevenson sounded like Jesse James accusing the marshal of carrying a
gun. Because who in the world’s history ever has played a worse “skin
game” than the white man?</p>
</blockquote>

<blockquote>
  <p>[k3701] The black people, God’s children, were Gods themselves, Master
Fard taught. And he taught that among them was one, also a human being
like the others, who was the God of Gods: The Most, Most High, The
Supreme Being, supreme in wisdom and power–and His proper name was
Allah.</p>
</blockquote>

<blockquote>
  <p>[k3839] (People don’t want to believe the sums that even the minor
underworld handles. Why, listen: in March 1964, a Chicago nickel-and-dime
bets Wheel of Fortune man, Lawrence Wakefield, died, and over $760,000 in
cash was in his apartment, in sacks and bags…all taken from poor
Negroes…and we wonder why we stay so poor.)</p>
</blockquote>

<blockquote>
  <p>[k3890] And then we discovered the best “fishing” audience of all, by far
the best-conditioned audience for Mr. Muhammad’s teachings: the Christian
churches.</p>
</blockquote>

<blockquote>
  <p>[k4155] Two white policemen, breaking up a street scuffle between some
Negroes, ordered other Negro passers-by to “Move on!” Of these
bystanders, two happened to be Muslim brother Johnson Hinton and another
brother of Temple Seven. They didn’t scatter and run the way the white
cops wanted. Brother Hinton was attacked with nightsticks. His scalp was
split open, and a police car came and he was taken to a nearby precinct.</p>

  <p>The second brother telephoned our restaurant. And with some telephone
calls, in less than half an hour about fifty of Temple Seven’s men of the
Fruit of Islam were standing in ranks-formation outside the police
precinct house.</p>
</blockquote>

<blockquote>
  <p>[k4169] Harlem’s black people were long since sick and tired of police
brutality.</p>
</blockquote>

<blockquote>
  <p>[k4175] We wouldn’t learn until later that a steel plate would have to be
put into Brother Hinton’s skull. (After that operation, the Nation of
Islam helped him to sue; a jury awarded him over $70,000, the largest
police brutality judgment that New York City has ever paid.)</p>
</blockquote>

<blockquote>
  <p>[k4222] In late 1959, the television program was aired. “The Hate That
Hate Produced”–the title–was edited tightly into a kaleidoscope of
“shocker” images…Mr. Muhammad, me, and others
speaking…strong-looking, set-faced black men, our Fruit of
Islam…white-scarved, white-gowned Muslim sisters of all ages…Muslims
in our restaurants, and other businesses…Muslims and other black people
entering and leaving our mosques….</p>

  <p>Every phrase was edited to increase
the shock mood.</p>
</blockquote>

<blockquote>
  <p>[k4231] Here was one of the white man’s most characteristic behavior
patterns–where black men are concerned. He loves himself so much that he
is startled if he discovers that his victims don’t share his vainglorious
self-opinion.</p>
</blockquote>

<blockquote>
  <p>[k4271] “The guilty, two-faced white man can’t decide <strong>what</strong> he wants. Our
slave foreparents would have been put to death for advocating so-called
‘integration’ with the white man. Now when Mr. Muhammad speaks of
‘separation,’ the white man calls us ‘hate-teachers’ and ‘fascists’![”]</p>
</blockquote>

<blockquote>
  <p>[k4280] “Mr. Malcolm X,” those devils would ask, “why is your Fruit of
Islam being trained in judo and karate?”</p>
</blockquote>

<blockquote>
  <p>[k4308] The reporters would try their utmost to raise some “good” white
man whom I couldn’t refute as such. I’ll never forget how one practically
lost his voice. He asked me did I feel <strong>any</strong> white men had ever done
anything for the black man in America. I told him, “Yes, I can think of
two. Hitler, and Stalin. The black man in America couldn’t get a decent
factory job until Hitler put so much pressure on the white man. And then
Stalin kept up the pressure–”</p>
</blockquote>

<blockquote>
  <p>[k4317] But instead of abating, the black puppets continued ripping and
tearing at Mr. Muhammad and the Nation of Islam–until it began to appear
as though we were afraid to speak out against these “important” Negroes.
That’s when Mr. Muhammad’s patience wore thin. And with his nod, I began
returning their fire.</p>
</blockquote>

<blockquote>
  <p>[k4901] The American black man should be focusing his every effort toward
building his <strong>own</strong> businesses, and decent homes for himself. As other
ethnic groups have done, let the black people, wherever possible, however
possible, patronize their own kind, hire their own kind, and start in
those ways to build up the black race’s ability to do for itself. That’s
the only way the American black man is ever going to get respect.</p>
</blockquote>

<blockquote>
  <p>[k5001] These “angry revolutionists” even followed their final
instructions: to leave early. With all of those thousands upon thousands
of “angry revolutionists,” so few stayed over that the next morning the
Washington hotel association reported a costly loss in empty rooms.</p>

  <p>Hollywood couldn’t have topped it.</p>

  <p>In a subsequent press poll, not one
Congressman or Senator with a previous record of opposition to civil
rights said he had changed his views. What did anyone expect? How was a
one-day “integrated” picnic going to counter-influence these
representatives of prejudice rooted deep in the psyche of the American
white man for four hundred years?</p>
</blockquote>

<blockquote>
  <p>[k5025] I never experienced one college session that didn’t show me ways
to improve upon my presentation and defense of Mr. Muhammad’s teachings.</p>
</blockquote>

<blockquote>
  <p>[k5028] At the outset, always I’d confront such panels with something
such as: “Gentlemen, I finished the eighth grade in Mason, Michigan. My
high school was the black ghetto of Roxbury, Massachusetts. My college
was in the streets of Harlem, and my master’s was taken in prison. Mr.
Muhammad has taught me that I never need fear any man’s intellect who
tries to defend or to justify the white man’s criminal record against the
non-white man–especially the white man and the black man here in North
America.”</p>
</blockquote>

<blockquote>
  <p>[k5038] Question-and-answer periods are another area where, by now, again
blindfolded, I can often tell you the ethnic source of a question. The
most easily recognizable of these to me are a Jew in any audience
situation, and a bourgeois Negro in “integrated” audiences.</p>

  <p>My clue to
the Jew’s question and challenges is that among all other ethnic groups,
his expressed thinking, his expressed concerns, are the most subjective.
And the Jew is usually hypersensitive. I mean, you can’t even say “Jew”
without him accusing you of anti-Semitism. I don’t care what a Jew is
professionally, doctor, merchant, housewife, student, or whatever–first
he, or she, thinks Jew.</p>
</blockquote>

<blockquote>
  <p>[k5045] But I know that America’s five and a half million Jews (two
million of them are concentrated in New York) look at it very
practically, whether they know it or not: that all of the bigotry and
hatred focused upon the black man keeps off the Jew a lot of heat that
would be on him otherwise.</p>

  <p>For an example of what I am talking about–in
every black ghetto, Jews own the major businesses. Every night the owners
of those businesses go home with that black community’s money, which
helps the ghetto to stay poor. But I doubt that I have ever uttered this
absolute truth before an audience without being hotly challenged, and
accused by a Jew of anti-Semitism. Why? I will bet that I have told five
hundred such challengers that Jews as a group would never watch some
other minority systematically siphoning out their community’s resources
without doing something about it. I have told them that if I tell the
simple truth, it doesn’t mean that I am anti-Semitic; it means merely
that I am antiexploitation.</p>
</blockquote>

<blockquote>
  <p>[k5927] That morning was when I first began to reappraise the “white
man.” It was when I first began to perceive that “white man,” as commonly
used, means complexion only secondarily; primarily it described attitudes
and actions. In America, “white man” meant specific attitudes and actions
toward the black man, and toward all other non-white men. But in the
Muslim world, I had seen that men with white complexions were more
genuinely brotherly than anyone else had ever been.</p>
</blockquote>

<blockquote>
  <p>[k6047] Despite my firm convictions, I have been always a man who tries
to face facts, and to accept the reality of life as new experience and
new knowledge unfolds it. I have always kept an open mind, which is
necessary to the flexibility that must go hand in hand with every form of
intelligent search for truth.</p>
</blockquote>

<blockquote>
  <p>[k6281] I remember that in the press conference, I used the word “Negro,”
and I was firmly corrected. “The word is not favored here, Mr. Malcolm X.
The term Afro-American has greater meaning, and dignity.” I sincerely
apologized. I don’t think that I said “Negro” again as long as I was in
Africa.</p>
</blockquote>

<blockquote>
  <p>[k6675] The first thing I tell them is that at least where my own
particular Black Nationalist organization, the Organization of
Afro-American Unity, is concerned, they can’t join us. I have these very
deep feelings that white people who want to join black organizations are
really just taking the escapist way to salve their consciences. By
visibly hovering near us, they are “proving” that they are “with us.”</p>
</blockquote>

<blockquote>
  <p>[k6682] Aside from that, I mean nothing against any sincere whites when I
say that as members of black organizations, generally whites’ very
presence subtly renders the black organization automatically less
effective. Even the best white members will slow down the Negroes’
discovery of what they need to do, and particularly of what they can
do–for themselves, working by themselves, among their own kind, in their
own communities.</p>
</blockquote>

<blockquote>
  <p>[k6715] My father and most of his brothers died by violence–my father
because of what he believed in. To come right down to it, if I take the
kind of things in which I believe, then add to that the kind of
temperament that I have, plus the one hundred percent dedication I have
to whatever I believe in–these are ingredients which make it just about
impossible for me to die of old age.</p>
</blockquote>

<blockquote>
  <p>[k6768] When I <strong>am</strong> dead–I say it that way because from the things I <strong>know</strong>,
I do not expect to live long enough to read this book in its finished
form–I want you to just watch and see if I’m not right in what I say:
that the white man, in his press, is going to identify me with “hate.”</p>
</blockquote>

<blockquote>
  <p>[k6773] I will be labeled as, at best, an “irresponsible” black man. I
have always felt about this accusation that the black “leader” whom white
men consider to be “responsible” is invariably the black “leader” who
never gets any results.</p>
</blockquote>

<blockquote>
  <p>[k6780] And if I can die having brought any light, having exposed any
meaningful truth that will help to destroy the racist cancer that is
malignant in the body of America–then, all of the credit is due to
Allah. Only the mistakes have been mine.</p>
</blockquote>

<blockquote>
  <p>ALEX HALEY</p>

  <p>EPILOGUE</p>
</blockquote>

<blockquote>
  <p>[k6784] During nineteen fifty-nine, when the public was becoming
aware of the Muslims after the New York telecast “The Hate That Hate
Produced,” I was in San Francisco, about to retire after twenty
years in the U.S. Coast Guard.</p>
</blockquote>

<blockquote>
  <p>[k6793] “You’re another one of the white man’s tools sent to spy!” he
accused me sharply. I said I had a legitimate writing assignment and
showed him my letter from the magazine stating that an objective article
was wanted, one that would balance what the Muslims said of themselves
and what their attackers said about them.</p>
</blockquote>

<blockquote>
  <p>[k6798] Around the Muslim’s restaurant, I met some of the converts, all
of them neatly dressed and almost embarrassingly polite. Their manners
and miens reflected the Spartan personal discipline the organization
demanded, and none of them would utter anything but Nation of Islam
clich<FIXME e9="">s.</FIXME></p>
</blockquote>

<blockquote>
  <p>[k6802] He said that I should talk about an article with Mr. Muhammad
personally.</p>
</blockquote>

<blockquote>
  <p>[k6803] The slightly built, shy-acting, soft-voiced Mr. Muhammad
invited me to dinner with his immediate family in his mansion.</p>
</blockquote>

<blockquote>
  <p>[k6809] My article entitled “Mr. Muhammad Speaks” appeared in early 1960,
and it was the first featured magazine notice of the phenomenon.</p>
</blockquote>

<blockquote>
  <p>[k6878] For perhaps a month I was afraid we weren’t going to get any
book. Malcolm X was still stiffly addressing me as “Sir!” and my notebook
contained almost nothing but Black Muslim philosophy, praise of Mr.
Muhammad, and the “evils” of “the white devil.” He would bristle when I
tried to urge him that the proposed book was <strong>his</strong> life.</p>
</blockquote>

<blockquote>
  <p>[k6971] I’ve just become aware how closed my mind was now that I’ve
opened it up again. That’s one of the characteristics I don’t like about
myself. If I meet a problem I feel I can’t solve, I shut it out. I make
believe that it doesn’t exist. But it exists.”</p>
</blockquote>

<blockquote>
  <p>[k7030] There was something about this man when he was in a room with
people. He commanded the room, whoever else was present.</p>
</blockquote>

<blockquote>
  <p>[k7279] A few days later, however, he wrote in one of his memo books
this, which he let me read, “Children have a lesson adults should learn,
to not be ashamed of failing, but to get up and try again. Most of us
adults are so afraid, so cautious, so ‘safe,’ and therefore so shrinking
and rigid and afraid that it is why so many humans fail. Most middle-aged
adults have resigned themselves to failure.”</p>
</blockquote>

<blockquote>
  <p>[k8065] I tried to be a dispassionate chronicler. But he was the most
electric personality I have ever met, and I still can’t quite conceive
him dead. It still feels to me as if he has just gone into some next
chapter, to be written by historians.</p>

  <p><strong>New York</strong>, 1965</p>
</blockquote>]]></content><author><name></name></author><summary type="html"><![CDATA[By Malcolm X, Ballantine, January 15, 1992, 0345376714]]></summary></entry><entry><title type="html">BookNotes: The Sixth Extinction</title><link href="https://www.robnagler.com/2022/02/20/Sixth-Extinction.html" rel="alternate" type="text/html" title="BookNotes: The Sixth Extinction" /><published>2022-02-20T20:00:00+00:00</published><updated>2022-02-20T20:00:00+00:00</updated><id>https://www.robnagler.com/2022/02/20/Sixth-Extinction</id><content type="html" xml:base="https://www.robnagler.com/2022/02/20/Sixth-Extinction.html"><![CDATA[<p>By Elizabeth Kolbert, Bloomsbury, January 15, 2015, 978-1408851241</p>

<p>The Sixth Extinction is the period in which we live. Humans are
killing off species in geologic time, just like the other five mass
exinctions. Elizabeth Kolbert documents that this is happening and has
been happening for millenia and why. This isn’t an industrial age
problem: we are the problem. (Machines don’t cause extinction, people
do.)</p>

<p>We’ve only recently begun to understand the meaning on
extinction. It’s a relatively new concept, and our understanding of
what happened when evolved rather rapidly with the discovery of the
iridium layer in 1980. We have only just begun to confirm the
anthropocene extinction, which is the primary subject of Kolbert’s
book.</p>

<p>This is an excellent summary of the science. I plowed through it in
five days, which is unusual for me. It was recommended by Dylan who
was assigned it for a geology class at Colorado College. I highly
recommend it.</p>

<blockquote>
  <p>[k252] Such wholesale losses have led paleontologists to surmise that
during mass extinction events–in addition to the so-called Big Five,
there have been many lesser such events–the usual rules of survival are
suspended. Conditions change so drastically or so suddenly (or so
drastically <strong>and</strong> so suddenly) that evolutionary history counts for little.
Indeed, the very traits that have been most useful for dealing with
ordinary threats may turn out, under such extraordinary circumstances, to
be fatal.</p>
</blockquote>

<blockquote>
  <p>[k975] But human-caused extinction is of course troubling for many
reasons, some of which have to do with Darwin’s own theory, and it’s
puzzling that a writer as shrewd and self-critical as Darwin shouldn’t
have noticed this.</p>
</blockquote>

<blockquote>
  <p>[k1207] The bolide arrived from the southeast, traveling at a low angle
relative to the earth, so that it came in not so much from above as from
the side, like a plane losing altitude. When it slammed into the
Yucatan Peninsula, it was moving at something like forty-five
thousand miles per hour, and, due to its trajectory, North America was
particularly hard-hit. A vast cloud of searing vapor and debris raced
over the continent, expanding as it moved and incinerating anything in
its path. “Basically, if you were a triceratops in Alberta, you had about
two minutes before you got vaporized” is how one geologist put it to me.</p>

  <p>In the process of excavating the enormous crater, the asteroid
blasted into the air more than fifty times its own mass in pulverized
rock. As the ejecta fell back through the atmosphere, the particles
incandesced, lighting the sky everywhere at once from directly overhead
and generating enough heat to, in effect, broil the surface of the
planet. Owing to the composition of the Yucatan Peninsula, the
dust thrown up was rich in sulfur. Sulfate aerosols are particularly
effective at blocking sunlight, which is the reason a single volcanic
eruption, like Krakatoa, can depress global temperatures for years.</p>
</blockquote>

<blockquote>
  <p>[k1268] In times of extreme stress, the whole concept of fitness, at
least in a Darwinian sense, loses its meaning: how could a creature be
adapted, either well or ill, for conditions it has never before
encountered in its entire evolutionary history?
At such moments, what Paul Taylor, a paleontologist at London’s
Natural History Museum, calls “the rules of the survival game” abruptly
change.</p>
</blockquote>

<blockquote>
  <p>[k1297] “In science, as in the playing card experiment, novelty emerges
only with difficulty,” Kuhn wrote.</p>
</blockquote>

<blockquote>
  <p>[k1298] Crisis led to insight, and the old framework gave way to a new
one. This is how great scientific discoveries or, to use the term Kuhn
made so popular, “paradigm shifts” took place.</p>

  <p>The history of the science of extinction can be told as a series
of paradigm shifts. Until the end of the eighteenth century, the very
category of extinction didn’t exist.</p>
</blockquote>

<blockquote>
  <p>[k1306] “Though the world does not change with a change of paradigm, the
scientist afterward works in a different world” is how Kuhn put it.</p>
</blockquote>

<blockquote>
  <p>[k1308] Within a few decades, so many extinct creatures had been
identified that Cuvier’s framework began to crack. To keep pace with the
growing fossil record, the number of disasters had to keep multiplying.
“God knows how many catastrophes” would be needed, Lyell scoffed, poking
fun at the whole endeavor. Lyell’s solution was to reject catastrophe
altogether.</p>
</blockquote>

<blockquote>
  <p>[k1312] The uniformitarian account of extinction held up for more than a
century. Then, with the discovery of the iridium layer, science faced
another crisis. (According to one historian, the Alvarezes’ work was “as
explosive for science as an impact would have been for earth.”)</p>
</blockquote>

<blockquote>
  <p>[k1478] (A recent study of pollen and animal remains on Easter Island
concluded that it wasn’t humans who deforested the landscape; rather, it
was the rats that came along for the ride and then bred unchecked. The
native palms couldn’t produce seeds fast enough to keep up with their
appetites.)</p>
</blockquote>

<blockquote>
  <p>[k1510] Crutzen wrote up his idea in a short essay, “Geology of Mankind,”
that ran in <strong>Nature</strong>. “It seems appropriate to assign the term
‘Anthropocene’ to the present, in many ways human-dominated, geological
epoch,” he observed.</p>
</blockquote>

<blockquote>
  <p>[k1521] Crutzen published “Geology of Mankind” in 2002. Soon, the
“Anthropocene” began migrating out into other scientific journals.</p>
</blockquote>

<blockquote>
  <p>[k1938] Some of the scientists, who had dived all over–in the
Philippines, in Indonesia, in the Caribbean, and in the South
Pacific–told me that the snorkeling at One Tree was about as good as it
gets. I found this easy to believe. The first time I jumped off the boat
and looked down at the swirl of life beneath me, it felt unreal, as if
I’d swum into the undersea world of Jacques Cousteau. Schools of small
fish were followed by schools of larger fish, which were followed by
sharks. Huge rays glided by, trailed by turtles the size of bathtubs. I
tried to keep a mental list of what I’d seen, but it was like trying to
catalog a dream.</p>
</blockquote>

<blockquote>
  <p>[k2127] As a general rule, the variety of life is most impoverished at
the poles and richest at low latitudes. This pattern is referred to in
the scientific literature as the “latitudinal diversity gradient,” or
LDG, and it was noted already by the German naturalist Alexander von
Humboldt, who was amazed by the biological splendors of the tropics,
which offer “a spectacle as varied as the azure vault of the heavens.”</p>

  <p>“The verdant carpet which a luxuriant Flora spreads over the
surface of the earth is not woven equally in all parts,” Humboldt wrote
after returning from South America in 1804. “Organic development and
abundance of vitality gradually increase from the poles towards the
equator.” More than two centuries later, why this should be the case is
still not known, though more than thirty theories have been advanced to
explain the phenomenon.</p>
</blockquote>

<blockquote>
  <p>[k2178] Coca, Silman told me, made a heavy pack feel lighter. It also
staved off hunger, alleviated aches and pains, and helped counter
altitude sickness. I had been given little to carry besides my own gear;
still, anything that would lighten my pack seemed worth trying. I took a
handful of leaves and a pinch of baking soda. (Baking soda, or some other
alkaline substance, is necessary for coca to have its pharmaceutical
effect.) The leaves were leathery and tasted like old books. Soon my lips
grew numb, and my aches and pains began to fade. An hour or two later, I
was back for more. (Many times since have I wished for that shopping
bag.)</p>
</blockquote>

<blockquote>
  <p>[k2407] For most of the Pleistocene temperatures were significantly lower
than they are now–such is the rhythm of the orbital cycle that glacial
periods tend to last much longer than interglacials–and so an
evolutionary premium was placed on being able to deal with wintry
conditions.</p>
</blockquote>

<blockquote>
  <p>[k2456] The project has now been running continuously for more than
thirty years. So many graduate students have been trained at the reserves
that a new word was coined to describe them: “fragmentologist.” For its
part, the BDFFP has been called “the most important ecological experiment
ever done.”</p>
</blockquote>

<blockquote>
  <p>[k2632] Yet another possible explanation for why observations don’t match
predictions is that humans aren’t very observant. Since the majority of
species in the tropics are insects and other invertebrates, so, too, are
the majority of anticipated extinctions. But as we don’t know, even to
the nearest million, how many tropical insect species there are, we’re
not likely to notice if one or two or even ten thousand of them have
vanished.</p>
</blockquote>

<blockquote>
  <p>[k2704] The body temperature of a hibernating bat drops by fifty or sixty
degrees, often to right around freezing. Its heartbeat slows, its immune
system shuts down, and the bat, dangling by its feet, falls into a state
close to suspended animation.</p>
</blockquote>

<blockquote>
  <p>[k2974] Before humans arrived on the scene, many whole categories of
organisms were missing from Hawaii; these included not only rodents but
also amphibians, terrestrial reptiles, and ungulates. The islands had no
ants, aphids, or mosquitoes.</p>
</blockquote>

<blockquote>
  <p>[k3293] The Anthropocene is usually said to have begun with the
industrial revolution, or perhaps even later, with the explosive growth
in population that followed World War II. By this account, it’s with the
introduction of modern technologies–turbines, railroads, chainsaws–that
humans became a world-altering force. But the megafauna extinction
suggests otherwise. Before humans emerged on the scene, being large and
slow to reproduce was a highly successful strategy, and outsized
creatures dominated the planet. Then, in what amounts to a geologic
instant, this strategy became a loser’s game. And so it remains today,
which is why elephants and bears and big cats are in so much trouble and
why Suci is one of the world’s last remaining Sumatran rhinos. Meanwhile,
eliminating the megafauna didn’t just eliminate the megafauna; in
Australia at least it set off an ecological cascade that transformed the
landscape. Though it might be nice to imagine there once was a time when
man lived in harmony with nature, it’s not clear that he ever really did.</p>
</blockquote>]]></content><author><name></name></author><summary type="html"><![CDATA[By Elizabeth Kolbert, Bloomsbury, January 15, 2015, 978-1408851241]]></summary></entry><entry><title type="html">BookNotes: Everyday White People Confront Racial and Social Injustice: 15 Stories</title><link href="https://www.robnagler.com/2022/01/09/Everyday-White-People.html" rel="alternate" type="text/html" title="BookNotes: Everyday White People Confront Racial and Social Injustice: 15 Stories" /><published>2022-01-09T20:00:00+00:00</published><updated>2022-01-09T20:00:00+00:00</updated><id>https://www.robnagler.com/2022/01/09/Everyday-White-People</id><content type="html" xml:base="https://www.robnagler.com/2022/01/09/Everyday-White-People.html"><![CDATA[<p>By Eddie Moore, Jr. et al, Stylus Publishing, March 10, 2015, 1620362074</p>

<p>Everyday White People Confront Racial and Social Injustice is about
the right length for me. I started feeling the repetition towards the
end.</p>

<p>The stories made me think about my White Privilege. I could write an
essay about the number of times I would get away with something that a
Black person would not. I made mistakes that would have landed a Black
man in jail. I’ve never been in jail, and I’m grateful for that. I
have never been hit by a police officer. There was one time where I
could have been, and I wasn’t. There have been many times when I’ve
been approached by police for various violations and non-violations,
and I’ve always walked away.</p>

<p>And, I’ve done many things right that would have not been possible
without my White Privilege. I got into good schools. I got good
(enough) grades. I worked in various environments where there were no
black people. I still do, sadly.</p>

<p>I am “cultural Jew” (see below), but it has not been a hindrance in any
sense. I would argue, it was a great benefit. That’s one thing I don’t
like about this book. It should have been titled Everyday Jewish
People, because many of the stories (at least five) are by Jewish
people. Their Jewishness was central, in many ways, to their
story. I’m not sure what it says about the book, but the fact there
were so many Jews is just not “Everyday”, statistically at least.</p>

<p>The authors talked about their oppressed identities, which I found
interesting. Most of the authors are women (another statisical
anomaly), and they talked about their feminism. The vast majority are
old, which is part of the book, I guess, in that these are
mini-memoirs.</p>

<p>I guess the title bothers me in other ways, too. The people are not
“everyday” in my sense of the word. I think of Studs Terkel
interviewees when I think of “everyday”. These are all highly
privileged people who are recognizing some of their
privileges. Interestingly, none talked about their Intellect
Privilege. That’s something I think about.</p>

<p>Despite all my complaining, I recommend the book, especially if you no
nothing about Social Justice work.</p>

<blockquote>
  <p>[k887] Knapsacks and Baggage [by] Abby L. Ferber</p>
</blockquote>

<blockquote>
  <p>[k905] My family was not very religious, but we were “cultural Jews.”
Like many nonreligious Jews, we felt an obligation to carry on our Jewish
cultural and religious traditions because they have always been
threatened.</p>
</blockquote>

<blockquote>
  <p>[k912] The message I internalized was that Jews were the universal
scapegoat, and even when fully assimilated and successful, as they were
in Germany prior to the rise of the Nazis, their safety was never secure.</p>
</blockquote>

<blockquote>
  <p>[k914] My Jewish identity is not simply a religious designation I can
choose or discard (Ferber, 1999).</p>
</blockquote>

<blockquote>
  <p>[k916] My great-grandmother Anna, for whom I am named, fled a small
Russian village at the age of 16 to avoid an arranged marriage. She came
to the United States to seek out a cousin who had immigrated earlier. Her
parents disowned her, and she never spoke to them again; she later
learned that her entire family perished in Nazi concentration camps. I
realize how precarious my own existence is; were it not for random
actions such as those by each of my great-grandparents, I would not be
here today.</p>
</blockquote>

<blockquote>
  <p>[k935] I had trouble understanding how members of my own family could
exhibit racist behaviors, given their own connections to oppression.</p>
</blockquote>

<blockquote>
  <p>[k939] I also grew up with a Black Jamaican maid.</p>
</blockquote>

<blockquote>
  <p>[k942] She had two children of her own who were close in age to my
siblings and me. It wasn’t until I was a teenager that I wondered if
anyone was at home for them. I felt more and more uncomfortable as I
recognized that my mother’s own independence was predicated on the
subordination of a Black woman.</p>
</blockquote>

<blockquote>
  <p>[k1137] The Political is Personal [by] Kevin Jennings</p>
</blockquote>

<blockquote>
  <p>[k1253] And I remember what my momma always told me as a child: “Kevin,
the truth will set you free.” The truth is that every person has worth
and value and deserves to be treated with dignity and respect. I must
continue to speak that truth as long as I live, and I truly believe it
will help set us all free.</p>
</blockquote>

<blockquote>
  <p>[k1983] What’s a nice white girle to do in an unjust world like this? [by]
Dianne J. Goodman</p>
</blockquote>

<blockquote>
  <p>[k2029] I also keep learning about my sense of entitlement and how my
white privilege allows me to take things for granted and be oblivious to
the challenges faced by people of color. I remember when I was
facilitating a workshop and I first told the story about how I would open
up a bag of snacks in a store to taste them so I could decide if my kids
would like them and how many I should buy. (I would always pay for
whatever I opened.) Seeing the look of shock on the faces of the people
of color, it dawned on me that my unconscious assumption that I could
just sample food with impunity, because no one ever suspects me of any
wrongdoing, was an expression of my white (and class and gender)
privilege and sense of entitlement–of being a “nice white girl.”</p>
</blockquote>

<blockquote>
  <p>[k2040] It takes courage to be a leader, to speak up, challenge the
status quo, try new initiatives, put oneself out there. I struggle with
this frequently, doubting the importance of what I have to say, worrying
I will get it wrong, fearing judgment and ridicule. But if I expect
others to take risks, I can expect no less of myself. “We can’t teach
what we don’t know, and we can’t lead where we won’t go.”</p>
</blockquote>

<blockquote>
  <p><strong>Everything is about relationships</strong>. I increasingly believe that
everything comes down to relationships. What I care about, how I learn,
my motivation to stay engaged, my ability to engage others, the support I
get on my journey, opportunities for work, and the effectiveness of my
change efforts are all connected to relationships with others. The more I
do my own work (see previous guidepost), the stronger and more authentic
those relationships can be.</p>
</blockquote>

<blockquote>
  <p>[k2059] I often think about and refer to the words of Pat Parker (1990)
from her poem “For the White Person Who Wants to Know How to Be My
Friend”: “The first thing you do is forget that I’m black. / Second, you
must never forget that I’m black” (p. 297).</p>
</blockquote>

<blockquote>
  <p>[k2194] White Water [by] Gary R. Howard</p>
</blockquote>

<blockquote>
  <p>[k2393] <strong>Lesson: Speaking clear-eyed truth to power is a dangerous
occupation in this country that claims to uphold human rights and social
justice.</strong></p>
</blockquote>

<blockquote>
  <p>[k3418] Resisting Whiteness/Bearing Witness [by] Michelle Fine</p>
</blockquote>

<blockquote>
  <p>[k3461] We were first-(and a half) generation American Jews: hard work,
assimilation, love, laughter, and accumulating privilege without
noticing.</p>
</blockquote>

<blockquote>
  <p>[k3479] Later in the interview, still not fully aware of how drenched in
White my biography and consciousness have been, I asked, “So, when you
were in school were you the kind of student who participated a lot in
class?”</p>

  <p>“No, not me. I was a good kid.”</p>
</blockquote>

<blockquote>
  <p>[k3492] We won the case. The principal was removed. Within a few years,
the same man who was found guilty of racism was elected by the general
population to be the district’s superintendent of schools.</p>
</blockquote>

<blockquote>
  <p>[k3534] And now I know that a single White antiracist woman just turns
into white noise in court. But for 30 years I have engaged in feminist,
antiwar, racial justice, and education justice movements, and in
struggles against the prison industrial complex, high-stakes testing,
gentrification, and exclusion from higher education, and in these
delicious, sweaty settings I have learned there is strength when
antiracist White allies link arms in coalitions for justice.</p>
</blockquote>]]></content><author><name></name></author><summary type="html"><![CDATA[By Eddie Moore, Jr. et al, Stylus Publishing, March 10, 2015, 1620362074]]></summary></entry></feed>