Corruption

Corruption

“ERROR FILE CORRUPT” pinged onto the computer screen.

‘Yeah, no shit,’ said Taylor.

He tapped the escape key, activating a dull pain in his finger. Taylor leaned back in his chair absentmindedly massaging the offending digit.

He scrolled through the programming script weighing his options and thinking about what strategy he’d use to extract the surviving data from the corrupted file.

He stretched his limbs, feeling something pop in his shoulder and muttered:

‘Fuck me. I’m falling apart.’

He lurched from his swivel chair and walked to the fridge in the kitchen.

Bending over he opened the door. The internal light failed to ignite.

‘Oh FUCK me!’

He pulled the phone from his pocket and tapped on the flashlight. He rooted around inside the fridge until he found what he was looking for.

Slumping harder than he had intended back into his swivel chair, causing it to rock, he tugged at the meat stick wrapping. Once freed he tore a chunk from the processed flesh with his teeth and chewed laboriously. Cracking open his caffeinated energy drink he took a gulp, marinating the cold ground meat in his mouth and sloshed both into a sugary meat soup before swallowing.

Taylor opened a media player on his computer and selected his go-to late- night album. He pulled earphones down onto his head, not in an act of consideration for the neighbours but rather as a means of total immersion. He wanted to isolate himself from the surrounding bedsit. The death metal blared through his ear canals, penetrating his skull. He knew he was probably going to regret the tinnitus he had already begun to show symptoms of when he was an old fucker years from now trying desperately to wrestle with it for sleep. But this was his process. And it worked.

Taylor opened up his Tor darkweb browser and punched in the address to the forum he frequented. There was no autofill suggestion; he was too careful for that. The forum was a place where he was free from the bullshit of corrupted files. The forum was a space where he could indulge his latest fancy. The forum was his playground away from the real world. A place where he had control.

Taylor started a new thread and took a moment to consider the title. Eventually he typed:

Society is Corrupted

In the description Taylor typed out a rant thematically similar to the many other diatribes he’d posted:

Be me. In my 30s. I’m sitting at my computer working on the latest dogshit assignment I’ve been hired for. A corrupted file. Cucks can’t even backup original before moving to new drive. “Use the fucking cloud you god-damn fucking idiots.” I yell at screen. I stretch my arms and legs because I’m an old as fuck coder. My shoulder makes a weird popping sound. My body needs defragging. Makes me think about  society and how fragmented it is.  All the factions.  All  the bullshit. The libs, the fake news…

And so on went Taylor’s pseudo-insightful, regurgitated ramblings. On some level he knew he was scratching a deep, dark itch that was base. On some level he knew he was submitting to his arrested developed self. But this level was subterranean. These inane ramblings of his were read and supported by the community on the forum.  They made him feel important.  Like he was seeing  the world for what it was and was calling it out right here in his time. He didn’t see himself as one of the more radical users of the forum;  those that talked of actually carrying out mass shootings or racist inspired killings. No, he saw himself as more of a messenger. He did however take pleasure in encouraging  the more radical users, pushing them to post ever more extreme content. It was all a bit of a game… but he even had to admit to himself he found a thrill in seeing the results in the news when one of the crazy bastards from the forum followed-through and carried out their threat. It made him feel relevant. He and his community had an effect on the world. It made him feel seen.

‘Take a look at your shoulder…’ came the first comment on his thread from another anonymous user Anon356891391.

Taylor smirked and responded:

‘You’re not my mother, Anon. Or, I’d guess, a doctor for that matter.’

Taylor sat back, music assaulting his ears, and took a swig from the now room temperature energy drink. The thread updated.

‘Be me. Be a qualified MD. A rheumatologist. Tell a yahoo to take a look at their shoulder as popping can indicate a rotator cuff tear, or even bursitis. Be me waiting while said yahoo Bings ‘bursitis’.’

Taylor laughed. He liked the cut of Anon. The layered dig about searching the meaning of the word and using Bing spoke to him. Taylor pulled up Duck Duck Go and searched Anon’s medical terms.

Taylor rubbed his shoulder while reading the various symptoms. Anon might just be onto something.

He took off his headphones, lurched from the chair and walked to the bathroom. He pulled on the dangling chord and squinted through the explosion of light. He pulled his T-shirt over his head and rotated his torso 80 degrees to his hips and looked at his shoulder.  It was red from where he’d been rubbing it but there was no obvious swelling. Anon was full of shit.

Taylor loosed a primal cry of revulsion and fear, stumbling away from the mirror,  falling backwards into the bath. He slapped his head against the tile wall with a sickening thopp.

‘What the fuck…?’ he gasped through rapid breaths.

Blotchy lights popped in-and-out of existence in his vision and a wave of nausea coursed through him. He raised a hand and felt the back of his head. It was sopping wet with sticky, bloody hair.

‘Jesus.’

Taylor pulled his legs fully into the bath and contrived to climb back out. Unsteady on his feet he presented himself in front of the mirror once more and steeled himself through his grogginess. One hand holding the sink for support, he rotated his torso again and looked at the blood flecked skin on the back of his shoulder.

‘Oh Jesus.’

He hadn’t imagined it. His skin was pulsating. He leaned closer to the mirror, his breath steaming it up. He dragged his hand through the condensation, leaving a bloody, translucent, smear, and held his breath. No question. There  was something beneath the surface of his skin; squirming.

Taylor turned on his heal and nearly accomplished an approximation of a run back to his computer. He swayed wildly with flailing steps like the pissheads he liked to watch and mock from his third floor window. He rapidly typed on his keyboard while fighting the onslaught of nausea and a shiver that threatened to double him over.

He pressed send and the text appeared in the thread:

‘Thre’s fukcing somethnig undr my skin! What te fuck?!!1’

He sat back in his chair and fought with every fibre in his being not to touch his shoulder. He pawed around until he found the roll of tissue he kept beside his hand-cream and unspooled a large wad. He pressed his head into the tissue against the chair’s headrest. Fuck, what a mess, he thought.  Mercifully he couldn’t feel whatever it was  squirming in his flesh. He dragged on his headphones again, cranking up the volume.  He began rocking in the chair and compulsively massaged the ache in his finger.

The thread updated.

‘Be me. Be a qualified MD. Be concerned about your head trauma. Do I have your attention now?’

Taylor couldn’t make sense of what he was reading. He’d seen so much fucked-up shit on this forum. Shit that caused him to wake in a cold sweat. Shit that no one should ever, ever have to see. But this, this was something different. A thought partially materialised in his foggy mind. He tore a piece of the bloody toilet roll from behind his head and stuck it over the camera on his computer.

Tears clouded his vision and he typed again. More deliberately this time.

‘What the fuck is this, Anon? You hacked my cam? Stop fucking around. I’m bleeding. There’s something under my skin for Christ sake!’

Taylor waited again.  He began to sob quietly.  He didn’t deserve this. He was a good guy really…  He had himself quite convinced of all of this despite the mountains of evidence to the contrary.

The thread updated.

