Desk

The internet is awash with nonsense and people that really want to be heard. That's not entirely the case for me and I'm not planning on adding to the nonsense. I've spent too much time working on websites for other folks to really concern myself with my own. However, I've grown really tired of communicating using third party websites and I wanted to use this as a way to archive any notes, ideas, or anything I want to share. Right now, this site is clogged up with lots of old posts about mostly computer related ramblings, but I'll clean that up over time. I mostly leave commenting off, but please feel free to contact me if you have any feedback, questions, or just want to say hello.
Thanks for visiting,

David Windham Signature Who Needs a Computer Anyway?
David A. Windham

Dorian

Well… it’s about that time a year again that I’m glad I don’t live on the coast. This screenshot gave me pause, because I like how the shape of Hurricane Dorian1 perfectly curls along the beaches between Charleston and Wilmington.


  1. https://en.wikipedia.org/wiki/Hurricane_Dorian
 
David A. Windham

Joshua White

I’d like to share a story that I think is important and relevant to modern times about Joshua White. Today is the anniversary of the “I have a dream” speech by Martin Luther King Jr.. Every morning after I get up and have my half of cup of coffee I do a bit of reading. I’ll scan my email and the news quickly and try to find something interesting. What gave me pause this morning was a tweet from the “People’s Daily”, the largest newspaper in China and the official newspaper of the Communist Party of China. The tweet1 referenced the words of “I have a dream” with images of the speech.

Although unrecognized by many folks, the movement that lead up to the “I Have a Dream” speech was largely initiated by the labor movement of organizations such as the Brotherhood of Sleeping Car Porters2. The speech was made at the March on Washington for Jobs and Freedom. That march was organized by Philip Randolph3 and Bayard Rustin4. Rustin was able to pursue an education because he was an accomplished tenor vocalist and earned music scholarships to college. He performed with Josh White and the Carolinians in the recording6 below.

Gottlieb, William P – [Portrait of Josh White, Café Society (Downtown),
New York, N.Y., ca. June 1946] – Library of Congress

Joshua White7 was born in Greenville, South Carolina in 1914. His father threw a white bill collector from his home in 1921 for which he was beaten so badly that he nearly died. His father was subsequently locked away in a mental institution and died there several years later. Two months after his father died, White left home to drift with a blind street singers often sleeping in fields and stables while still a teenager. This was documented by Barlow, William Barlow in his 1989 book “Looking Up at Down”: The Emergence of Blues Culture. White eventually returned to Greenville to take care of his mother and siblings working various labor jobs. Later, in the 30’s, White was sought out back in the Carolinas by A&R men interested in his talent. He eventually was cast as Blind Lemon Jefferson in the Broadway play John Henry to which he received some notoriety. but late run the 40’s he recorded “One Meatball”, the first million-selling record by a male African-American artist.

In the 1940s Joshua White became close friends with Franklin and Eleanor Roosevelt. He would spend Thanksgivings and Christmas at their home in New York. They became the godparents of his child and he became a friend and confidant of the president. After the death of the president, White’s younger brother William White became Eleanor Roosevelt’s personal assistant, house manager and chauffeur for the remainder of her life.

In the 1950s White was tagged by Red Channels: The Report of Communist Influence in Radio and Television8. In an effort to clear his name, he consulted Eleanor Roosevelt and Paul Robeson. On September 1, 1950, White, appearing with only his wife Carol at his side, sat down before the House Un-American Activities Committee (HUAC) and explained his childhood background and read the lyrics to the song anti-lynching song “Strange Fruit” which was placed into the congressional record. Because he volunteered to testify before the HUAC, it greatly affected his posthumous reputation in America, causing him to become the only artist of the era to be blacklisted by both the political right and left. Mrs. Roosevelt had an astute understanding of the political climate in Washington and in America when she warned White that the government would turn his testimony against him. Indeed, this was the case, and White’s blacklisting would not be lifted for years. White relocated to London for much of 1950s, where he hosted his own BBC radio show, My Guitar Is Old as Father Time. White’s blacklisting in the American television industry was finally broken in 1963, when President John F. Kennedy invited him to appear on the national CBS television’s civil rights special “Dinner with the President”.

Joshua White died in 1969 during heart surgery. He was the first black singer to give a White House command performance (1941), to perform in previously segregated hotels (1942), to get a million-selling record (“One Meatball”, 1944), and the first to make a solo concert tour of America (1945).[26] He was also the first folk and blues artist to perform in a nightclub, the first to tour internationally, and (along with Lead Belly and Woody Guthrie ) the first to be honored with a US postage stamp. The 1956 book The Josh White Guitar Method9 is still in print. While White has undeniably left an indelible mark on American culture, this story should serve as a warning that a friend of presidents and the organizer of one of the most significant civc events in American history could be pushed into virtual obscurity by a political process motivated by fear.

