<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Demian Perry</title>
	<atom:link href="https://demianperry.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://demianperry.com</link>
	<description></description>
	<lastBuildDate>Thu, 08 Jun 2023 01:09:10 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://media.demianperry.com/uploads/2022/01/dp-logo-61x61.png</url>
	<title>Demian Perry</title>
	<link>https://demianperry.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Reluctant Healer</title>
		<link>https://demianperry.com/reluctant-healer/</link>
		
		<dc:creator><![CDATA[perrydc]]></dc:creator>
		<pubDate>Fri, 24 Jun 2022 11:47:20 +0000</pubDate>
				<category><![CDATA[Short Story]]></category>
		<category><![CDATA[writing]]></category>
		<guid isPermaLink="false">https://demianperry.com/?p=2514</guid>

					<description><![CDATA[My luck with girls changed when I moved to San Francisco to work for The Mercury as a Circulation Manager.&#160; [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">My luck with girls changed when I moved to San Francisco to work for <em>The Mercury</em> as a Circulation Manager.&nbsp; Sarah Cohen, who sat next to me in the collection of cubes by the stairwell, was so very <em>different</em> from the young ladies at Texas Baptist, my alma mater.&nbsp; She had unshaved armpits, for one thing.</p>



<p class="wp-block-paragraph">Her living situation was a couch in her girlfriend&#8217;s apartment, so we usually spent the night at my place: a small, roach-infested studio in the Mission District.&nbsp; It was modest, but convenient to her social scene: a place called<em> Vegan&#8217;s All Night Kitchen</em>.&nbsp; I had tried to keep up with her, but my bedtime was earlier than hers.&nbsp; I would usually slink away around 3am or so.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">&#8220;Let yourself in,&#8221; I would say.&nbsp; Her reply was usually a wave and a vague smile.</p>



<p class="wp-block-paragraph">Some nights she didn&#8217;t bother to come home at all.</p>



<p class="wp-block-paragraph">One morning I woke up to find her sitting on a cushion that was wedged between the piles of detritus that she had collected on my floor over the past few months.</p>



<p class="wp-block-paragraph">&#8220;I&#8217;m moving out,&#8221; she said.</p>



<p class="wp-block-paragraph">I had expected this, and even prepared myself to react without emotion.</p>



<p class="wp-block-paragraph">&#8220;Where will you go?&#8221;</p>



<p class="wp-block-paragraph">&#8220;I&#8217;m moving in with Roger,&#8221; she said.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">Roger was a junior mixologist at Vegan&#8217;s.&nbsp;</p>



<p class="wp-block-paragraph">&#8220;He&#8217;s coming to pick up my stuff this afternoon.&#8221;</p>



<p class="wp-block-paragraph">By the time Roger arrived, I had sectioned off all of Sarah&#8217;s stuff by the door.&nbsp; I was relieved to clear it out.&nbsp; We were beginning to look like hoarders.</p>



<p class="wp-block-paragraph">&#8220;What&#8217;s all this?&#8221; he asked, looking at the books on Wicca culture, the beads and stones, an oversized dreamcatcher with a mounting string tangled up in the knots of its net.</p>



<p class="wp-block-paragraph">&#8220;All of that belongs to Sarah,&#8221; I said.</p>



<p class="wp-block-paragraph">&#8220;Unh uh.&#8221; Roger said.&nbsp;</p>



<p class="wp-block-paragraph">I helped him carry a couple of boxes down to his car.&nbsp; When his trunk was full, he said, &#8220;Listen: you keep the rest.&nbsp; If Sarah wants it she&#8217;ll come by herself.&nbsp; Otherwise, it&#8217;s yours.&#8221;&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">I watched him drive away.</p>



<p class="wp-block-paragraph">I let a few weeks go by before I started packing up the rest of her stuff.&nbsp; It felt weird to handle her personal things.&nbsp; Some had memories attached to them and some I had never seen before.&nbsp; Some were toys and books: a button collection, a Micky Mouse hat, an old doll that reminded me that she had once been a little girl.</p>



<p class="wp-block-paragraph">My studio came with a basement storage unit that sometimes flooded, but it was better than throwing it out.</p>



<p class="wp-block-paragraph">As I was picking up one of the boxes, which had been buried in the far corner, the bottom dropped out.</p>



<p class="wp-block-paragraph">It looked like a head shop had exploded in my apartment.&nbsp; I counted 23 sandwich-sized ziplock baggies full of pot, all with names like Three Kings, Citrus Kush, Sour Diesel and Yumbolt.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">I had never smoked pot before, but it was a vulnerable time for me.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">If Sarah had left me because I wasn&#8217;t as much fun as Roger, then dammit: I was going to have some fun.&nbsp; I rooted around the remaining boxes for a pipe.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">I was hoping for something discrete but with a little flare, like an old Churchwarden pipe.&nbsp; From a distance, I could resemble Sherlock Holmes cogitating on a problem.</p>



<p class="wp-block-paragraph">Instead I found, filling an entire box of its own, a ridiculous contraption that was like nothing I had ever seen before.&nbsp; It was made of several stages of hand blown glass, like an old vase.&nbsp; The remnants of ashes smeared on a metal saucer at one end suggested that this was drug paraphernalia of some form, but how to use it?</p>



<p class="wp-block-paragraph">I Googled &#8220;smoking vase.&#8221;</p>



<p class="wp-block-paragraph">Up popped a more modern version of what I held in my hand, along with instructions on how to connect the tubes, where to put the material and what part I should attach to my mouth.</p>



<p class="wp-block-paragraph">After about an hour of trial and error, I was able to clean and reassemble the Hookah.&nbsp; Before I lit the contents of the first bag, I removed the batteries from the smoke detector in my apartment and opened all the windows.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">My first experience was uneventful: it was as though I had consumed a couple of cocktails.&nbsp; I later learned that a typical hookah session can expose you to over a hundred times the smoke you would suck in from a single cigarette.&nbsp; But I didn&#8217;t feel particularly strange, just warm and sleepy.&nbsp; So much for Citrus Kush.</p>



<p class="wp-block-paragraph">Like an adolescent boy discovering his father&#8217;s collection of skin mags, I experimented with different varieties over the next few days.&nbsp; The bag labeled &#8220;Fucking Incredible&#8221; wasn&#8217;t.&nbsp; Something called Zamnesia baked me hard, but still no hallucinations.&nbsp; I was disappointed.</p>



<p class="wp-block-paragraph">And then I came across a ziplock full of mysterious leaves.&nbsp; They were much darker than the rest, and they seemed wet, almost oily.&nbsp; The label read: &#8220;Reluctant Healer.&#8221;&nbsp; For all the hyperbole I had experienced over the past few days, Reluctant Healer sounded like something you might mix in with your tea.</p>



<p class="wp-block-paragraph">My first thought, as I held in the smoke, was that I needed to quit my job immediately and maybe, you know, walk the earth.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">This didn&#8217;t feel at all like a serendipitous whim.&nbsp; It was just a sudden realization of the obvious.&nbsp; I had spent the past four years studying the more conventional religious experiences of West Texas Christianity.&nbsp; One of my professors had told me that I could succeed as a philosopher — whatever <em>that</em> means.&nbsp; But my occasional philosophizing was random and inaccessible; it certainly wasn&#8217;t something I could just turn on.</p>



<p class="wp-block-paragraph">This herb definitely turned me on.</p>



<p class="wp-block-paragraph">I exhaled the smoke slowly and held my hands up to within a foot of my face so I could have a good long look at them.&nbsp; I turned them over.</p>



<p class="wp-block-paragraph">I&#8217;m not sure exactly what I did next, but I must have gotten it into my head to leave my apartment, because I woke up the next morning on a park bench in Haight-Ashbury.&nbsp; The only thing I remembered from the night before was two guys laughing, and I was laughing along with them in the dark.&nbsp; But I was also having trouble standing up.&nbsp; One of them had said to me, &#8220;you sleep here tonight, dude!&#8221;&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">And so I did.</p>



<p class="wp-block-paragraph">On this new morning, still cool even though the sun had burned off most of the fog, I felt focused.&nbsp; For once, the path was clear.</p>



<p class="wp-block-paragraph">Looking around, I saw a man struggling to roll out the awning in front of his store and I went over to help him.&nbsp; When he thanked me, I just smiled at him and walked on.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">Next I saw an elderly man sitting alone and talking to himself.&nbsp; I sat down and asked him how his day was going.</p>



<p class="wp-block-paragraph">&#8220;Who is that?&#8221; he asked me, &#8220;I can&#8217;t see too well anymore.&#8221;</p>



<p class="wp-block-paragraph">I could see his glasses were terribly smudged, so I took them down off his nose and wiped them on my shirt.&nbsp; As I placed them back on his head, my hands brushed his temples and I felt a snap of static electricity on my fingers.&nbsp; He jumped back.</p>



<p class="wp-block-paragraph">&#8220;I didn&#8217;t mean to spark you,&#8221; I said, &#8220;Sorry.&nbsp; I just thought your glasses could use a cleaning.&#8221;</p>



<p class="wp-block-paragraph">His eyes were wide with astonishment.</p>



<p class="wp-block-paragraph">&#8220;Who are you?&#8221; he asked.</p>



<p class="wp-block-paragraph">&#8220;I&#8217;m Clayton Smith,&#8221; I said.</p>



<p class="wp-block-paragraph">His face widened into a broad smile and he jumped up from his chair.&nbsp; He stuck his hand out, gesturing wildly at the tree in the park across the street.&nbsp; Then he pointed back at me.</p>



<p class="wp-block-paragraph">&#8220;How is this possible?&#8221; he asked.</p>



<p class="wp-block-paragraph">I must have looked confused, because he sat back down and put his hand on mine.</p>



<p class="wp-block-paragraph">&#8220;Three years ago my eyes started to go.&nbsp; When I wake up in the morning, I can only see dim shapes.&nbsp; Now I see everything as clear as a bell!&nbsp; What did you <em>do</em> to me?&#8221;</p>



<p class="wp-block-paragraph">&#8220;I just cleaned your glasses,&#8221; I said.</p>



<p class="wp-block-paragraph">&#8220;You cured my blindness!&#8221; he said, &#8220;This MAN HAS CURED MY BLINDNESS!&#8221;</p>



<p class="wp-block-paragraph">The shopkeeper across the way turned his head to stare at us.</p>



<p class="wp-block-paragraph">&#8220;He&#8217;s a MIRACLE WORKER!&#8221;</p>



<p class="wp-block-paragraph">Insanity is something I never know how to deal with.&nbsp; I think I smiled uncomfortably and turned to go, but he caught my jacket and tugged at it.</p>



<p class="wp-block-paragraph">&#8220;Thank you!&#8221; he shouted at me, and then, looking into my eyes, he said it again more softly, &#8220;thank you.&#8221;</p>



<p class="wp-block-paragraph">&#8220;You &#8230; You&#8217;re welcome.&#8221;&nbsp; I slipped out of his grip and shared one last embarrassed look with the shopkeeper.&nbsp; I almost ran down the street to get away from him.</p>



<p class="wp-block-paragraph">***</p>



<p class="wp-block-paragraph">Of course I didn&#8217;t quit my job and walk the earth, at least not immediately.&nbsp; Monday came and I returned to the office.</p>



<p class="wp-block-paragraph">I stopped doing my work, though.&nbsp; Instead, for the next several weeks I spent much of the day wandering the office looking for people who needed my help: the FedEx guy struggling to get his handcart through the door; the middle-aged woman in the corner who everyone called Scary Mary, but who wasn&#8217;t so scary once you got to know her; the sales rep with the drinking problem who needed to be walked around the block before his boss saw him.</p>



<p class="wp-block-paragraph">That last one was interesting.&nbsp; The drunk salesman seemed to reach full sobriety the moment I patted him on the back.&nbsp; At the time I assumed he was just messing with me to make me think he was drunk before.&nbsp; But now I&#8217;m not so sure.</p>



<p class="wp-block-paragraph">And all the time I couldn&#8217;t stop thinking about that crazy old man I met in Haight-Ashbury.&nbsp; Was it possible that I had knocked a detached retina back in place?&nbsp; Was it any more probable that he was so senile and neglected that his glasses were so smudged, so funked up with grease and dirt, that they had presented an impenetrable barrier between him and the world?&nbsp;</p>



<p class="wp-block-paragraph">The most likely scenario was that he was trolling me somehow.&nbsp; His gratitude, which seemed so heartfelt at the time, was probably just an elaborate form of sarcasm designed to let me know how little he needed my help.&nbsp; Or anyone&#8217;s.</p>



<p class="wp-block-paragraph">I needed to find out.</p>



<p class="wp-block-paragraph">One Monday before work, I walked over to Haight-Ashbury to sit on the park bench I had slept on a few weeks earlier.&nbsp; As I walked up I saw the man was already there.&nbsp; He was sitting with another old man and he waved to me as soon as he saw me.</p>



<p class="wp-block-paragraph">&#8220;This is the guy!&#8221; he said to his friend, &#8220;This is the guy that I told you about.&#8221;&nbsp; And then he started to sing <em>Amazing Grace</em> in this corny voice.&nbsp; He was really hamming it up.</p>



<p class="wp-block-paragraph">&#8220;How&#8217;s it going?&#8221; I said when he had finished.</p>



<p class="wp-block-paragraph">&#8220;Come on over and sit with us.&#8221;</p>



<p class="wp-block-paragraph">After I sat down he put his hand on my sleeve.</p>



<p class="wp-block-paragraph">&#8220;I should introduce myself.&nbsp; My name is Merv.&nbsp; This is my friend Vincent.&nbsp; Vincent has glaucoma.&nbsp; He sees a little better than I did, but do you think you could help him also?&#8221;</p>



<p class="wp-block-paragraph">&#8220;Listen,&#8221; I said, &#8220;I don&#8217;t know what happened, but it&#8217;s not like I have any special powers or anything.&nbsp; I&#8217;m not even a doctor.&#8221;</p>



<p class="wp-block-paragraph">&#8220;You&#8217;re too modest,&#8221; Merv said, &#8220;whatever you have is a gift.&nbsp; And I am grateful.&nbsp; Please help my friend.&#8221;</p>



<p class="wp-block-paragraph">The old man was making me uncomfortable, but I could see that denying his memory of the moment I cleaned off his glasses was not going to work.&nbsp; And because his friend Vincent did not have glasses, I was certain I would not be able to replicate the results.&nbsp; I would need to play to his reality, but also set his expectations.&nbsp;</p>



<p class="wp-block-paragraph">I turned to Vincent.&nbsp; &#8220;I will try to help you on one condition.&#8221;</p>



<p class="wp-block-paragraph">&#8220;Anything,&#8221; he said.</p>



<p class="wp-block-paragraph">&#8220;No matter what happens, you will never speak of me or my powers again.&#8221;</p>



<p class="wp-block-paragraph">&#8220;You have my word.&#8221;</p>



<p class="wp-block-paragraph">&#8220;My powers do not always work.&nbsp; And if they do not work here, you will still say nothing about me.&#8221;&nbsp; And here I added, with a flourish, &#8220;Forevermore.&#8221;</p>



<p class="wp-block-paragraph">&#8220;Forevermore,&#8221; Vincent said.</p>



<p class="wp-block-paragraph">I raised up my hands as I had seen the Shamans do in the movies.&nbsp; I wiggled my fingers in the direction of his eyes.&nbsp; &#8220;Blindness.&#8221;&nbsp; I stopped to cogitate the right incantation.&nbsp; &#8220;Blindness, away!&#8221;</p>



<p class="wp-block-paragraph">After a long pause, Vincent shook his head.&nbsp; &#8220;Nothing has happened,&#8221; he said.</p>



<p class="wp-block-paragraph">&#8220;Alright,&#8221; said Merv, &#8220;quit fooling around.&#8221;</p>



<p class="wp-block-paragraph">&#8220;I told you that my powers don&#8217;t always work.&#8221;</p>



<p class="wp-block-paragraph">Merv looked quickly from me to his friend.&nbsp; &#8220;But you didn&#8217;t do it,&#8221; he said.&nbsp; &#8220;You didn&#8217;t do the thing where you touch his temples.&#8221;</p>



<p class="wp-block-paragraph">&#8220;Ah, right,&#8221; I said.&nbsp; I waved my hands majestically around his head and then touched his temples.&nbsp; Again I felt a snap of static electricity.&nbsp;</p>



<p class="wp-block-paragraph">&#8220;My God!&#8221; the man said.</p>



<p class="wp-block-paragraph">&#8220;Did it work?&#8221; said Merv.</p>



<p class="wp-block-paragraph">&#8220;My God!&nbsp; My holy sweet God!&nbsp; I can see!&nbsp; I can see!&#8221;</p>



<p class="wp-block-paragraph">I looked around at the empty street.&nbsp; I stared back at him and then at my hands.</p>



<p class="wp-block-paragraph">And, for the first time, I believed.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">***</p>



<p class="wp-block-paragraph">When I was a kid, the superpower I most desired was the ability to fly.&nbsp; I remember also wishing that I could control time.&nbsp; Or be invisible.</p>



<p class="wp-block-paragraph">Never once did I wish for the power to heal.&nbsp; But as I lay in bed that night, imagining the possibilities, it seemed to me that the ability to heal was the best possible superpower.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">If you can fly, you can&#8217;t really accomplish much that can&#8217;t already be done in an airplane or a helicopter.&nbsp; Perhaps you get a small thrill out of floating effortlessly above a crowd of awed spectators, but eventually the novelty must wear off, both for you and for them.</p>



<p class="wp-block-paragraph">Invisibility and the ability to control time are both solitary pursuits.&nbsp; No one can be aware of your superpowers when they happen, only the result.&nbsp; Of course, both would allow you to discover secrets.</p>



<p class="wp-block-paragraph">But with healing comes the ability to restore hope to the sick and wounded.</p>



<p class="wp-block-paragraph">Sleepless, I wondered about the extent of my powers.&nbsp; Could I cure mental illness?&nbsp; Save a man suffering from a heart attack?&nbsp; Bring a person out of a coma?&nbsp; I imagined a long line of sombre people lining up to meet me and tell me about their problems: how they had been unable to think about anything else, how they longed for the simple pleasures of life.&nbsp; Then I would heal them and they would thank me profusely.&nbsp; &#8220;It&#8217;s nothing,&#8221; I would say, &#8220;You can repay me by doing something good for the world.&nbsp; Next, please.&#8221;</p>



<p class="wp-block-paragraph">But as I thought more about it, I realized that, for all the possibilities, this superpower presented problems.&nbsp; If I could truly heal anyone of any ailment, the demand for my services would only grow.&nbsp; After healing someone&#8217;s traumatic brain injury, it would only be a matter of time before they would come back to me with something else, stage 4 cancer, perhaps.&nbsp; And how could I say no?&nbsp; How could I ever place my own quality of life above the people who were desperate for a miracle?&nbsp; &#8220;Sleep now?&#8221; they would ask, &#8220;Are you insane?&nbsp; This lady will be dead in the morning.&#8221;</p>



<p class="wp-block-paragraph">&nbsp;I must be discrete.&nbsp; Setting out a shingle as a miracle worker was out of the question.&nbsp; But how else might I reach the people who most needed my help?</p>



<p class="wp-block-paragraph">Eventually I came up with the idea of volunteering in the cancer ward at a local hospital.&nbsp; I would visit with patients posing not as a doctor, but as a good samaritan there to comfort the sick.&nbsp; As they talked, I would casually touch them over the area where they said their tumor was.&nbsp; They would be cured without knowing that it was me.&nbsp; With some cancers, it might be weeks before a test confirmed that they had gone into remission.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">By then I would be long gone.&nbsp; A stranger in a new town.</p>



<p class="wp-block-paragraph">I found an organization called Dr. Wigglesworth which trains people to become hospital clowns.&nbsp; I&#8217;ve always been afraid of clowns, but apparently people who are dealing with the gravity of terminal illness rather like them.</p>



<p class="wp-block-paragraph">So I went down to the Dr. Wigglesworth Academy, which was located on the second floor of a townhouse in the Richmond District.&nbsp; They had to buzz me up.</p>



<p class="wp-block-paragraph">My intake interview was with this cloyingly cheerful woman named Anne.&nbsp; Except for an overabundance of foundation on her face, nothing about Anne&#8217;s appearance suggested that she had a clown alter-ego.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">&#8220;What part of our mission inspired you to come in today?&#8221; she asked.</p>



<p class="wp-block-paragraph">&#8220;I just want to heal people,&#8221; I said.&nbsp; &#8220;With laughter, I mean.&#8221;</p>



<p class="wp-block-paragraph">She looked at me for a moment.&nbsp; Expecting me to say more, I guess.</p>



<p class="wp-block-paragraph">&#8220;Do you have any past experience as a clown?&#8221; she asked, finally.</p>



<p class="wp-block-paragraph">Up until that point, I hadn&#8217;t realized that a job as an unpaid clown required an extensive C.V.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">&#8220;Not really,&#8221; I said, &#8220;but I&#8217;m a fast learner.&#8221;</p>



<p class="wp-block-paragraph">&#8220;You don&#8217;t seem that funny to me,&#8221; she said.</p>



<p class="wp-block-paragraph">I later surmised that this was a joke, and that I was supposed to laugh at it to show that I could laugh at myself, I guess.&nbsp; But I just sat there awkwardly.&nbsp; I used to clown around a lot as a kid, but it wasn&#8217;t something I could just turn on whenever I wanted.</p>



<p class="wp-block-paragraph">&#8220;I&#8217;m only teasing,&#8221; she said.&nbsp; &#8220;We don&#8217;t expect you to be funny on cue, but you do need to bring some prepared ideas for those moments when the humor doesn&#8217;t just flow.&nbsp; That&#8217;s what we teach you in our Clowning 101 class.&#8221;</p>



<p class="wp-block-paragraph">I learned that being a hospital clown was not only an unpaid position, but one that I would pay for.&nbsp; Clowning 101 met one night a week for 8 weeks and would cost me $695.</p>



<p class="wp-block-paragraph">I also learned that the Dr. Wigglesworth Academy mostly dealt with kids, and thus, quite reasonably, there was a strict no-touch rule.&nbsp; So much for my super-power.</p>



<p class="wp-block-paragraph">I told her I&#8217;d think about it.</p>



<p class="wp-block-paragraph">My next plan was to get a dog.&nbsp; Then I wouldn&#8217;t have to be too talented at talking with people because the dog would be doing most of the work.&nbsp; While the patient was distracted, I&#8217;d sort of brush up against them with my miracle hands.</p>



<p class="wp-block-paragraph">But I couldn&#8217;t show up with just any dog.&nbsp; I didn&#8217;t want a situation where my comfort animal jumped up on an old lady&#8217;s deathbed and, you know, knocked out her I.V. or something.&nbsp; I also needed a dog you could trust around hospital food.</p>



<p class="wp-block-paragraph">I went to the pound hoping to find something small with an ugly but adorable face.&nbsp; What they had that day were mostly pit bulls. &nbsp; There was also this one bulldog with a profusion of snot on its face.&nbsp; I didn&#8217;t see anything you would want to put in your lap and pat for hours.&nbsp;</p>



<p class="wp-block-paragraph">Also, I began sneezing the moment I walked in the kennel.&nbsp; Apparently I was allergic to dogs.&nbsp;</p>



<p class="wp-block-paragraph">At this point, I decided to abandon my hospital idea and see if Merv might connect me with some of his terminally ill friends.&nbsp; He was pretty old, so I figured he had a few.</p>



<p class="wp-block-paragraph">I was right.&nbsp; When I went back to the coffee shop in Haight-Ashbury, he was there with three other old men and a woman named Irene who appeared to be in her mid-50s.</p>



<p class="wp-block-paragraph">&#8220;There you are,&#8221; he yelled to me before I&#8217;d even crossed the street, &#8220;We&#8217;ve been waiting for you for days!&#8221;</p>



<p class="wp-block-paragraph">As it turns out, he hadn&#8217;t kept his promise to tell no one about my powers.&nbsp; But since he didn&#8217;t have my contact information, he&#8217;d just shown up every day with this geezer hodgepodge.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">He told me about their ailments.&nbsp; Two of the old men had minor issues: arthritis and chronic constipation.&nbsp; The third was almost entirely deaf.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">Another, named Irene, had lived with chronic constipation for years.&nbsp; She was pale and thin.</p>



<p class="wp-block-paragraph">I set to work immediately laying hands on one man&#8217;s knees, another man&#8217;s butt.&nbsp; They registered no immediate comfort, but smiled broadly in the belief that their health was on the mend.&nbsp; I placed my hands on the deaf man&#8217;s ears.</p>



<p class="wp-block-paragraph">&#8220;How do you like them apples?&#8221; Merv said to the old man.</p>



<p class="wp-block-paragraph">&#8220;What?&#8221; he said, loudly.</p>



<p class="wp-block-paragraph">&#8220;HOW DO YOU LIKE THEM APPLES?&#8221; Merv repeated.</p>



<p class="wp-block-paragraph">The man, still deaf, shook his head.&nbsp; I touched him again behind the ears.&nbsp; No zap.</p>



<p class="wp-block-paragraph">Merv leaned forward.&nbsp; &#8220;HOWS ABOUT NOW,&#8221; he shouted.</p>



<p class="wp-block-paragraph">The old man still looked confused.&nbsp; And deaf.&nbsp; And disappointed.</p>



<p class="wp-block-paragraph">&#8220;Maybe you&#8217;re nervous,&#8221; Merv said, turning to me.&nbsp; &#8220;Do you want to take a break?&#8221;</p>



<p class="wp-block-paragraph">I shook my head.</p>



<p class="wp-block-paragraph">&#8220;Good,&#8221; Irene said in a voice so quiet I could barely hear it, &#8220;won&#8217;t you try on me?&#8221;</p>



<p class="wp-block-paragraph">I touched her belly, near where I thought her clogged poo might be.&nbsp; I touched her belly from many angles.</p>



<p class="wp-block-paragraph">&#8220;You&#8217;re blushing,&#8221; she said.</p>



<p class="wp-block-paragraph">&#8220;Is it helping?&#8221; I asked.</p>



<p class="wp-block-paragraph">&#8220;I think,&#8221; she said, laughing a little.&nbsp; &#8220;You probably aren&#8217;t doing anything for my blockage, but it feels nice to be touched by such a handsome young man.&#8221;</p>



<p class="wp-block-paragraph">I looked at her sadly.</p>



<p class="wp-block-paragraph">***</p>



<p class="wp-block-paragraph">I wondered whether my powers simply needed a recharge and I was all out of Reluctant Healer.&nbsp; That night I called my old girlfriend, Sarah.&nbsp;</p>



<p class="wp-block-paragraph">&#8220;You smoked my weed?&#8221; she said.</p>



<p class="wp-block-paragraph">&#8220;Just a little,&#8221; I said.&nbsp; &#8220;Maybe more than a little.&nbsp; Listen, do you remember where you got the bag of Reluctant Healer?&#8221; &nbsp; I&#8217;d already searched all the local head shops.&nbsp; No one had heard of the variety.</p>



<p class="wp-block-paragraph">&#8220;I didn&#8217;t buy any of that,&#8221; she said, &#8220;it belonged to an old boyfriend who owed me money he said he needed to set up his cannabis business.&nbsp; As it turned out, he was the only customer.&nbsp; So I took his stash.&#8221;</p>



<p class="wp-block-paragraph">&#8220;Where is he now?&#8221; I said.</p>



<p class="wp-block-paragraph">&#8220;Nope,&#8221; she said.&nbsp; &#8220;First of all, don&#8217;t know, don&#8217;t care.&nbsp; Second of all, if we did find him, he&#8217;s just going to want his weed back.&nbsp; How much did you smoke, anyway?&#8221;</p>



<p class="wp-block-paragraph">&#8220;A few bags,&#8221; I said.</p>



<p class="wp-block-paragraph">&#8220;A few BAGS?&#8221;</p>



<p class="wp-block-paragraph">&#8220;You left it behind.&#8221;</p>



<p class="wp-block-paragraph">&#8220;Did you also parade around in my underwear?&#8221;</p>



<p class="wp-block-paragraph">&#8220;I did not,&#8221; I lied.</p>



<p class="wp-block-paragraph">&#8220;Take care of yourself, Clayton.&#8221;</p>



<p class="wp-block-paragraph">***</p>



<p class="wp-block-paragraph">The next day, I went back to Haight-Ashbury, but only Irene was there.&nbsp;</p>



<p class="wp-block-paragraph">&#8220;Where&#8217;s Merv?&#8221; I asked.</p>



<p class="wp-block-paragraph">&#8220;He told me to tell you he was going to hold back for a while.&nbsp; He said he had a reputation to uphold and didn&#8217;t want to stick his neck out for a fake healer.&#8221;</p>



<p class="wp-block-paragraph">&#8220;But you&#8217;re here,&#8221; I said.</p>



<p class="wp-block-paragraph">&#8220;I just wanted to thank you,&#8221; she said.</p>



<p class="wp-block-paragraph">&#8220;Did it work?&#8221; I asked.</p>



<p class="wp-block-paragraph">&#8220;I don&#8217;t think so,&#8221; she said.&nbsp; &#8220;Still constipated.&nbsp; But it was nice of you to try to help me.&nbsp; I was thankful for that.&#8221;</p>



<p class="wp-block-paragraph">I reached for her hand on the table and squeezed it.&nbsp; &#8220;I&#8217;m sorry I couldn&#8217;t help you,&#8221; I said.</p>



<p class="wp-block-paragraph">At that moment she frowned.&nbsp; It was not an expression of unhappiness, but one of surprise.</p>



<p class="wp-block-paragraph">&#8220;What did you just do?&#8221; she asked.</p>



<p class="wp-block-paragraph">I stared at her blankly.</p>



<p class="wp-block-paragraph">&#8220;When you touched my hand just now,&#8221; she paused, groping for words.&nbsp; &#8220;I felt this wave of&#8230;&#8221;</p>



<p class="wp-block-paragraph">&#8220;Excuse me,&#8221; she said, dashing off to the bathroom.</p>



<p class="wp-block-paragraph">***</p>



<p class="wp-block-paragraph">It has been months since I healed Irene&#8217;s constipation.&nbsp; For reasons that I cannot explain, my power to heal never returned.&nbsp; Or maybe it is still there, just under the surface but beyond my control.</p>



<p class="wp-block-paragraph">Maybe it was never in my control.&nbsp; Maybe it was a power that only worked when I wasn&#8217;t trying.</p>



<p class="wp-block-paragraph">Over the past few months I have tried to reconstruct the preconditions of these few miracles I performed unwittingly.  Healing required touch: some form of real connection with another human being.  And healing required me to be unconscious of my power.  It was something not given to me; Something not even mine to give away.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>The Frenetic North Woods</title>
		<link>https://demianperry.com/the-frenetic-north-woods/</link>
		
		<dc:creator><![CDATA[perrydc]]></dc:creator>
		<pubDate>Mon, 18 Apr 2022 12:07:49 +0000</pubDate>
				<category><![CDATA[Short Story]]></category>
		<category><![CDATA[writing]]></category>
		<guid isPermaLink="false">https://demianperry.com/?p=2453</guid>

					<description><![CDATA[...A light snow began to fall on the two men huddled behind the cow, who continued to proclaim its suffering.  In a town where hunters regularly trudged across neighbor’s fields and fired indiscriminately, the gunshot had not attracted anyone’s attention.]]></description>
										<content:encoded><![CDATA[
<p class="has-drop-cap wp-block-paragraph">For Christmas one year, both boys received the same gift from their father: a bottle of expensive bourbon.&nbsp; At the time, William was 16 and Frank was 14.&nbsp; Their father explained that they were not to drink it until each of their bottles had aged properly, which would be around the time the two boys were of legal drinking age.&nbsp; Daniel (their father) went on to explain that waiting to enjoy something would teach them both a valuable lesson in life: the anticipation of a gift, he said, sometimes brings more pleasure than the gift itself.</p>



<p class="wp-block-paragraph">Frank&#8217;s bottle went &#8220;missing&#8221; a few months later.</p>



<p class="wp-block-paragraph">William had more patience.&nbsp; His bottle moldered in his room; it remained untouched, he assumed, until one wintry afternoon five years later, when he was home from college.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">The snow fell softly on the fields that day.&nbsp; As he looked out through one of the east windows of the old farmhouse, he could barely see the distant hills through the flurry.&nbsp; The setting was perfect.&nbsp; It looked like the cover of a magazine with a name like <em>Rural Hospitality</em>.&nbsp; Or maybe <em>Pastoral Holiday.&nbsp;</em></p>



<p class="wp-block-paragraph">He called his father and brother into the living room.&nbsp; The bottle stood proudly in front of a low, smouldering fire surrounded by three tumblers, each with a large cube of ice placed neatly in the center.&nbsp; After pouring and passing a glass to Frank and Daniel, William made a toast.</p>



<p class="wp-block-paragraph">&#8220;To dear old dad, who taught us that the best things come to those who wait.&#8221;</p>



<p class="wp-block-paragraph">Frank ignored the slight and took a tiny sip while his brother and father threw theirs back.</p>



<p class="wp-block-paragraph">It took William and Daniel only a moment to realize that <em>someone</em>, probably years ago, had drained the contents of William&#8217;s bottle and refilled it with bourbon-colored Listerine.</p>



<p class="wp-block-paragraph">&#8220;Yikes,&#8221; Frank said, barely suppressing a smile.&nbsp; &#8220;That did not age well.&#8221;</p>



<p class="wp-block-paragraph">When neither his brother nor his father responded, he added: &#8220;Maybe we waited too long?&#8221;</p>



<p class="wp-block-paragraph">***</p>



<p class="wp-block-paragraph">William never did look back and laugh at that one.&nbsp; Even years later — after the two boys had grown apart and their father had finally received his reward for a life of deferred gratification, William would frown and shake his head involuntarily at the memory.&nbsp; It wasn&#8217;t his fault, he told himself, Frankie had all the self-control of a puppy let loose in a deli.</p>



<p class="wp-block-paragraph">William remembered it now as he pulled his Volvo into town again for the fifteenth time in as many years.&nbsp; He was up from Boston to attend an auction to support his father&#8217;s favorite charity.&nbsp; Though his father had died months ago, Daniel still had some pull over William.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">He drove slowly down Main Street, glancing at the buildings that would never change except to darken and peel and eventually fall in on each other.&nbsp; Each one, like a scene from a grotesque opera, held the ghosts of his half memories: first, there was the Paradise Hotel, which had ceased to be a hotel shortly after the Civil War and was where a woman once stood on the balcony and looked down at William on the street below and laughed when his cousin pulled down his pants.&nbsp; Next to it was the hoarder house with the asbestos shingles and in which lived a man they all called Kit Kat.&nbsp; Kit had fallen off the hayride at the county fair when he was a boy and from that day forward would only communicate by meowing like a cat.&nbsp; It was as though falling out of a wagon and hitting his head had fixed his mind in time, so that now, as a 67 year old man, he still saw the world through the eyes of a little boy.&nbsp; Lastly, the gas station — now a Zippy Mart — behind which rose piles of petroleum tainted gravel and in which he and his brother had experimented with girls and alcohol and harder things.</p>



<p class="wp-block-paragraph">The dinner was to be held at the usual venue, a giant hall that held the stench of six decades of banquet suppers.</p>



<p class="wp-block-paragraph">Officially, the Town of Waitsville Armory was where the local National Guardsmen assembled to tinker with obsolete machinery and plan their monthly <em>training exercises,</em> which for some reason only happened during hunting season.&nbsp; This evening, the lot was full.</p>



<p class="wp-block-paragraph">William didn&#8217;t recognize all of the cars, but he noticed at once Frank&#8217;s rusty black van and deliberately parked on the other side of the lot.&nbsp; It was a wonder that it still ran.&nbsp; More wondrous was that the name of Frank&#8217;s teenage band, <em>Redneck Death Carnival</em>, was still legible, painted in a once yellow and now dirty orange scrawl.</p>



<p class="wp-block-paragraph">The doors to the Armory were propped open with chairs and through them William could see Vermillion Cooper waving him over to the reception table.&nbsp; Vermillion was not her original name but she had assumed it some forty years ago, when she had declared herself the poet laureate of Waitsville.</p>



<p class="wp-block-paragraph">&#8220;William!&nbsp; It&#8217;s simply sublime to see you!&nbsp; So glad you could make it.&#8221;</p>



<p class="wp-block-paragraph">&#8220;Hello Vermillion,&#8221; he said, noting her favorite word, &#8220;You&#8217;re always <em>sublime</em>.&#8221;</p>



<p class="wp-block-paragraph">She presented her cheek to him and he delivered a quick peck.&nbsp; Then she asked: &#8220;do you have any last minute items for the auction?&nbsp; It&#8217;s not too late to enter something.&#8221;</p>



<p class="wp-block-paragraph">&#8220;Nope.&nbsp; Just me.&#8221;</p>



<p class="wp-block-paragraph">&#8220;What&#8217;s the starting bid?&#8221;</p>



<p class="wp-block-paragraph">William laughed politely and then turned towards his brother, who was smiling at him from across the room, behind a row of crumpled cans of Natural Light.</p>



<p class="wp-block-paragraph">&#8220;I see you found the bar,&#8221; William said as he stepped up to the table.</p>



<p class="wp-block-paragraph">Frank stood up and hugged his brother.&nbsp; Then he looked kindly into his eyes, put an arm on his shoulder and then, with the grace of a ballet dancer, slid his hand down William&#8217;s chest and latched onto his right nipple.&nbsp; He squeezed it mercilessly between his thumb and forefinger and rolled it in the rough folds of his shirt.</p>



<p class="wp-block-paragraph">&#8220;Gaaaah!&#8221; William convulsed and twisted himself free.&nbsp; &#8220;Why do you always do that?&#8221;</p>



<p class="wp-block-paragraph">&#8220;I don&#8217;t know, man.&nbsp; I don&#8217;t even think about it anymore.&nbsp; It&#8217;s like the way you always comment on my love of the drink.&#8221;</p>



<p class="wp-block-paragraph">It was a fair point, William conceded.&nbsp; Maybe he should instead congratulate his brother for being the only one amongst his friends who had confined his drug use to legal substances.</p>



<p class="wp-block-paragraph">&#8220;So do we have to do anything tonight?&#8221; William cast a worried look around the room.&nbsp; &#8220;Give a speech or something?&#8221;</p>



<p class="wp-block-paragraph">&#8220;Nah.&nbsp; Just talk to people and maybe bid on something.&nbsp; Everything is donated so there are some real stinkers for sale.&nbsp; All the money is going to the youth sports league.&#8221;</p>



<p class="wp-block-paragraph">&#8220;Dad loved his sports.&#8221;</p>



<p class="wp-block-paragraph">&#8220;Yeah.&nbsp; Too bad neither of us was any good.&#8221;</p>



<p class="wp-block-paragraph">&#8220;You were pretty good,&#8221; William said.&nbsp; &#8220;You just didn&#8217;t have any interest in it.&nbsp; What was it dad always said?&nbsp; Something about how you could pitch like Satchel Paige.&#8221;</p>



<p class="wp-block-paragraph">&#8220;Yeah.&nbsp; And he said you hit like Lou Gehrig.&nbsp; In his later years, of course.&#8221;</p>



<p class="wp-block-paragraph">&#8220;Hey now,&#8221; said William, &#8220;You&#8217;re the twitchy one around here.&#8221;&nbsp; William had noticed that his brother was busily fidgeting with his napkin.&nbsp; He also appeared to have lost some weight.&nbsp; Frank looked away.</p>



<p class="wp-block-paragraph">After the half-eaten chicken had been cleared and the teenage waiters had swept the crumbs off the folding tables and onto the floor, the bidding began.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">William kept hoping that the auctioneer would offer something small that he could cart back to Boston with him, but nearly all of the items were things that could only be consumed in town: a decade of free oil changes at the Zippy Mart, first pick of strawberries at the Franklin Farm, a paired cheese experience at the Kingdom Winery.&nbsp; Frank won that bid, though he likely couldn&#8217;t afford the auction price.</p>



<p class="wp-block-paragraph">The prize item, which stirred a murmur from the audience, was a calf donated by the Palmer Dairy.&nbsp; John Palmer, who had not bothered to change out of his cowshit-caked overalls for the occasion, led the calf by a rope and held her tightly with both of his arms around her neck as the auctioneer called out for an opening bid.</p>



<p class="wp-block-paragraph">&#8220;Will anyone give me $250 for this fine holstein?&nbsp; She was born just this week and has already grown into a fine specimen.&#8221;</p>



<p class="wp-block-paragraph">It was true.&nbsp; She was enormous and yet her disproportionate eyes and muzzle suggested that she would continue to grow.&nbsp; How could any creature born a week ago be so large?&nbsp; If the auction lasted much longer, they might not be able to get her out of the building.&nbsp; No one raised a paddle to take on this great snot-nosed, eyeball licking burden of bovine flesh.</p>



<p class="wp-block-paragraph">William felt his brother&#8217;s eyes on him.&nbsp; When he didn&#8217;t turn towards him, Frank yelled: &#8220;Come on Bill, you gotta bid on something!&#8221;</p>



<p class="wp-block-paragraph">The room was silent as the auctioneer waved his gavel and repeated the reserve price. The whole town watched the farmer and his unwanted calf.&nbsp; It was unbearable for William.&nbsp; He could not possibly take this cow home in his Volvo tonight, but even if he could, where would he put it?&nbsp;</p>



<p class="wp-block-paragraph">But he also could not bear to watch a dumb animal rejected so publicly.&nbsp; He must, at least, start the bidding.&nbsp; After he had built up the energy in the room he would let some local win the prize.</p>



<p class="wp-block-paragraph">William drained the last of the single glass of wine he had been nursing all night and bellowed: &#8220;Twohundredfifty!&#8221;</p>



<p class="wp-block-paragraph">Without pausing for breath, without soliciting a counter-bid, the auctioneer pointed his gavel at William and said softly: &#8220;Sold.&#8221;</p>



<p class="wp-block-paragraph">***</p>



<p class="wp-block-paragraph">William had tried to make out the check as a donation and not ask for anything in return, but the organizer of the event thought that John Palmer, who had donated the calf out of love for William&#8217;s father, would be offended.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">Frank offered little help as William led the unwieldy calf out of the building.&nbsp; Once outside, the calf cast her large, frightened eyes around the growing crowd of spectators filing out into the parking lot.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">&#8220;Whatevayer drivin, William, I doan think she&#8217;s gonna fit!&#8221;&nbsp; This from Henry Caulfield, a second or third cousin whom William remembered vaguely from their last Christmas party in the old farmhouse.</p>



<p class="wp-block-paragraph">It occurred to him now that the whole village had been in on this joke.&nbsp; Of course he would not know what to do with a cow.&nbsp; In fact, he was possibly the least equipped to derive any profit from the animal.&nbsp; At the same time, of course he would bid on the cow if no one else did.&nbsp; William had always been the conciliator.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">For once in the many years since he had moved away, this trip would last much longer than he had planned.</p>



<p class="wp-block-paragraph">***</p>



<p class="wp-block-paragraph">It was a moonless night and the streetlights on Route 5 were mostly out.&nbsp; William drove faster than normal through the dark woods and still he struggled to keep up with the taillights of his brother&#8217;s van, which now and then shifted on its axles.&nbsp; Anyone could see there was an animal inside.</p>



<p class="wp-block-paragraph">As they rolled into the center of town, the dimly lit buildings emerged from the black night like a stage appearing from behind a curtain.&nbsp; William assumed his brother was out of gas when he saw him turn on his left blinker in front of the Zippy Mart, but then he pulled past the pumps and around to the back of the convenience store.&nbsp; The tail-lights of the van grew dim as Frank shut off the engine.&nbsp; In a moment he was beside William&#8217;s car.&nbsp; William rolled down his window.</p>



<p class="wp-block-paragraph">&#8220;Wait here for a second, bro,&#8221; he whispered, &#8220;I have to conduct some business.&#8221;</p>



<p class="wp-block-paragraph">&#8220;What business?&#8221; William asked.</p>



<p class="wp-block-paragraph">Frank did not answer.</p>



<p class="wp-block-paragraph">William&#8217;s eyes followed his brother as he walked across the parking lot to a dumpster surrounded by the arc of a buzzing security light.&nbsp; The contrast of the light against the darkness all around reminded William of the bug zapper up at their farmhouse.&nbsp; In late June, when the black flies were everywhere, their father would turn on the bug zapper and execute maybe a thousand flies in a single evening.&nbsp; It not only killed the black flies on their porch, but also indiscriminately emptied the wilderness around of moths, beetles, and any other nocturnal flying things that might seek the light.</p>



<p class="wp-block-paragraph">William watched his brother approach the small crowd beside the dumpster.&nbsp; He expected to hear muffled laughter, but he saw now that this was a serious transaction.&nbsp; Something small changed hands between his brother and a tall giant of a man.&nbsp; William parked, shut off his car and quietly stepped out onto the asphalt.</p>



<p class="wp-block-paragraph">Frank was surprised to find his brother in the driver&#8217;s seat of the van.</p>



<p class="wp-block-paragraph">&#8220;I&#8217;d like to drive the Death Carnival for a bit,&#8221; William said.</p>



<p class="wp-block-paragraph">&#8220;And leave your car here?&#8221;</p>



<p class="wp-block-paragraph">&#8220;I can pick it up in the morning.&nbsp; I&#8217;m thinking maybe you shouldn&#8217;t be driving just now.&#8221;</p>



<p class="wp-block-paragraph">&#8220;Suit yourself,&#8221; Frank said.&nbsp; He walked around to the passenger side and got in.</p>



<p class="wp-block-paragraph">Although the road was familiar to William, navigating the van was not without its challenges.&nbsp; In that part of the country, the only roads with any real traffic on them are the ones that lead to the Canadian border crossings, but even the back roads were littered with wild turkeys.&nbsp; Though William had driven this particular road many times before, he had to correct his steering several times because with each turn the lumbering animal in the back repositioned itself.</p>



<p class="wp-block-paragraph">Finally the road straightened out.&nbsp; After a short piece, William asked, &#8220;what are you going to do with the farm?&#8221;</p>



<p class="wp-block-paragraph">&#8220;I don&#8217;t know.&nbsp; I thought I could get some money for the timber, but they cut down a few sample trees and they were all rotten in the middle.&nbsp; Did you know that pine trees rot from the inside out?&nbsp; They look fine, even if you walk right up to one of them, but they&#8217;re all dead on the inside.&#8221;</p>



<p class="wp-block-paragraph">Although the calf had now settled itself, the hot air inside the van was humid from her respirations.</p>



<p class="wp-block-paragraph">After a moment, William asked, &#8220;So you&#8217;re using now?&#8221;</p>



<p class="wp-block-paragraph">Frank considered this for a while and then said softly: &#8220;Naw&#8230;just a gift for my bro.&nbsp; I thought you might need to relax a little tonight.&#8221;</p>



<p class="wp-block-paragraph">&#8220;Ah,&#8221; William said, relieved, &#8220;so you picked up some pot?&#8221;</p>



<p class="wp-block-paragraph">&#8220;Pot?&#8221; Frank laughed, &#8220;The 80s called and they want your drugs back.&#8221; He pulled an orange plastic medicine bottle from his pocket and shook it, which surprised the calf and made her fart.&nbsp; &#8220;This, my friend,&#8221; he said, shaking the bottle again, &#8220;is a prescription for fun.&#8221;</p>



<p class="wp-block-paragraph">&#8220;Jesus, Frank.&nbsp; What is it?&#8221;</p>



<p class="wp-block-paragraph">&#8220;The prescription on the side says it&#8217;s vicodin.&nbsp; And inside you&#8217;ll find little pills that look exactly like vicodin.&#8221;&nbsp; He dropped his voice to a whisper.&nbsp; &#8220;But it&#8217;s not vicodin.&#8221;</p>



<p class="wp-block-paragraph">&#8220;The fuck is it?&#8221;</p>



<p class="wp-block-paragraph">&#8220;It&#8217;s texmex.&#8221;</p>



<p class="wp-block-paragraph">&#8220;Texmex?&#8221;</p>



<p class="wp-block-paragraph">&#8220;A mix of heroin and fentanyl, packed in Mexico to look like pills and packaged right here in town.&nbsp; Not like the old days when you&#8217;d buy a rock in a ziplock bag and you had to, like, cook it on a spoon or something.&nbsp; This stuff is real discreet.&nbsp; You know you can buy these empty prescription bottles on Amazon?&nbsp; And we put labels on them so they look like legitimate prescriptions.&#8221;</p>



<p class="wp-block-paragraph">&#8220;Wait.&nbsp; You&#8217;re in on this?&#8221;</p>



<p class="wp-block-paragraph">&#8220;I get the friends and family discount.&nbsp; And yes, practically the whole town is in on this: Bobby, Charlie, Mike B.&#8221;</p>



<p class="wp-block-paragraph">&#8220;All the local geniuses, at least.&nbsp; So you sample your own goods now and then?&#8221;</p>



<p class="wp-block-paragraph">&#8220;Only when I need a little pick-me-up.&nbsp; Dad just died for chrissake.&nbsp; I&#8217;m depressed.&nbsp; I&#8217;ll probably stop after this one&#8221;</p>



<p class="wp-block-paragraph">&#8220;The hell you will.&#8221;</p>



<p class="wp-block-paragraph">William turned into a narrow break in the woods.&nbsp; Silence enveloped him the moment he killed the engine.&nbsp; The calf shifted uncomfortably as William stepped out of the van.&nbsp; He walked instinctively past the house he had grown up in and across the field to the shore of the large lake beyond.&nbsp; He stood on the dock smelling the cool breeze from the water.&nbsp; A loon called out but was unanswered.&nbsp; Across the lake, the Canadian wilderness slept.</p>



<p class="wp-block-paragraph">Behind him he heard his brother shouting.&nbsp; He turned around and saw the van rocking back and forth as the cow clumped around.&nbsp; He walked back to the farmhouse and as soon as he was within talking distance, his brother said: &#8220;Help me get him out before he tears my Chevy apart.&#8221;</p>



<p class="wp-block-paragraph">&#8220;Can&#8217;t we leave him there for the night?&#8221;</p>



<p class="wp-block-paragraph">&#8220;Hell no,&#8221; Frank said, throwing the back doors open.</p>



<p class="wp-block-paragraph">The calf looked up at them with mournful eyes and licked her nostrils.&nbsp; She stood unsteadily and stared out into the night.</p>



<p class="wp-block-paragraph">&#8220;C&#8217;mon girl,&#8221; Frank said.&nbsp; Then he whistled.</p>



<p class="wp-block-paragraph">The calf snorted and backed further into the van.</p>



<p class="wp-block-paragraph">&#8220;Jesus, Frank,&#8221; William said, &#8220;she&#8217;s not a dog.&nbsp; You scared her.&#8221;</p>



<p class="wp-block-paragraph">&#8220;She scares <em>me</em>!&nbsp; I thought she was gonna kill us this whole drive.&nbsp; Flatten us or something.&nbsp; Every time she shifted back there I could hear my damn shocks giving out.&#8221;</p>



<p class="wp-block-paragraph">&#8220;Well get her,&#8221; William said.</p>



<p class="wp-block-paragraph">&#8220;You get her.&nbsp; I prefer my beef on a bun.&#8221;</p>



<p class="wp-block-paragraph">William stepped cautiously into the van and pulled at the halter around her head, but she would not budge.</p>



<p class="wp-block-paragraph">&#8220;Hold on,&#8221; Frank said, &#8220;step on out for a minute.&nbsp; I&#8217;ve got an idea.&#8221;</p>



<p class="wp-block-paragraph">Frank got into the front seat and turned on the radio, full blast.&nbsp; The calf immediately jumped out the back of the van, tripped and fell hard against a tree.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">She commenced lowing until Frank had turned off the music.&nbsp; William tied her halter to a post that their dad had installed the last time Frank backed his van into the propane tank.&nbsp;</p>



<p class="wp-block-paragraph">Once inside the farmhouse, Frank offered William a drink.</p>



<p class="wp-block-paragraph">&#8220;Do you have any red wine?&#8221;&nbsp;</p>



<p class="wp-block-paragraph">&#8220;I have a bottle of mom&#8217;s dandelion wine.&#8221;</p>



<p class="wp-block-paragraph">&#8220;Mom died ten years ago.&nbsp; Do you think it&#8217;s still any good?&#8221;</p>



<p class="wp-block-paragraph">&#8220;No, I tried some last winter.&nbsp; It was awful.&#8221;</p>



<p class="wp-block-paragraph">&#8220;But you kept it?&#8221;</p>



<p class="wp-block-paragraph">&#8220;It&#8217;s sentimental.&#8221;</p>



<p class="wp-block-paragraph">The other options were beer and something Frank said was whiskey.&nbsp; It was objectionable to William&#8217;s palate.</p>



<p class="wp-block-paragraph">&#8220;What are we going to do with this damn cow?&#8221; Frank asked.</p>



<p class="wp-block-paragraph">&#8220;Perhaps you can let it roam free on the hills.&nbsp; Isn&#8217;t that what cows do?&#8221;</p>



<p class="wp-block-paragraph">&#8220;We don&#8217;t have the fencing to let him roam free and the barn isn&#8217;t big enough to keep him in the winter.&#8221;</p>



<p class="wp-block-paragraph">&#8220;What do you suggest?&#8221;</p>



<p class="wp-block-paragraph">&#8220;You could move back in and help me put up a fence.&#8221;</p>



<p class="wp-block-paragraph">William thought for a long time.&nbsp; At last he said, &#8220;Waitsville is a fine place to visit.&#8221;</p>



<p class="wp-block-paragraph">&#8220;It&#8217;s your hometown, man!&nbsp; You belong here.&#8221;</p>



<p class="wp-block-paragraph">&#8220;There&#8217;s nothing to do.&nbsp; I&#8217;d become a raging alcoholic in two weeks.&nbsp; Or worse.&#8221;&nbsp; He looked severely at Frank.</p>



<p class="wp-block-paragraph">&#8220;Yeah, well, I know we didn&#8217;t always get along, Billy, but I miss having you around.&nbsp; You were always fun to mess with.&nbsp; Riling you up or getting you in trouble always gave me something to look forward to.&nbsp; Remember that time we found that cave near the river?&#8221;</p>



<p class="wp-block-paragraph">&#8220;Indian Joe&#8217;s cave.&#8221;</p>



<p class="wp-block-paragraph">&#8220;Exactly!&nbsp; Indian Joe.&nbsp; See I would have just thought it was a cool place to get stoned, but you made up this whole story about how these mountains used to be full of indians and how they&#8217;d come down to the river to make charcoal.&#8221;</p>



<p class="wp-block-paragraph">&#8220;It&#8217;s true,&#8221; William said, &#8220;You can still find pottery shards if you know where to look, mostly near the old charcoal pits on the plain.&nbsp; They were here for centuries.&#8221;</p>



<p class="wp-block-paragraph">Frank perked up, remembering the history his brother had taught him long ago, &#8220;and then some asshole set up a log run on the Connecticut River and cut down all the trees and chased all the Indians away.&#8221;</p>



<p class="wp-block-paragraph">&#8220;All except Indian Joe.&#8221;</p>



<p class="wp-block-paragraph">&#8220;This was his home.&nbsp; No one was going to chase him off.&nbsp; The old-timers say he had a drinking problem, though.&nbsp; But, hell, I guess we all do up here.&#8221;</p>



<p class="wp-block-paragraph">&#8220;That&#8217;s your problem?&nbsp; You <em>drink</em> too much?&#8221;&nbsp; William raised his eyebrows.</p>



<p class="wp-block-paragraph">&#8220;I said I&#8217;m done after tonight.&#8221;</p>



<p class="wp-block-paragraph">&#8220;You know that&#8217;s not true.&nbsp; Think you can quit heroin?&nbsp; Just like that?&nbsp; Here&#8217;s the truth: you&#8217;ll kill yourself in a few months, maybe a year.&nbsp; And I&#8217;ll come up for the funeral.&nbsp; And then I&#8217;ll be the last one and I&#8217;ll sell our land and finally be shut of this goddamn town.&#8221;</p>



<p class="wp-block-paragraph">Frank pulled the orange prescription bottle out of his pocket and held it up to the light.</p>



<p class="wp-block-paragraph">&#8220;It&#8217;s not as addictive as they say.&#8221;</p>



<p class="wp-block-paragraph">&#8220;Prove it.&#8221;&nbsp; William gestured with his fingers.</p>



<p class="wp-block-paragraph">Frank stood there staring at his hand for a long time.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">Cursing, and unable to look his brother in the eye, Frank handed over pills.</p>



<p class="wp-block-paragraph">***</p>



<p class="wp-block-paragraph">William had never been able to sleep past eight because his room was on the east face of the farmhouse where the sun shines directly through the window in the morning.&nbsp; His father had taken down all the old curtains when their mother had died and Frank hadn&#8217;t yet bothered to put up new ones.</p>



<p class="wp-block-paragraph">William&#8217;s first real thought as he stared out at the landscape was that it seemed suspiciously still.&nbsp; He was used to the silence up here, but not the stillness.&nbsp; The mornings in the Northeast Kingdom are generally more frenetic than calm.&nbsp; As the sun burns off the mist from the valley and low lying hills, the constant motion of the atmosphere draws new colors and shadows, causing the landscape to shift from one moment to the next, almost like a living organism.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">But this morning was still.&nbsp; And why couldn&#8217;t he hear the cow?&nbsp; He pulled on his shoes and stepped out into the biting cold of the moist autumnal air.&nbsp; Not only was the calf not where he had left her, but even the pole he had tied her to was gone.</p>



<p class="wp-block-paragraph">He turned to the house and yelled to his brother inside.&nbsp; Frank appeared on the front porch shirtless, his long underwear stained by the sweat of his legs.&nbsp; Although it was early in the season, the hairs had already begun to grow through the knitting.</p>



<p class="wp-block-paragraph">&#8220;Well she won&#8217;t be hard to find,&#8221; he said, his eyes sweeping across the long driveway.</p>



<p class="wp-block-paragraph">The calf must have hauled the uprooted hitching post behind her when she left in the night because there was a deep groove scraped in the dirt all the way down the road.&nbsp; The two brothers jumped in the van and followed the line.&nbsp; Soon after the spot where the road met the lower plain and became flat, the line turned sharply to the right.&nbsp; There the fence was broken and beyond it the calf stood grazing.</p>



<p class="wp-block-paragraph">&#8220;Well let&#8217;s go get her,&#8221; William said.</p>



<p class="wp-block-paragraph">&#8220;No!&nbsp; Shit.&nbsp; No,&#8221; Frank replied.</p>



<p class="wp-block-paragraph">&#8220;What&#8217;s wrong?&#8221;&nbsp;</p>



<p class="wp-block-paragraph">&#8220;This is Big Tom&#8217;s land.&nbsp; Remember Big Tom?&#8221;</p>



<p class="wp-block-paragraph">&#8220;I remember Big Tom.&nbsp; I thought I saw him standing by the dumpster last night.&#8221;</p>



<p class="wp-block-paragraph">&#8220;That&#8217;s the guy.&nbsp; He&#8217;s got the Mexican connection.&nbsp; And this is his place.&#8221;</p>



<p class="wp-block-paragraph">&#8220;Well why don&#8217;t we get her off his property before he wakes up?&#8221;</p>



<p class="wp-block-paragraph">&#8220;Big Tom has a whole operation going on in his house.&nbsp; Unless you&#8217;re coming around for business — and there&#8217;s a right way to do that — it&#8217;s dangerous to set foot on his land.&#8221;</p>



<p class="wp-block-paragraph">&#8220;So what do you want to do?&#8221;</p>



<p class="wp-block-paragraph">&#8220;Let&#8217;s drive around front.&nbsp; You stay in the car and I&#8217;ll explain things to him.&#8221;</p>



<p class="wp-block-paragraph">William understood immediately.&nbsp; Big Tom would certainly remember him from the night when the two brothers went drinking with some friends at the Chimes of Midnight Grill.&nbsp; At that time, Frank was a bit of a man around town and there were rumors about him and the giant&#8217;s girlfriend.&nbsp; Big Tom appeared out of nowhere and slammed his fist on their table as he took an empty seat.&nbsp; Frank seemed unphased.&nbsp; Not getting the response he had hoped for, Big Tom reached silently across the table and picked up William&#8217;s glass of wine.&nbsp; He stuck out his pinky as he sipped it with exaggerated effete politeness.&nbsp; And then, staring at Frank with a smile, he flicked the empty glass against his bottom lip and bit off a piece of the thin glass bowl and snapped the stem in his hand.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">William had a premonition that his brother was going to die the moment the man stood up.&nbsp; Even in high school, Big Tom was nearly seven feet tall.</p>



<p class="wp-block-paragraph">In a moment of genius improvisation, William had jumped between the two and said that if they were going to fight, they needed to fight fair and in a place where neither man had an advantage.&nbsp; The golf course behind the bar was well lit and had few obstructions: they would have nothing but their fists to fight with.&nbsp; Both men agreed and headed for the door.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">The Chimes of Midnight bar was reached by a steep flight of stairs over the pizza parlor.&nbsp; William said he didn&#8217;t want any shenanigans on the stairs so he offered to go between the two men on the way down.&nbsp; Holding the door open, he invited Big Tom to go first.</p>



<p class="wp-block-paragraph">The moment Big Tom walked through the door, however, William grabbed the door frame and donkey kicked him down the stairs.&nbsp; Before he could get up, the two brothers were on him, pounding him hard enough to ensure that he wouldn&#8217;t put up much of a fight, at least for that evening.</p>



<p class="wp-block-paragraph">The timing was fortunate for William, though, as he was planning to leave for college that Monday.&nbsp; Big Tom had long ago forgiven Frank for his part in the fight, and even for sleeping with his girlfriend, but he and William had never made amends.&nbsp; One of the many things that had kept William&#8217;s hometown visits short was his fear of retribution from Big Tom.&nbsp; And now here he was: on the giant&#8217;s land.</p>



<p class="wp-block-paragraph">William put on his sunglasses and sat low in the van as Frank approached the house.</p>



<p class="wp-block-paragraph">Big Tom&#8217;s farm was all on a floodplain and the house sat about three feet above the ground on cinder block pilings.&nbsp; William could see daylight through the chinks between the junk Big Tom had packed in the crawlspace under his house.</p>



<p class="wp-block-paragraph">Frank rapped on the door.&nbsp; After a moment, it opened and Big Tom&#8217;s head peered down at him from the top of the doorframe.&nbsp; Frank was talking to him, but Big Tom was already looking past him and making eye contact with William.</p>



<p class="wp-block-paragraph">William couldn&#8217;t make out what he said, but Frank turned around to look back at the van, and as he did so, Big Tom knocked him out of the way with one powerful swipe of his hand.&nbsp; With an animal&#8217;s preternatural swiftness, he gamboled across his driveway to the van and pointed a pistol at William&#8217;s head.</p>



<p class="wp-block-paragraph">&#8220;Hey there Mr. Fairfight,&#8221; he whispered.&nbsp; &#8220;Out.&#8221;</p>



<p class="wp-block-paragraph">William&#8217;s hand was shaking as he turned the key in the ignition, but the van was slow to start.</p>



<p class="wp-block-paragraph">Before he could shift into gear, Big Tom jammed his pistol through the open window and bludgeoned William with it.&nbsp; Just as he heard the soft cocking of the pistol, he heard a much louder crack and Big Tom disappeared from his view.</p>



<p class="wp-block-paragraph">For a moment, William thought he had been shot.&nbsp; The blood was streaming from his nose and his ears were ringing.&nbsp; But as he sat up he could now see his brother standing over Big Tom&#8217;s prone body with a crowbar.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">&#8220;Fuck, Frank!&nbsp; You killed him.&#8221;</p>



<p class="wp-block-paragraph">&#8220;He was about to shoot you in the head.&nbsp; What was I supposed to do?&#8221;</p>



<p class="wp-block-paragraph">The brothers looked around them.&nbsp; There were two other houses up the hill that had a direct line of sight onto the driveway.</p>



<p class="wp-block-paragraph">Frank was the first to react.&nbsp; He lifted up the giant&#8217;s shoulders, but his bulk wouldn&#8217;t budge.</p>



<p class="wp-block-paragraph">&#8220;Help me carry him inside.&#8221;</p>



<p class="wp-block-paragraph">William picked up one enormous leg and then the other, but it was no good.&nbsp; Next he walked around the body and grabbed a shoulder while his brother repositioned himself on the other one.&nbsp; With effort, the two men managed to drag the giant across the driveway, up the three steps and into the house.</p>



<p class="wp-block-paragraph">Once inside, William retched, not from the horror of what they had just done, but from the smell inside the house.</p>



<p class="wp-block-paragraph">&#8220;Oh God.&nbsp; What is that?&#8221;</p>



<p class="wp-block-paragraph">Frank smiled and pointed at the hole in the living room floor, beside the couch, where you would expect to see an end table.</p>



<p class="wp-block-paragraph">&#8220;Big Tom got tired of trudging through the snow to the outhouse every morning.&nbsp; Hell, I guess it&#8217;s hard for a big dude like him to get around in the winter.&#8221;</p>



<p class="wp-block-paragraph">&#8220;You mean he &#8230; shits into his crawlspace?&nbsp; Onto the dirt?&#8221;</p>



<p class="wp-block-paragraph">&#8220;Of course not.&nbsp; He&#8217;s not an animal.&nbsp; There&#8217;s a 50 gallon trough under the hole which he empties periodically.&nbsp; Not often enough, in my opinion.&#8221;</p>



<p class="wp-block-paragraph">The brothers finally positioned Big Tom at the foot of the stairs leading up to the second level.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">&#8220;Get me some water,&#8221; William said.</p>



<p class="wp-block-paragraph">By the time Frank returned with a water jug from the kitchen, William was forcing the last of Frank&#8217;s pills down Big Tom&#8217;s throat.&nbsp; William snatched the jug from his brother, but poured too fast, an uncontrolled act which unfortunately revived the giant.</p>



<p class="wp-block-paragraph">He rose fast, thrashing like a demon.&nbsp; Because he stood between the brothers and the front door, they were forced to take the back door.&nbsp; They heard the giant screaming profanities behind them as they ran across the marshy fields towards the calf.&nbsp; It looked at them in surprise as dirt burst off its shoulder from the impact of a bullet.&nbsp; A split second later they heard the report of Big Tom&#8217;s rifle, which he kept by his back window.</p>



<p class="wp-block-paragraph">The cow slowly laid down in the field, lowing mournfully.</p>



<p class="wp-block-paragraph">* * *</p>



<p class="wp-block-paragraph">A light snow began to fall on the two men huddled behind the cow, who continued to proclaim its suffering.&nbsp; In a town where hunters regularly trudged across neighbor&#8217;s fields and fired indiscriminately, the gunshot had not attracted anyone&#8217;s attention.&nbsp; The brothers could no longer hear the giant&#8217;s yelling, which had become less and less coherent over the past twenty minutes.</p>



<p class="wp-block-paragraph">William, and then Frank, cautioned a look around the cow.&nbsp; In his state of confusion, the giant&#8217;s legs had failed him and, after firing the one bullet in the chamber, he had been unable to find another.&nbsp; Now the great mass of man lay in a clump by the back door with a trickle of frothy saliva on his lips and snowflakes melting slowly on his open eyes.</p>



<p class="wp-block-paragraph">***</p>



<p class="wp-block-paragraph">The police officially reported it as an accidental death by overdose, though everyone knew that Big Tom never sampled the drugs he sold and had even stopped drinking years ago.&nbsp; The sheriff, who had once worked for the boys&#8217; father, had not challenged their story of how the giant had shot at them while they were trying to recover the cow that had wandered onto his field.&nbsp; It was just plausible enough to pass muster: the whole town knew about the auction, and that the brothers had not yet had the time to put up a proper fence.</p>



<p class="wp-block-paragraph">Frank and William had more trouble with the veterinarian, who at first refused to treat the animal laying in the field.</p>



<p class="wp-block-paragraph">&#8220;She&#8217;s not worth saving.&nbsp; Haul her off to the butcher and make something of the meat,&#8221; he had said, &#8220;If you like, I will put her out of her misery.&#8221;</p>



<p class="wp-block-paragraph">To Frank&#8217;s surprise, William refused the offer.</p>



<p class="wp-block-paragraph">She had stopped lowing by this point and was only breathing heavily, the steam rising from her open mouth.&nbsp; Old as the veterinarian was, he had never tended to a gunshot wound on a domestic animal.&nbsp;</p>



<p class="wp-block-paragraph">The cost of extracting the bullet and suturing the wound on the suffering and uncooperative animal was even more than what William had paid for her at the auction, and the recovery would be long.&nbsp; But it wouldn&#8217;t be too much extra trouble for William since he had to stay in town anyway, at least a little while longer.&nbsp;</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>The Monkey Kinkade</title>
		<link>https://demianperry.com/the-monkey-kinkade/</link>
		
		<dc:creator><![CDATA[perrydc]]></dc:creator>
		<pubDate>Mon, 14 Mar 2022 21:28:11 +0000</pubDate>
				<category><![CDATA[Short Story]]></category>
		<category><![CDATA[writing]]></category>
		<guid isPermaLink="false">https://demianperry.com/?p=2348</guid>

					<description><![CDATA[Yuri felt she was making the animal nervous.  She also felt nervous herself and noticed a faint ringing in her ears.  She sat down in her chair and breathed slowly to control the ringing and to put the monkey at ease...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Yuri didn&#8217;t remember much of anything.&nbsp; She somehow knew that there was a world outside the room she now occupied, and yet all her memories seemed to emerge here.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">A strange substance covered her face.&nbsp; It seemed almost alive: a thick, moist and powdery white clay that had been expertly caked across her cheeks and smoothed into the wrinkles to make them disappear.&nbsp; She might have resembled a Geisha had there been any contrasting adornments around her eyes or mouth.</p>



<p class="wp-block-paragraph">She surmised that she had woken up in the bed a few steps away from her chair, but did she remember waking?&nbsp; She remembered putting on the robe that was draped over her chair. &nbsp; She certainly remembered being in bed, under the covers.&nbsp; And so it seemed logical to her that she had previously been asleep.&nbsp; Perhaps she was only unconscious of herself until that exact moment.</p>



<p class="wp-block-paragraph">Next to the makeup removal pad on the bedstand was a handwritten note that explained almost nothing: &#8220;You may use this to clean yourself if you are uncomfortable.&nbsp; Dial 0 when ready.&#8221;&nbsp; The note was written on a notepad with the address of the hotel typed on the bottom of each page: The Avowsongslides Inn, 5003 Underwood Ave, Omaha, NE.</p>



<p class="wp-block-paragraph">She sat back and allowed herself to focus on something other than the task of removing each smudge from her thick white mask.&nbsp; Yuri saw now that her face was youthful and strong, exactly what she had hoped for herself.&nbsp; But she had also hoped for some recognition, and she realized that she did not even know the face in the mirror.&nbsp; She was overcome by an emotion that was even more sorrowful than loneliness.</p>



<p class="wp-block-paragraph"><em>When we are alone</em>, she thought, <em>we at least have ourselves</em>.</p>



<p class="wp-block-paragraph">Yuri turned away from the mirror fearfully, overwhelmed by the stimulus of her new identity.&nbsp; She looked around her seeking something to attach to, but it was like every hotel room: a door to a bathroom, a door to the hall, a cooling unit vibrating loudly under a window with the shades drawn.</p>



<p class="wp-block-paragraph">There was one thing that was different about this room, though, and someone might spend a whole night there without noticing.&nbsp; Yuri had only become aware of it because her brain was so hungry for recognition and connection that it was ready to absorb even the slightest subtlety of her surroundings.&nbsp; And also because she was an incorrigible reader.</p>



<p class="wp-block-paragraph">Her first clue of the oddity of this place was the neatly typed label over the thermostat which read: &#8220;Temperature is constantly surveying the brain?&#8221;&nbsp; This was a question that she could not answer, and she was certain that it wouldn&#8217;t make sense to anyone else, either.</p>



<p class="wp-block-paragraph">Over the bed was a motivational poster of an athletic looking man in a tracksuit.&nbsp; Under his torso were the words: &#8220;Stand unalterably opposed to linear.&#8221;</p>



<p class="wp-block-paragraph">And then there was the<em> very strange </em>painting hanging on the wall opposite the window.&nbsp; She recognized the style at once for its photorealism and lurid pastels.&nbsp; This was a Thomas Kinkade, perhaps one of his later works.&nbsp; In the midst of a snow covered garden sat a pastoral cottage decorated for Christmas.&nbsp; A warm light from the fire inside cast long shadows on the dead flowers and frosted trees.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">And then there was something that didn&#8217;t belong in this idyllic vision.&nbsp; In the doorway stood a bald-headed monkey wearing the millstone collar or ruff that was once a mark of prestige in Elizabethan England.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">Also strange was that, in the place of a signature, the lower right corner of the painting bore the inscription: &#8220;March forth for the fighting pose of each computer.&#8221;</p>



<p class="wp-block-paragraph">Panicking, she looked around the room for some clue that would make sense to her, but there was nothing else.&nbsp; Her eyes fell on the bed stand.&nbsp; She opened the drawer, half expecting to find a Gideon Bible.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">Instead she found the book <em>Darwinian Software Ecology</em>.&nbsp; Had she seen that title somewhere before?&nbsp; She opened to the first page, which contained two sentences: &#8220;Journalism will emerge victorious!&nbsp; Scan forward to finally find something.&#8221;&nbsp; Hope filled Yuri&#8217;s soul.&nbsp; She turned the page.&nbsp; But it was only more gibberish:&nbsp;</p>



<p class="wp-block-paragraph">The first time I saw Brenda she asked me to hold her glasses &#8230; Dear Gabe, The drugs help me bend my fingers around a pen &#8230; Not to be rich, not to be famous, not to be mighty, not even to be happy, but to be civilized &#8212; that was the dream of his life &#8230; She was so deeply embedded in my consciousness that for the first year of school I seem to have believed that each of my teachers was my mother in disguise &#8230;</p>



<p class="wp-block-paragraph">Just as a spark of recognition flashed across her brain, Yuri heard a soft knock at the door.&nbsp; She opened it almost without hesitation.&nbsp; She again had a moment of joy when she thought she recognized the man standing before her.&nbsp; But again she was disappointed as she realized that he was only a slightly older and decidedly unathletic version of the man in the motivational poster.&nbsp;</p>



<p class="wp-block-paragraph">He was also much smaller than the man in the picture, rising scarcely five feet from the floor.&nbsp; He was misshapen: a man&#8217;s pudgy head rising, as if on stilts, on the body of a hungry child.</p>



<p class="wp-block-paragraph">&#8220;You&#8217;re awake!&#8221; he said, flashing his teeth through a shabby mustache.</p>



<p class="wp-block-paragraph">&#8220;Who are you?&#8221; she asked, quietly.</p>



<p class="wp-block-paragraph">&#8220;May I come in?&nbsp; You should probably be sitting down when I explain all this to you.&#8221;&nbsp;&nbsp;</p>



<p class="wp-block-paragraph"><em>Oh God</em>, she thought, <em>this nasally voice is going to explain something to me.&nbsp; </em>She looked down at him, blocking his entrance to her room, but then relaxed as she realized, <em>I can take this guy.</em></p>



<p class="wp-block-paragraph">She also wanted to believe that he was not a threat and that she was safe.</p>



<p class="wp-block-paragraph">Perhaps he was a Good Samaritan who had found her by the side of the road, her memory erased.&nbsp; Maybe he had brought her to the hospital for treatment and then he was the only one who showed up when they released her.</p>



<p class="wp-block-paragraph">If this fantasy were true then the mustachioed man might not be a goblin at all, but instead, a devoted fellow who had been crushed into bad posture and a strange existence by the weight of a misunderstanding society.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">She let him walk past her into the room.&nbsp; He smiled as he eyed the open drawer beside the bed.</p>



<p class="wp-block-paragraph">&#8220;That book in the bed stand,&#8221; she said, &#8220;aren&#8217;t those the first lines of novels, all jumbled together?&#8221;</p>



<p class="wp-block-paragraph">The strange little man&#8217;s smile vanished.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">&#8220;What makes you say that?&#8221; he asked.</p>



<p class="wp-block-paragraph">&#8220;I remember it now.&nbsp; They&#8217;re all Phillip Roth novels, aren&#8217;t they?&#8221;&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">He stared at her quizzically, but said nothing.</p>



<p class="wp-block-paragraph">&#8220;Yes,&#8221; she said, as something came back to her at once.&nbsp; A past life, a life that surely must have belonged to her, a life in which she was someone dedicated to thought and ideas — a high-school literature teacher, perhaps — and these lines were part of a lecture she had once memorized.&nbsp; She recalled the entire speech as she gave it to him now, without even thinking about it, because her mind was not capable of focus at this moment.</p>



<p class="wp-block-paragraph">&#8220;When he was in his mid-twenties, Roth went to his favorite neighborhood cafeteria.&nbsp; After taking his cut of beef from the Sicilian server who also offered him juice &#8230;&#8221;&nbsp; Now Yuri trailed off for a moment, distracted by her sudden recognition of the world that existed outside the room.&nbsp; &#8220;&#8216;Juice or gravy?&#8217; the man asked over and over again, almost as an incantation.&nbsp; After he took one or the other, Roth sat down at a table that was unoccupied but on which the last diner had left a scrap of paper.&nbsp; On that paper was typed a long, nonsensical paragraph.&nbsp; As he ate his roast beef, he puzzled over it.&nbsp; Not one of the sentences bore any connection with any other sentence.&nbsp; And so he folded it and put it in the pocket of his ruffled corduroy sport coat.&nbsp; When he found it again, weeks later, he realized that each of these sentences was the first sentence of a novel that he had yet to write.&#8221;</p>



<p class="wp-block-paragraph">As Yuri finished her story, the small man stood up and began pacing in front of her.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">&#8220;This is very unexpected,&#8221; he said, talking more to himself than her.&nbsp; &#8220;You say these are opening sentences to other stories?&nbsp; That may be easily verified.&#8221;&nbsp; He now turned to address the Kinkade atrocity on the wall.&nbsp; &#8220;Chit,&#8221; he said, addressing the monkey in the painting, &#8220;come help daddy think.&#8221;&nbsp; Then his voice rose an octave and a half as he called again: &#8220;Come down, my little one.&#8221;</p>



<p class="wp-block-paragraph">Yuri watched in unblinking horror as the monkey in the Kinkade painting came to life and, as it turned its head slowly to stare at the little man, the whole painting around it made a long, sucking, wet noise, like a boot being pulled out of mud.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">The monkey bared his teeth under the strain of freeing itself of his garish surroundings until Kinkade&#8217;s nostalgic vision of pastoral perfection finally released him into the room, allowing him to leap not only out of the world he inhabited but clean out of his Elizabethan clothes and onto the little man&#8217;s shoulder.</p>



<p class="wp-block-paragraph">Yuri stared fearfully, and the crouching wet animal lowered its head and returned her glance with red, wild eyes.&nbsp; There was something monstrously unclean about the animal, its skin hanging lifelessly from its bones and its fur covered with a sloshing mask made of layers upon obscuring layers of what looked like clay.</p>



<p class="wp-block-paragraph">Yuri felt she was making the animal nervous.&nbsp; She also felt nervous herself and noticed a faint ringing in her ears.&nbsp; She sat down in her chair and breathed slowly to control the ringing and to put the monkey at ease.</p>



<p class="wp-block-paragraph">This also seemed to relax the little man, who lowered his voice and looked lovingly at the monkey as he spoke to Yuri.&nbsp; &#8220;I made my fortune in machine learning software.&nbsp; When I was 16, I built the first multi-armed bandit optimizer, which is essentially a logic mechanism that randomly adjusts the weight it places on various inputs until it has perfected itself to some desired outcome.&nbsp; As the name suggests, it is like a slot machine with many arms.&nbsp; And it keeps spinning until it hits three cherries, as it were.&#8221;</p>



<p class="wp-block-paragraph">He looked up at her now, expecting some sign of recognition from Yuri.&nbsp; Most people couldn&#8217;t understand him, but he hoped his analogies might help her.&nbsp; She gave no indication that she cared to understand.&nbsp; He continued: &#8220;The Phillip Roth quotations in that book must have somehow been fed into this room by my very naughty mechanical governess.&#8221;&nbsp; He tisked at the monkey.&nbsp; &#8220;Otherwise, all the sentences in this room were generated by my first program, which I called Avowsongslides after the musical, sliding poetry that it produced.&nbsp; With that program I was able to build an empire of self-spawning ad-supported websites that now constitute more than half the internet.&nbsp; Type <em>Avowsongslides</em> into your favorite search engine and you will see just how big it has become.&nbsp; Each day it becomes bigger.&nbsp; Someday it will crowd out all other conversation and we will each be surrounded by a poetic music that is beyond our mortal understanding&#8230;inscrutable even to its creator.&#8221;</p>



<p class="wp-block-paragraph">The monkey turned his head to keep an eye on Yuri as the shoulder on which he perched moved slowly around the room.&nbsp; The ringing in Yuri&#8217;s ears grew so loud that she had to think hard to understand the little man.</p>



<p class="wp-block-paragraph">&#8220;The great limitation I grasped was that my program, like all machine learning software, is trapped inside the virtual world of our computers.&nbsp; I saw at once that the so-called <em>singularity</em> would never happen so long as neural networks had no physical manifestation.&#8221;</p>



<p class="wp-block-paragraph">&#8220;We needed some physical manifestation — not a robot with a server for a brain, because even that would be limited by the mechanics of its own hardware — but a sentient substance that is both random and purpose-driven.&#8221;</p>



<p class="wp-block-paragraph">He reached up and dipped his finger into the painting and scooped out a bright pink lump of slime.&nbsp; He brought his hand slowly to the monkey and allowed it to lick his finger clean.</p>



<p class="wp-block-paragraph">&#8220;My great innovation was to apply the principles of the neural network to a cheap and self-organizing gel.&nbsp; Like my previous experiments in semantics, I had to feed it with some raw material: in this case not words, but organic matter.&#8221;</p>



<p class="wp-block-paragraph">Yuri looked down at her hands and, for the first time, realized that they, too, were covered with thick, white makeup.&nbsp; Looking quickly past the hem of her robe she saw that her feet and even her legs were dripping with the strange substance, which she began to rub off furiously.</p>



<p class="wp-block-paragraph">Yuri&#8217;s voice was now scarcely audible, almost a whisper.&nbsp; &#8220;Where did you find me?&#8221;</p>



<p class="wp-block-paragraph">&#8220;You are almost entirely of my own making,&#8221; the little man said, &#8220;my proudest achievement.&nbsp; By feeding you with words and ideas I have created someone who has some vague recollection of a history but without the experience that defines identity.&nbsp; You are both a sentient creature and a tabula rasa.&nbsp; Proof that the universe does not need a God.&#8221;</p>



<p class="wp-block-paragraph">Yuri pulled her robe tightly around her body as the ringing in her ear reached a crescendo.&nbsp; In one leap she dashed past the man and his monkey and through the open door.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">The little man tried to stop her and then hobbled after her down the hall.&nbsp; &#8220;Come back,&#8221; he cried out, &#8220;Come back!&#8221;&nbsp; He followed her down the hall but could not move nearly as quickly.&nbsp; He shouted after her in a pleading voice, &#8220;Come back, my quail of the woods!&#8221;&nbsp; Before he was even halfway down the hall, he heard her slam into the panic bar of the firedoor.&nbsp; The monkey leapt off his shoulder at the sound and scurried back to his room.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">Finally the little man reached the exit of the abandoned hotel.&nbsp; He looked across the empty parking lot with great sadness as Yuri&#8217;s disheveled shape was absorbed by the darkness of the city around.</p>



<p class="wp-block-paragraph">Blobs of white makeup shook loose from her body as her slippered feet pounded away from the ever dimming light of The Avowsongslides Inn.&nbsp; Perhaps she would find someone out there who could help her remember something about the world before this day.Until then, she would embrace order as it came to her, wandering and always searching for her forgotten past.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Building for writers</title>
		<link>https://demianperry.com/who-cares-about-your-pretty-site/</link>
		
		<dc:creator><![CDATA[perrydc]]></dc:creator>
		<pubDate>Wed, 02 Feb 2022 16:35:11 +0000</pubDate>
				<category><![CDATA[Design]]></category>
		<guid isPermaLink="false">https://demianperry.com/?p=2275</guid>

					<description><![CDATA[Who cares more about the look of your site than your visitors?  The people in your organization.  Maybe you should design with them in mind.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><strong>A designer, a developer, and a product manager walk into a bar </strong>to celebrate a launch at their startup.  They sit silently for several moments.  Finally, the product manager says: &#8220;Now that we&#8217;ve launched our big idea, what should we do next?&#8221;  </p>



<p class="wp-block-paragraph">The designer thinks for a second and says: &#8220;We should do a complete redesign using <a href="https://github.com/storybookjs/storybook" target="_blank" rel="noopener">Storybook</a>, so we can organize all our UI components and update them in one place.&#8221;  </p>



<p class="wp-block-paragraph">The developer shakes his head.  &#8220;No.  We need to totally refactor our codebase from the ground up, entirely on <a href="https://www.rust-lang.org/" target="_blank" rel="noopener">Rust</a>.&#8221;  He starts chopping the air with his hands: &#8220;I know you guys think I&#8217;m crazy, but Rust solves memory errors and concurrent programming problems better than any other language.&#8221;</p>



<p class="wp-block-paragraph">The product manager looks down at his beer, which is already getting warm, and says: &#8220;I think we should get everyone a thermos.&#8221;</p>



<p class="wp-block-paragraph">The designer asks: &#8220;What&#8217;s so special about a thermos?&#8221;</p>



<p class="wp-block-paragraph">The product manager says: &#8220;Think about it: a thermos keeps hot things hot and cold things cold.&#8221;  He stares back at them, wide-eyed.  Then he asks, &#8220;How do it know?&#8221;</p>



<h2 class="wp-block-heading" id="your-site-should-be-like-a-thermos">Your site should be like a thermos</h2>



<p class="wp-block-paragraph">When you hand someone a thermos, they take a drink.  They don&#8217;t think about how pretty it is, or even how it works.  More important: the guy filling the thermos doesn&#8217;t spend a lot of time troubleshooting the damn thing.  He just pours cold or warm liquid into it and gets the same result every time.</p>



<p class="wp-block-paragraph">If you&#8217;re reading this, you&#8217;re probably a techie, so let&#8217;s be honest: when we techies start to talk about the &#8220;right way&#8221; to build something, the next thing out of our mouths is probably some obfuscation of technology.  I&#8217;ll be the first to admit it: I&#8217;ve argued the value of MVC frameworks (where you keep your styling completely separate from your data) and, in the same breath, found myself misty-eyed at the elegance of React&#8217;s component model (where data and style are combined in a single module).  These lectures have not marked me as a genius among my colleagues.</p>



<p class="wp-block-paragraph">The <em>true</em> <em>right way</em> to design something is to create something that your successor can understand in seconds.  If you did it right, even a non-technical person should be able to see roughly what&#8217;s going on and understand how the code &#8220;fits&#8221; together.</p>



<h2 class="wp-block-heading" id="design-your-front-end-for-the-whole-organization">Design your front end for the whole organization.</h2>



<p class="wp-block-paragraph">So let&#8217;s start by designing the piece of your codebase that is going to get the most wear-and-tear.  These days, most editors know enough CSS to be dangerous, so they&#8217;re going to ask you to tinker with it <em>all the time</em>.  The problem is that it&#8217;s all tightly interrelated and, if you&#8217;re not careful, you&#8217;ll end up with a squirrelly mess of really !important styles.</p>



<p class="wp-block-paragraph">In the past, I&#8217;ve put all my CSS in the style.css file in the theme and left my custom css window fairly empty so I can use it to focus on just the code I&#8217;m working on at the moment.  This approach has its benefits: it&#8217;s clean and allows you to keep your styles in version control.</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://media.demianperry.com/img/20220202_customCSS.jpg" alt=""/><figcaption>Keeping all your custom CSS in the theme customizer will drastically simplify design tweaks.</figcaption></figure>



<p class="wp-block-paragraph">More recently, though, I&#8217;ve started just dumping it all in the customizer and being brutal about pruning conflicting CSS.  This gives me more control over the code in the moment and minimizes switching between versions, which can be a pain in the butt if you have a caching layer.  <strong>Added bonus of this approach: </strong>you can edit the site on the fly right in front of the client, which usually impresses the hell out of people.</p>



<h2 class="wp-block-heading" id="have-a-system-for-custom-code">Have a system for custom code.</h2>



<p class="wp-block-paragraph">All websites need some small degree of customization, and you can usually guess what you&#8217;re going to have to build by taking a quick inventory of the <em>unusual assets </em>of the organization.  One of my clients, a podcasting company, had audio and transcripts that it wanted to display on its site.  That meant that I needed to build back-end code to capture audio links with every story, play them through an audio player (and allow others to embed them on their websites), subscribe to the podcast feed, and read transcripts.  Taken all together, this is a large chunk of code that could very quickly become unweildy.</p>



<p class="wp-block-paragraph">Enter my new favorite plugin, <a href="https://wordpress.org/plugins/code-snippets/" target="_blank" rel="noopener">Code Snippets</a>.  With code snippets, I&#8217;m able to drop code I would normally put in my functions.php file (or my own custom plugin) into an organized, documented space, like so:</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://media.demianperry.com/img/20220202_hbSnippets.jpg" alt=""/><figcaption>Keeping all your custom code partitioned and documented in Snippets will help future developers understand your entire codebase in seconds.</figcaption></figure>



<p class="wp-block-paragraph">If you follow a React-like component philosophy and maintain strict independence between each snippet, this plugin will allow you to turn each component on or off, and even specify whether it runs on the front-end, back-end, or both.  </p>



<p class="wp-block-paragraph">A huge benefit of Code Snippets is that it makes it much easier to share components across multiple sites, <em>so long as you don&#8217;t use theme-specific action hooks</em>.  If you&#8217;re not sure what these are, check out <a href="https://developers.wpastra.com/theme-visual-hooks/" target="_blank" rel="noopener">Astra&#8217;s list of action hooks</a>.  As appealing as these are, though, I&#8217;ve found that there are mostly cross-theme methods for getting into every nook and cranny of the layout (such as the <a href="https://developer.wordpress.org/reference/hooks/the_content/" target="_blank" rel="noopener">content filter hook</a>).</p>



<p class="wp-block-paragraph">There are drawbacks to Code Snippets.  My biggest beef is debugging.  If you code directly in Code Snippets, a bug in your code simply shuts down the service and reverts your code to the last save.  So you&#8217;re definitely better-off doing the initial coding in your local environment in fuctions.php and then transferring the finished modules into code snippets once you&#8217;ve got them working.  Another big drawback is the lack of version control.  My work-around is to check all the boxes and select the Bulk Action to export the code.  I then save that file in my theme folder on git.</p>



<h2 class="wp-block-heading" id="create-editorially-accessible-microservice-integrations">Create editorially accessible microservice integrations.</h2>



<p class="wp-block-paragraph">Of course, not all code is small enough to be a snippet, and there are some very real needs for interdependent code out there.  In these cases, I recommend coding these in a real codebase (php is not a real codebase) and importing them through shortcodes so that editors and designers can adjust the layout without risking the underlying code.</p>



<p class="wp-block-paragraph">I go into much deeper detail in my <a href="https://demianperry.com/wordpress-embeds/" data-type="post" data-id="1603">article on microservices</a>, but the image below will give you the gist of how these integrations appear in the CMS:</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://media.demianperry.com/img/20220202_tcHomepage.jpg" alt=""/><figcaption>Shortcodes allow editors and designers to understand your custom code and manipulate the layout, without messing with the underlying structure.</figcaption></figure>



<p class="wp-block-paragraph">The left side of the above image shows what the rendered site looks like to the end-user.  On the right is what the editor sees, with titles, custom spacers and short codes all easily manipulated and rearranged.  </p>



<p class="wp-block-paragraph">By building flexible parameters into my shortcodes, I&#8217;ve even made it possible for a non-technical person to alter the content from the microservice.  In the above case, from my site<a href="http://towncalendar.org" target="_blank" rel="noopener"> towncalendar.org</a>, an editor could simply change &#8220;washington-dc&#8221; to &#8220;boston-ma&#8221; to showcase events from other cities on the page.</p>



<h2 class="wp-block-heading" id="conclusion">Conclusion</h2>



<p class="wp-block-paragraph">Although this approach eschews many of the benefits of managing all code in version-control, it also creates a far more accessible code-base that simplifies participation from other developers.  If I were no longer able to help one of my clients, another developer would be able to fix issues on the site almost instantly, without even needing to create a local build environment.  So long as you are disciplined about periodically exporting and saving the code elsewhere (and I am), you can create a site that is just as secure and performant as the larger site, but with the simplicity that you expect from a thermos.</p>



<p class="wp-block-paragraph">If, like me, you believe that your most important user is not the fly-by end-user, but the people in your organization that have to live with your shitty code every day, this could be a truly revolutionary approach to your site design philosophy.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>An Encroachment in the Everglades</title>
		<link>https://demianperry.com/an-encroachment-in-the-everglades/</link>
		
		<dc:creator><![CDATA[perrydc]]></dc:creator>
		<pubDate>Mon, 31 Jan 2022 14:18:00 +0000</pubDate>
				<category><![CDATA[Short Story]]></category>
		<category><![CDATA[writing]]></category>
		<guid isPermaLink="false">https://demianperry.com/?p=2269</guid>

					<description><![CDATA[...and now, late at night, back in the safety of her bed, she lays her arm across the flannel pajamas around Robert's chest and draws closer to him as she tries to find her own words.  A story he will believe.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">She realizes, based on the warmth in the bed, that Robert has been laying next to her for a while.</p>



<p class="wp-block-paragraph">&#8220;What are you studying?&#8221; she asks, looking over at him.</p>



<p class="wp-block-paragraph">&#8220;The Economist Magazine,&#8221; he says.</p>



<p class="wp-block-paragraph">It is clearly not The Economist Magazine.&nbsp; There are pictures of plastic toys and children with monstrous smiles.&nbsp; The children are all wild with glee, ready to pounce, it seems, on a defeated enemy.</p>



<p class="wp-block-paragraph">&#8220;Do you think it&#8217;s uh&#8230;&#8221;&nbsp; He stops, pausing for the right words, &#8220;sales &#8230; thing for children?&#8221;</p>



<p class="wp-block-paragraph">&#8220;Yes,&#8221; she says.</p>



<p class="wp-block-paragraph">&#8220;Then why did you ask me what it was?</p>



<p class="wp-block-paragraph">&#8220;I thought,&#8221; she says, &#8220;maybe you would come up with a better term for it than &#8216;sales thing for children.'&#8221;</p>



<p class="wp-block-paragraph">&#8220;Tough,&#8221; he says, and then, too annoyed to construct a complete sentence, &#8220;Toy catalog.&#8221;</p>



<p class="wp-block-paragraph">She wants to tell him what she saw this morning when she looked up, startled, from the bird feeder that she was filling with seed but she is afraid of what he will say.</p>



<p class="wp-block-paragraph">What she saw was not a man, exactly, because how can a man walk on his knuckles?</p>



<p class="wp-block-paragraph">It was man-like, though.&nbsp; Even through all the grime and hair, its skin was unnaturally white.&nbsp; It studied the shape of her torso with intense curiosity.</p>



<p class="wp-block-paragraph">It did not flee immediately when she looked fixedly into its eyes.&nbsp; It was emboldened, perhaps, by the narrow canal that separated the mangroves from the short grass carpet she stood upon.</p>



<p class="wp-block-paragraph">Instead, it paused for a moment to arrange a memory of her on the dark pink wrinkles of its brain.&nbsp; An impression that it might recall later, when circumstances were more favorable.</p>



<p class="wp-block-paragraph">Then it turned away from her, walking upright for only a moment.&nbsp; Not a man, exactly, because how can a man live in that deathly jungle?&nbsp; But maybe like an actor in an ape suit leaving the spotlight of the stage.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">Then it escaped through a little arch of mangroves that made a door into the wilderness.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">And now, late at night, back in the safety of her bed, she lays her arm across the flannel pajamas around Robert&#8217;s chest and draws closer to him as she tries to find her own words.&nbsp; A story he will believe.</p>



<p class="wp-block-paragraph">That afternoon she had rifled through the recycle bin and pulled out the Metro section from the past four issues of the Miami Herald.&nbsp; She had arranged them neatly, side by side, on the dining room table.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">As she sipped her coffee, she ran her fingers over each page and shaped the words of each headline with her delicate lips.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">There was no mention of an escaped albino primate.</p>



<p class="wp-block-paragraph">At one point she looked up, startled again by the sense that it had returned and was now watching her.</p>



<p class="wp-block-paragraph">But the stage was empty and the mangroves were still.</p>



<p class="wp-block-paragraph">&#8220;Do you think,&#8221; she says now to her husband, &#8220;that there are still people living in the Everglades?&#8221;</p>



<p class="wp-block-paragraph">&#8220;Like the Seminoles?&#8221; he asks, &#8220;Or the alligator people?&#8221;</p>



<p class="wp-block-paragraph">&#8220;No,&#8221; she says, &#8220;like just really poor people.&nbsp; Homeless people.&#8221;</p>



<p class="wp-block-paragraph">He snorts.&nbsp; &#8220;Even the homeless live pretty well around here.&#8221;</p>



<p class="wp-block-paragraph">&#8220;Yeah,&#8221; she says, turning onto her side to face her bed stand.</p>



<p class="wp-block-paragraph">She closes her eyes and the face comes back to her, glowering like something almost human.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Define your visual brand</title>
		<link>https://demianperry.com/how-should-i-compress-manage-images-in-wordpress/</link>
		
		<dc:creator><![CDATA[perrydc]]></dc:creator>
		<pubDate>Tue, 21 Dec 2021 01:46:46 +0000</pubDate>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">https://demianperry.com/?p=1992</guid>

					<description><![CDATA[In this design + code tutorial, I'll cover the basics of font pairing, consistent aspect ratios, automated image filters, and the reason every website needs an external media server.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Building a brand for a website can be a time-intensive project, but one that can yield strong audience growth opportunities, especially when paired with a social promotion strategy. </p>



<p class="wp-block-paragraph">I was recently part of a team that purchased digital science and medical publications.  One of my jobs was to fold their technology into our core stack and apply a consistent &#8220;look&#8221; across the sites.  Our technology team used tools like <a href="https://storybook.js.org/" target="_blank" rel="noopener">storybook</a> to manage our growing library of cross-site javascript and css components, and our editorial team set standards on the use of illustrations and stock imagery.</p>



<p class="wp-block-paragraph">But a brand&#8217;s visual brand is a strange mix of technology strategy and editorial proposition.  Since the editorial team is ultimately responsible for maintaining a consistent look across the assets they add each day, it&#8217;s important that developers build technology that not only gets the assets onto the site, but also streamlines the process of working with those assets.  Here, then, are some strategies that have worked for me in the past:</p>



<h2 class="wp-block-heading" id="font-pairing">Font Pairing</h2>



<p class="wp-block-paragraph">Finding the right font for your site can take hours if you care about that sort of thing (and some of my clients don&#8217;t).  The key here is not to go overboard.  Pick a simple font that is easy on the eyes for the body text of your site, and then find a font that pairs well with it for your headings.  </p>



<p class="wp-block-paragraph">To find the right font:</p>



<ol class="wp-block-list"><li>In Chrome, explore other sites to find a good font.</li><li>Control click on the font and select <strong>Inspect</strong>.  </li><li>Scroll down to find the name of the font</li><li>Search for &#8216;google font&#8217; and the name of that font to find a performant version</li><li>Search for &#8216;font pairings&#8217; and the name of the google font</li><li>Now use your font in the header and the paired font in the body</li></ol>



<p class="wp-block-paragraph">As you can see, there&#8217;s a <a href="https://reliablepsd.com/ultimate-google-font-pairings/" target="_blank" rel="noopener">whole field of study in design</a> on finding the right pairs. My preference is to go a little crazy with the headline font: think BOLD, in all senses of that word.</p>



<h2 class="wp-block-heading" id="find-a-color-scheme-that-works">Find a color scheme that works</h2>



<figure class="wp-block-image alignwide size-large"><a href="https://coolors.co/" target="_blank" rel="noopener"><img fetchpriority="high" decoding="async" width="1024" height="577" src="https://media.demianperry.com/uploads/2022/01/coolers-1024x577.jpg" alt="" class="wp-image-2211" srcset="https://media.demianperry.com/uploads/2022/01/coolers-1024x577.jpg 1024w, https://media.demianperry.com/uploads/2022/01/coolers-300x169.jpg 300w, https://media.demianperry.com/uploads/2022/01/coolers-768x433.jpg 768w, https://media.demianperry.com/uploads/2022/01/coolers.jpg 1280w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><figcaption><a href="https://coolors.co/" target="_blank" rel="noopener">Coolers</a> is a fantastic tool for matching swaths to get the perfect hexcode set for your website and visual brand.</figcaption></figure>



<p class="wp-block-paragraph">As a color-challenged gear-head, I&#8217;ve usually deferred to other people on color choices.  Fortunately, there&#8217;s a tool called <a href="https://coolors.co/" target="_blank" rel="noopener">coolors</a> that helps designers find what colors go best together.  There&#8217;s a great tutorial on their site, but basically you start by locking in a single color and then hit the space bar and a program finds several swatches that match well with that color.</p>



<h2 class="wp-block-heading" id="spacing-and-alignment">Spacing and Alignment</h2>



<p class="wp-block-paragraph">This was always a hard one for me.  In my old NPR days, I would present prototypes that always looked a little off, but I never quite knew why.  The reason, in most cases, was that I didn&#8217;t allow enough space and layout was misaligned.  Fortunately there are great tools to simplify spacing and alignment.  </p>



<p class="wp-block-paragraph">For alignment, the key is to do as little tinkering with an original theme as possible and, if you do tinker with it, be sure to look at the desktop, tablet and mobile view of every change to either padding or margin so that you know you&#8217;re not introducing misalignment (wordpress has a great toggle tool for this at the lower right corner of the customizer).</p>



<p class="wp-block-paragraph">For spacing, just remember that more spacing, like alignment, needs to be balanced.  That means, for example, that the space under your header should roughly match the spacing on the side margins.  The block editor has an excellent tool called<strong> spacer blocks</strong> which makes it easy to tinker with spacing on a page before you lock it in with your css.</p>



<h2 class="wp-block-heading" id="set-consistent-aspect-ratios-to-all-your-images">Set consistent aspect ratios to all your images</h2>



<p class="wp-block-paragraph">Step one is to apply a consistent aspect ratio and image compression.  There are a number of ways to do this, but I prefer creating a <em>folder action</em>.  For a simple folder action, follow these steps:</p>



<ol class="wp-block-list"><li>Create a folder in a somewhat permanent location (i.e., somewhere you can access easily, but don&#8217;t mind it not moving).&nbsp; Give it a name like ImageCrop</li><li>From Launchpad, open&nbsp;<strong>Automator</strong></li><li>Select File &gt;&nbsp;<strong>New</strong>Select&nbsp;<strong>Folder Action</strong></li><li>Select the folder you just created (ImageCrop) in the&nbsp;<strong>dropdown</strong>&nbsp;next to &#8216;Folder action receives files and folders added to:&#8217;</li><li>On the left side menu of actions, scroll down and double-click&nbsp;<strong>Scale Images</strong>, decide whether you want to keep originals, and select a standard width, like 1280</li><li>On the left side menu of actions, scroll down and double-click&nbsp;<strong>Crop Images</strong>&nbsp;and select a standard aspect ratio, like 1280 x 720</li><li>Now select File &gt; Save and call the script something like&nbsp;<strong>Standard Crop</strong></li><li>Close automator</li><li>Now test it out by finding an image that is at least 1280 wide and then drag that image over to your folder.&nbsp; It should crop down to 1280 x 720</li></ol>



<p class="wp-block-paragraph">The above steps will familiarize you with the value of folder actions, but it is fairly limited (it can&#8217;t, for instance, handle complex compression algorithms or apply fancy image filters and effects).  For that, you&#8217;ll need to create an entirely new folder action.  This time, double click Run Shell Script and paste in the location of a python file that we&#8217;re about to build, along with a few variables.</p>



<pre class="wp-block-code"><code>for f in "$@"
do
	~/opt/anaconda3/bin/python ~/_notebooks/scripts/scaler.py $f 1024 1.61803398875
done</code></pre>



<p class="wp-block-paragraph">The above call will tell a script to take every image you drag into the folder, define a maximum width of 1024 and apply an aspect ratio of 1.618 (the golden mean).  If you wanted to adjust to a 16:9 aspect ratio, you would change it to 1.7777&#8230;  </p>



<p class="wp-block-paragraph">The end result of this process is to create perfectly cropped images that take up 1/10th of the bandwidth of the original image.  If you wanted to compress it even more, you could use a line just before the <strong>done</strong> line that taps into ImageOptim&#8217;s command-line compression, but I&#8217;ve found it offers little advantage since there&#8217;s some compression already in the scaler script, and this line adds time to the process:</p>



<pre class="wp-block-code"><code>/Applications/ImageOptim.app/Contents/MacOS/ImageOptim "$f"</code></pre>



<p class="wp-block-paragraph">Here&#8217;s the complete code of scaler.py:</p>



<pre class="wp-block-code"><code>from PIL import Image
import sys, os

filename = sys.argv&#91;1]
maxWidth = int(sys.argv&#91;2])
aspect = float(sys.argv&#91;3])

im = Image.open(filename)
im = im.convert('RGB')

width = im.size&#91;0]
height = im.size&#91;1]
if width&lt;height*aspect: # most images
    left = 0
    right = width
    ratio = width / aspect
    if height&gt;width: # portrait images focus 1/3 way down
        top = height / 3 - ratio / 2
        bottom = height / 3 + ratio / 2
    else: # landscape images focus 1/2 way down
        top = height / 2 - ratio / 2
        bottom = height / 2 + ratio / 2
else: # ultrawide images
    top = 0
    bottom = height
    ratio = height * aspect
    left = width / 2 - ratio / 2
    right = width / 2 + ratio / 2
cropped = im.crop((left, top, right, bottom))
if width&gt;maxWidth: 
    width = cropped.size&#91;0]
    height = cropped.size&#91;1]
    ratio = maxWidth/width; 
    scaled = cropped.resize((int(round(width*ratio)), int(round(height*ratio))), Image.BOX)
else:
    scaled = cropped
base = os.path.splitext(filename)&#91;0]
filename = base + '.jpg'
scaled.save(filename, "JPEG", optimize=True, quality=85) #overwrites original

# or use the below, once webp cards are supported by Twitter
#filename = base + '.webp'
#scaled.save(filename, "WebP", quality=70) #this overwrites the original file.</code></pre>



<p class="wp-block-paragraph">Note that one other thing the above code does is makes a decision of where to center the image.  For landscapes, this is easy: center on the center.  Portraits are a little more complex, but focusing about a third of the way down is usually a good assumption for cropping a landscape out of a portrait.</p>



<p class="wp-block-paragraph">Unfortunately, webp doesn&#8217;t play nice with social media shares, at least on WordPress (which you can easily verify with the <a href="https://cards-dev.twitter.com/validator" target="_blank" rel="noopener">Twitter card validator</a>). For this reason, I have commented out the webp encoding at the bottom of the file, but this code offers massive compression and is an increasing standard among sites like NPR.</p>



<h2 class="wp-block-heading" id="go-further-with-image-processing">Go further with image processing</h2>



<p class="wp-block-paragraph">Finding images for your site can be expensive and time-intensive.  At both The <em>Washington Post</em> and <em>NPR</em>, we employed a team of photographers to cover major news events, but even at those organizations, we often needed to lean heavily on stock photography companies like Getty.  Although Getty is too expensive for most small websites, there are plenty of free stock photo services out there (like Pixabay).</p>



<p class="wp-block-paragraph">The problem with stock photos is that they look, well, like stock photos, and that can cheapen your site.  One way to add a little originality to your stock photos is to use automated filters that &#8216;work&#8217; for your brand.</p>



<p class="wp-block-paragraph">The&nbsp;WSJ is probably the most famous example of a media company applying a brand filter to their images (though their&nbsp;<a href="https://images.wsj.net/im-137070?width=860&amp;size=1.5&amp;pixel_ratio=1.5" target="_blank" rel="noreferrer noopener">hedcuts</a>&nbsp;are all done by artists and it&#8217;s&nbsp;<a href="https://newbedev.com/how-to-create-hedcut-style-images" target="_blank" rel="noreferrer noopener">hard to automate</a>&nbsp;believably).&nbsp; I talked to the Growth Team at NYT a while back and they confirmed my suspicion that they were applying automated filters to their social promotions whenever they didn&#8217;t have an image.&nbsp;</p>



<p class="wp-block-paragraph">First, let&#8217;s start with a simple image:</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="577" src="https://media.demianperry.com/uploads/2022/01/bricks-1024x577.jpg" alt="" class="wp-image-2154" srcset="https://media.demianperry.com/uploads/2022/01/bricks-1024x577.jpg 1024w, https://media.demianperry.com/uploads/2022/01/bricks-300x169.jpg 300w, https://media.demianperry.com/uploads/2022/01/bricks-768x433.jpg 768w, https://media.demianperry.com/uploads/2022/01/bricks.jpg 1280w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">You can incorporate image filters into the script above in a number of ways.  You can also get a fairly simple artistic effect with the <strong>Edge Enhance</strong> filter, like so:</p>



<pre class="wp-block-code"><code>#Import required image modules
from PIL import Image, ImageFilter
import os, sys

# Call like: ~/opt/anaconda3/bin/python ~/_notebooks/scripts/ImageEdgeEnhance.py $f 
filename = sys.argv&#91;1]

#Import all the enhancement filter from pillow
from PIL.ImageFilter import (
   BLUR, CONTOUR, DETAIL, EDGE_ENHANCE, EDGE_ENHANCE_MORE,
   EMBOSS, FIND_EDGES, SMOOTH, SMOOTH_MORE, SHARPEN
)
#Create image object
img = Image.open(filename)
#Applying the blur filter
img1 = img.filter(EDGE_ENHANCE)

base = os.path.splitext(filename)&#91;0]
filename = base + 'Edge.jpg'

img1.save(filename, "JPEG",optimize=True,quality=85)</code></pre>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="577" src="https://media.demianperry.com/uploads/2022/01/bricksEdge-1024x577.jpg" alt="" class="wp-image-2155" srcset="https://media.demianperry.com/uploads/2022/01/bricksEdge-1024x577.jpg 1024w, https://media.demianperry.com/uploads/2022/01/bricksEdge-300x169.jpg 300w, https://media.demianperry.com/uploads/2022/01/bricksEdge-768x433.jpg 768w, https://media.demianperry.com/uploads/2022/01/bricksEdge.jpg 1280w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>EdgeEnhance</figcaption></figure>



<p class="wp-block-paragraph">That&#8217;s a little <em>too</em> artistic for my taste.  Here&#8217;s a more complex filter, which first converts the image to a PNG with 16 colors in the palette. </p>



<pre class="wp-block-code"><code>#Import required image modules
from PIL import Image, ImageFilter
import os, sys

# Call like: ~/opt/anaconda3/bin/python ~/_notebooks/scripts/ImagePalette.py $f 
filename = sys.argv&#91;1]

#Create image object
img = Image.open(filename)

#convert to a PNG and shrink the palette down to 16 colors
img1 = img.convert("P", palette=Image.ADAPTIVE, colors=16)

#convert it back to jpg
img1 = img1.convert('RGB')

from PIL.ImageFilter import (SMOOTH_MORE)
img1 = img1.filter(SMOOTH_MORE)

base = os.path.splitext(filename)&#91;0]
filename = base + 'Palette.jpg'
img1.save(filename, "JPEG",optimize=True,quality=85)</code></pre>



<p class="wp-block-paragraph">Next, it smooths the image down and converts it back to jpg:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="577" src="https://media.demianperry.com/uploads/2022/01/bricksPalette-1024x577.jpg" alt="" class="wp-image-2157" srcset="https://media.demianperry.com/uploads/2022/01/bricksPalette-1024x577.jpg 1024w, https://media.demianperry.com/uploads/2022/01/bricksPalette-300x169.jpg 300w, https://media.demianperry.com/uploads/2022/01/bricksPalette-768x433.jpg 768w, https://media.demianperry.com/uploads/2022/01/bricksPalette.jpg 1280w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Palette conversion: this is close to the filter we&#8217;re using for stock images at <em><a href="https://hiddenbrain.org/" target="_blank" rel="noopener">Hidden Brain</a></em></figcaption></figure>



<p class="wp-block-paragraph">Here are a few more Pillow (python library) filters to explore: <strong><a href="https://pythontic.com/image-processing/pillow/alpha-composite" target="_blank" rel="noreferrer noopener">composite</a> / <a href="https://pythontic.com/image-processing/pillow/blend" target="_blank" rel="noreferrer noopener">blend</a></strong>, <a href="https://pythontic.com/image-processing/pillow/attributes" target="_blank" rel="noreferrer noopener"><strong>palate changes</strong></a>, <a href="https://pythontic.com/image-processing/pillow/contrast%20stretching" target="_blank" rel="noreferrer noopener"><strong>contrast stretching</strong></a>, <a href="https://pythontic.com/image-processing/pillow/convert" target="_blank" rel="noreferrer noopener"><strong>color depth</strong></a>, <a href="https://pythontic.com/image-processing/pillow/edge-enhancement-filter" target="_blank" rel="noreferrer noopener"><strong>edge enhancement</strong></a>, <a href="https://pythontic.com/image-processing/pillow/negative" target="_blank" rel="noreferrer noopener"><strong>negative</strong></a>, <a href="https://pythontic.com/image-processing/pillow/sharpen-filter" target="_blank" rel="noreferrer noopener"><strong>sharpen</strong></a>, <a href="https://pythontic.com/image-processing/pillow/smooth-filter" target="_blank" rel="noreferrer noopener"><strong>smoothing</strong></a>, <a href="https://pythontic.com/image-processing/pillow/thresholding" target="_blank" rel="noreferrer noopener"><strong>thresholding</strong></a></p>



<p class="wp-block-paragraph"><strong>Imagemagick</strong> also offers some more complex filters that take a bit more time to code but might be worth it if you like the effect.&nbsp; My pick from that group would be a subtle&nbsp;<strong>paint effect</strong>, like so:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="577" src="https://media.demianperry.com/uploads/2022/01/bricksPaint-1024x577.jpg" alt="" class="wp-image-2159" srcset="https://media.demianperry.com/uploads/2022/01/bricksPaint-1024x577.jpg 1024w, https://media.demianperry.com/uploads/2022/01/bricksPaint-300x169.jpg 300w, https://media.demianperry.com/uploads/2022/01/bricksPaint-768x433.jpg 768w, https://media.demianperry.com/uploads/2022/01/bricksPaint.jpg 1280w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>ImageMagick Paint Effect</figcaption></figure>



<p class="wp-block-paragraph">How do you create these effects?  I recommend starting with some of the command line filters developed by other folks in this space.  Here are a few: <a href="https://askubuntu.com/questions/703184/how-to-transform-an-image-into-a-cartoon-from-command-line" target="_blank" rel="noreferrer noopener"><strong>trace to vector</strong></a>, <a href="http://www.fmwconcepts.com/imagemagick/painteffect/index.php" target="_blank" rel="noreferrer noopener"><strong>paint effect</strong></a>, <a href="http://www.fmwconcepts.com/imagemagick/sketch/index.php" target="_blank" rel="noreferrer noopener"><strong>sketch</strong></a>, <a href="http://www.fmwconcepts.com/imagemagick/cartoon/index.php" target="_blank" rel="noreferrer noopener"><strong>cartoon</strong></a></p>



<h2 class="wp-block-heading" id="media-server">&#8220;Future Proof&#8221; your site with a Media Server</h2>



<p class="wp-block-paragraph">One note on images: they offer a lot of bloat that can make managing a site difficult (particularly if you&#8217;re relying on staging and version control.  One simple, elegant way to fix this issue is to decouple your images from your site, which is <a href="https://www.webnots.com/move-wordpress-images-folder-to-subdomain/" target="_blank" rel="noopener">fairly simple in wordpress</a>.  <strong>tldr;</strong> Set up a <strong>media </strong>subdomain on your host, copy your uploads folder from wordpress into the media subdomain, and then, in phpmyadmin, go to the …<strong>_options table</strong> for that wordpress db and change <strong>upload_url_path</strong> to something like https://media.yoursite.com/uploads (no trailing slash) and change <strong>upload_pat</strong>h to something like /home/yourhostusername/media.yoursite.com/uploads. </p>



<p class="wp-block-paragraph">Then flush the cache. If you&#8217;ve done everything right, you should see your new paths in settings &gt; media and the images should just work all over the site.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Open Success Measurement</title>
		<link>https://demianperry.com/open-success-measurement-for-content-producers/</link>
		
		<dc:creator><![CDATA[perrydc]]></dc:creator>
		<pubDate>Fri, 12 Feb 2021 21:10:54 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Analytics]]></category>
		<guid isPermaLink="false">http://demianperry.com/?p=1905</guid>

					<description><![CDATA[In most orgs, the technical complexity of website analytics limits metrics access to a small group of execs and technocrats.  Here's one way to open up the tools to everyone.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">After more than two decades of measuring success at large digital media organizations, I recently had an experience that caused me to <strong><em>rethink everything</em></strong>.  I&#8217;ll show you how I built a system that allows editors to set up their own experiments and track conversions entirely within their CMS and without any developer support.</p>



<p class="wp-block-paragraph">But first I&#8217;ll tell you how my old thinking went (and maybe this seems familiar to you):  </p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>Content producers are too busy to actively manage their own digital experiments and therefore their use of analytics tools should be limited to simplified dashboards.  Further, analytics should be a compromise between developers — who build for maintainability and scale — and content producers — who require a more flexible platform for testing different content approaches.</em></p>
<cite>— The nattering inside the head of every digital strategist</cite></blockquote>



<p class="wp-block-paragraph">Two recent consulting engagements rocked my belief system and forced me to build a new model.  On one project, I was advising a select group of newsrooms around the world on how to make success-measurement more accessible to content producers.  At the same time, I was setting up success analytics on the web and across a suite of third-party services for a leading U.S. broadcaster.  Together, these projects forced me to simultaneously work as an analyst at both the 10,000 foot level and at the practitioner level.</p>



<h2 class="wp-block-heading" id="the-problem-statement">The problem statement</h2>



<p class="wp-block-paragraph">In my first project, I was working with a leading developer I had known previously from my time at NPR.  Our charge was to find a way for multiple newsrooms to collaboratively build an optimized user conversion point for a newsletter sign up or a membership appeal.  On the one hand, we wanted to iterate on a single, cross-newsroom component to determine that, say, a red button outperforms a blue button.  On the other hand, we recognized that the design was probably less important than the content, and the individual newsrooms each had their own opinion of what content would work best for their brand.</p>



<p class="wp-block-paragraph">In the second project, I needed a quick way of seeing how many people were engaging with various appeals across the site for donating or signing up for a newsletter or podcast.  Although the broadcaster had no immediate need to test multiple designs, I wanted to engineer it in a way that would allow them to test in the future without development or extensive retooling of their data layer.</p>



<h3 class="wp-block-heading" id="set-up-analytics">Set up analytics</h3>



<p class="wp-block-paragraph">This tutorial assumes you have already set up an analytics system that works with your CMS, such as Google Analytics and Google Tag Manager.  If you&#8217;re using WordPress, this is super simple with the Site Kit wizard.  You&#8217;ll also want to <strong>disable insertion of the GA code on your page</strong>, since this is handled by GTM.  To make this work, you must:</p>



<ol class="wp-block-list">
<li>Create a GA Tag with the tag type <strong>GA4 Configuration</strong>.   Call it <strong>GA4</strong></li>



<li>Enter your stream ID from the GA4 property in your analytics admin as the measurement ID. </li>
</ol>



<p class="wp-block-paragraph">From now on, select GA4 in the Configuration Tag dropdown menu for any future tags.</p>



<h3 class="wp-block-heading" id="configure-variables-for-your-cms">Configure variables for your CMS</h3>



<p class="wp-block-paragraph">Think of GTM variables as your tool-set.  Google could enable all of them out of the box, but then you&#8217;d be overwhelmed.  At the same time, you&#8217;re going to want the right tools for the job.  Below is my toolset:</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="906" height="638" src="http://demianperry.com/wp-content/uploads/2021/02/GTM-Variables-Toolset.png" alt="" class="wp-image-1913" srcset="https://media.demianperry.com/uploads/2021/02/GTM-Variables-Toolset.png 906w, https://media.demianperry.com/uploads/2021/02/GTM-Variables-Toolset-300x211.png 300w, https://media.demianperry.com/uploads/2021/02/GTM-Variables-Toolset-768x541.png 768w" sizes="auto, (max-width: 906px) 100vw, 906px" /></figure>



<p class="wp-block-paragraph">The variables in the top box require no configuration.  Just select the Configure button at the top and click the ones you think you&#8217;ll need.  You can always add more later.  The GA variable is the only User-Defined variable you&#8217;ll need, and you should have defined that already.  I also recommend adding the top one because it allows you to assign triggers or labels from an image alt tag — add this by clicking <strong>New</strong>, select <strong>Auto-Event Variable </strong>and set <strong>Element Attribute</strong> as the Variable type and type <strong>alt</strong> as the Attribute name.  I&#8217;d also recommend the bottom one because it allows you to assign triggers or labels from the page name — add this by clicking <strong>New</strong>, select <strong>JavaScript Variable</strong> and type <strong>document.title</strong> in the Global Variable Name field.</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-7387b849 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="408" height="358" src="http://demianperry.com/wp-content/uploads/2021/02/Variable-GA.png" alt="" class="wp-image-1914" srcset="https://media.demianperry.com/uploads/2021/02/Variable-GA.png 408w, https://media.demianperry.com/uploads/2021/02/Variable-GA-300x263.png 300w" sizes="auto, (max-width: 408px) 100vw, 408px" /></figure>



<p class="wp-block-paragraph">#1 priority: configure your GA tracking variable</p>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="334" height="364" src="http://demianperry.com/wp-content/uploads/2021/02/Trigger-click-listener.png" alt="" class="wp-image-1912" srcset="https://media.demianperry.com/uploads/2021/02/Trigger-click-listener.png 334w, https://media.demianperry.com/uploads/2021/02/Trigger-click-listener-275x300.png 275w" sizes="auto, (max-width: 334px) 100vw, 334px" /></figure>



<p class="wp-block-paragraph">#2 priority: create a generic click listener</p>
</div>
</div>



<h3 class="wp-block-heading" id="create-a-generic-click-listener">Create a <em>generic</em> click listener</h3>



<p class="wp-block-paragraph">If you haven&#8217;t created a generic click listener in the past, you&#8217;ll want to add this one before going further.  Although this is technically a trigger, we&#8217;ll call it a listener because it won&#8217;t be used by any tags.  Its sole purpose will be to help us better understand how various components in our CMS make data available to our tag manager.  </p>



<p class="wp-block-paragraph">In GTM, click <strong>Triggers</strong> and the <strong>New</strong> button on the trigger panel.  Now set up a generic click trigger that tracks <strong>all clicks</strong>, which is the default option.  It should look something like this when you&#8217;re done:</p>



<h3 class="wp-block-heading" id="explore-cms-accessible-click-variables">Explore CMS-accessible Click Variables</h3>



<p class="wp-block-paragraph">Let&#8217;s put that generic click listener to work.  Before you can start setting tags, you need to understand how GTM reads the specific user interaction you&#8217;re trying to track.  If the user clicks a button, for example, is GTM taking the trigger from the button element, the link element, some image element, or the text element?  To find out, click <strong>Preview</strong>.  The assistant will load the site in a new window and start tracking every click (because of the generic click listener you set earlier).  I clicked a podcast subscribe badge.  Here&#8217;s what the Google Tag Assistant saw:</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="998" height="379" src="http://demianperry.com/wp-content/uploads/2021/02/tag-assistant-e1614177697854.png" alt="" class="wp-image-1911" srcset="https://media.demianperry.com/uploads/2021/02/tag-assistant-e1614177697854.png 998w, https://media.demianperry.com/uploads/2021/02/tag-assistant-e1614177697854-300x114.png 300w, https://media.demianperry.com/uploads/2021/02/tag-assistant-e1614177697854-768x292.png 768w" sizes="auto, (max-width: 998px) 100vw, 998px" /></figure>



<p class="wp-block-paragraph">Note the variables and values that are available to define our tags and triggers.  Can you spot the one that is easily available from the CMS?  As a hint, take a look at the media edit screen for this particular image in WordPress:</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="512" height="276" src="http://demianperry.com/wp-content/uploads/2021/02/alternative-text-in-Wordpress-e1614178062209.png" alt="" class="wp-image-1918" srcset="https://media.demianperry.com/uploads/2021/02/alternative-text-in-Wordpress-e1614178062209.png 512w, https://media.demianperry.com/uploads/2021/02/alternative-text-in-Wordpress-e1614178062209-300x162.png 300w" sizes="auto, (max-width: 512px) 100vw, 512px" /></figure>



<p class="wp-block-paragraph">We&#8217;ve discovered that the <strong>Alternative Text</strong> is a variable that is easily accessible from inside the CMS and is also picked up by GTM when a user clicks on that podcast badge.  </p>



<p class="wp-block-paragraph">GTM doesn&#8217;t care whether it&#8217;s easily editable within the CMS.  In fact, some developers and analytics specialists may even want to tag variables that are <em>not</em> easy to edit.  But that&#8217;s inherently an exclusionary philosophy.  It&#8217;s effectively saying, <em>if I give an editor this power, they will break my shit.</em></p>



<p class="wp-block-paragraph">This misses the point of what we&#8217;re trying to do here.  Experiments are <em>supposed</em> to be ephemeral, lightweight and breakable.  These are sandcastles that help us learn.  When the experiment is over, commend it to the sea!</p>



<h3 class="wp-block-heading" id="create-a-flexible-trigger">Create a <em>flexible</em> trigger</h3>



<p class="wp-block-paragraph">The trick is to build flexible triggers, rather than the fixed triggers we usually set in GTM.  For instance:</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-7387b849 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="532" height="363" src="http://demianperry.com/wp-content/uploads/2021/02/inflexible-trigger.png" alt="" class="wp-image-1915" srcset="https://media.demianperry.com/uploads/2021/02/inflexible-trigger.png 532w, https://media.demianperry.com/uploads/2021/02/inflexible-trigger-300x205.png 300w" sizes="auto, (max-width: 532px) 100vw, 532px" /><figcaption class="wp-element-caption">A fixed trigger that applies to specific elements on a specific page</figcaption></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="552" height="317" src="http://demianperry.com/wp-content/uploads/2021/02/flexible-trigger.png" alt="" class="wp-image-1916" srcset="https://media.demianperry.com/uploads/2021/02/flexible-trigger.png 552w, https://media.demianperry.com/uploads/2021/02/flexible-trigger-300x172.png 300w" sizes="auto, (max-width: 552px) 100vw, 552px" /><figcaption class="wp-element-caption">A flexible trigger that can be set outside of GTM</figcaption></figure>
</div>
</div>



<p class="wp-block-paragraph">Note that the trigger on the left only applies to elements with a specific class on a specific page.  This is useful for my purpose of seeing how many people on the books page click a purchase link, but it isn&#8217;t something an editor could reuse elsewhere on the site.  The one on the right will trigger any time an editor includes the word subscribe in the alt text of an image.</p>



<p class="wp-block-paragraph">You could make this even more generic (and at the same time protect against false positives) by using a reserve prefix like hbSubscribe.  Just remember, your alt text is doing double-duty as a descriptive tag for screen-readers, so don&#8217;t go too far off the reservation.</p>



<h3 class="wp-block-heading" id="create-a-dynamic-tag">Create a <em>dynamic</em> tag</h3>



<p class="wp-block-paragraph">This approach becomes even more valuable if you allow for dynamic content (where the label in your GA report changes depending on the content).  Begin, as you normally would, by configuring the tag (click <strong>Tags</strong> select <strong>New</strong>, click anywhere in the Tag configuration box and then select <strong>Google Analytics, Universal Analytics</strong>).  After selecting Google Analytics: Universal Analytics from the list of options of where to send the data, be sure to click the dropdown that says <strong>Select Settings Variable&#8230;</strong> and select your GA variable.  <strong><em>If you fail to do this step, all other work will be lost when you click Save.  You will not get an error message, just endless confusion</em></strong>.  Because Google.  </p>



<p class="wp-block-paragraph">Next, select <strong>Event</strong> as the track type and fill in your tracking parameters.  As always, how you label these parameters (or if you label them at all) has no impact on whether the code will work, but the labeling will determine how this event will show up in GA.  What you put on Category and Action will both show up on the Events table, and either Label or Value will show up in the table that appears when a user clicks Action in GA.  So good labeling might look something like this:</p>



<figure class="wp-block-table"><table><tbody><tr><td>Category</td><td>Audio</td></tr><tr><td>Action</td><td>Podcast Play</td></tr><tr><td>Label</td><td>Title of Podcast</td></tr><tr><td>Value</td><td>{{ minutes played }}</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Note that <em><strong>you&#8217;ll probably</strong> <strong>never fill in a Label AND a Value on the same tag</strong></em>. I do it here only to demonstrate that Labels are for qualitative and values are for quantitative information.</p>



<p class="wp-block-paragraph">In the case of our podcast tracking experiment, my final tag will look something like this:</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="744" src="http://demianperry.com/wp-content/uploads/2021/02/Dynamic-Tag-1024x744.png" alt="" class="wp-image-1917" srcset="https://media.demianperry.com/uploads/2021/02/Dynamic-Tag-1024x744.png 1024w, https://media.demianperry.com/uploads/2021/02/Dynamic-Tag-300x218.png 300w, https://media.demianperry.com/uploads/2021/02/Dynamic-Tag-768x558.png 768w, https://media.demianperry.com/uploads/2021/02/Dynamic-Tag.png 1035w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Note that the Action is specific enough to be understandable to anyone, and the Label is based on the full alt tag assigned by the editor.  Be sure to hit <strong>Preview</strong> to test that the tag is firing properly and then hit <strong>Submit</strong> to push your changes live to the site.  Within a few minutes, you should start seeing results:</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="636" height="170" src="https://demianperry.com/wp-content/uploads/2021/02/Screen-Shot-2021-02-12-at-4.01.57-PM.png" alt="" class="wp-image-1920" srcset="https://media.demianperry.com/uploads/2021/02/Screen-Shot-2021-02-12-at-4.01.57-PM.png 636w, https://media.demianperry.com/uploads/2021/02/Screen-Shot-2021-02-12-at-4.01.57-PM-300x80.png 300w" sizes="auto, (max-width: 636px) 100vw, 636px" /><figcaption class="wp-element-caption">Looks like Google and Apple are neck and neck in this experiment</figcaption></figure>



<p class="wp-block-paragraph">Et voila!  You now have an experimentation tag and trigger that is just as narrowly confined as you need it to be understandable to analysts, but which offers as much flexibility for open experimentation as your editors require.</p>



<h3 class="wp-block-heading" id="tell-your-editors-how-to-build-their-experiments">Tell your editors how to build their experiments</h3>



<p class="wp-block-paragraph">Now you need to tell your editors that they can start uploading podcast subscribe badges with abandon, and to be sure to include the word &#8220;subscribe&#8221; (or whatever you set) in the alt text, and to make the rest of the alt text as descriptive as possible.</p>



<h2 class="wp-block-heading" id="conclusion">Conclusion</h2>



<p class="wp-block-paragraph">This philosophy doesn&#8217;t live and die by the alt tag.  I also have open experiments with buttons, where the trigger is the url of our newsletter signup page and the Label is the button text.  So if an editor changes the text of the inline button without telling me, I&#8217;ll be able to call her up and report that her new language is beating the pants off the old language.</p>



<p class="wp-block-paragraph">And that&#8217;s the point, really.  Instead of looking at conversion points as the protected domain of a rambling digital bureaucracy, your content producers will start to take back their instincts.  But now, they&#8217;ll be doing it with constant feedback from the audience.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Growth hacking for websites</title>
		<link>https://demianperry.com/wordpress-site-optimization-tools/</link>
		
		<dc:creator><![CDATA[perrydc]]></dc:creator>
		<pubDate>Thu, 03 Dec 2020 20:16:07 +0000</pubDate>
				<category><![CDATA[Analytics]]></category>
		<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">http://demianperry.com/?p=1812</guid>

					<description><![CDATA[Whether you're a major media brand or a tiny Wordpress blog looking to grow your audience, a site optimization test and a few quick technical fixes (SEO, Performance, Security and Accessibility) can have a big impact.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Your content is awesome, so where&#8217;s the crowd?  After twenty years of helping startups, and a few major media brands, find an audience, I&#8217;ve learned that <em><strong>poorly formed metadata</strong></em> and <strong><em>slow performance</em></strong> are often the biggest culprits.</p>



<p class="wp-block-paragraph">Fortunately, site optimization doesn&#8217;t have to be complex or time-consuming.  If you&#8217;re on WordPress, you can perform all the steps here, and measure big improvements, <strong><em>in under an hour</em></strong>.  If you&#8217;re using another CMS such as Drupal or Contentful, the steps will take longer but the principles are the same.</p>


				<div class="wp-block-uagb-table-of-contents uagb-toc__align-left uagb-toc__columns-1  uagb-block-193f273d      "
					data-scroll= "1"
					data-offset= "30"
					style=""
				>
				<div class="uagb-toc__wrap">
						<div class="uagb-toc__title">
							Steps to Site Optimization						</div>
																						<div class="uagb-toc__list-wrap ">
						<ol class="uagb-toc__list"><li class="uagb-toc__list"><a href="#devops-optimization" class="uagb-toc-link__trigger">DevOps Optimization</a><ul class="uagb-toc__list"><li class="uagb-toc__list"><a href="#make-your-site-is-https-if-its-not-already" class="uagb-toc-link__trigger">Make your site is https (if it&#039;s not already)</a><li class="uagb-toc__list"><li class="uagb-toc__list"><a href="#optimize-php-for-speed" class="uagb-toc-link__trigger">Optimize PHP for speed</a></li></ul></li><li class="uagb-toc__list"><a href="#the-lighthouse-site-optimization-test" class="uagb-toc-link__trigger">The Lighthouse site optimization test</a><li class="uagb-toc__list"><a href="#choose-the-right-theme" class="uagb-toc-link__trigger">Choose the right theme</a><li class="uagb-toc__list"><a href="#seo-site-optimization" class="uagb-toc-link__trigger">SEO site optimization</a><li class="uagb-toc__list"><a href="#performance-site-optimization" class="uagb-toc-link__trigger">Performance site optimization</a><ul class="uagb-toc__list"><li class="uagb-toc__list"><a href="#import-w3-total-cache-settings" class="uagb-toc-link__trigger">Import W3 Total Cache Settings</a><li class="uagb-toc__list"><li class="uagb-toc__list"><a href="#image-best-practices-for-site-optimization" class="uagb-toc-link__trigger">Image Best Practices for site optimization</a></li></ul></li></ul></li><li class="uagb-toc__list"><a href="#best-practices-security-site-optimization" class="uagb-toc-link__trigger">Best Practices (Security site optimization)</a><ul class="uagb-toc__list"><li class="uagb-toc__list"><a href="#turn-on-auto-updates" class="uagb-toc-link__trigger">Turn on auto-updates</a><li class="uagb-toc__list"><li class="uagb-toc__list"><a href="#add-the-wordfence-plugin" class="uagb-toc-link__trigger">Add the Wordfence plugin</a></li></ul></li></ul></li></ul></li><li class="uagb-toc__list"><a href="#accessibility-site-optimization" class="uagb-toc-link__trigger">Accessibility site optimization</a><li class="uagb-toc__list"><a href="#follow-up-ongoing-site-optimization" class="uagb-toc-link__trigger">Follow up: ongoing site optimization</a></ul></ul></ul></ol>					</div>
									</div>
				</div>
			


<p class="wp-block-paragraph"></p>



<h2 class="wp-block-heading" id="devops-optimization">DevOps Optimization</h2>



<p class="wp-block-paragraph">Before we begin, ensure your server is set up for secure and fast content delivery.  Most users will bypass your server when we&#8217;re done with this tutorial, but a few will still get through, and you&#8217;ll want your site to work great for everyone. </p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="896" height="383" src="http://demianperry.com/wp-content/uploads/2020/12/letsEncrypt_php_opcache.png" alt="Optimizing your server operating system and adding an https certificate are the first two steps of website optimization." class="wp-image-1822" srcset="https://media.demianperry.com/uploads/2020/12/letsEncrypt_php_opcache.png 896w, https://media.demianperry.com/uploads/2020/12/letsEncrypt_php_opcache-300x128.png 300w, https://media.demianperry.com/uploads/2020/12/letsEncrypt_php_opcache-768x328.png 768w" sizes="auto, (max-width: 896px) 100vw, 896px" /><figcaption>Optimizing your server operating system and adding an https certificate are the first two steps of website optimization.</figcaption></figure>



<h3 class="wp-block-heading" id="make-your-site-is-https-if-it-s-not-already">Make your site is https (if it&#8217;s not already)</h3>



<p class="wp-block-paragraph"><strong>Why you should do this: </strong>In my <a href="http://demianperry.com/consulting/" class="rank-math-link">last job</a>, I asked a product manager on my team to find out how much work it would be to slap an SSL certificate on one of the sites we managed, BerkeleyWellness.com.  Our devops specialist estimated it would take about two weeks because the site was a sordid mix of Drupal, a custom CMS and some other PHP stacks that would need to be consolidated under a single cert.  It sounded like a lot of work, but I gave it the green light.  </p>



<p class="wp-block-paragraph">One week after we launched the new cert, Google rewarded us with a 20% increase in organic traffic.  If you&#8217;re operating on a single stack (such as wordpress) adding an SSL certificate will only take a few minutes, but you may see as big an impact on audience.</p>



<p class="wp-block-paragraph">SSL certs are now the default for many hosts, and if you use a host managed through cPanel, this is fairly easy to set up.  In cPanel, go to <strong>Let&#8217;s Encrypt SSL</strong> and follow the instructions to set up an ssl cert for your domain.  You can go with the defaults unless you want to have your ssl cert apply to all subdomains (in which case, you&#8217;ll want to toggle to the dns setting).  </p>



<p class="wp-block-paragraph">If the padlock appears next to the url on all your pages (or if you haven&#8217;t installed wordpress) you&#8217;re done with this step.  For an existing site, you&#8217;ll also need to update your wp-config file to recognize that your site is now https (or reinstall the site on the https domain).</p>



<h3 class="wp-block-heading" id="optimize-php-for-speed">Optimize PHP for speed</h3>



<p class="wp-block-paragraph">While you&#8217;re in cPanel, scroll down to <strong>Select PHP version</strong>.  Here you should make sure you&#8217;re using the latest (current) PHP version, and that you have enabled all the modules that wordpress recommends.  For the purposes of site optimization, you&#8217;re probably good with the defaults, but I had to tick the boxes next to <strong>imagick</strong> (which helps with image optimization) and opcache (which can massively speed up your site by preloading php scripts).</p>



<h2 class="wp-block-heading" id="the-lighthouse-site-optimization-test">The Lighthouse site optimization test</h2>



<p class="wp-block-paragraph">Now it&#8217;s time to see how far your site has to go on the road to optimization.  To perform an initial speed and SEO audit on your site open up an <strong>Incognito</strong> window in Chrome and navigate to a <strong>single post</strong> on your site.  This is important: you&#8217;ll need it to be a single post (not your homepage) and an incognito window for the most representative test of what your real world users will experience when they link to a story from Google.  </p>



<p class="wp-block-paragraph">Now right click (or ctrl-click) and select <strong>inspect</strong> from the dropdown menu.  In the box that appears on the bottom of the page, click the <strong>Lighthouse </strong>tab and select the <strong>Generate report</strong> button.  <em>Try not to cry</em>.  We&#8217;ll make it better.</p>



<h2 class="wp-block-heading" id="choose-the-right-theme">Choose the right theme</h2>



<p class="wp-block-paragraph">There&#8217;s a lot more to choosing the right theme than loading speed, but performance is often an indicator of overall quality, so it has always been the primary driver for me.  The default wordpress themes are pretty fast, but can be a little buggy on mobile.  GeneratePress is another good choice.  </p>



<p class="wp-block-paragraph">Personally, I prefer <strong><a href="https://wpastra.com/" class="rank-math-link" target="_blank" rel="noopener">Astra</a></strong> because it is highly configurable and has an extensive hook system that simplifies template customization.  One note on Astra: if you add your logo, make sure you only use one logo and not a special logo for mobile.  A second logo will bump up your <strong><em>cumulative layout shift</em></strong>, which is a measure of how much your site flashes or shifts after the initial load.  Your users will notice the difference, and Google will count a slow-loading logo against your overall performance score.</p>



<h2 class="wp-block-heading" id="seo-site-optimization">SEO site optimization</h2>



<p class="wp-block-paragraph">Once you&#8217;ve optimized your server and picked the right theme, optimizing SEO will have the next biggest impact on the growth potential of your site.  If I could only install one SEO site optimization tool, it would be <a href="https://rankmath.com/" class="rank-math-link" target="_blank" rel="noopener">RankMath</a>.  If you follow the setup wizard, you&#8217;ll get a perfect score in Lighthouse, which is better than Yoast, the longtime leader in this space, can manage out of the box.</p>



<p class="wp-block-paragraph">But RankMath will take you so much further.  Measuring how well every piece of content matches to popular searches is beyond the scope of the Lighthouse audit.  I&#8217;d like to dwell for a moment on how RankMath fits into your production process because this is where you&#8217;ll get the most lift in audience discovery.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1023" height="554" src="http://demianperry.com/wp-content/uploads/2020/12/SEO1.png" alt="SEO optimization starts with finding a popular term that people are already searching for." class="wp-image-1823" srcset="https://media.demianperry.com/uploads/2020/12/SEO1.png 1023w, https://media.demianperry.com/uploads/2020/12/SEO1-300x162.png 300w, https://media.demianperry.com/uploads/2020/12/SEO1-768x416.png 768w" sizes="auto, (max-width: 1023px) 100vw, 1023px" /><figcaption>SEO optimization starts with finding a popular term that people are already searching for.</figcaption></figure>



<p class="wp-block-paragraph">On your next post, you&#8217;ll see a score in the upper right corner that tells you how well your site title and other metadata matches to a popular search term.  As you can see in the above image, I started out with a title that was close, but didn&#8217;t match exactly, with anything in the list of <strong>Focus Keywords</strong> suggested by RankMath.  Once I selected my Focus Keyword, RankMath began adjusting my score as I integrated the keyword into my text — for instance, using the term &#8220;site optimization&#8221; in this sentence just had a slight impact on my score.  I also like how RankMath is highly prescriptive about where to put the term and how to use it.</p>



<p class="wp-block-paragraph">RankMath also helps by updating its recommendations over time.  A crucial part of any SEO strategy is the recognition that SEO is a psuedo-science at best.  Most of the recommendations I have read by SEO experts are backed up with scant evidence and conclusions derived from sometimes dubious sources like chatrooms and the twitter feed of that guy they know at Google.  For this reason, the SEO community seems to group together around ever changing recommendations.  Two years ago, Mega Menus (loading up your nav with a gazillion internal links) was considered a viable way to spread the love from a highly-ranked page to the rest of your site.  Now that practice is discouraged as dilutive.  Tools like RankMath help you to keep up with the latest trends without the need to become an expert yourself.</p>



<p class="wp-block-paragraph">If you want to go deeper than RankMath, there are a number of tools that will give you a more nuanced view of your particular site&#8217;s optimization needs.  I&#8217;m no SEO expert, but I&#8217;ve worked with several smart ones over the past two decades.  Their analysis typically begins with site auditing tools like <strong>Ahrefs</strong> ($100 &#8211; $1000 per month) and <a href="https://www.screamingfrog.co.uk/seo-spider/" target="_blank" rel="noopener">Screaming Frog</a> (free for the first 500 crawled links).  Sometimes they&#8217;ll also create <a href="https://searchengineland.com/easy-visualizations-pagerank-page-groups-gephi-265716" target="_blank" rel="noopener">visualizations</a> to support their recommendations to a broader group of executives.  They would bristle at any attempt I made to prescribe a one-size-fits-all SEO solution, but often their recommendations will include ideas about how to <strong>improve the credibility and sourcing of content</strong>, improve page ranking by <strong>algorithmically deleting and redirecting poorly performing content</strong> to bring a site under the crawl budget, and adopting a <strong>hub and spoke content model</strong>.</p>



<h2 class="wp-block-heading" id="performance-site-optimization">Performance site optimization</h2>



<p class="wp-block-paragraph">Now that you have a perfect SEO score and a plan for integrating ongoing SEO improvement into your content production process, it&#8217;s time to make your site as fast as possible.  Head over to your plugins section and type <strong>cache</strong> into the search box.  I found that <strong>W3 Total Cache</strong> is complex, but offers the best customization of all the other top plugins you see on your screen.  If you read the reviews, you&#8217;ll find that most people love it, but some folks give up before configuring it properly.</p>



<p class="wp-block-paragraph">Fortunately for you, I&#8217;m going to provide a shortcut that will configure nearly all the steps of your caching optimization and deliver a perfect performance score for your site.  If you want to read about each of these configurations, and why they matter, check out <a href="https://bloggingwizard.com/w3-total-cache-cloudflare/" class="rank-math-link" target="_blank" rel="noopener">Blogging Wizard&#8217;s excellent post</a> on configuring W3 Total Cache.  I had to tweak a few of the suggestions to perfect my score, but it&#8217;s mostly spot on.</p>



<h3 class="wp-block-heading" id="import-w3-total-cache-settings">Import W3 Total Cache Settings</h3>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="806" height="136" src="http://demianperry.com/wp-content/uploads/2020/12/import_settings.png" alt="import settings to jumpstart your W3 total cache experience and prepare for Cloudflare integration." class="wp-image-1821" srcset="https://media.demianperry.com/uploads/2020/12/import_settings.png 806w, https://media.demianperry.com/uploads/2020/12/import_settings-300x51.png 300w, https://media.demianperry.com/uploads/2020/12/import_settings-768x130.png 768w" sizes="auto, (max-width: 806px) 100vw, 806px" /><figcaption>Import settings to jumpstart your W3 total cache experience and prepare for Cloudflare integration.</figcaption></figure>



<p class="wp-block-paragraph">Once you&#8217;ve activated the W3 Total Cache plugin, navigate to <strong>Performance &gt; General Settings</strong> in the sidebar and find the <strong>Import / Export Settings</strong> link at the top of the screen, as shown above and import our generic <a href="http://demianperry.com/wp-content/uploads/2020/12/W3cacheSettings.json" class="rank-math-link">W3 Total Cache settings</a> json file (Hold down option when you click that link to download the file).  If you&#8217;re porting over the settings from another site, make sure you update your cloudflare settings, since you&#8217;ll need a different zone for each site.</p>



<p class="wp-block-paragraph">Now all you have to do is connect Cloudflare.  Go to <a href="https://dash.cloudflare.com/" class="rank-math-link" target="_blank" rel="noopener">Cloudflare</a> and click <strong>Add site</strong> (you&#8217;ll need to register for a free account if you haven&#8217;t already).  Select the Free option and click through the review records screen (you don&#8217;t really need to worry about this unless you&#8217;re running additional services like email from your server, and even there, Cloudflare will likely configure it correctly).  </p>



<p class="wp-block-paragraph">In another browser tab (don&#8217;t close the Cloudflare page!), go to wherever you purchased your domain (not in cPanel) and replace the nameservers with the cloudflare servers (<strong>derek</strong>.ns.cloudflare.com and <strong>gene</strong>).  Once you&#8217;ve done that, go back to Cloudflare page and click <strong>check nameservers</strong> and continue with set up of your account.  Your choices here don&#8217;t matter much because W3 will be managing your cloudflare configuration, but I usually enable everything cloudflare offers in the setup wizard. </p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="773" height="335" src="http://demianperry.com/wp-content/uploads/2020/12/cloudflare.png" alt="You'll need your Global API Key from Cloudflare to connect with W3 caching for the final performance optimization step for a fast wordpress site." class="wp-image-1837" srcset="https://media.demianperry.com/uploads/2020/12/cloudflare.png 773w, https://media.demianperry.com/uploads/2020/12/cloudflare-300x130.png 300w, https://media.demianperry.com/uploads/2020/12/cloudflare-768x333.png 768w" sizes="auto, (max-width: 773px) 100vw, 773px" /><figcaption>You&#8217;ll need your Global API Key from Cloudflare to connect with W3 caching for the final performance optimization step for a fast wordpress site.</figcaption></figure>



<p class="wp-block-paragraph">As a last step, you need to connect W3 to Cloudflare.  From your <a href="https://dash.cloudflare.com/profile" class="rank-math-link" target="_blank" rel="noopener">Cloudflare Profile Page</a> select the <strong>API Tokens</strong> tab and select <strong>View</strong> next to your <strong>Global API Key</strong>.  Now, in the WordPress sidebar, navigate to <strong>Performance &gt; Extensions</strong> and click the <strong>Activate</strong> button next to Cloudflare.</p>



<p class="wp-block-paragraph"><strong>Turn on performance monitoring from Google:</strong> As an optional, final step, scroll down to <strong>Miscellaneous </strong>in the General Settings and follow the instructions to add your <strong>Page Speed API Key</strong>.  This will add a widget on your dashboard to show you how all your pages are doing from a performance perspective over time.</p>



<h3 class="wp-block-heading" id="image-best-practices-for-site-optimization">Image Best Practices for site optimization</h3>



<p class="wp-block-paragraph">Unless you&#8217;re running a portfolio site where image quality is the most important part of the site, you&#8217;ll want to compress your images as much as possible.  Most people won&#8217;t notice the difference in quality, but they will notice the peppiness of your site.  If you already have images on your site that you want to batch compress, you&#8217;ll want a plugin such as <a href="https://wordpress.org/plugins/wp-smushit/" class="rank-math-link" target="_blank" rel="noopener">Smush</a>.  </p>



<p class="wp-block-paragraph">For future images, you&#8217;ll want to add an off-site image optimizer into your process.  I recommend <a href="https://imageoptim.com/mac" class="rank-math-link" target="_blank" rel="noopener">ImageOptim</a> to achieve an even better quality to compression ratio than Smush.  Your productivity will also improve because the time it takes to drag and drop all your upload images for a post into the ImageOptim folder will take less time than the time you&#8217;ll save in image transmission to your blog.</p>



<h2 class="wp-block-heading" id="best-practices-security-site-optimization">Best Practices (Security site optimization)</h2>



<p class="wp-block-paragraph">Google wants the web to be secure, so they reward more secure sites with higher rankings.  If you&#8217;re on WordPress, most of the best practices are baked into the platform, and you&#8217;ve already made your site https, so you&#8217;re most of the way there.  Here are a few other steps that will keep your site secure for the foreseeable future:</p>



<h3 class="wp-block-heading" id="turn-on-auto-updates">Turn on auto-updates</h3>



<p class="wp-block-paragraph"><strong>WordPress should be set to auto-update</strong>, along with all of your <strong>plugins</strong> and <strong>themes</strong>.  Auto-update shouldn&#8217;t break anything on your site unless you have tinkered with the core theme design, which you should never do.  A better way to do this is to create a child theme which hooks into the master theme for updates but retains its own logic for your customization (beyond the scope of this tutorial).</p>



<h3 class="wp-block-heading" id="add-the-wordfence-plugin">Add the Wordfence plugin</h3>



<p class="wp-block-paragraph">Wordfence is the best free security plugin and requires very little customization.  The only things I have tinkered with are the blocking rules, specific IPs to block, and 2FA authentication for all admins, but none of those are necessary for your Lighthouse score (just good practices).</p>



<h2 class="wp-block-heading" id="accessibility-site-optimization">Accessibility site optimization</h2>



<p class="wp-block-paragraph">Accessibility is core to site optimization, but it can be the hardest one to measure.  Unless you have an accessibility need — for instance, you may be colorblind like me — you may not even know that your site has issues.  If your initial lighthouse audit suggested an issue with contrast, you can see the specific problem items in the audit and usually change them with a small CSS update.  </p>



<p class="wp-block-paragraph">If you have an issue like tab order, it can be a more complicated fix that requires you to swap out an offending plugin or make some custom changes to your theme.  But don&#8217;t ignore these issues.  Nearly 10% of Americans are sight-impaired and another 10% are colorblind, so failing to make things easy for them can be a significant barrier to growing audience.</p>



<h2 class="wp-block-heading" id="follow-up-ongoing-site-optimization">Follow up: ongoing site optimization</h2>



<figure class="wp-block-image size-large"><img decoding="async" src="http://demianperry.com/wp-content/uploads/2020/12/lighthouse_audit.png" alt="This is what a perfect lighthouse site optimization score looks like!" class="wp-image-1820"/><figcaption>Queue the fireworks for a perfect site optimization score in Lighthouse.</figcaption></figure>



<p class="wp-block-paragraph">The last step is to run that audit again and see how we did.  If all goes well, you&#8217;re glaring at that rarest of internet beasts, the perfect Lighthouse score (with fireworks!).  </p>



<p class="wp-block-paragraph">If your site optimization scores aren&#8217;t perfect and you&#8217;ve confirmed that you&#8217;re viewing a story page in incognito mode, follow any suggested last steps in the audit (it&#8217;s possible something has changed since I wrote this!).  <a href="https://twitter.com/perrydc" class="rank-math-link" target="_blank" rel="noopener">Tweet me</a> if you get stuck.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Design across sites &#038; services</title>
		<link>https://demianperry.com/wordpress-embeds/</link>
		
		<dc:creator><![CDATA[perrydc]]></dc:creator>
		<pubDate>Sat, 08 Aug 2020 12:49:25 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Design]]></category>
		<guid isPermaLink="false">http://demianperry.com/?p=1603</guid>

					<description><![CDATA[There are many ways to incorporate external services into a Wordpress site.  We examine them all and end with the easiest to maintain and most performant method.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Working within the constraints of a CMS can sometimes be &#8230; <em>constraining</em>.  What if you&#8217;d like to include custom functionality within your site that falls outside the standard WordPress library?  What if that functionality is coded in Python?  Enter the mighty embed!  </p>



<h2 class="wp-block-heading" id="iframes-the-wrong-way">Iframes: the wrong way</h2>



<p class="wp-block-paragraph">Want to troll a developer?  Ask her to put an iframe on your site.  Developers have built this backdoor into <strong>Contentful</strong>, arguably the most serious CMS in the world, just <strong><em>so they wouldn&#8217;t ever have to have that conversation with you</em></strong>.  Under assets, simply select <strong>create a new asset and link</strong> and drop the script into the block.  This also works in WordPress.  </p>



<p class="wp-block-paragraph">Let&#8217;s say you want to embed two episodes of Hidden Brain into your page, like so:</p>



<iframe loading="lazy" src="https://omny.fm/shows/hidden-brain/laughter-the-best-medicine/embed" width="100%" height="180" frameborder="0" title="Laughter: The Best Medicine"></iframe>
<iframe loading="lazy" src="https://omny.fm/shows/hidden-brain/you-2-0-our-pursuit-of-happiness/embed" width="100%" height="180" frameborder="0" title="You 2.0: Our Pursuit of Happiness"></iframe>



<p class="wp-block-paragraph">Both of these are just individual iframes dropped into a <strong>Custom HTML </strong>block, like so:</p>



<pre class="wp-block-code"><code>&lt;iframe src="https://omny.fm/shows/hidden-brain/laughter-the-best-medicine/embed" width="100%" height="180" frameborder="0" title="Laughter: The Best Medicine"&gt;&lt;/iframe&gt;</code></pre>



<p class="wp-block-paragraph">Voilà: you&#8217;ve just earned your Masters in Computer Science!  Or maybe not.  <strong>The problem with iframes is that you&#8217;re giving someone else a piece of your website</strong>.  What could possibly go wrong?  Well:</p>



<ul class="wp-block-list"><li>They present a<strong> horrible user experience</strong>, where the user might interact with something in the frame that takes them to another page within the frame. As just one example, click play on the two examples above. They play over each other because they have no way of coordinating the experience on your page.  Ideally, the audio of one would stop the moment you press play on the other one.</li><li>It&#8217;s a <strong>big honkin security hole</strong> that a nefarious actor could use to steal information from your users under the banner of your brand.</li><li>They compound all the <strong>bad performance </strong>of your site with the equally bad or worse performance of the framed site.  Even if you&#8217;re the developer of both the wrapper page and the framed page, you&#8217;re still doubling the load time of the page.</li><li>There&#8217;s <strong>no version control</strong> for iframes, meaning that a change to the framed site may break your site without you (or the framed page developer) even knowing about it.</li><li>You get <strong>zero SEO credit</strong> for the content in the frame when the Google crawler comes around.</li></ul>



<p class="wp-block-paragraph">If you&#8217;re ready to join the 21st Century, ditch the iframe.</p>



<h2 class="wp-block-heading" id="scripting-the-ok-way">Scripting: the ok way</h2>



<p class="wp-block-paragraph">WordPress makes it easy to add vanilla javascript to any page, which can then be deployed elsewhere.  Let&#8217;s say you want to add a javascript clock onto your site, like so:</p>



<h2 id="time" class="text-danger pl-5"></h2>

<script>
function checkTime(i) {
  if (i < 10) {
    i = "0" + i;
  }
  return i;
}

function startTime() {
  var today = new Date();
  var h = today.getHours();
  var m = today.getMinutes();
  var s = today.getSeconds();
  // add a zero in front of numbers<10
  m = checkTime(m);
  s = checkTime(s);
  document.getElementById('time').innerHTML = h + ":" + m + ":" + s;
  t = setTimeout(function() {
    startTime()
  }, 500);
}
startTime();
</script>



<p class="wp-block-paragraph">You can usually just google this, steal someone else's code, and drop it on your site in a <strong>custom HTML</strong> block, as I did here:</p>



<pre class="wp-block-code"><code>&lt;h2 id="time" class="text-danger pl-5"&gt;&lt;/h2&gt;

&lt;script&gt;
function checkTime(i) {
  if (i &lt; 10) {
    i = "0" + i;
  }
  return i;
}

function startTime() {
  var today = new Date();
  var h = today.getHours();
  var m = today.getMinutes();
  var s = today.getSeconds();
  // add a zero in front of numbers&lt;10
  m = checkTime(m);
  s = checkTime(s);
  document.getElementById('time').innerHTML = h + ":" + m + ":" + s;
  t = setTimeout(function() {
    startTime()
  }, 500);
}
startTime();
&lt;/script&gt;</code></pre>



<p class="wp-block-paragraph">So, this is fine, but it still suffers from the problem that your code is part of the content, making it hard to upgrade the design and functionality of the site unless you're carefully documenting these one-off pages.  It also isn't as performant as cached code.  Fortunately, there's a better way:</p>



<h2 class="wp-block-heading" id="custom-php-the-proper-way">Custom PHP: the proper way</h2>



<p class="wp-block-paragraph">Don't freak out.  You can do this!  And you only need to do it once to embed all future webpages ever into your site using a shortcode that defines the location of the page / code to embed.</p>



<p class="wp-block-paragraph">First I'll tell you the easy way, but <strong>don't do it this way!</strong>  Just read to get the core concept.  The easiest way is to go to <strong>Appearance </strong>→ <strong>Theme Editor</strong> and select <strong>Theme Functions</strong> from the box on the right side of the screen.  Then just add the following code to the bottom of the php file:</p>



<pre class="wp-block-code"><code>add_shortcode( 'rr', 'remoteRequest');
function remoteRequest($atts){
        $route = $atts&#91;'r'];  //passed from shortcode
        $url = 'https://' . $route;
        $request = array(
                'method' =&gt; 'GET',
                'timeout' =&gt; 10,
                'redirection' =&gt; 10,
                'blocking' =&gt; true,
                'headers' =&gt; array(),
                'cookies' =&gt; array(),
        );
	$response = wp_remote_request($url, $request) or die ('request failed.');
        return $response&#91;'body'];
}</code></pre>



<p class="wp-block-paragraph">Now, whenever you want to add an embed, you'll just add a shortcode, like <strong>[rr r="www.yoursite.com/api?user=me"]</strong> and the embedded page will preload with php and get cached by your caching engine.</p>



<p class="wp-block-paragraph">We're just going to make a few changes to the process above to improve it, but first <strong>pause for a moment to reflect on the power of this small bit of code</strong>.  The rr shortcode is short for remote request, but you could give it your own shortcode if you don't like mine.  You could call it George, for instance, and have the shortcode be g, so long as you change remoteRequest to George wherever it appears in the code above.  The r= bit of the code defines the request.  In other words, it allows an editor to specify a different source url for each page.  With five minutes of copypasta, you've opened up the entire internet to your editors, with the same awesome performance caching you have on your own site.  You're also taking all requests for the code over to your site, so you can set up your own analytics around how the code is used.  <strong>You can even apply your own CSS styling and javascript to the embedded page.</strong></p>



<p class="wp-block-paragraph"><strong>What could go wrong?</strong>  If you'd actually followed the instructions above, WordPress would have given you a warning when you opened the Theme Editor.  You really shouldn't be editing code here.  For one thing, you should use version control because if you don't, <strong>you won't be able to recover from mistakes in your code</strong>.  For another, you should make these changes in your IDE and test them locally before deploying, to avoid the pesky problem of<strong> your entire site is down because of a misplaced semicolon</strong>.  Also, you should first <a href="https://www.smashingmagazine.com/2016/01/create-customize-wordpress-child-theme/" target="_blank" rel="noopener">create a child theme</a> to avoid this inevitable situation: <strong>your code is erased the next time you update your theme.</strong>  </p>



<h3 class="wp-block-heading" id="custom-plugin-the-proper-proper-way">Custom Plugin: the proper, proper way</h3>



<p class="wp-block-paragraph">Navigate to your plugins folder and add a new folder.  I'd usually name it after the domain of the site and use this as a repository for all custom code specific to your domain, but you can call it anything.  You can also optionally add a file in that folder called <strong>README.md</strong> to add documentation to your custom code.</p>



<p class="wp-block-paragraph">The important thing is that, in that folder you also have a file with the same name as the folder with the suffix <strong>.php</strong> to serve as the core code of your custom plugin.  At the top of that plugin, add some information about your plugin that will describe your plugin to any admin-level users of your site.  Here's what mine looked like:</p>



<pre class="wp-block-code"><code>&lt;?php
/**
 * Plugin Name: Town Calendar Custom Functions
 * Plugin URI: https://www.towncalendar.org/
 * Description: Custom Functions for townCalendar.org
 * Version: 1.0
 * Author: Demian Perry
 * Author URI: http://www.towncalendar.org
 */</code></pre>



<p class="wp-block-paragraph">Immediately after this code, add the shortcode function we were working with earlier, with <strong><em>two important modifications</em></strong>:</p>



<pre class="wp-block-code"><code>add_shortcode( 'rr', 'remoteRequest');
function remoteRequest($atts){
        $route = $atts&#91;'r'];  //passed from shortcode
        $url = 'https://WWW.YOURSITE.COM' . $route;
        $request = array(
                'method' =&gt; 'GET',
                'timeout' =&gt; 10,
                'redirection' =&gt; 10,
                'blocking' =&gt; true,
                'headers' =&gt; array(),
                'cookies' =&gt; array(),
        );
	$response = wp_remote_request($url, $request) or die ('request failed.');
        if (array_key_exists('body', $response)){
                return $response&#91;'body'];
        } else {
                return print_r($response);
                //return 'Events app took too long to load.  Refresh the page to see events.';
        }
}</code></pre>



<p class="wp-block-paragraph">The two changes are:</p>



<ol class="wp-block-list"><li>I added <strong>WWW.YOURSITE.COM </strong>to the remote request url.  This has the drawback of limiting embeds to just your site.  We do it because it gives you control over performance and security.  And you can always create simple, custom proxies that will allow your editors to embed from another site.  All they have to do is talk to you.  And that's the point.</li><li>I added better error handling to the bottom.  The code already had error-handling for a complete failure of the script, but the more common issue is a timeout and this new code will more gracefully fail for the user.</li></ol>



<p class="wp-block-paragraph">To make this code active on your site, simply go into your admin dashboard and <strong>activate the plugin</strong>.  Then add the shortcode to any page where you'd like to add an embed.  Remember that, with your domain hard-coded into the plugin, you no longer need to use the url in the shortcode, so you can use a relative url to the page you want to embed: <strong>[rr r="/api?user=me"]</strong></p>



<h2 class="wp-block-heading" id="see-the-code-in-action">See the code in action:</h2>



<p class="wp-block-paragraph">I'm using this exact code on my website <a href="https://towncalendar.org/events/" target="_blank" rel="noopener">towncalendar.org</a> to allow users to interact with events that have been selected by a python algorithm.  Take a look at the embed at the link above (click the picture to see it in action).  Note how quickly it loads, and how it is fully interactive.  Real gear-heads will also note that the code piggy-backs both on my wordpress CSS and on the jQuery script at the top of my site, rather than loading it twice (as the two not-so-proper solutions would do).</p>



<p class="wp-block-paragraph">Happy embedding!</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Serverless wordpress with react and gatsby</title>
		<link>https://demianperry.com/serverless-wordpress-with-react-and-gatsby/</link>
		
		<dc:creator><![CDATA[perrydc]]></dc:creator>
		<pubDate>Sat, 01 Jun 2019 19:37:01 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Design]]></category>
		<guid isPermaLink="false">https://sourcewolf.com/d/?p=1491</guid>

					<description><![CDATA[Writing your first React script can make you feel like a boat rowing against the current, borne back ceaselessly into the past.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">A combination of <a href="https://booyaa.wtf/2019/gatsby-wordpress-setup/" target="_blank" rel="noopener">booya&#8217;s</a> approach and <a href="https://www.iamtimsmith.com/blog/how-to-build-a-blog-with-wordpress-and-gatsby-part-2/" target="_blank" rel="noopener">Tim Smith&#8217;s</a>.  Before beginning, you will want to set up a wordpress site and extend out the restful api with some helpful plugins that are listed <a href="https://github.com/postlight/headless-wp-starter" target="_blank" rel="noopener">here</a> test.  A menu extender, such as <a href="https://wordpress.org/plugins/wp-rest-api-v2-menus/" target="_blank" rel="noopener">WP-REST-API V2 Menus</a> may also be helpful.</p>



<h4 class="wp-block-heading" id="initial-setup">Initial Setup</h4>



<pre class="wp-block-code"><code>yarn global add gatsby-cli</code></pre>



<h4 class="wp-block-heading" id="starting-a-blog-from-scratch">Starting a blog from scratch</h4>



<p class="wp-block-paragraph">Navigate to the directory where you keep all your projects and use the command below to set up a new folder and build it with starter code:</p>



<pre class="wp-block-code"><code>gatsby new blog &#91;optional: URL to git repository of starter template]</code></pre>



<p class="wp-block-paragraph">Let&#8217;s break that down: <strong>gatsby new</strong> tells gatsby to initialize a new site in the folder <strong>blog</strong> and using a specific starter (or <em>template</em> with dependencies and hooks).  You can choose any starter you want, and the Gatsby site has a <a href="https://www.gatsbyjs.org/starters?s=wordpress&amp;v=2" target="_blank" rel="noopener">listing of a few popular starters</a> that already have pre-built wordpress hooks.  Netlify has a <a href="https://templates.netlify.com/tags/gatsby/" target="_blank" rel="noopener">shorter, but more reliable listing</a>.  <strong>Warning:</strong> getting the starter to work with your blog may take some trouble-shooting, so for this first go round you may want to leave this last part blank, since<strong><em> if you do not specify a starter, it&#8217;ll work just fine</em></strong>.</p>



<p class="wp-block-paragraph">Now navigate to that directory and see your blog</p>



<pre class="wp-block-code"><code>cd blog
gatsby develop</code></pre>



<p class="wp-block-paragraph">After a few seconds of Gatsby building your site locally, navigate in your browser to <a href="http://localhost:8000/" target="_blank" rel="noopener">http://localhost:8000</a> and check out your new blog!</p>



<h4 class="wp-block-heading" id="hooking-it-up-to-wordpress">Hooking it up to wordpress</h4>



<p class="wp-block-paragraph">Now we need to go back to terminal and exit out of the process (<strong>ctrl-c</strong>) so we can install dependencies:</p>



<pre class="wp-block-code"><code>yarn add gatsby-source-wordpress gatsby-plugin-sitemap</code></pre>



<p class="wp-block-paragraph">Now, from your favorite text editor (I use <strong>sublime</strong>), navigate to your blog directory and open up <strong>gatsby-config.js</strong>.  From there, you&#8217;ll need to connect to and configure the wordpress plugin by adding this code to the plugin section (just before the closing <strong>]</strong> bracket):</p>



<pre class="wp-block-code"><code>{
      resolve: `gatsby-source-wordpress`,
      options: {
        baseUrl: process.env.WORDPRESS_BASE_URL,
        protocol: process.env.WORDPRESS_PROTOCOL,
        hostingWPCOM: (process.env.WORDPRESS_HOSTING_WPCOM === 'true'),
        useACF: (process.env.WORDPRESS_USE_ACF === 'true'),
        verboseOutput: (process.env.WORDPRESS_VERBOSE_OUTPUT === 'true'),
        auth: {
          wpcom_app_clientSecret: process.env.WORDPRESS_CLIENT_SECRET,
          wpcom_app_clientId: process.env.WORDPRESS_CLIENT_ID,
          wpcom_user: process.env.WORDPRESS_USER,
          wpcom_pass: process.env.WORDPRESS_PASSWORD,
        },
        includedRoutes: &#91;
          "**/posts",
          "**/pages",
          "**/tags",
          "**/categories",
          "**/media",
          "**/taxonomies",
          "**/users",
        ],
      },
    },</code></pre>



<p class="wp-block-paragraph">and you&#8217;ll also have to tell gatsby-config.js to use your <strong>.env</strong> file (which we&#8217;re about to create) by adding the following to the very top of the file:</p>



<pre class="wp-block-code"><code>require('dotenv').config();</code></pre>



<p class="wp-block-paragraph">Now create a new file within your blog directory called <strong>.env</strong> and save it with the following code:</p>



<pre class="wp-block-code"><code>WORDPRESS_BASE_URL=yoursite.com/path
WORDPRESS_PROTOCOL=https
WORDPRESS_HOSTING_WPCOM=false
WORDPRESS_USE_ACF=false
WORDPRESS_VERBOSE_OUTPUT=true
WORDPRESS_CLIENT_SECRET=xxx
WORDPRESS_CLIENT_ID=xxx
WORDPRESS_USER=xxx
WORDPRESS_PASSWORD=xxx</code></pre>



<p class="wp-block-paragraph">Those bottom two lines should just be the username and password you use when logging into wp-admin.  The client_secret and client_id can be found by going to <a href="https://developer.wordpress.com/apps/" target="_blank" rel="noopener">https://developer.wordpress.com/apps/</a>  (You will need to <a href="https://www.knowband.com/blog/user-manual/get-wordpress-api-details-client-id-client-secret/" target="_blank" rel="noopener">create an app</a> for your hosted site if you haven&#8217;t already.)</p>



<p class="wp-block-paragraph">  (You will need to <a href="https://www.knowband.com/blog/user-manual/get-wordpress-api-details-client-id-client-secret/" target="_blank" rel="noopener">create an app</a> for your hosted site if you haven&#8217;t already.)</p>



<p class="wp-block-paragraph">Now you should see that your gatsby blog frontend is connected to your wordpress backend by once again typing <strong>gatsby-develop</strong> into terminal and navigating to the graphql section of your localhost: <a href="http://localhost:8000/___graphql" target="_blank" rel="noopener">http://localhost:8000/___graphql</a></p>



<p class="wp-block-paragraph">Now that you&#8217;ve hooked up your blog with the wordpress API, <a href="https://www.iamtimsmith.com/blog/how-to-build-a-blog-with-wordpress-and-gatsby-part-2/" target="_blank" rel="noopener">create components</a> to represent your pages, posts and index.  Booya also covers this, but Tim Smith&#8217;s approach seems less complicated.</p>



<h4 class="wp-block-heading" id="deploy">Deploy</h4>



<p class="wp-block-paragraph">Now we&#8217;re going to publish the site on the web.  All the hip kids are using netlify, so go ahead and set up an account there.  Once you&#8217;ve done that, go into your blog&#8217;s gatsby folder and install gatsby-cli there as well:</p>



<pre class="wp-block-code"><code>cd blog
yarn global add gatsby-cli</code></pre>



<p class="wp-block-paragraph">Next we&#8217;ll get our version number and pop that into our .nvmrc file to let netlify know which version we&#8217;re using:</p>



<pre class="wp-block-code"><code>node -v
nano .nvmrc</code></pre>



<p class="wp-block-paragraph">Add the version number (without the v) and save the file (ctrl-x).  If the output of <strong>node -v </strong>was <strong>v10.15.3</strong>, your .nvmrc file should look something like this:</p>



<figure class="wp-block-image"><img decoding="async" src="https://sourcewolf.com/d/wp-content/uploads/2019/07/Screen-Shot-2019-07-07-at-8.22.17-PM.png" alt="" class="wp-image-1515"/></figure>



<p class="wp-block-paragraph">Before deploying, we need to save this project in git.  And before we do that, we need to make sure we don&#8217;t publish the keys to our blog to the world.  This isn&#8217;t an issue if you&#8217;re using a private repository, but otherwise, make sure to add <strong>.env</strong> to your <strong>.gitignore</strong> file.  </p>



<p class="wp-block-paragraph">Now <a href="https://gitlab.com/projects/new" target="_blank" rel="noopener">Add a new project</a> to gitlab (don&#8217;t tick the readme button) and then follow the initialize instructions on the next screen under <strong>Push an existing folder</strong>.</p>



<p class="wp-block-paragraph">Login to netlify and click the <strong>New site from git</strong> button.  Follow the instructions to link it to the repository you just created.  Then change the <strong>Build command</strong> to <strong>gatsby build </strong>and hit the <strong>New variable</strong> button 9 times to add the variables in your .env file.  <strong>Be careful to get the whole line when you&#8217;re copying variables, particularly  WORDPRESS_CLIENT_SECRET, which is long. </strong>  Before you hit deploy, make sure your screen looks something like this:</p>



<figure class="wp-block-image"><img decoding="async" src="https://sourcewolf.com/d/wp-content/uploads/2019/07/Screen-Shot-2019-07-07-at-4.58.53-PM.png" alt="" class="wp-image-1510"/></figure>



<p class="wp-block-paragraph">Now you may click deploy and see your site live.  <strong>Huzzah!</strong></p>



<p class="wp-block-paragraph">(If the deploy doesn&#8217;t work your first go round, go to <strong>sites</strong> -&gt; <strong>deploys</strong> and click the <strong>Trigger deploy</strong> button.  This will give you a handy output that you can follow to read the error.)</p>



<h4 class="wp-block-heading" id="webhook-to-netlify">Webhook to netlify</h4>



<p class="wp-block-paragraph">Similar to the booyah&#8217;s approach, but hosted wordpress admins should go to the <strong>writing options</strong> section in wp-admin and then add the webhook url in the <strong>update services</strong> box.</p>



<h4 class="wp-block-heading" id="troubleshooting">Troubleshooting</h4>



<p class="wp-block-paragraph">In case you get the error <strong>Something is already running at port 8000</strong> it&#8217;s because you need to kill whatever process is currently at that port.  Here&#8217;s a good way to do that:</p>



<pre class="wp-block-preformatted">kill -9 $(lsof -i TCP:8000 | grep LISTEN | awk '{print $2}')</pre>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Page Caching using Disk: Enhanced 

Served from: demianperry.com @ 2026-06-24 14:13:14 by W3 Total Cache
-->