‘Be me. Be a qualified MD. Be concerned about that finger.’

Taylor stifled a cry and looked at the finger he’d been obsessively massaging while staring at the screen. He now realised that it had gone numb. He stopped rubbing it and prodded it. Nothing. Not even that almost nothing dull-numbness that comes with pins-and-needles. There was no sensation at all.  It felt like he was touching someone else’s finger.

He again began to massage the finger, desperately trying to bring sensation back to it. Skin came away with the stroke of his thumb. He sat in disbelief at what he was seeing. He had unsheathed the skin halfway along his finger. He instinctually pulled it back along the blood and sinew but the tip of his finger-bone punctured the freed skin and it slid and rolled back like a foreskin passed his knuckle. Taylor asthmatically gasped for air. He got to his feet quickly pulling away from his desk. Forgetting he was tethered by his earphones he wrenched the jack from the speakers and death metal thrashed to life from his overly expensive speakers. He stumbled backwards holding his hand and fell on his ass hard. There was a thunderous crack that cut through the music.

Taylor didn’t want to know what the sound was. He lay in a puddle of blood and despair. The room was violently quiet during the void in musical time between tracks. The death metal resurged. Taylor opened his eyes and looked at his person. He began to laugh. A laugh of those whose minds are fracturing. His shin bone protruded from his right leg. Aside from the strands of flesh clinging to it, it almost glowed white in the dark room.

Taylor laughed and cried until he could do either no more. He reached for the power cable to the speakers and yanked it from the socket. The music instantly vanished. He could hear his breathing clearly now. He could hear the bones in his leg grating as he moved himself upright. Why didn’t it hurt? What the fuck was this?

Taylor pulled himself towards his chair and climbed back into it with considerable effort. He sat panting and looked at the screen again. He typed with his good hand and pressed send.

‘Who are you?’

He lifted his left hand. His unsheathed finger hung limply. He examined it closely and watched in horror as the skin slid off it and struck the keyboard with wet splat.

‘Ha!’

He stared at the shapeless flesh on the keyboard and glanced at his finger-bone before returning to the thread. It had yet again updated.

‘Be me. Be a qualified MD. Be pissed off.’

Taylor began muttering to himself. Every cuss or slur he’d learned and deployed over  the years spilled from his mouth in a torrent of filth and rage. He typed rabidly as teeth and saliva skittered and slopped from his mouth onto the keyboard. He ranted, fuelled by hate and bile as his jaw sagged. He pressed send just as the hinges of his jaw detached and his chin sagged stretching the skin downwards with it. At the end of the rant he posted he simply asked:

‘…why me?’

Taylor’s chin rested on his gut. His breathing rattled. His hands moved no more. His eyes began to blur but before they fully liquefied and oozed from their sockets he read:

‘Be me. Be us. Be witness to your effect on this world. We see you, Taylor. We see all of you. We are waiting. Be laid to waste.’

The Between

The man sprinted in bursts between steady runs to replenish his breath for the next dash. The leaf covered ground was wet and uneven. Branches whipped at his face as he panted, shielding himself with his arms as best he could. Sweat glazed his face and condensed tendrils trickled downward as he wiped them away from his eyes. He was cutting this too fine. The glow from the moon was barely sufficient to light his path through the dense woods, but he knew the terrain well. How he had found himself so far from home on foot at such a late hour was beyond him. He wasn’t normally this careless. He knew only too well that things could get complicated if he wasn’t there when the time came.

He emerged from the woods panting and took a moment to catch his breath. Condensation escaped from him into the night as he stood with his hands on his knees atop the sloping field. The stars chattered in their gibberish Morse-Code and he couldn’t help but pause, time he didn’t have, to let them wash over him. Every time he looked upon the boundless expanse of the night sky he felt as though it was the first time he’d set eyes upon the heavens

He stood upright and felt the stab of a stitch in his ribs.

God damn it.’ he said and broke into a run down the slope.

He slipped once, his feet rushing away from him causing him to fall on his ass. He painfully pushed himself to his feet again and continued his run.

He ran across the grassy field, into and through a corn field, and had to skirt around the edges of a ploughed field before finding the gate he sought. He climbed over it and ran down the tarmacadam road hoping he wouldn’t meet any traffic. His boots began to hurt his feet with each footfall on the hard surface. Mercifully the night air was refreshing against his face, a cool breeze helping him along his way.

He rounded a bend and saw it in the distance; his house. There were no lights on. He might just make it.

He made one final push and ran until his ribs screamed bloody-murder. He crashed through the small gap in his decorative hedge and slammed into the back door of the house harder than he had intended. Gasping, he bent down and with hands shaking overturned the duck-shaped stone where the key was concealed. He unlocked the door, stumbled inside, and flicked on the lights in the kitchen. He stood, head bowed, leaning on the kitchen worktop fighting to consume as much oxygen as he could. Finally, he had drawn sufficient air into his lungs and blood that he could breathe through his nose with deep, slow intakes of breath. He stood upright as sweat appeared to explode from every pore now that the night air wasn’t there to counteract his overheating body. The knock at the front door came. He composed himself, straightened his coat, and walked towards the nocturnal visitor. Remembering the mirror on the hall stand he removed and tossed his coat over it. He turned on the doorstep light.

‘I don’t have all night you know,’ said the voice on the other side. 

The man smiled to himself and opened the door.

‘Evenin’, son,’ he said and embraced him tightly.