I find this little artifact significant and timely, given the recent press about the rapid deforestation in the Amazon, the ongoing protest in Hong Kong, Boris Johnston trying to push through a ‘no deal’ Brexit, and the press that Trump has financial ties to the same folks campaigned for him using fear tactics. Often times, the juxtaposition of newsworthy items and cultural artifacts are fascinating enough to me that warrant sharing. This story started just a couple mile up the road from me when a young teenager left home with a blind musician because he father had accosted a white bill collector. I’m just guessing here, but I’d put my money on the the bill collector being a crook. I played an Ovation guitar for some time because I liked the ease on my fingers. That guitar evolved from White’s bleeding fingers. The song Jerry, by Josh White and the Carolinians is about a prized mule who’s driven hard because “Lord, this timber gotta roll”. Jerry got spooked from the sound of timber crashing and “kicked the boss in the rump”. The “Boss tried to shoot him in the head” and Jerry the mule “stomped him dead”. Jerry is a poignant folk story. The warning of Joshua White’s life being pushed by fear, racism, and political process, is similar to the the fear in a mule driven hard leading to the demise of the boss. It’s a fable that’s has contemporary implications. My favorite reference to Joshua white is from Shel Silverstein and Bob Gibson who remembered White with the first verse of Heavenly Choir10.

Last night I heard Josh White playing
From somewhere on the other side
In an orchard full of strange fruit hangin’
With his head thrown back, he stood there singin’ He snapped those strings till his fingers bled
He bent those notes till his guitar wept… now he’s…
Part of the Heavenly Choir
Where all the poor restless souls can be found Ain’t that a heavenly choir
Ain’t that a hell of a sound


  1. https://twitter.com/PDChina/status/1166538390856245250
  2. https://en.wikipedia.org/wiki/Brotherhood_of_Sleeping_Car_Porters
  3. https://en.wikipedia.org/wiki/A._Philip_Randolph
  4. https://en.wikipedia.org/wiki/Bayard_Rustin
  5. https://www.loc.gov/item/gottlieb.09081/
  6. https://www.youtube.com/watch?v=RDpjPm143dI
  7. https://en.wikipedia.org/wiki/Josh_White
  8. https://en.wikipedia.org/wiki/Red_Channels
  9. https://www.amazon.com/Josh-White-Guitar-Method/dp/B07C479SJR
  10. https://www.bobgibsonfolk.com/song-heavenly-choir/
 
David A. Windham

The Magical Number Seven

It seems that almost every time I’m involved in designing a new user interface for an app or website, I inevitably bring up the magical number seven1. Although I’m using it in design terms, it’s origins are actually from a psychology paper published in 1956. It’s also commonly referred to as Miller’s Law2, which refers to both working memory and communications. It’s a simple concept about our working memory which you can read more at the Wikipedia page linked below in lieu of repeating it here. It’s also cited by the US CIA in Psychology and Intelligence Analysis3.

The reason I refer to the concept is generally in an effort to try and simplify user interfaces. I believe, as Miller had cited in his original paper, that anytime more options than needed are presented, the information becomes confusing. I like for any menu navigation item to contain less than seven options. I actually believe that closer to 3 is optimal and if you can fold the options out like a tree in steps of three you’ll get better results. Now, don’t get me wrong on this, I’ve built menus with 40+ items. Sometimes is necessary if you’ve got a directory of information that a user might want to try and navigate to a specific piece of information. This is also where search plays a vital role… or in the case of this website, I’ve playfully made the whole thing a maze of information. However, if you’re presenting the user with new information and trying to elicit an objective response to the stimuli, then my recommendation is to always limit the choices to seven or less. Some folks might cite the KISS (Keep It Simple Stupid) principle3 on this, but I think the Magical Number Seven is more appropriate to what’s really going on. I always try to present users with seven or less choices as to their next action. If you’re really only trying to get one single action from a user, limit the choices to one or none. I like to think of users as savvy and not just Pavlovian4 mouse clickers. That’s why I think it’s all about the magical number seven.


  1. https://en.wikipedia.org/wiki/The_Magical_Number_Seven,_Plus_or_Minus_Two
  2. https://en.wikipedia.org/wiki/Miller%27s_law
  3. https://www.cia.gov/library/center-for-the-study-of-intelligence/csi-publications/books-and-monographs/psychology-of-intelligence-analysis/art6.html
  4. https://en.wikipedia.org/wiki/KISS_principle
  5. https://en.wikipedia.org/wiki/Classical_conditioning
 
