<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://benniemosher.com/feed.xml" rel="self" type="application/atom+xml"/><link href="https://benniemosher.com/" rel="alternate" type="text/html"/><updated>2026-07-19T11:53:31+00:00</updated><id>https://benniemosher.com/feed.xml</id><title type="html">Bennie Mosher</title><subtitle>Father. Husband. Problem Solver. Software Engineer.</subtitle><entry><title type="html">The Old Republic: Fatal Alliance</title><link href="https://benniemosher.com/book/reviews/2026/06/22/the-old-republic-fatal-alliance.html" rel="alternate" type="text/html" title="The Old Republic: Fatal Alliance"/><published>2026-06-22T00:00:00+00:00</published><updated>2026-06-22T00:00:00+00:00</updated><id>https://benniemosher.com/book/reviews/2026/06/22/the-old-republic-fatal-alliance</id><content type="html" xml:base="https://benniemosher.com/book/reviews/2026/06/22/the-old-republic-fatal-alliance.html"><![CDATA[<p>This is the one. After three books in a row that left me frustrated in one way or another, Fatal Alliance finally delivered a complete, satisfying, genuinely thrilling story. This is the best book in the Old Republic era so far and it is not close.</p> <p><img src="/assets/img/book-covers/the-old-republic-fatal-alliance.jpg" alt="Book cover" style="max-width:280px;height:auto;float:right;margin:0 0 1rem 1rem;"/></p> <h3 id="-55-stars">⭐⭐⭐⭐⭐ 5/5 stars</h3> <ul> <li><strong>Author:</strong> Sean Williams</li> <li><strong>Format:</strong> Kindle + Audiobook</li> <li><strong>Narrator:</strong> Marc Thompson</li> <li><strong>Listened on:</strong> Libby</li> <li><strong>Read:</strong> June 18–22, 2026 (5 days)</li> <li><strong>Era:</strong> 3,643 BBY — Old Republic Era</li> <li><strong>Series:</strong> Star Wars Legends (Chronological Read-Through, Book 5)</li> </ul> <p>This book plays like a mini Game of Thrones or a chapter out of The Expanse. Multiple factions with competing interests, none of whom trust each other, all converging on the same prize. A Jedi Padawan and a disgraced Republic trooper. A Sith apprentice working through her own complicated past with her master. An Imperial spy embedded inside the Republic. A Mandalorian mercenary nobody can quite read. None of them want to work together. All of them have to.</p> <p>What makes this book work where the others stumbled is the sheer number of moving pieces and how confidently Sean Williams juggles them. Every faction gets real stakes, real motivation, and real moments where their loyalties get tested. Watching enemies — Sith and Jedi, Republic and Empire — grudgingly cooperate against something bigger than their war was genuinely thrilling to read. The twists kept coming right up through the end and I did not see most of them.</p> <p>The action sequences earn their place too. There is a sequence late in the book where a ship crashes and a lava flow swallows two characters trying to escape — a genuine gut punch of a moment that had me certain they were gone. They make it out through a ship’s airlock, but the scene landed exactly the way it should have because the book had done the work of making me care about the people in danger.</p> <p>The narration deserves real credit here. Marc Thompson voices an enormous cast and somehow makes every single one of them instantly distinguishable. I never once lost track of who was speaking, even running the audio at 1.75x speed through Libby. That is not a small thing in a book with this many characters.</p> <p>This is the book to point to if anyone tells you the Old Republic novels are just marketing tie-ins for a video game. This one stands completely on its own.</p> <p><em>This is part of my ongoing Star Wars Legends chronological read-through. I’m reading every Legends novel in the order events happen in the galaxy, starting 25,000 years before the Battle of Yavin. Next up: The Old Republic: Annihilation.</em></p>]]></content><author><name></name></author><category term="book"/><category term="reviews"/><summary type="html"><![CDATA[A review of "The Old Republic: Fatal Alliance" by Sean Williams — book five in my Star Wars Legends chronological read-through, and the first one that genuinely surprised me.]]></summary></entry><entry><title type="html">Red Harvest</title><link href="https://benniemosher.com/book/reviews/2026/06/16/red-harvest.html" rel="alternate" type="text/html" title="Red Harvest"/><published>2026-06-16T00:00:00+00:00</published><updated>2026-06-16T00:00:00+00:00</updated><id>https://benniemosher.com/book/reviews/2026/06/16/red-harvest</id><content type="html" xml:base="https://benniemosher.com/book/reviews/2026/06/16/red-harvest.html"><![CDATA[<p>I did not expect to read a zombie horror novel in the middle of a Star Wars chronological read-through. Red Harvest is exactly that, and it is one of the strangest detours in all of Legends. Strange does not mean bad — but it does mean disorienting.</p> <p><img src="/assets/img/book-covers/red-harvest.jpg" alt="Book cover" style="max-width:280px;height:auto;float:right;margin:0 0 1rem 1rem;"/></p> <h3 id="-35-stars">⭐⭐⭐ 3/5 stars</h3> <ul> <li><strong>Author:</strong> Joe Schreiber</li> <li><strong>Format:</strong> Kindle + Audiobook</li> <li><strong>Narrator:</strong> John Glover</li> <li><strong>Listened on:</strong> Spotify</li> <li><strong>Read:</strong> June 9–16, 2026 (7 days)</li> <li><strong>Era:</strong> 3,645 BBY — Old Republic Era</li> <li><strong>Series:</strong> Star Wars Legends (Chronological Read-Through, Book 4)</li> </ul> <p>The setup is genuinely interesting. Darth Scabrous is a Sith mad scientist trying to crack immortality through an ancient formula — not through the Force directly, not through power or conquest, but through botany and alchemy. The final ingredient is a rare black orchid tended by a young Agricultural Corps Jedi named Hestizo Trace, who has an extraordinary Force gift with plants. That premise alone is more creative than anything else in the Old Republic era so far.</p> <p>Hestizo is the heart of the book and the reason it works as well as it does. Her relationship with the orchid is strange and tender and unlike anything else Star Wars has done. She is not a warrior. She is not powerful in any conventional sense. Watching someone without combat training survive a Sith academy full of zombies through pure instinct and her unique connection to living things is quietly compelling.</p> <p>The problem is everyone else. Joe Schreiber throws a large cast of Sith acolytes into the chaos and they die so fast and with so little introduction that it is genuinely hard to track who is who or why any of it matters. By the midpoint I had stopped trying to keep names straight and just followed the chaos. That is not a great place to be as a reader.</p> <p>The audiobook deserves a specific mention because it is a mixed experience. John Glover’s narration has a noticeable quirk — certain sentences sound like they were recorded separately and spliced in, with a completely different tone or energy than the surrounding paragraphs. It is startling at first and takes some getting used to. Once you adjust though the production itself is actually good. There are sound effects layered throughout that genuinely help sell the horror atmosphere — this is one of the few Star Wars audiobooks where the production design does real work to immerse you in the story.</p> <p>The ending follows the same pattern as Revan — it stops more than it concludes. Hestizo walks away, chooses to return to Jedi training, and the story ends. No sequel exists. Her arc just stops. At this point in the Old Republic era that feeling is becoming familiar.</p> <p>Worth reading if you want the full chronological experience. Worth skipping if horror is not your thing and you are reading for the main story thread — nothing here connects meaningfully to what comes before or after it.</p> <p><em>This is part of my ongoing Star Wars Legends chronological read-through. I’m reading every Legends novel in the order events happen in the galaxy, starting 25,000 years before the Battle of Yavin. Next up: The Old Republic: Fatal Alliance.</em></p>]]></content><author><name></name></author><category term="book"/><category term="reviews"/><summary type="html"><![CDATA[A review of "Red Harvest" by Joe Schreiber — book four in my Star Wars Legends chronological read-through, and the one nobody warned me was a zombie horror novel.]]></summary></entry><entry><title type="html">The Old Republic: Deceived</title><link href="https://benniemosher.com/book/reviews/2026/06/08/the-old-republic-deceived.html" rel="alternate" type="text/html" title="The Old Republic: Deceived"/><published>2026-06-08T00:00:00+00:00</published><updated>2026-06-08T00:00:00+00:00</updated><id>https://benniemosher.com/book/reviews/2026/06/08/the-old-republic-deceived</id><content type="html" xml:base="https://benniemosher.com/book/reviews/2026/06/08/the-old-republic-deceived.html"><![CDATA[<p>After the frustration of Revan’s unfinished story, Deceived gave me exactly what I had been waiting for — a Sith villain who actually feels like a Sith villain. Darth Malgus is the real deal, and this book wasted no time proving it.</p> <p><img src="/assets/img/book-covers/the-old-republic-deceived.jpg" alt="Book cover" style="max-width:280px;height:auto;float:right;margin:0 0 1rem 1rem;"/></p> <h3 id="-45-stars">⭐⭐⭐⭐ 4/5 stars</h3> <ul> <li><strong>Author:</strong> Paul S. Kemp</li> <li><strong>Format:</strong> Kindle + Audiobook</li> <li><strong>Read:</strong> June 4–8, 2026 (4 days)</li> <li><strong>Era:</strong> 3,653 BBY — Old Republic Era</li> <li><strong>Series:</strong> Star Wars Legends (Chronological Read-Through, Book 3)</li> </ul> <p>Malgus was everything I expected a Sith to be and wasn’t in the previous book. The dark side feeds him. It doesn’t corrupt him or confuse him — it powers him. Watching him operate is like watching a force of nature that happens to carry a lightsaber. The fight scenes in this book are on another level entirely. Detailed, cinematic, visceral. You can see every move. I found myself slowing down during the combat sequences just to take them in properly, which is not something I do.</p> <p>The story follows two parallel tracks — Malgus on one side, and Zeerid and Aryn on the other. Zeerid is a former Republic special forces soldier running spice to pay for his daughter’s medical care, and Aryn is a Jedi who just lost her master and is not handling it the way the Jedi Council would prefer. Their story is quieter than Malgus’ but it earns its place. By the end I genuinely cared what happened to both of them.</p> <p>And then the epilogue happened. What starts as a war story quietly becomes something else entirely — two broken people choosing each other over the galaxy’s expectations of them. I did not expect a love story in a Star Wars novel about a Sith sacking the Jedi Temple, but here we are and I am not complaining.</p> <p>One thing worth noting for readers coming straight from Revan — the chapter structure is different. Revan’s chapters were roughly ten minutes of reading each, easy to knock out one at a time. Deceived’s chapters run closer to twenty pages, about a half hour each. It actually made the book feel like it moved faster overall, but it’s a different rhythm and worth knowing going in.</p> <p>The ending is satisfying in a way Revan simply was not. Questions get answered. Characters land somewhere. It is a complete story. After Revan that felt like a gift.</p> <p>My only frustration is the same one I always have with this era — Malgus disappears into the MMO after this and his full story never gets told in print. What happens to him after the epilogue, where he goes, whether he ever crosses paths with Aryn again — none of it exists in a book. That story deserves to be written.</p> <p>Read this one. It is the best of the Old Republic novels so far and the fight scenes alone are worth it.</p> <p><em>This is part of my ongoing Star Wars Legends chronological read-through. I’m reading every Legends novel in the order events happen in the galaxy, starting 25,000 years before the Battle of Yavin. Next up: The Old Republic: Red Harvest.</em></p>]]></content><author><name></name></author><category term="book"/><category term="reviews"/><summary type="html"><![CDATA[A review of "The Old Republic: Deceived" by Paul S. Kemp — book three in my Star Wars Legends chronological read-through, and the one that finally delivered the Sith villain I was looking for.]]></summary></entry><entry><title type="html">The Old Republic: Revan</title><link href="https://benniemosher.com/book/reviews/2026/06/03/the-old-republic-revan.html" rel="alternate" type="text/html" title="The Old Republic: Revan"/><published>2026-06-03T00:00:00+00:00</published><updated>2026-06-03T00:00:00+00:00</updated><id>https://benniemosher.com/book/reviews/2026/06/03/the-old-republic-revan</id><content type="html" xml:base="https://benniemosher.com/book/reviews/2026/06/03/the-old-republic-revan.html"><![CDATA[<p>I came into Revan with high expectations. The guy is considered one of the greatest Jedi who ever lived — someone who went so deep into the dark side that he became a Sith Lord, then clawed his way back. I wanted a violent, powerful, morally complex story about the greatest fallen Jedi in the history of the galaxy. What I got was something different, and I am still not sure how I feel about it.</p> <p><img src="/assets/img/book-covers/the-old-republic-revan.jpg" alt="Book cover" style="max-width:280px;height:auto;float:right;margin:0 0 1rem 1rem;"/></p> <h3 id="-35-stars">⭐⭐⭐ 3/5 stars</h3> <ul> <li><strong>Author:</strong> Drew Karpyshyn</li> <li><strong>Format:</strong> Kindle + Audiobook</li> <li><strong>Read:</strong> May 30–June 3, 2026 (5 days)</li> <li><strong>Era:</strong> 3,954 BBY — Old Republic Era</li> <li><strong>Series:</strong> Star Wars Legends (Chronological Read-Through, Book 2)</li> </ul> <p>The battle scenes are where this book earns its keep. When the lightsabers come out and the Force starts flying, Karpyshyn delivers in a way the previous era simply could not. Coming from Dawn of the Jedi where everyone is fighting with swords, finally seeing the full power of Force users with lightsabers felt like a gear shift. Those moments are genuinely great.</p> <p>The problem is everything surrounding them.</p> <p>Revan himself feels underpowered for someone with his legend. You spend the whole book hearing about how extraordinary he is, and then he spends most of the story confused, searching for answers, and ultimately captured. For the greatest Jedi-turned-Sith in history, he gets handled surprisingly easily. I wanted a monster. I got a man with memory problems.</p> <p>The character who actually carries the second half of the book is Scourge — a Sith lord making cold, calculated decisions in the dark. His arc is the most interesting thing in the novel. But I didn’t sit down to read a Scourge book.</p> <p>The real frustration is the ending. The Emperor survives. Revan gets captured. The other Jedi is killed. Scourge ends up on the dark council. None of it resolves. The book just stops. After doing some digging I found out that Revan’s story doesn’t finish in any novel — it continues in the Star Wars: The Old Republic MMO, a video game I haven’t played and don’t plan to. The book was written as a bridge to that game, not as a complete story. Knowing that explains everything, but it doesn’t make it any less unsatisfying.</p> <p>If you played KOTOR and have the game’s story and characters already living in your head, this book probably hits differently. The memory loss storyline, Bastila, Canderous — all of it would carry more emotional weight with that context. Without it, you’re reading about legendary characters you have no prior relationship with and then watching their story stop mid-sentence.</p> <p>Read it if you played the game. If you haven’t, understand what you’re walking into.</p> <p><em>This is part of my ongoing Star Wars Legends chronological read-through. I’m reading every Legends novel in the order events happen in the galaxy, starting 25,000 years before the Battle of Yavin. Next up: The Old Republic: Deceived.</em></p>]]></content><author><name></name></author><category term="book"/><category term="reviews"/><summary type="html"><![CDATA[A review of "The Old Republic: Revan" by Drew Karpyshyn — book two in my Star Wars Legends chronological read-through, and an honest look at one of the most frustrating endings in the series.]]></summary></entry><entry><title type="html">Dawn of the Jedi: Into the Void</title><link href="https://benniemosher.com/book/reviews/2026/05/28/dawn-of-the-jedi-into-the-void.html" rel="alternate" type="text/html" title="Dawn of the Jedi: Into the Void"/><published>2026-05-28T00:00:00+00:00</published><updated>2026-05-28T00:00:00+00:00</updated><id>https://benniemosher.com/book/reviews/2026/05/28/dawn-of-the-jedi-into-the-void</id><content type="html" xml:base="https://benniemosher.com/book/reviews/2026/05/28/dawn-of-the-jedi-into-the-void.html"><![CDATA[<p>I started reading Star Wars Legends from the very beginning of the timeline, and this is where it all starts — roughly 25,000 years before Luke Skywalker ever picked up a lightsaber. I came into this book knowing the movies, The Mandalorian, and the newer shows, and had no idea what to expect from a Star Wars story set this far back.</p> <p><img src="/assets/img/book-covers/dawn-of-the-jedi-into-the-void.jpg" alt="Book cover" style="max-width:280px;height:auto;float:right;margin:0 0 1rem 1rem;"/></p> <h3 id="-45-stars">⭐⭐⭐⭐ 4/5 stars</h3> <ul> <li><strong>Author:</strong> Tim Lebbon</li> <li><strong>Format:</strong> Kindle + Audiobook</li> <li><strong>Read:</strong> May 25–28, 2026 (4 days)</li> <li><strong>Era:</strong> 25,793 BBY — Old Republic Era</li> <li><strong>Series:</strong> Star Wars Legends (Chronological Read-Through, Book 1)</li> </ul> <p>The biggest thing that blew my mind was the weapons. There are no lightsabers here. The Jedi — or Je’daii as they’re called in this era — carry real swords, Force-imbued metal blades. The main character Lanoree Bri has her battle sword and her practice sword, and that detail alone reframes everything you think you know about Star Wars. You realize the lightsaber didn’t just appear out of nowhere. Someone had to invent it. That journey starts here.</p> <p>The other thing that hit me was the Force philosophy. This is before the Jedi Order and the Sith exist as separate factions. The Je’daii require genuine balance between light and dark — not as a moral gray area, but as strict philosophy. Stray too far toward the light or too far toward the dark and you get exiled to one of Tython’s moons until you find your center again. The clean split we know from the movies — Jedi are good, Sith are evil — hasn’t happened yet. Seeing the world before that line was drawn is one of the most interesting things this book does.</p> <p>Lanoree is a strong lead. She carries the book. I cared about her journey, her choices, and the weight she carries throughout the story. I’m a dad of three daughters, and finding a female lead in a Star Wars book who wrestles with the light and dark in such a human way meant something to me. This is a book I would hand to my girls and want to talk about with them. That’s not something I say lightly.</p> <p>The weakness is her brother. The storyline with Dal felt predictable from early on, and the emotional payoff the book was clearly building toward didn’t land as hard as it should have because I could see it coming. That’s the main reason this is a four star read and not five.</p> <p>If you’re curious about where the Force tradition came from, or if you’re reading Legends chronologically like I am, this is the right place to start. It sets up everything — the Je’daii Order, Tython, the earliest days of the Force — in a way that makes every book that follows feel richer.</p> <p>One honest frustration reading this chronologically — when this book ends you are sitting at roughly 25,000 years before the Battle of Yavin. The next Legends novel on the timeline is Revan, which picks up at around 3,950 BBY. That is a gap of over 20,000 years with no novels to cover it. No lightsaber invention. No Jedi Order forming. No Sith split. None of it exists in book form in Legends. That story has simply never been written. So if you finish this book excited to follow the evolution of everything Tim Lebbon set up — the swords becoming lightsabers, the Je’daii becoming the Jedi — you are going to hit a wall. It is one of the most glaring gaps in the entire Legends library and it is genuinely frustrating.</p> <p>Just don’t go in expecting lightsabers. That’s the whole point.</p> <p><em>This is part of my ongoing Star Wars Legends chronological read-through. I’m reading every Legends novel in the order events happen in the galaxy, starting 25,000 years before the Battle of Yavin. Next up: The Old Republic: Revan.</em></p>]]></content><author><name></name></author><category term="book"/><category term="reviews"/><summary type="html"><![CDATA[A review of "Dawn of the Jedi: Into the Void" by Tim Lebbon — the first book in my Star Wars Legends chronological read-through.]]></summary></entry><entry><title type="html">Ready Player Two</title><link href="https://benniemosher.com/book%20reviews/2021/08/09/ready-player-two.html" rel="alternate" type="text/html" title="Ready Player Two"/><published>2021-08-09T00:00:00+00:00</published><updated>2021-08-09T00:00:00+00:00</updated><id>https://benniemosher.com/book%20reviews/2021/08/09/ready-player-two</id><content type="html" xml:base="https://benniemosher.com/book%20reviews/2021/08/09/ready-player-two.html"><![CDATA[<p>Foreclosure I was a big fan of the first book in this series, “Ready Player One.” I read RP1 before it was a movie via the Audible service, in one week’s drive. Ernest captured lots of 80s cultural references in ways that were fun and unlike anything I had read to that point. The movie was equally fun for me, and I felt like it was true to the book. I was very excited and anticipated the second book in the series, “Ready Player Two.”</p> <p>“Ready Player Two” was fun and took me on a journey I was not expecting. After reading the book, I was not surprised by the direction that Ernest took with the book. The classic AI armageddon storyline, and it wasn’t bad. I have not read a bunch of sci-fi books or books about AI. The genre is a newer discovery for me. After reading a bunch of reviews on GoodReads.com, I was disappointed to see that other seasoned authors were let down by the book. I can say that during reading the book when I found out there was a neural network interface I knew that Sam would be against it and the rest would be for it. I was able to predict that at least.</p> <p>I however was extremely pleased with the book and the new cultural references that it included. Having some of the final scenes be from the LOTR universe was exciting, and something that I was not expecting. It has inspired me to go back and reread all 5 books, The Hobbit, LOTR, and Simarillion. I hope that they take the time to turn this into a movie, some of these visuals would be amazing.</p> <p>Overall, I thought that this book was great, and Ernest Cline did not disappoint me. I could not put this book down and read it visually in two weeks, which is historically really fast for me. I was letting my wife drive places so I could have my head buried in the book, much like my teenage self reading the Junior Jedi Knights series!</p>]]></content><author><name></name></author><category term="Book Reviews"/><summary type="html"><![CDATA[Some thoughts on the book "Ready Player Two" by Ernest Cline, the sequel to "Ready Player One"]]></summary></entry><entry><title type="html">Learning React and Mocha</title><link href="https://benniemosher.com/learning/2016/02/18/learning-react-and-mocha.html" rel="alternate" type="text/html" title="Learning React and Mocha"/><published>2016-02-18T00:00:00+00:00</published><updated>2016-02-18T00:00:00+00:00</updated><id>https://benniemosher.com/learning/2016/02/18/learning-react-and-mocha</id><content type="html" xml:base="https://benniemosher.com/learning/2016/02/18/learning-react-and-mocha.html"><![CDATA[<p>In my recent job search I have been getting turned down by a lot of employers because I do not have React or Angular experience. Today I decided to learn one and build a demo app that can prove that I know the framework and can get work done. After research and tallying up denial emails, I decided that React was looking more needed and that it was smarter to learn React. So, I set out to do it. I read a <a href="http://reactfordesigners.com/labs/reactjs-introduction-for-people-who-know-just-enough-jquery-to-get-by/">article</a> that explain why React was superior to React and I was hooked. Mind you I finished this at 0200, when I should of been cozyed up against my wife, dogs, and my daughter in bed. However, now I have the damn learning fever that I get when I am learning something new.</p> <p>I knew that after learning the basics of states, that I needed to learn someway to write React in a TDD environment. The article mentioned above, as well as the <a href="http://facebook.github.io/react/docs/getting-started.html">documentation</a> provided by Facebook did not mention this. So, I did the normal developer thing, I Googled it. Which brought me to this little gem of a <a href="http://www.bebetterdeveloper.com/coding/getting-started-react-mocha.html">blog post</a>. The content is incredible, and it in fact does work and taught me how to get Mocha running with React. However, if you look at the dependencies there, it lists Gulp as a dependency.</p> <p>I know, I know, all you magpies are in love with Gulp and Grunt and whatever G word you can think up with to build your environment. I on the other hand have recently been trying to keep it simple. I have been doing everything in my power to write on NPM scripts, and stay away from the extra complexity that G’s bring. So, I went over to Lena’s Github profile, and found her repository for <a href="https://github.com/LenaBarinova/react-mocha-example">react-mocha-example</a> and forked it. And then the obsession grew even deeper.</p> <h2 id="removing-gulp">Removing Gulp</h2> <p><strong>HULK SMASH!!!</strong> and done, Gulp is removed. No, no, I will provide you with more context. So, first thing that I did was ran <code class="language-plaintext highlighter-rouge">npm install</code> just to make sure that my tests pass before I did anything. We are green, awesome. Now, what happens if I run <code class="language-plaintext highlighter-rouge">npm uninstall --save-dev gulp gulp-load-plugins gulp-mocha gulp-open</code>? Well, it uninstalls those modules of course. And then we run <code class="language-plaintext highlighter-rouge">npm test</code> again, and we are green. Okay, phew I didn’t break anything yet. Wait, look in package.json what is this <code class="language-plaintext highlighter-rouge">vinyl-source-stream</code> package? I have no idea, but it has the word stream in it, so it must have something to do with Gulp. A quick search on <a href="https://npmjs.com">npmjs.com</a> and <em>BAM</em>, I found it! In fact <a href="https://www.npmjs.com/package/vinyl-source-stream"><code class="language-plaintext highlighter-rouge">vinyl-source-stream</code></a> actually is a Gulp related package. Alright, sweet let’s blast that guy too, <code class="language-plaintext highlighter-rouge">npm uninstall --save-dev vinyl-source-stream</code>. Alright, run <code class="language-plaintext highlighter-rouge">npm test</code> again, and we are green. SWEET! That just removed five unneeded plugins from this repository. HELL TO THE YEAH! Now, lets delete the <code class="language-plaintext highlighter-rouge">gulpfile.js</code> as we will not need it anymore, and then commit.</p> <h2 id="removing-browserify">Removing Browserify</h2> <p>Alright, <code class="language-plaintext highlighter-rouge">browserify</code> is not a bad package at all. However, I just didn’t see the need for us to have it in this repository at this time. So, lets <code class="language-plaintext highlighter-rouge">npm uninstall --save-dev browserify</code> and then run <code class="language-plaintext highlighter-rouge">npm test</code>. Yup, we are green. Alright, we are doing pretty good so far, not a big deal. Let’s commit and then look at <code class="language-plaintext highlighter-rouge">package.json</code>.</p> <h2 id="removing-unneeded-babel-packages">Removing unneeded Babel packages</h2> <p>Alright, this is where it began to get a little hairy. I didn’t want to have Babel in the package list at all. So, I <code class="language-plaintext highlighter-rouge">npm uninstall --save-dev babel babel-core babel-preset-es2015 babel-preset-react</code> and run <code class="language-plaintext highlighter-rouge">npm test</code>. Holy mother of moses, we have errors. All over. Shoot. Okay, let’s undo that really fast <code class="language-plaintext highlighter-rouge">git co package.json &amp;&amp; npm install</code>. Let’s look at that list that we just uninstalled. At this point in my learning, I am willing to bet money that a package with the name “react” in it is most likely needed. So, let’s try the next one in line <code class="language-plaintext highlighter-rouge">npm uninstall --save-dev babel-preset-es2015</code> and then run <code class="language-plaintext highlighter-rouge">npm test</code>. Oops, nope still getting errors. Okay, again let’s undo that <code class="language-plaintext highlighter-rouge">git co package.json &amp;&amp; npm install</code>. Alright, next in line let’s ditch babel-core <code class="language-plaintext highlighter-rouge">npm uninstall --save-dev babel-core</code> and then run <code class="language-plaintext highlighter-rouge">npm test</code>. “Dammit, man! I’m a doctor, not a physicist!” Alright, we have to have that one too. Okay, lets undo that again <code class="language-plaintext highlighter-rouge">git co package.json &amp;&amp; npm install</code>. Last try here, <code class="language-plaintext highlighter-rouge">npm uninstall --save-dev babel</code> and then run <code class="language-plaintext highlighter-rouge">npm test</code>. DING DING DING! We have a winner! Looks like we don’t need babel in our package list. Well, at least that gets rid of one package. Let’s commit and move on.</p> <h2 id="upgrading-packages">Upgrading packages</h2> <p>At this point, we have removed everything from the <code class="language-plaintext highlighter-rouge">package.json</code> that we can. However, I did notice when we were running <code class="language-plaintext highlighter-rouge">npm install</code> that we were getting some warnings and deprecation notices. So, let’s go ahead and delete the <code class="language-plaintext highlighter-rouge">"devDependencies"</code> element out of our JSON object in <code class="language-plaintext highlighter-rouge">package.json</code>. Then we can run <code class="language-plaintext highlighter-rouge">npm install --save-dev babel-core babel-preset-es2015 babel-preset-react jsdom mocha mocha-jsdom react react-addons-test-utils react-dom</code> and of course run a quick <code class="language-plaintext highlighter-rouge">npm test</code> to make sure we are still green, and we are. Great. Let’s commit here and move on.</p> <h2 id="changing-out-mocha-jsdom-for-jsdom-global">Changing out mocha-jsdom for jsdom-global</h2> <p>One thing that I noticed on that last <code class="language-plaintext highlighter-rouge">npm install</code> command was a deprecation warning about <code class="language-plaintext highlighter-rouge">mocha-jsdom</code> and to move to using <code class="language-plaintext highlighter-rouge">jsdom-global</code>. So, let’s just go ahead and do that <code class="language-plaintext highlighter-rouge">npm uninstall --save-dev mocha-jsdom</code> and then <code class="language-plaintext highlighter-rouge">npm install --save-dev jsdom-global</code>. Of course, lets run <code class="language-plaintext highlighter-rouge">npm test</code> again. And we have another failure. That is okay, pretty easy to fix that one. Let’s <code class="language-plaintext highlighter-rouge">vim test/component-test.js</code> and change line 4 to <code class="language-plaintext highlighter-rouge">var jsdom = require('jsdom-global');</code>, and then run <code class="language-plaintext highlighter-rouge">npm test</code>. Sweet, that was an easy fix and we got rid of one of the deprecation warnings. Let’s commit at this point.</p> <p>After that I just changed the example code to be a little more generic and use things like “Hello World!”, instead of the chipper “Lovely! Here it is - my very first React component!”. BAH HUMBUG!!! Mr. Scrooge no like chipper. You can see the majority of those <a href="https://github.com/benniemosher/react-mocha-example/commit/3c341bea3749c94a5e4317df3071076444202417">changes here</a>.</p> <p>That is it. You now have a basic React and Mocha test framework that you can duplicate and use on every project. Pretty simple right? I thought so, and it was a lot of fun to HULK SMASH NPM packages for an hour or so. Well, I am off to grab some shut eye before my daughter wakes up; but tomorrow I will be learning more React and possibly starting the job hunting app I have been thinking about. Until next time, “You stay classy, San Diego!”</p> <p>P.S. I technically was able to completely remove the Babel dependency from the project, however because Facebook has official endorsed Babel, I didn’t include those steps in this post. You can check out the PR and read more about the Babel/JSTransform fight to the death <a href="https://github.com/benniemosher/react-mocha-example/pull/1">here</a>!</p>]]></content><author><name></name></author><category term="Learning"/><summary type="html"><![CDATA[My quest to learn React and Mocha without Grunt or Gulp]]></summary></entry><entry><title type="html">My Strength and Weaknesses to Date</title><link href="https://benniemosher.com/learning/2016/02/11/my-strength-and-weaknesses-to-date.html" rel="alternate" type="text/html" title="My Strength and Weaknesses to Date"/><published>2016-02-11T00:00:00+00:00</published><updated>2016-02-11T00:00:00+00:00</updated><id>https://benniemosher.com/learning/2016/02/11/my-strength-and-weaknesses-to-date</id><content type="html" xml:base="https://benniemosher.com/learning/2016/02/11/my-strength-and-weaknesses-to-date.html"><![CDATA[<p>Through my recent layoff and my currently ongoing job search, I have had to answer a lot of interview type questions. One of those questions was, “What else do you think we should know about you?”. I thought to myself, what else is pertinent here? Let’s be honest and write about my strengths and weaknesses. And then it set in… my brain came to a halt. What are my strengths? I have non, but I have a ton of weaknesses. Then steps in the wife. According to my wife my greatest strength as an engineer is my attention to detail, and my greatest weakness as a developer is my tendency to try and be a hero and take on too much work in an iteration. Let me go into some more detail.</p> <p>I think that my greatest strength as an engineer is how much I pain attention to detail. I pour my heart into every piece of code that comes from my fingers, or my pairs fingers. Due to my heart being attached to every piece of code, I do everything that I can to make my code a piece of art. I am obsessed with the nerdy things like whitespace, semicolons, same line curly braces, etc. I want the next person who comes along after me to be able to read and update the code that I write with ease.</p> <p>I think that my greatest weakness as a engineer is that I tend to take on too much responsibility in an iteration, which makes me tend to work fast. This usually results in my code suffering in quality, and things like whitespace being wrong. I know, the world is going to end right! It is something that has been brought to my attention at my last employer, and it is something that I have been and am going to continually work on throughout my career. I can still live to my nickname of “FedEx”, and slow down and make sure that mistakes are not made.</p>]]></content><author><name></name></author><category term="Learning"/><summary type="html"><![CDATA[An exercise of inner reflection and true honesty.]]></summary></entry><entry><title type="html">What is a category?</title><link href="https://benniemosher.com/learning/2016/01/29/what-is-a-category.html" rel="alternate" type="text/html" title="What is a category?"/><published>2016-01-29T00:00:00+00:00</published><updated>2016-01-29T00:00:00+00:00</updated><id>https://benniemosher.com/learning/2016/01/29/what-is-a-category</id><content type="html" xml:base="https://benniemosher.com/learning/2016/01/29/what-is-a-category.html"><![CDATA[<p>Categories are not a Groovy specific thing. From a quick google search I found this <a href="https://en.wikipedia.org/wiki/Class_(computer_programming)#Partial">Wikipedia</a> article, which tells us that the idea of categories have been around in many languages such as Smalltalk (known as Class Extensions), C# 2.0 and Visual Basic 2005 (known as partial classes), Objective-C (known as categories), and I also found that <a href="https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Extensions.html">Swift</a> has the same idea known as Extensions.</p> <p>Since I am by no means a programming expert (yet, I will get there!), I will not try to completely explain categories instead I will just make some notes on the things that I learned about them during the pairing session. Categories do not add methods to the parent class at compile time like most other classes, instead it actually is adding them at runtime. This allows for the interpretor to basically layer the classes on top of each other. Let us look at an example our core class <code class="language-plaintext highlighter-rouge">Bob</code>:</p> <div class="language-groovy highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">Bob</span>
<span class="o">{</span>
  <span class="n">String</span> <span class="nf">drinkCoffee</span><span class="o">()</span>
  <span class="o">{</span>
    <span class="n">String</span> <span class="n">cup</span> <span class="o">=</span> <span class="s1">'16oz'</span>
    <span class="k">return</span> <span class="n">cup</span>
  <span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div> <p>In our <code class="language-plaintext highlighter-rouge">Bob</code> class above, we have a method called <code class="language-plaintext highlighter-rouge">drinkCoffee</code>. In this method we simply create a string called <code class="language-plaintext highlighter-rouge">cup</code> and then set it to <code class="language-plaintext highlighter-rouge">'16 oz'</code>. We simply just then return our string <code class="language-plaintext highlighter-rouge">cup</code> at the end of the method. This is just a basic class and method, I am sure that your codebase is much more complex, as is the codebase at my work, however for this example we will keep it simple. Let us get our category on!</p> <div class="language-groovy highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">Bill</span>
<span class="o">{</span>
  <span class="n">use</span><span class="o">(</span><span class="n">Bob</span><span class="o">)</span> <span class="o">{</span>
    <span class="n">String</span> <span class="nf">drinkCoffee</span><span class="o">()</span>
    <span class="o">{</span>
      <span class="n">String</span> <span class="n">coffee</span> <span class="o">=</span> <span class="s1">'French Roast with Cream and Sugar'</span>
      <span class="k">return</span> <span class="n">cup</span> <span class="o">+</span> <span class="n">coffee</span>
    <span class="o">}</span>
  <span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div> <p>If we look here, we use a category by <code class="language-plaintext highlighter-rouge">use(Bob)</code> and then extend the functionality by calling the same method <code class="language-plaintext highlighter-rouge">drinkCoffee()</code>. As we can see here, we don’t redeclare <code class="language-plaintext highlighter-rouge">String cup = '16oz'</code> because we don’t want to change it. The category principle basically allows us to inherit the cup variable from the parent class. We then set coffee with <code class="language-plaintext highlighter-rouge">String coffee = 'French Roast with Cream and Sugar'</code>. At the end of the method we then just <code class="language-plaintext highlighter-rouge">return cup + coffee</code>. The category allows us to easily extend the base method and include our own data and functionality and inherit the variables from the parent method.</p>]]></content><author><name></name></author><category term="Learning"/><summary type="html"><![CDATA[Learning about Groovy's categories]]></summary></entry><entry><title type="html">Things to think about before beginning a task</title><link href="https://benniemosher.com/learning/2016/01/28/things-to-think-about-before-beginning-a-task.html" rel="alternate" type="text/html" title="Things to think about before beginning a task"/><published>2016-01-28T00:00:00+00:00</published><updated>2016-01-28T00:00:00+00:00</updated><id>https://benniemosher.com/learning/2016/01/28/things-to-think-about-before-beginning-a-task</id><content type="html" xml:base="https://benniemosher.com/learning/2016/01/28/things-to-think-about-before-beginning-a-task.html"><![CDATA[<p>When beginning a new feature task, it is good to take the time and sit back and think about your approach. Come up with your game plan. Your play book. You should start by asking yourself, “Where am I getting the data from?”. This is probably one of the most key decisions that you can make before you get started. Are you getting data from more than one source? Grab a scratch piece of paper, or a blank text editor and start writing down some notes. Next question you should ask yourself is, “Is there options Out Of The Box (OOTB)?”. Ask yourself, “Is there something in our ecosystem that I can use and just make it more robust? A class that I can just extend?”. Most of the time it appears that this is the case. Which really, ultimately seems to make development a lot easier. You do not have to start over from scratch. You can just extend a class, or use a category, and add the data or methods that you need for your new feature. Take a few minutes to look through your existing code base. Check some things out, pseudo code, write notes, draw a mind map, do whatever you can find that allows you to wrap your head around the entire feature and how you are going to implement it.</p> <p>In our particular case, we were working on a feature where we needed to add image url data to the SKU object. So, we knew that we already had a core class that generated a custom Color object, so let’s consider that our OOTB class that we can extend to make more robust. We also know that our data lived on the Color object’s parent object of Product. Since we were working with Oracle Commerce (OC), my partner showed me a really easy way to view the data that is being delivered to any OC page. You can simply append this query string onto the URL and it will show you all the data, <code class="language-plaintext highlighter-rouge">?format=json</code>. Once you have the format though, at least in Google Chrome, it looks like just a giant unreadable string. Have no fear, my fellow engineer; there is an extension for that! I personally use <a href="https://chrome.google.com/webstore/detail/jsonview/chklaanhfefbnpoihckbnefhakgolnmc">JSONView</a>, which will re-render the JSON into a readable format for you.</p> <p>One more thing to remember before starting your feature, is set this rule for yourself, <strong><em>“Avoid, at all costs, changing a core class!”</em></strong> I have not done a lot of programming on top of another platform, like OC, most of my work has been done on a from scratch project. However, I have been told from a few coworkers and mentors that you can almost always get away with never changing a core class. For instance, at work the brave souls that we call Architects have designed a platform that sits on top of Oracle Commerce and enhance the functionality and accessibility. Therefore, we call this platform our “core” now. When we started our newest project, we have been extending those core classes to provide the specific functionality that is not included in our core platform. Sometimes this requires being extremely clever, sometimes it does in fact mean having to refactor a core class so that we can properly extend it in the new project. We have been using a type of classes called Categories, also known as partial classes.</p>]]></content><author><name></name></author><category term="Learning"/><summary type="html"><![CDATA[How I learned to approach a task with agile thinking]]></summary></entry></feed>