‘Geroff.’ said the boy. `Had a few sups of whiskey, eh?’

The man released his son and held him at arms length.

Aye, I suppose that’s what it is. It’s good to see you, boy.’

Yeah, yeah. I know I’m running late, dad. No need to take the piss.’

The man let his son pass and closed the door.

Good night son? Get up to anything interesting?’ he said.

The boy thought for a moment and began to take his coat off.

‘Ah, you know. This and that,’ he said.

The man nodded to himself. The boy never could say with any great detail what he’d been up to. It was probably better that way.

TAB TAB TAB TAB
TAB TAB TAB TAB TAB TA             ***

Francis sat on a stool at the worktop in the kitchen as his son Jason busied himself. He watched his teenage boy fail to conceal the effects of the alcohol he’d illicitly consumed on his night out as he made a crisp and butter sandwich. Francis wasn’t going to reprimand the boy for doing the very thing he himself had done at that age – not anymore at least. Jason was oblivious to just how Francis was watching him. Had he been sober he might have realised his father was on an emotional precipice, deeply moved by the mundane actions of his boy preparing himself some food. Francis was glad for the foggy disposition of his boy. He imagined it played its part in Jason’s ritual – keeping him centred. Francis rubbed his throat, the chaffed feeling always seemed to accompany Jason’s arrival.

Jason sat opposite his father and crunched into the sandwich, biting more than half of it away. He chewed laboriously as the bread and crisps compacted into his cheeks, comically bulging them out of shape. Francis smiled at his son. His eyes wandered to the deep gash on Jason’s left temple. Francis moved his gaze back to the sluggish eyes of his mildly intoxicated boy.

‘So, any scandal or craic from your night out?’ asked Francis.

Jason chewed noisily and swallowed, chasing the food with a gulp of tap water from a glass.

‘Noh, not much really. Just met the lads and went to the club. Usual stuff.’

That’s good, son.’

‘I missed the bus mind you. I got a lift with Duggy from down the road.’

‘Is that right?’ said Francis in a monotone.

‘Aye, but I tell ya what, I’ll not do that again. He’s a mad man on the roads. There was a rake of us in the back seat so not enough belts to go ’round. The craic was good, but it wasn’t safe, ya know? And don’t go giving me a bollockin’ either, I know it was stupid. I’ll not do it again. Can’t remember getting to the house, mind, all a bit of a blur.’T

‘Aye, fear’ll do that to ya.’ said Francis.

This part of the conversation was always the most delicate.

‘Who said I was afraid?’ said Jason.

‘It was either the fear, or the drink,’ said Francis with a smile.

Seein’ as I’m too young to drink, it musta been the fear, so,’ said Jason.

Francis got to his feet and lifted Jason’s plate and glass and walked to the sink.

‘Right, off to bed with ya,’ he said.

Alright, da. I’ll see ya in the mornin’,’ said Jason.

‘Give your aul man a hug before you hit the hay.’

‘Ah, forsucksake,’ said Jason as he threw his arms around Francis.

‘Love ya, da. G’night.’

Francis squeezed his boy hard and his chest swelled.

‘Goodnight, son,’ he said.

He released Jason from the embrace and watched him leave the kitchen, and listened to him ascend the staircase to his bedroom.

Francis washed the dishes and sat himself in his armchair by the stove and waited. Once Jason was settled Francis took a chair from the kitchen at went upstairs. He opened Jason’s bedroom door just enough and sat on the chair in the hallway. He watched over his boy who lay peacefully in his bed. Sleep called for Francis but he resisted as best he could. He had a flash of his boy in that same room but instead of a bed he lay in a coffin. The gash on his head professionally filled in. Francis awoke with a start and looked to find Jason. His bed was empty. Francis’ watch was ended once more. He lifted the chair and walked back down to the kitchen sitting himself back into the armchair. Francis rubbed at the chaffing on his neck, absentmindedly. The stove only gave off a bit of warmth now, but it was enough to carry Francis into a sleep in-between whispering sobs.

TAB TAB TAB TAB TAB TA             ***

The man sprinted in bursts between steady runs to replenish his breath for the next dash. How he had found himself so far from home on foot at such a late hour was beyond him.

 

Loving Both.

Another day, another foetus saved! Well, sort of. I mean, it did die in the end. The poor wee thing was always going to. Its heart was developing partially outside its body and there were other complications that meant it couldn’t possibly survive outside the womb. But, that’s not really the point is it? The great nation state of Ireland has enshrined in its constitution the right to life of the unborn child. It’s the obligation of us on the front lines, us legal-folk, to ensure that that right is protected, at all costs.

Of course, the costs were pretty high today. The mother didn’t fare too well either. She’d come into the hospital a few days before, complaining of abdominal pains. After an ultra-sound it was determined that the baby wasn’t likely to make it but that it had a heartbeat. Bingo! I received a call once the carrier and her husband requested an abortion. Imagine, thinking you could decide to have an abortion just like that! Not on my watch! By the time I’d arrived on the ward with my documents to explain why there was no way there would be an abortion while the child had a heartbeat, it turned out that there were some further complications. The carrier had a severe case of pre-eclampsia. She was at risk of organ damage and even a stroke. The medical staff were beside themselves. They wanted to help the carrier but knew they’d be breaking the law if they did. Still, the foetus was fighting on, and so would I.

Her husband just didn’t seem to get it. I mean, it was his baby we were protecting after-all. He kept pleading and saying things like ‘My wife is here now. She already has a life, an effect on the world. She’s part of a family!’. He was clearly hysterical or something. But, it did give me a moment for pause. What if he had a point? In our noble efforts to protect the unborn child, what if we were putting the foetus’ carrier in harms way? Maybe the carrier could be seen as more, like maybe a person? A person who lives a life. Who has an effect on the lives of others. Who is a part of this
world, a community, and maybe should have more rights than a hypothetical life, that admittedly wasn’t so hypothetical since the foetus was on borrowed time. Maybe the husband had a point when he screamed until he was red in the face that his wife should be able to do as she pleases with her body, especially to protect herself from harm.

All those thoughts flittered through my head in a matter of seconds. But then I remembered the infallible truth of the constitution. We are, I am, the soldier on the front line protecting the unborn from the deeds of the living. I had a job and I would do it. Mind you, the carrier’s children didn’t seem to understand that position either. All they seemed to do was cry. I had to leave the ward for a while and take a long coffee break in my office.

I ended up having three cups of coffee. I found myself imagining what it would be like if it was my wife in that hospital bed. Would I enforce the constitution without hesitation? I tried to imagine her getting sicker and sicker and waiting for the foetus’ heart to stop before allowing her proper treatment. I had to shake myself out of it. It wasn’t my wife, and I had a job to do. Still though…

Anyway, a long story short, it turned out the carrier had a stroke and her liver and kidneys were severely damaged. She’s in a coma at the moment. The doctors think she’ll probably have life changing brain damage, if she makes it. The foetus died shortly after her stroke, and labour was induced. It’s a sad outcome, but I did the right thing. Didn’t I? I followed the letter of the law. I protected and respected the life of the unborn. Sure, it says that we have to have equal regard for the right of the mother to life, but we both know that it’s virtually impossible to juggle both. I hope it’s a long while before I have to fight the good fight again. It doesn’t really make you feel great about yourself. Who’d want to be working with constitutional law like us legal-folk in this country, am I right!?

EggHatch – a function for easy pattern addition in ggplot2 bar plots.

So, when I had a little time a few months ago I started coding a wrapper function for ggplot2 in R, with the aim of making it a straight forward process when adding 3 basic patterns (hatching) to ggplot2 bar graphs.

Here’s the original answer I provided to the question posed on StackOverflow.

As you can see it’s a little cumbersome.

Anyway, below is the function ‘EggHatch’ (Easy ggplot2 Hatch) that I wrote to make the process a lot easier.

NOTE 1: All patterns work with a regular single plot of bar/s, however, I haven’t found the time to make the diagonal patterns work with facet_grid in ggplot2. The horizontal and vertical patterns do work with facet_grid.

NOTE 2: The following libraries should be installed in order to use this function:


install.packages('Epi')
install.packages('stringi')
install.packages('plyr')
install.packages('gtools')
install.packages('stringr')

NOTE 3: I’ve added example data and some instructions on how to use EggHatch further down the page.

# Written as part of an answer for a question posed here:
# https://stackoverflow.com/questions/2895319/how-to-add-texture-to-fill-colors-in-ggplot2/20426482#20426482
# Please add a vote to the original answer linked above if you find this
# function useful.
EggHatch <- function(ggplot2_plot, cond.list, width_Man = NULL){

    # use this for Relevel
    library(Epi)
    # default relevel to avoid index issue
    ggplot2_plot$data$Variable = Relevel(ggplot2_plot$data$Variable, ref = c(ggplot2_plot$data$Variable))

    print("When choosing patterns ensure that scaling does not obscure horizontal lines. Should horizontal lines be obscured consider a different pattern (A, C, D, or any combination of them.)")
    # if statement for when no value input in 'fill'
      library(stringi)
      library(plyr)
      library(gtools)
      library(stringr)

      input_position_dodge<-ggplot2_plot$layers[[1]]$position$width
      input_colour<-ggplot2_plot$layers[[1]]$aes_params$colour
      fill_value<-ggplot2_plot$layers[[1]]$aes_params$fill
      input_size<-ggplot2_plot$theme$rect$size
      input_width<-ggplot2_plot$layers[[1]]$geom_params$width

      # remove any spaces, tabs etc. from input string
      cond.list<-stri_replace_all_charclass(cond.list, "\\p{WHITE_SPACE}", "")

      # list of conditions input by users
      string_split1<-strsplit(cond.list, ",")[[1]]

      # Dataframe shaped to match number of patterns and conditions entries
      df <- data.frame(matrix(ncol = 2, nrow = length(string_split1)))
      colnames(df) <- c("Pattern", "Condition")

      pattern_options <- c("A", "B", "C", "D") 

      BAR_OUTPUT1<-ggplot2_plot
      BAR_OUTPUT<-BAR_OUTPUT1

      for (pos in 1:length(string_split1)){

        # seperate pattern from input condition into list, dropping '='
        cond_patterns <- as.list(strsplit(string_split1[pos], "=")[[1]])

        # write values to relevant colomns on current row
        df$Pattern[pos]<-cond_patterns[1]
        df$Condition[pos]<-cond_patterns[2]

      }

      # find largest mean value and pass 2% of it
      two_percent_of_largest_mean<-((max(unlist(lapply(ggplot2_plot$data$Value,FUN=max)))/100)*2)

      # loop around for number of conditions
      for (pos in 1:length(df$Condition)){

          Condition_Pos=0

        # split pattern into individual characters
        pattern_split_loop_var<-as.character(df$Pattern[pos])
        pattern_split_loop_var<- strsplit(pattern_split_loop_var, "")[[1]]

        if(grep("A|B|C|D", df$Pattern[pos], ignore.case=TRUE)){

          if ((grepl('A', df$Pattern[pos], ignore.case=TRUE))){

            # get 25% of original width
            vert_bar_count = (((ggplot2_plot$layers[[1]]$geom_params$width)/100)*10)
            Condition_Pos<-as.numeric(df$Condition[pos])

            for (i in 1){

              if (is.null(fill_value)){

                BAR_OUTPUT<-BAR_OUTPUT+geom_bar(data=BAR_OUTPUT$data[Condition_Pos,], position=position_dodge(input_position_dodge), stat="identity", colour=input_colour, size=input_size, width=(ggplot2_plot$layers[[1]]$geom_params$width))

              }

              if (!is.null(fill_value)){

              BAR_OUTPUT<-BAR_OUTPUT+geom_bar(data=BAR_OUTPUT$data[Condition_Pos,], position=position_dodge(input_position_dodge), stat="identity", colour=input_colour, size=input_size, width=(ggplot2_plot$layers[[1]]$geom_params$width),fill=fill_value)

              }

              # loop 4 times
              for (i in 1:((ggplot2_plot$layers[[1]]$geom_params$width)/vert_bar_count)){

                # when calculating the number of times to loop and draw consider making value = bar width
                # additionally consider add a verticle line '0' by default. Should get around any
                # stepping outside range
                # alternative just draw a line on each unit on the x-axis inside bounds of bar: number at given
                # point (x-axis label) then either side of number, for example:
                # geom_vline(xintercept=c(1.5,2.5, 10.5), linetype="dotted", size=.8)
                #
                # ensure the Condition_Position value is correct here
                BAR_OUTPUT<-BAR_OUTPUT+geom_bar(data=BAR_OUTPUT$data[Condition_Pos,], position=position_dodge(input_position_dodge), stat="identity", colour=input_colour, size=input_size, width=(ggplot2_plot$layers[[1]]$geom_params$width)-vert_bar_count, fill='transparent')
                vert_bar_count = vert_bar_count + (((ggplot2_plot$layers[[1]]$geom_params$width)/100)*10)#((ggplot2_plot$layers[[1]]$geom_params$width)/4)

              }
            }

            if ((grepl('B', df$Pattern[pos], ignore.case=TRUE))){  

              point_1_percent_of_current_mean <- ((BAR_OUTPUT$data$Value[Condition_Pos]/100)*.1)                              while((BAR_OUTPUT$data$Value[Condition_Pos])>=two_percent_of_largest_mean){ 

                # this breaks while loop to prevent going below x-axis 0
                if(((as.numeric(BAR_OUTPUT$data$Value[Condition_Pos]))-(ggplot2_plot$data$Value[Condition_Pos]/100))<0){

                  break

                }

                BAR_OUTPUT$data$Value[Condition_Pos]<-(as.numeric(BAR_OUTPUT$data$Value[Condition_Pos]))-two_percent_of_largest_mean

                # This stops line very close to 0 on y-axis
                if(((BAR_OUTPUT$data$Value[Condition_Pos])<((two_percent_of_largest_mean/100)*15))){

                  break

                }

                BAR_OUTPUT<-BAR_OUTPUT+geom_bar(data=BAR_OUTPUT$data[Condition_Pos,], position=position_dodge(input_position_dodge), stat="identity", colour=input_colour, size=input_size, width = ggplot2_plot$layers[[1]]$geom_params$width, fill='transparent')

              }

            } # end of sub grepl 'B'

            if ((grepl('C', df$Pattern[pos], ignore.case=TRUE))){

              # Code for diagonal C
              position_input_x<-as.numeric(df$Condition[pos])
              position_input_y<-as.numeric(df$Condition[pos])
              # half of input width
              # when minused from centre of bar point on x-axis
              # it gives value at start of bar on x-axis
              # inverse true for end of bar width
              half_input_width<-input_width/2
              ten_perc_input_width<-((input_width/100)*10)

              x_axis_min <- position_input_x-half_input_width
              x_axis_start_top<-x_axis_min
              x_axis_start_bottom<-x_axis_min
              x_axis_max <- position_input_x+half_input_width

              y_axis_max<- ggplot2_plot$data$Value[position_input_y]
              # need to pull the max value from the example_plot the max boundries...
              # or caluclate the
              z_percent_of_current_mean<-(y_axis_max/100)*10

              df_diag <- data.frame(

                # start on x-axis-end on x-axis
                x = c(x_axis_start_bottom,x_axis_start_top),

                # start on y-axis-end on y-axis
                y = c(y_axis_max,y_axis_max), Fill='Hope you\'re having a nice day.')

              for(i in 1:19){

                # run if 2nd x-position is less or equal to rightmost edge of bar
                # minus 10% of total input width
                if (df_diag$x[2]<(as.character(x_axis_max))){

                  # 1/10 of unit value in width field
                  df_diag$x[2]<-df_diag$x[2]+(ten_perc_input_width)

                  # subtract z percent from 1st y height
                  df_diag$y[1]<-df_diag$y[1]-(z_percent_of_current_mean)

                  # draw using current df_diag values
                  BAR_OUTPUT<-BAR_OUTPUT+geom_path(data=df_diag, aes(x=x, y=y),colour = "black")

                } # end of if statement when less than x_axis_max

                # run this code to limit 2nd x-point from moving past rightmost edge of bar
                if (df_diag$x[2]==as.character(x_axis_max)){

                  # drop height of 2nd y-position by z percentage
                  df_diag$y[2]<-df_diag$y[2]-(z_percent_of_current_mean)

                  if(df_diag$y[1]<=z_percent_of_current_mean){

                    df_diag$x[1]<-df_diag$x[1]+ten_perc_input_width
                  }

                  BAR_OUTPUT<-BAR_OUTPUT+geom_path(data=df_diag, aes(x=x, y=y),colour = "black")

                } # end of if statement when x_axis_max reached

              } # end of for loop 1:19

            } # end of sub grepl 'C'

            if ((grepl('D', df$Pattern[pos], ignore.case=TRUE))){

              # Code for left leaning diagonal 'D'
              position_input_x<-as.numeric(df$Condition[pos])
              position_input_y<-as.numeric(df$Condition[pos])
              # half of input width
              # when minused from centre of bar point on x-axis
              # it gives value at start of bar on x-axis
              # inverse true for end of bar width
              half_input_width<-input_width/2
              ten_perc_input_width<-((input_width/100)*10)

              x_axis_min <- position_input_x-half_input_width
              x_axis_max <- position_input_x+half_input_width
              y_axis_max<- ggplot2_plot$data$Value[position_input_y]
              # need to pull the max value from the example_plot the max boundries...
              # or caluclate the
              z_percent_of_current_mean<-(y_axis_max/100)*10

              df_diag <- data.frame(                                  # start on x-axis-end on x-axis                 x = c(x_axis_max,x_axis_max),                                                   # start on y-axis-end on y-axis                 y = c(y_axis_max,y_axis_max), Fill='Hope you\'re having a nice day.')                                            for(i in 1:19){                                  # run if 1st x-position is less or equal to leftmost edge of bar                 # minus 10% of total input width                 if (df_diag$x[2]>(as.character(x_axis_min))){

                  # 1/10 of unit value in width field
                  df_diag$x[2]<-df_diag$x[2]-(ten_perc_input_width)

                  # subtract z percent from 1st y height
                  df_diag$y[1]<-df_diag$y[1]-(z_percent_of_current_mean)

                  # draw using current df_diag values
                  BAR_OUTPUT<-BAR_OUTPUT+geom_path(data=df_diag, aes(x=x, y=y),colour = "black")

                } # end of if statement when less than x_axis_max

                # run this code to limit 2nd x-point from moving past rightmost edge of bar
                if (df_diag$x[2]==as.character(x_axis_min)){

                  # drop height of 2nd y-position by z percentage
                  df_diag$y[2]<-df_diag$y[2]-(z_percent_of_current_mean)

                  if(df_diag$y[1]<=z_percent_of_current_mean){

                    df_diag$x[1]<-df_diag$x[1]-ten_perc_input_width
                  }

                  BAR_OUTPUT<-BAR_OUTPUT+geom_path(data=df_diag, aes(x=x, y=y),colour = "black")

                } # end of if statement when x_axis_max reached

              } # end of for loop 1:19

            }

          } # end of if grepl 'A'

          # This runs code when *only* 'B' in string
          if ((!grepl("[^B]", df$Pattern[pos], ignore.case=TRUE))==TRUE){

            Condition_Pos<-as.numeric(df$Condition[pos])
            one_percent_horiz<-(BAR_OUTPUT$data$Value[Condition_Pos])/100
            Twenty_percent_horiz<-(one_percent_horiz*20)

            point_1_percent_of_current_mean <- ((BAR_OUTPUT$data$Value[Condition_Pos]/100)*.1)                          # draw original bar -> avoids any issue with 'fill' and drawing incorrect height
            BAR_OUTPUT<-BAR_OUTPUT+geom_bar(data=BAR_OUTPUT$data[Condition_Pos,], position=position_dodge(input_position_dodge), stat="identity", colour=input_colour, size=input_size, width = ggplot2_plot$layers[[1]]$geom_params$width)                          # drawing lines (via minusing mean) above 0 on y-axis             while((BAR_OUTPUT$data$Value[Condition_Pos])>=two_percent_of_largest_mean){ 

              # this breaks while loop to prevent going below x-axis 0
              if(((as.numeric(BAR_OUTPUT$data$Value[Condition_Pos]))-(ggplot2_plot$data$Value[Condition_Pos]/100))<0){

                break

              }

              # check null value
              if (is.null(fill_value)){

                BAR_OUTPUT$data$Value[Condition_Pos]<-(as.numeric(BAR_OUTPUT$data$Value[Condition_Pos]))-two_percent_of_largest_mean

                if(((BAR_OUTPUT$data$Value[Condition_Pos])<((two_percent_of_largest_mean/100)*15))){

                  break

                }

                BAR_OUTPUT<-BAR_OUTPUT+geom_bar(data=BAR_OUTPUT$data[Condition_Pos,], position=position_dodge(input_position_dodge), stat="identity", colour=input_colour, size=input_size, width = ggplot2_plot$layers[[1]]$geom_params$width)

              }

              if (!is.null(fill_value)){

                BAR_OUTPUT$data$Value[Condition_Pos]<-(as.numeric(BAR_OUTPUT$data$Value[Condition_Pos]))-two_percent_of_largest_mean

                if(((BAR_OUTPUT$data$Value[Condition_Pos])<((two_percent_of_largest_mean/100)*15))){

                  break

                }

                BAR_OUTPUT<-BAR_OUTPUT+geom_bar(data=BAR_OUTPUT$data[Condition_Pos,], position=position_dodge(input_position_dodge), stat="identity", colour=input_colour, size=input_size, width = ggplot2_plot$layers[[1]]$geom_params$width, fill=fill_value)

              }

            }

          } # end of if grepl 'B'

          if ((!grepl('A', df$Pattern[pos], ignore.case=TRUE))==TRUE){
          # Only run this code if 'A' is NOT in string - issue lies in BAR_OUTPUT value
            if ((grepl('C', df$Pattern[pos], ignore.case=TRUE))){

              Condition_Pos<-as.numeric(df$Condition[pos])                              if ((grepl('B', df$Pattern[pos], ignore.case=TRUE))){                 # draw original bar -> avoids any issue with 'fill' and drawing incorrect height
                BAR_OUTPUT<-BAR_OUTPUT+geom_bar(data=BAR_OUTPUT$data[Condition_Pos,], position=position_dodge(input_position_dodge), stat="identity", colour=input_colour, size=input_size, width = ggplot2_plot$layers[[1]]$geom_params$width)

                point_1_percent_of_current_mean <- ((BAR_OUTPUT$data$Value[Condition_Pos]/100)*.1)                                  while((BAR_OUTPUT$data$Value[Condition_Pos])>=two_percent_of_largest_mean){

                  # this breaks while loop to prevent going below x-axis 0
                  if(((as.numeric(BAR_OUTPUT$data$Value[Condition_Pos]))-(ggplot2_plot$data$Value[Condition_Pos]/100))<0){

                    break

                  }

                  BAR_OUTPUT$data$Value[Condition_Pos]<-(as.numeric(BAR_OUTPUT$data$Value[Condition_Pos]))-two_percent_of_largest_mean

                  # This stops line very close to 0 on y-axis
                  if(((BAR_OUTPUT$data$Value[Condition_Pos])<((two_percent_of_largest_mean/100)*15))){

                    break

                  }

                  BAR_OUTPUT<-BAR_OUTPUT+geom_bar(data=BAR_OUTPUT$data[Condition_Pos,], position=position_dodge(input_position_dodge), stat="identity", colour=input_colour, size=input_size, width = ggplot2_plot$layers[[1]]$geom_params$width, fill='transparent')

                }

              } # end of sub grepl 'B'

              # Code for right leaning diagonal 'C'
              position_input_x<-as.numeric(df$Condition[pos])
              position_input_y<-as.numeric(df$Condition[pos])
              # half of input width
              # when minused from centre of bar point on x-axis
              # it gives value at start of bar on x-axis
              # inverse true for end of bar width
              half_input_width<-input_width/2
              ten_perc_input_width<-((input_width/100)*10)

              x_axis_min <- position_input_x-half_input_width
              x_axis_max <- position_input_x+half_input_width

              y_axis_max<- ggplot2_plot$data$Value[position_input_y]
              # need to pull the max value from the example_plot the max boundries...
              # or caluclate the
              z_percent_of_current_mean<-(y_axis_max/100)*10

              df_diag <- data.frame(

                                  # start on x-axis-end on x-axis
                                  x = c(x_axis_min,x_axis_min),

                                  # start on y-axis-end on y-axis
                                  y = c(y_axis_max,y_axis_max), Fill='Hope you\'re having a nice day.')

             for(i in 1:19){

                # run if 2nd x-position is less or equal to rightmost edge of bar
                # minus 10% of total input width
                if (df_diag$x[2]<(as.character(x_axis_max))){

                  # 1/10 of unit value in width field
                  df_diag$x[2]<-df_diag$x[2]+(ten_perc_input_width)

                  # subtract z percent from 1st y height
                  df_diag$y[1]<-df_diag$y[1]-(z_percent_of_current_mean)

                  # draw using current df_diag values
                  BAR_OUTPUT<-BAR_OUTPUT+geom_path(data=df_diag, aes(x=x, y=y),colour = "black")

                } # end of if statement when less than x_axis_max

                # run this code to limit 2nd x-point from moving past rightmost edge of bar
                if (df_diag$x[2]==as.character(x_axis_max)){

                  # drop height of 2nd y-position by z percentage
                  df_diag$y[2]<-df_diag$y[2]-(z_percent_of_current_mean)

                  if(df_diag$y[1]<=z_percent_of_current_mean){

                    df_diag$x[1]<-df_diag$x[1]+ten_perc_input_width
                  }

                  BAR_OUTPUT<-BAR_OUTPUT+geom_path(data=df_diag, aes(x=x, y=y),colour = "black")

                } # end of if statement when x_axis_max reached

              } # end of for loop 1:19

            } # end of grepl 'C'

            if ((grepl('D', df$Pattern[pos], ignore.case=TRUE))){

              Condition_Pos<-as.numeric(df$Condition[pos])                              if ((grepl('B', df$Pattern[pos], ignore.case=TRUE))){                                  # draw original bar -> avoids any issue with 'fill' and drawing incorrect height
                BAR_OUTPUT<-BAR_OUTPUT+geom_bar(data=BAR_OUTPUT$data[Condition_Pos,], position=position_dodge(input_position_dodge), stat="identity", colour=input_colour, size=input_size, width = ggplot2_plot$layers[[1]]$geom_params$width)

                point_1_percent_of_current_mean <- ((BAR_OUTPUT$data$Value[Condition_Pos]/100)*.1)                                  while((BAR_OUTPUT$data$Value[Condition_Pos])>=two_percent_of_largest_mean){

                  # this breaks while loop to prevent going below x-axis 0
                  if(((as.numeric(BAR_OUTPUT$data$Value[Condition_Pos]))-(ggplot2_plot$data$Value[Condition_Pos]/100))<0){

                    break

                  }

                  BAR_OUTPUT$data$Value[Condition_Pos]<-(as.numeric(BAR_OUTPUT$data$Value[Condition_Pos]))-two_percent_of_largest_mean

                  # This stops line very close to 0 on y-axis
                  if(((BAR_OUTPUT$data$Value[Condition_Pos])<((two_percent_of_largest_mean/100)*15))){

                    break

                  }

                  BAR_OUTPUT<-BAR_OUTPUT+geom_bar(data=BAR_OUTPUT$data[Condition_Pos,], position=position_dodge(input_position_dodge), stat="identity", colour=input_colour, size=input_size, width = ggplot2_plot$layers[[1]]$geom_params$width, fill='transparent')

                }

              } # end of sub grepl 'B'

              # Code for left leaning diagonal 'D'
              position_input_x<-as.numeric(df$Condition[pos])
              position_input_y<-as.numeric(df$Condition[pos])
              # half of input width
              # when minused from centre of bar point on x-axis
              # it gives value at start of bar on x-axis
              # inverse true for end of bar width
              half_input_width<-input_width/2
              ten_perc_input_width<-((input_width/100)*10)

              x_axis_min <- position_input_x-half_input_width
              x_axis_max <- position_input_x+half_input_width

              y_axis_max<- ggplot2_plot$data$Value[position_input_y]
              # need to pull the max value from the example_plot the max boundries...
              # or caluclate the
              z_percent_of_current_mean<-(y_axis_max/100)*10

              df_diag <- data.frame(                                  # start on x-axis-end on x-axis                 x = c(x_axis_max,x_axis_max),                                                   # start on y-axis-end on y-axis                 y = c(y_axis_max,y_axis_max), Fill='Hope you\'re having a nice day.')                                             for(i in 1:19){                                  # run if 1st x-position is less or equal to leftmost edge of bar                 # minus 10% of total input width                 if (df_diag$x[2]>(as.character(x_axis_min))){

                  # 1/10 of unit value in width field
                  df_diag$x[2]<-df_diag$x[2]-(ten_perc_input_width)

                  # subtract z percent from 1st y height
                  df_diag$y[1]<-df_diag$y[1]-(z_percent_of_current_mean)

                  # draw using current df_diag values
                  BAR_OUTPUT<-BAR_OUTPUT+geom_path(data=df_diag, aes(x=x, y=y),colour = "black")

                } # end of if statement when less than x_axis_max

                # run this code to limit 2nd x-point from moving past rightmost edge of bar
                if (df_diag$x[2]==as.character(x_axis_min)){

                  # drop height of 2nd y-position by z percentage
                  df_diag$y[2]<-df_diag$y[2]-(z_percent_of_current_mean)

                  if(df_diag$y[1]<=z_percent_of_current_mean){

                    df_diag$x[1]<-df_diag$x[1]-ten_perc_input_width
                  }

                  BAR_OUTPUT<-BAR_OUTPUT+geom_path(data=df_diag, aes(x=x, y=y),colour = "black")

                } # end of if statement when x_axis_max reached

              } # end of for loop 1:19

            } # end of grepl 'D'

        } # end of no 'A' if statment

        }  

        } # second loop

      BAR_OUTPUT

  }

Below is some example data and a brief explanation of how to use the function.


library(ggplot2)

Example.Data<- data.frame(matrix(vector(), 0, 3, dimnames=list(c(), c("Value", "Variable", "Fill"))), stringsAsFactors=F)

Example.Data[1, ] <- c(80.9, 'Horizontal Pattern','Horizontal Pattern' )
Example.Data[2, ] <- c(67.677777, 'Vertical Pattern','Vertical Pattern' )
Example.Data[3, ] <- c(10.678, 'Mesh HorizVert Pattern','Mesh HorizVert Pattern' )
Example.Data[4,] <- c(95.8, 'Diagonal Pattern 1','Diagonal Pattern 1' )
Example.Data[5,] <- c(67.67, 'Diagonal Pattern 2','Diagonal Pattern 2' )
Example.Data[6,] <- c(58.9, 'Mesh Diagonal Pattern','Mesh Diagonal Pattern' )
Example.Data[7,] <- c(75, 'Mesh HorizVertDiag Pattern','Mesh HorizVertDiag Pattern' )

HighlightDataVert<-Example.Data[2, ]
HighlightHorizontal<-Example.Data[1, ]
HighlightMesh<-Example.Data[3, ]
HighlightHorizontal$Value<-as.numeric(HighlightHorizontal$Value)
Example.Data$Value<-as.numeric(Example.Data$Value)

example_plot<-ggplot(Example.Data, aes(x=Variable, y=Value, fill=factor(Fill))) +
  theme_bw() +
  theme(legend.position = "none")+
  scale_fill_grey(start=.4)+
  geom_bar(position='identity', stat="identity", colour="black", width=.86565656)

example_plot

# Understanding the EggHatch function:

# Patterns are represented by letters and assigned by row numbers.
# You can combine patterns by combining letters, for example: AB, ABC etc.
#
# Letters for each pattern:
# A=vertical lines
# B=horizontal lines
# C=diagonal lines bottom-top
# D=diagonal lines top-bottom

# Simply drop the already created ggplot2 bar plot into the function, as shown
# below, and make the desired pattern/s = the desired row number
# NOTE: the numbers correspond to the row in the dataframe NOT the default plot output order of bars
# You can simplify by using the Relevel function in library(Epi) if you want to reorder
# the rows in the dataframe to match the desired order of bars in the plot.
EggHatch_output<-EggHatch(example_plot, ('b=1, A=2, Ba=3, C=4, d=5, Dc=6, ABcD=7'))

EggHatch_output

And here’s the output:

EggHatch

There is plenty of repetition of code in this function that can be elimated relatively easily by dropping some of the separate patterns code into functions. However, I’ll leave it as it is for now so that it is (in my opinion) clear what the inner workings of each pattern is.

When/if I find time I’ll adapt the code here to allow for diagonal patterns in facet_grid. Until then I hope someone finds this useful. If you have found this function useful feel free to add a vote to the answer I gave to the original question posed on StackOverflow.

FINAL NOTE: you are free to use this code but I’d appreciate credit (even if you adapt my original code) where possible, and please don’t try to pass this work off as your own.

The Price of Knowledge.

There is a debate raging at the moment surrounding the practice of hiding research behind paywalls. The controversy lies not least in that many argue scientific research should be free and accessible to all, and that monetising it is counterproductive/unethical. But the fact that the scientists that conduct the research are not paid once their work has been accepted and published, highlights a strange model that favours the journals alone. I’m not going to get into debates about impact factors and that journals also have running costs. There are plenty of points on both sides of these arguments and the debate is easily found on the web. Instead I’m going to point you, the reader, to approaches used in accessing paywalled papers. This is simply an academic collection/cataloguing of approaches that people are currently using to bypass paywalls.

Disclaimer: The sci-hub site is currently being challenged in courts in America and I don’t necessarily advocate using this approach. I’m merely demonstrating how people get around paywalls when their university cannot afford the licence fees etc. Here is a piece on the origins of the sci-hub site etc. : http://bigthink.com/neurobonkers/a-pirate-bay-for-science

The following is a list of approaches I’ve discovered online that people use to bypass scientific journal paywalls:

1) Search on Google using this format: “paper name” filetype:pdf site:edu

2) Check out r/scholar

3) Use the hastag: #canihazpdf on twitter along with a link to the paper (or its title) and your email address.

4) Here’s another approach to try and gain access to articles behind pay-walls: https://t.co/ZigAgimxW7

5a) You can also go straight here: http://sci-hub.io/  http://sci-hub.cc/ https://sci-hub.tw/ and search for your paper of choice.

5b) This is an extension of the above and allows access from the url that hosts the paper of interest:

I’ll use an example. Say you want to access this article that is pay-walled:

http://www.nature.com/neuro/journal/v18/n10/full/nn.4105.html

By adding this:

.sci-hub.io

.sci-hub.cc

.sci-hub.tw

straight after the .com you will be able to access the article for free via the sci-hub website.

Here’s the amended URL:

http://www.nature.com.sci-hub.io/neuro/journal/v18/n10/full/nn.4105.html

http://www.nature.com.sci-hub.cc/neuro/journal/v18/n10/full/nn.4105.html

http://www.nature.com.sci-hub.tw/neuro/journal/v18/n10/full/nn.4105.html

6) Of course many academics also contact one of the authors of a paper via email who often are more than happy to forward a copy of their research for free. Professional and polite is the order of the day in this approach.

Again, sci-hub is currently being challenged in American courts so I am not advocating or recommending the use of the sci-hub website. The above paper is used merely as an example of how people use this approach and this blog is purely an academic exercise in cataloguing approaches currently being used by people to bypass paywalls in scientific journals.

The Scheming Clown

The London Mayor had funny hair,
And pretended to be the fool.

He helped his friends build corporate dens,
At the expense of objective rule.

With rising rent he didn’t repent,
Over growing numbers on the streets.

Instead he schemed against the PM esteemed,
“Exit the EU!”, is what he bleats.

#Octobophobia

Chris Brosnahan (over here: http://chrisbrosnahan.blogspot.co.uk/ ) is running a daily challenge for the month of October called #Octobophobia where he presents a new phobia each day and challenges himself, and anyone else who fancies a pop, to write a short story about the relevant phobia. Do follow him to see what he creates (). Some of the early entries are disturbing and I’m sure the trend will continue.

Below is my contribution for Cynophobia (a fear of dogs). I can be found here @BoyceWP on Twitter.

Wolves Clothing

I often wonder, do people know the aetiology of their fears? The things that can keep them awake at night, or those niggles that are never quite at the back of their mind? Chances are most have no idea. I know where and when mine was birthed into my world, snarling and convulsing. I was eight and visiting family. Outside I played with the older children and watched them pet their dog, which was tethered with fraying, blue plastic, rope. It was a collie and passive at their touch. When they stopped petting the dog it turned its attention to me. It lowered its head and bared its teeth. Growls found their way from deep in its throat as a prelude to the explosive bark that followed each one. Saliva was pulping at one corner of its mouth and shook with each threat of violence it sent my way. I was safe though. The rope, although fraying was holding true. I was advancing towards the dog. I had a hand on my back.

`No, I don’t want to.’ I said.