David A. Windham

Twenty Hour Work Week

I’m often out working in the yard, riding the bike, swimming, or playing tennis midday mid-week and folks are always saying “don’t you have a job Windham”. Since the majority of the folks saying it are retired and I like to respond “It’s not my fault it took you so long to retire”. In reality I work hard and more importantly I work efficiently. In an effort to respond to those folks I figured I’d write a short little post this morning about how I try to be efficient with work my work. And don’t let the title fool you, that’s just what I’d like to shoot for and in reality I’m sometimes working fifty hour weeks.

Quality of life… I can’t emphasize it enough. It’s always the little details that drown folks in the traditional work week nonsense. Even though most folks are doing the nine to five, I don’t think they are getting any more work done. Every time I’ve taken a traditional job, I’ve been discouraged by the amount of time my co-workers spend ‘riding the clock’ and the amount of time I have to spend on site twiddling my thumbs. In fact, the last full time position at a local university I left simply due to the fact that our new dean was cutting down on tele-commuters and I was being forced to drive into the office. Prior to that, I actually liked coming into the office certain days just to socialize with my coworkers. One of the first corporate jobs I had was as a web developer for a publishing company where I learned all kinds of bad work habits from the seasoned developers there. After one of our first ‘code sprints’, a fellow developer came to me and said “don’t do the work too fast, they’ll come to expect us and you’ll make the rest of us look bad”. They also taught me to leave broken items in the development repositories just so we’d already know what was going to be requested of us by the project managers. I attribute this to Parkinson’s law 1. in that “work expands so as to fill the time available for its completion”. This type of time wasting stuff is nonsense. I prefer to just do my work in such a way that the faster and more efficiently I do it, the more time I have away from the office.

Reducing the number of office hours has made some headlines in recent years. Given that I’m doing remote IT development work from home, it makes sense that I’d be learning towards the shortened work week. However, a lot of decent research suggest that we are all moving towards shortened work hours. I think we’re all kinda contaminated with the ‘busy-ness’ disease. I think It makes us feel like we’re valuable and productive. I’m no expert, but it’s been an idea in the making for years. Bertrand Russell wrote in his 1932 essay, “In Praise of Idleness”, that “if society were better managed the average person would only need to work four hours a day”2. John Maynard Keynes noted in a 1930 essay, “Economic possibilities for our grandchildren”, in which he reckoned people might need work no more than 15 hours per week by 20303. I’m not going to philosophize on production, consumption, and work hours. There are plenty of others doing it3. However, I will tell you that my quality of life has increased by concerning myself with issues of time management.

I’ve always been easily distractible. I had an English teacher in high school who made it a point to contact my mom about my inattentiveness in class. Being the hypochondriac she is, my mom and some psychologist quickly accessed my condition as ADHD. I still think it’s just general boredom with the mundane and uninteresting. That’s another issue for another essay. I now mostly do contract development work. This work is generally within a team development environment that makes me accountable for my time in that I’m often pair programming. I also manage to take on other smaller projects for additional billable hours. This type of work has given me the liberty to devise ways to use my time the best I see fit and over the years, I’ve developed little habits that help shorten my work week and make me more efficient.

  1. I go to bed early and I wake up early. At our house, we’re almost always in bed by nine. We’ll talk, read a book, or watch a film and I’m usually out by 10pm. I get up around 6am, have a cup of coffee and get right to it. I’ve found that the midday chaos of communication is really distracting and I get my best work done before noon.
  2. I exercise often so that I sleep well. I evaluate how I’m sleeping often and I will sometimes meditate or take a nap if I’m not feeling particularly on task or focused.
  3. The smartphone is rarely an entertainment device for me. (unless of course, I’m stuck somewhere, like the doctors office waiting room or airport with nothing else to do) I’ve turned off all notifications on my phone and when I’m working, I turn the ringer off as well and leave it in a drawer downstairs.
  4. I try to only open up an email twice a day in the morning and after lunch. I draft my responses and send them out in the afternoon.
  5. I use project management software to keep a list of projects, tasks and calendars that keep me current at a glance. It functions like a Kaban4 board as an easy way to manage tasks.
  6. I spend very little time doing invoices or paying bills. I write up each billable hour every day and I auto pay all bills online.
  7. I try to communicate efficiently in that I only respond to emails/texts/calls that need an immediate response and I always wait until I have all of the questions I need to put into an email/text/call before I make it.
  8. I try to spend a couple hours every week playing with development tools and servers in an effort to continually make leaning new skills fun and keep me interested in my work.
  9. I write code efficiently. I make notations and document as I’m writing it.
  10. I learn tricks to speed up and automate development.

  1. https://en.wikipedia.org/wiki/Parkinson%27s_law
  2. https://en.wikipedia.org/wiki/In_Praise_of_Idleness_and_Other_Essays
  3. http://www.newyorker.com/magazine/2014/05/26/no-time
  4. https://en.wikipedia.org/wiki/Kanban
 
