bridgestew
2019-01-06T16:09:00-05:00
https://bridgestew.com/
Bridget Stewart
Giving a Damn at Scale
2020-04-25T17:14:22-04:00
https://www.bridgestew.com/journal/giving-a-damn-at-scale/
<p>I just finished reading an excellent piece by Ethan Marcotte: <em><a href="https://ethanmarcotte.com/wrote/gardened/">Gardened</a></em>. In it he writes:</p>
<blockquote>
<p>In other words, they have to give a damn. But giving a damn doesn’t scale. Time and again, our industry chooses frameworks that weren’t designed for accessibility or for performance. And in the middle of a global health crisis, I think it’s time we talked about how the tech industry—an industry responsible for providing life-saving information and services, now more than ever—can be allowed to self-regulate. If other industries follow building codes and regulations, why shouldn’t we?</p>
</blockquote>
<p>There is <a href="https://timkadlec.com/remembers/2020-04-21-the-cost-of-javascript-frameworks/">mounting</a> <a href="https://backlinko.com/page-speed-stats">evidence</a> that a large number of websites today <em>do not scale</em>. What does it mean for software to scale? (Emphasis mine.)</p>
<blockquote>
<p>Increasing or decreasing the capacity of a system by making effective use of resources is known as scalability. A scalable system can handle increasing numbers of requests <em>without adversely affecting response time and throughput</em>.</p>
</blockquote>
<p>There's more explanation to that definition that you can read <a href="https://gerardnico.com/code/design/scalability">at the source</a>.</p>
<h2 id="what-will-it-take">What will it take? <a class="direct-link" href="#what-will-it-take">#</a></h2>
<p>How <a href="https://adactio.com/tags/progressive%20enhancement">many</a> <a href="https://hankchizljaw.com/wrote/the-p-in-progressive-enhancement-stands-for-pragmatism/">more</a> <a href="https://hackernoon.com/modern-web-development-bf0b2ef0e22e">developers</a> have to point out how bloated we've made the web with our frameworks, tracking scripts, and other 3rd party solutions before we take things seriously? We've been banging on about this for <em><a href="https://jakearchibald.com/2013/progressive-enhancement-still-important/">ages</a></em>. It's like a plague!</p>
<p>Speaking of plagues...</p>
<p>The COVID-19 pandemic exposed multiple weaknesses to our societies at large—the web included. As Governor DeWine's team held daily briefings,<br>
they referenced the <a href="https://coronavirus.ohio.gov/wps/portal/gov/covid-19/home">Ohio website</a> where people could access more information. When I tried to visit the site I was met with server (500) errors and other flaky responses because the site was not able to handle the volume of traffic. The URL appeared to indicate they were using WordPress as a content management system. After reading Eric Meyer's plea for critical information sites to <em><a href="https://meyerweb.com/eric/thoughts/2020/03/22/get-static/">Get Static</a></em>, I wondered if this same site prompted his post.</p>
<p>Other website weaknesses were exposed as I searched local drug stores for supplies that I needed. The high volume traffic made these sites load very slowly, if they loaded at all. So many stores in my area were out of toilet paper, hand sanitizer, disinfectants, etc., that I wanted to check online for which location might have items in stock before driving all over town to find them. This was especially important since the convenience of nearly instantaneous delivery from Amazon evaporated. I wanted answers, but instead I got fancy loading spinners that never went away.</p>
<p>These were concrete examples of <strong>failure to scale</strong>.</p>
<p>So if giving a damn doesn't scale, as Ethan stated, and <em>not</em> giving a damn doesn't scale either, what does that say about our industry? We're failing! Not in a cute "fail fast" way, either. As an industry that loves Lean, Agile, Design Thinking and all that crap, why do we ignore the feedback loops we've been getting?</p>
<p>I'm going to blame business-speak for this. Since people and money are referred to as "resources," the definition of scale I supplied above could be perverted to focus on how quickly you and/or your team can ship deliverables. As your response time and your team's throughput become the focus, you reach for what can make you effective as quickly as possible. Those tools and frameworks won't necessarily serve our users reliably. We're failing <em>them</em> and ultimately our clients and employers. It's time to do better!</p>
<h2 id="this-is-a-wake-up-call">This is a wake-up call <a class="direct-link" href="#this-is-a-wake-up-call">#</a></h2>
<p>The pandemic exposed some gaping holes in our societies. I don't have any expertise in what it will take to rebound there, so I'll leave it to educated professionals to solve for their specialized areas. The web, however, is something I know and love, so I have advice for this society. I don't care if<br>
you call what you build a site or an app, there are some topics you need to learn more about:</p>
<ul>
<li>
<p>It's time for you to build products that don't require a metric ton of code to provide value.</p>
</li>
<li>
<p>It's time for you to learn <a href="https://adaptivewebdesign.info/">how HTML, CSS, and Javascript best work together</a>.</p>
</li>
<li>
<p>It's time for you to get serious about building for <a href="https://resilientwebdesign.com/">resilience</a>.</p>
</li>
<li>
<p>It's time for you take <a href="https://www.ipc.on.ca/wp-content/uploads/Resources/7foundationalprinciples.pdf">privacy</a>, performance (<a href="https://www.bridgestew.com/journal/giving-a-damn-at-scale/(https://www.crazyegg.com/blog/speed-up-your-website/)">article</a>, <a href="https://scottjehl.com/lfwp/">upcoming course</a>), and <a href="https://a11yproject.com/">accessibility</a> seriously.</p>
</li>
</ul>
<p>Because that's what giving a damn looks like <strong>and it scales</strong>.</p>
Daenerys Stormborn, First of Her Name: A Body Count
2019-05-13T14:17:26-04:00
https://www.bridgestew.com/journal/daenerys-stormborn-first-of-her-name-a-body-count/
<h2 id="outrage-culture">Outrage culture <a class="direct-link" href="#outrage-culture">#</a></h2>
<p>People seem angry about how Game of Thrones is progressing. However, <a href="https://twitter.com/bradcolbow">a couple</a> <a href="https://twitter.com/bdielman">of friends</a> and I don't feel quite the same as the many vocal detractors on Twitter do. Granted, it is not quite the same style of program that was delivered in the first 6 seasons but I can't say that the storyline progression is wrong. According to George R R Martin:</p>
<blockquote cite="https://gameofthrones.fandom.com/wiki/Incest">
<p>The Targaryens have heavily interbred, like the Ptolemys of Egypt. As any horse or dog breeder can tell you, interbreeding accentuates both flaws and virtues and pushes a lineage toward the extremes.</p>
</blockquote>
<p>Daenerys, Rhaegar, and Viserys are the offspring of the Mad King Aerys and his sister Rhaella Targaryen. The potential for madness is there, thanks to their bloodline. Daenerys has been combating the portrayal of Targaryens as madmen throughout her whole story arc, especially because of her father's actions. In Season 6, Episode 9 <i>The Battle of the Bastards</i>, Dany and the Greyjoys have an exchange:</p>
<p><i>Daenerys Targaryen</i>: Our fathers were evil men, all of us here. They left the world worse than they found it. We're not going to do that. We're going to leave the world better than we found it. You will support my claim as queen of the Seven Kingdoms and respect the integrity of the Seven Kingdoms. No more reaving, roving, raiding, or raping.</p>
<p><i>Yara Greyjoy</i>: That's our way of life.</p>
<p><i>Daenerys Targaryen</i>: No more.</p>
<p><i>Yara Greyjoy</i>: No more.</p>
<p>This is the Daenerys that the audience loves and believes in. It's the Daenerys that Missandei, Grey Worm, Jorah, Varys, and Tyrion desire as queen. She's killed and burned people alive before, but we justified it because those she Dracarys'd were allgedly bad people. Let's take a look at the many deaths associated with her—some directly, some indirectly:</p>
<h3 id="season-1">Season 1 <a class="direct-link" href="#season-1">#</a></h3>
<ol>
<li>Viscerys - Daenerys' brother killed by molten gold poured on his head by Khal Drogo in <i>A Golden Crown</i> (episode 6). She shrugged that off pretty easily. He wasn't the best brother, that's for sure, but it didn't phase her at all. That could have been our first clue.</li>
<li>Khal Drogo & Mirri Maz Duur - In <i>Fire and Blood</i> (episode 10), Dany smothers her irreparably damaged husband. This is considered an act of mercy, because while he may technically be alive, he couldn't live. A Khal is not a Khal in this state. Mirri, the Lhazareen priestess who performed the blood sacrifice to save Khal Drogo's life, which kept him in a very damaged state and killed Dany's unborn child, is tied to Drogo's funeral pyre. Dany lights the pyre and enters it with her dragon eggs as Mirri is burned alive. When the fire burns out, Dany remains unburnt with 3 newly hatched dragons, and a legion of devoted followers. The audience (us included) are so dazzled by her not being burned to death and having baby dragons that we overlooked the revenge murder.</li>
</ol>
<h3 id="season-2">Season 2 <a class="direct-link" href="#season-2">#</a></h3>
<ol>
<li>Pyat Pree, Xaro Xhoan Daxos, & Doreah - In <i>Valar Morghulis</i> (episode 10), the wizard from the House of the Undying was the first victim of Dany's dragons, but would not be the last over the course of time. The King of Qarth and Dany's handmaiden betray her by stealing her dragons. As Dany finds them in bed together, she has them locked in the vault that held Xaro's nonexistent fortune and left them to die. Hot take: it's not a good idea to mess with Daenerys, especially if you get caught!</li>
</ol>
<h3 id="season-3">Season 3 <a class="direct-link" href="#season-3">#</a></h3>
<ol>
<li>Kraznys mo Nakloz, Greizhen mo Ullhor, & all the Astapor Slavemasters - In <i>And Now His Watch Is Ended</i> (episode 4), Daenerys sacks an entire city in Slavers Bay, intent to acquire an army. Sure, the slaver talked to her like she was a stupid bimbo. He was clearly a jerk. But she clearly lied about selling her dragon to the asshole, because she burned him instead. Oh yeah, then set the newly acquired army and said dragon off on a killing spree to teach the city of slavers a lesson. A tad harsh...but I loved it, so I didn't log it as an infraction to being a good human.</li>
<li>Many unnamed Yunkai soldiers - In <i>The Rains of Castamere</i> (episode 9) - Dany sends Grey Worm, Jorah, and Daario Neharis to sack Yunkai and liberate the city from slavery. This seems like doing something for the greater good, but let's not forget she really has a much larger goal in mind.</li>
</ol>
<h3 id="season-4">Season 4 <a class="direct-link" href="#season-4">#</a></h3>
<ol>
<li>Oznak zo Pahl - The Champion of Meereen who was killed by Daario before Daenerys catapults the chains of the freed slaves over the city walls in <i>Breaker of Chains</i> (episode 3). Shit happens in wartime, right?</li>
<li>The Great Masters of Meereen - Dany has 163 of them crucified as recompense for the 163 slave children who were crucified on the road to Meereen in <i>Oathkeeper</i> (episode 4). How very “eye for an eye” of her.</li>
<li>A flock of sheep - While not murders in the traditional sense, this is the first glance we get of how the dragons live. Drogon scorches a field of goats for sustenance and Dany pays the herder 3 times their value to compensate him for his loss in <i>The Laws of Gods and Men</i> (episode 6). We see her trying to make up for something that an innocent has suffered at her hand, even if it wasn't intentional. So, we see she's not rotten to the core. I suspect we credit her with this act for much longer than she may have deserved, in retrospect.</li>
<li>Zalla - the 3 year old child of a shepherd, killed by Drogon, as Dany comes to realize she is unable to control her growing dragons in <i>The Children</i> (episode 10). This was bad. Not intentional, but bad. At least she takes action to prevent it from happening again...for a time.</li>
</ol>
<h3 id="season-5">Season 5 <a class="direct-link" href="#season-5">#</a></h3>
<ol>
<li>White Rat - One of the Unsullied who is murdered by a member of the Sons of the Harpy, a group who resists Daenerys' rule in Meereen in <i>The Wars To Come</i> (episode 1). When you invade a city, unrest is bound to happen, right?</li>
<li>The Son of the Harpy, Mossador, & many former slaves and masters - In <i>The House of Black and White</i> (episode 2), after an argument breaks out about what to do with the Son of the Harpy for his crime, Ser Barristan tells Dany that her father, the Mad King, believed his actions were a means of serving justice to his enemies. This tale convinces Dany to put the Son of the Harpy on trial, rather than execute him outright. Mossador kills the Son of the Harpy before his trial begins. Hoping to preserve order in Meereen, Dany publicly executes Mossador, inciting a riot. Woopsie!</li>
<li>Ser Barristan, some Second Sons, Unsullied, Sons of the Harpy, & Meereenese - In <i>Sons of the Harpy</i> (episode 4) the Sons of the Harpy organize an ambush of Second Sons, which escalates to include Unsullied, Grey Worm, and Ser Barristan. Again with the unrest (see earlier comment).</li>
<li>Master Eaton - Dany summons the leaders of the great houses in Meereen to the catacombs where Rhaegal and Viserion are chained up. She has Daario push one of the leaders forward until Rhaegal sets the man on fire and both dragons eat his remains in <i>Kill the Boy</i> (episode 5). That's a brutal lesson. Was it really necessary?</li>
<li>Hizdahr zo Loraq, Pit Fighters, Sons of the Harpy, & many former slaves and masters - In <i>The Dance of Dragons</i> (episode 9), the Sons of the Harpy attempt to ambush the spectacle at the Fighting Pits, only to be thwarted by Jorah, Daario, and Drogon. Drogon bites and breathes fire—dispatching the Sons of the Harpy before Dany mounts him and flies away. Survival instinct isn't a bad thing, really, but even I found it odd back then that she took off without her companion and advisors. It's not like Drogon couldn't have held their weight.</li>
</ol>
<h3 id="season-6">Season 6 <a class="direct-link" href="#season-6">#</a></h3>
<ol>
<li>A temple full of Khals and their bloodriders - Daenerys sets a hut ablaze in Vaes Dothrak when the Khals refuse to serve her. As in season 1, she emerges unburnt and acquires a legion of devoted followers in <i>Book of the Stranger</i> (episode 4). That's a serious disagreement right there. She may not have been familiar with all of their customs, but she was familiar with the lifestyle of the Khals. She had to know how this was going to turn out from pretty early on in the situation.</li>
<li>Belicho Paenymion, Razdal mo Eraz, & the Slaver fleet - In <i>Battle of the Bastards</i> (episode 9), 2 of the 3 Masters who had been funding the Sons of the Harpy are executed by Grey Worm while Dany and the dragons burn up the fleet in the bay. It would seem silly to have dragons and not use them as your strategic advantage in war, right?</li>
</ol>
<h3 id="season-7">Season 7 <a class="direct-link" href="#season-7">#</a></h3>
<ol>
<li>Unsullied & Lannister soldiers - During the attempt to take Casterly Rock, many Unsullied were killed in <i>The Queen's Justice</i> (episode 3). Shit happens in wartime.</li>
<li>Lannister soldiers, Tarly soldiers, & Dothraki warriors - During the Battle of the Goldroad, the Dothraki horde and Dany riding Drogon descend upon the Lannister army and swiftly take them out during <i>The Spoils of War</i> (episode 4). Dragons. Strategic advantage. Been said before.</li>
<li>Randyll & Dickon Tarly - Sam's father and brother are sentenced to “Death by Drogon” for refusing to bend the knee to Daenerys in <i>Eastwatch</i> (episode 5). This was a huge hint that she had it in her to burn people based on principle. This really wasn't necessary. Tyrion offered plenty of options. She didn't take them.</li>
<li>Thoros, Benjen, Wildlings, Brothers in Black, a White Walker, many wights, & Viserion - It's true that Dany and her dragons were present in this battle at Jon's behest, but the death toll keeps going up in <i>Beyond the Wall</i> (episode 6).</li>
<li>Captured wight, Brothers in Black, & Wildlings - These deaths are technically thanks to the Night King, but the source of his heightened military strength is thanks to Dany's deceased dragon, Viserion, that the Night King resurrects and rides as his mount. The season closes with the Night King carving a large path through The Wall thanks to blue dragon fire in <i>The Dragon and the Wolf</i> (episode 7).</li>
</ol>
<h3 id="season-8">Season 8 <a class="direct-link" href="#season-8">#</a></h3>
<ol>
<li>Eddison Tollet, Lyanna Mormont, Beric Dondarrion, Qhono, Jorah Mormont, Melisandre, Theon Greyjoy, Viserion (again), the Night King, & all the remaining wights - The war in <i>The Long Night</i> (episode 3) at Winterfell was coming with or without Daenerys' involvement, but she had an active role in it because she recognized that there will be no Seven Kingdoms to rule if all the living join the Army of the Dead.</li>
<li>Rhaegal & Missandei - In <i>The Last of the Starks</i> (episode 4) the Iron Fleet, equipped with Scorpions, fatally wound Rhaegal, blow apart Dany's fleet, and capture Missandei. Cersei and her army are behind both of these deaths that might not have happened if Dany had not stepped foot in Westeros.</li>
<li>Varys, Harry Strickland, Euron Greyjoy, Qyburn, The Hound, The Mountain, Nora, Cersei Lannister, Jaime Lannister, & basically all of Kings Landing, except Arya and a horse - Dany loses her shit and becomes the Mad Queen in <i>The Bells</i> (episode 5).</li>
</ol>
<p>Let's face it, folks. Dany and her dragons have been wreaking havoc for all 8 seasons and we've liked it. I definitely have. I have dragons on my desk at work, for heaven's sake!</p>
<figure>
<img src="https://res.cloudinary.com/bridgestew/image/upload/c_fit,f_auto,dpr_auto,q_auto,w_715/dragons.jpg" alt="Resin figurines of Daenerys' dragons on my desk.">
<figcaption>Drogon, Rhaegal, & Viserion hanging out in my office.</figcaption>
</figure>
<p>We all believed her to be a worthy ruler because her intentions seemed like they came from the right place in certain situations. Other situations were just necessity of war. There were only a handful of times that the deaths at her had were a bit extreme...but the fact is, season 8 was not the first time she went overboard. This was just the biggest, grandest version of it.</p>
<p>Back in season 5, Ser Barristan told Dany that her father believed much the same thing she did: this was justice for injustice. She was able to temper her baser instincts for a time, but this fire has been burning inside her all along. Puns intended. The loss of Jorah, the loss of her 2 dragons, the loss of Missandei, the betrayals she felt from John, Tyrion, Varys and everything she has had to endure to get to this point were enough for her to snap. It's not actually uncharacteristic...it simply was too abruptly developed for it to feel accurate.</p>
<p>I think the difficulty fans are having accepting this turn of events is because the pacing in seasons 7 & 8 are so much quicker than in all the seasons that came before them. The character development has not been as in depth as before and we have been left to fill in the gaps to justify portions of the story, like Dany burning the innocents she came to liberate from Cersei's rule. As I mentioned to The Brads™, “When we used to fill in blanks in the first 6 seasons it was to try to predict what was coming...not to explain what just happened.”</p>
<h2 id="parting-thoughts">Parting thoughts <a class="direct-link" href="#parting-thoughts">#</a></h2>
<p>This is the final season. There is only one episode left for trying to predict the outcome. I, too, wish Daenerys hadn't had a melt down (more puns!), but it wasn't a gross misrepresentation of her character. We've just been rooting for her for so long, that it was a disappointment to see her move in this direction.</p>
<p>Imagine how Varys felt. He was rooting for her, too. He's the one who convinced Tyrion she was worth the effort, only to figure out too late that she wasn't on the same side he was on: the side of The Realm.</p>
“The Long Night” Review
2019-05-01T15:00:28-04:00
https://www.bridgestew.com/journal/the-long-night-review/
<h2 id="spoilers-ahead-game-of-thrones-pros-cons-and-feelings">!!SPOILERS AHEAD!! Game of Thrones: pros, cons, and feelings <a class="direct-link" href="#spoilers-ahead-game-of-thrones-pros-cons-and-feelings">#</a></h2>
<figure>
<img src="https://www.hbo.com/content/dam/hbodata/series/game-of-thrones/episodes/8/key-art/got-s8-ka-1920x1080.jpg/_jcr_content/renditions/cq5dam.web.1200.675.jpeg" alt="The Iron Throne morphed with the head of Drogon, Daenerys Targaryen's black dragon.">
<figcaption>Drogon peers from the base of the Iron Throne.</figcaption>
</figure>
This was one of the big battles the storyline has been building to from the first episode of the first season of <i>Game of Thrones</i>. I had really been looking forward to it and ended up frustrated. The battle between the living and the dead was epic, as promised, but the lighting was so dark and the fog effects were so thick that it made it too difficult to see and be able to appreciate the action.
<p>From what I could make out, there were parts to the story that I liked:</p>
<ul>
<li><strong>The tenacity of Lyanna Mormont</strong>. Even while being crushed to death, she managed to shatter a giant by stabbing it in the eye with dragon glass.</li>
<li><strong>The scene in the crypt of Winterfell</strong>. Once the Night King pulled his customary move of raising the newly dead to join his regiments, the buried Stark ancestors broke out of their tombs and started ravaging those who were sheltered there for safety.</li>
<li><strong>Arya shattering the Night King</strong>. As the Night King was stretching out his hand to kill her brother, Bran, Arya leaped toward the Night King. He turned and grabbed her by the throat as she dangled in the air. As we hear her choking, she drops her blade into her other hand and stabs him with her Valyrian steel dagger, shattering him to bits of ice. This destroyed all members of the army of the dead, saving everyone who remained alive at Winterfell. It was so gratifying for Arya to play the key role to win the war.</li>
</ul>
<p>An 80 minute episode only delivering 3 remarkable things during a battle we've waited 2 years to see so that the <i>Game of Thrones</i> post production could provide cinema quality editing, was the source of my disappointment. I had expected so much more from the experience. I have a 4K UHD television that should have provided something special in the viewing, but it fell very short.</p>
<p>I read online that many other people shared my dismay which was only mildly comforting. However, other people shared what they did to be able to actually see the action: turning the brightness on their television way up and watching it during the daylight instead of at night. I waited a few days and then tried that to see if I could forgive the episode and find some satisfaction. It worked. I was able to see much more of what happened, but the quality of the video suffered as I had the brightness turned up so high that it appeared to have a transparent white overlay over the whole thing. I wondered if that would make the foggy scenes even more unbearable, but luckily it did not.</p>
<p>During this viewing, I was able to appreciate a few more things:</p>
<ul>
<li>The battle in the air between the two dragons was much more interesting when I wasn't straining to see what was going on in the dark and the fog.</li>
<li>The wights overrunning Daenerys while on top of Drogon was much more intense in the lighter version than the darker one.</li>
<li>The battle scenes with Daenerys and Jorah fighting off undead made his death more bittersweet because the emotion was much clearer to witness.</li>
<li>Because I was less annoyed, I noticed just how beautiful the score of this episode was, especially the portion leading up to Arya's victory over the Night King. That one will definitely make it into my <a href="https://open.spotify.com/user/bridgestew/playlist/6ZhB714pqTa9vSkWrvQzsJ?si=SNbDJwqpRuyMGPT4nU5Qrg">Instrumentals playlist</a>.</li>
<li>Drogon flying in as Daenerys weeps for Jorah, shrouding their bodies with his wing, was quite sweetly portrayed. It was as if he was there to mourn along side his mother and provide what comfort his enormous body could. It reminded me of how my dog used to cuddle up near me.</li>
</ul>
<p>Even with an appreciation for more of the episode, there were things I still didn't care for:</p>
<p>The battle, while epic, had some scenes that went on for too long and the pacing felt off. I realize the episode is called <i>The Long Night</i>, so feeling long isn't the issue all by itself. In fact, I was quite excited that we were finally getting a long episode. However, when Melisandre was working her way to the trench to light it on fire I couldn't understand why she didn't feel more of a sense of urgency. She was moving so slowly toward it as thousands of wights are rapidly streaming toward the living. WTF, Melisandre? I realize you're super old and all, but get a move on!</p>
<p>The action when the Night King descends upon the Godswood was very fast, but once all the living except Bran and Theon are dead it turned slow in a very unnatural, illogical way. The slow conversation delivered between Bran and Theon while the Night King (politely?) waited for it to come to and end made no sense. Theon running what felt like several hundred yards with a long spear toward death while the Night King (politely, again?) waits for him to arrive at his location before dispatching him also seemed like an odd choice. Then it took for-fucking-ever for the Night King to walk that same length to get to Bran's wheelchair while they exchanged looks for an agonizingly long time just to set up Arya's leap to put an end to "The Long Night." Seriously. WTF?! It still would have been possible to appreciate what took place near the Weirwood tree without drawing out those scenes. It felt excessive. I have a decent attention span and I don't like when scenes get rushed, so you would think I would have appreciated this. Alas, I did not.</p>
<p>Lastly, Arya's leap to kill the Night King. Yes, yes I already claimed it as one of the good things about the episode, but it's the specific piece regarding the leap that remains unexplained. Arya is a highly skilled and capable assassin. Clearly, she is able to move without making much of a sound, as evidenced in the scene in the castle where she is dodging white walkers, moving from bookcase-to-bookcase-to-table-to-door. Just before she leaps into the scene, we see a lock of hair shift in a breeze on one of the Night King's generals. I take it we are supposed to understand that is Arya whooshing by. But in 8 seasons, we haven't been shown Arya having invisibility or <a href="http://everquest.allakhazam.com/db/spell.html?spell=220">Spirit-of-the-Cheetah</a>-like superpowers. There is no plausible explanation for how she slipped in, making it past the circle of undead generals, traveling the long distance between them and the Night King unscathed. It seemed highly unlikely.</p>
<h2 id="its-a-wrap">It's a wrap <a class="direct-link" href="#its-a-wrap">#</a></h2>
<p><i>Game of Thrones</i> is my favorite television show of all time. Seriously, I'm that big of a fan. That doesn't mean I can't find fault with it. Maybe if I hadn't had to wait 2 years for this season to air, these things wouldn't have bothered me as much. And yet, it is clear that the episode wasn't a total miss. There are quite a lot of things I liked about it, especially when I saw it a second time.</p>
<p>The weekend was bookended by experiencing the blockbuster movie, <i>Avengers: Endgame</i>, on Friday morning and a seminal episode of <i>Game of Thrones</i> Sunday evening. I expected both to be very satisfying and entertaining. I was really unprepared to be let down by <i>Game of Thrones</i>...even if only a little bit.</p>
Accessibility is Innovation
2019-04-07T13:34:40-04:00
https://www.bridgestew.com/journal/accessibility-is-innovation/
<h2 id="abstract-figures">Abstract figures <a class="direct-link" href="#abstract-figures">#</a></h2>
<p>Jeremy wrote a good article on his site titled <a href="https://jeremy.codes/blog/defining-productivity/">Defining Productivity</a>. In it he writes:</p>
<blockquote>...we're not regarding "users" as <em>human beings</em> who have <em>human limitations</em>. We're reducing them to abstract figures which we can rationalize away when convenient.
<p>...At worst, it causes us to knowingly trivialize them for our own gain.</p></blockquote><p></p>
<p>He's right, but this isn't a new phenomenon. Several jobs ago, I was talking about accessibility and the importance of making sure our code afforded disabled people the ability to use our products. The question was asked, “How many users would that affect, though. Maybe 1%?”</p>
<p>This is trivialization, attempting to justify that such a small amount of people wouldn't be worth the development effort. In business-speak, there's no Return on Investment (ROI) for accessibility.</p>
<p>I didn't know the answer the for the actual percentage of our user base, but my standard response to a question like that is, “Percentage doesn't matter in this area. It only takes <em>one litigious person</em> to impact your business.”</p>
<p>Another counter argument that used to strike a business-nerve was to explain that Googlebots are “blind” users of your site, so if you don't make the site easy for them to crawl and parse, you may take a hit in the findability of your product.</p>
<p>While replies like those still don't focus on the end user, it can strike the right business-nerve, depending on your company's aversion to risk.</p>
<p>Jeremy also stated:</p>
<blockquote>The web we own today is one that apparently can't be bothered to care about accessibility or performance unless those things are profitable—which is exactly why it's so poisonous.</blockquote>
<p>Yep, greed is poisonous. Oddly enough, greed is a decent motivator in the business arena and the good news is, performance generates revenue. Profitability is dependent on how good the business is at managing their costs, but performance can at least provide more income. Google provides <a href="https://www.thinkwithgoogle.com/feature/testmysite">a tool</a> to help <a href="https://twitter.com/bridgetstewart/status/1111982466938667008">determine the possibility of how much</a>.</p>
<p>Accessibility is a tougher sell, because of some common misconceptions:</p>
<p><strong>Myth:</strong> The disabled population is minuscule.</p>
<p><strong>Fact:</strong> According to Disabled World statistics from 2018, <a href="https://www.disabled-world.com/disability/statistics/">10% of the world's population</a> live with a disability, which is approximately 650 million people. In 2017 it was reported that <a href="https://www.disabled-world.com/disability/statistics/american-disability.php">19% of Americans</a> live with physical or cognitive disability. That's nearly double the percentage of the entire world. That's a solid segment of potential customers.</p>
<p><strong>Myth:</strong> This site or app isn't on the ADA's radar, so a lawsuit is unlikely.</p>
<p><strong>Fact:</strong> Here's a <a href="http://www.karlgroves.com/2011/11/15/list-of-web-accessibility-related-litigation-and-settlements/">list of lawsuits</a> demonstrating a range of website types that got caught in the snare. There are plenty of businesses who are risk averse, so this can be a powerful motivator, too.</p>
<p><strong>Myth:</strong> Accessibility affordances only impact the disabled—more specifically, people who use screen readers.</p>
<p><strong>Fact:</strong> <a href="https://www.sitepoint.com/interview-derek-featherstone/">Voice recognition and screen magnification</a> are other aids that assist people regularly. Voice assistants (such as Alexa & Google Home) <a href="https://www.recode.net/2019/1/8/18173696/amazon-alexa-google-assistant-smart-speaker-sales-npr">sales grew 78% in 2018</a>. The target market for those devices is not contained to people with disabilities. According to <a href="https://www.emarketer.com/content/us-voice-assistant-users-favor-their-smartphones">eMarketer in 2017</a>, standalone devices like a smart speaker were used by 8% of the people who use voice assistants. According to the poll, the most widely used device is a smartphone at 42% of the people who use voice assistants. Let's break down those statistics a bit further into the reasons <em>why</em> people use voice:</p>
<blockquote>Turns out more than 80% of those polled liked the fact they could use voice assistants without having to touch a device. Another 62% just thought they were fun to use, while 60% found using spoken language a more natural way to interact with services than physical typing.</blockquote>
<p>Note that none of those answers are disability related. They use them because they <em>like</em> to, not because they <em>have</em> to.</p>
<p>How well does your site or app work with voice assistants? If they aren't already, expect senior leadership to ask that question because they are probably being pummeled with data about voice assistants <a href="https://www.emarketer.com/topics/topic/smart-speakers-voice-assistants">every time they read eMarketer</a>. While there isn't a lot of voice enabled purchasing taking place just yet, there is the almighty engagement statistic to consider. Senior leaders love reports about engagement.</p>
<h2 id="my-feelings-on-the-matter">My feelings on the matter <a class="direct-link" href="#my-feelings-on-the-matter">#</a></h2>
<p>I wish that doing something just because it is the right thing to do was how the world works, but it isn't. It's far from ideal to come up with business cases for doing the right thing, but they can be made. Coincidentally, while we're making that business case, we are re-establishing the needs of people as a “value proposition,” which—in business-speak—refers to something that draws a potential customer. It turns out that disabled people's money spends just as well as abled people's money. The same thing holds true for people on shitty internet connections, or those who don't want to turn over significant elements of personal information just to engage with your brand.</p>
<p>In my opinion, there is a much bigger advantage to be gained here as a team that builds digital products. If you aren't paying attention to the needs of the disabled, you are actually way behind the curve in the arena of “innovation.” (Senior leaders love that term even more than engagement.) The link provided earlier about voice recognition and screen magnification, was from 2008. Let that sink in a moment. Voice recognition was being used to help disabled people <em>a decade ago</em>. If we were building our products for those accommodations back then, we'd be way ahead of the curve. No more mad scrambles to retrofit those capabilities in when they hit the mainstream.</p>
<p>It's time to start convincing our bosses and coworkers that accessibility is about innovation. That's an easier sell and it generally fits very neatly in their list of initiatives.</p>
Stuffing the Front End
2019-03-24T04:34:00-04:00
https://www.bridgestew.com/journal/stuffing-the-front-end/
<h2 id="the-vuejs-introduction-video">The Vue.js introduction video <a class="direct-link" href="#the-vuejs-introduction-video">#</a></h2>
<p>I've heard really good things about Vue.js, so I had an interest in poking around. I'm not strong in Javascript. My expertise is centered around HTML & CSS. I'm not usually in the need of a framework, but I still like to know what is out there for use, in case a need should arise. So, I watched <a href="https://player.vimeo.com/video/247494684">the introductory video</a>.</p>
<p>The presenter in the video talks about how it is possible to use Vue to create “a richer, more interactive experience” by using it for a portion of your application. Yeah, I can get behind that. I used jQuery like that, back in the day. It's what drew me to DOM Scripting. I wanted a bit more interaction. In the early part of my career, the separation of concerns were listed as the following:</p>
<ol>
<li>Markup (HTML): defining the content as semantically as possible.</li>
<li>Stylesheet (CSS): defining how the content should look and be presented.</li>
<li>Script (JS): defining how the content should behave based on some triggers.</li>
</ol>
<p>Progressive Enhancement encouraged writing the code to render a website, in that order. I still encourage this today.</p>
<p>It is my understanding that the lines began to blur between style and interaction very early on—when links could be altered with <code>a:hover</code> & <code>a:active</code> styles defined. Puritans said this was interaction and belonged in Javascript's domain. The ship has long since sailed on this one, so arguing about it is of no value here, but I can't fault the logic in the statement. This occurred long before the days of CSS animation and transforms. As more of this kind of functionality becomes part of CSS, I find fewer reasons to need Javascript. I am aware of the implications and muddiness in separation of concerns as CSS gets more powerful and, seemingly, interactive. But I digress...this post is supposed to be about Javascript frameworks, not CSS. That's a different post for a another time.</p>
<p>The presenter in the video made a comment that spurred me to write. He said, “Or if you want to build more business logic into your front end from the get go, Vue has the core libraries and the ecosystem you'll need to scale.” That's the sentence I would really like to dig into in this post.</p>
<h2 id="business-logic-in-the-front-end">Business logic in the front end <a class="direct-link" href="#business-logic-in-the-front-end">#</a></h2>
<p>Why? Seriously, I'm asking. I am not, nor do I have any desire to be, a back end developer. I love that I have friends and coworkers who specialize in this area. I heavily rely on them to be good at that, so I can hone my craft on the front end. They (back end devs) handled the business logic, while I (front end dev) handled the interface. That was quite a lovely separation of concerns in its own right. It's not as though either side didn't have enough work to keep busy, right?</p>
<p>I have been around long enough to hear the purveying thought that putting the business logic on the front end allowed the web app to be more performant because it didn't have to make a trip to the server to do anything. It was all right there, ready to be called upon. Ok, I can see some merit to that <em>idea</em>, but is it a <em>reality</em>?</p>
<p>According to HTTPArchive <a href="https://httparchive.org/reports/state-of-the-web?start=2016_02_01&end=latest&view=list">for the past 3 years</a> sites have been getting bigger:</p>
<ul>
<li>Total kilobytes are up 77.8% for mobile and 28.1% for desktop.</li>
<li>Total requests are up 16.7% for mobile, but down 8.5% for desktop.</li>
</ul>
<p>Focusing just on Javascript, <a href="https://httparchive.org/reports/page-weight?start=2016_02_01&end=latest&view=list#bytesJs">HTTPArchive reports</a>:</p>
<ul>
<li>Transfer size of kilobytes is up 50.8% for mobile and 36.3% for desktop.</li>
<li>Number of external requests is up 26.7% for mobile and 11.1% for desktop.</li>
</ul>
<p>It stands to reason that because so many people use mobile devices for just about everything these days, that sites are doing stuff for mobile and the stats reflect that. I have to wonder, is the development community paying attention to all the advocacy reminding us that mobile's network speeds and wild fluctuations at any given point in the transfer make it less reliable to get the data to the user to begin with?</p>
<h3 id="lets-focus-on-mobile-for-a-moment">Let's focus on mobile for a moment... <a class="direct-link" href="#lets-focus-on-mobile-for-a-moment">#</a></h3>
<p>HTTPArchive shows that the median time it takes for the page's primary content to appear on the screen takes 5.8 seconds, up 20.8% <a href="https://httparchive.org/reports/loading-speed?start=2016_02_01&end=latest&view=grid">over the past 3 years</a>. <a href="https://www.thinkwithgoogle.com/marketing-resources/data-measurement/mobile-page-speed-new-industry-benchmarks/">Google has been warning us</a> for awhile now that <strong>53% of mobile visits leave a page that takes longer than 3 seconds to load</strong>. That means that a large number of visitors probably abandoned these sites because they were staring at a blank screen for 3 seconds, said “fuck it,” and left approximately half way before the page showed up. The fact that the next page interaction would have been quicker—assuming all the JS files even downloaded correctly in the first attempt—doesn't amount to much if they didn't stick around for the first page to load. What was gained by putting the business logic in the front end in this scenario?</p>
<h2 id="scale-the-almighty">Scale, the almighty <a class="direct-link" href="#scale-the-almighty">#</a></h2>
<p>The presenter in the video introduction for Vue also mentioned building for scale. <a href="https://www.conversational.com/the-difference-between-growth-vs-scaling/">Not growth, but scale</a>. I am of the opinion that web apps focused on scale have over-optimized in anticipation of a reality that may never come. As a result, bloat happened.</p>
<p>How many features are built-in to a framework or library that your app doesn't need yet (and may never need)? How much can you hold back from the package you send to the web? How dependent are these modules and bits of code on one another? To me, that sounds like a lot of analysis up front to pick apart a tool before I even write a single line of code to be truly productive. It is also the antithesis of Progressive Enhancement, which strives to start with the bare minimum necessary to make it work and build up from there.</p>
<p>For example, HTML works all by itself. Literally. CSS and Javascript are not required to build an entire interactive website. It's not going to be charming or fit your brand, but it will work. That's about as MVP as MVP can get! It also doesn't require a swath of <code>node_modules</code> to start building something.</p>
<p>So, the question really is: does <strong>your project</strong> need to think about scale at this point in the building process? I think the assumption is that it is never too soon to prepare for scaling. I disagree. Make it work first. Then think how to scale, because if you don't work in this manner, scale isn't actually happening in reality, only in theory. See the Google stat I mentioned earlier about 53% of the traffic likely bailing on the website/app. Chances are, you're losing potential visitors, customers, and revenue.</p>
<p>There was a <a href="https://twitter.com/andybelldesign/status/1106907809550139393">mini discourse about scale on Twitter</a>. It is these conversations that support the notion that if you are building for scale before there is an actual need to, you are likely stunting the growth of your product/app/service, preventing it from actually succeeding.</p>
<h2 id="bridget-why-do-you-hate-joy">Bridget, why do you hate joy? <a class="direct-link" href="#bridget-why-do-you-hate-joy">#</a></h2>
<p>I don't. It's just that the Vue introductory video was the unfortunate catalyst to this diatribe, based on a single sentence less than 50 seconds in. As an industry, we need to get better at applying <a href="https://en.wikipedia.org/wiki/Critical_thinking">critical thinking</a> and thoughtful analysis before we start writing code.</p>
<p>My friend, <a href="https://ctmiller.net/">Chris Miller</a>, has a sign hanging in his office that says, “First, solve the problem. Then, write the code.” According to a web search, it appears that John Johnson said it. I smile every time I see it, at least on the inside. Too many times the tooling gets selected, then the code gets built, then sharing the work for admiration, then find a problem that it might solve. Not every situation is like this, but too many are. It's tiring.</p>
<p>I'm going to return to the introductory video now, to see if I can imagine when I might find a good use for something like Vue.</p>
How to: IndieWeb Syndicate
2019-02-10T08:55:16-05:00
https://www.bridgestew.com/journal/how-to-indieweb-syndicate/
<p>TL;DR - Use <a href="https://github.com/maxboeck/mxb">Max Böck's 11ty/Netlify starter template</a>, so that Twitter syndication comes standard.</p>
<h2 id="indieweb-syndication-why-bother">IndieWeb syndication - why bother? <a class="direct-link" href="#indieweb-syndication-why-bother">#</a></h2>
<p>How many social media sites have you signed up for that went belly up? Have you joined a site that provided you a service only to have that service's offering change in a way that didn't suit your needs as they rearranged their payment plans or got gobbled up by a bigger company? Things like:</p>
<ul>
<li>Delicious</li>
<li>Path</li>
<li>Google Reader</li>
<li>Stumbleupon</li>
<li>Flickr</li>
<li>Gimmebar</li>
<li>Springpad</li>
</ul>
<p>I have. Trying to get content that I supplied to them back out of that site/service so that I could retain it for future use has been annoying. If the stuff I find interesting or worth curating was contained on my site and then shared out with others from there, it would remove that necessity from my life entirely.</p>
<p>The fact is, the data I got back from those sites and services was a volume of parsing and processing that I was ill equipped to handle anyway. So, aside from the OPML file I have used to go from one RSS Feed Reader to another, that stuff lays dormant in a file somewhere if I have not lost it in the years since.</p>
<p>The IndieWeb wiki has <a href="https://indieweb.org/POSSE#Why">its own explanation for why</a> it is good to publish on your own site and syndicate elsewhere. They refer to that as POSSE, which is too cheeky an acronym for me, but I don't judge others for using the term. Ok, I might judge a little, but I still agree with the underlying concept of owning my own data and letting other sites and services have access to it, at my discretion.</p>
<h2 id="privacy-concerns">Privacy concerns <a class="direct-link" href="#privacy-concerns">#</a></h2>
<p>Syndicating content out from my site to other sites is a choice I actively make, so I don't feel wary about GDPR implications, or those that will come from California and Colorado regulations that are impending soon. I believe those regulations are just the beginning of what will eventually become a more widespread mandate. I'm still scrutinizing whether capturing webmentions back to things I write might be problematic. I don't want to have to write a privacy policy or have opt-ins and -outs just so I can write what I want and have people participate in the conversation. So, for now, this is a one-directional effort: I write then share it out by my own consent.</p>
<h2 id="the-guts-of-syndication">The guts of syndication <a class="direct-link" href="#the-guts-of-syndication">#</a></h2>
<p>Max Böck wrote up a <a href="https://mxb.at/blog/syndicating-content-to-twitter-with-netlify-functions/">nice explanation</a> for how he got notes he writes on his 11ty based site (using Netlify) syndicating out to Twitter. If you are interested in doing this, too, start your reading there. I am not going to cover his explanation because he wrote it better than I can. This entry explains what I had to do using his article as my starter.</p>
<p>Because I'm not quite as savvy at this, I hit a snag that I couldn't figure out on my own. Hopefully, sharing that here will help others avoid making the same mistake.</p>
<h2 id="lambda-what-now">Lambda what now? <a class="direct-link" href="#lambda-what-now">#</a></h2>
<p>So, 11ty is the static site generator I'm using and Netlify is the platform that publishes things for me that are beyond my current skill level. Max uses those as well. If you want to skip having to go through this part of the process that I had to, you can go straight to using his starter template and get up and running more quickly. That wasn't an option for me since I already had this site up and running. For me, this had to be an add-on, which meant figuring out what parts of his starter template I needed and getting them to adjust to my set up.</p>
<p>I have a wee bit of <a href="https://www.bridgestew.com/journal/new-approach-new-site/">interest in learning</a> these things anyway, so I'm writing this up to remind myself what it took to accomplish this. Choosing 11ty & Netlify as the solution for serving up my website means that there is no database generating things on the fly. There are a bunch of files that make up what you see on the website--that's it. That's what makes it "static." To do anything fancier, like getting one of those files to appear elsewhere on the web, a program has to do something. That's where Lambda functions come into play. <a href="https://www.netlify.com/docs/functions/">Netlify has an explanation</a> on their site about what they are and what they do.</p>
<p>The truth is, my Javascript skills are not strong enough to have written <a href="https://github.com/maxboeck/mxb/blob/master/_lambda/deploy-succeeded.js">the necessary function</a>, so thank goodness Max had already taken care of that part!</p>
<h2 id="making-it-work">Making it work <a class="direct-link" href="#making-it-work">#</a></h2>
<ol>
<li>Apply for <a href="https://developer.twitter.com/en/apply/user">Twitter developer access</a>. <a href="https://www.bridgestew.com/journal/how-to-twitter-developer-access/">Steps for applying</a> are in another entry.</li>
<li>Put Max's <code>deploy-succeeded.js</code> file in a functions directory so that it will get compiled when <code>netlify-lambda</code> works its magic.</li>
<li>Search through my package.json file to see what modules I was missing that the new Javascript function required. For me it was:
<ul>
<li>node-fetch</li>
<li>dot-env</li>
<li>twitter</li>
<li>html-entities</li>
<li>netlify-lambda</li>
</ul>
</li>
<li>Run <code>npm install</code> at the command line in the terminal to get each of those modules into my build once I had identified them. For example:<pre class="language-bash"><code class="language-bash"><span class="highlight-line"><span class="token function">npm</span> <span class="token function">install</span> node-fetch</span></code></pre>
Running that command in the terminal automatically updates the package.json file to include the module, making it available to my project. The alternative is to manually add the modules to the package.json file, then run <code>npm install</code> to obtain all the packages at once. Both ways work.</li>
<li>Add my Twitter API access tokens to a .env file<sup><a href="#option">1</a></sup>. This is where I got tripped up. As Max helped me work through what my issue was--thanks a million, Max!--he shared how to expand the error handling so it might point me in the direction of where my trouble was. It did! I learned that I had "Bad Authentication data" which I did not know before. While I didn't quite know how to fix it, at least I had a pointer that reaching Twitter was the point of failure. I hadn't worked with that a .env file type before, so I copied and pasted what Max had shown on his site, but it was the wrong way to format the contents. Once I figured out how it should be formatted, I let Max know what my issue had been. He updated his 11ty starter template to include an .env.sample file to the repository so that people can avoid making the same mistake I did.</li>
<li>Update .gitignore to include the .env file because it is a bad idea to have Twitter API keys posted to a repository on Github where anyone can find them and use them.</li>
<li>Update netlify.toml
<ul>
<li>Create <code>functions = "lambda"</code> so that Netlify will know to trigger the files I have stored there when deploying my site.</li>
<li>Update the <code>command</code> that builds my site from "eleventy" to "trigger," which is what I named it in my package.json file, explained below.</li>
</ul>
</li>
</ol>
<p>Since I had not worked with Lambda functions before, I followed <a href="https://scotch.io/tutorials/build-and-deploy-a-serverless-function-to-netlify">an example written by James Quick</a> at <a href="http://scotch.io/">scotch.io</a> for how they work in Netlify and how to test them. Once I understood the concept, I managed follow along.</p>
<p>James uses Gatsby for his website, so I had to make an adjustment because I use 11ty. Netlify is expecting a command of "eleventy" to build the site. I don't know if you can chain commands in the netlify.toml file. I know by trial and error that you cannot have multiple <code>command</code> lines with different things being called. I know it can be done in package.json, so I made the change there to run eleventy <em>and</em> compile the lambda function in one call. In order for the function to get triggered, I had to add a few more lines to the <code>scripts</code> portion of my package.json file:</p>
<pre class="language-json"><code class="language-json"><span class="highlight-line"><span class="token comment">// compile the site and trigger the lambda function</span></span><br><span class="highlight-line"><span class="token property">"trigger"</span><span class="token operator">:</span> <span class="token string">"eleventy & npm run build:lambda"</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment">// run the lambda function in my local environment for testing</span></span><br><span class="highlight-line"><span class="token property">"start:lambda"</span><span class="token operator">:</span> <span class="token string">"netlify-lambda serve lib/functions"</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment">// this is the command shown in the first line (above) that compiles</span></span><br><span class="highlight-line"><span class="token comment">// the lambda function</span></span><br><span class="highlight-line"><span class="token property">"build:lambda"</span><span class="token operator">:</span> <span class="token string">"netlify-lambda build lib/functions"</span></span></code></pre>
<h2 id="conclusion">Conclusion <a class="direct-link" href="#conclusion">#</a></h2>
<p>In my opinion, this stuff is not easy. It takes a bit of mental taxation for someone who is not writing programs or doesn't know how servers get the job done for showing websites to the masses. Still, it was really rewarding for me to learn it. While I wouldn't be able to write the necessary code from scratch, at least I have an understanding of what is going on in that code.</p>
<p>I continue to be grateful that the web development community has so many open, sharing individuals who will give of their time to help others. That is one of the things that drew me to make web development my career. I couldn't have gotten where I am today without the generosity of these folks.</p>
<p>I'm also very glad that the IndieWeb movement has progressed far enough to make it easier for people of my skill level to join in the fun. I don't think we are quite yet at the place where non-professionals can get up and running completely, but it feels like it is getting closer.</p>
<hr>
<p><em>Update: As of some time in mid-April 2019, something broke the Function and it stopped working. In fact, it prevented my site from building. It was fixed by adding encoding to the package bundle. At the command line, typing the following got things working again.</em></p>
<pre class="language-shell"><code class="language-shell"><span class="highlight-line"><span class="token function">npm</span> <span class="token function">install</span> encoding</span></code></pre>
<hr>
<p><small id="option">1. Max mentioned that it is possible to store API tokens in Netlify's build environment variables (Settings > Continuous Deployment > Build environment variables) instead of using a .env file. Good to know!</small></p>
How to: Twitter Developer Access
2019-02-10T08:54:45-05:00
https://www.bridgestew.com/journal/how-to-twitter-developer-access/
<p>TL;DR: Skip optional fields.</p>
<h2 id="syndicating-from-site-to-tweets">Syndicating from site to Tweets <a class="direct-link" href="#syndicating-from-site-to-tweets">#</a></h2>
<p>The steps for applying for Twitter developer access involve filling out a form. That's not hard, but folks who are not familiar with what fields are necessary to syndicate their content might appreciate having a clear list here.</p>
<ol>
<li>Go to <a href="https://developer.twitter.com/en/apply/user">Twitter developer access</a>.</li>
<li>Click "Create app" in the top right corner.</li>
<li>Give your app a name. For me, it was simply "<a href="http://bridgestew.com/">bridgestew.com</a>".</li>
<li>In the application description field I put, "This app will allow me to syndicate tweets from my own domain to Twitter."</li>
<li>Provide your app/website URL. For me that is, "<a href="https://www.bridgestew.com/">https://www.bridgestew.com</a>".</li>
<li>I skipped the fields after the website URL until I reached "Tell us how this app will be used (required)".</li>
<li>My description for how the app would be used was, "To send my own original comments to Twitter as Tweets. The goal is to remain connected to social media, while collecting my own personal thoughts and comments on my personal website."</li>
<li>Click on "Keys and tokens". Access token & Acess token secret will need to be generated, since those are not created by default. Those 4 tokens are what you will need to connect to Twitter APIs from here on out.</li>
</ol>
<p><img src="https://res.cloudinary.com/bridgestew/image/upload/c_fit,dpr_auto,f_auto,q_auto,w_700/v1549822957/twitter-access-tokens.jpg" alt="Twitter access tokens screen"></p>
A Simpler Web: I Concur
2019-01-30T19:33:00-05:00
https://www.bridgestew.com/journal/a-simpler-web-i-concur/
<h2 id="what-prompted-this-discussion">What prompted this discussion <a class="direct-link" href="#what-prompted-this-discussion">#</a></h2>
<p>On one of the Slack channels at work, I shared a link to <a href="https://hackernoon.com/modern-web-development-bf0b2ef0e22e">an article by Mark Nutter</a> that is nearly 2 years old, but could have been written yesterday, as far as I was concerned. <a href="https://ctmiller.net/blog/2019/01/25/a_simpler_web.html">Chris</a>, brought up that he got off the front end dev train when Ajax first entered the scene, because he thought it was an over-engineered solution for something that could be accomplished on the back end. That was an interesting thought to me.</p>
<p>The first bit of Ajax that I tinkered with was due to <a href="https://adactio.com/">Jeremy Keith</a>'s book "<a href="https://domscripting.com/blog/">DOM Scripting</a>." I knew absolutely no Javascript at the time, but he wrote in such a way as to have it make sense to me. I wasn't aiming for turning what I built from being a website into a web app. I liked the idea of being able to update something in the page I was building with a portion of content that might live on another page. I could just call out to that portion and insert it, almost like magic. No page reload required.</p>
<p>At the time, I didn't actually see page reloading as the enemy. It was a nice bit of icing on the cake for it not to trigger, but I was more interested in how this technique would allow for me to develop sites in a more DRY (Don't Repeat Yourself) fashion. That was the real draw for me. As the <a href="https://jquery.com/">jQuery framework</a> started to dominate, manipulating the DOM (Document Object Model) got a lot easier. What jQuery brought to the table for me was a way to target areas of a page with a syntax that was familiar and easy to read. The bonus was that it also abstracted away the extra bits Jeremy's instruction demonstrated needed to be considered if we wanted to develop for all browsers and not just the latest, coolest available.</p>
<h2 id="what-ive-seen-with-my-own-two-eyes">What I've seen with my own two eyes <a class="direct-link" href="#what-ive-seen-with-my-own-two-eyes">#</a></h2>
<p>My career in web development began after Browser Wars 1.0 had come to a close, but web standards were still in need of advocating. A Meetup group in my area was just beginning to form and I was fortunate enough to make first contact with like-minded nerds who would help me become the kind of Front End Developer I was proud to be. Even though my career doesn't date back to the very early days, like Chris can claim, I was in web development early enough to remember the bad old days when Internet Explorer 6 was no longer the darling of the web, but the evil, despicable beast to be wrangled into submission, so that it resembled the cool stuff we could accomplish in Firefox, Safari, Opera, and eventually Chrome.</p>
<p>In those days, we used .png images to fake rounded corners and the most popular use for a .gif at the time was for 1x1 pixel spacing, not sharing funny retorts on social media or embedding memes in our slides. The other thing we did was throw gobs and gobs of Javascript at a slow as hell rendering engine forcing whatever backwards compatibility we could at shitty browsers for the sake of "advancing the web!"</p>
<p>Yeah, I was one of those. Just like <a href="https://www.smashingmagazine.com/2018/12/internet-explorer-what-we-wished-for/">Mat Marquis described</a>, I had wished for one rendering engine to rule them all so I could just do cool stuff. I was a developer who wished people would just upgrade their damn browser already, but I knew first-hand why they couldn't. I was a developer inside a behemoth organization with an IT department who blocked the web team from being able to access Facebook, Twitter, & Youtube, to protect us from stealing time from the organization...all the while not realizing that when I was on <a href="https://www.zeldman.com/">Zeldman.com</a> or some other site they didn't understand, it was to <em>help me do my job</em>. Oh, and all 40,000 employees of that organization who might access the internet were on IE6, even though Microsoft had released IE8. Because of that, when we had to get approval for what we were building it <em>had to work</em> on IE6 or our bosses wouldn't be able to access it, thus my ire at how the web worked, or in my view, lagged behind.</p>
<h2 id="what-changed-my-mind">What changed my mind <a class="direct-link" href="#what-changed-my-mind">#</a></h2>
<p><a href="https://alistapart.com/article/understandingprogressiveenhancement">Progressive Enhancement</a> led me out of my cocoon and showed me how to better develop for the medium on which I worked. It was because <a href="http://simplebits.com/">Dan Cederholm</a> asked and answered the question, "<a href="http://dowebsitesneedtolookexactlythesameineverybrowser.com/">Do websites need to look the same in every browser?</a>" that I came to see how much easier my job could be if I would just stop fighting with browsers and start building for the web as it stood. <a href="https://www.aaron-gustafson.com/">Aaron Gustafson</a>'s book <a href="https://adaptivewebdesign.info/">Adaptive Web Design</a> was the clincher, though, that really drove home how beautifully the web works--by design!</p>
<p>Here are some reasons that building for the web is such a joy:</p>
<p><strong>Fault tolerance</strong>. I believe this is woefully undervalued to this day. HTML and CSS have this gem baked in. It's crazy powerful! It makes the web a much friendlier place. You can screw something up and your page will still load. Depending on how mildly you screw something up, your page might only appear a little "off." It's based on the <a href="https://en.wikipedia.org/wiki/Robustness_(computer_science)">robustness principle</a>, but goes a step further than displaying error messages when faulty input is encountered. A web browser does its best to approximate what was intended and display that best guess. If it can't figure it out, it will ignore it and continue on to render what it can decipher.</p>
<p>It took awhile for front-end developers nearly a decade ago, including some of the best of us, to recognize how this baked-in robustness allowed for us to write CSS without using <a href="https://developer.mozilla.org/en-US/docs/Glossary/Vendor_Prefix">vendor prefixes</a>. We all got swept up in the cool, new features that browser vendors were implementing at experimental stages. We wanted to make use of those things and wrote quite a bit of overwrought CSS just to do so. Even though we cognitively understood that we didn't have to have websites look the same in every browser, we stacked on all the vendor prefixes in order to trigger every browser that supplied one. We eventually realized this was unsustainable. We awoke from our collective hallucination and got back to Progressive Enhancement roots.</p>
<p><strong>The <strong><a href="https://twitter.com/The_C_In_CSS/"><strong>C in CSS</strong></a></strong>: the cascade</strong>. More to the point, what is good about the global nature of it. There are some styles that actually belong in the global scope. Set it and forget it type stuff. Typography rules can be written so that they apply to everything rather then declaring them over and over again for each individual component. Because the cascade is our friend, we can make tweaks and alterations as blocks need to be redefined.</p>
<p>I'm not naive. I have certainly run into my fair share of broken styles because something wasn't properly contained...especially in bigger projects. But then plenty of articles sprung up explaining how to architect our CSS based on systems & components instead of individual pages. The Object Oriented CSS (<a href="http://oocss.org/">OOCSS</a>) framework hit the scene, thanks to <a href="http://www.stubbornella.org/content/">Nicole Sullivan</a>, and <a href="https://snook.ca/">Jonathan Snook</a> introduced <a href="https://smacss.com/">SMACSS</a>, which taught us how to make our own component-based frameworks when he shared the methodology behind scoping CSS to objects.</p>
<p>This was a pivotal point in time. Front End Developers began to adopt some of the best practices that our Back End Developer counterparts had been employing for years. As front end development began to adopt back-end best practices those who may have been "traditional programmers" became attracted to what was going on in the front end. Javascript's maturity over time and the introduction of Node.js opened gates that once were locked, due to a lack of interest (in both directions). The front end now had "real promise" to those who built programs and systems to support interfaces.</p>
<p>It makes sense to me that traditional programmers will recoil in horror when faced with anything declared in the global scope. Developers who have a solid aptitude for working in CSS, determine what should live there and what should not. We experiment with how much is too much and we find <a href="https://alistapart.com/article/axiomatic-css-and-lobotomized-owls">interesting discoveries</a> during those experiments. The global scope is your friend, when wielded with reverence.</p>
<p><strong>Javscript, the good parts</strong>. This is going to go on a tangent, because I have to explain what I have experienced to demonstrate how much Chris's statement about solving something in a more complex way than might be needed resonated with me.</p>
<p>About 8 years ago, I interviewed for a role at a startup that had a web-based platform. They also had a web-based mobile version of that platform that was not at parity with the other platform. They were basically trying to make their mobile app version behave like a native iOS app. It was heavily (over)architected in Javascript.</p>
<p>I was put on the mobile team, hired as an expert in UI implementation, but I was essentially relegated to cleaning up the UI after the Javascript developer had taken things as far as he could. Frankly, it was a waste of my expertise. It finally came to a head when he had been struggling for 2 weeks(!) to get a video to play at the click of a button and display as large as possible on a phone. I looked under the hood and got lost in all the looping functions and the variables and couldn't figure out what the code was supposed to do. I couldn't find any HTML <code><video></code> being referenced. I couldn't see where a link or a button might be generated. I was lost.</p>
<p>I asked him to explain what the functions were doing so I could help figure out what could be the cause, because the browser can play video without much prodding. Instead of successfully getting me to understand what he had built, he argued with me about whether or not it was even possible to do. I tried, at first calmly, to explain to him I had done it many times before in my previous job, so I was absolutely certain it could be done. As he continued to refuse my explanation, things got heated. When I was done yelling at him (not the most professional way to conduct myself, I know), I returned to my work area and fired up a branch of the repo to implement it. 20 minutes later, I had it working. I rubbed his nose in it and walked out of the office to finish the day working from home. It was my mic drop.</p>
<p>Yes, I could have handled myself better, but it's not a great feeling to have someone tell you that you don't know your job when the case is really that <em>they</em> don't know your job. If they would just let you do your part, then we could all shine. You try to excel at your parts. I'll try to excel at mine. Together, we build something cool.</p>
<p>I was so frustrated by how over-architected that "web app" was that I was hell bent to rebuild it from the ground up using progressive enhancement as my guiding principle. This was before Progressive Web Apps (PWA) had a name or <a href="https://abookapart.com/products/progressive-web-apps">books written on how to do it</a>. I would have been figuring it out as I went and with Javascript not being my strong suit, it would have taken me forever. Imagine how vindicated I felt when the term PWA was coined and Google started suggesting (err demanding) that this was the better way. This better way doesn't vilify Javascript. It plays to its strengths, allowing HTML and CSS to retain theirs, too. Everybody wins by excelling at their part. It works for humans as well as languages!</p>
<h2 id="pendulums-swing-or-everything-is-cyclical">Pendulums swing or everything is cyclical <a class="direct-link" href="#pendulums-swing-or-everything-is-cyclical">#</a></h2>
<p>Ecclesiastes 1:9-11. "What has been will be again, what has been done will be done again; there is nothing new under the sun. Is there anything of which one can say, 'Look! This is something new'? It was here already, long ago; it was here before our time. No one remembers the former generations, and even those yet to come will not be remembered by those who follow them."</p>
<p>When I reflect back on my decade plus of front end development, I am reminded of how much I sought to move the web forward, to make it do more than what was already there. First, it was because all I could see was what was lacking. I was immersed in my frustration. But, as in all things in life, your perspective can change and you begin to take note of what is right instead of only what is wrong.</p>
<p>The complex, bloated web of today is not new. We've been here before, even if the context was different. For some of us, this is the second time we're seeing it. For others, it's their 3rd (maybe even 4th) go around! While the over-engineered web apps have the best of intentions and barriers blocking them from achieving what they seek, they get lost in what is missing instead of <em>striking a balance</em> by using what is present to its fullest potential, and then layering in what is essentially a prototype or polyfill of what the web platform is missing that they require to meet their full potential.</p>
<p>That approach is less bloated, allows for greater access to the products or services by all device types, even the ones we don't know will exist a few years from now. Robustness and <a href="https://resilientwebdesign.com/">resilience</a> are computer science best practices. As the front end community matured into recognizing that they applied to our work, we need to continue to advocate building our projects in this manner.</p>
CSS Nitpicking
2019-01-29T21:28:59.851-05:00
https://www.bridgestew.com/journal/css-nitpicking/
<p>Ok, I have to confess I have a real nit-pick-turned-ax-to-grind when it comes to how the cascade gets discussed. I get annoyed when, to get performance gains, it is recommended to "in-line" the critical path CSS. That's incorrect, pedantically speaking. Here's how the author written CSS gets connected to the HTML:</p>
<ol>
<li><strong>Linked CSS</strong>. Using <code><link rel="stylesheet"></code> is lovely and wonderful, but it is the weakest in the line of succession. Styles written with the following methods will override declarations contained in the external, linked CSS file.</li>
<li><strong>Embedded CSS</strong>. Use of a <code><style></code> tag in an HTML file will take precedence over declarations in a linked file, if there are collisions in the way CSS has been architected. <em>This is the what should be used</em> if you aim improve performance with critical path CSS inclusion.</li>
<li><strong>Inline CSS</strong>. Use of <code>style=""</code> on a specific element in the DOM trumps the 2 previous forms of CSS if a rendering engine encounters overlapping style declarations. Do not write your CSS here to get performance gains. It's too hard to maintain this way.</li>
<li><strong>!important</strong>. Use of <code>!important</code> will basically break any ties, but it makes the code more brittle and is highly discouraged. Use with extreme caution.</li>
</ol>
<p>Benjamin Johnson provides a more extensive <a href="https://blog.logrocket.com/how-css-works-understanding-the-cascade-d181cd89a4d8">explanation of the cascade</a> outlining additional topics to factor in that I didn't mention above.</p>
<p>Kids, remember that you are not "inlining" your CSS for performance gains. You are "embedding" your CSS. Embeeeedding.</p>
How To: IndieWeb Microformats
2019-01-20T21:14:00-05:00
https://www.bridgestew.com/journal/how-to-indieweb-microformats/
<p><strong>Target Audience</strong>: You are comfortable writing HTML markup or are able to generate the output described in this entry.</p>
<p><strong>TL;DR</strong>: <a href="#the-end-result">The end result</a>.</p>
<h2 id="marking-up-a-blog-post">Marking up a blog post <a class="direct-link" href="#marking-up-a-blog-post">#</a></h2>
<p>I try to keep the markup for journal entries on <a href="http://bridgestew.com/">bridgestew.com</a> as small as possible. In reality, there is a bit more going on here when you inspect the pages with developer tools provided by the browser, but I simplified it to the bare bones for the sake of explaining the microformats that would be applied. Here's what the HTML includes:</p>
<ol>
<li>Wrap the content in an <code>article</code> tag.</li>
<li>Use an <code>h1</code> for the post's title, which is important for SEO and accessibility purposes.</li>
<li>Use a <code>p</code> tag for the intro paragraph that provides context for what the post is about.</li>
<li>Wrap the meat of the post in a <code>div</code> to provide a quick visual for the start and end of the content. The content within that <code>div</code> could have any number of element tags in use.</li>
<li>Use <code>nav</code> on the navigation links that enables the reader to return to the list of articles without having to scroll to the header of the site to click the "journal" link.</li>
</ol>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>article</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>h1</span><span class="token punctuation">></span></span>Title goes here<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>h1</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span><span class="token punctuation">></span></span>Summary goes here<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span><span class="token punctuation">></span></span>Lots of text goes here<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span><span class="token punctuation">></span></span>And more text.<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span><span class="token punctuation">></span></span>Just like a blog post.<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>nav</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>/journal/<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>← All journal entries<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>nav</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>article</span><span class="token punctuation">></span></span></span></code></pre>
<p>Here's how that block of code gets the appropriate microformat properties:</p>
<p>The <code>article</code> tag, which surrounds the content gets the <code>h-entry</code> class on it, signifying that everything inside those tags is related to this journal entry.</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>article</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>h-entry<span class="token punctuation">"</span></span><span class="token punctuation">></span></span></span><br><span class="highlight-line">...</span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>article</span><span class="token punctuation">></span></span></span></code></pre>
<p>The <code>h1</code> gets a class of <code>p-name</code> so that parsers will interpret it as the blog post's title.</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>article</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>h-entry<span class="token punctuation">"</span></span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>h1</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>p-name<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Title goes here<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>h1</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">...</span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>article</span><span class="token punctuation">></span></span></span></code></pre>
<p>Next, I'll add <code>class="p-summary"</code> to the introductory paragraph.</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>article</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>h-entry<span class="token punctuation">"</span></span><span class="token punctuation">></span></span></span><br><span class="highlight-line">...</span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>p-summary<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Summary goes here<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">...</span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>article</span><span class="token punctuation">></span></span></span></code></pre>
<p>Lastly, I'll add <code>class="e-content"</code> to the div that surrounds the body of the article.</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>article</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>h-entry<span class="token punctuation">"</span></span><span class="token punctuation">></span></span></span><br><span class="highlight-line">...</span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>e-content<span class="token punctuation">"</span></span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span><span class="token punctuation">></span></span>Lots of text goes here<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span><span class="token punctuation">></span></span>And more text.<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span><span class="token punctuation">></span></span>Just like a blog post.<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">...</span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>article</span><span class="token punctuation">></span></span></span></code></pre>
<p>That's it! If I stop here, I have successfully let a machine know what this content is and how to best interpret it. But, I'm not going to stop here. It is common for posts to be accompanied with some metadata, so I'm going to add some and provide richer meaning by including additional class names.</p>
<p>Because of how I want to structure my page, I'm going to put the metadata above the post content. That's just my preference. It doesn't have to be at the beginning.</p>
<p>First, I'll add a date the post was published with <code>class-"dt-published"</code> on the <code>time</code> element:</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>article</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>h-entry<span class="token punctuation">"</span></span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>time</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>dt-published<span class="token punctuation">"</span></span> <span class="token attr-name">datetime</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>2019-01-12<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Jan 19, 2019<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>time</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">...</span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>article</span><span class="token punctuation">></span></span></span></code></pre>
<p>Then, I'll add the name of the person who authored the post. Most of the time, that is going to be me and will seem redundant, but I am choosing to do it anyway. This could be a lot more meaningful on a site that has multiple authors or guest bloggers. Mark this up as a link that leads back to the homepage of their website. In this case, it will be my own site.</p>
<p>This anchor (link) tag will receive 2 classes:</p>
<ol>
<li><code>h-card</code> which lets the parser know that we are surrounding content with a new microformat context for a person or organization.</li>
<li><code>p-author</code> which denotes the author of the blog post.</li>
</ol>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>article</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>h-entry<span class="token punctuation">"</span></span><span class="token punctuation">></span></span></span><br><span class="highlight-line">...</span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>h-card p-author<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>/<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Bridget Stewart<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">...</span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>article</span><span class="token punctuation">></span></span></span></code></pre>
<p>Lastly, I am going to add a list of tags that categorize the content. These tags can be useful aids for visitors seeking blog posts related to the one they just read. The tag link will lead to a page that gathers all the posts with the same tag and display them as a list. Each link will receive <code>class="p-category"</code> and <a href="http://microformats.org/wiki/rel-tag"><code>rel="tag"</code></a>.</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>article</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>h-entry<span class="token punctuation">"</span></span><span class="token punctuation">></span></span></span><br><span class="highlight-line">... </span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>small</span><span class="token punctuation">></span></span>Posted under:<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>small</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>p-category<span class="token punctuation">"</span></span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>tag<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>/tags/tag-1/<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>tag-1<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>p-category<span class="token punctuation">"</span></span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>tag<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>/tags/tag-2/<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>tag-2<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>p-category<span class="token punctuation">"</span></span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>tag<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>/tags/tag-3/<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>tag-3<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">...</span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>article</span><span class="token punctuation">></span></span></span></code></pre>
<p>Now, I'm finished! I have metadata and content all semantically marked up with rich semantic meaning for a parser or scraper to consume and understand. When we put it all together, this is how the code looks.</p>
<h2 id="the-end-result">The end result <a class="direct-link" href="#the-end-result">#</a></h2>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>article</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>h-entry<span class="token punctuation">"</span></span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>time</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>dt-published<span class="token punctuation">"</span></span> <span class="token attr-name">datetime</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>2019-01-19<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Jan 19, 2019<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>time</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>h-card p-author<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>/<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Bridget Stewart<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>tag-list<span class="token punctuation">"</span></span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>small</span><span class="token punctuation">></span></span>Posted under:<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>small</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>p-category<span class="token punctuation">"</span></span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>tag<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>/tags/tag-1/<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>tag-1<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>p-category<span class="token punctuation">"</span></span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>tag<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>/tags/tag-2/<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>tag-2<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>p-category<span class="token punctuation">"</span></span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>tag<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>/tags/tag-3/<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>tag-3<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>h1</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>p-name<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Title goes here<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>h1</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>p-summary<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Summary goes here<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>e-content<span class="token punctuation">"</span></span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span><span class="token punctuation">></span></span>Lots of text goes here<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span><span class="token punctuation">></span></span>And more text.<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span><span class="token punctuation">></span></span>Just like a blog post.<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>nav</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>/journal/<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>← All journal entries<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>nav</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>article</span><span class="token punctuation">></span></span></span></code></pre>
<h2 id="testing-the-updates">Testing the updates <a class="direct-link" href="#testing-the-updates">#</a></h2>
<p>Returning to the <a href="http://indiewebify.me/">IndieWebify.me</a> <a href="https://indiewebify.me/validate-h-entry/">h-entry validation</a> page, I drop the link to a journal entry from <a href="http://bridgestew.com/">bridgestew.com</a> in the field and click "Validate h-entry". As the image shows, the h-card is successfully implemented.</p>
<p><img src="https://res.cloudinary.com/bridgestew/image/upload/c_scale,q_60,w_680/h-entry-validation.jpg" alt="Success screen stating the h-entry was found, providing suggestions for additional properties to include in the h-entry."></p>
<h2 id="conclusion">Conclusion <a class="direct-link" href="#conclusion">#</a></h2>
<p>I am unlikely to add a featured image to go along with journal entries, but never say never. If this site evolves in that direction, I would include <code>class="u-photo"</code> on the <code>img</code> element. As for how journal entries are being parsed on <a href="http://bridgestew.com/">bridgestew.com</a> as of now, I consider this another successful step toward IndieWeb-iness.</p>
How to: IndieWeb Profile
2019-01-13T16:15:00-05:00
https://www.bridgestew.com/journal/how-to-indieweb-profile/
<p><strong>Target Audience</strong>: You are comfortable writing HTML markup or are able to generate the output described in this entry.</p>
<p><strong>TL;DR</strong>: <a href="#the-end-result">The end result</a>.</p>
<h2 id="publishing-for-indieweb">Publishing for IndieWeb <a class="direct-link" href="#publishing-for-indieweb">#</a></h2>
<p>HTML has semantic elements that help machines make sense of content. There are libraries that extend those semantics to provide even more rich detail. Microformats are used by the IndieWeb while search engines and SEO tools tend to focus on <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Microdata">Microdata</a>. Using both can make your HTML a little cluttered and noisy but, if you want your content to be parsed well by IndieWeb tools and features, then it is worth understanding how to include microformats.</p>
<h2 id="common-microformats">Common microformats <a class="direct-link" href="#common-microformats">#</a></h2>
<p>Types of content that microformats can extend semantics for include, but are not limited to:</p>
<ul>
<li>people: <a href="http://microformats.org/wiki/h-card">h-card</a></li>
<li>articles: <a href="http://microformats.org/wiki/h-entry">h-entry</a></li>
<li>recipes: <a href="http://microformats.org/wiki/h-recipe">h-recipe</a></li>
<li>events: <a href="http://microformats.org/wiki/h-event">h-event</a></li>
</ul>
<p>Because there are plenty of options, it is worth visiting the <a href="http://microformats.org/">microformats wiki</a> to determine what would be applicable to your site.</p>
<p>These meaningful hooks are incorporated by adding <code>class</code> names to the HTML elements, like so:</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>h-card<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Bridget Stewart<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span></span></code></pre>
<p>An HTML element can have many <code>class</code> names on it, so any classes you use for styling your site can sit alongside the ones you use for microformats. You might consider basing styles on the microformats <code>class</code> names in order to have a standard appearance for items of a similar type. It will depend on your needs.</p>
<h2 id="adding-an-h-card">Adding an h-card <a class="direct-link" href="#adding-an-h-card">#</a></h2>
<p>When I am writing the HTML I need for a page, I start with the content and make certain I am using the most appropriate elements to give it form and meaning. Once that is done, I go back through the code and add the microformats I need. I do things this way to try to keep the number of HTML elements used as low as. Where I work, I learned the hard way that the number of <a href="https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model/Introduction">DOM nodes</a> can have an impact on site performance. I'm in no danger of that for this site, but it is a consideration I like to keep top of mind.</p>
<p>Information on this site suitable for a profile includes things like:</p>
<ul>
<li>my name</li>
<li>the url of this site</li>
<li>the urls of social sites I frequent</li>
</ul>
<p>Because this website is a personal one, I am not willing to share more explicit details that can be included in an h-card to minimize spam or online harassment. In the case of a website for a business or organization, there are some additional properties that might be worthwhile to include like:</p>
<ul>
<li>email address</li>
<li>physical address</li>
<li>latitude and longitude</li>
<li>telephone number</li>
</ul>
<p>As I reviewed the HTML of the homepage for <a href="http://bridgestew.com/">bridgestew.com</a>, I saw that the elements I want to include are spread across the entire page. Here's the focused, stripped-down HTML:</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>body</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>header</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>https://www.bridgestew.com<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Logo<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>nav</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> ...</span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>nav</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>header</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>main</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> ...</span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>main</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>footer</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span><span class="token punctuation">></span></span>The musings of Bridget Stewart, a web developer from Northeast Ohio, USA.<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>ul</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>small</span><span class="token punctuation">></span></span>© 2019 Bridget Stewart<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>small</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>https://twitter.com/bridgetstewart<span class="token punctuation">"</span></span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>me<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Twitter<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>https://github.com/bridgestew<span class="token punctuation">"</span></span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>me<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Github<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>https://www.linkedin.com/in/bridget-stewart-3244767/<span class="token punctuation">"</span></span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>me<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>LinkedIn<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>ul</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>footer</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>body</span><span class="token punctuation">></span></span></span></code></pre>
<p>If you read my <a href="https://www.bridgestew.com/posts/how-to-indieweb-web-sign-in/">previous entry about Web Sign In</a>, you may recognize the markup used for the social links in the footer. When viewing all the content to include in a profile, I see that the element that wraps them all is the <code>body</code> so I need to put <code>class="h-card"</code> there.</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>body</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>h-card<span class="token punctuation">"</span></span><span class="token punctuation">></span></span></span><br><span class="highlight-line">...</span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>body</span><span class="token punctuation">></span></span></span></code></pre>
<p>The url for this site is located in the link surrounding the logo, so I'll add <code>class="u-url"</code> to it and <code>rel="me"</code> like I did when I was marking up links for Web Sign In.</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>body</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>h-card<span class="token punctuation">"</span></span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>header</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>em</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>u-url<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>https://www.bridgestew.com<span class="token punctuation">"</span></span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>me<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Logo<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>em</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>body</span><span class="token punctuation">></span></span></span></code></pre>
<p>There was nothing specific about me found in the navigation or main section of the home page that I am including in my profile at this time. The next area where something useful exists is in the footer at the bottom of the page.</p>
<p>My name is found in the "The musings of..." paragraph, but I am not sure I will keep that for the long term. I may feel like updating it from time to time or I might get rid of it completely. I would like to have this profile be in a set-it-and-forget-it mode, so I am going to use the spot where my name sits next to the copyright date. That instance is likely to be permanent, so it is a better candidate to serve as a profile property.</p>
<p>I could put the <code>p-name</code> class on the <code>small</code> element, but I don't want a parser to include the copyright symbol and the year. To play it safe and narrow in on the information I want included, I'm going to wrap my name in a <code>span</code> and add <code>class="p-name"</code> to it.</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>footer</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span><span class="token punctuation">></span></span>The musings of Bridget Stewart, a web developer from Northeast Ohio, USA.<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>ul</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>small</span><span class="token punctuation">></span></span>© 2019 <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>span</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>p-name<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Bridget Stewart<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>span</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>small</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> ...</span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>footer</span><span class="token punctuation">></span></span></span></code></pre>
<p>That additional HTML element adds a little cruft, but I feel that it is worth it in this case. If I found myself adding a lot more elements just to accommodate the microformats, I would stop and rethink my approach to see how to keep the HTML minimal. I feel that this one can't be avoided.</p>
<p>Lastly, I'm going to add <code>class="u-url"</code> to the social links. I already had the <code>rel="me"</code> on them because of the Web Sign In process I followed earlier.</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>footer</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span><span class="token punctuation">></span></span>The musings of Bridget Stewart, a web developer from Northeast Ohio, USA.<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>ul</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>small</span><span class="token punctuation">></span></span>© 2019 <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>span</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>p-name<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Bridget Stewart<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>span</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>small</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>u-url<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>https://twitter.com/bridgetstewart<span class="token punctuation">"</span></span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>me<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Twitter<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>u-url<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>https://github.com/bridgestew<span class="token punctuation">"</span></span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>me authn<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Github<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>u-url<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>https://www.linkedin.com/in/bridget-stewart-3244767/<span class="token punctuation">"</span></span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>me<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>LinkedIn<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>ul</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>footer</span><span class="token punctuation">></span></span></span></code></pre>
<p>That covers everything I want to include in my profile. Below is the full code in all its glory.</p>
<h2 id="the-end-result">The end result <a class="direct-link" href="#the-end-result">#</a></h2>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>body</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>h-card<span class="token punctuation">"</span></span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>header</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>u-url<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>https://www.bridgestew.com<span class="token punctuation">"</span></span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>me<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Logo<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>nav</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> ...</span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>nav</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>header</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>main</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> ...</span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>main</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>footer</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span><span class="token punctuation">></span></span>The musings of Bridget Stewart, a web developer from Northeast Ohio, USA.<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>ul</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>small</span><span class="token punctuation">></span></span>© 2019 <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>span</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>p-name<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Bridget Stewart<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>span</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>small</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>u-url<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>https://twitter.com/bridgetstewart<span class="token punctuation">"</span></span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>me<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Twitter<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>u-url<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>https://github.com/bridgestew<span class="token punctuation">"</span></span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>me<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Github<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>u-url<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>https://www.linkedin.com/in/bridget-stewart-3244767/<span class="token punctuation">"</span></span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>me<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>LinkedIn<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>ul</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>footer</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>body</span><span class="token punctuation">></span></span></span></code></pre>
<h2 id="testing-the-updates">Testing the updates <a class="direct-link" href="#testing-the-updates">#</a></h2>
<p>Returning to the <a href="http://indiewebify.me/">IndieWebify.me</a> <a href="https://indiewebify.me/validate-h-card">h-card validation page</a>, I drop the link to my home page in the field and click "Validate h-card". As the image shows, the h-card is successfully implemented.</p>
<p><img src="https://res.cloudinary.com/bridgestew/image/upload/c_scale,q_60,w_680/h-card-validation.jpg" alt="Success screen stating the h-card was found, showing what was included along with suggestions for additional properties."></p>
<h2 id="conclusion">Conclusion <a class="direct-link" href="#conclusion">#</a></h2>
<p>While I am unlikely to add my email in the future, I might consider adding a photo or a bio at some point. As for this exercise, I consider this another successful implementation of an IndieWeb feature on my website. Huzzah!</p>
How to: IndieWeb Web Sign In
2019-01-12T00:17:34.266-05:00
https://www.bridgestew.com/journal/how-to-indieweb-web-sign-in/
<p><strong>Target Audience</strong>: You have a personal domain for your website, for example: <a href="http://bridgestew.com/">bridgestew.com</a> (personal) vs. <a href="http://bridgestew.netlify.com/">bridgestew.netlify.com</a> (hosted by third party). You are comfortable writing HTML markup or are able to generate the output described in this entry.</p>
<h2 id="setting-up-web-sign-in">Setting up Web Sign In <a class="direct-link" href="#setting-up-web-sign-in">#</a></h2>
<p>This was actually pretty easy and quite straightforward--as long as you are comfortable writing HTML. I have links to my various social profiles in the footer of this site. That’s actually a pretty common practice on different types of websites. I updated those links by adding <code>rel="me"</code> to them.</p>
<p>Example:</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>ul</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>https://twitter.com/bridgetstewart<span class="token punctuation">"</span></span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>me<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Twitter<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>https://github.com/bridgestew<span class="token punctuation">"</span></span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>me<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Github<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>https://www.linkedin.com/in/bridget-stewart-3244767/<span class="token punctuation">"</span></span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>me<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>LinkedIn<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>ul</span><span class="token punctuation">></span></span></span></code></pre>
<p>The next step is to make sure there is a link to your website in the profile of the relevant social networks. Not all of them will provide support for you to sign in via IndieAuth--such as LinkedIn--but Twitter and Github support it at the time of this writing. Social sites will have different profile options, so you will have to determine how best to link back to your site. Here is an example for where to put it in a Twitter profile.</p>
<p><img src="https://res.cloudinary.com/bridgestew/image/upload/c_scale,h_350/twitter-profile.jpg" alt="Twitter Edit Profile panel showing that the 4th input is where the link back to bridgestew.com goes."></p>
<p>On <a href="http://indiewebify.me/">IndieWebify.me</a> Step 2, you can test that this is set up properly by putting your site's URL (e.g. <a href="https://bridgestew.com/">https://bridgestew.com</a>) into the field and clicking "Test". A verification box will appear showing you what the results are:</p>
<p><img src="https://res.cloudinary.com/bridgestew/image/upload/c_scale,w_680/sign-in-test.jpg" alt="Results of rel=me test demonstrating that Twitter and Github work perfectly while LinkedIn does not link back"></p>
<p>As the example shows, not all social sites will give you a place to link back to your website. IndieAuth may not recognize that those social sites link back to your site, which might be due to the social site not supporting web login. If you can verify Twitter or Github, then you know you've done things correctly and you should be able to use Web Sign In for various IndieWeb features.</p>
<h2 id="conclusion">Conclusion <a class="direct-link" href="#conclusion">#</a></h2>
<p>As I said before, I've wanted to get involved in IndieWeb before and had difficulty doing so. It was encouraging to have the first step be easy enough for me to tackle with a low amount of effort.</p>
Conversations
2019-01-09T05:51:19.229-05:00
https://www.bridgestew.com/journal/conversations/
<ul>
<li><a href="https://staticman.net/docs/">Staticman: pull requests for submissions</a> - This could be used for comments and ratings/reviews, as demonstrated by its author. Could this also be used for other types of form submissions? Upside: everything is in the repo, making it all portable. Downside: I don't see one yet.</li>
<li><a href="https://utteranc.es/">Utterances: built on Github issues</a> - This could be used for comments, wiki pages and more. Repo must be public. That is not currently the case for <a href="http://bridgestew.com/">bridgestew.com</a>, but that may not be a permanent condition. Upside: might have broad feature usage. Downside: based on Github feature so if Github vanishes, so would functionality. Need to look deeper to see if it all ends up in the repo and is portable like Staticman to rule out this downside.</li>
<li>Webmentions - <a href="https://nicolas-hoizey.com/2017/07/so-long-disqus-hello-webmentions.html">Nicolas Hoizey</a> did a nice writeup on how he implemented webmentions. There are links in his post I will follow to learn more. I'll want to explore <a href="https://github.com/aarongustafson/jekyll-webmention_io/">Aaron Gustafson's</a> Jekyll plugin to if Chris can help create something for use with Eleventy. I might want to make the first attempt to implementing it myself to see how difficult it is. <a href="https://stream.jeremycherfas.net/2018/about-webmentions">Jeremy Cherfas</a> has a list of posts about webmentions that may help me implement them.</li>
</ul>
Usage. Measurement. Data.
2019-01-07T04:19:00-05:00
https://www.bridgestew.com/journal/usage-measurement-data/
<h2 id="old-school-performance-and-engagement">Old school performance & engagement <a class="direct-link" href="#old-school-performance-and-engagement">#</a></h2>
<p>In olden times, websites had <a href="https://www.free-website-hit-counter.com/tumblr-website-hit-counters.html">hit counters</a> on them. That was the way you showed off how popular your site was because all the visits were right there in your face. There wasn't anything sophisticated about it, but you got an indication of little or lots of traffic on a site. Hit counters were rudimentary analytics.</p>
<p>Before blog platforms like Wordpress, Joomla, Tumblr, or Wix made it easy to have a dialog with your readers per article or post, there was the <a href="https://scriptslibrary.doteasy.com/doteasy-free-guestbook-web-tool/">website guest book</a>. People used to fill in a little blurb mentioning what they liked about your site or begging you to come see theirs. Guest books were rudimentary comments and web mentions.</p>
<p>Before social media took over in the form of Facebook, Twitter, Instagram, or Youtube, there were webrings. Often, they were just lists of vaguely related sites linked together because the site owners knew each other in some way. Some were curated and joined as a way to connect sites of similar content and passions. Webrings were a rudimentary way to drive traffic.</p>
<h2 id="today-the-web-is-big-business">Today the web is big business <a class="direct-link" href="#today-the-web-is-big-business">#</a></h2>
<p>Where I work, we have a big expensive analytics package that tells us all kinds of information about what visitors to our site do when they are there. We also know where they came from before they got to our site (with referrals) and might have an indication of where they went after they left (with remarketing and retargetting). We have an entire teams dedicated to bringing traffic to the site and making sure we have content in all the relevant social platforms. There's a content calendar, a group who determines content themes and which places they will be displayed. These are full time positions.</p>
<p>This approach makes sense because we sell products on that website. We want as many people to know about our products as possible. We want them to buy our products and convince their friends and families to buy our products. It takes a lot of thought, effort, and planning on our part to make that happen.</p>
<h2 id="this-site-is-not-a-business">This site is not a business <a class="direct-link" href="#this-site-is-not-a-business">#</a></h2>
<p>This little site of mine serves an entirely different purpose. As I mentioned in <a href="https://www.bridgestew.com/posts/new-approach-new-site/">my earlier writing</a>, this is for me. But I have to be brutally honest about what that means and the impact on this site. If writing--as an exercise--is truly for me <em>alone</em>, then I would be writing in a paper diary, or I could use an application like <a href="http://dayoneapp.com/">Day One</a> which remains on my hard drive. But I didn't choose that route. I chose to expose my writing on the web where other people might see it.</p>
<p>If no one visits this site, then I am putting things into the void. Honestly, that doesn't bother me at all. But, there will be a time when I let people know that I have writings collected here and they might stop by to take a look. I might even write something that connects with another individual and they let others know that writing is here. Is that something I want to know took place?</p>
<h2 id="knowing-while-respecting-privacy">Knowing, while respecting privacy <a class="direct-link" href="#knowing-while-respecting-privacy">#</a></h2>
<p>I haven't fully worked out how I will approach knowing people have or have not visited this website. Here are my current thoughts on the matter:</p>
<ul>
<li>I don't need to know the referral that brought a visitor here.</li>
<li>I don't need to know where they went after they left.</li>
<li>I don't need to know how many pages they viewed.</li>
<li>I don't care how long they were here.</li>
</ul>
<p>Based on the above, I conclude that I don't need an analytics package like Google Analytics. That's far too robust. All I want to know is if people were here at all and essentially how many per day. That basic information would serve the purpose of letting me know if I would need to scale this site up in some way or can keep things very low key. I don't know if it is even possible to get an analytics solution with so few features! Suggestions would be most welcome! For now, you would have to let me know by clicking one of the social links in the footer, because I don't have other means set up on this site just yet.</p>
<p>Another benefit to not having some big analytics solution hooked up to this site is that cookies will not be involved. This is a static site made of HTML & CSS. I don't even have any Javascript in use at this time. Your data (at the time of this writing) is 100% unused and my aim is to keep it that way. Naturally, if something about that changes, I will have to put up an annoying cookie banner, write a privacy policy, etc. I really have no desire to do that.</p>
<h2 id="dialogue-vs-monologue">Dialogue vs. monologue <a class="direct-link" href="#dialogue-vs-monologue">#</a></h2>
<p>I think I would like to have some manner of interaction with people who read my writing and comment in some fashion. I want that to be lightweight and cookie free, too. Comment forms are a pain to manage to weed out spambots, so more aggressive programming is usually involved. This is not my forte. If I use a pre-made solution like <a href="https://disqus.com/">Disqus</a>, I'm slipping into the arena where personally identifiable information (PII) is involved. I want to avoid as much of that as possible.</p>
<p><a href="https://webmention.net/draft/">Webmentions</a> might be a less invasive solution, so I will explore that as a possibility. This crosses into <a href="https://indieweb.org/">IndieWeb</a> territory and might require a bit of effort, so I won't rush to implement it. It's another new thing to learn which is why I got back into having a website I actively maintain.</p>
<h2 id="i-am-not-a-brand-no-really">I am not a brand. No, really! <a class="direct-link" href="#i-am-not-a-brand-no-really">#</a></h2>
<p>I went to lunch with a <a href="https://ctmiller.net/blog/update/2019/01/07/first-post.html">programmer friend, Chris,</a> today and we discussed a lot of these topics. We both have a similar itch to get back into blogging and don't care much about "building our brand." I haven't ever felt comfortable with the idea because it seems dehumanizing to me.</p>
<p>Our conversation swirled around what is possible, what seems fun to try, and how we might end up making something easier for others based on what we learn. So, when it comes to diving into the IndieWeb options that provide more functionality and maintaining the origin of my writing here instead of on other platforms, I will be poking him for some help and we will likely be documenting it along the way.</p>
New Approach, New Site
2019-01-06T16:09:00-05:00
https://www.bridgestew.com/journal/new-approach-new-site/
<h2 id="working-with-eleventy-and-netlify">Working with Eleventy & Netlify <a class="direct-link" href="#working-with-eleventy-and-netlify">#</a></h2>
<p>I started with the <a href="https://github.com/danurbanowicz/eleventy-netlify-boilerplate">eleventy-netlify-boilerplate</a> project. With a single button click it provides the <a href="https://www.11ty.io/">Eleventy</a> static site generator with a preconfigured <a href="https://www.netlifycms.org/">Netlify CMS</a> integration on the <a href="https://www.netlify.com/">Netlify platform</a>. I didn’t quite figure out how to do that on my own during my first run, so finding this existing project for my second attempt made it much easier to accomplish my goal.</p>
<p>This boilerplate is opinionated, like all starter projects, but in a pretty lightweight way. I wanted to start with <em>something tangible</em>, so that I could investigate what my ideal setup and needs are. I don’t do well starting completely from scratch with concepts I don’t fully understand. But if I read instructions along with something that is already in front of me, I grasp the concepts better. This boilerplate helped me to do that.</p>
<h2 id="what-i-do-know">What I do know <a class="direct-link" href="#what-i-do-know">#</a></h2>
<p>I managed to figure out some things I wanted for my project while learning Eleventy and Netlify CMS:</p>
<ol>
<li><strong>I like having a CMS.</strong> As a web developer, I don’t <em>need</em> one. I could do just fine without it. But, I also like knowing how CMSes work, because when working with clients or in-house, there will be non-technical people who do need a CMS in order to add content to the website. I don’t want to stray too far off that mindset, so that I can continue to provide optimal experiences for people who are not like me.</li>
<li><strong>I really like how Netlify CMS works.</strong> It seems incredibly straightforward for customizing content types (pages vs. posts) and the forms the content administrators will fill out to get content onto the site. Right now, my personal needs are not very robust, but some light reading on <a href="https://www.netlifycms.org/docs/beta-features/">what is coming</a> indicates robustness is in the roadmap and it still seems to be pretty straightforward to set up those features. This is good to know for larger scale projects than my personal site.</li>
<li><strong>I use Sublime 3 as my IDE.</strong> I like having templates that are .html so that I don’t have to remind the template file that I want HTML syntax highlighting. I'm sure there is a setting somewhere that makes that possible, but if I don't have to bother with that, then yay! In Eleventy I can have an .html file behave like it is .liquid or .njk (or whatever) without needing the file extension to match. So, I changed all the .njk templates in the boilerplate to .html because it suits my preferred working style.</li>
<li><strong>I’m using <a href="https://mozilla.github.io/nunjucks/templating.html">Nunjuks</a> as my templating language.</strong> I wanted to understand how it works in comparison to the templating language I am more familiar with--<a href="https://shopify.github.io/liquid/">Liquid</a>. So far, they aren’t wildly different. There are a few syntax differences, but they don’t seem insurmountable. It has been a few years since I’ve done any hands on development work anyway, so even Liquid has evolved over the course of time. Either way, I was going to have to learn some stuff. I can’t argue a specific reason to stick with one over the other at this point in time. I’m committing to Nunjucks just for the sake of learning something new. If I decide to change my mind later, I will have a bit of reconfiguring to do, but that’s the risk I run by doing something just to do it, rather than having a requirement as a guide.</li>
<li><strong>I will create my own theme.</strong> While this boilerplate had a minimalistic style, it doesn’t suit my taste at all. I am still seeking inspiration for how the site will appear, but it will end up how I want it when I am done with it. I will also attempt to use newer features in CSS for layout and design. I don’t intend to use “fallbacks” for those features. This site will be progressively enhanced, to work with the browser’s own characteristics.</li>
<li><strong>I’m inspired by the <a href="https://indieweb.org/">IndieWeb</a>.</strong> I really want to commit to the concept, but I find that the connections are too difficult for me to grasp fully, then I get discouraged and give up. I’m going to try again and when I have that all worked out, I will write up what I have learned and what I think needs to happen to make this approach more accessible to non-programmers.</li>
<li><strong>I have to figure out what to do with my <a href="http://shallowthoughts.org/">old, abandoned blog</a>.</strong> I may shut it down entirely. I may move posts I think are worth keeping over to this new URL. It’s not like I had a wild amount of traffic that will lose the sacred SEO juice. I haven’t made up my mind yet, so it will continue to sit there for the time being. If I do shut it down, I would save money on the hosting costs. That might be nice.</li>
</ol>
<p>I still have a long way to go figuring out what is worth sharing with the world and how to make it all originate here before it gets distributed to other platforms. This will be a live work in progress. I expect it to take me weeks, maybe months, to make significant headway because life has a few other demands for my time. But, I'm choosing to add this to my plate. For me.</p>