`It’s friendly really’ they insisted as I was pushed forward.

One of them reached out and petted the dog immediately subduing its savagery. It kept its eyes on me.

`Pet it.’ I was told.

My protests were unheeded. I reached out and tentatively petted the dog’s head at arms length and withdrew my hand in one piece. I smiled with relief at the taller children and turned to get back to a safe distance. There was no growl, no bark, just searing pain in my exposed thigh. The dog withdrew its teeth from my flesh with speed and I was dragged away from its snarling, rabid mouth. Tears spilled down my face as the blood spilled down my leg. The ensuing chaos saw me whisked off to the local GP with a long stay in the waiting area dripping blood onto the floor, before being bandaged and receiving shots. I wasn’t seriously injured, apart from being gifted six scars that could be used as a dental record for the dog. The bastard wasn’t even put down. It would have another victim, the face that time, before the owners decided that their pet was indeed a danger to children. The experience taught me a couple of things. Dogs were dangerous, and people’s stupidity equally so.

***

As an adult I wouldn’t say I had a phobia of dogs as such. I wasn’t transformed to a quivering wreck in their presence but I sure as hell didn’t trust them. I would sometimes cross the street to avoid them if I saw a person walking more than one at a time, but that was just good sense from my perspective. I’d risk passing a single dog and its owner if said owner had it on a short leash. The small yapping dogs didn’t really bother me at all. I barely even saw them as dogs. They were almost a distinct species. Parks though, I never went to parks. People have a habit of letting their pets gallop freely. No thank you.