David A. Windham

BioTherm Solutions

Although I’ve mostly stopped posting technology related ramblings on this website, I have to remind myself every so often that I should be keeping up with my projects in an effort to self promote. I built a new website for BioTherm Solutions this last year and I’m going to run through the highlights. If you’d prefer to just take a look, head on over to BioTherm Solutions to view it online or the code repository at https://code.davidawindham.com/david/biotherm.

BioTherm Solutions has been in business since 1980 designing and manufacturing greenhouse environmental solutions. They are based out of Cotati, California which is just north of San Francisco and west of Sonoma. I was introduced to the company through a project had previously done for another greenhouse based company. BioTherm had pretty much the same set of web issues that most projects I work on… outdated content, non-responsive1, and a design dated site. I reworked the main logo and created additional vector graphics to match their new divisions. I gathered an assortment of other graphic resources, created a color theme, and started in on the site.

They had an old site based on Expression Engine2 which hadn’t been updated in a number of years. I went through the process of migrating the site locally and gave them a number of options about upgrading Expression Engine, redesigning the content, migrating the existing content to a new content management system. The owner had a brochure that had been updated and I worked form the design from a print brochure which had been updated. For this project I settled on a couple of standard libraries to build out the templates. I primarily used Bootstrap from Twitter and Material Design3 from Google. All of the pages have been built as static HTML assets. Sometimes I really miss working with static files because of the simplicity. There was a minimal amount of JavaScript added, so there was really no need to further complicate it with additional preprocessors4 although I generally like to use a task runner5 to compiles assets on a project like this. Ideally, I’m left with one single CSS and JavaScript File. The only other technical considerations on this project were some forms and third party analytics. I used PHPMailer6 to handle the forms. I used Google ReCaptcha7 to deal with form spam and I used Google Analytics.

I think the design on this one is clean and provides a simple experience that guides users to action. They’re happy with it and that’s mostly what makes my job rewarding. As with most projects, I always make a promise to support them for the lifetime of the project. In this case, I’ll likely be doing some additional work by migrating to a CMS8, maybe a new host, and adding an SSL certificate9. Although I do the majority of my work for other agencies, it’s kinda nice being directly involved with the company. This also cuts out a lot of potential for feature bloat10 since I can recommend only what they need and I’m not pitching them new fangled solutions. I wish all of my projects could be so straightforward.


  1. https://en.wikipedia.org/wiki/Responsive_web_design
  2. https://en.wikipedia.org/wiki/EllisLab
  3. https://en.wikipedia.org/wiki/Material_Design
  4. https://en.wikipedia.org/wiki/Preprocessor
  5. https://en.wikipedia.org/wiki/Build_automation
  6. https://github.com/PHPMailer/PHPMailer
  7. https://en.wikipedia.org/wiki/ReCAPTCHA
  8. https://en.wikipedia.org/wiki/Content_management_system
  9. https://en.wikipedia.org/wiki/SSL
  10. https://en.wikipedia.org/wiki/Software_bloat
 
David A. Windham

2018 Playlists

Every month I make a new music playlist. I usually do this while I’m avoiding work at my desk. I’ve started doing these playlists in 2013 and I just post them online for anyone interested ( here’s last year ). I like going back and listening to old playlist just like the old mixtapes I used to make. I generally try to only include new releases for each month. Sometimes these will include reissues and remastered releases from that month. I keep statistics and track my listening habits at https://davidawindham.com/studio/music/ and http://radio.davidawindham.com/. If you see anything I missed last year, please let me know.