Sometimes I did have dreams. Nightmares really. Never about the day I was bitten specifically. They would be about white teeth bared in shadow that concealed the size of their owner. I knew though, I knew they were wolves. Circling me. Hunting me. I’d awaken with my heart racing and chest tight. But, again, I wouldn’t say I had a phobia exactly. Those were nightmares and I could function just fine around dogs. I simply preferred not to be in their company.

***

I’d started a new job two weeks prior to getting my first invite to a work social. I wasn’t ever a fan of unofficial compulsory team building. Maybe that was the cynic in me speaking. It was a Friday evening and the quick pint quickly turned into pints. I was having a good time despite my best efforts. Jay-Jay, who I’d not had a chance to talk to properly prior to that was a fun guy. He had a smart answer to everything and a back-catalogue of funny stories that I wasn’t quite convinced were all of his own. But who cares? I was having fun and bullshitters are a harmless breed. I sent a text to my partner to let her know I would be running later than expected. Jay-jay had convinced me to join him for a `few more cheeky pints’ at a betting venue he knew.

`A casino?’ I asked.

`Something like that, but better.’

I was intrigued and followed his lead. We took a cab thirty minutes from the city centre. I was sobering up, tiring, and was significantly less interested in a “few more cheeky pints” than I had been. The cab fare home alone was going to render the extra couple of drinks a waste of time and money. But I didn’t complain. Jay-jay was fidgety with what I assumed was excitement and I wasn’t going to be “that guy”.

We rolled up to a warehouse in what looked like an industrial estate. Jay-Jay paid the fare and I watched the cab disappear back the way it came. I wasn’t at my most comfortable but I had just enough alcohol in my system to decide everything was alright. Jay-Jay knocked hard on the metal door and like something out of a gangster film a slot scraped open and a shadowed figure asked for a password.

`Red Baron’ Jay-Jay said.