Looking back through these tracks… here are some that stuck out to me last year. ( in no particular order )

  • Phil Cook – People Are My Drug
  • Ry Cooder – The Prodigal Son
  • John Grant – Love Is Magic
  • Courtney Barnett & Kurt Vile – Lotta Sea Lice
  • Kurt Vile – Bottle It In
  • Courtney Barnett – Tell Me How You Really Feel
  • David Byrne – American Utopia
  • Brian Eno – Music For Installations
  • Phosphorescent – C’est La Vie
  • Dr. Dog – Critical Equation
  • Kamasi Washington – Heaven and Earth
  • Mark Knopfler – Down the Road Wherever
  • First Aid Kit – Ruins
  • Neko Case – Hell-On
  • Blood Orange – Negro Swan
  • Ziggy Marley – Rebellion Rises
  • Medeski, Martin, & Wood – Omnisphere
  • Olafur Arnalds – re:member
  • of Montreal – White is Relic
  • Douglas Firs – Hinges of Luck
  • John Prine – The Tree of Forgiveness
  • St. Paul & The Broken Bones – Young Sick Camellia
  • Ben Harper & Charlie Musselwhite – No Mercy In This Land
  • Willie Nelson – My Way/Last Man Standing
  • Keith Jarret – La Fenice (LIve at Teatro La Fenice)
  • His Golden Messenger – Virgo Fool
  • Unknown Mortal Orchestra – Sex & Food
  • Jason Isabell – Live from the Ryman
  • Superchunk – What a Time to Be Alive
  • Elvis Costello – Look Now
  • Parquet Courts – Wide Awake!
  • Rayland Baxter – Wide Awake
  • Gregory Porter – One Night Only (Live at the Royal Albert Hall)
  • Paul McCartney – Egypt Station
  • Brad Mehldau Trio – Seymour Reads the Constitution!
  • Jim James – Uniform Clarity
  • Grateful Dead – Pacific Northwest ’73-’74
  • Soulwax – Essential
  • Father John Misty – God’s Favorite Customer
  • Chick Corea & Steve Gadd – Chinese Butterfly
 
David A. Windham

Peoples Pants

I just set up another server for a side project: Peoples Pants1. The pants thing has been a little idea in the back of my mind for some time and I’m not sure where the name came from. I think it just hit me while running a domain search.  Sometimes I think that maybe I just enjoy setting up servers. Perhaps I’m just procrastinating other work, but given a little free time to dabble and I usually end up with some sorta new side project… either around the house or on the computer. I’m kinda a serial tinkerer and sometimes entrepreneur where my capital is all sweat equity of the time spent ‘behind the machines’.  I just build out the ideas as they come to me. There are a bunch unfinished, quite a few I’ve abandoned, one I’ve sold, and this one now makes two out there floating in cyberspace. I guess it’s the ‘if a tree falls on the internet’ sorta reason for publishing them or posting it here. 

This one got started because while I was building a demo for an upcoming contract and I started using hypothetical pants orders for the models. I might have been thinking about getting some new pants or the pants I had on. Who knows. I had also just read about the legalization of hemp with the farm bill.  And in my opinion, this is something that should have been done a long time ago. I first read about the sustainability of hemp was when a buddy gave me his copy of The Emperor Wears No Clothes2. I was in college. I had just moved from Savannah to Charleston. And for the record… I definitely inhaled. I remember buying a pair of hemp shoes in New Hampshire. They had recycled plastics for the sole and hemp canvas for the upper… like ‘hippy chucks’. Although the shoes are long gone, I currently have two current shirts from Patagonia that contain hemp. The hemp is imported. I’m guessing that this farm bill is going to ramp up domestic production. I think it’d be great if we were to re-invent modern domestic textiles with hemp. Hemp is far more agriculturally sustainable and environmentally friendly. 

Earlier this year, I built a project for a greenhouse environmental control company that does a lot of new business related to the legalization of cannabis. At one time, I starting working up a business prospectus and looking for property for my future greenhouses because, well money…. I’ve toured a facility in Colorado and I had seen that our former state attorney general was getting into the business.  But that’s another story and another business all together even though technically hemp is cannabis. I think hemp is going to be a viable agricultural product and I’m hoping it turns out to be a successful agriculture crop in the states.  From what I remember, part of the introduction to The Emperor Wears No Clothes was about the historic prevalence and uses of hemp in America. I still see a good number of cotton fields in and around the countryside, but I know that the majority of the textile outfits in these area are gone.  I wonder what kind of impact hemp production will have.  

I’ve played with the pants idea in conversation with folks in the past.  I almost always get the ‘you can’t do that here.. that’s why they’re all made in _blank_ third world country’ reply.  I tend to roll through all kinds of those types of lofty aspirations regularly, so I know the context in which the responses from my acquaintances derive. Peoples Pants is ‘pants’ software and it’s one thing to build software on your computer and another set of considerations for how it performs under the weight of users.  These days, I tend to think about scalability from the start because I seem so many good ideas choked off from implementation issues. That’s one reason I spun up a server for this. I like having all of the code modular and the infrastructure in place for high availability.  There is an about page I just wrote for the site and there’s not much more that I need to add here. We’ll see how it goes. I’m sure it’ll take a big chunk of money to ramp up production and at this point is merely a minimum viable product5. Although the software is primarily handling customer service and e-commerce, the idea is that I’m going to build it to handle everything from generating patterns,  passing those to the laser cutter, supply chain management, and human resources.  You can head over to PeoplesPants.com to plug in your email address for updates or check back with me when you need some pants.



1. – Peoples Pants – https://peoplespants.com/
2. – The Emperor Wears No Clothes – https://en.wikipedia.org/wiki/The_Emperor_Wears_No_Clothes
3. – Patagonia Hemp – https://www.patagonia.com/hemp.html
4. – H.R.5485 – Hemp Farming Act of 2018 –https://www.congress.gov/bill/115th-congress/house-bill/5485
5. – Minimum viable product –https://en.wikipedia.org/wiki/Minimum_viable_product

 
David A. Windham

WordPress 5.0

In the tradition of my various old posts about how this website is published, this is the first post I’ve published on this site with the new Gutenberg editor1 for WordPress. I like it. I like how it’s built. I think it’s the future. I think it is smart that they pushed it into core. However, I didn’t decide to write a post based on how much I like it or my opinions on the future features. The reason I’m writing this post is that I spent the better part of this morning and yesterday fixing websites with errors due to the upgrade.

I know that there has been quite a bit of discussion on the subject, but I think my opinion is garnered mainly through experience and figured it might be valuable to share with anyone else out there who may be contemplating the same issues. The reason the website I was working on had issues is because of the Enfold theme2 and it’s Avia Framework and Layout Builder. Let me share a little backstory first for those finding this post. I’ve been working with WordPress since version 1, over ten years now.  I originally built this website with static HTML and CSS. I migrated it to WordPress at version 2. I’ve since built a bunch of websites on WordPress and I’ve started to developed some highly opinionated, which I’d consider educated, ways of doing so. 

I realized a long time ago that having fewer moving parts is the sort of aesthetic I prefer when it comes to working with software or content management systems.  In the last couple of years, I can’t load a YouTube video without a website builder advert in front of it. I remember when GoDaddy and others like WIX started forming their site building tool teams and I saw a lot of good JavaScript developers go to work on them. I often recommend these sorta of site building tools to folks that don’t have more complicated requirements because they are easy to use. These site builder tools are just an effort to make the tools more user friendly. WordPress is merely following this trend in an effort to make sure that it doesn’t find itself antiquated in coming years. However, these type of JavaScript site building tools made their way into WordPress themes and plugins before the new Gutenberg editor did and now some of those tools aren’t exactly compatible.

With the sites I just worked on, I didn’t build them or choose to use the Enfold theme. I often inherit projects built by others because, unfortunately, that just seems to be the modus operandi of the web dev world. I don’t mind inheriting projects because it pays the bills and you learn more from maintaining websites than building them.  The websites had been built entirely using the Avia Template builder and the errors started happening right after the update.  After heading off to the user forum for the theme, I discovered that the theme author is dealing with the same issues and cites them in their most recent post3.  The theme author has written a simple workaround to enable and disable the new Gutenberg Editor.  ( Although I might note in this case, I’m not sure they should be calling their editor the ‘Advanced’ one. )

In conclusion… ( I can’t seem to escape the fifth grade five point essay and a lame fifth paragraph introduction ). I like the new Gutenberg editor and I think it’ll do a good bit to help modularize some of the components of a good plugin or theme. That doesn’t appear to be the popular opinion  because the reviews are full of negative comments from inexperienced users, which is really indicative of the majority of internet forums these days. My recommendation is to always try and build highly modular systems that aren’t dependent on boated features or lots of third party code so that interoperability is prioritized to prevent deprecation. And no matter what frameworks or content management systems you’re using, it’s always best to try and stay closely aligned with the code base of those systems. As much as I could rant here about this and that, it’s just something that happens with all software. I can’t even turn on my phone now without an update notification. And in the end, it only took me a little bit of time to run the upgrades and troubleshoot the issues. And I’ll get paid for it. So the lesson is…  please don’t heed my advice here and keep making stuff that breaks so that I can keep fixing it. The “move fast and break things”4,5,6 motto of development is working out for me. 

 



1. Gutenberg editor – https://wordpress.org/gutenberg/
2. Enfold theme – https://kriesi.at/themes/enfold-overview/
3. Kresi blog – https://kriesi.at/archives/wordpress-5-0-and-enfold-4-5-1
4. Move Fast and Break Things – https://commons.wikimedia.org/wiki/File:Move_Fast_and_Break_Things.jpg
5. Move Fast and Break Things – https://en.wikipedia.org/wiki/Jonathan_Taplin
6. Move Fast and Break Things – https://xkcd.com/1428/

 
David A. Windham