The figure slid open the door and we stepped inside. I was led down a few steps towards a basement. Halfway down, that’s when I first heard it. It wasn’t the cheers and shouts from the amassed crowd somewhere below. It was barks.

`Jay-Jay?’ I said.

`It’s cool man. It’s cool.’

I didn’t feel I could turn around and leave. I hadn’t heard what destination Jay-Jay had told the driver. `Shit.’ I thought as Jay-Jay opened another door and led us into the arena. People surrounded a pit dug into the ground and two men stood inside it with their dogs on a leash that were squaring up to each other and straining their leashes to attack. Money was exchanging hands and the smell in the air was musty and of metal. Jay-Jay told me to wait and watch the `fight’. I only saw glimpses. I couldn’t bring myself to watch it all. The dogs ripped and tore at each others flesh adding to the blood already caked into the dirt. It didn’t last long. It was long enough for the losing dog to suffer as it whined in the jaws of the victor. The life escaped its broken body to cheers, braying, and boos from the crowd.

I felt nauseous. Not least by the savage display but also because I’d never before seen a pitbull. The victor, now back on its leash was so pumped full of adrenaline that the owner — and I say owner, not master, as this monster was its own master — could barely keep control of it. The animal, the dog I mean, was enormous and its mouth was wide, like a comic book grin from ear-to-ear.

`Just what the hell am I doing here?’ I thought as I felt sweat trickle down my left temple.

I turned away from the monsters and the bloodbath looking for Jay-Jay. I saw him talking to a large man in a leather jacket. Jay-Jay spotted me. I must have been pasty white at that point. He waved me to approach them and I did. I was unsteady on my feet but managed to navigate the boisterous, blood-thirsty punters. I stood wobbling by Jay-Jay’s side keen to ask him to take me away from this place. I was going to give him a piece of my mind. Didn’t he know how much trouble we could get into? Jay-Jay looked at me and then back to the stranger in leather.

`Our debt is settled?’ Jay-Jay asked.

The man simply nodded in reply. Jay-Jay turned to me with an almost apologetic look on his face and took a step back. I was confused. That was until I felt a sharp push into my back and no longer felt the ground beneath me. I slammed into the pit floor hard. The wind was knocked out of my lungs. There were cheers from the crowd that now surrounded me. Like something you’d hear from assholes in a pub after a member of staff smashed a glass. I looked up and saw the victor of the last fight. Snarling. Growling. Barking. There was saliva congealing in both corners of its mouth and it only had eyes for me.