Laravel

I like to dabble with new development frameworks for fun. I’ll just check out whatever is the trending and run through a basic setup. Projects like https://github.com/gothinkster/realworld are like a toy for me. I’ve worked with a limited group of frameworks more extensively because I’ve built or worked on projects with theses: Drupal, Django, Rails. Sinatra, Meteor, and Express. I know I’m a bit late on Laravel, but it’s still new to me. I think I started seeing some We Work Remotely gigs rolling through my reader and those sent me down the Laravel1 rabbit hole.

Something about Laravel gelled with me. I wasn’t exactly sure at first… in fact, I was a bit skeptical ( I think I’m getting that way in my old age ) and I didn’t think that a PHP project could grab my attention. I mean I figured I’d be digging into Elixer and Pheonix and I was recently digging on GoLang and Revel. Although most of what I do is simple content and file management running on WordPress. It’s seems like for most of the other projects it’s the exact the same stuff different framework…  authentication, permissions, routing, some models, and nowadays.. maybe consuming or producing an API. I don’t think it was just me falling back on old trusty PHP. I thought maybe I just like Laracast2 like I liked Railscasts. One afternoon after a session of Laracasts, I decided that I’d figure out who the host is since I’d been watching and listening to his instruction.  I found an interview3 with him about how he started with Laravel and he mentioned the comments. That’s it. That’s what gelled with me. It’s the comments… and the formatting, spacing and overall attention to detail in the structure. Here is the Routing/RouteAction.php file.

namespace Illuminate\Routing;

use LogicException;
use Illuminate\Support\Arr;
use Illuminate\Support\Str;
use UnexpectedValueException;

class RouteAction
{
    /**
     * Parse the given action into an array.
     *
     * @param  string  $uri
     * @param  mixed  $action
     * @return array
     */
    public static function parse($uri, $action)
    {
        // If no action is passed in right away, we assume the user will make use of
        // fluent routing. In that case, we set a default closure, to be executed
        // if the user never explicitly sets an action to handle the given uri.
        if (is_null($action)) {
            return static::missingAction($uri);
        }

        // If the action is already a Closure instance, we will just set that instance
        // as the "uses" property, because there is nothing else we need to do when
        // it is available. Otherwise we will need to find it in the action list.
        if (is_callable($action)) {
            return ! is_array($action) ? ['uses' => $action] : [
                'uses' => $action[0].'@'.$action[1],
                'controller' => $action[0].'@'.$action[1],
            ];
        }

        // If no "uses" property has been set, we will dig through the array to find a
        // Closure instance within this list. We will set the first Closure we come
        // across into the "uses" property that will get fired off by this route.
        elseif (! isset($action['uses'])) {
            $action['uses'] = static::findCallable($action);
        }

        if (is_string($action['uses']) && ! Str::contains($action['uses'], '@')) {
            $action['uses'] = static::makeInvokable($action['uses']);
        }

        return $action;
    }

    /**
     * Get an action for a route that has no action.
     *
     * @param  string  $uri
     * @return array
     */
    protected static function missingAction($uri)
    {
        return ['uses' => function () use ($uri) {
            throw new LogicException("Route for [{$uri}] has no action.");
        }];
    }

    /**
     * Find the callable in an action array.
     *
     * @param  array  $action
     * @return callable
     */
    protected static function findCallable(array $action)
    {
        return Arr::first($action, function ($value, $key) {
            return is_callable($value) && is_numeric($key);
        });
    }

    /**
     * Make an action for an invokable controller.
     *
     * @param  string $action
     * @return string
     *
     * @throws \UnexpectedValueException
     */
    protected static function makeInvokable($action)
    {
        if (! method_exists($action, '__invoke')) {
            throw new UnexpectedValueException("Invalid route action: [{$action}].");
        }

        return $action.'@__invoke';
    }
}

Simple as that. No benchmarks, no language preference, no new-fangled features. It’s just the aesthetics of the code. I think that’s part of the reason why everyone fell on Rails too. I’m the same way. If I’m really into something, I’ll take care to make sure that I’m systematically tabbing, formatting, and commenting the code. Yes, I know… it’s easy to run some post processing for any sort of formatting preferences, but I like to do it manually. And it’s that the sorta detail in Laravel that grabbed my attention. I try not to force a project onto a framework and I generally try pick the best framework for each project. Most of the time, it’s generally the framework that makes it the quickest and easiest.  Although I’m a bit late on this one, I’m sure I’ll do a follow up on Laravel when I’ve got a decent project under my belt. In the meantime, I’ll be looking to make someone’s project fit into Laravel relatively soon. 



1. Laravel – https://en.wikipedia.org/wiki/Laravel
2. Laracasts – https://laracasts.com/
2. Jeffrey Way – PHP Sydney – https://www.youtube.com/watch?v=kHoVE0kCnZg

 
David A. Windham

Privacy and Cookies

I had a chance this weekend to dabble with this personal site. One of the things I’ve been meaning to do is address the European Commissions General Data Protection Regulation, and in particular the European Commission’s Cookie Policies. So I’ve built out a privacy policy and cookie policy for this website even though I don’t use any third party APIs or share data with any third parties. When I advise clients on the use of privacy policies on their websites, I generally express my ineptitude with legal matters and refer them to a set of standard privacy policies and/or their own counsel. Aside from this new privacy policy, the only other legal document on this site is my Independent Contractors Agreement.

Honestly, I glad the EU has addressed privacy concerns on the web. It’s a mess out there and I’m particularly fond of maintaining my privacy. For the uneducated, many websites use a litany of methodologies for tracking your every move. The most disturbing to me are the numerous ‘social media’ plugins that, while appearing to be useful to a website operator, serve a dual purpose of tracking their users. And although this is not likely ‘news’ to many of you, those companies will track your every move online and compile that data into a product they sell. You and your data are the product. I’m not a fan, and I don’t allow any third party access to any data from this website. Although, let me be more clear on that… the data that travels to and from the data center in which the server that this website is hosted is not in my control. It’s more than likely that data is being tracked by the NSA and whomever they contract or partner with. I’m also unsure of the protections you have from you service providers to eavesdrop on your data transmissions.

Regardless of your lack of privacy and my efforts here to stave off those intrusions, I’m being as compliant and protective as I can of my own personal liability by including privacy policies within this website. Because this website uses a combination of custom cookies made to interact with returning users on the homepage and cookies provided by the content management system, I’ve got to display a notice to new users within the European Union informing them of the privacy policy and use of cookies. There are plenty of pre-built EU Cookie law scripts and plugins for websites. As is usually the case, I like to build my own solutions to these types of problems.

I’ve used a pretty simple method to implement the notice. I’m already setting a custom cookie to anyone who visits the homepage. I store the users name in that cookie if they respond to the terminal question “What is your name?” I do this so that when they return, the site will say “Welcome back [whomever]”. However, many users arrive at this site through various other pages and I need to implicitly have the user to agree to my policy on every page. I’m going to use the most common solutions of providing a small pop-up asking for permission. I’m doing this by checking for the cookie using javascript. I’m using https://github.com/js-cookie to check for the cookie and the script below to set and notify the user.

/*============================================
       EU GDPR cookie notification
==============================================*/

$( document ).ready( function() {
    cookieNotification();
});
var hideCookieNotification = function() {
    $( '.js-cookie-notification' ).delay(5000).fadeOut( "slow" );
    Cookies.set('EU-GDPR-Cookie', 'true', { expires: 365 });
};
var cookieNotification = function() {
    var setCookieNotification = function() {	
        $( '.js-cookie-notification' ).fadeOut( "slow" );
        Cookies.set('EU-GDPR-Cookie', 'true', { expires: 365 });
    return false;
};
if ( Cookies.get('EU-GDPR-Cookie') === 'true' ) {
    console.log('EU GDPR cookie notification set');
    } else {
    console.log('EU GDPR cookie notification not set');
    $('.js-cookie-notification').css({ 'display' : 'block'});
    $('.js-cookie-notification').find('.js-cookie-notification-hide').click( setCookieNotification );
    };					
}

Once the site has confirmed that you haven’t previously visited, the javascript will then initialize a pop-up asking permission to use the cookie. Here’s the HTML and CSS:




.cookie-notification {
	display: none;
	padding:30px;
	position: fixed;
	bottom: 10px;
	left: 10px;
	background-color: #fff;
	opacity: 0.8;
	border-radius: 15px;
}

If you’re trying to do this at home, you’ll need a tool to edit your cookies because clearing them out every time you want to test is a pain in the arse. I recommend http://www.editthiscookie.com/ for managing cookies. You can see how I’ve added all of this to my site in my git code repo commit. I don’t think my efforts here are really going to help anyone out there protect their privacy, especially considering this website is about as private as any on the open web. The little pop-up box is really just another little annoying part of the using the web, albeit with less consequences than the invasion of your privacy. Really this little project was just a way for me to waste some time on a chilly morning even though I know I have other work and laundry to do.