<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>CJ Coffey</title><description>A place to write down my thoughts</description><link>https://cjcoffey.com/</link><item><title>A few thoughts on AI</title><link>https://cjcoffey.com/posts/thoughts-on-ai/</link><guid isPermaLink="true">https://cjcoffey.com/posts/thoughts-on-ai/</guid><pubDate>Fri, 20 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Pardon me for a moment while I dump the contents of my brain onto this piece of digital paper. I don&apos;t quite remember where I was when ChatGPT started taking off, but when I started hearing about it, it seemed like a bit more than a party trick. It could do some neat stuff, but it was still fallible. Large language models (LLMs), or, as we&apos;ve come to call it colloquially, &quot;AI&quot;, have been with us for a few years now. It certainly seems like it&apos;s here to stay, for better or worse. As time has gone on, though, I&apos;ve noticed some things about it that give me some pause. Quick disclaimer: I&apos;m speaking from my experience, so take things with a grain of salt. I&apos;m not a turbo user of this tech, and I&apos;d say I&apos;m barely a user at all. Now, let&apos;s talk about it.&lt;/p&gt;
&lt;h1&gt;The Good&lt;/h1&gt;
&lt;p&gt;I&apos;ll give LLMs their props where I see them doing well. They&apos;re more than decent at summarizing things. If you need the shortened short version of something, it does a pretty good job at giving you some bullet points. Do you lose a lot of context for something that you otherwise would have had if you had read the entire book/blog post/article/etc.? Of course! But, if you need a bit of an overview of something for whatever reason, it&apos;ll give it to you.&lt;/p&gt;
&lt;p&gt;It&apos;s really great at creating diagrams. I&apos;m speaking from a software developer perspective, and I&apos;ll give you an example. Last year at work, my co-workers and I were tasked with doing some maintenance on some software that was over 20 years old. We&apos;re talking ancient tech here. The folks that wrote it did their best with the tools they were given, and I don&apos;t fault them for it. I&apos;m honestly impressed at the work they did given the constraints. Having said that, it&apos;s been one of the worst, if not the worst maze of code I&apos;ve ever witnessed. Side effects upon side effects. Nothing is testable. Nothing is predictable. One of the things I was asked to do was to tweak a single value on one of the web pages. The problem was that, the last time I had to do something like that for the same project, it took me over an hour to find out where the value comes from, its journey through several different code files, and its eventual landing place. It was excruciating. This time, though, I would try out GitHub Copilot to see if it could show me the flow of data from start to finish via a diagram. That would at least help better understand the journey, given the visual representation. It took something that would have taken me an hour or so, and did it in a minute or two. I was floored. &lt;em&gt;Thank you, Copilot!&lt;/em&gt; I was able to quickly figure out what I needed to do next, and my high effort bug fix went down to a medium effort one.&lt;/p&gt;
&lt;h1&gt;The Bad&lt;/h1&gt;
&lt;p&gt;One thing I&apos;ve noticed while using a chat bot, such as Copilot, is that, if you&apos;re not an expert on something, and you don&apos;t do your due diligence, you&apos;re not going to know when this thing is just flat out wrong. If I see the &quot;you&apos;re absolutely right!&quot; response one more time, I might blow a gasket. I think the frustration comes from two places: the marketing of AI, and the way in which we interact with it. The marketing would have us believe that these things contain the entire chronicles of human knowledge. There&apos;s &lt;em&gt;nothing&lt;/em&gt; it doesn&apos;t know! That, and the fact that they come across as sentient. Heck, OpenAI even has voices for them to really help bring them to life. When we &quot;speak&quot; to these chat bots, it can be easy for us to let our guard down and trust it. You&apos;re the super intelligence! Who am I to question such an authority? But we know now that isn&apos;t the case at all. It frequently makes mistakes, and the only reason we don&apos;t always catch them in the moment is because we&apos;re often looking to learn something we don&apos;t know.&lt;/p&gt;
&lt;h1&gt;The Ugly&lt;/h1&gt;
&lt;p&gt;Let&apos;s not mince words here. This thing is an ethics nightmare. We all know that it&apos;s been trained on stolen data, stolen IP, stolen work, etc. OpenAI is &lt;a href=&quot;https://harvardlawreview.org/blog/2024/04/nyt-v-openai-the-timess-about-face/&quot;&gt;currently being sued&lt;/a&gt; because of this. Any time you&apos;re using it to generate an essay, a thank you card, a poem, an image, a song, etc. you&apos;re aiding in this theft. I&apos;m hoping that there is a way to give these authors and artists their proper dues.&lt;/p&gt;
&lt;p&gt;There&apos;s also the fact that the data centers required for these are eating up all of the water. The UN announced recently that we&apos;re headed towards &lt;a href=&quot;https://news.un.org/en/story/2026/01/1166800&quot;&gt;global water bankruptcy&lt;/a&gt;. There&apos;s no coming back from that. This sort of thing has been a trend for decades. Short term profits will always trump long term benefits. I don&apos;t know what to do about this, but it makes me feel sick to my stomach every time I think about it.&lt;/p&gt;
&lt;h1&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;I saw recently somewhere that using AI makes you the client, not the artist, and I love this take. Being creative and creating things are important. You could argue that&apos;s what makes us human. You can&apos;t be creative and imaginative with AI. AI cannot create anything new. It can only regurgitate what it &quot;knows&quot;. With all of the AI generated slop out there, updated AI models have nothing new to feed off of, so we&apos;re basically inbreeding these models at this point. It may sound corny, but we need to make things with love and care, even software. If you outsource all of that to AI, you&apos;re no longer invested in the outcome. Take some time to be creative this week. Make something fun. Make something dumb. Be silly. Let&apos;s not forget what makes us human.&lt;/p&gt;
&lt;p&gt;Thanks for reading. Take care.&lt;/p&gt;
&lt;p&gt;- CJ&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This post was in no way, shape, or form written with or assisted by AI. That goes for everything on my website. You have my guarantee that everything you see here is written by me, and possibly proofread by my wife. And by written, I mean the code, too. Not just the blog posts. Alright, I&apos;m done.&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>ai</category><category>coding</category><category>ethics</category><category>rambling</category><author>CJ Coffey</author></item><item><title>2025 Wrapped</title><link>https://cjcoffey.com/posts/2025-wrapped/</link><guid isPermaLink="true">https://cjcoffey.com/posts/2025-wrapped/</guid><pubDate>Wed, 31 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Welcome back lads and lasses to another year wrapped up and in the books. You know the drill by this point. I&apos;m going to talk about some things I did this year, and hopefully you enjoy my ramblings and show-and-tells. I&apos;m going to do things a bit differently this time and go month by month to talk about what I did in a given month. By this time next year, if I dislike this format, I&apos;ll go back to the regular list. Let&apos;s get started, shall we?&lt;/p&gt;
&lt;h2&gt;January&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Spider-Man: Miles Morales
&lt;ul&gt;
&lt;li&gt;Terrific. Absolutely terrific. I&apos;m also a big fan of, what I&apos;m now deeming &quot;short ass games&quot;. I&apos;m in my 30s with a full time gig and a whole household to take care of, so what little time I have is very precious. I am a big fan of a game that packs in so much in so little time. I finished it in about 10 hours and felt like I ate a seven course meal.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Ratchet and Clank: A Rift Apart
&lt;ul&gt;
&lt;li&gt;I have never played a Ratchet and Clank game before this one, and I absolutely adore this game. The voice acting is great, and the graphics on my new PS5 make this game look like a pixar movie. It&apos;s absolutely gorgeous. It&apos;s a fun little collect-a-thon with interesting battle mechanics that are kind of RPG-lite. It&apos;s well designed and completely worth checking out.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;365 Days to the Wedding
&lt;ul&gt;
&lt;li&gt;Super cute. Well worth the watch, though it feels like it might venture into thriller territory, it&apos;s just a plot device.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Fast Food Simulator
&lt;ul&gt;
&lt;li&gt;Really silly game to play with your friends. It&apos;s very quirky, but I think it has a lot of potential.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;February&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Final Fantasy 7 Remake
&lt;ul&gt;
&lt;li&gt;I played the demo for this initially in 2020 and just couldn&apos;t get into it. The new combat system along with the lack of turn based battles just really turned me off. I didn&apos;t get it. I revisited it this year and I&apos;m really enjoying it. I think the story is a bit more obtuse, but I&apos;m really enjoying the extra time they&apos;re giving for character development. It breathes new life into some characters that didn&apos;t really get as much screen time in the 1997 release.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Shashingo
&lt;ul&gt;
&lt;li&gt;Very neat and fun way to learn some Japanese vocabulary.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Noun Town (non-VR)
&lt;ul&gt;
&lt;li&gt;I very much like the vibe and atmosphere of this game. I think it has the potential to help you learn some vocabulary, but I just couldn&apos;t stick with it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Speed Crew
&lt;ul&gt;
&lt;li&gt;Basically Overcooked, but you&apos;re a car mechanic. It similarly has a giant difficulty spike, but it&apos;s not as intense as overcooked&apos;s one. It&apos;s a fun time with a friend or two.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Apothecary Diaries Season 2
&lt;ul&gt;
&lt;li&gt;And so we continue down the rabbit hole of this story. It&apos;s just as compelling as season 1. Interesting new characters and stories.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Spider-man 2
&lt;ul&gt;
&lt;li&gt;Incredible. Absolutely incredible. Super fun. Random emotional side stories that hit way too hard.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;March&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Monster Hunter Wilds
&lt;ul&gt;
&lt;li&gt;Definitely one of the most monster hunter games of all time. I dunno. I just couldn&apos;t get into this one the way I got into World or Rise. World was something really special. I was obsessed with World. Rise was fun, but I wasn&apos;t quite obsessed with it. Wilds is a nice mix of World and Rise, but outside of the massive upgrade in handlers, I just wasn&apos;t super invested in this one.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;I Have a Crush at Work
&lt;ul&gt;
&lt;li&gt;Super cute, classic work-place love story. It&apos;s a great time, and I am honestly more invested in the romance story happening to the side characters than the main characters&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Ranch simulator
&lt;ul&gt;
&lt;li&gt;Super jank sim game that&apos;s worth a laugh or two. I don&apos;t see myself playing it long term though.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Abundance
&lt;ul&gt;
&lt;li&gt;Very interesting and eye opening book. I try not to be so cynical and pessimistic in every day life, and this book does a decent job of showing &quot;what could be&quot; if we, as a society, would get out of our own way. I learned a lot of some behind the scenes stuff from reading this. Why wasn&apos;t project warp speed talked about? It&apos;s absolutely incredible that we had that kind of collaboration to combat a global pandemic. I just wish we could do the same to solve other problems.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;April&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Forza Motorsport
&lt;ul&gt;
&lt;li&gt;Coming from games like Forza Horizon and Mario Kart, I was not prepared for this. This is a proper sim (when it&apos;s not crashing). The &quot;always online&quot; aspect is incredibly annoying, so I don&apos;t think I&apos;d ever buy the game (I&apos;m currently playing via game pass), but it&apos;s been a fun time despite the annoyances.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Schedule 1
&lt;ul&gt;
&lt;li&gt;It&apos;s a decent time if you have enough people playing. Games like these stress me out due to all of the things you have to keep track of. Getting into trouble and running away is fun though. Really gets the blood pumping. The game also has a fun chase mechanic.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;May&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Kowloon Generic Romance
&lt;ul&gt;
&lt;li&gt;At no point in watching this did I know what would happen next. I&apos;m honestly still a little lost. I was really hoping for a romance, but it never really happened, at least, the way you&apos;d hope for. I still liked it even if it wasn&apos;t the thing I signed up for.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Void Crew
&lt;ul&gt;
&lt;li&gt;It&apos;s kind of like &quot;Lovers in a dangerous spacetime&quot;,  but 3D and it&apos;s not cute. Really fun if you can get a group of 4 or so to play together.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The Headliners
&lt;ul&gt;
&lt;li&gt;Hilarious, but absolutely brutal game. It&apos;s fun for the first couple of hours, but it doesn&apos;t really have any staying power because there&apos;s no recourse if you lose everything. You have to be absolutely stupid and sacrifice yourself and/or a teammate to get a good enough score fairly early into the game. I think if they can tweak the difficulty on this one, it&apos;d be a solid multiplayer experience, but right now, it&apos;s just not all the way there for me.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Persona4 the Golden Animation
&lt;ul&gt;
&lt;li&gt;This one is hard to recommend to people that haven&apos;t play the games or haven&apos;t seen the first anime. It&apos;s supplementary material, but it&apos;s a nice time. It definitely hit the nostalgia bits for me, but its pacing is wild and can be disorienting.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Guilty Gear Strive Dual Rulers
&lt;ul&gt;
&lt;li&gt;It&apos;s hard to recommend this to people that haven&apos;t played the games or know the lore. It assumes you know a lot. Having said that, as a fan of Guilty Gear, this was a fun watch. I always felt like the story mode of guilty gear would be better served as a movie or anime rather than...whatever the story mode is in the games (visual novel?)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Nier Automata v1.1a Season 2
&lt;ul&gt;
&lt;li&gt;Strong finish to a terrific adaptation of the games. The YoRHa manga series has been a great read so far too. I don&apos;t feel like you need to have played the games to watch this, so that&apos;s saying a lot for a lot of other adaptations I&apos;ve seen this year&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Aharen-san wa Hakarenai Season 2
&lt;ul&gt;
&lt;li&gt;SO FREAKIN CUTE. It&apos;s so silly, so zany, so over-the-top. If you have a low tolerance for &quot;anime bs&quot;, then give this one a try, because I feel like I haven&apos;t seen much, if any. It&apos;s just purely silliness.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;June&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Lucky Loser
&lt;ul&gt;
&lt;li&gt;Interesting book by one of the hosts and correspondents of the Daily Show. There are bits in there I didn&apos;t really care for, but it&apos;s an interesting autobiography. I learned more about tennis than I was anticipating and I was re-affirmed in my decision to not follow the arts and stick with coding (I don&apos;t take criticism nor failure well).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;July&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Dandadan
&lt;ul&gt;
&lt;li&gt;Any time I see something popular, I like to give it a year or two to try out if I do decide to. Does it live up to the hype? I certainly think so. Season 2 was fantastic too. This anime has straight bangers that are in my daily rotation now.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;My Dress Up Darling Season 2
&lt;ul&gt;
&lt;li&gt;SUPER cute season and I really hope we can get more anime to finish out the manga. I&apos;ll definitely be picking back up the manga later this year.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Tony Hawk Pro Skater 3+4
&lt;ul&gt;
&lt;li&gt;This was a nice trip down memory lane and looks how I remember it (more or less). I just wish Wish by Alien Ant Farm was still on the track list :( The game is more infuriating than I remember (was I really that good at the game as a kid? Did I forget this trauma? Did I rage just as much before? Who knows.) Tony Hawk was such a big part of my childhood. I&apos;m glad they&apos;re giving these games a face lift for the current generation of gamers to enjoy. Here&apos;s to hoping we get Underground next (and please bring back the &quot;put your face in the game&quot; feature! That was the best!)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;PlateUp
&lt;ul&gt;
&lt;li&gt;This is basically overcooked in a slightly different format. It&apos;s just as stressful if not more. Don&apos;t recommend if you have crippling anxiety.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;R.E.P.O.
&lt;ul&gt;
&lt;li&gt;Terrific party game. It&apos;s very silly, yet challenging. If you go in for fun, I think you&apos;ll have a good time. It can get tense when trying to hide from baddies, but the goofy aesthetic helps to keep the mood light and carefree.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;WOWOWOW KORONE BOX
&lt;ul&gt;
&lt;li&gt;A really simple, free game that&apos;s great, especially if you&apos;re a fan of Korone. There&apos;s lots of references to her lore, and you can tell the developer put a lot of care into it, even if it is relatively simple gameplay wise.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;August&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Metal Gear Solid 2 (Master Collection)
&lt;ul&gt;
&lt;li&gt;This was my number one, favorite game of all time until I played Persona 5. I picked up the master collection on a whim because I had a Best Buy gift card and the game was on mega sale. I had a few moments one Sunday and decided to just boot up Metal Gear Solid 2 (my favorite). I immediately got absorbed into the game and the story and next thing ya know, it&apos;s 6pm and I&apos;ve forgotten to do all of my Sunday chores. It&apos;s such a good game, and it&apos;s always been my favorite in the series.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Battlefield 6 open beta
&lt;ul&gt;
&lt;li&gt;I was a huge fan of Battlefield 2, but I fell off of it by the time 3 came out. I picked up all of the ones since and played them a little bit, but they&apos;ve never hit the same way 2 did for me. I really enjoyed the beta of 6 quite a bit. I wasn&apos;t put off by the weird colors that came with 3 and 4 (a la the Xbox 360/PS3 era grey and brown games). It&apos;s not that things were colorful, but I didn&apos;t feel like I had the &quot;we&apos;re filming in mexico, so use the brown lens filter to make everything extra desert-y&quot; sort of thing. Gameplay certainly felt more arcade-y than I&apos;m used to (a la Call of Duty), but the squad based game play was still alive and well. I don&apos;t think I&apos;m going to get the high&apos;s of Battlefield 2 from this one, but damn, is it close.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Battlefield 2
&lt;ul&gt;
&lt;li&gt;I had to revisit this one after the Battlefield 6 beta. I really hope GOG can pull through and give us a good, updated and patched version of this game, because it was a hassle to get up and running with this one again. Luckily, PCGamingWiki pulls through, and with some terrific mod support, this game is a nostalgia pie that I completely devoured. I absolutely love this classic, and there will never be a battlefield game like it again.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Whisper Mountain Outbreak
&lt;ul&gt;
&lt;li&gt;This one was interesting. I think the normal difficulty is a bit too hard for my tastes and sensibilities. The difficulty curve from the first map to the second looked like a straight line. I really wish you could save your progress to be picked up later too, but overall, I think this game has some good bones. It&apos;s definitely got potential. It&apos;s fun and interesting. It really feels like a &quot;what if resident evil was a 2d isometric co-op experience?&quot; kind of game. Definitely worth picking up, even at full price. Play with friends, though, you&apos;ll need it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Metal Gear Solid Delta: Snake Eater
&lt;ul&gt;
&lt;li&gt;A really solid remaster of the original. I was initially a bit skeptical of the character redesigns (if you want to call them that), but they grew on me. You know I had to go through and get all of the collectibles in the game because I needed that stealth for messing with the guards in my second playthrough. I think this is a really great entry point for newcomers to the Metal Gear franchise. Here&apos;s to hoping we get a proper remake of Metal Gear Solid 1 next.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Battlefield 2042
&lt;ul&gt;
&lt;li&gt;It&apos;s okay. Nice co-op mode.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Unreal Tournament
&lt;ul&gt;
&lt;li&gt;Just as great as you and I remember.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;PEAK
&lt;ul&gt;
&lt;li&gt;Very silly, but very hard. After a few playthroughs with friends, we were able to react The Peak ™️, but it was through blood, sweat, and tears, for sure.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;September&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Food for the Soul
&lt;ul&gt;
&lt;li&gt;It&apos;s such a cute little slice of life show. Nothing really happens, but I think that&apos;s part of why I enjoyed it as much as I did. It&apos;s just simple. It&apos;s comforting.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Konosuba: God&apos;s blessing on this wonderful world!
&lt;ul&gt;
&lt;li&gt;I honestly didn&apos;t think I&apos;d like this as much as I did. On paper, it has a lot of things that should hold it back, but it&apos;s executed so precisely that everything just works. Generally speaking, if I&apos;m watching something by myself, I won&apos;t laugh out loud. I mean that in the literal sense where an actual laugh from the belly is expelled from my abdomen. However, this show had me absolutely roaring with laughter. My wife had to check on me a couple of times. This show kinda feels like if It&apos;s Always Sunny found its way into an isekai anime. You DO need a pretty good tolerance for anime bullshit for this one, but there&apos;s a lot here that&apos;s good if you can look past it. The prequel with Megumin is pretty good too, but I like this one a lot more.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Cheese Rolling
&lt;ul&gt;
&lt;li&gt;A silly little game with a simple premise: roll down the hill and catch the cheese wheel. It&apos;s worth a download, and, it&apos;s free.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;October&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Konosuba: An explosion on this wonderful world!
&lt;ul&gt;
&lt;li&gt;This is the prequel to Konosuba that tells the story of Megumin before she joined the party. It&apos;s pretty good, though I don&apos;t like it as much as Konosuba. Megumin is my favorite character, so this was definitely a welcome addition to the story.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Dungeon Defenders
&lt;ul&gt;
&lt;li&gt;Pretty solid tower defense game that came out a &lt;em&gt;long&lt;/em&gt; time ago. It&apos;s goofy, but it has its charm. I can&apos;t believe it&apos;s still being worked on and updated after 14 years.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Spy Family Season 3
&lt;ul&gt;
&lt;li&gt;Season 3 keeps the hype train rolling with some absolutely fantastic episodes. We finally get an equivalent arc for Twilight/Loid in the same sort of way we got one for Yor in the previous season. Twilight/Loid&apos;s backstory is an incredible watch as well. I love what they&apos;re doing with the character development, and I&apos;m excited to see where we go next season.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Castlevania Nocturne Season 2
&lt;ul&gt;
&lt;li&gt;I binged this one. I think it&apos;s better than season 1, but I never felt for it what I felt for the original, especially the initial Dracula arc. This is still solid, though, and I think it&apos;s worth watching the whole series. It was a great show to start off the spookiest of all the months.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;May I Ask for One Final Thing?
&lt;ul&gt;
&lt;li&gt;This was a very nice and short anime that did everything it needed to do in 13 episodes. It was a fun time for sure. If you&apos;re into stories with tough, strong female leads, give this one a shot. I enjoy watching Scarlet beat the 💩 out of everyone she runs into.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Hazbin Hotel
&lt;ul&gt;
&lt;li&gt;This one surprised me. I didn&apos;t think it&apos;d sink its teeth into me the way it did, but I thoroughly enjoyed this, and I&apos;m excited for season 2. I believe I&apos;ve discovered something about myself. I really &lt;em&gt;&lt;em&gt;really&lt;/em&gt;&lt;/em&gt; enjoy religious lore. The stories of gods are human stories. The only difference between the high and mighty and us are just the magical things about them. I loved the story bits with Lucifer and Charlie because I think that strained parental relationship is so ubiquitous. The show being part musical was a pleasant surprise as well. I didn&apos;t know it was going to be like that going in. Season 2 came out while I was overseas, but I managed to watch every available episode. Season 2 has some pacing issues, but overall, we got a lot of good character development and music out of the deal.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Konosuba audiobook/light novels (vol 7-10)
&lt;ul&gt;
&lt;li&gt;I have been obsessed with Konosuba since I started it. I didn&apos;t expect this story with its characters to have such a grip on me, but they have. The growth of this group of bumbling imbeciles is so charming and funny. I had to reach out for the light novels once I got done with the anime. Next stop will be the manga. I love this series so much!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;November&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Japan
&lt;ul&gt;
&lt;li&gt;Outside of watching a bit of Hazbin Hotel, this month was dedicated to my first trip to Japan. This trip took an incredible amount of planning. It&apos;s true what they say, though. Once you go there, you don&apos;t want to come back. I legitimately was in a panic at the airport before I was supposed to return to the US. I don&apos;t think I&apos;ve ever had so much fun in my life. I loved every minute, and I&apos;m actually planning on going back again next year. I might make a separate post on the trip at some point, because I found a lot of stuff that no one really tells you about, but I&apos;ll save that for January. For now, I&apos;m going to finish up this post and enjoy the new year for a moment.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;December&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Konosuba audiobook/light novel (vol 11)
&lt;ul&gt;
&lt;li&gt;Of course, as soon as this released, I had to pick it up. The Komeko story arc was such a delight from start to finish. I love this wacky crew, and I&apos;m excited to read/listen to the next volume when it releases next year.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Guntouchables
&lt;ul&gt;
&lt;li&gt;Super hilarious and fun co-op game. The graphics and characters make this a joy to play.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Marvel Cosmic Invasion
&lt;ul&gt;
&lt;li&gt;A couple of years ago, we had the privledge of playing Teenage Mutant Ninja Turtles: Shredder&apos;s Revenge. This year, the same folks brought us possibly the best marvel game of the past several years -- at least, multiplayer-wise. I like this one a bit less than shredder&apos;s revenge and streets of rage 4, but it&apos;s a great beat-em-up with great music and voice acting. This one is solid and worth picking up, especially if you&apos;re a fan of the beat-em-up genre like me.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;RV there yet?
&lt;ul&gt;
&lt;li&gt;This kind of game sits beside things like PEAK, R.E.P.O, and the rest. I heard a term the other day: &quot;friendslop&quot;. There&apos;s a couple ways to interpret this. As someone that has dabbled in game dev, I strongly hesitate to use the word &quot;slop&quot; in most cases. I don&apos;t think this is &quot;slop&quot; in the way we think of &quot;AI slop&quot; or the stuff 14th century serfs would feed pigs. The other way to interpret this is &quot;simple game with simple mechanics built for the sole purpose of socializing with a group of friends&quot;. In that case, I&apos;m 100% on board. This game and its ilk don&apos;t demand a lot from you, so the emergent gameplay -- usually consisting of one straight man vs. 3 comedians -- is often organically funny. The game introduces a signature jank that you have to either work around, or use to your advantage to attack your straight man in order to get a laugh from your fellow comedians. For example, in this game, you have cables that can pull your RV out of a ditch if need be. You can use these cables to create enough tension so that the vehicle is slingshot forward at 1000 mph with your friends inside flying off into the distance. That&apos;s the kind of slop I enjoy.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Deadzone Rogue
&lt;ul&gt;
&lt;li&gt;There are a ton of games like this out there. I think this is one of the good ones. It&apos;s a basic FPS roguelike/lite (I can never remember the difference) meant to be played with a couple of friends. I don&apos;t think this matches the &quot;friendslop&quot; category because it&apos;s not at all janky. It&apos;s a nice and polished experience that hits that little &quot;numbers go up&quot; dopamine receptor.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Rock Band
&lt;ul&gt;
&lt;li&gt;I couldn&apos;t tell you exactly why, but I got the biggest itch to revisit this game this year. I think I just happened to hear a couple of the songs while listening to some stuff on shuffle, and a wave of 2008 nostalgia hit me. I know I didn&apos;t have any of the plastic guitars or drums anymore, but I did happen to find my original USB microphone for the PS2 version of the game. I plugged it in and had my own little karaoke session with my dog over Christmas break. I found out that the company CRKD makes replica guitars, so I decided to pick one up on a whim since I had an amazon gift card. I&apos;ve since played through most of the songs, but man, I suck now. Though, I suppose I did mostly play the drums back then. Luckily, CRKD is going to release some replica drums in 2026, so you bet your butt I&apos;m going to be getting one of those.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;This year, I decided to include some books/audiobooks I read/listened to. I enjoy audiobooks since I can consume them like I do music or a podcast. Just pop in the ol&apos; earbuds and listen while doing dishes and other chores.&lt;/p&gt;
&lt;p&gt;I learned a big lesson this year: &lt;em&gt;take a damn vacation&lt;/em&gt;. I went to Japan in November, and while I was there, it hit me.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;I haven&apos;t taken a vacation in 10 years&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It&apos;s probably why I&apos;m always exhausted. Whenever I take time off of work, I usually spend it at my house, doing everything I would normally do if I wasn&apos;t on vacation (chores, walking the dog, cooking, etc.) While I get a bit of a break from work, I still have the rest of my life to worry about, all the while thinking about all of the work I&apos;m going to have to do once back to work. Going to Japan this year broke me of that routine. I spent my entire time thinking about having fun. At home, I&apos;d be cleaning some bathrooms, cooking, doom-scrolling, or working. In Japan, my phone was only used for the map applications. In Japan, I was thinking about what kind of foods I want to try for the first time. In Japan, I was present. In some ways, I miss who I was while I was there. My anxieties of every day life melted away. I wasn&apos;t anxious at all. I was excited to learn how to ride the subway and how to get a shinkansen (bullet train) ticket. I&apos;m not at all fluent in Japanese, but I knew enough to ask for directions, order food, and whatnot. It was fun and rewarding knowing that all of that time I&apos;ve spent since 2020 studying wasn&apos;t wasted. I have a &lt;em&gt;loooooong&lt;/em&gt; way to go, as I can&apos;t hold a conversation or anything, but just getting to use a bit of すみません and ありがとうございます was exhilarating! I&apos;ll keep working, bit by bit, in 2026. Hopefully, in another 5 years or so, I can hold a bit of a conversation fully in Japanese.&lt;/p&gt;
&lt;p&gt;As far as personal projects go, most of my time has been spent on the egg tracker project and this site. I have another thing in the works that&apos;s making me re-visit and re-learn C++ and Qt. I&apos;m hoping to have that done in a few months (progress on anything for me is slow -- time is the most valuable commodity). I&apos;ll share that here whenever I&apos;m able. Personal projects have to fight Japanese learning, calls with my mom, meal prep, among other things for time. I am &lt;em&gt;trying&lt;/em&gt; to be a bit gentler with myself on this. I&apos;m not 15 anymore. I have a full time job, a mortgage, and a family I gotta worry about, and taking care of my family and friends is orders of magnitude more important to me than anything else.&lt;/p&gt;
&lt;p&gt;Until next time, dear reader, I hope you have a terrific new year, and I hope 2026 is kind to you. Take care 👋&lt;/p&gt;
&lt;p&gt;- CJ&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Bonus pics from Japan!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Sensoji Temple - Asakusa
&lt;img src=&quot;../../assets/2025-wrapped/sensoji.jpg&quot; alt=&quot;Sensoji Temple - Asakusa&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Mt. Fuji
&lt;img src=&quot;../../assets/2025-wrapped/mtfuji.jpg&quot; alt=&quot;Mt. Fuji&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Kiyomizu-dera Temple - Kyoto
&lt;img src=&quot;../../assets/2025-wrapped/kiyomizu-dera.jpg&quot; alt=&quot;Kiyomizu-dera Temple - Kyoto&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Kanazawa Station
&lt;img src=&quot;../../assets/2025-wrapped/kanazawa-station.jpg&quot; alt=&quot;Kanazawa Station&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Higashi Chaya District - Kanazawa
&lt;img src=&quot;../../assets/2025-wrapped/higashi-chaya.jpg&quot; alt=&quot;Higashi Chaya District - Kanazawa&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Ippudo Ramen - Tokyo
&lt;img src=&quot;../../assets/2025-wrapped/ramen.jpg&quot; alt=&quot;Ippudo Ramen - Tokyo&quot; /&gt;&lt;/p&gt;
</content:encoded><category>video games</category><category>anime</category><category>books</category><category>life</category><category>japan</category><author>CJ Coffey</author></item><item><title>Making a Raspberry Pi Server</title><link>https://cjcoffey.com/posts/making-a-raspberry-pi-server/</link><guid isPermaLink="true">https://cjcoffey.com/posts/making-a-raspberry-pi-server/</guid><pubDate>Wed, 24 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;TLDR&lt;/h2&gt;
&lt;p&gt;I got a Raspberry Pi running some neat things on my local network.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;The Problem&lt;/h2&gt;
&lt;p&gt;I&apos;ve been working on and off on this &lt;a href=&quot;https://github.com/dually8/tamadachi-egg-tracker&quot;&gt;egg price tracker&lt;/a&gt; project for a few months. I have a cron job on my windows machine that will check prices for my local area and add those price checks to a local SQLite database. When I want to see the price trends or the current prices, I need to open a terminal, navigate to my app, and run it. When I am done looking at things, I shut it down. I do many other things on this machine, and I can&apos;t have this thing running in the background constantly. I don&apos;t want to push it onto a VPS or some other cloud hosted solution either, because I need another subscription like I need another hole in my head. I want to be able to check prices whenever I want, but I don&apos;t want to spend any (more) money, nor do I want it to constantly run on my personal PC. What should I do?&lt;/p&gt;
&lt;h2&gt;The Solution&lt;/h2&gt;
&lt;p&gt;Oh, I know, I have a Raspberry Pi that recently got dethroned as my emulation station once my &lt;a href=&quot;https://retroremake.co/pages/store&quot;&gt;MiSTer&lt;/a&gt; and &lt;a href=&quot;https://store.steampowered.com/steamdeck&quot;&gt;Steam Deck&lt;/a&gt; took those responsibilities over. It&apos;s just been collecting dust at this point, so why not put it to use? I&apos;ll set this up in the basement with my other networking things so that it doesn&apos;t take up space in my office, and I&apos;ll put everything I need on it in order to get some web projects up and running. What shall we do first?&lt;/p&gt;
&lt;h2&gt;What you will need&lt;/h2&gt;
&lt;p&gt;Consider this your ingredient list in order to make something like this.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A Raspberry Pi (version 4 or 5 -- I&apos;m using v4 with 8GB of RAM)&lt;/li&gt;
&lt;li&gt;A router with configurable DNS settings (I&apos;m using a Ubiquiti Dream Machine Pro)
&lt;ul&gt;
&lt;li&gt;There are other ways around this step, but I won&apos;t be going into it here.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;A little bit of docker knowledge&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Architecture&lt;/h3&gt;
&lt;p&gt;I&apos;ve had a rocky relationship with Docker. It&apos;s not been the easiest thing to grasp, and I still don&apos;t find it very intuitive. Luckily, we have ChatGPT and Claude now, so getting examples and explanations for things is &lt;em&gt;way&lt;/em&gt; easier. Let&apos;s see, how do I want this to look? How about this? We&apos;ll use docker compose to build out an nginx server that will act as a reverse proxy to ship us the content we want based on the URL we request. Here&apos;s a flow chart of what this would look like.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/making-a-raspberry-pi-server/structure.svg&quot; alt=&quot;structure&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Then, I can go into my router&apos;s settings and setup a local DNS entry to point a URL to the Raspberry Pi. Shoutout to Ubiquiti for making this so easy.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/making-a-raspberry-pi-server/pi-dns.png&quot; alt=&quot;local dns&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Essentially, I want to do something like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Type in my browser &lt;code&gt;http://mypi.local/my-app&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Have my local network DNS handle where this goes (i.e., go to the Pi in this situation)&lt;/li&gt;
&lt;li&gt;Have the Pi see the incoming request and route me to the proper place
&lt;ul&gt;
&lt;li&gt;In this case, I want to see my egg tracker app&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I want to use a specific &lt;code&gt;/path&lt;/code&gt; here because I want to be able to host more than one application on the Pi. I should be able to manage that via nginx.&lt;/p&gt;
&lt;h3&gt;The Setup&lt;/h3&gt;
&lt;p&gt;In order to get this working, I first needed to get docker running on the Pi. I just followed a &lt;a href=&quot;https://raspberrytips.com/docker-on-raspberry-pi/&quot;&gt;tutorial online&lt;/a&gt; to get that going. Next, I needed to get a &lt;code&gt;docker-compose.yml&lt;/code&gt; file going that would orchestrate the whole thing so that I only needed to run one or two commands instead of several. Below is what I ended up with.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.
├── docker-compose.yml
├── nginx
│   ├── default.conf
│   └── Dockerfile
└── tamadachi-egg-tracker
    ├── Dockerfile
    ├── local.db
    ├── etc...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I had a parent folder that would contain the docker compose file, and two directories that would be my &quot;apps&quot; for said compose file. One of these would be nginx. Nginx would manage the incoming connections and handle routing the user to the proper app. Next would be my egg tracker app. Here&apos;s what this looks like all together:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# docker-compose.yml
services:
  eggtracker:
    container_name: tamadachi-egg-tracker
    build:
      context: ./tamadachi-egg-tracker
      args:
        NODE_ENV: production
        NEXT_PUBLIC_BASE_PATH: /tamadachi-egg-tracker
        DB_FILE_NAME: /app/local.db
    environment:
      NODE_ENV: production
      DB_FILE_NAME: /app/local.db
    restart: unless-stopped
    ports:
      - 3000:3000
    volumes:
      # This will link the outside sqlite database with the internal one
      # so that any changes we make outside will be seen inside the container
      # Replace /path/to/... with the actual and full path to the db file
      - /path/to/tamadachi-egg-tracker/local.db:/app/local.db:rw

  nginx:
    image: nginx:alpine
    ports:
      - &quot;80:80&quot;
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
    depends_on:
      - eggtracker
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# default.conf for nginx
upstream tamadachi-egg-tracker {
	server tamadachi-egg-tracker:3000;
}

server {
	listen 80;
  # Adjust the value here (rpi.home) to match your own local DNS entry
	server_name rpi.home;

	location /tamadachi-egg-tracker/ {
		proxy_pass http://tamadachi-egg-tracker;
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header X-Forwarded-Proto $scheme;
		proxy_set_header X-Forwarded-Prefix /tamadachi-egg-tracker;
	}

	# Optional: Root redirect
	location = / {
		return 301 /tamadachi-egg-tracker/;
	}
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Next thing to do is to just run &lt;code&gt;docker compose up -d --build&lt;/code&gt; and we&apos;re up and running.&lt;/p&gt;
&lt;p&gt;And, &lt;em&gt;voila!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/making-a-raspberry-pi-server/rpi-home.png&quot; alt=&quot;result on my local network&quot; /&gt;&lt;/p&gt;
&lt;p&gt;There we have my Next.js egg tracker app running on my Raspberry Pi at home. No VPS. No subscription. Just a few tears and minor desk banging to get it working.&lt;/p&gt;
&lt;h2&gt;Conclusion and follow up&lt;/h2&gt;
&lt;p&gt;I&apos;ve had this running for a little while now, and it&apos;s been working well. Looking up the latest egg prices is much easier now that I can look at the site on my phone or iPad now. It&apos;s also made sharing results with my wife much easier since she has access to the site as well. I&apos;ve since added &lt;a href=&quot;https://www.freshrss.org/&quot;&gt;FreshRSS&lt;/a&gt; on top of it, so now I can go to &lt;code&gt;http://rpi.home/freshrss&lt;/code&gt; to get the latest from my favorite RSS-enabled sites (including &lt;a href=&quot;https://cjcoffey.com/rss.xml&quot;&gt;this one&lt;/a&gt; 😄). Side note on that, I&apos;ve really enjoyed the stripped back experience of using an RSS reader. No ads, no filler, just the content. It&apos;s been a nice change of pace from doom-scrolling.&lt;/p&gt;
&lt;p&gt;You may be wondering how the Raspberry Pi is getting price updates since the price checker is still running on my own machine. I actually have a cron job that runs right after the price checks that pushes the database updates to the Pi. While I could technically just run the price checks on the Pi, there are a couple of things stopping me right now.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I use Edge for price checks because Playwright&apos;s downloaded browser binaries are more sandboxed from the OS. While this isolation is generally a good security feature, I need consistent location services and user agent behavior for my price scraping to work reliably.&lt;/li&gt;
&lt;li&gt;This ties in with 1, but I haven&apos;t gotten the price checks to consistently work on the Pi. There are several reasons for this, one being that playwright just hasn&apos;t played nicely with the Pi for the time being.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So, we&apos;re still using my own machine for price checks at the moment. This is fine by me because I have another cron job that checks interest rates and sends me updates via Discord. Side note, I&apos;m doing this because I got mega screwed over by interest rates when buying my house in 2023, so I&apos;m looking to refinance as soon as interest rates are a bit more reasonable. Hopefully I&apos;ll get lucky and get one of those 2% rates we got in 2020-2021 🤞 (&lt;em&gt;HIGHLY UNLIKELY&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;If I stumble upon anything else fun to do with this setup, I&apos;ll update this post, but until next time, thanks for reading. I hope you enjoyed, and if you pursue something like this, let me know if you found this post helpful. My goal in writing this was to hopefully help someone else in a similar situation, because I wasn&apos;t finding much online regarding this specific setup. If you have any questions, feel free to write me in the comments below, or shoot me a message on &lt;a href=&quot;https://bsky.app/profile/cjcoffey.com&quot;&gt;BlueSky&lt;/a&gt;. Take care ✌&lt;/p&gt;
</content:encoded><category>raspberry pi</category><category>docker</category><category>nginx</category><category>nextjs</category><author>CJ Coffey</author></item><item><title>My Astro Experience</title><link>https://cjcoffey.com/posts/my-astro-experience/</link><guid isPermaLink="true">https://cjcoffey.com/posts/my-astro-experience/</guid><pubDate>Fri, 28 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I first mentioned this on &lt;a href=&quot;https://bsky.app/profile/cjcoffey.com/post/3ldmcf3e5xs2o&quot;&gt;BlueSky&lt;/a&gt; back in December of 2024. I&apos;ve been meaning to write a post about this experience for a while, but finding the time to write has been difficult. They don’t tell you this as a kid, but as you get older, your free time starts feeling like an &lt;a href=&quot;https://en.wikipedia.org/wiki/Asymptote&quot;&gt;asymptote&lt;/a&gt;—it’s always there, just never quite enough to do all that you want. Anyway, here&apos;s my experience using Astro to make this new blog site. TLDR and Table of Contents are available for your convenience.&lt;/p&gt;
&lt;h2&gt;TLDR&lt;/h2&gt;
&lt;p&gt;After getting over some odd hurdles, I really like the experience of using Astro. It &lt;em&gt;really&lt;/em&gt; helps to start thinking more in plain ol&apos; HTML, CSS, and JS terms than the &quot;yet another JavaScript framework&quot; terms. It&apos;s not like React, Vue, Svelte, Angular, or any of the others. It&apos;s more so something like &lt;a href=&quot;https://jekyllrb.com/&quot;&gt;Jekyll&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Contents&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#tldr&quot;&gt;TLDR&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#contents&quot;&gt;Contents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#why-a-new-site&quot;&gt;Why a new site?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#what-was-the-experience-like&quot;&gt;What was the experience like?&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#the-good&quot;&gt;The Good&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#the-bad&quot;&gt;The Bad&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#the-ugly&quot;&gt;The Ugly&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#conclusion&quot;&gt;Conclusion&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#previous-site-iterations&quot;&gt;Previous Site Iterations&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#other-updates&quot;&gt;Other updates&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Why a new site?&lt;/h2&gt;
&lt;p&gt;Magic tricks are universally fun—who wouldn’t applaud a bunny pulled out of a hat? I think most of us like magic tricks. Having said that, I&apos;m reminded of one of my favorite professors in college who used to tell us, &quot;we don&apos;t use magic in programming&quot;, meaning, we don&apos;t like &lt;a href=&quot;https://www.codecademy.com/article/black-box-programming&quot;&gt;black box implementations&lt;/a&gt;. I had two previous iterations of this site, and both felt a bit too much like magic. I realized it was partially due to my lack of experience with the tools, but making tweaks felt a bit cumbersome, so most of the design was left at the default template. I wanted a site that was &lt;a href=&quot;https://www.youtube.com/watch?v=ZSDWhevW-N0&quot;&gt;made with love, not magic&lt;/a&gt;. I had heard about &lt;a href=&quot;https://astro.build/&quot;&gt;Astro&lt;/a&gt; before, and I heard many good things about it. During the planning phase, I struggled picking among a few options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://astro.build/&quot;&gt;Astro&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/&quot;&gt;Next.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nuxt.com/&quot;&gt;Nuxt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://svelte.dev/docs/kit/introduction&quot;&gt;SvelteKit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As a seasoned React developer, Next.js, at least on the surface, felt like it would be the obvious choice. It has great templating, support for MDX, and more. However, I didn&apos;t want to burden my site with any extra JavaScript if I didn&apos;t have to. I think VueJS and Nuxt are neat, but I didn&apos;t have any experience with either, so it didn&apos;t make sense to use that if I wanted to hit the ground running. Plus, I don&apos;t believe it supports MDX, at least, at the time of the transition it didn&apos;t. That just left Astro and SvelteKit at that point. I&apos;d made a site with SvelteKit before, and I mostly enjoyed it, but as I was researching Astro, it sounded like it&apos;d fit my use case a lot better. Heck, they even have a &lt;a href=&quot;https://vercel.com/templates/astro/astro-blog&quot;&gt;blog starter template&lt;/a&gt;. So, that&apos;s where I started.&lt;/p&gt;
&lt;h2&gt;What was the experience like?&lt;/h2&gt;
&lt;p&gt;Let&apos;s talk about the experience of using Astro. If you spend any time in the dev area on BlueSky or the bad site, you&apos;ll hear people absolutely raving about Astro. It&apos;s the greatest thing since sliced bread. I don&apos;t think I&apos;ve seen one post talk negatively about Astro (though there are plenty on Next.js). If you&apos;re inundated with that kind of positive press, you might start to think that Astro will fix everything in your life. So, I set off to try and build this thing with Astro, though, I quickly realized nothing is ever so easy, even Astro.&lt;/p&gt;
&lt;h3&gt;The Good&lt;/h3&gt;
&lt;p&gt;Let&apos;s start with the good stuff. Astro clearly receives a lot of admiration, and I believe much of it is warranted. It&apos;s not &quot;yet another JavaScript framework&quot;, at least, I don&apos;t see it that way. It has &lt;em&gt;a lot&lt;/em&gt; of cool plugins and whatnot to help you build your site your way. I love that. There&apos;s two schools of thought when it comes to development: convention over configuration, and fine-grained control. Like most things, I think the best is somewhere in the middle, and that&apos;s where Astro fits in as well. As far as conventions go, Astro follows file-based routing and has an opinionated folder layout. For configuration, Astro has dozens of plugins and other integrations. It&apos;s a hodge podge of &quot;bring your own &lt;code&gt;&amp;lt;whatever&amp;gt;&lt;/code&gt;&quot;. You can build components using your favorite UI framework like React, Solid, Vue, Svelte, and more. It has integrations for things like Tailwind, MDX, Partytown, and others. I love this approach because you&apos;re not tied to any one way of doing things. I like rules, but I don&apos;t like constraints (if that makes sense). Astro does a really good job of balancing that sort of thing. It has really nice, easy-to-use CLI. It&apos;s certainly a pleasure to work with...for the most part.&lt;/p&gt;
&lt;h3&gt;The Bad&lt;/h3&gt;
&lt;p&gt;Okay, so, this part is certainly just my bad, but I want to mention it for anyone else like me that may occasionally have scrambled eggs for brains. &lt;em&gt;So&lt;/em&gt;, one of the first things that tripped me up was coming to terms with the fact that this is &lt;em&gt;not another JavaScript framework&lt;/em&gt;. What do I mean by that? So, you know when you&apos;re coding an Angular, React, or Svelte app and you can kind of mix-and-match some JavaScript with some HTML? You can&apos;t do that here. Let me provide an example. In the &lt;a href=&quot;https://github.com/dually8/cj-coffey/blob/14d8d3c3cf01532a6e9f76ba76007dc050779f0d/src/pages/posts/index.astro&quot;&gt;index page for the list of blog posts&lt;/a&gt;, I basically wanted to show a list of posts and let the user filter them out by the post&apos;s title and/or its tags. How would we do that in React or Svelte? Fairly simple:&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;Click to expand example for React&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import React, { useState, useMemo } from &apos;react&apos;;

// Define the blog post type
interface BlogPost {
  id: number;
  title: string;
  excerpt: string;
  tags: string[];
  link: string;
}

// Sample blog posts data
const initialPosts: BlogPost[] = [
  {
    id: 1,
    title: &quot;Introduction to React Hooks&quot;,
    excerpt: &quot;Learn how to use React Hooks to simplify your components.&quot;,
    tags: [&quot;react&quot;, &quot;javascript&quot;, &quot;hooks&quot;],
    link: &quot;/posts/react-hooks&quot;
  },
  {
    id: 2,
    title: &quot;State Management in Modern Web Apps&quot;,
    excerpt: &quot;Exploring different state management techniques.&quot;,
    tags: [&quot;react&quot;, &quot;state&quot;, &quot;javascript&quot;],
    link: &quot;/posts/state-management&quot;
  },
  {
    id: 3,
    title: &quot;Building Responsive Designs&quot;,
    excerpt: &quot;Create flexible layouts that work on any device.&quot;,
    tags: [&quot;css&quot;, &quot;design&quot;, &quot;responsive&quot;],
    link: &quot;/posts/responsive-design&quot;
  }
];

const BlogPostList: React.FC = () =&amp;gt; {
  const [searchTerm, setSearchTerm] = useState(&apos;&apos;);

  // Memoized filtered posts based on search term
  const filteredPosts = useMemo(() =&amp;gt; {
    if (!searchTerm) return initialPosts;

    const lowerSearchTerm = searchTerm.toLowerCase();
    return initialPosts.filter(post =&amp;gt;
      post.title.toLowerCase().includes(lowerSearchTerm) ||
      post.tags.some(tag =&amp;gt; tag.toLowerCase().includes(lowerSearchTerm))
    );
  }, [searchTerm]);

  return (
    &amp;lt;div className=&quot;max-w-2xl mx-auto p-4&quot;&amp;gt;
      &amp;lt;input
        type=&quot;text&quot;
        placeholder=&quot;Search posts by title or tags...&quot;
        value={searchTerm}
        onChange={(e) =&amp;gt; setSearchTerm(e.target.value)}
        className=&quot;w-full p-2 mb-4 border rounded&quot;
      /&amp;gt;

      &amp;lt;div className=&quot;space-y-4&quot;&amp;gt;
        {filteredPosts.map(post =&amp;gt; (
          &amp;lt;a
            key={post.id}
            href={post.link}
            className=&quot;block hover:bg-gray-100 p-4 rounded&quot;
          &amp;gt;
            &amp;lt;article&amp;gt;
              &amp;lt;h2 className=&quot;text-xl font-bold mb-2&quot;&amp;gt;{post.title}&amp;lt;/h2&amp;gt;
              &amp;lt;p className=&quot;text-gray-600 mb-2&quot;&amp;gt;{post.excerpt}&amp;lt;/p&amp;gt;
              &amp;lt;div className=&quot;flex gap-2&quot;&amp;gt;
                {post.tags.map(tag =&amp;gt; (
                  &amp;lt;span
                    key={tag}
                    className=&quot;bg-blue-100 text-blue-800 px-2 py-1 rounded text-sm&quot;
                  &amp;gt;
                    {tag}
                  &amp;lt;/span&amp;gt;
                ))}
              &amp;lt;/div&amp;gt;
            &amp;lt;/article&amp;gt;
          &amp;lt;/a&amp;gt;
        ))}
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};

export default BlogPostList;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;
&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;Click to expand example for Svelte&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;script lang=&quot;ts&quot;&amp;gt;
// Define the blog post type
type BlogPost = {
  id: number;
  title: string;
  excerpt: string;
  tags: string[];
  link: string;
};

// Sample blog posts data
let posts: BlogPost[] = [{
    id: 1,
    title: &quot;Introduction to Svelte 5 Runes&quot;,
    excerpt: &quot;Exploring the new reactive primitives in Svelte 5.&quot;,
    tags: [&quot;svelte&quot;, &quot;javascript&quot;, &quot;runes&quot;],
    link: &quot;/posts/svelte-runes&quot;
  },
  {
    id: 2,
    title: &quot;State Management with Runes&quot;,
    excerpt: &quot;Deep dive into reactive state management in Svelte 5.&quot;,
    tags: [&quot;svelte&quot;, &quot;state&quot;, &quot;runes&quot;],
    link: &quot;/posts/state-management-runes&quot;
  },
  {
    id: 3,
    title: &quot;Performance Optimization in Svelte 5&quot;,
    excerpt: &quot;Leveraging runes for more efficient reactivity.&quot;,
    tags: [&quot;performance&quot;, &quot;svelte&quot;, &quot;runes&quot;],
    link: &quot;/posts/svelte-performance&quot;
  }
];

// Reactive search term
let searchTerm = $state(&apos;&apos;);

// Derived state for filtered posts
const filteredPosts = $derived(
  posts.filter(post =&amp;gt;
    post.title.toLowerCase().includes(searchTerm.toLowerCase()) ||
    post.tags.some(tag =&amp;gt; tag.toLowerCase().includes(searchTerm.toLowerCase()))
  ));
&amp;lt;/script&amp;gt;

&amp;lt;!-- now with tailwind! --&amp;gt;
&amp;lt;div class=&quot;max-w-2xl mx-auto p-4&quot;&amp;gt;
    &amp;lt;input
        type=&quot;text&quot;
        placeholder=&quot;Search posts by title or tags...&quot;
        bind:value={searchTerm}
        class=&quot;w-full p-2 mb-4 border rounded&quot;
        /&amp;gt;

    &amp;lt;div class=&quot;space-y-4&quot;&amp;gt;
        {#each filteredPosts as post (post.id)}
        &amp;lt;a
            href={post.link}
            class=&quot;block hover:bg-gray-100 p-4 rounded&quot;
            &amp;gt;
            &amp;lt;article&amp;gt;
                &amp;lt;h2 class=&quot;text-xl font-bold mb-2&quot;&amp;gt;{post.title}&amp;lt;/h2&amp;gt;
                &amp;lt;p class=&quot;text-gray-600 mb-2&quot;&amp;gt;{post.excerpt}&amp;lt;/p&amp;gt;
                &amp;lt;div class=&quot;flex gap-2&quot;&amp;gt;
                    {#each post.tags as tag}
                    &amp;lt;span
                        class=&quot;bg-blue-100 text-blue-800 px-2 py-1 rounded text-sm&quot;
                        &amp;gt;
                        {tag}
                    &amp;lt;/span&amp;gt;
                    {/each}
                &amp;lt;/div&amp;gt;
            &amp;lt;/article&amp;gt;
        &amp;lt;/a&amp;gt;
        {/each}
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;p&gt;See how we can just chuck in those filters straight in there? Can&apos;t do that with Astro. Absolutely &lt;em&gt;illegal&lt;/em&gt;. Instead, you have to treat it more like plain ol&apos; HTML and JavaScript. Astro will let you use JSX-like templating, but you &lt;em&gt;cannot&lt;/em&gt; embed any JS in there whatsoever. If you need JS, you have to create a separate &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag and work it like you would a &lt;a href=&quot;http://vanilla-js.com/&quot;&gt;VanillaJS&lt;/a&gt; site. When I was first working through this, I was getting so mad and confused. &lt;em&gt;Why is this not working?!&lt;/em&gt; Astro isn’t like other frameworks, and honestly, it’s hard to compare. This bad boy feels more like &lt;a href=&quot;https://jekyllrb.com/&quot;&gt;Jekyll&lt;/a&gt; rather than its other JS counterparts.&lt;/p&gt;
&lt;p&gt;Again, definitely a skill and &lt;a href=&quot;https://en.wikipedia.org/wiki/RTFM&quot;&gt;RTFM&lt;/a&gt; issue on my part, but &lt;em&gt;why does no one talk about this???&lt;/em&gt;.&lt;/p&gt;
&lt;h3&gt;The Ugly&lt;/h3&gt;
&lt;p&gt;I&apos;ll start with one issue that&apos;s &lt;a href=&quot;https://github.com/withastro/astro/issues/12513&quot;&gt;recently been fixed&lt;/a&gt;. During the whole skill issue debacle, I was like &quot;F this, I&apos;m doing it in Svelte&quot;. So, I go to make this component that&apos;ll just be used for the post search piece, and, of course, it fails. You&apos;re supposed to be able to give Astro a &lt;a href=&quot;https://docs.astro.build/en/reference/directives-reference/#display-loading-content&quot;&gt;fallback component&lt;/a&gt; for when it&apos;s loading in a client component, but this component was never removed. I haven&apos;t tested the fix yet, but supposedly this has now been fixed. I just opted to use plain JS for it instead. Probably for the best.&lt;/p&gt;
&lt;p&gt;Another issue I&apos;m still running into is the &quot;Collection is empty&quot;. It might be fixed in a newer version of Astro, but I&apos;m currently running version 5.1.1, and I am forced to blow away the &lt;code&gt;.astro&lt;/code&gt; folder &lt;em&gt;every single time&lt;/em&gt; I start up the dev server. What a mess.&lt;/p&gt;
&lt;p&gt;Similarly, I run into this issue where the &lt;code&gt;BlogPost&lt;/code&gt; component can&apos;t read or destructure the &lt;code&gt;title&lt;/code&gt; property from &lt;code&gt;Astro.props.data&lt;/code&gt;? Again, I have to blow away my project and re-build it when this happens. At least, this one doesn&apos;t happen every time, but it&apos;s an annoying bug for sure.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Overall, I’ve enjoyed using Astro. Would I pick it again? Perhaps, but it would depend on the project. I&apos;m a firm believer of using the right tool for the job. Astro has allowed me to create a site I&apos;m much more proud of because I feel much closer to the code. There&apos;s a lot less magic happening, and while it may not match the speed of &lt;a href=&quot;https://gohugo.io/&quot;&gt;Hugo&lt;/a&gt;, its developer experience feels far more refined. This is now the third iteration of this site, and I think it&apos;s the best it&apos;s ever been. As an added bonus, I&apos;ll throw you a couple of images of and links to the previous iterations to show you where we&apos;ve been vs. where we are now.&lt;/p&gt;
&lt;p&gt;Thanks for taking the time to read this. If you&apos;ve used Astro before, I invite you to share your experience either in the comments below or on &lt;a href=&quot;https://bsky.app/profile/cjcoffey.com&quot;&gt;BlueSky&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I hope whoever you are, wherever you are, you&apos;re doing well. Stay safe out there, and I hope to see you again next time.&lt;/p&gt;
&lt;h3&gt;Previous Site Iterations&lt;/h3&gt;
&lt;p&gt;Here&apos;s my first site. I used &lt;a href=&quot;https://hexo.io/&quot;&gt;Hexo&lt;/a&gt; for it &lt;em&gt;and&lt;/em&gt; &lt;a href=&quot;https://web.archive.org/web/20180825224332/https://twocoffeys.com/&quot;&gt;my wedding site&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Archived link: https://web.archive.org/web/20171003200130/https://cjcoffey.com/&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://web.archive.org/web/20171003200130/https://cjcoffey.com/&quot;&gt;&lt;img src=&quot;/img/my-astro-experience/super-fun-blog-time-circa-2017.jpg&quot; alt=&quot;Image of the first iteration of my site&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is the second iteration of the site. I used Hugo to build it.&lt;/p&gt;
&lt;p&gt;Archived link: https://web.archive.org/web/20240603085251/https://cjcoffey.com/&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://web.archive.org/web/20240603085251/https://cjcoffey.com/&quot;&gt;&lt;img src=&quot;/img/my-astro-experience/my-site-circa-2024.jpg&quot; alt=&quot;Image of the second iteration of my site&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Other updates&lt;/h2&gt;
&lt;p&gt;I recently started a new project, the &lt;a href=&quot;https://github.com/dually8/tamadachi-egg-tracker&quot;&gt;Tamadachi Egg Price Tracker&lt;/a&gt;. This project was born out of the current &lt;a href=&quot;https://www.usatoday.com/story/graphics/2025/02/04/egg-price-increase-history/78063370007/&quot;&gt;eggflation&lt;/a&gt; going on. My wife does most of the grocery shopping, and she often goes to a few different stores to get everything we need. The problem she would run into is that some stores would sell eggs cheaper than the others, but it wasn&apos;t until she&apos;d already purchased eggs from one of the more expensive stores that she&apos;d run into some that were less expensive. My goal here was to run a cron job on my desktop to check egg prices every few days and put that information in a site I can host locally at home. That way, we could check to see who sells them the cheapest before making the mistake of buying the more expensive eggs while out shopping. I also wanted to be able to track prices over time so we can try and see trends. So far, this project is roughly a week old, so I don&apos;t have much data to compare against, but I have seen a couple of price drops in that time, so that&apos;s been neat to see. The site still needs a lot of work done on the UI front because I want to make something that appeals to my wife&apos;s aesthetic. Functionally speaking, it&apos;s more or less where I want it to be.&lt;/p&gt;
&lt;p&gt;Here&apos;s a screenshot of what it looks like at the time of writing.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/my-astro-experience/egg-price-tracker.png&quot; alt=&quot;Image of application showing egg prices and charts&quot; /&gt;&lt;/p&gt;
</content:encoded><category>Astro</category><category>Hugo</category><category>Hexo</category><category>Web Dev</category><author>CJ Coffey</author></item><item><title>2024 Wrapped</title><link>https://cjcoffey.com/posts/2024-wrapped/</link><guid isPermaLink="true">https://cjcoffey.com/posts/2024-wrapped/</guid><pubDate>Sun, 05 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;TLDR&lt;/h2&gt;
&lt;p&gt;I played a lot of different games, but finished almost none of them lol. I managed to squeak out a few personal projects despite what little personal time I have. One of said projects being the update to my website, so I hope you like the new look.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Welcome to the third annual &quot;things I did this year&quot; post. I&apos;m a bit late getting it out, but I hope you enjoy it regardless. As I did last year, I&apos;ll &lt;strong&gt;bold&lt;/strong&gt; the things I particularly enjoyed.&lt;/p&gt;
&lt;h2&gt;Table of Contents&lt;/h2&gt;
&lt;h2&gt;Games&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Astro Bot (10/10)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;My darling wife saw how giddy I was when I was watching some gameplay and reviews of this game, so she gifted it to me for Christmas ^.^. It was just so adorable, looked so fun, and played homage to so many great characters from my childhood. It definitely lives up to the hype. I&apos;ve just been enjoying it so much. If you have a PS5, I&apos;m sure you&apos;ll enjoy this, especially if you have a fondness for late 90s/early 2000s PlayStation.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Astro&apos;s Playroom (10/10)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;This is basically Astro Bot: The Prequel. You can see all the elements they were working out in this one and how they&apos;ve been refined and expanded upon in the full game. This was just a delightful tour through PlayStation&apos;s life. It has so many cute little easter eggs. I can&apos;t believe it&apos;s free with the PS5.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Balatro (10/10)
&lt;ul&gt;
&lt;li&gt;I picked this one up on mobile since it felt like it&apos;d be a decent &quot;pick up and play&quot; kind of game. Boy oh boy, I can see why this got nominated for game of the year. It &lt;em&gt;hooks&lt;/em&gt; you. It&apos;s very simple, but the loop is addicting and enjoyable. Certainly got me to play games on my iPad more than anything else. The music is an absolute bop, too. I&apos;m sure this is a fine game to play with a controller or mouse, but this just feels like it was made for mobile, so I can&apos;t imagine playing it anywhere else.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Baldur&apos;s Gate 3 (10/10)
&lt;ul&gt;
&lt;li&gt;I finally finished the campaign on this one. What a ride! Incredible from start to finish.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bread and Fred (3/10)
&lt;ul&gt;
&lt;li&gt;A great game for masochists. It has its funny moments, though.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The Break-in (8/10)
&lt;ul&gt;
&lt;li&gt;If you want a great party/meme game, this is for you. It&apos;s just so silly and my sides still hurt from laughing at the shenanigans of this game.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Castlevania Dominus Collection (8/10)
&lt;ul&gt;
&lt;li&gt;I only got around to playing most of &lt;em&gt;Order of Ecclesia&lt;/em&gt;. I really enjoyed it. I didn&apos;t realize it had voice acting, which is a plus in my book. I still need to go back and actually defeat Dracula, but I&apos;m really enjoying this one so far.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Double Dragon Gaiden Rise of the Dragons (6/10)
&lt;ul&gt;
&lt;li&gt;I love my beat-em-ups. This one is a pretty good one. Definitely one of the better Double Dragon games I&apos;ve played. I really like the tag system in this one. I think my favorite combo has been Billy and Marian. Billy is good at the melee and Marian is a good zoner. Got all the way through with this team, and it is great for playing in co-op too (definitely recommend that route if you can swing it.)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Helldivers 2 (8/10)
&lt;ul&gt;
&lt;li&gt;Oh, man. So much fun to be had with this one. I really enjoyed the first Helldivers game, and, while I was a bit skeptical about the switch to 3rd person, it&apos;s definitely paid off. It works really well and there&apos;s so much fun and chaos to be had with this one. Definitely my top multiplayer game this year. HIGHLY recommend this one.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Hot Brass (7/10)
&lt;ul&gt;
&lt;li&gt;This one is pretty silly. If I was rich, I would have thrown a couple extra million behind this one to give it some extra OOMPH. I think the 2d, top down puck style works &lt;em&gt;fine&lt;/em&gt;, but I really would have loved to see this one as maybe isometric or some other kind of 2d style. It takes a while to get used to the visual cues it gives you, but it&apos;s a fun time, for sure.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Make Way (8/10)
&lt;ul&gt;
&lt;li&gt;This is a great little party game. Think RC Pro AM + Mario Kart + Legos. You have these little carts, and, after you race to the end of the track, you build upon it. As you go along, you&apos;ll get power ups to sabotage other players, and you&apos;re able to skip tracks entirely if you&apos;re clever enough. Super fun game, and pretty inexpensive as well.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Legend of Zelda: Ocarina of Time (10/10)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;I revisited this one playing the &lt;a href=&quot;https://github.com/garrettjoecox/OOT/releases/tag/8.0.3-anchor-player-models-4&quot;&gt;multiplayer mod&lt;/a&gt; for it with a friend. It was such a fun time, and it hit all the nostalgia bits in just the right places. This will forever be my comfort game.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The Legend of Zelda: Four Swords Adventures (7/10)
&lt;ul&gt;
&lt;li&gt;I played through this online with a few friends, and it&apos;s fun, but man is it hectic. So many foot-guns, but it makes for one hilarious experience.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The Legend of Zelda: Echoes of Wisdom (9/10)
&lt;ul&gt;
&lt;li&gt;What a fun game! It&apos;s a very interesting approach to game design, and I think they knocked it out of the park. The echo system really makes you think about all the tools at your disposal to figure out a puzzle or take down an enemy. The visual style is great too. I really liked that they were able to get a little bit more out of the design of the Link&apos;s Awakening remake. Highly recommend this one.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Metaphor: ReFantazio (10/10)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;My personal game of the year. No notes. It feels like it was made for me. I love everything about it. 10/10 story. 10/10 voice acting. 10/10 music. The battle system is unique and I love the way Atlus approaches turn based combat. This is &lt;em&gt;the&lt;/em&gt; high fantasy game I&apos;ve been dreaming of for &lt;em&gt;years,&lt;/em&gt; and it&apos;s finally here and I have it in my hands. Now, I just have to finish it (gaming in your 30s, am I right?)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Mighty Morphin&apos; Power Rangers: Rita&apos;s Rewind (7/10)
&lt;ul&gt;
&lt;li&gt;I was going to give this one a much lower score, especially since Streets of Rage 4 and Shredder&apos;s Revenge have set the bar so high. The initial release of this one did &lt;em&gt;not&lt;/em&gt; feel good to play. It was slow, clunky, and, gameplay wise, just felt like a rushed effort. However, I&apos;m happy to report that the latest version (it got patched about a week after release) has changed everything. Fights are much more fluid. The non-brawler sections don&apos;t make me want to throw my TV out the window anymore. It&apos;s just a joy to play. While I don&apos;t think it hits as hard as Streets of Rage 4, or especially, Shredder&apos;s Revenge (the gold star of beat-em-ups), I think it&apos;s worthy of standing beside these two. The sprite art is fantastic and the music is a jam. Pick this one up if you adore beat-em-ups and have a soft spot for the Power Rangers. (Now, if we can just get some Ivan Ooze DLC)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Palworld (3/10)
&lt;ul&gt;
&lt;li&gt;I don&apos;t know what to say. This game just isn&apos;t for me. The pokemon-esque style pulled me in, but it just feels like another run-of-the-mill survival game to me. Maybe it&apos;s changed a ton since launch, but I just couldn&apos;t get into it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Persona 3 Reload (10/10)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Similar feelings about this one as I did Metaphor. Atlus, you S.O.B. You did it again. My &lt;em&gt;only&lt;/em&gt; gripe with this is that this doesn&apos;t feel like the definitive edition of Persona 3. It just feels like yet another installment. If you&apos;re playing Persona 3 for the first time, though, make this one your first stop. I think you&apos;ll have a better time with it. I was nervous going in because the voice cast is completely different, but I think they really nailed it and you can tell they put their heart and soul into their performances. I can&apos;t sing this one&apos;s praises enough. If you like JRPGs like me, please pick this one up.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Persona 5 Tactica (8/10)
&lt;ul&gt;
&lt;li&gt;I was a little iffy going into this one, but I really enjoyed it. I didn&apos;t think they&apos;d go as hard as they did, but I thoroughly enjoyed myself. The music, while not at the level of the base game, still holds up pretty well. Baby&apos;s First XCOM is really fun, and the story hits wayyyy above its level. This game is dirt cheap now, especially if you&apos;re buying physical, so give it a shot. I don&apos;t think you&apos;ll regret it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Prodeus (8/10)
&lt;ul&gt;
&lt;li&gt;This game hit 1.0 this year, if I&apos;m not mistaken. One of my dear friends gave me this so we could play co-op together, and I definitely think that&apos;s the way to go if you&apos;re going to play this. This game scratches that &quot;explore every nook and cranny&quot; itch I have when playing any game. It rewards you handsomely for it. The retro doom-like style of it is pleasing to these old eyes, but, I will say, all the particle effects blasting away my retinas -- I could do without. That&apos;s just gaming at this age, I suppose. Super fun game, though.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Resident Evil 6 (6/10)
&lt;ul&gt;
&lt;li&gt;I played through the majority of this game with one of my friends. I enjoyed it, but I think the port to PC could be a lot better, especially if you&apos;re playing with a keyboard and mouse. This game is meant to be played with a controller, and because the controller is a first class citizen, the keyboard and mouse controls suffer significantly. This resident evil and other PC ports like it from this era suffer a lot from just poor porting efforts. I often have to alt+tab out of my games to adjust various sound settings and such, mess with discord, etc. and this one (and the next Resident Evil game on the list) often crashes if you try to do that. Game-wise though, I enjoyed it. I&apos;m not big on Resident Evil or other horror/survival horror games in general, but this one was campy enough to not be freaking me out every 5 seconds.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Resident Evil Revelations 2 (7/10)
&lt;ul&gt;
&lt;li&gt;I only played the multiplayer of this one (with the same friend), but I enjoyed it a bit more than RE6. I think it controls a bit better and, while I missed the story beats of 6, I think the gameplay loop of the multiplayer is interesting with its RPG-esque mechanics.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Risk of Rain 2 DLC (7/10)
&lt;ul&gt;
&lt;li&gt;Risk of Rain 2 is already one of my favorite multiplayer games, so getting a little extra DLC is always welcome. The two new characters are fun and interesting, and the new levels breathe some fresh air into this rogue-like/lite(?). If you already own the game, the DLC is worth picking up. If you don&apos;t already own the game, at least pick up the base game because it&apos;s fantastic. 10/10 music, so give it a listen if nothing else.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Roboquest (7/10)
&lt;ul&gt;
&lt;li&gt;What a cute little rogue-like! It&apos;s got a great art style, the music is great, and the core gameplay loop is fun. My co-op buddy and I played through this together and I had a blast.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Shin Megami Tensei V: Vengeance (8/10)
&lt;ul&gt;
&lt;li&gt;I didn&apos;t really get a chance to get &lt;em&gt;too&lt;/em&gt; into this one, but I think this is the version to pick up if you&apos;re picking up SMT5. The OG version on the switch was great, despite the various framerate issues. Atlus killed it this year. This one is on my list to finish next year.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Super Mario RPG (Switch) (9/10)
&lt;ul&gt;
&lt;li&gt;This was a lovely remake of the original that stayed true to its roots while elevating the experience for a modern audience. The autosave feature is a blessing for those bouts where you can&apos;t justify going back, but also don&apos;t quite know what&apos;s ahead until you&apos;re in the deep end with zero healing items (ruh roh raggy). The extra animations and the updated soundtrack really add to the experience. If you love the original, I think you&apos;ll like this too. Also, it&apos;s a great introduction to the turn based RPG genre, so give it to your kid or a loved one that&apos;s exploring this hobby.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tekken 8 (10/10)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;So, last year, I was obsessed with Street Fighter 6. I&apos;ve always been a 2D fighting guy. Street Fighter has been my go-to for decades. I&apos;ve enjoyed the Tekken series in the past. Tekken Tag Tournament on the PS2 was one of my first games for the system and probably the first one I beat (i.e., unlocked all of the characters). There has just been &lt;em&gt;a lot&lt;/em&gt; to handle though for this series. The move list for any given character is astronomical compared to other fighting games (especially if you pick King). Tekken 8 feels approachable for possibly the first time in the series. The special style (i.e., Tekken&apos;s answer to Street Fighter 6&apos;s modern controls) gives you a good on ramp to learning the game or picking up a new character. Without having to spend hours in practice mode, you can quickly try out a character&apos;s toolkit. It makes the story mode A LOT easier for sure. BUT, once you&apos;re ready to graduate to the regular play style, you already know, visually at least, what the combos you were doing before look like. Plus, with the included TLDR in the character sheet, it&apos;s easy to pick up some simple moves and combos to get you started. I bought this game on 3 different platforms because I love it so much. I don&apos;t want to be in a place where I can&apos;t pick up and play a bit of my new favorite character, Reina. If you love fighting games and you don&apos;t have this already, treat yo&apos; self.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Vampire Survivors (9/10)
&lt;ul&gt;
&lt;li&gt;This game has been on my radar for a while, but I never picked it up until this year. I see what the hype is about now. It&apos;s really weird for the first time playing it because you&apos;re thinking &quot;what buttons do I press to do XYZ?&quot; Literally none. Just walk. It does everything for you. I think this is a pretty good game to let the beginner gamers play because it&apos;s so accessible for that audience, but it also has a ton of depth in the builds you can create when playing if you&apos;re a more serious gamer. This game wears its Castlevania inspiration on its sleeve, and now, we actually have Castlevania DLC. Super worth picking up if you&apos;re into Castlevania. There&apos;s so many easter eggs and funny little bits to find here and there and to read. This game is forever $5, so you&apos;ve got basically nothing to lose, even if you&apos;re just picking up the base game.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Anime&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;365 Days To The Wedding (8/10)
&lt;ul&gt;
&lt;li&gt;While I haven&apos;t finished this one just yet, I have been thoroughly enjoying it. It&apos;s just a cute little romcom anime set in the workplace instead of the typical high school setting. The characters are charming and the situations are light-hearted and silly. Totally worth the watch.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;A Condition Called Love (5/10)
&lt;ul&gt;
&lt;li&gt;I don&apos;t know if it was just the English localization/dub, but this one just didn&apos;t hit right with me. I think there are definitely some cute moments, but the male protagonist just comes across as controlling and creepy to me. The art and music is great though, so points for that.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A Sign of Affection (10/10)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;This one was my favorite Shojo show of the year. It&apos;s way too cute, and I love the fact they paid super close attention to the sign language bits. It&apos;s fun to learn a little something while watching a show you like.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Alya Sometimes Hides Her Feelings in Russian (6/10)
&lt;ul&gt;
&lt;li&gt;This one was decent. I like the voice acting and the premise, but I think the execution is a bit awkward in places, and I think it suffers from being a bit &lt;em&gt;too&lt;/em&gt; anime in places (if you catch my drift). There&apos;s one character that, any time they entered a scene, I wanted to walk away and do literally anything else. It&apos;s not terrible, but if you&apos;re looking for a romcom, you can find better.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Frieren: Beyond Journey&apos;s End (10/10)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;This one was my favorite overall this year. Granted, it started last year, but I didn&apos;t get around to watching it until early this year. I love the fantasy setting, the romance undertones, the characters are 10/10, etc. Everything about it is top tier. Well done everyone involved in this ^.^&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Grandpa and Grandma Turn Young Again (7/10)
&lt;ul&gt;
&lt;li&gt;This one doesn&apos;t go where you&apos;d think it goes based off of the trailer and the premise, but it&apos;s a cute time and worth the watch.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Hokkaido Gals Are Super Adorable (8/10)
&lt;ul&gt;
&lt;li&gt;This looks like it&apos;s going to be a run of the mill harem anime, but it subverts expectations by being so wholesome and cute. There&apos;s definitely some &lt;em&gt;anime&lt;/em&gt; bits in there, but it was never so bad as to distract from the plot. Fuyuki is such a terrific character. I wish there were more characters as upbeat, bubbly, kind, and understanding as her.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;How Heavy are the Dumbbells you Lift? (6/10)
&lt;ul&gt;
&lt;li&gt;This one is a bit &lt;em&gt;too&lt;/em&gt; anime, if you catch my drift, but it has some useful working out tips sprinkled in and it has its funny moments.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Makeine (5/10)
&lt;ul&gt;
&lt;li&gt;This one started off fairly strong, but I haven&apos;t even finished it because it just felt more and more obtuse as time went on.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Metallic Rouge (7/10)
&lt;ul&gt;
&lt;li&gt;I&apos;m a sucker for anything that deals with the whole &quot;what does it mean to be human&quot; question. Stuff like Blade Runner, NieR, etc. This is right up there with those questions, and it has some good action scenes too.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;My Deer Friend Nokotan (8/10)
&lt;ul&gt;
&lt;li&gt;If you&apos;re looking for a really dumb anime that feels almost like a &lt;em&gt;I Think You Should Leave&lt;/em&gt; sketch, then give this one a go. It&apos;s so funny and weird.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Nisekoi (2/10)
&lt;ul&gt;
&lt;li&gt;I couldn&apos;t finish it. It was just not for me.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Skip and Loafer (8/10)
&lt;ul&gt;
&lt;li&gt;I&apos;m curious to see where this goes next season (hopefully there&apos;s a season 2 🤞). It&apos;s really cute, and I love the relationship that blossoms between the two main characters.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spy X Family Code White (10/10)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;I saw this in theaters with my wife on our anniversary. It was so good! It was nice to visit a theater again too because I hadn&apos;t been to one since something like 2015. We were the only ones there, so it was like our own private showing. I loved how zany the story gets and that it has such a nice ending.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Suzume (8/10)
&lt;ul&gt;
&lt;li&gt;This one was a ride. It&apos;s so magical and fascinating. Terrific art style and an interesting story.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The Apothecary Diaries (8/10)
&lt;ul&gt;
&lt;li&gt;What can I say? I can&apos;t wait for season 2! This one is really cool, has some interesting characters, and is just a fun time. The ancient China setting is novel, and I totally dig the various puns and other hidden easter eggs throughout the show.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The Girl I Like Forgot Her Glasses (8/10)
&lt;ul&gt;
&lt;li&gt;Very wholesome. Very cute. Classic middle school love story.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wotakoi: Love is Hard for Otaku (10/10)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Holy crap this one is good. It&apos;s a nice change of pace from the typical high school romcoms, so that&apos;s a plus. I had to get the manga set for this one. It&apos;s so good. All of the characters are terrific. This and Horimiya are the gold standards of romcom anime. Absolutely adore and love this one. Please please please watch it if you haven&apos;t already.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Yamada-kun and the Seven Witches (8/10)
&lt;ul&gt;
&lt;li&gt;Very weird and interesting plot. This is almost unintentionally romcom-y. If you enjoy the first couple of episodes, I think you&apos;ll like the rest. It&apos;s funny. It&apos;s delightful.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Your Name (10/10)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;They don&apos;t make &apos;em like this anymore. This is one of the best movies I&apos;ve ever seen, let alone anime movies. It had me on the edge of my seat and yelling at my TV. I was 100% in it. Treat yourself to watching this one night.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Manga&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sweat and Soap (10/10)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;I heard so many good things about this one, but never understood why it didn&apos;t get an anime adaptation. Now that I&apos;ve read it...uh...I see why lol. This one is for the adults (Vol 4 warning O_O). Despite that, it&apos;s such a fantastic love story with 10/10 characters. The protagonists are quirky in their own ways, and their quirks match the other&apos;s perfectly. If you don&apos;t mind your literature being a bit spicy, pick this one up and give it a read (just make sure no one else is around 👀).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Personal Projects&lt;/h2&gt;
&lt;p&gt;A few notable projects I accomplished this year. I participated in a Game Jam, made a site for the NES fans, and re-did my own website. Let&apos;s start off with what I consider to be the biggest one. The Game Maker&apos;s Toolkit Game Jam.&lt;/p&gt;
&lt;h3&gt;GMTK Game Jam 2024&lt;/h3&gt;
&lt;p&gt;This year, one of my friends convinced me that we need to participate in a game jam. Consider it a follow up to the &lt;a href=&quot;https://cjcoffey.com/posts/devlog-series-part-2/&quot;&gt;&quot;nut up or shut up&quot;&lt;/a&gt; statement from last year. We ended up picking the Game Maker&apos;s Toolkit Game Jam (GMTK) for August. If you&apos;ve never done a game jam before, here&apos;s the gist of how it works: You&apos;re given a time limit (e.g., 48 hours) and a theme. You build a game based off of the given theme within the time frame. Sounds easy enough, right? This year&apos;s theme was &quot;Built to scale&quot;. Themes are purposely vague so that you have the freedom to interpret it however you want. The idea we came up with for this game jam was to &quot;scale the food chain&quot;. So, we made a game in which you start off as a carrot, get eaten by a skunk, turn into a skunk, then try to eat carrots before you&apos;re eaten by wolves. And so on and so forth until you&apos;re a human. Once you&apos;re human, you&apos;re then hunted by the other parts of the food chain. I look back on the experience much more fondly than I did when I was sleep-deprived. If you want to check it out and play it yourself, you can play it in your browser here: https://dually8.itch.io/foodchain&lt;/p&gt;
&lt;h3&gt;NES Cart Browser&lt;/h3&gt;
&lt;p&gt;If you know me and know me well, you know that I am, how do the kids say it? Neurospicy? Whenever I come up against a problem, I will not eat, drink, or sleep until it&apos;s complete. I&apos;m very easy to &lt;a href=&quot;https://xkcd.com/356/&quot;&gt;nerd snipe&lt;/a&gt;. I nerd sniped myself back in March this year when I was thinking about old Nintendo games I used to play. And, by Nintendo, I mean the OG Nintendo. The Nintendo Entertainment System (aka: NES). I had one particular game in mind, but all I could remember about it was how the cartridge looked and what the game looked like. That&apos;s kind of bad when you have the itch to play and no way of knowing what to look for when you&apos;re looking for it online. So, I stumbled upon this site: https://nescartdb.com. If you know what you&apos;re looking for, you can find everything you&apos;d ever want to know about a given NES cart. It has information on the release date, publisher, PCB, and...pictures of the cartridge. So, I thought, &quot;Well, I don&apos;t have time to click &lt;em&gt;every&lt;/em&gt; link on this site to look at the images, but I &lt;em&gt;can&lt;/em&gt; write a bot to download the images and I can go from there.&quot; So, I did. I created a project where I&apos;d scrape the website, get the images, save them with the name of the cartridge ID, then go through it like that. Well, that&apos;s all well and good, and that helps &lt;em&gt;me&lt;/em&gt;, but what if someone else has the same problem as me? I don&apos;t want them to do all of that work! So, I made a site to do just that. Introducing the &lt;a href=&quot;https://dually8.github.io/nes-cart-browser/&quot;&gt;NES Cart Browser&lt;/a&gt; website! There&apos;s a search bar at the top if you know what game you&apos;re looking for, and if you don&apos;t, you can just scroll through the list, and, hopefully, you find the game you&apos;re looking for.&lt;/p&gt;
&lt;h3&gt;The Updated Website&lt;/h3&gt;
&lt;p&gt;If you&apos;re a regular here, perhaps you&apos;ve noticed the new coat of paint? I&apos;ve talked about doing this for forever, and since I&apos;ve taken 3 weeks off of work, I finally could get around to doing it. Personally, I really like the changes, so I hope you do too. I&apos;ve removed &lt;a href=&quot;https://disqus.com/&quot;&gt;Disqus&lt;/a&gt; in favor of &lt;a href=&quot;https://giscus.app/&quot;&gt;Giscus&lt;/a&gt; for the comments section. There&apos;s a couple of things I think I&apos;d like to tweak there, but I think it&apos;s okay for now. The new site was built using &lt;a href=&quot;https://astro.build/&quot;&gt;Astro 5&lt;/a&gt; and &lt;a href=&quot;https://picocss.com/&quot;&gt;PicoCSS&lt;/a&gt; with a few extra custom things from myself. There was a lot of blood, sweat, tears, and love put into the new site. Much more tears than I anticipated (nothing is ever as easy as it seems, is it?) But! We&apos;re here. We&apos;re finally here. In 2025 with a new site and a few success stories to complement it. Time for a well deserved nap, I&apos;d say.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;If you got all the way here, thanks for reading. It is very much appreciated that you&apos;d take the time to, for lack of a better word, listen to me ramble. This year has been extremely tough, and I&apos;m sure this coming year is going to be even more so. I think I speak for many out there when I say that we&apos;re burnt out and basically running on fumes, but, if you&apos;re willing to keep going, I am too. Let&apos;s do our best this year. Let&apos;s try to enjoy the little things where we can, and hopefully, we can do more than just survive. Best wishes to you, dear reader. I hope 2025 treats you well. Take care 👋&lt;/p&gt;
&lt;p&gt;- CJ&lt;/p&gt;
</content:encoded><category>video games</category><category>anime</category><category>manga</category><category>life</category><author>CJ Coffey</author></item><item><title>New Stuff I Want To Talk About</title><link>https://cjcoffey.com/posts/new-stuff-i-want-to-talk-about/</link><guid isPermaLink="true">https://cjcoffey.com/posts/new-stuff-i-want-to-talk-about/</guid><pubDate>Sat, 18 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Man, life comes at your first, doesn&apos;t it? Sorry it&apos;s been a minute, but welcome back! In this post, I wanted to talk about a few random things I&apos;ve stumbled upon and learned about recently. Technology moves fast, and I feel like I was out of the JavaScript bubble just long enough to miss a few key things. I really wish there was some kind of newsletter or something I could read so I can better keep up-to-date with things. Having said all that, let&apos;s dive into things.&lt;/p&gt;
&lt;h2&gt;&lt;a href=&quot;https://www.npmjs.com/package/tsx&quot;&gt;tsx&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I code in almost exclusively typescript. If I can get away without having to compile to JavaScript first, then I will. I used to use &lt;a href=&quot;https://www.npmjs.com/package/ts-node&quot;&gt;ts-node&lt;/a&gt; for this kind of thing, but a lot of the time (recently anyway), it gets in the way more than it helps. I mostly want to use types where &lt;em&gt;I&lt;/em&gt; want to use them. I found ts-node to be a bit too strict most of the time. After some debugging and searching, I ended up finding out about tsx. tsx has been a great alternative that &quot;just works&quot;. I don&apos;t really worry about needing some kind of &lt;code&gt;tsconfig.json&lt;/code&gt; file in the root of my project or if I&apos;m just using it kind of willy nilly in-line. It&apos;s become a mainstay for all of my &quot;just messing around&quot; projects now.&lt;/p&gt;
&lt;h3&gt;Example&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// sum.ts
function sum(a: number, b: number) {
  return a + b;
}
console.log(sum(1,2));
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;tsx sum.ts
# =&amp;gt; 3
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver&quot;&gt;Mutation Observer&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Evidently this has been around for a &lt;em&gt;long&lt;/em&gt; time at this point, but I only found out about it recently. If you don&apos;t know, basically, you can observe a DOM node for changes and do something with that information in a callback. I imagine this would be a great tool if you&apos;re running &lt;a href=&quot;http://vanilla-js.com/&quot;&gt;Vanilla JS&lt;/a&gt; and need to monitor the interactivity of your site. I think this kind of thing is mostly taken care of by the various JavaScript frameworks out there, but I&apos;m curious which ones, if any, are using this API behind the scenes.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://javascript.info/mutation-observer&quot;&gt;Link to example&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/queueMicrotask&quot;&gt;queueMicrotask&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Evidently, this one was released in 2018 and no one told me. I wish I had known back then, because I feel like it would have made a difference in my life. This API allows you to add a task to the microtask queue of your browser. It&apos;s a non-UI blocking call, so it&apos;s really good for those smaller, background tasks where you may need to update some UI piece but still need to let the user be free to use your site. I stumbled upon this while watching &lt;a href=&quot;https://www.youtube.com/watch?v=eiC58R16hb8&quot;&gt;this JS Visualized video by Lydia Hallie&lt;/a&gt;. It&apos;s a really great video, and I wish it was something I could have watched a long time ago when I was starting my foray into the JS world.&lt;/p&gt;
&lt;h3&gt;Example&lt;/h3&gt;
&lt;p&gt;Let&apos;s say you&apos;re using Vanilla JS and &lt;code&gt;fetch&lt;/code&gt; to update some UI bits.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&quot;card&quot;&amp;gt;
  &amp;lt;figure&amp;gt;
    &amp;lt;img id=&quot;avatar&quot; src=&quot;/my-pic.jpg&quot; alt=&quot;Me&quot; /&amp;gt;
  &amp;lt;/figure&amp;gt;
  &amp;lt;div class=&quot;card-body&quot;&amp;gt;
    &amp;lt;h2 id=&quot;name&quot; class=&quot;card-title&quot;&amp;gt;Steve&amp;lt;/h2&amp;gt;
    &amp;lt;p id=&quot;description&quot;&amp;gt;Likes pina coladas&amp;lt;/p&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;function updateUI(data) {
    // Update the user&apos;s name
    document.getElementById(&apos;name&apos;).textContent = data.name;

    // Queue the next update
    queueMicrotask(() =&amp;gt; {
        // Update the user&apos;s email
        document.getElementById(&apos;description&apos;).textContent = data.description;

        // Queue the final update
        queueMicrotask(() =&amp;gt; {
            // Display the user&apos;s avatar
            document.getElementById(&apos;avatar&apos;).src = data.avatarUrl;

            // Optionally, log completion or trigger further actions
            console.log(&quot;User profile updated successfully.&quot;);
        });
    });
}
async function fetchData() {
    // Simulate an async operation like fetching data from a server
    await new Promise(resolve =&amp;gt; setTimeout(resolve, 2000)); // Simulate network delay
    return { name: &quot;Yuki&quot;, description: &quot;Likes katsu curry&quot;, avatarUrl: &quot;yuki.jpg&quot; };
}

async function main() {
  const data = await fetchData();
  updateUI(data);
}

main();
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;a href=&quot;https://bun.sh/&quot;&gt;Bun&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I was pretty excited when Bun was announced. It seemed like it was helping to push the JS community forward. Problem was, I am a Windows user, and Bun wasn&apos;t supported when it was released. However, since v1.1, we have official Windows support! Yay! I&apos;ve been using this heavily where I was using python before. Things like web scraping and little demos and whatnot have been pretty quick to put together. I really like its API, and it&apos;s super fast too, which is nice. I look forward to see where this goes in the future.&lt;/p&gt;
&lt;h2&gt;&lt;a href=&quot;https://playwright.dev/&quot;&gt;Playwright&lt;/a&gt; (as a web scraper)&lt;/h2&gt;
&lt;p&gt;This kind of goes together with Bun and tsx, but I&apos;ve recently traded python and selenium for Playwright. It&apos;s so easy to get setup and going, and the codegen thing comes in super handy. I&apos;ve been able to quickly write stock checkers for several things using it. It&apos;s a breeze to learn and pairing it up with Bun (if it works; tsx and Node if Bun doesn&apos;t) has made for super quick and handy weekend projects. I&apos;ll show off some sample code below if you&apos;re interested in trying it out for yourself.&lt;/p&gt;
&lt;h3&gt;Example&lt;/h3&gt;
&lt;p&gt;Here&apos;s a snippet of an interest rate checker. I run it once per day to watch the interest rates in the US. I used &lt;a href=&quot;https://www.npmjs.com/package/discord.js&quot;&gt;discord.js&lt;/a&gt; to notify myself when something is in stock.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import playwright from &apos;playwright&apos;;

const url = &apos;https://www.usbank.com/home-loans/refinance/refinance-rates.html&apos;;
const minRate = 6.0;

export async function checkInterestRate(headless = true) {
  const browser = await playwright.firefox.launch({
    headless,
  });
  const context = await browser.newContext();
  const page = await context.newPage();

  await page.goto(url);
  await page.locator(&apos;#stateName&apos;).fill(&apos;YOUR_STATE&apos;);
  await page.locator(&apos;#getRates&apos;).click();
  const rateStr = await page.locator(&apos;#Conventional&apos;)
    .locator(&apos;.rateConventional30&apos;)
    .evaluateAll((nodes) =&amp;gt; {
      const visibleElement = nodes.find(el =&amp;gt; el.checkVisibility());
      if (!visibleElement) return &apos;&apos;;
      return visibleElement.textContent?.trim();
    });
  console.log(`Rate on usabank is: ${rateStr}`);
  const rate = Number(rateStr?.split(&apos;%&apos;)[0]);
  if (isNaN(rate)) throw new Error(&apos;Could not parse rate&apos;);
  if (rate &amp;lt; minRate) sendDiscordMessage(`Rate is below ${minRate}!`);
  await browser.close();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Thanks for reading. I hope you learned some new things. The next section is just a life update kind of thing, so feel free to skip if you don&apos;t care about that kind of thing.&lt;/p&gt;
&lt;h3&gt;Life Updates&lt;/h3&gt;
&lt;p&gt;The start of this year wasn&apos;t good to me, so I&apos;ve had to cut back on a lot of fun things that I wanted to do. Things are a bit better now, but there&apos;s still a lot to adjust to and whatnot. My game dev adventures are on pause until I can find some more time for it. I&apos;ve been learning Japanese on-and-off for a few years now, and I&apos;m off again until I can get my mental health back in check. Google killed their domains and moved everything to Squarespace, so I&apos;ve been navigating that mess recently too. I used this URL as an email forward to my Gmail account, and it still technically works now that it&apos;s in Squarespace, but I don&apos;t know when that might end. If you have any suggestions for a good domain registrar that I can use to forward emails to my gmail email, then please let me know. I&apos;d love to hear from you.&lt;/p&gt;
&lt;p&gt;In other news, I made a neat new site, &lt;a href=&quot;https://dually8.github.io/nes-cart-browser/&quot;&gt;NES Cart Browser&lt;/a&gt;. It let&apos;s you browse all of the NES games by their cartridge art. It was a neat little project that came to me while I was sleeping, and it helped me learn &lt;a href=&quot;https://kit.svelte.dev/&quot;&gt;Svelte(Kit)&lt;/a&gt;, so that was nice too. I&apos;m still waiting to see what I&apos;m going to do about re-working this site using something like &lt;a href=&quot;https://astro.build/&quot;&gt;Astro&lt;/a&gt;, SvelteKit, or something else. Maybe someday lol. Thanks again for reading. I hope you have a good rest of your day ♥.&lt;/p&gt;
</content:encoded><category>JavaScript</category><category>TypeScript</category><author>CJ Coffey</author></item><item><title>2023 Wrapped</title><link>https://cjcoffey.com/posts/2023-wrapped/</link><guid isPermaLink="true">https://cjcoffey.com/posts/2023-wrapped/</guid><pubDate>Sun, 31 Dec 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;TLDR&lt;/h2&gt;
&lt;p&gt;I played the NieR series this year and loved it. I watched probably too much anime. I got back into game dev.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Welcome to the 2nd annual &quot;stuff I played/watched/did/etc. in &amp;lt;year&amp;gt;&quot;. This time, it&apos;s 2023. What a year 😩 We had some ups, some downs, some plateaus, etc. but now it&apos;s all over. I hope everyone reading has a great new year.&lt;/p&gt;
&lt;p&gt;Quick disclaimer for these lists: The &quot;X I Enjoyed&quot; doesn&apos;t necessarily mean that the thing released this year, but it is the year I got around to enjoying it, whatever it was. While these lists aren&apos;t ranked, I will &lt;strong&gt;bold&lt;/strong&gt; items I particularly enjoyed. All of the items are just a showcase for things I enjoyed and wanted to mention. Now, on with the show!&lt;/p&gt;
&lt;h2&gt;Games I Enjoyed in 2023&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Aliens: Fireteam Elite
&lt;ul&gt;
&lt;li&gt;This was a really fun co-op experience, but I can&apos;t imagine playing this solo.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Baldur&apos;s Gate 3&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Winner of basically ever game award and awarded a 10/10 basically everywhere, of course this one is one of my favorites. I&apos;ve been playing through a campaign with a few friends and it&apos;s one of the best co-op experiences I&apos;ve ever enjoyed. I can&apos;t speak to solo play, but I hear it&apos;s great too.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bloodstained: Ritual of the Night
&lt;ul&gt;
&lt;li&gt;I&apos;m a sucker for Castlevania-likes, so I finally got around to playing it this year. I played through it, but got a &quot;bad ending&quot;, so I&apos;m going to have to look up a guide or something to play through and get the &quot;full experience&quot; at some point.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The Break-In
&lt;ul&gt;
&lt;li&gt;This game is worth every penny. Please go and pick this up. What a phenomenally hilarious experience. This game brought me the hardest laughs this year.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Castlevania Harmony of Dissonance
&lt;ul&gt;
&lt;li&gt;Last year, I played through and beat Circle of the Moon, so this year I tried Harmony of Dissonance (next will be Aria of Sorrow). While I haven&apos;t beaten it (yet), I&apos;ve thoroughly enjoyed my time with it so far. What a bop of a soundtrack too, especially given the cartridge limitations.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Castlevania: Rondo of Blood
&lt;ul&gt;
&lt;li&gt;I bought this on the PS4 since it&apos;s the only way I can legally play this at this point. I&apos;m glad I did because this should have been part of the Castlevania Advance Collection as far as I&apos;m concerned (and evidently Castlevania X isn&apos;t just a SNES port of Rondo). I haven&apos;t beaten it yet, but man this game is so good and the soundtrack makes me not want to put it down.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Crab Champions
&lt;ul&gt;
&lt;li&gt;This was a random one, but I&apos;ve had a ton of fun with it. I wish I could get the soundtrack somewhere though, because the music is just so fun. This game is so light-hearted, and it&apos;s a terrific co-op experience.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Dark Cloud (PS2)
&lt;ul&gt;
&lt;li&gt;I played a few hours of this game this autumn. I was feeling nostalgic, and this game scratched that itch. It&apos;s so charming and such a hidden gem. I wonder if the dev/publisher would ever consider a remake of some sort?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Diablo IV&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Full disclosure, I wasn&apos;t going to pick this up, but a few friends (vaguely) pressured me into getting it. Funny enough, I ended up playing mostly by myself. While I absolutely loathe the actions of the higher ups at Activision/Blizzard, the feelings this game evoked while playing were all the right ones. I remember very vividly playing Diablo 2 til 6am on school nights as a kid. I did the same here because I couldn&apos;t put it down (though it&apos;s work instead of school now). The story was gripping and I couldn&apos;t stop taking in all it had to offer. I stopped playing before the &quot;season&quot; or whatever, so I didn&apos;t get the negatives from that a lot of other people got. Maybe I beat it just in time? Who knows if I&apos;ll go back to it because I&apos;ve since uninstalled the game. If/when there&apos;s an expansion, perhaps I&apos;ll go back.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Double Dragon Gaiden: Rise of the Dragons
&lt;ul&gt;
&lt;li&gt;This one was a surprise. I played through it once and enjoyed myself quite a bit. My only complaint is that there&apos;s no online co-op. Granted, you could possibly get away with using something like Steam Remote Play or &lt;a href=&quot;https://parsec.app/&quot;&gt;Parsec&lt;/a&gt;, it&apos;s just not a substitute for good online play. Having said that, it was a ton of fun.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Forza Horizon 4
&lt;ul&gt;
&lt;li&gt;Horizon 5 was such a surprise gem for me last year. Horizon 4 didn&apos;t have the same effect on me as 5 did, but I did enjoy it. These games are always so beautiful that I often find myself just driving around and looking at the scenery rather than play the actual game.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The Legend of Zelda: Link&apos;s Awakening (2019)
&lt;ul&gt;
&lt;li&gt;Let me first start of saying that I loved this remake. It&apos;s adorable and there&apos;s obviously a lot of love put into it. Having said that, there could be a museum filled with unfinished projects and games for me at this point. Yes, I never finished it (though I plan to).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Megaman Legends (PSX)
&lt;ul&gt;
&lt;li&gt;Around the same time I was playing Dark Cloud, I played a bit of this too. It definitely scratched the nostalgia itch, but man, does this game feel weird to play nowadays.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Mortal Kombat 1
&lt;ul&gt;
&lt;li&gt;I&apos;m a fighting game lover, and while this was my least favorite fighting game I played this year, I did enjoy this one. I do wonder how many more times they&apos;re going to just re-write the entire timeline though 🤔.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NieR Automata&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;This game and its prequel did something to me. Let me first say, I&apos;m a sucker for &quot;what does it mean to be human&quot; narratives (see my love for Blade Runner). Yoko Taro and his team do such a beautiful job of crafting a world that feels oddly personal. I don&apos;t know why I slept on this one for so long, but I&apos;m glad I finally got around to playing it. Going through it at the same time as watching the anime was a fantastic experience. I spent way too much time watching YouTube lore videos after I beat this and Replicant. Drakengard 3 is next on my list of Yoko Taro games.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NieR Replicant&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;This was my absolute favorite this year. I planned on playing it when it (re-)released in 2021, but never got around to it. I&apos;m glad I finally had the time to play it though. I felt a lot closer to the characters in this one over Automata, and I ran the soundtrack of this one into the ground. I bought the CD, Kaine and Nier plushes, and a Kaine music box off of SquareEnix&apos;s website. I&apos;m obsessed. I think about this game, its world, and its character&apos;s almost daily. It lives in my heart rent free.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Persona 3 Portable&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;While I haven&apos;t finish this one, I plan to this January (right after I finish 5 Tactica). I&apos;m a good deal into this one, but come on. It&apos;s Persona 3. It&apos;s only second to 5 in my book. The theme of death and acceptance is timeless. It&apos;s an emotionally hard game, but I&apos;m excited to finally witness the difference between it, FES, and &lt;em&gt;Reload&lt;/em&gt; (LET&apos;S GOOOOOOOOOOO).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Persona 5 Tactica&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;I&apos;m roughly 15 hours into this one, but I&apos;m enjoying Baby&apos;s First XCOM quite a bit. I&apos;ve never played an XCOM-like before, so being surrounded by familiar faces helps a lot. The story takes a minute to get going, but I&apos;m hooked now. I&apos;m well invested into Toshiro&apos;s and Erina&apos;s back story. I think I like Striker&apos;s better from a story perspective (as far as spin-offs go), but this one holds its own.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Ready or Not
&lt;ul&gt;
&lt;li&gt;This game tells me that I need a GPU better than my GTX 1070 TI. It&apos;s so fun, but it &lt;em&gt;chugs&lt;/em&gt; in some places. I don&apos;t know if that&apos;s due to less than stellar optimizations or my specs. Even so, it&apos;s a ton of fun as a co-op game. I don&apos;t imagine I&apos;d ever play this solo though.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Risk of Rain Returns
&lt;ul&gt;
&lt;li&gt;This game is a ton of fun, though it can be brutal sometimes. I have it on Steam, but it&apos;s nice to see it on the Switch (and possibly other places?) too.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Sea of Stars
&lt;ul&gt;
&lt;li&gt;I really wish I got more time with this game because it&apos;s obvious there&apos;s a lot of love in it. I&apos;ve watched more videos about this game than I&apos;ve played it, but what I did play was so charming and comfortable. I hope I can give this the playthrough it deserves next year.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Starfield
&lt;ul&gt;
&lt;li&gt;This game is on this list because I did enjoy it, despite everything surrounding it. It&apos;s boring from a gameplay perspective, but the world is fascinating and the visuals (when it&apos;s not buggy) are gorgeous. I hope that if/when we get Starfield 2 (or even just an update for this game), it&apos;ll be a bit more fleshed out and be the &quot;Skyrim in space&quot; we all expected it to be.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Starship Troopers: Extermination
&lt;ul&gt;
&lt;li&gt;This game is so silly. It prompted me to give the original movie a watch, and I was not disappointed. I love campy things and this one has camp in droves. I love that everyone you play with is in on the joke and everyone just quotes the movie. This gave me a hint of the community feeling that Pokemon Go gave when it first came out. Everyone is just in it together and we&apos;re all here for a good time.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Street Fighter 6&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;This is my favorite fighting game of all time. Full stop. My only complaint is with the economy of the game (microtransactions, etc.), but I feel like that&apos;s kind of to be expected of any big name game company these days (see also Diablo IV). Even if you only ever pay for the base game, it&apos;s 100% worth it. The story mode alone is such a fun time. The personality of all of the fan favorites shines and it&apos;s just a ton of fun. The online is the best I&apos;ve ever played. I really love how the battle hub rekindles the feeling of playing in an arcade, and the fact they have rotating old capcom classics available is great too. If you only ever play one fighting game in your life, make it this one.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Super Mario Wonder
&lt;ul&gt;
&lt;li&gt;I really wish I could have given this game more time, but I only have about 5-6 hours in it at the time of writing. It&apos;s so charming and I love every bit of it. So much love and care went into making this one. This is my favorite 2D Mario game. The singing piranha plants alone are worth the entry price. The online play is terrific too. I actually prefer it over local multiplayer since you&apos;re not confined to sharing the screen space (apologies to my wife 🙏 &lt;em&gt;gotta go fast bby&lt;/em&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Tekken 7
&lt;ul&gt;
&lt;li&gt;After I saw the Tekken 8 trailers, I was excited enough to try out the previous iteration. Mortal Kombat is my worst fighting game, but this is a close second. The focus on juggling and carrying your opponent to a wall makes it difficult to &quot;git gud&quot;. I had the pleasure of playing and practicing with a friend, so it made the journey much more bearable. There&apos;s just a lot to this game, so it&apos;s hard to recommend to a beginner unless you just &lt;em&gt;really&lt;/em&gt; have the motivation to learn it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Tekken 8 Demo
&lt;ul&gt;
&lt;li&gt;Thanks to Street Fighter 6, we have a baby mode in Tekken now (it&apos;s me. I&apos;m the baby). The inclusion of &quot;special style&quot; was a fantastic move. Now I can focus on learning movement and footsies rather than a bunch of timings and button combos. I&apos;ll be able to work my way up to playing without the handicap, but I&apos;m super happy it&apos;s included. I&apos;m really thrilled with the &quot;ghost mode&quot; too. Being able to play against yourself and figure out your shortcomings &lt;em&gt;while playing a match&lt;/em&gt; is game changing. I really love that Bandi Namco and Capcom are pushing the boundaries here and making fighting games both more accessible and enjoyable. This is my most anticipated game of 2024 behind Persona 3 Reload.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;TMNT: Shredder&apos;s Revenge DLC
&lt;ul&gt;
&lt;li&gt;This was my game of the year last year, and while I really enjoyed the DLC, it didn&apos;t have the staying power the initial release did. I do really like the new modes and characters though. It&apos;s worth picking up, especially if you already have the base game. If you don&apos;t have the base game though, do yourself a favor and get it. You won&apos;t regret it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Vampire Survivors
&lt;ul&gt;
&lt;li&gt;There was so much hype surrounding this little indie title that I just had to check it out. At a $5 entry point, it&apos;s hard to not recommend it. It&apos;s the perfect game for short play sessions. I can see gamer parents, or just busy gamers in general getting a lot out of this gem.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Yakuza 0
&lt;ul&gt;
&lt;li&gt;This is another game I wish I had more time with. It&apos;s got a really nice and gripping story, and the combat feels great. Perhaps next year I can give this one the time it deserves.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;According to Steam, I played 67 games this year (and that&apos;s just on the PC and through them!). There are tons of games I really wanted to play, but I didn&apos;t pick up because I knew I wouldn&apos;t be able to find the time to play them. I hope I can pick these up next year and give them a go (things like Super Mario RPG, Tears of the Kingdom, etc.).&lt;/p&gt;
&lt;p&gt;I had a list of things I wanted to tackle this year.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Persona 3 Portable&lt;/li&gt;
&lt;li&gt;Kirby&apos;s Return to Dream Land Deluxe&lt;/li&gt;
&lt;li&gt;Zelda: Tears of the Kingdom&lt;/li&gt;
&lt;li&gt;Final Fantasy 15&lt;/li&gt;
&lt;li&gt;Final Fantasy 12&lt;/li&gt;
&lt;li&gt;Persona 5 Royal&lt;/li&gt;
&lt;li&gt;Metroid Dread&lt;/li&gt;
&lt;li&gt;NieR Automata&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The only one I ended up completing was NieR Automata. I won&apos;t beat myself up for not finishing these things. I am glad I played through a great deal of most of them. The only one I didn&apos;t play was Tears of the Kingdom. I don&apos;t think I&apos;ll make a list for 2024. I think it&apos;d be a short one anyway (just Tekken 8 and Persona 3 Reload).&lt;/p&gt;
&lt;h3&gt;Game I Enjoyed the Most&lt;/h3&gt;
&lt;p&gt;NieR Replicant&lt;/p&gt;
&lt;h3&gt;Honorable Mentions&lt;/h3&gt;
&lt;p&gt;Baldur&apos;s Gate 3&lt;/p&gt;
&lt;h3&gt;Most Anticipated for 2024&lt;/h3&gt;
&lt;p&gt;Persona 3 Reload&lt;/p&gt;
&lt;h2&gt;Anime/Manga I Enjoyed in 2023&lt;/h2&gt;
&lt;p&gt;Hey, it&apos;s me, the hopeless romantic that only ever watches rom-coms 👋&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Aharen-san wa Hakarenai
&lt;ul&gt;
&lt;li&gt;Nothing will ever be funnier than misunderstandings&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Angel Next Door Spoils Me Rotten&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;This is the cutest anime of all time. It physically hurt me it&apos;s so cute.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Chainsaw Man
&lt;ul&gt;
&lt;li&gt;All you need to know is the &lt;a href=&quot;https://www.youtube.com/watch?v=HDiGdQ5rF0Y&quot;&gt;Himeno english dub experience&lt;/a&gt;. Plus, this has one of the best anime soundtracks of all time.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;A Couple of Cuckoos
&lt;ul&gt;
&lt;li&gt;I enjoyed this, but man it was &lt;em&gt;weird&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DARLING in the FRANXX&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;This was a surprise favorite for me. I kept seeing how much people loved Zero Two online (maybe a bit &lt;em&gt;too&lt;/em&gt; much 😩), so I felt like I needed to check it out. Love stories hook me every time and this was no different. I wept at the ending. It was beautiful.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Fruits Basket -prelude-
&lt;ul&gt;
&lt;li&gt;Fruits Basket is one of my favorites, so it was nice to see Tohru&apos;s parent&apos;s story here. Granted, the setting is a bit weird for the modern day, but I can still appreciate the story.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Horimiya: Pieces&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;This was such a nice follow up to the original anime. This is my comfort anime. The soundtrack is also terrific and Yoh Kamiyama was one of my top artists on Spotify this year.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;How Heavy Are the Dumbells You Lift?
&lt;ul&gt;
&lt;li&gt;This one is hard to recommend because it&apos;s a bit &lt;em&gt;too&lt;/em&gt; anime, if you catch my drift. If you can get passed the tomfoolery though, it&apos;s a fun time. I also really like that it demonstrates a ton of home work outs and teaches you form as well. Not that I&apos;ve used a ton of it, but it&apos;s still nice to have that knowledge.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The Ice Guy and His Cool Female Colleague
&lt;ul&gt;
&lt;li&gt;This one is also extremely cute. The manga got an English release this year, so you know I had to pick up the first volume. Adult workplace romcom (as opposed to high school setting romcom) was a staple this year for me. The characters are an absolute delight and Fuyutsuki needs to be protected at all costs.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kaguya-sama: Love is War&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;This is one of the few anime I watched where I didn&apos;t watch the Japanese dub first. I did watch some of it, but the English dub goes hard. Everyone did such an amazing performance, and I love how they made the narrator a character in this version. If you only ever watch one anime, watch this one. If you only ever watch one episode of this one, watch the Shojo manga episode. This anime had me in tears in both laughter and the love story between the two protagonists. 10/10 cannot recommend this one enough.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;More than a Married Couple, but Not Lovers
&lt;ul&gt;
&lt;li&gt;So, first off, I love this one. It&apos;s great, but it&apos;s hard to recommend. The setting and level of anime BS holds it back for a general audience. Having said that, the character&apos;s are great (&lt;em&gt;Jiro is a scoundrel&lt;/em&gt;) and the way the various relationships develop over time makes me feel warm and fuzzy. It was joy to watch, but my wife and I couldn&apos;t help but just say, &quot;oh my god 😩&quot; (a la &lt;a href=&quot;https://media1.tenor.com/m/qIw2QkPFsT4AAAAC/bobs-burgers-oh-my-god.gif&quot;&gt;Bob Belcher&lt;/a&gt;) during many of the scenes (likewise with the Dumbbells anime).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;My Clueless First Friend
&lt;ul&gt;
&lt;li&gt;I can&apos;t quite decide if this anime is cuter than The Angel Next Door Spoils Me Rotten, but they&apos;re neck and neck. The elementary school setting just adds to the cute factor since they&apos;re all basically babies. It just reminds me of that time in my life when everything was innocent. We should all strive to be like Taiyo and emit that kind of sunshine-y positivity everywhere we go.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;My Dress-Up Darling&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;This one is pretty ecchi, but if you can get passed it, you&apos;re in for a treat. The dynamic between Kitagawa and Gojo is adorable. The way they help each other grow as individuals is lovely. I love the over-the-top comedy. It&apos;s just such an enjoyable watch, and you know they hooked me with the love story. I&apos;m a sucker for that.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;My Love Story with Yamada-Kun at Lv999&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Another love story, but this time it&apos;s very tame. I relate the characters here a lot more since they&apos;re all gamers. The dynamic between Yamada and Akane is a delight, and the last episode brought me so much joy and relief.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;My Senpai is Annoying
&lt;ul&gt;
&lt;li&gt;Patrick Seitz doesn&apos;t miss. His big booming voice is such a delight, and this anime is no exception. Seeing the relationship between the two main characters blossom just filled me with the warm and fuzzies. The side characters also developing a relationship was nice too. It&apos;s just a really enjoyable anime.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;My Tiny Senpai
&lt;ul&gt;
&lt;li&gt;This one was basically My Senpai is Annoying, but with the ecchi of &quot;More than a Married Couple&quot; thrown in. If you can get passed that, it&apos;s an enjoyable watch. There&apos;s a lot of silliness.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NieR Automata Ver1.1a&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Of course, I had to accompany my playthrough of the game with this. They did a terrific job of adapting the game to an anime. If you don&apos;t play the game (which you should), at least give this a watch. It&apos;s got a banger of a soundtrack to go along with it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Quintessential Quintuplets&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;I couldn&apos;t put this one down. I was &lt;em&gt;obsessed&lt;/em&gt; with this one. I didn&apos;t think I&apos;d get into it like I would, but the character development was just phenomenal. It was a little weird going from season 1 to 2 with the change in studios, but I quickly got used to the style of season 2. I believe the movie was done by the same studio as season 2, so it&apos;s not jarring going straight into the movie. But MAN, the love story here was wild. I was on the edge of my seat the whole time (&lt;em&gt;slightly&lt;/em&gt; disappointed in the end, but the ending made complete sense). This anime had my favorite character development of any other one I watched this year. It felt familiar in an odd way, just watching these high school kids grow into working adults. What can I say? It&apos;s a great slice-of-life anime.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rascal Does Not Dream of a Dreaming Girl&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;There are several more of these coming out sooner or later, but this was the latest one in the series. I&apos;m so glad I watched it. It continues the story of the anime and adds more context surrounding the original plot. I&apos;m excited to see where the rest of this goes, but the ending hit me pretty hard (in a good way). It was a roller coaster getting there though.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ReLIFE
&lt;ul&gt;
&lt;li&gt;This one was a really slow burn. It&apos;s also probably the oldest anime I watched this year. The OVAs were the perfect addition to it to and wrapped things up really nicely.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Science Fell in Love, So I Tried to Prove it
&lt;ul&gt;
&lt;li&gt;Full disclosure, I didn&apos;t finish watching this one because my wife went through all of it and said we needed to stop at a certain point before things took a dark turn. At least, up to the point I watched, this one was really funny. The characters are charming and silly, and the voice performances were top notch. I knew I recognized the voice of Yukimura within the first few minutes. RIP &lt;a href=&quot;https://www.behindthevoiceactors.com/Billy-Kametz/&quot;&gt;Billy Kametz&lt;/a&gt;. We lost you too soon. What an outstanding performance though.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Skip and Loafer&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;I can&apos;t wait to see more of this one. What a surprise! I didn&apos;t expect to like this one as much as I did, but it&apos;s so cozy. I like any story where I can see a character (or preferably characters, plural) grow into better versions of themselves. Mitsumi is so relatable to our adolescent optimism, and Shima exudes the kind of kindness and understanding we all would like to have. The way their dynamic unfolds through the series just feels my heart with the warm and fuzzies. It&apos;s such a cozy anime to watch. Curl up this winter with some hot chocolate or some coffee and give this one a watch/read.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spy x Family&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;What can I say? It&apos;s Spy Family. It&apos;s the anime all of the non-otakus watch, and for good reason. The characters are fun and interesting. The setting is mysterious, yet familiar. I swear this is Japanese propaganda to get everyone to have kids, because it somehow makes family life seem sincere and comfortable (at least to this guy). I really like how season 2 went into the back stories of some of the side characters. It makes this world feel more lived in and relatable. I can&apos;t wait to see what the movie will bring. Also, I have a volume of manga I need to get around to reading 👀.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tomo-chan is a Girl!&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;This one also surprised me. I didn&apos;t think I&apos;d enjoy this one as much as I did, but I watched the anime twice (dub and sub), then read the manga. I couldn&apos;t get enough! It&apos;s really short and sweet, so it doesn&apos;t overstay its welcome, and it&apos;s not hard to get into (I will never watch One Piece and I&apos;m not ashamed to admit it). The dynamic between Misuzu and the rest of the cast kept me laughing the whole time. Jad Saxton (her voice actor) is a national treasure. I was also amazed that the voice actor for Carol is the same in both the Japanese and English dub. Sally Amaki is incredible!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;TONIKAWA: Over The Moon For You
&lt;ul&gt;
&lt;li&gt;To be honest, I can&apos;t remember if I watched all of this one this year, or if I just watched season 2 + the bonus stuff this year. Regardless, it&apos;s a really nice watch. There&apos;s still a lot of mystery surrounding the plot, so I&apos;m excited to see where it goes next. I enjoy anything with Erika Harlacher in it, so this was an easy like for me.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Trigun Stampede
&lt;ul&gt;
&lt;li&gt;I never watched the original that aired on Toonami (or was it Adult Swim? or both?). This one was a really fun watch though. They left things open for a season 2 at the end, so I&apos;m excited to watch more when it comes out (granted they make a season 2).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wotakoi: Love is Hard for Otaku&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;I watched this one later in the year after all of the other adult workplace romcoms, and this one was easily my favorite of them all. Do yourself a favor and find the OVAs once you&apos;re done because it&apos;s so worth it. The characters are fantastic, and I loved the relationships and dynamics among the main cast. I hope we&apos;ll someday get an English dub of this one, because I think it&apos;d be great for more people to see this. I haven&apos;t started the manga yet, but it&apos;s on my to-do list. My wife has been binging it and I always hear her laughing about a scene that wasn&apos;t in the anime, so I&apos;m excited to start that one soon. If you&apos;re a nerd/otaku, give this one a watch. It&apos;s great!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Anime/Manga I Enjoyed the Most&lt;/h3&gt;
&lt;p&gt;This is really close between Kaguya-sama and the Quintuplets, but I think I have to give Kaguya-sama the final win because the English dub is just absolutely the best dub I&apos;ve ever had the pleasure of witnessing.&lt;/p&gt;
&lt;h3&gt;Honorable Mentions&lt;/h3&gt;
&lt;p&gt;I think the nerd community ate really well this year. We had so many good games and anime release this year that we&apos;d be hard pressed to not find something we like. Since I couldn&apos;t give the Quintuplets the win in the section above, they&apos;ll get it here. The movie did a really nice job of wrapping everything up from the anime, and I honestly couldn&apos;t even make it to the release of the movie in time, so I ended up binging the manga in one sitting.&lt;/p&gt;
&lt;h2&gt;Personal Projects in 2023&lt;/h2&gt;
&lt;p&gt;I&apos;ve been keeping a dev log of sorts for the past few posts. As you may well know, I&apos;m doing my best to get back into game development and take it more seriously. Being a game dev has been my dream since I was just a kid. Of course, I&apos;m not very good at it (yet), but I&apos;m eager to learn more and improve. This year, I started and completed some courses on Godot. I&apos;ve been keeping track of my progress in a &lt;a href=&quot;https://github.com/dually8/godot-projects&quot;&gt;monorepo&lt;/a&gt;. While I&apos;m done with the courses, I didn&apos;t want my education to end there, so in my &lt;a href=&quot;./devlog-series-part-3.md&quot;&gt;last post&lt;/a&gt;, I asked what kind of game I should try and make. My wife suggested I combine two of our favorite series (Kirby and Castlevania) into something. Thus, the idea for &lt;em&gt;KirbVania&lt;/em&gt; was born. While I&apos;m not done with it, &lt;a href=&quot;https://streamable.com/e/dz9br6&quot;&gt;I have made some good progress&lt;/a&gt;. The experience has been a challenging, but rewarding one.&lt;/p&gt;
&lt;p&gt;I will never release this &quot;game&quot; to the public, because I&apos;m not an imbecile. The last thing I need is N*ntendo knocking on my door. However, using familiar characters and set pieces has made this project more bearable and fun, especially as someone that&apos;s focused more on the programming aspect of things.&lt;/p&gt;
&lt;p&gt;Going into 2024, I&apos;d like to finally get around to redoing my website. I&apos;d like to have more control over things, so I want to get away from using &lt;a href=&quot;https://gohugo.io/&quot;&gt;Hugo&lt;/a&gt;. I don&apos;t know if swapping to &lt;a href=&quot;https://astro.build/&quot;&gt;Astro&lt;/a&gt; or &lt;a href=&quot;https://nextjs.org/&quot;&gt;NextJS&lt;/a&gt; is going to be super beneficial yet, but I&apos;ll mess around with it once I get the chance. If I had the time and money, I&apos;d love to work with a designer to get the new site looking good, but alas, I&apos;m not in that position at the moment, so I&apos;ll just need to work with what I have.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;It&apos;s hard to remember everything that&apos;s happened in a year, so I&apos;m sure I missed some things here and there. I look forward to the new year since I plan on taking a trip to Japan. It&apos;s been a dream of mine to go there since I was a kid, so over the course of the next several months, it&apos;s time to learn some Japanese. Let&apos;s all do our best. 皆さん、一緒にがんばろう！ (みなさん、いっしょにがんばろう！) Happy New Year!&lt;/p&gt;
</content:encoded><category>video games</category><category>anime</category><category>manga</category><category>life</category><author>CJ Coffey</author></item><item><title>Dev Log Series Part 3</title><link>https://cjcoffey.com/posts/devlog-series-part-3/</link><guid isPermaLink="true">https://cjcoffey.com/posts/devlog-series-part-3/</guid><pubDate>Sat, 18 Nov 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;TLDR&lt;/h2&gt;
&lt;p&gt;I finished the courses and now I&apos;m moving on to other micro projects until I feel more comfortable doing bigger projects.&lt;/p&gt;
&lt;h2&gt;The First Leg of the Journey&lt;/h2&gt;
&lt;p&gt;Welcome back, readers. I&apos;ve finally finished all of the &lt;a href=&quot;https://academy.zenva.com/course/humble-godot-2023-bundle-tier-3/&quot;&gt;courses&lt;/a&gt; from that Humble Bundle I mentioned in the previous blog. I feel much more confident in my abilities now.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/DevLog3/Dunning-Kruger-Effect.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I&apos;m currently at the &lt;em&gt;Peak of &quot;Mount Stupid&quot;&lt;/em&gt;. Of course, I still have a long way to go, but I&apos;ve gotten enough reps in at this point that I don&apos;t feel completely lost when trying to do something.&lt;/p&gt;
&lt;p&gt;I&apos;ve completed all &lt;a href=&quot;https://github.com/dually8/godot-projects/issues/2&quot;&gt;16 courses&lt;/a&gt; that were included with that bundle now. Most were related to the &lt;a href=&quot;https://godotengine.org/&quot;&gt;Godot game engine&lt;/a&gt;, but some touched things like &lt;a href=&quot;https://www.blender.org/&quot;&gt;Blender&lt;/a&gt; as well as pixel art. I wouldn&apos;t consider myself an expert in any of these things now, but I do feel much more comfortable with them than I did before. Still, I feel a wall starting to form around me again. The programming part has never really been an issue to me. Not to toot my own horn, but 📯 &lt;em&gt;doot doot&lt;/em&gt;, I&apos;m pretty good at programming. It&apos;s everything else that seems to slow me down and create that struggle. Things like creating models, sprites, music, levels, animations, etc. take up so much more of my time. I feel like I&apos;m one guy trying to play every instrument at the same time while performing &lt;a href=&quot;https://www.youtube.com/watch?v=IvrzJ8uH1PI&quot;&gt;Beethoven&apos;s 5th&lt;/a&gt;. I&apos;m struggling with it, but I know it will become easier over time the more I do it. Props to people like &lt;a href=&quot;https://en.wikipedia.org/wiki/Eric_Barone_(developer)&quot;&gt;ConcernedApe&lt;/a&gt; and &lt;a href=&quot;https://en.wikipedia.org/wiki/Toby_Fox&quot;&gt;Toby Fox&lt;/a&gt; that can evidently do it all.&lt;/p&gt;
&lt;h2&gt;The Courses&lt;/h2&gt;
&lt;h3&gt;The Good&lt;/h3&gt;
&lt;p&gt;Let&apos;s start with the good stuff. I really like the length of the courses. All of them were roughly an hour long in terms of video length. Of course, you have to pause and go back while watching them, as you would for any course I imagine. So the hour runtime doesn&apos;t really tell the full story here. Rather, I think the condensed nature of them helped make things much more digestible, even if it may have sacrificed a bit of substance. Everything was explained well, at least, to me. I had no trouble following along at any point during my time with the courses. Completing everything gave me the confidence to go out and try new things. Having this kind of course structure helped start me in the right direction, so I&apos;m excited for the next step of my journey.&lt;/p&gt;
&lt;h3&gt;The Bad&lt;/h3&gt;
&lt;p&gt;There&apos;s an opposite end to everything. For every good, a bad. For every yin, a yang. Likewise here, there are some spots that stand out. For one, why did we never discuss creating a pause menu? I feel like that&apos;s something in every game. It&apos;s essential to the user experience. Of course, I went out to YouTube to find a few videos to help explain how to create one. I can&apos;t just &lt;em&gt;not&lt;/em&gt; know something so essential, but I ran into the same situations I&apos;ve ran into before when using YouTube for essential knowledge. Each video I watched showed a completely different way to implement it. Now, I know, as a seasoned coder, there&apos;s more than one way to code a cat, but I&apos;d rather do it the &lt;a href=&quot;https://www.geeksforgeeks.org/gang-of-four-gof-design-patterns/#&quot;&gt;Gang of Four&lt;/a&gt; way than the &lt;a href=&quot;https://i.redd.it/kaw54c8g7hx71.jpg&quot;&gt;YandereDev&lt;/a&gt; way. If I&apos;m a newbie to this, how am I supposed to know which is which? I ended up going with the way &lt;em&gt;I&lt;/em&gt; thought was most easy/intuitive, but I could have screwed up. I&apos;m obsessed with best practices, and I feel icky if I don&apos;t follow them. Speaking of best practices...&lt;/p&gt;
&lt;h3&gt;The Ugly&lt;/h3&gt;
&lt;p&gt;Let me preface this by saying a couple of things. 1) I know this is a beginner&apos;s course, so following all of the design patterns may be a bit overwhelming or unnecessary. 2) I&apos;m well aware (at least after 10+ hours) that GDScript may not (easily) allow us to implement and utilize some of these design patterns (see &lt;a href=&quot;https://github.com/dually8/godot-projects/tree/main/StrategyGame/Scripts&quot;&gt;this entire Scripts folder&lt;/a&gt;). But &lt;em&gt;oh my god&lt;/em&gt; was this painful. Why are these functions &lt;em&gt;so long&lt;/em&gt;? Why is there no separations of concern? Why are there so many nested if statements? &lt;em&gt;Surely&lt;/em&gt; there are better ways out there! I did my best during these courses to right the wrongs I felt were being inflicted, but I could only do so much with my limited knowledge. I&apos;m glad I have an engineering background, otherwise this code would look much worse. I ended up buying two books in the middle of taking these courses. One was &lt;a href=&quot;http://gameprogrammingpatterns.com/&quot;&gt;Game Programming Patterns&lt;/a&gt; and another was &lt;a href=&quot;https://www.amazon.com/dp/B0BZDMM3P9/&quot;&gt;Godot 4 Game Development Cookbook&lt;/a&gt;. I haven&apos;t gone through either of these yet, but just skimming them told me that I&apos;d be in a better spot if I gave them a proper read. For the last course I went through, I downloaded the .NET build of Godot so I could code in C#. I thought, perhaps if I have a more structured and statictly typed language, I could do better. Granted, I don&apos;t have the time with this build that I do with regular ol&apos; GDScript, but I immediately felt more at home while coding. I knew I had the tools available to me to 1) write unit tests, and 2) &lt;em&gt;create interfaces&lt;/em&gt;. Oh my lord! How novel! Interfaces! Regardless of what language these new books throw at me, I at least have the ability to translate them now. My one piece of feedback for these Godot courses is just this: please don&apos;t sacrifice best practices for time&apos;s sake. It&apos;s just going to hurt us all in the long run.&lt;/p&gt;
&lt;h2&gt;Next Steps&lt;/h2&gt;
&lt;p&gt;Okay, so now what? I&apos;ve finished the courses, but I&apos;m left wondering what exactly to do next. I have some ideas, but I&apos;m not 100% sure where to start. Perhaps I&apos;ll take a look at these books I have now and focus on that? But I also don&apos;t want to accidentally lose what I learned during these courses. I think I&apos;m going to have to split my time between the cookbook and just making something on my own. My initial idea is to re-create a level from an NES game (perhaps Castlevania?), but I&apos;m not 100% certain. I&apos;ll continue to use the &lt;a href=&quot;https://github.com/dually8/godot-projects&quot;&gt;monorepo&lt;/a&gt; for this work so you can follow along. I need help, though. I&apos;m not an artist, and I&apos;m not a designer by any stretch of the imagination. I&apos;m not what you&apos;d call an &quot;ideas guy&quot;. I&apos;m a worker bee, and I do the work (programming in this situation). Let me know your ideas. Please either leave me a comment below or &lt;a href=&quot;https://github.com/dually8/godot-projects/issues/new&quot;&gt;open an issue&lt;/a&gt; with your request on GitHub. I want to hear it.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I&apos;m glad I took these courses. They&apos;ve help push me forward on this journey. I regret nothing. But, it&apos;s time to put this axe to the grind. I want to get better at this because this is important to me. &lt;a href=&quot;https://en.wikipedia.org/wiki/Shigeru_Miyamoto&quot;&gt;Shigeru Miyamoto&lt;/a&gt; was my first hero as a kid. I remember so vividly learning about him while reading &lt;a href=&quot;https://en.wikipedia.org/wiki/Nintendo_Power&quot;&gt;Nintendo Power Magazine&lt;/a&gt; back in 1998. All I knew at the time was that he made my favorite games, and I wanted to do what he did. I know I&apos;ll never reach his or his contemporaries&apos; level, but it&apos;s something to reach for. Thank you for taking the time to read this. Please feel free to leave a comment below. I&apos;d love to hear your thoughts. Take care ✌.&lt;/p&gt;
&lt;h2&gt;Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://godotengine.org/&quot;&gt;Godot Game Engine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://academy.zenva.com/course/humble-godot-2023-bundle-tier-3/&quot;&gt;Course List&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/dually8/godot-projects&quot;&gt;My Godot Projects Monorepo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>godot</category><category>devlog</category><author>CJ Coffey</author></item><item><title>Dev Log Series Part 2</title><link>https://cjcoffey.com/posts/devlog-series-part-2/</link><guid isPermaLink="true">https://cjcoffey.com/posts/devlog-series-part-2/</guid><pubDate>Tue, 17 Oct 2023 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;Nut up, or shut up&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tallahassee&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;It&apos;s time to nut up or shut up about wanting to be a game developer. This time, I mean it.&lt;/p&gt;
&lt;h2&gt;Again, with this?&lt;/h2&gt;
&lt;p&gt;Boy, oh boy, I&apos;m bad at this blogging thing. I&apos;ve been seeing a lot of bits online (read: Instagram Reels, TikToks, YouTube Shorts, etc.) about ADHD and they need to stop being so relatable, or else I&apos;m going to have to go see a specialist. Anyway, I&apos;ve been busy moving into a new house (see &lt;a href=&quot;/posts/devlog-series-part-1&quot;&gt;Dev Log 1&lt;/a&gt;) among other things as of late, and I&apos;ve finally had a chance to write again.&lt;/p&gt;
&lt;p&gt;Recently, I&apos;ve been thinking about &lt;em&gt;why&lt;/em&gt; I got into software development in the first place. I believe it all started back in 1998 with the release of &lt;a href=&quot;https://en.wikipedia.org/wiki/The_Legend_of_Zelda%3A_Ocarina_of_Time&quot;&gt;The Legend of Zelda: Ocarina of Time&lt;/a&gt;. Now, as a child with all of the free time in the world, I had played plenty of video games before then. Something &lt;a href=&quot;https://www.urbandictionary.com/define.php?term=Hits+different&quot;&gt;hit different&lt;/a&gt; about this one. It inspired 9 year old me to want to make incredible experiences like it. I had no idea what kind of career that was at the time, but I knew I wanted to do it as an adult. I remember asking my cousin, who was only a few years older than me, what job that was. He said, &quot;Video Game Artist&quot;. So, for the next several years (until I found out that &quot;Game Programmer&quot; was the title I was looking for), I focused on learning what that meant and what I had to do to get there.&lt;/p&gt;
&lt;p&gt;When I was around 10 years old, my dad bought me a few materials to help me learn &lt;a href=&quot;https://en.wikipedia.org/wiki/BASIC&quot;&gt;BASIC&lt;/a&gt;. I remember making a couple of programs with it, but I think I was just too young at the time to really grasp what was happening. Later, in high school, I took the one and only programming class the school has ever had and might ever have. It was taught by my band director at the time, who also coded a bit on the side. He taught C++ that semester, and I fell in love immediately. It was the only course I could focus on. I remember struggling to make a hangman game for one of the assignments. It took a lot of blood, sweat, and tears to get that working, but after I finally did get it to work, I was filled with my first hit of programming ecstasy. For my final in that class, I ended up coding a &lt;a href=&quot;https://en.wikipedia.org/wiki/1941:_Counter_Attack&quot;&gt;1941-like&lt;/a&gt; game. It was buggy as all hell, but it worked well enough to get me an A in the class. I&apos;ll never forget my teacher telling me that I was &quot;good at this&quot; during one of the lessons. It cemented the fact that I&apos;d be programming for a living (which is true).&lt;/p&gt;
&lt;p&gt;So, fast-forward to now. What happened? I have, of course, dabbled in game dev since then. I&apos;ve made my own World of Warcraft server as a teen. I&apos;ve modded Battlefield 2. I&apos;ve made a map in Counter-Strike a time or two. I&apos;ve done countless tutorials and courses online to make my own game and get started as a game developer, but it just hasn&apos;t happened. Perhaps that&apos;s partially due to me not knowing that being a single-person dev team means I have to do &lt;em&gt;everything&lt;/em&gt;. From coding (the part I love) to making 3D models, materials, pixel art, music, etc. (the part I don&apos;t dislike, but holy hell am I bad at). I got discouraged time and time again. Nowadays, I&apos;m a front-end web developer. Not to brag, but I&apos;m told I&apos;m very good at it. It&apos;s encouraging and rewarding to see 9+ years of doing this kind of work to be met with such high regard. But it&apos;s not what I want to do forever.&lt;/p&gt;
&lt;p&gt;What makes this time different? For starters, I&apos;m not going anywhere anytime soon. I&apos;ve moved into my forever home and this is where my family and I are going to stay. I feel like my employment is also stable, where it wasn&apos;t before. Perhaps that&apos;s due to being in the private sector, perhaps that&apos;s due to having more experience under my belt? Who knows? One of the biggest driving factors this time is, I&apos;ve had enough of not chasing my dreams. For too long I&apos;ve just been surviving, and I want more than that now. I talked with one of my good friends about everything, and he mentioned a course bundle to get acquainted with the &lt;a href=&quot;https://godotengine.org/&quot;&gt;Godot&lt;/a&gt; game engine. We both bought it and are making our way through it. I think it helps to have a buddy stand by me this time. It&apos;s both motivating and it helps keep me accountable and disciplined. I&apos;m enjoying everything so far. I&apos;ve been waking up earlier than usual to try and get in an hour of quiet, learning time, since that&apos;s hard to come by later in the day and evening. My goal at the end of this is to re-create a level from one of my favorite games. My longer term goal is to eventually make my own game and get into the industry. For now, though, I think mini-projects to get acquainted with the engine and game dev in general is the way to go. I&apos;m going to be putting all of my Godot projects into a monorepo that you&apos;re welcome to follow.&lt;/p&gt;
&lt;p&gt;Thanks for taking the time to read this. If you have any tips for me, feel free to reach out via &lt;a href=&quot;https://github.com/dually8&quot;&gt;GitHub&lt;/a&gt; or the comments below.&lt;/p&gt;
&lt;h3&gt;Update from Dev Log 1&lt;/h3&gt;
&lt;p&gt;So, that Unreal Engine house thing never quite took off. I got decently far in it, but holy hell is working with lighting optimization difficult when you don&apos;t know what you&apos;re doing. So many things went wrong with that, not to mention that trying to move to Unreal Engine 5 completely broke everything. Staying on UE4 made iterating unbearable since every time I made a change to the lighting, I had to wait a good 10 minutes for the level to re-build. I gave up after a while because I felt like I just couldn&apos;t win. Perhaps if I can get my hands on an RTX 4070 (or better), I&apos;ll revisit it sooner. Maybe I&apos;ll re-do the project in Godot? Right now, though, it&apos;s just another side project that never quite took off.&lt;/p&gt;
&lt;p&gt;I still plan on re-doing this site again with something like &lt;a href=&quot;https://docs.astro.build/en/getting-started/&quot;&gt;Astro&lt;/a&gt;, but I haven&apos;t had the time to 1) Re-design my site (someone send me a good Figma tutorial), and 2) Learn Astro.&lt;/p&gt;
&lt;p&gt;Thanks again for reading. Links to neat things are at the bottom.&lt;/p&gt;
&lt;h2&gt;Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://godotengine.org/&quot;&gt;Godot Game Engine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/dually8/godot-projects&quot;&gt;My Godot Projects Monorepo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>godot</category><category>devlog</category><author>CJ Coffey</author></item><item><title>Games I Played in 2022</title><link>https://cjcoffey.com/posts/games-i-played-in-2022/</link><guid isPermaLink="true">https://cjcoffey.com/posts/games-i-played-in-2022/</guid><pubDate>Thu, 29 Dec 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Here we are. The end of another year. Unfortunately, I&apos;ve been sick for most of the past 2 months, so I haven&apos;t had a chance to get far enough ahead in my side projects to warrant another Dev Log. However, I did want to take a chance and talk about some video games. So, here&apos;s my year in gaming, in no particular order. This isn&apos;t an exhaustive list, but these are most of the games I&apos;ve played.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Persona 5 Royal (AGAIN)
&lt;ul&gt;
&lt;li&gt;What can I say? This is my favorite game of all time. I feel like I have to play through it once per year. I haven&apos;t beat it a third time yet, but I&apos;m about quarter of the way there as of the time of writing this. If you think you can spare a couple of months to play through this 100 hour journey, it&apos;ll be well worth it. I cannot recommend this game enough.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Soul Hackers 2
&lt;ul&gt;
&lt;li&gt;I haven&apos;t gotten around to finishing this game yet, but I&apos;ve been enjoying it quite a bit. The story is good enough to keep me interested and the characters (for the most part) are written well enough to make me care about them, especially the protagonist. I&apos;m really glad that the protagonist isn&apos;t silent and has a personality here. Not that there&apos;s anything wrong with a silent protagonist, but I feel like it wouldn&apos;t suit this game. Ringo is too cheeky and fun to keep silent.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Final Fantasy VIII
&lt;ul&gt;
&lt;li&gt;I finally got around to beating this game that I had delayed beating since 1999. This game holds a very special place in my heart as its atmosphere and music gave me great comfort during some perilous times growing up. I&apos;m a sucker for love stories, and this one does it so well.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Phasmophobia
&lt;ul&gt;
&lt;li&gt;I&apos;ve been playing this game since it released in 2020. It&apos;s gotten so much better, and I&apos;ve been so thrilled to be able to play it in VR this year (as I was gifted a VR headset the previous holiday season). It&apos;s one of my favorite multiplayer experiences out there. It&apos;s spooky enough to be thrilling, but not enough to be frightening and give you nightmares and such. There&apos;s enough jank in the game to make it unintentionally funny, which helps in that regard. 10/10, please play this.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Midnight Ghost Hunt
&lt;ul&gt;
&lt;li&gt;I was one of the lucky few that got an early alpha key to help test this game. Even then, it was incredibly good at its base. It just needed the time to get polished into what it is now. It&apos;s an incredibly fun multiplayer experience. It&apos;s ghostbusters meets prop hunt and it is an incredibly fun experience.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Turbo Golf Racing
&lt;ul&gt;
&lt;li&gt;I haven&apos;t play this game too much, but suffice to say, this is basically if Rocket League was car golf instead of soccer. It&apos;s a good time, for sure. I think given enough time, this game will become really solid as the base is already there for an enjoyable experience.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Guilty Gear Strive
&lt;ul&gt;
&lt;li&gt;When I first picked up this game, I wasn&apos;t all that into it. I think I just wasn&apos;t paying enough attention to the soundtrack, because, as someone in a youtube comment once wrote, &quot;This is a $60 soundtrack that comes with a game.&quot; And I couldn&apos;t agree more. My spotify wrapped had &lt;a href=&quot;https://music.youtube.com/watch?v=eC15R4HeqZc&amp;amp;list=OLAK5uy_nN4Fx0aAZ_Sfr5qGnIwzIcvk2P5a0OT24&quot;&gt;&lt;em&gt;Find Your One Way&lt;/em&gt;&lt;/a&gt; as number #1 this year. I came back to the game after listening to the music some more, and I&apos;m glad I did. I think it&apos;s hard to start any new fighting game, especially when there are so many characters to pick from and you don&apos;t know where to start. I should have just started with Sol Badguy from the beginning. Best track on the soundtrack, and best rush down character to play in the whole game. I can&apos;t get enough of it. And when they introduced Bridget, I fell in love with the game again. I hate playing zoners in fighting games, but she just feels so fresh and easy to play, it was a blast. Even if you don&apos;t play this game, at least give the soundtrack a listen. You won&apos;t regret it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;DNF Duel
&lt;ul&gt;
&lt;li&gt;I was lucky enough to play the open beta for this earlier this year, and, while I hated that I couldn&apos;t get a good feel for it, I felt like I would like it. I&apos;m glad I didn&apos;t hesistate to pick it up once it released. This is a terrific fighting game, especially for beginners. I would say it&apos;s combo focused, but those combos are more so about figuring out which of your characters moves chain into one another, instead of that &lt;em&gt;plus&lt;/em&gt; mastering the execution of the moves. All of the moves in this game are performed by a simple button press and a direction (like Smash Bros), so you don&apos;t have to worry about crazy directional inputs (I&apos;m looking at you, King of Fighters).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Monster Hunter Rise: Sunbreak
&lt;ul&gt;
&lt;li&gt;I played a ton of the base game last year. Early this year, the Sunbreak expansion launched. It has been a really enjoyable experience. I probably sunk around 40 hours or so in the expansion alone with some monster hunting buddies. This is the best game in the series, in my opinion. There&apos;s a ton of fun to be had here, and the movement options give you so much more freedom than ever before. Also, Monster Hunter has dogs now. What&apos;s not to love?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Persona 4 Arena Ultimax
&lt;ul&gt;
&lt;li&gt;Okay, I&apos;ve been on a fighting game kick this year (as well as a JRPG one). Sue me. This is another Arc System Works fighting game. They never miss, &lt;em&gt;plus&lt;/em&gt; you get to play as Chie. I couldn&apos;t pass it up.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;V Rising
&lt;ul&gt;
&lt;li&gt;I&apos;m not big on survival games, but I did enjoy my time with this one. It&apos;s got some neat mechanics behind it. I haven&apos;t played it since around June/July this year, so perhaps there&apos;s more to love about this game now, but I think it has a little bit of a ways to go before this one is solid. I think its base is there, but I&apos;d like to see some more content, specifically around combat before I pick this up again.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Teenage Mutant Ninja Turtles: Shredder&apos;s Revenge
&lt;ul&gt;
&lt;li&gt;This may be my game of the year this year. You know what? It is. Congrats Tribute Games/Dotemu! You win! This game hit all of the marks for me. 10/10 Soundtrack (bless you Tee Lopes). 10/10 Gameplay. 10/10 Multiplayer experience. 10/10 Nostalgia. I bought the original soundtrack (OST) on bandcamp I loved it so much. I played through this several times with different groups of friends and even with my wife. We all had a blast leveling up characters and unlocking new ones along the way. Beat-em-ups are my favorite genre of braindead gaming. This one is at the top of the list of my go-to games when I just want to button mash and turn my brain off for a couple of hours. 10/10 game. Cannot recommend this enough.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Persona 4 Golden
&lt;ul&gt;
&lt;li&gt;This may be blasphemy to some, but this is my least favorite Persona game that I&apos;ve played (out of 3 FES, 4 Golden, 5, 5 Royal). No game should need 20 hours to build up into a good game, but that&apos;s what this one does. There&apos;s &lt;em&gt;a lot&lt;/em&gt; of tutorial to get through before you get to the meat and potatoes of this game. &lt;strong&gt;&lt;em&gt;BUT&lt;/em&gt;&lt;/strong&gt;, once you get there, wooooo boyyyyy it&apos;s good. Just because this is my least favorite Persona game doesn&apos;t mean this is a bad game by any means. It&apos;s a terrific game with fantastic writing and memorable characters. It gives you this feeling of nostalgia even if you&apos;ve never played it before. The time in high school feels more personal to me here than any of the other Persona games because it takes place in a small town similar to the one I grew up in. The relationships are more intimate here than a lot of the other relationships in the other Persona games I played. I just hate that it takes so long to get to Kanji, because he absolutely carries this game. Please, if you plan on playing this game, give it some time to set in, because it gets good. I promise. Though, I do hate that it takes forever getting there.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Pavlov VR
&lt;ul&gt;
&lt;li&gt;I had, probably, way too much fun playing this game. I liken this game to Minecraft in the sense that we&apos;ve been given a sandbox, now it&apos;s up to the community to build the &lt;em&gt;really&lt;/em&gt; amazing stuff. I played through Super Mario 64 with a friend in this game. There were zombies (for some reason), King Bob-ombs, and baby penguins. It was ridiculous. This is &lt;em&gt;the&lt;/em&gt; VR game to get if you pick up a VR headset.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Synth Riders
&lt;ul&gt;
&lt;li&gt;VR games generally fall into one of two categories: music game, or shooting game. The medium works so well for those things. This one falls into the former category. Synth Riders has a great soundtrack for you retrowave/synthwave fans out there (see also: me). It&apos;s the only VR game that has caused me to sweat, so there&apos;s also that. Games like this really give you an unintentional work out. If you&apos;re picking up a VR music game, pick up this one or the next one on this list.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Beat Saber
&lt;ul&gt;
&lt;li&gt;Another VR music game. Possibly the OG? I don&apos;t know for certain and I&apos;m too lazy to look it up, but it certainly feels like this was the VR music/rhythm game that everyone was talking about at one point. You can&apos;t go wrong picking this one up.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Audica
&lt;ul&gt;
&lt;li&gt;What happens when you combine the two VR game categories? You get Audica! In Audica, you shoot the targets in rhythm with the song. I found this one to be more difficult than Synth Riders and Beat Saber, but it was still enjoyable.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Walkabout Mini Golf
&lt;ul&gt;
&lt;li&gt;This falls outside of the typical VR game category, but this might be my favorite VR experience (at least, outside of Pavlov...I guess it depends on the day/mood). This is such a nice and relaxing VR experience. The mini golfing here feels really natural, and the multiplayer experience is terrific. There&apos;s a bunch of levels to play and each level has a hidden ball on each hole. It&apos;s a fun way to mix up the typical game experience by adding in that little scavenger hunt in the middle of it. 10/10 VR game. This should be one of your first purchases if you&apos;re getting into VR gaming.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Forza Horizon 5
&lt;ul&gt;
&lt;li&gt;There&apos;s no reason for me to enjoy this game so much, but I do. I really really love playing this game. It&apos;s not particularly exciting, but the atmosphere and the gorgeous visuals keep me coming back to it. It&apos;s a beautiful game with a fun, relaxing atmosphere. It&apos;s also made me really want a new Ford Bronco, but I could never bring myself to buy a non-electric car these days, especially since the Bronco only gets like 20 MPG or something crazy low like that. At least I can drive it guilt free here 🙃.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;PowerWash Simulator
&lt;ul&gt;
&lt;li&gt;This game is dumb. There&apos;s no reason for this to be as much fun as it is. Why do I enjoy doing chores in a video game? Make it make sense.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Skul: The Hero Slayer
&lt;ul&gt;
&lt;li&gt;I haven&apos;t gotten to play much of this game yet, but what I have played has been a blast. It doesn&apos;t take itself too seriously and the combat is solid. It feels hard, but fair. I should really play more of it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;MultiVerses
&lt;ul&gt;
&lt;li&gt;This has been hit and miss with me. Every time a new platform fighter (read: Smash clone) hits the digital shelves, it&apos;s plastered all over YouTube with clickbait thumbnails that say something like &lt;em&gt;SMASH KILLER?!?!&lt;/em&gt;. No. It&apos;s not Smash. Nothing will ever be Smash. Super Smash Bros will always be the best in its class. Full stop. Having said that, there is some fun to be had in this game. Like any other fighting game, it takes awhile to find &lt;em&gt;your&lt;/em&gt; character: the one that feels best to you. Since it&apos;s free-to-play, there&apos;s a lot of BS to overcome if you want to unlock characters.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Pokemon Scarlet
&lt;ul&gt;
&lt;li&gt;I hate that I like this garbage game as much as I do. GameFreak knows they just have to appeal to my childhood and they&apos;ll win another sale. This game is ugly. It runs like complete ass in molasses, but I couldn&apos;t put it down. I played through the entire thing. I can&apos;t tell you why. Maybe something about collect-a-thons really gets me going? I can&apos;t tell. Gotta catch &apos;em all, I suppose.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Castlevania: Aria of Sorrow
&lt;ul&gt;
&lt;li&gt;The Castlevania games on the Game Boy Advance are the best Castlevania games, in my opinion. Aria of Sorrow is regarded as being the best of those. I can&apos;t decide, myself. They&apos;re all so terrific in their own way. I enjoy mixing up the weaponry in this one though, plus the music is fantastic. I haven&apos;t finished it yet, but it&apos;s on my to-do list.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Final Fantasy XV
&lt;ul&gt;
&lt;li&gt;I only recently started playing this one, and then I got sick, so I haven&apos;t played it since. I have maybe 3-4 hours in it. It looks absolutely gorgeous, but I can&apos;t help but feel out of place with this Final Fantasy. I don&apos;t know if it&apos;s because it&apos;s more hack-and-slash than turn based, but something is just throwing me for a loop in this game. I enjoy it, but it doesn&apos;t quite feel &lt;em&gt;Final Fantasy&lt;/em&gt; to me.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Warhammer 40,000: Darktide
&lt;ul&gt;
&lt;li&gt;This game is just dumb fun. If you like excessive blood and gore and such, then this is the game for you. It&apos;s like if Kill Bill met Lord of the Rings. It&apos;s ridiculous in ever aspect, and it&apos;s unabashedly gothic. Great multiplayer experience. Just hope that you don&apos;t run into any &quot;infinite hoard&quot; glitches like me and my buddies ran into one night. It was hilarious, but, man, I hated losing all of that gold and exp lol.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Kirby and the Forgotten Land
&lt;ul&gt;
&lt;li&gt;This is definitely my wife&apos;s game of the year. We played through the entire game together, and it was so much fun. The multiplayer leaves a bit to be desired since, you&apos;ll just get teleported to Kirby at random, it seems. If you can get passed that, or if you&apos;re just going to play this single player, I can&apos;t recommend it enough. This is the best Kirby game yet.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;What were some of the games you played this year? Let me know in the comments below! Thanks for reading!&lt;/p&gt;
</content:encoded><author>CJ Coffey</author></item><item><title>Top 5 Terminal Utilities</title><link>https://cjcoffey.com/posts/top-5-terminal-utils/</link><guid isPermaLink="true">https://cjcoffey.com/posts/top-5-terminal-utils/</guid><pubDate>Fri, 28 Oct 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Another easy post? Oh, certainly, but again, this information is important to retain.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/BurntSushi/ripgrep&quot;&gt;ripgrep&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;You have no idea (or maybe you do?) how useful this thing is. First of all, it&apos;s incredibly fast. I&apos;m sure this thing could find my birth certificate before I could find my glasses that are sitting on my face.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/helix-editor/helix&quot;&gt;helix&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;You ever want to use vim but you don&apos;t want to do the work of setting it up? Helix to the rescue! This is basically vim, but all the vundle stuff is taken care of for you. Plus, it&apos;s written in Rust and that&apos;s so hot right now. I feel like we should append that Jeff Atwood quote &quot;Any application that can be written in JavaScript, will eventually be written in JavaScript,&quot; with Rust as well since everyone and their mom is re-writing all of these C/C++ programs in it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Peltoche/lsd&quot;&gt;lsd&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Please bear with me on the name. It&apos;s just &lt;code&gt;ls&lt;/code&gt; &lt;em&gt;✨deluxe✨&lt;/em&gt;. Basically, the &lt;code&gt;ls&lt;/code&gt; command we all know and love, but it&apos;s fancy and has some nice icons and colors. Just be sure to install a &lt;a href=&quot;https://www.nerdfonts.com/&quot;&gt;nerd font&lt;/a&gt; along with it if you&apos;re going to use it.  My favorite is &lt;a href=&quot;https://github.com/ryanoasis/nerd-fonts/tree/master/patched-fonts/Hack&quot;&gt;Hack NF&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ohmyposh.dev/&quot;&gt;oh-my-posh&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;I like my terminals to have a bit more than just the regular ol&apos; &lt;code&gt;$ &lt;/code&gt; and blinking cursor. Oh My Posh gives a simple way to customize your terminal to your liking, displaying handy dandy info and such. Here&apos;s what mine looks like.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;/img/ohmyposh_example.png&quot; alt=&quot;oh my posh&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/tldr-pages/tldr&quot;&gt;tldr&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Remembering things is hard, and sometimes, &lt;code&gt;man&lt;/code&gt; pages can be a bit overwhelming. That&apos;s where &lt;code&gt;tldr&lt;/code&gt; comes in. This community run utility has examples of all of the command line tools I&apos;ve ever come across. It makes it really easy to get started with a new utility, and it gives a really nice, concise reminder for anything you may have forgotten.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;What are some of your favorite terminal utilities? Let me know in the comments below. Thanks for reading!&lt;/p&gt;
</content:encoded><category>bash</category><category>favorites</category><category>fish</category><category>powershell</category><category>pwsh</category><category>terminal</category><category>utilities</category><category>zsh</category><author>CJ Coffey</author></item><item><title>How I Stay Up to Date</title><link>https://cjcoffey.com/posts/how-i-stay-up-to-date/</link><guid isPermaLink="true">https://cjcoffey.com/posts/how-i-stay-up-to-date/</guid><pubDate>Thu, 27 Oct 2022 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;This was last updated on March 28, 2025. I&apos;ve kept the old post in a collapsed section in case you wanted to see the previous version.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Technology is an industry much like medicine. If you&apos;re not constantly learning, you&apos;re falling behind and potentially causing harm to your customers/patients. As a software engineer, there are a handful of things I do to try and stay up-to-date with tech and trends in the industry.&lt;/p&gt;
&lt;h2&gt;YouTube&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Update: I want to point out that the old list isn&apos;t outdated, per se, but I did want to highlight the channels that have taken more of my time and attention over the past couple of years.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is probably the biggest and easiest one to do, though, you&apos;ll need to find &quot;your people&quot;. I subscribe to a few channels that are either generic in their software content, or highly focused.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/@syntaxfm&quot;&gt;Syntax&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Level Up Tutorials is now the Syntax podcast and channel. I listen to this podcast weekly to help stay up-to-date on various front-end development trends and other happenings in the tech space. I really enjoy the podcasts where they bring in guests, such as the &lt;a href=&quot;https://www.youtube.com/watch?v=0meKcaebg38&quot;&gt;one with Paulus Schouten of Home Assistant&lt;/a&gt;. More recently, they&apos;ve added CJ from &lt;a href=&quot;https://www.youtube.com/@CodingGarden&quot;&gt;Coding Garden&lt;/a&gt; to their roster, and he&apos;s been putting out some great videos as well. Scott, from Level Up, has moved his course content over to &lt;a href=&quot;https://levelup.video/&quot;&gt;levelup.video&lt;/a&gt;, though, many of his old videos still remain on the new channel. I like that all of the Sketch and React videos I watched back in 2016 are still available.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/@jherr&quot;&gt;Jack Herrington&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Jack, the Blue Collar Coder. What I like about Jack is his ability to simplify new tech and break it down into its most basic components. He does a great job of providing examples and explaining all of the bits and pieces you need to know in order to get started with the latest and greatest in the web dev space. More recently, he&apos;s put out some terrific videos on things like &lt;a href=&quot;https://www.youtube.com/watch?v=eD0uBLr-eP8&quot;&gt;MCP&lt;/a&gt; and &lt;a href=&quot;https://www.youtube.com/watch?v=mLaemfS3TCg&quot;&gt;create-tsrouter-app&lt;/a&gt; (of which he is a maintainer/contributor).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/@codetv-dev&quot;&gt;CodeTV (formerly Learn With Jason)&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;I first stumbled upon this channel when &lt;a href=&quot;https://www.youtube.com/watch?v=8RCL5neas_M&quot;&gt;this video&lt;/a&gt; popped up on my YouTube recommended. Our friend Jack Herrington is part of a Web Dev Challenge where 4 web developers have to build an AI-powered app that&apos;s not &quot;another effin&apos; chatbot&quot;. It was really cool to watch, so, of course, I binged all of the &lt;a href=&quot;https://www.youtube.com/playlist?list=PLz8Iz-Fnk_eTkZvSNWXW_TKZ2UwVirT2M&quot;&gt;other episodes in the series&lt;/a&gt; and then I went on to the &lt;a href=&quot;https://www.youtube.com/playlist?list=PLz8Iz-Fnk_eRtJeLjx9CxPQw6MzbDgaEu&quot;&gt;4 Web Devs, 1 App Idea&lt;/a&gt; series, and now I&apos;m going through the &lt;a href=&quot;https://www.youtube.com/playlist?list=PLz8Iz-Fnk_eQwPfZx8lixhpBg22KCCZzo&quot;&gt;Leet Heat&lt;/a&gt; gameshow. It&apos;s really fun to watch. I highly recommend checking them out.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;Click to expand the original post&apos;s contents&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/c/Fireship&quot;&gt;Fireship&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;This is by far my favorite dev channel on YouTube. The &lt;a href=&quot;https://www.youtube.com/playlist?list=PL0vfts4VzfNiI1BsIK5u7LpPaIDKMJIDN&quot;&gt;&lt;em&gt;in 100 Seconds&lt;/em&gt;&lt;/a&gt; series is fantastic and has personally helped me discover new tech and got me interested in trying new things. They also have a handful of tutorials that are easy to follow. They recently started a new series, &lt;a href=&quot;https://www.youtube.com/playlist?list=PL0vfts4VzfNjnYhJMfTulea5McZbQLM7G&quot;&gt;&lt;em&gt;The Code Report&lt;/em&gt;&lt;/a&gt; that I highly recommend. It&apos;s both entertaining and thought-provoking.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/c/AliSpittelDev&quot;&gt;Ali Spittel&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Ali&apos;s channel is a terrific resource if you&apos;re getting started in frontend development. Her tutorials are easy to follow, and I feel like they&apos;re really good &quot;real world&quot; type apps, unlike a lot of tutorial fluff you see out there. She has an accompanying blog post for all of her videos &lt;a href=&quot;https://welearncode.com/&quot;&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/c/LevelUpTuts&quot;&gt;LevelUpTuts&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;This channel is like if Fireship didn&apos;t have any jokes and did more, in-depth looks at different tech. This channel is how I learned how to use Sketch for UI/UX design when I was first starting out. Granted, I 1) No longer have a mac, and 2) Probably couldn&apos;t remember how to use Sketch at this point. At least I still remember the principles of design, and, you know, that&apos;s probably what really matters at the end of the day.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/c/ArjanCodes&quot;&gt;ArjanCodes&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Arjan was instrumental to me when I was learning Python. I like his style of videos, and he does a great job at explaining various concepts.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/c/ModernVintageGamer&quot;&gt;Modern Vintage Gamer&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;While this isn&apos;t a programming channel, per se, I love when he does deep dives into various game consoles&apos; development environments and such. Like when he &lt;a href=&quot;https://www.youtube.com/watch?v=zQE1K074v3s&quot;&gt;talked about how the Game Boy achieves a parallax effect&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;h2&gt;Blogs&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Update: I&apos;ve more so taken to subscribing to email lists over the past year or so, and I don&apos;t directly check blogs as much these days. I will say, I follow a lot of various developers on BlueSky, so that&apos;s mostly where I see if/when blogs are posted.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Blogs are a bit more difficult to keep up with because no one uses RSS readers anymore. Even still, there&apos;s a handful I check at least weekly to help stay up-to-date on things.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://syntax.fm/snackpack&quot;&gt;Syntax Snackpack&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Our friends at the Syntax podcast also put out a newsletter. I like that they include recommendations from each person on the team, as well as some sound bites from their podcast and other videos. They nailed it with the &quot;snack&quot; word because it&apos;s just a, if you&apos;ll pardon the pun, byte of information 😉.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://reactnewsletter.com/issues&quot;&gt;This Week In React&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;I&apos;ve been developing more in React as of late, so I figure getting on this newsletter was a no brainer. It&apos;s chock full of links to other blog posts, BlueSky (and the bad site) posts, videos, and more. I like that they include React Native in there as well. I&apos;m not currently using React Native, nor am I developing apps cross-platform in that way, but I&apos;m happy to see what all is going on in that space these days.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bytes.dev/archives&quot;&gt;Bytes&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;This one is really nice because 1) its tone is about as casual as mine (which I like), and 2) every post has a fun little bug to solve. They&apos;re usually not too difficult, but I think that&apos;s part of the fun. Just get your brain working a little in the morning, ya know? Also, I really like the design of this site. Its use of color pops, in my eyes, and it&apos;s just all around aesthetically pleasing.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;Click to expand the original post&apos;s contents&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://www.hanselman.com/blog/&quot;&gt;Scott Hanselmann&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;If you&apos;re in software development for more than a few months, you know about Scott Hanselmann. He&apos;s practically a celebrity in the tech space, and his blog and YouTube channel make it very apparent &lt;em&gt;why&lt;/em&gt;. He has posts and videos on a wide variety of topics, and he&apos;s able to distill them down into something that&apos;s both sugar-free and digestible.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/&quot;&gt;Dev.to&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;This is a great place to see trends in the market. Anyone with an account can share anything here, which can be a blessing and a curse, though, I think it&apos;s healthy to have a wide range of thoughts and opinions so that we can discuss and debate them.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.alvinashcraft.com/&quot;&gt;Morning Dew&lt;/a&gt;/&lt;a href=&quot;https://blog.cwa.me.uk/&quot;&gt;Morning Brew&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Both of these sites don&apos;t host any posts themselves, rather, they list a ton of other recent blog posts, podcasts, videos, etc. I find it helpful to check both of these out every morning rather than try and hunt down something useful somewhere else. It&apos;s a nice, curated collection of things for me.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;h2&gt;GitHub&lt;/h2&gt;
&lt;p&gt;Last but not least, the &lt;a href=&quot;https://github.com/trending&quot;&gt;GitHub trending page&lt;/a&gt;. &lt;s&gt;It makes me sad that this one will be going away soon, because it&apos;s probably my most used resource.&lt;/s&gt; (UPDATE: They never removed it 😊) Basically, GitHub tracks how many stars (think &quot;likes&quot;) have been given to a repo, and they show you the most starred repos for the day. I find it extremely helpful to see what other developers in the open source community are gravitating towards in a given week. It lets me know what tech I should try out and experiment with.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;These are the resources I use to help stay up-to-date. What about you? How do you stay up-to-date with things as a developer? Anything I should check out that I haven&apos;t listed here? Let me know in the comments below. Hope you all have a terrific day! ✌&lt;/p&gt;
</content:encoded><author>CJ Coffey</author></item><item><title>Top 5 Visual Studio Code Extensions</title><link>https://cjcoffey.com/posts/top-5-vscode-extensions/</link><guid isPermaLink="true">https://cjcoffey.com/posts/top-5-vscode-extensions/</guid><pubDate>Tue, 11 Oct 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Is this an easy post to make? Sure, but it&apos;s an important one, especially if my &lt;a href=&quot;https://youtu.be/DJm276wNNC4?t=479&quot;&gt;mind eraser frog&lt;/a&gt; is used against me.&lt;/p&gt;
&lt;p&gt;Anyways, here&apos;s a list of my favorite VSCode extensions.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=christian-kohler.path-intellisense&quot;&gt;Path intellisense&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;This is so incredibly handy. I mean, all of them are, but still. It&apos;s hard to remember paths, so this is a must have anytime I&apos;m having to &lt;code&gt;import {something} from &apos;some/path&apos;&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=formulahendry.code-runner&quot;&gt;Code Runner&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Ever since I found this, I basically never use codepen or anything similar. I&apos;m always trying out things in JS before implementing anything in any actual project. This is &lt;em&gt;way&lt;/em&gt; easier than making a dummy node project and running it via the terminal. &lt;em&gt;So handy&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=wmaurer.change-case&quot;&gt;change-case&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;I use this way more than I care to admit. I don&apos;t &lt;em&gt;exactly&lt;/em&gt; know why, but I just happen to come across a lot of stuff in PascalCase that should be camelCase or vice versa. This handy tool allows me to highlight all of the offenders and change them easily.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=oouo-diogo-perdigao.docthis&quot;&gt;Document This&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;I have a secret. I&apos;m a developer that likes documentation. This extension helps me document my functions and such quickly and easily. No maintenance programmer ever complained about too much documentation, and we love our maintenance programmers. 🙏 You all are doing the lord&apos;s work.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=oderwat.indent-rainbow&quot;&gt;Indent rainbow&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Tabs or spaces? Just kidding, I don&apos;t want to start World War 3 here. However, whether you use one, the other, or both, this extension lets you see how far down the rabbit hole you&apos;ve gone at a glance. It&apos;s especially handy when you&apos;re 3000+ lines and 4 nested objects deep in a JSON file.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Honorable mentions&lt;/h2&gt;
&lt;p&gt;Here&apos;s a few that I use, but if I was on a stranded dev box without these, I could survive...I just wouldn&apos;t like it as much.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=jakob101.RelativePath&quot;&gt;Relative path&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;This is super helpful if you haven&apos;t setup your tsconfig to use a baseUrl yet, which you should do, but I get it. Legacy projects exist sometimes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=vivaxy.vscode-conventional-commits&quot;&gt;Conventional commits&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;I was forced to use conventional commits at a previous job. At first, I &lt;em&gt;hated&lt;/em&gt; it, but over time, I grew to respect the process and madness. Conventional commits are so handy for organizing your commits, and change logs are a breeze now.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=wayou.vscode-todo-highlight&quot;&gt;TODO Highlight&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;This one and the next one help me locate messages from my past self easily. Ideas come while you&apos;re doing other things, so a quick &quot;TODO: Don&apos;t forget to do this!&quot; can go a long way in helping you remember various things, specifically refactors in my case.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=Gruntfuggly.todo-tree&quot;&gt;Todo tree&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;This is a nice side bar in VSCode that shows you all of your TODOs, and hopes and dreams you left behind in your codebase. Don&apos;t neglect them!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=dracula-theme.theme-dracula&quot;&gt;Dracula theme&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;I was chasing a good theme for a long time. Sometime in the mid 2010s I found my soulmate in the Dracula theme. My terminal, VSCode, JetBrains IDEs, and tons more are using this theme. It&apos;s widely available and, &lt;a href=&quot;https://draculatheme.com/&quot;&gt;thanks to the site&lt;/a&gt;, very easy to use in more than just your code editor.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What are some of your favorite VSCode extensions? Let me know in the comments below. Thanks for reading!&lt;/p&gt;
</content:encoded><category>vscode</category><category>extensions</category><category>favorites</category><author>CJ Coffey</author></item><item><title>Dev Log Series Part 1</title><link>https://cjcoffey.com/posts/devlog-series-part-1/</link><guid isPermaLink="true">https://cjcoffey.com/posts/devlog-series-part-1/</guid><pubDate>Sun, 09 Oct 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Welcome back, everyone. It&apos;s certainly be a minute. I apologize. I had all of the video games to play and blogging seemed like such a drag. I&apos;m back now, though, due to some inspiration given to me by my new manager at work. Let&apos;s talk about a few things.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I&apos;m not going to release any of the content from my previous post, if it was not already obvious. For what it&apos;s worth, I had some of the posts written out, but I never published them because I didn&apos;t think the work was good enough to publish.  Whether or not that&apos;s true or just my depression talking, who&apos;s to say?&lt;/li&gt;
&lt;li&gt;I have a couple of projects in the work, and I plan on posting more about those, &lt;em&gt;plus&lt;/em&gt; some hidden ✨bonus✨ content as well. I&apos;ll give you a taste below, but bare with me for the duration of these other bullet points.&lt;/li&gt;
&lt;li&gt;I&apos;ve re-done my site to use &lt;a href=&quot;https://gohugo.io/&quot;&gt;Hugo&lt;/a&gt; instead of &lt;a href=&quot;https://hexo.io/&quot;&gt;Hexo&lt;/a&gt;, and I may end up re-doing it again with &lt;a href=&quot;https://nextjs.org/learn/foundations/about-nextjs&quot;&gt;NextJS&lt;/a&gt; and/or &lt;a href=&quot;https://docs.astro.build/en/getting-started/&quot;&gt;Astro&lt;/a&gt;. Why? A couple of reasons:
&lt;ul&gt;
&lt;li&gt;The old site was &lt;em&gt;so&lt;/em&gt; 2016, and we&apos;ve had a pandemic since then, and I&apos;ve purchased a lot of more sweat pants since then.&lt;/li&gt;
&lt;li&gt;It was getting hard to maintain. Even though I didn&apos;t post anything, I&apos;d re-deploy the site every 6 months or so to keep the certificate fresh and everything. But the initial design and code was from 2016 and I couldn&apos;t be bothered to &lt;code&gt;npm audit&lt;/code&gt; that junk, so here I am.&lt;/li&gt;
&lt;li&gt;While this is still kind of &quot;the easy way out&quot; for creating a blog, I kind of wanted a fresh start without having to completely re-write everything. Having said that, Hugo feels like magic in the same way Hexo did, so I&apos;m going to eventually re-write this thing again so that this kind of stuff isn&apos;t so black boxed to me. (i.e., &lt;em&gt;Made with ❤ not 🪄&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Now on with the show&lt;/h2&gt;
&lt;p&gt;Okay, so here&apos;s the part you&apos;ve been waiting for. I&apos;ll first give a TLDR, then I&apos;ll post the stuff, then the long story below it. So, after the pictures, you can leave if you don&apos;t care about the full story.&lt;/p&gt;
&lt;p&gt;TLDR: I&apos;m having a house built and in the mean time, I&apos;m making it &quot;playable&quot; using &lt;a href=&quot;https://www.unrealengine.com/en-US/&quot;&gt;Unreal Engine 5&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/DevLog01/front_of_house.jpg&quot; alt=&quot;Front of the house&quot; /&gt;
Front of the house
&lt;img src=&quot;/img/DevLog01/front_of_house_render.png&quot; alt=&quot;Front of the house render&quot; /&gt;
Front of the house render
&lt;img src=&quot;/img/DevLog01/back_of_house.jpg&quot; alt=&quot;Back of the house&quot; /&gt;
Back of the house
&lt;img src=&quot;/img/DevLog01/back_of_house_render.png&quot; alt=&quot;Back of the house render&quot; /&gt;
Back of the house render
&lt;img src=&quot;/img/DevLog01/living_room.jpg&quot; alt=&quot;Living room&quot; /&gt;
Living room
&lt;img src=&quot;/img/DevLog01/living_room_render.png&quot; alt=&quot;Living room render&quot; /&gt;
Living room render
&lt;img src=&quot;/img/DevLog01/my_office.jpg&quot; alt=&quot;My office&quot; /&gt;
My office
&lt;img src=&quot;/img/DevLog01/my_office_render.png&quot; alt=&quot;My office render&quot; /&gt;
My office render
&lt;img src=&quot;/img/DevLog01/basement.jpg&quot; alt=&quot;Basement&quot; /&gt;
Basement
&lt;img src=&quot;/img/DevLog01/basement_render.png&quot; alt=&quot;Basement render&quot; /&gt;
Basement render&lt;/p&gt;
&lt;p&gt;So basically, here&apos;s the order of events.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pandemic hit, wife and I want to get out of the state&lt;/li&gt;
&lt;li&gt;We sell our house, &quot;move&quot; to VT&lt;/li&gt;
&lt;li&gt;We rent an AirBnB while trying to find a house or apartment for a month&lt;/li&gt;
&lt;li&gt;Literally nothing is available (wtf)&lt;/li&gt;
&lt;li&gt;We make the decision to move back to TN&lt;/li&gt;
&lt;li&gt;We look for houses for 2 months while living in an apartment&lt;/li&gt;
&lt;li&gt;Every house we get out bid and/or someone pays a million bucks in cash (wtf)&lt;/li&gt;
&lt;li&gt;We get tired of the rat race and decide, &quot;well, if we&apos;re going to be spending a bunch of money for a house, we might as well get our dream home&quot;&lt;/li&gt;
&lt;li&gt;We find a builder and a neighborhood and get started a few months later after meeting them&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After a few months of literally nothing happening with the house, we finally got the framing done and a roof. When the framing was going on, it inspired me to pick back up this project I started a few months prior, which was &quot;I want to be able to see my finished house &lt;em&gt;now&lt;/em&gt;.&quot; So that led me to asking the designer for the 3D model files so I can chuck that into unreal engine and make something out of it. I&apos;m roughly 75% done with it at this point, but as you know, that last 20-25% is the most amount of work. I&apos;m really proud of the progress I&apos;ve made, even though it runs like crap and doesn&apos;t &quot;play&quot; very well. I still learned &lt;em&gt;a lot&lt;/em&gt; working on it, and my wife seems to like it alright, so I can&apos;t complain too much.&lt;/p&gt;
&lt;p&gt;Anyways, thanks for reading if you got this far. I plan on posting some more dev logs about this project and a few more in the coming months. I hope you stick around for that. Take care ✌.&lt;/p&gt;
</content:encoded><category>unreal engine</category><category>devlog</category><author>CJ Coffey</author></item><item><title>Small Update</title><link>https://cjcoffey.com/posts/small-update/</link><guid isPermaLink="true">https://cjcoffey.com/posts/small-update/</guid><pubDate>Thu, 29 Jun 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I realize it&apos;s been almost a year since I&apos;ve posted anything on here, so I thought I&apos;d give a little bit of an update for any readers I may have.&lt;/p&gt;
&lt;p&gt;Late last year, I moved further away from the city because the area I was living in was infested with giant roaches. Earlier this year, I got engaged to my girlfriend of 5 years, and we&apos;re getting married this November. I also got a new puppy as well back in February. He&apos;s a ball of energy and taking up most of my time these days. So, basically, between having to drive an hour back and forth from work, plus new responsibilities, I haven&apos;t been able to do all the things I&apos;ve been wanting to do programming-wise. Having said all that, I&apos;m going to try and get back into the groove of things this summer since most things kind of die down during this time. Below is a list of stuff I&apos;m planning on doing/posting/etc. in the next few months.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Jenkins Build Server CI Tutorial&lt;/li&gt;
&lt;li&gt;React Native Getting Started
&lt;ul&gt;
&lt;li&gt;Possible touch on Redux as well&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Unit testing in React Native&lt;/li&gt;
&lt;li&gt;Update the Ionic 2 workshop to Ionic 3/Angular 4&lt;/li&gt;
&lt;li&gt;Update the Resume section of my site&lt;/li&gt;
&lt;li&gt;Re-style site&lt;/li&gt;
&lt;li&gt;???&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let me know in the comments below if there is anything else you&apos;d like to see. In the meantime, &lt;a href=&quot;http://imgur.com/a/MIyc0&quot;&gt;enjoy this imgur album of my new dog.&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>life</category><category>update</category><author>CJ Coffey</author></item><item><title>Let Me Gush About Gogs</title><link>https://cjcoffey.com/posts/letmegushaboutgogs/</link><guid isPermaLink="true">https://cjcoffey.com/posts/letmegushaboutgogs/</guid><description>I love this thing</description><pubDate>Thu, 20 Oct 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;So, fairly recently, I needed to mirror a private git repository from an external site to an internal site. I searched the interwebs far and wide to try and figure out the best way to do this. I thought, &quot;Perhaps I could just run a git instance on my team&apos;s build server? That way, the new guy can see the code until we get him the licenses he needs in order to use the external site.&quot; So, I scoured the net for the quickest or best way I could set up a git server. I looked at GitLab and a few other things around GitHub. I like GitLab. I use it for my own private repos, but the set up process seemed bulky for what I wanted. By all means, I would probably go that route if I needed something more scalable, but then I found &lt;a href=&quot;https://gogs.io/&quot;&gt;Gogs&lt;/a&gt; (or, Go Git Service). I fell in love immediately. I just downloaded the binary, put it on the build server, and ran &lt;code&gt;./gogs web&lt;/code&gt;. BOOM! Working git server for my company.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/LetMeGushAboutGogs/img001.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Here&apos;s a list of repositories that are saved currently.&lt;/p&gt;
&lt;p&gt;I think this thing is just amazing. It was super easy to mirror my external repo to the internal one.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/LetMeGushAboutGogs/img002.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I just threw it my credentials and the git url for it. Ba da boom, ba da bing, &lt;em&gt;mirrored&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;This thing has an issue tracker (not mirrored), tags, releases, web hooks, and so much more. If you need a super easy-to-use, easy-to-set-up git server, I 100% recommend this thing. 10/10 Would use again.&lt;/p&gt;
&lt;p&gt;If you have any experience with &lt;a href=&quot;https://gogs.io/&quot;&gt;Gogs&lt;/a&gt;, let me know in the comments below and tell me your thoughts!&lt;/p&gt;
</content:encoded><category>git</category><category>server</category><category>ilovegogs</category><category>gogs</category><category>go</category><author>CJ Coffey</author></item><item><title>How To Make A Website</title><link>https://cjcoffey.com/posts/howtomakeawebsite/</link><guid isPermaLink="true">https://cjcoffey.com/posts/howtomakeawebsite/</guid><description>How to deploy your static site with a custom domain</description><pubDate>Tue, 18 Oct 2016 16:00:19 GMT</pubDate><content:encoded>&lt;h1&gt;How To Make A Website&lt;/h1&gt;
&lt;p&gt;It&apos;s been quite a while since I&apos;ve done a blog post, but after I was asked how I make and deploy my website, I thought I&apos;d write up a little something. This post will show you how to serve a static site with firebase and how to link up your own custom domain to it as well.&lt;/p&gt;
&lt;h2&gt;DISCLAIMER&lt;/h2&gt;
&lt;p&gt;You should be comfortable with the command line for this tutorial. You&apos;ll need to know how to run a few basic things via the terminal (e.g. &lt;code&gt;cd&lt;/code&gt; to change directories) in order to get the most out of this post.&lt;/p&gt;
&lt;h2&gt;Setting up a Website Project&lt;/h2&gt;
&lt;p&gt;The first thing we need to do is head over to https://firebase.google.com/ and hit the Get Started for Free button&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/HowToMakeAWebsite/img001.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Next thing you&apos;ll want to do is name and create your project.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/HowToMakeAWebsite/img002.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;It may take a moment or two, but then you&apos;ll be greeted with a dashboard page. From there, you can select Hosting at the left, then Get Started in the main view.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/HowToMakeAWebsite/img003.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Now, it&apos;s time to get a bit comfy with your terminal. If you don&apos;t have NodeJS or npm installed, go ahead and grab those from &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;here&lt;/a&gt;. I recommend the latest, but the LTS should be fine, too. Once that&apos;s installed, open up a terminal (or cmd.exe if you&apos;re on windows), and run &lt;code&gt;npm install -g firebase-tools&lt;/code&gt; from the terminal.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/HowToMakeAWebsite/img004.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;You may want to change directories via your terminal for the next couple of steps. Run the following lines when you&apos;ve done so:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;firebase login&lt;/code&gt; to login to your firebase account.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;firebase init&lt;/code&gt; to initialize your website.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;During the init, you&apos;ll see something similar to this&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/HowToMakeAWebsite/img006.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;It will ask you which features you&apos;d like to implement for your current project. Since we&apos;re not using any Database things, just hit &lt;code&gt;Space&lt;/code&gt; to de-select it from the menu. Press &lt;code&gt;Enter&lt;/code&gt; (or &lt;code&gt;Return&lt;/code&gt; if you&apos;re on a mac) to confirm. Next, it will ask you which project you want to target. Use the arrow keys to highlight and press &lt;code&gt;Enter&lt;/code&gt; to select the project you created a moment ago.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/HowToMakeAWebsite/img007.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Next, it will ask you if you which directory you want to use to deploy your website (by default, it&apos;s &lt;code&gt;public&lt;/code&gt;), and it will also ask you if you want to configure the site as a single-page app. For me, I kept the default &lt;code&gt;public&lt;/code&gt; directory and said &lt;code&gt;No&lt;/code&gt; to the single-page app, since all of my site is just plain old HTML files kept in a &lt;code&gt;public&lt;/code&gt; folder in my project.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/HowToMakeAWebsite/img008.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Your terminal should look similar to mine (see above). Hopefully, all of that worked for you. If you like, you can test and see what your site will look like by running &lt;code&gt;firebase serve&lt;/code&gt; in the terminal. Here&apos;s what mine looked like.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/HowToMakeAWebsite/img009.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;We can deploy our site by running &lt;code&gt;firebase deploy&lt;/code&gt; in the same directory. This will upload your content to your firebase host. You can go back to your firebase dashboard and select Hosting again and see something like this.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/HowToMakeAWebsite/img010.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The URL it shows you is your deployed site. You can select that link and it will take you to your site. You can share that link with others and they&apos;ll be able to see the same thing. Neat! You have your very own website now! Give yourself a pat on the back, because you just did the bulk of your work. Now...about that custom domain name...&lt;/p&gt;
&lt;h2&gt;Setting up your Custom Domain&lt;/h2&gt;
&lt;p&gt;There are a ton of places to buy a custom domain, but since firebase is Google-based, I figure I&apos;d use &lt;a href=&quot;https://domains.google/&quot;&gt;Google domains&lt;/a&gt; to show how to link up a custom domain. What you&apos;ll see should work just about anywhere (e.g. GoDaddy, Namecheap, etc.), but I&apos;ll be showing screenshots from Google domains since that&apos;s what I&apos;m using. I got mine for $12/year. Perhaps you can get yours for cheaper or whatever, but that&apos;s not the point. Regardless, here we go.&lt;/p&gt;
&lt;p&gt;Once you&apos;ve picked out a swag website name, take note of it and go back to your firebase dashboard. The previous screenshot showed a blue button &lt;em&gt;Connect Custom Domain&lt;/em&gt; next your your website. Get back to that view and click that button. You&apos;ll see something like this (see below).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/HowToMakeAWebsite/img011.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Remember what you called your website? I hope so, because we&apos;re gonna put it in that box you see. Once you&apos;ve done that, click Continue.&lt;/p&gt;
&lt;p&gt;Next, it&apos;ll ask you to verify the ownership of your site. Take note of the records you see.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/HowToMakeAWebsite/img012.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Next, go to your DNS settings for your domain. (If you&apos;re using Google domains, it&apos;ll look similar to this.)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/HowToMakeAWebsite/img014.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Put in your TXT records in the Custom resource records spot as seen here:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/HowToMakeAWebsite/img015.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;(Disregard the A type record for now, we&apos;ll come back to that.) Select Verify from your firebase window (where you got the TXT records from). Now, you may have to wait a bit for this next part since it says it may take 24 hours to verify or something like that. For me, it was maybe 10 minutes. Hopefully you won&apos;t have to wait so long, but regardless, at some point, firebase should move to step 3 (Go live) and show you something like this.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/HowToMakeAWebsite/img013.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;It recommends you to use CNAME records, but I honestly couldn&apos;t get mine to work like that, so A records it is. Copy those records from firebase and go back to your domain&apos;s DNS settings. Insert those records (A or CNAME. If one doesn&apos;t work, try the other).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/HowToMakeAWebsite/img015.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Annnnnddd you should be good to go. Try out your website now! It should show the same stuff as if you went to your whateverproject-12345.firebaseapp.com URL (not an actual site, probably).&lt;/p&gt;
&lt;p&gt;I hope this was helpful. Please let me know what you think in the comments below.&lt;/p&gt;
</content:encoded><category>firebase</category><category>website</category><author>CJ Coffey</author></item><item><title>Ionic 2 Tutorial Part 2</title><link>https://cjcoffey.com/posts/ionic2tutorial2/</link><guid isPermaLink="true">https://cjcoffey.com/posts/ionic2tutorial2/</guid><description>Writing unit tests for an Ionic 2 app</description><pubDate>Mon, 22 Aug 2016 13:50:01 GMT</pubDate><content:encoded>&lt;h1&gt;Photo Storage Tutorial Part 2&lt;/h1&gt;
&lt;h2&gt;Writing Unit Tests for your Ionic 2 app&lt;/h2&gt;
&lt;h3&gt;&lt;strong&gt;DISCLAIMER&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Because Angular 2 is still putting out release candidates at this time (2016-08-23), some of what you see may not be applicable to whatever version is currently out when you read this.  I&apos;ll try to update this article when I can if/when a definite testing strategy is put out by the angular team.&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Intro&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;GitHub repo for this tutorial at https://github.com/dually8/Ionic2-Workshop&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hopefully, everything worked out for you in the &lt;a href=&quot;/2016/08/18/Ionic2Tutorial&quot;&gt;previous post&lt;/a&gt;. Now, we want to focus on writing some unit tests. I&apos;ll go through everything step-by-step again and (hopefully) explain the &lt;em&gt;how&lt;/em&gt; and &lt;em&gt;why&lt;/em&gt; to you well. Let&apos;s begin.&lt;/p&gt;
&lt;h2&gt;The Tech Stack&lt;/h2&gt;
&lt;p&gt;First, I want to take a look at the tech stack we&apos;re using. Here&apos;s what we&apos;ll be using:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Jasmine, for writing tests&lt;/li&gt;
&lt;li&gt;Karma, for running tests
&lt;ul&gt;
&lt;li&gt;browserify, a node module loader for browsers&lt;/li&gt;
&lt;li&gt;istanbul, for code coverage
&lt;ul&gt;
&lt;li&gt;isparta, makes istanbul ES6 compatible&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[Optional] PhantomJS, a headless browser in which to run the tests&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Bootstrapping tests&lt;/h2&gt;
&lt;p&gt;Granted, this part has already been done for you, but I want to take a look at &lt;em&gt;how&lt;/em&gt; it all works together. Let&apos;s start by opening up &lt;code&gt;test/common-providers.ts&lt;/code&gt;. The top is similar to our previous &lt;code&gt;import&lt;/code&gt; statements, but we have a slightly different collection here this time.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import { provide, Type }                              from &apos;@angular/core&apos;;
import { Control }                                    from &apos;@angular/common&apos;;
import { Http, HTTP_PROVIDERS }                       from &apos;@angular/http&apos;;
import { MockBackend }                                from &apos;@angular/http/testing&apos;;
import { App, Config, Form, NavController, Platform } from &apos;ionic-angular&apos;;
import { Camera }                                     from &apos;ionic-native&apos;;
import { CameraMock, ConfigMock, NavMock }            from &apos;./mocks&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here, we&apos;re gathering everything we need to &lt;code&gt;import&lt;/code&gt; to every test we run. Below this we have two exported arrays: &lt;code&gt;baseProviders&lt;/code&gt; and &lt;code&gt;serviceProviders&lt;/code&gt;. It&apos;s in these arrays that were going to gather all our requirements for each test we&apos;ll run. Doing it this way makes bootstrapping new tests a lot quicker and will save us time. In between the &lt;code&gt;import&lt;/code&gt; and &lt;code&gt;export&lt;/code&gt; statements, we have this line:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/**
 * Because promises take a long time some times
 */
jasmine.DEFAULT_TIMEOUT_INTERVAL = 20000;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We write this because:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;We&apos;re writing our unit tests in Jasmine&lt;/li&gt;
&lt;li&gt;When we use the &lt;code&gt;async&lt;/code&gt; wrapper later to test asynchronous calls, we want to give it a bit more time to complete so that our tests don&apos;t fail.&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Note&lt;/strong&gt;: the timeout interval is in milliseconds, so 20000 would be 20 seconds.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let&apos;s take a closer look at what the two exported arrays are&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export let baseProviders: Array&amp;lt;any&amp;gt; = [
    Form,
    provide(Config, { useClass: ConfigMock }),
    provide(App, { useClass: ConfigMock }),
    provide(NavController, { useClass: NavMock }),
    provide(Platform, { useClass: ConfigMock }),
    provide(Camera, { useClass: CameraMock }),
    HTTP_PROVIDERS,
];

export let serviceProviders: Array&amp;lt;any&amp;gt; = [
    provide(Http, { useClass: MockBackend }),
].concat(baseProviders);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Granted, this might make a bit more sense once we get into writing our first unit test, but real quick, let me explain what we&apos;re doing here. These arrays will be used for dependency injection later. The &lt;code&gt;provide&lt;/code&gt; function allows us to inject dependencies that will be mocked. This is super useful when testing things like Http calls.&lt;/p&gt;
&lt;p&gt;The next thing I want to look at is &lt;code&gt;app/providers/firebase-provider/firebase-provider.spec.ts&lt;/code&gt; (AKA: the first test we&apos;ll be writing). Again, let&apos;s take a quick look at the &lt;code&gt;import&lt;/code&gt; statements.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import { addProviders, async, inject } from &apos;@angular/core/testing&apos;;
import { provide } from &apos;@angular/core&apos;;
import { serviceProviders } from &apos;../../../test/common-providers&apos;;
import { FirebaseProvider } from &apos;./firebase-provider&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The first three things we import (&lt;code&gt;addProviders, async, inject&lt;/code&gt;), come from Angular&apos;s testing framework. These are going to let us inject dependencies efficiently (though, that part may be up for debate until they finish their testing documentation). We&apos;re also importing &lt;code&gt;serviceProviders&lt;/code&gt; from the &lt;code&gt;common-providers&lt;/code&gt; file we looked at a moment ago, and since we&apos;re going to be testing the &lt;code&gt;FirebaseProvider&lt;/code&gt;, it only makes sense to import that as well.&lt;/p&gt;
&lt;p&gt;Below the imports, we have a little guy, &lt;code&gt;specProviders&lt;/code&gt;. Basically, he&apos;s going to hold all the dependencies we need to inject in order to get our tests to work. Some times, this will just be our &lt;code&gt;baseProviders&lt;/code&gt; or &lt;code&gt;serviceProviders&lt;/code&gt;, but in most cases, we&apos;ll need a couple more things in order to get everything to work. In this case, we need to inject &lt;code&gt;FirebaseProvider&lt;/code&gt; since we&apos;ll be testing it, so we come away with something like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;let specProviders = serviceProviders.concat([
    FirebaseProvider
]);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here, we&apos;re putting all of the base dependencies, service dependencies, and one more specific dependency into a single array for us to use at a later point. Below this, we have our first &lt;code&gt;describe&lt;/code&gt; block.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;describe(&apos;FirebaseProvider&apos;, () =&amp;gt; {

    const config = {
        // todo: put your own stuff here
        apiKey: &apos;&apos;,
        authDomain: &apos;&apos;,
        databaseURL: &apos;&apos;,
        storageBucket: &apos;&apos;,
    };

    firebase.initializeApp(config); // call ONLY ONCE

    // ...
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;From the Jasmine documentation a &lt;code&gt;describe&lt;/code&gt; block says&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A test suite begins with a call to the global Jasmine function &lt;code&gt;describe&lt;/code&gt; with two parameters: a string and a function. The string is a name or title for a spec suite – usually what is being tested. The function is a block of code that implements the suite.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Or, TL;DR - Name your test block.&lt;/p&gt;
&lt;p&gt;Inside the function part, we have our config and initializer. Go ahead and copy/paste your credentials into that config object, because you&apos;ll need it for later. Next, let&apos;s take a look at the &lt;code&gt;beforeEach&lt;/code&gt; block and the first &lt;code&gt;it&lt;/code&gt; block (AKA: the first test case).&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;beforeEach(() =&amp;gt; {
    addProviders(specProviders);
});

it(&apos;should be defined&apos;, async(inject([FirebaseProvider], (_fb: FirebaseProvider) =&amp;gt; {
    // todo: complete this test
})));
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Real quick, before we hit the &lt;code&gt;beforeEach&lt;/code&gt;, let&apos;s look at the &lt;code&gt;it&lt;/code&gt; block. The &lt;code&gt;it&lt;/code&gt; block is similar to the &lt;code&gt;describe&lt;/code&gt; in that we have 2 parameters: a string, and a function. The string is the name of the test you want to give it, and the function will contain the stuff you want to test. The &lt;code&gt;async&lt;/code&gt; is a wrapper that tells the &lt;code&gt;it&lt;/code&gt;&apos;s function call that this particular call is asynchronous. The &lt;code&gt;inject&lt;/code&gt; takes two parameters: an array of providers to inject, and the function to call. Normally, you&apos;d list the providers as parameters in the function call. This will hopefully make more sense as we go along.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;beforeEach&lt;/code&gt; block is a nifty little tool that executes what&apos;s inside of it each and every time &lt;em&gt;before&lt;/em&gt; a test runs (an &lt;code&gt;it&lt;/code&gt; block runs). In our case, we&apos;re using &lt;code&gt;addProviders&lt;/code&gt; to add an array of injectables (AKA: providers/services) before each test runs. &lt;em&gt;Note: &lt;code&gt;addProviders&lt;/code&gt; is deprecated and it&apos;s recommended to use the &lt;a href=&quot;https://github.com/angular/angular/blob/4a740f23a447d7201fe655e2f016b70066752ec1/modules/%40angular/core/testing/testing_internal.ts#L121&quot;&gt;TestBed&lt;/a&gt; now. As I said in the disclaimer above, this stuff is still being worked out by the Angular team.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Now, inside of the &lt;code&gt;it&lt;/code&gt; block, we want to make an assertion. We can do this by calling &lt;a href=&quot;http://jasmine.github.io/2.4/introduction.html#section-Expectations&quot;&gt;&lt;code&gt;expect&lt;/code&gt;&lt;/a&gt;. An &lt;code&gt;expect&lt;/code&gt; statement takes a single parameter that is then chained with the actual assertion. You can read a full list of these in the Jasmine documentation. Meanwhile, you can just trust that I&apos;m making the correct assertion calls. Let&apos;s fill in the first test like so:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;it(&apos;should be defined&apos;, async(inject([FirebaseProvider], (_fb: FirebaseProvider) =&amp;gt; {
    // todo: complete this test
    expect(_fb).toBeDefined();
})));
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If it wasn&apos;t already obvious, we&apos;re making sure that &lt;code&gt;_fb&lt;/code&gt; is defined. This is always a good first test because we want to make sure all of our injection things are working correctly. If you like, go ahead and run the test by running &lt;code&gt;npm test&lt;/code&gt;. Hopefully, you get an output similar to this.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/Ionic2Tutorial2/firstOutput.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;For now, don&apos;t worry about the skipped tests. I&apos;ll throw in some tricks at the bottom of the tutorial if you&apos;re curious as to how I skipped the others. If this didn&apos;t work for you, feel free to put in an issue &lt;a href=&quot;https://github.com/dually8/Ionic2-Workshop/issues&quot;&gt;here&lt;/a&gt;. If it did, great! Let&apos;s continue.&lt;/p&gt;
&lt;p&gt;The next test &lt;em&gt;should login with email&lt;/em&gt;. So, let&apos;s write this one. Since it&apos;s an asynchronous test, we need the &lt;code&gt;async&lt;/code&gt; wrapper again. Your test should look something like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;it(&apos;should login with email&apos;, async(inject([FirebaseProvider], (_fb: FirebaseProvider) =&amp;gt; {
    _fb.loginWithEmail(&apos;test@test.com&apos;, &apos;test123&apos;)
        .then((user) =&amp;gt; {
            expect(_fb.isAuthenticated).toBe(true);
        });
})));
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now, the username and password you pass in may be different. This is just a test account I made on my particular app in order to complete this unit test. Go ahead and run your test again and make sure it passes. If it times out, try increasing &lt;code&gt;jasmine.DEFAULT_TIMEOUT_INTERVAL&lt;/code&gt;. If that doesn&apos;t work for you, let me know by opening up an issue on this post&apos;s repo.&lt;/p&gt;
&lt;p&gt;Hopefully, things worked out for you and/or you just want to continue. The next test I want to look at is &lt;code&gt;app/pages/upload-page/upload-page.spec.ts&lt;/code&gt;. As always, we have our &lt;code&gt;import&lt;/code&gt; statements at the top, an array of providers below that, and a &lt;code&gt;describe&lt;/code&gt; block to tell karma that this is a brand new bag of tests to run. You may have noticed a couple of different things this time around:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;describe(&apos;UploadPage&apos;, () =&amp;gt; {
    let page: UploadPage;
    let pageDep: any[] = [NavController, ModalController, ActionSheetController, ToastController, FirebaseProvider];

    beforeEach(() =&amp;gt; {
        addProviders(specProviders);
    });

    // ...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This time, we&apos;re making two variables at the top of our &lt;code&gt;describe&lt;/code&gt; block. One is to hold the class object we&apos;ll be testing, and the other is an array that holds the stuff we put into the pages constructor. Looking back at the upload page class...&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export class UploadPage {

    // ...

    constructor(
        public navCtrl: NavController,
        public modalCtrl: ModalController,
        public actionSheetCtrl: ActionSheetController,
        public toastCtrl: ToastController,
        private fbProv: FirebaseProvider) {
    }

    // ...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Notice that the same stuff we have in the &lt;code&gt;pageDep&lt;/code&gt; array is the same stuff in the constructor for &lt;code&gt;UploadPage&lt;/code&gt;. The biggest reason I&apos;ve done that here is because I try my best to follow the DRY principle. Otherwise:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// this line
it(&apos;should be defined&apos;, inject(pageDep, (_nav, _modal, _action, _toast, _fb) =&amp;gt; { // ...

// would be this line
it(&apos;should be defined&apos;, inject([NavController, ModalController, ActionSheetController, ToastController, FirebaseProvider], (_nav, _modal, _action, _toast, _fb) =&amp;gt; { // ...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ekk. I&apos;d like to avoid that. Let&apos;s move on to writing the first test.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;it(&apos;should be defined&apos;, inject(pageDep, (_nav, _modal, _action, _toast, _fb) =&amp;gt; {
    // todo: complete this test
    page = new UploadPage(_nav, _modal, _action, _toast, _fb);
    expect(page).toBeDefined();
}));
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In this case, we&apos;re constructing the &lt;code&gt;UploadPage&lt;/code&gt; and checking to make sure it constructed successfully. This may seem like a useless test, but it&apos;s a good first test just to make sure everything is working properly. Let&apos;s now move to the next test.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;it(&apos;should call getPicture if takePic is called&apos;, async(inject(pageDep, (_nav, _modal, _action, _toast, _fb) =&amp;gt; {
    // todo: complete this test
    page = new UploadPage(_nav, _modal, _action, _toast, _fb);
    spyOn(page, &apos;getPicture&apos;);
    page.takePic();
    // because `getPicture` is a private function, we have to check it this way
    expect(page[&apos;getPicture&apos;]).toHaveBeenCalled();
})));
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In this case, we&apos;re using an &lt;code&gt;async&lt;/code&gt; wrapper because of the type of calls we&apos;ll be making. We&apos;re also constructing a brand new &lt;code&gt;UploadPage&lt;/code&gt; per normal unit testing guidelines. The next line of code might be unfamiliar to you. The Jasmine function &lt;code&gt;spyOn&lt;/code&gt; takes two arguments: the object you&apos;re &quot;spying on&quot;, and the name of the function inside of the object that you want to watch. In our case, we&apos;re looking inside &lt;code&gt;UploadPage&lt;/code&gt; (or &lt;code&gt;page&lt;/code&gt;) and watching for &lt;code&gt;getPicture&lt;/code&gt; to be called. The next line, we call &lt;code&gt;takePic&lt;/code&gt; which should later call the private function &lt;code&gt;getPicture&lt;/code&gt;. Next, we make the assertion (or, &lt;code&gt;expect&lt;/code&gt;) &lt;code&gt;getPicture&lt;/code&gt; has been called. Hopefully, it passes for you.&lt;/p&gt;
&lt;p&gt;Last page to go is &lt;code&gt;ViewPage&lt;/code&gt;, so let&apos;s get to it.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import { addProviders, async, inject } from &apos;@angular/core/testing&apos;;
import { provide } from &apos;@angular/core&apos;;
import { LoadingController, NavController } from &apos;ionic-angular&apos;;
import { baseProviders } from &apos;../../../test/common-providers&apos;;
import { FirebaseProvider } from &apos;../../providers/firebase-provider/firebase-provider&apos;;
import { ViewPage } from &apos;./view-page&apos;;

let specProviders = baseProviders.concat([
    FirebaseProvider,
    LoadingController
]);

describe(&apos;ViewPage&apos;, () =&amp;gt; {
    let page: ViewPage;
    let pageDep: any[] = [NavController, LoadingController, FirebaseProvider];

    beforeEach(() =&amp;gt; {
        addProviders(specProviders);
    });

    it(&apos;should be defined&apos;, inject(pageDep, (_nav, _load, _fb) =&amp;gt; {
        // todo: complete this test
    }));
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Similarly to the previous page&apos;s test suite, we have our &lt;code&gt;import&lt;/code&gt; statements at the top, an array of providers/services we&apos;ll need next, a variable to hold our constructed page, and an array of dependencies for said page. The first test will look just like the last page&apos;s.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;it(&apos;should be defined&apos;, inject(pageDep, (_nav, _load, _fb) =&amp;gt; {
    // todo: complete this test
    page = new ViewPage(_nav, _load, _fb);
    expect(page).toBeDefined();
}));
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Easy enough? Starting to get the hang of it? I hope so. The next couple of tests are a little be weird looking, but here&apos;s my implementation for the second test.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;it(&apos;should call FirebaseProvider.getPics when ViewPage.getPhotos is called&apos;, async(inject(pageDep, (_nav, _load, _fb: FirebaseProvider) =&amp;gt; {
    page = new ViewPage(_nav, _load, _fb);
    spyOn(_fb, &apos;getPics&apos;).and.returnValue(new Promise((resolve) =&amp;gt; {resolve([&apos;pics&apos;]); }));
    page.getPhotos()
        .then(() =&amp;gt; {
            expect(_fb.getPics).toHaveBeenCalled();
        });
})));
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The first line should look familiar, and at least part of the second line. On the second line, we&apos;re &quot;spying on&quot; &lt;code&gt;FirebaseProvider.getPics&lt;/code&gt;, but since we don&apos;t want to actually connect to firebase (we just want to test the functionality of this method), we say &lt;code&gt;.and.returnValue&lt;/code&gt; to tell Jasmine that we want to re-write and mock the &lt;code&gt;getPics&lt;/code&gt; function. Because we&apos;re only interested in resolving the promise, we just say &lt;code&gt;new Promise((resolve) =&amp;gt; { resolve([&apos;pics&apos;]); })&lt;/code&gt;. Essentially, we&apos;re just saying that &lt;code&gt;FirebaseProvider.getPics&lt;/code&gt; should return a string array containing &lt;code&gt;[&quot;pics&quot;]&lt;/code&gt;. Now that we have that mocked, we can call &lt;code&gt;page.getPhotos&lt;/code&gt; and make the assertion that our &lt;code&gt;FirebaseProvider&lt;/code&gt; should have called its &lt;code&gt;getPics&lt;/code&gt; method. Hopefully, that worked out for you.&lt;/p&gt;
&lt;p&gt;The next test is similar. Check out my implementation below.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;it(&apos;should return one pic&apos;, async(inject(pageDep, (_nav, _load, _fb: FirebaseProvider) =&amp;gt; {
    page = new ViewPage(_nav, _load, _fb);
    spyOn(_fb, &apos;getPics&apos;).and.returnValue(new Promise((resolve) =&amp;gt; {resolve([&apos;pics&apos;]); }));
    page.getPhotos()
        .then(() =&amp;gt; {
            expect(page.myPhotos[0]).toBe(&apos;pics&apos;);
        });
})));
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Again, we&apos;re mocking the &lt;code&gt;FirebaseProvider.getPics&lt;/code&gt; method to return a string array with one element. Because &lt;code&gt;ViewPage&lt;/code&gt; should be storing all the strings it gets back from its &lt;code&gt;getPhotos&lt;/code&gt; call, we check to see if &lt;code&gt;page.myPhotos&lt;/code&gt; contains the same thing we mocked above in the &lt;code&gt;FirebaseProvider.getPics&lt;/code&gt; call. Hopefully, that, too, worked out for you.&lt;/p&gt;
&lt;p&gt;Well, that&apos;s the end of it. I hope you learned something, and I hope I explained things well enough for you. I recently added &lt;a href=&quot;https://disqus.com/&quot;&gt;Disqus&lt;/a&gt; comments on here, so feel free to leave me a comment if something didn&apos;t make sense to you. I&apos;ll try my best to explain it better. Thanks for reading.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Notes&lt;/h3&gt;
&lt;p&gt;Here&apos;s a few neat little tricks Jasmine provides for you&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://jasmine.github.io/2.4/focused_specs.html&quot;&gt;&lt;code&gt;fit&lt;/code&gt;&lt;/a&gt;: Run just this test. If two or more are labeled with &lt;code&gt;fit&lt;/code&gt;, all with that label will run.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://jasmine.github.io/2.4/introduction.html#section-Pending_Specs&quot;&gt;&lt;code&gt;xit&lt;/code&gt;&lt;/a&gt;: Disable (or skip) this test.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://jasmine.github.io/2.4/focused_specs.html&quot;&gt;&lt;code&gt;fdescribe&lt;/code&gt;&lt;/a&gt;: Run just this suite. If two or more are labeled with &lt;code&gt;fdescribe&lt;/code&gt;, all with that label will run.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://jasmine.github.io/2.4/introduction.html#section-Disabling_Suites&quot;&gt;&lt;code&gt;xdescribe&lt;/code&gt;&lt;/a&gt;: Disable (or skip) this suite.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can find more in the Jasmine Documentation.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;References&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;http://lathonez.github.io/2016/ionic-2-unit-testing/&quot;&gt;Unit Testing an Ionic 2 Project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://angular.io/docs/ts/latest/guide/testing.html&quot;&gt;Angular Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://ionicframework.com/docs/v2/faq/&quot;&gt;Ionic Framework Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://mcgivery.com/understanding-ionic-2-imports/&quot;&gt;Understanding Imports&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://jasmine.github.io/2.4/introduction.html&quot;&gt;Jasmine Docs&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><category>ionic</category><category>angular</category><category>tutorial</category><category>unit test</category><category>firebase</category><author>CJ Coffey</author></item><item><title>Ionic 2 Tutorial Part 1</title><link>https://cjcoffey.com/posts/ionic2tutorial/</link><guid isPermaLink="true">https://cjcoffey.com/posts/ionic2tutorial/</guid><description>Create an image upload app with Ionic 2 and Firebase</description><pubDate>Thu, 18 Aug 2016 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Photo Storage Tutorial Part 1&lt;/h1&gt;
&lt;h2&gt;Using Ionic 2 and Firebase 3 to store your photos in a relatively secure location&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;GitHub repo for this tutorial at https://github.com/dually8/Ionic2-Workshop&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So, I initially made this workshop/tutorial thing for work, but since I started a blog, a friend/colleague of mine said I should put it here. So, here we go. Let&apos;s look at what you&apos;ll be making, first.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/Ionic2Tutorial/ionic2workshop.003.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Essentially, we have a login page with email and password, a main page for taking photos and uploading them, and a secondary page for viewing your saved photos (which pulls from Firebase).&lt;/p&gt;
&lt;h2&gt;Set up&lt;/h2&gt;
&lt;h3&gt;Environment Set up&lt;/h3&gt;
&lt;p&gt;One of the first things we need to do is to set up our environment. So, if you don&apos;t already have Ionic 2, install it via npm.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;[sudo] npm i -g ionic@beta&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Second, download the repo for this project by entering&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git clone https://github.com/dually8/Ionic2-Workshop.git&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Next, &lt;code&gt;cd&lt;/code&gt; into the project directory and run &lt;code&gt;[sudo] npm install&lt;/code&gt; to install all the dependencies.&lt;/p&gt;
&lt;h3&gt;Firebase Set up&lt;/h3&gt;
&lt;p&gt;First, you&apos;ll want to go to https://firebase.google.com, sign up, and create a new project.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/Ionic2Tutorial/ionic2workshop.005.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;From there, you&apos;ll want to name and create the new project. Afterwards, go to the Auth section of your dashboard.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/Ionic2Tutorial/ionic2workshop.006.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Next, click the &lt;em&gt;Sign-in Method&lt;/em&gt; tab and enable &lt;em&gt;Email/Password&lt;/em&gt; authentication.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/Ionic2Tutorial/ionic2workshop.007.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Finally, go to the upper right hand corner, click &lt;em&gt;Web Setup&lt;/em&gt; to get your credentials. Copy those credentials and save them for later.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/Ionic2Tutorial/ionic2workshop.008.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Creating the app&lt;/h2&gt;
&lt;p&gt;Now, I have all the HTML written for you as well as a wrapper provider for Firebase. What I&apos;ll walk you through is filling in the &lt;code&gt;todo&lt;/code&gt; parts and explain the &lt;em&gt;how&lt;/em&gt; and &lt;em&gt;why&lt;/em&gt; (hopefully well).&lt;/p&gt;
&lt;p&gt;First thing we need to look at is the main file for the project (&lt;code&gt;app/app.ts&lt;/code&gt;). Here we&apos;ll find our first &lt;code&gt;todo&lt;/code&gt;. Remember when you saved your firebase credentials? Cool. We&apos;re going to copy and paste that in the &lt;code&gt;config&lt;/code&gt; variable. Got that done? Good. Essentially, the &lt;code&gt;config&lt;/code&gt; is passed to &lt;code&gt;firebase.initializeApp&lt;/code&gt; in order to, well, initialize the global &lt;code&gt;firebase&lt;/code&gt; variable. This will allow us to successfully use the &lt;code&gt;FirebaseProvider&lt;/code&gt; later to upload/retrieve photos. Nice.&lt;/p&gt;
&lt;p&gt;Next, let&apos;s take a look at &lt;code&gt;app/pages/upload-page/upload-page.ts&lt;/code&gt;.  At the top, we have some cool stuff.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import { Component } from &apos;@angular/core&apos;;
import { ActionSheetController, Modal, ModalController, NavController, ToastController, ViewController } from &apos;ionic-angular&apos;;
import { Camera, CameraOptions } from &apos;ionic-native&apos;;
import { FirebaseProvider } from &apos;../../providers/firebase-provider/firebase-provider&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you&apos;re unfamiliar with &lt;code&gt;import&lt;/code&gt; statements, essentially, we &lt;code&gt;import&lt;/code&gt; stuff we want to use in this particular file.  This is similar to the node/requirejs &lt;code&gt;require()&lt;/code&gt; function.  In this case, we import &lt;code&gt;Component&lt;/code&gt; from the angular core so that we have access to the &lt;code&gt;@Component&lt;/code&gt; decorator.  Decorators take metadata objects as arguments.  We&apos;ll get more into that later.  We also have several controllers imported from ionic as well as a couple of camera things from &lt;a href=&quot;http://ionicframework.com/docs/v2/native/&quot;&gt;ionic-native&lt;/a&gt;.  Basically, these lines are allowing us to use these modules/providers/etc. inside of this particular file.&lt;/p&gt;
&lt;p&gt;Now, on to the &lt;code&gt;@Component&lt;/code&gt; decorator.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@Component({
    templateUrl: &apos;build/pages/upload-page/upload-page.html&apos;
})
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here, we&apos;re telling angular that the class we&apos;re declaring after this is a &lt;code&gt;Component&lt;/code&gt; and should be treated as such with the metadata we give it.  We&apos;re saying here that &lt;code&gt;UploadPage&lt;/code&gt; is an angular &lt;code&gt;Component&lt;/code&gt; that uses &lt;code&gt;upload-page.html&lt;/code&gt; as its view.  You can read more about decorators &lt;a href=&quot;https://angular.io/docs/ts/latest/guide/glossary.html#decorator-decoration&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In the &lt;code&gt;constructor&lt;/code&gt; we&apos;ve injected some controllers and providers for later use.  We&apos;re injecting &lt;code&gt;ModalController&lt;/code&gt; to show a login pop up, &lt;code&gt;ActionSheetController&lt;/code&gt; to let the user select whether they want to take a photo with their camera, or pick one from their gallery.  We&apos;re also injecting &lt;code&gt;ToastController&lt;/code&gt; to show toasts (or pop ups, if you will) to the user on successful uploads, and we&apos;re also injecting &lt;code&gt;FirebaseProvider&lt;/code&gt; in order to upload said photos.&lt;/p&gt;
&lt;p&gt;Now, let&apos;s look at the first &lt;code&gt;todo&lt;/code&gt; in this file.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;showLogin(): void {
    if (!this.loginModal || !this.loginModal.isLoaded() || !this.loginModal.isLast()) {
        // todo: create and show modal
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We can create and display the modal by using the &lt;code&gt;ModalController&lt;/code&gt;.  Since we already have a variable above our constructor to hold the modal, let&apos;s use that to create and present the modal.  You can create and present the modal like so:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;this.loginModal = this.modalCtrl.create(LoginModalPage);
this.loginModal.present();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In the &lt;code&gt;if&lt;/code&gt; statement before this, we&apos;re essentially checking first to see if the &lt;code&gt;loginModal&lt;/code&gt; is created at all. If it has already been created, is it showing already?  If so, we don&apos;t want to re-create it and re-show it, otherwise we could have over 9000 modals on top of one another. Ekk.&lt;/p&gt;
&lt;p&gt;On to the next &lt;code&gt;todo&lt;/code&gt;...let&apos;s create the login function for our app.  Find the &lt;code&gt;login&lt;/code&gt; function inside of &lt;code&gt;class LoginModalPage&lt;/code&gt;.  Now, we want to authenticate the user for uploading pictures via email/password, and we probably want to show some sort of pop-up that tells them whether or not their login attempt succeeded. So, let&apos;s check out &lt;code&gt;FirebaseProvider&lt;/code&gt; for a wrapped login function that we can use. In &lt;code&gt;FirebaseProvider&lt;/code&gt; we have a function that returns a promise, &lt;code&gt;loginWithEmail&lt;/code&gt;. Sounds like that&apos;ll work, so let&apos;s.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;this.fbProv.loginWithEmail(this.email, this.password)
    .then((res) =&amp;gt; {
        // success
    }).catch((er) =&amp;gt; {
        // fail
    });
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now, inside of these callbacks, we should let the user know what happened after the login attempt.  We&apos;re going to use a &lt;a href=&quot;http://ionicframework.com/docs/v2/components/#toast&quot;&gt;Toast&lt;/a&gt; in order to accomplish this.  We can create an show a toast like so:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;this.toastCtrl.create({
    message: &apos;Your message here&apos;,
    position: &apos;middle&apos;, // options: &quot;top&quot;, &quot;bottom&quot;, &quot;middle&quot;
    duration: 3000 // 3 seconds
}).present();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We can create and chain the &lt;code&gt;present&lt;/code&gt; function for our toast so we don&apos;t have to store something in a variable.  Pretty nifty. Alright, next, we should show some meaningful messages to the user after the login attempt.  Feel free to use what I&apos;ve done below:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;this.fbProv.loginWithEmail(this.email, this.password)
    .then((res) =&amp;gt; {
        this.toastCtrl.create({
            message: &apos;Login successful!&apos;,
            position: &apos;middle&apos;,
            duration: 3000
        }).present().then(() =&amp;gt; {
            this.dismiss(); // dismiss the modal
        });
    }).catch((er) =&amp;gt; {
        // putting in a variable here so we can set the message
        // depending on what we get back from firebase
        let toast = this.toastCtrl.create({
            message: &apos;&apos;,
            position: &apos;middle&apos;,
            duration: 3000
        });
        if (er.message) {
            toast.setMessage(er.message);
            toast.present();
        } else {
            toast.setMessage(JSON.stringify(er, null, 2));
            toast.present();
        }
    });
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Okay, so, we&apos;re almost at a place where we can test this stuff.  One more thing to go.  Take a look at the next &lt;code&gt;todo&lt;/code&gt;, &lt;code&gt;createAccount&lt;/code&gt;. If it&apos;s not obvious, we need to create an account using the email and password the user has entered, then proceed to log them in using the new account. If we take another look into &lt;code&gt;FirebaseProvider&lt;/code&gt;, we&apos;ll see a handy dandy &lt;code&gt;createAccount&lt;/code&gt; function ready for us to use.  So, let&apos;s wire that up like so:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;this.fbProv.createAccount(this.email, this.password)
    .then((res) =&amp;gt; {
        // log them in after succesfully creating new account
        this.login();
    }).catch((er) =&amp;gt; {
        let toast = this.toastCtrl.create({
            message: &apos;&apos;,
            position: &apos;middle&apos;,
            duration: 3000
        });
        if (er.message) {
            toast.setMessage(er.message);
            toast.present();
        } else {
            toast.setMessage(JSON.stringify(er, null, 2));
            toast.present();
        }
    });
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Alright, you&apos;re ready to go ahead and test the login functionality. Try to test that now, if you like. You can test in the browser by running &lt;code&gt;ionic serve&lt;/code&gt;, or by running it on a device/emulator. You can read more about the ionic CLI &lt;a href=&quot;http://ionicframework.com/docs/v2/cli/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Hopefully, that worked out well for you, if not, feel free to put in an &lt;a href=&quot;https://github.com/dually8/Ionic2-Workshop/issues&quot;&gt;issue on this post&apos;s repo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Next, let&apos;s write the functionality for uploading photos. Take a look at the next &lt;code&gt;todo&lt;/code&gt;, &lt;code&gt;uploadPic&lt;/code&gt;. For this function, we want to upload whatever photo has been taken/selected by the user and upload it to the proper storage place in firebase. Luckily, we have a nice wrapper function in &lt;code&gt;FirebaseProvider&lt;/code&gt; for this. Let&apos;s use the &lt;code&gt;uploadPic&lt;/code&gt; function in there for this purpose. The camera will output the taken/selected photo as a base64 string (which isn&apos;t ideal and you probably wouldn&apos;t use it in a production app, we can discuss that more later). We have a variable in our class already to hold the value of this and display it to the user if it contains something (see: &lt;code&gt;this.photo&lt;/code&gt;). Now, we basically just want to check to see if that photo variable contains anything, and if so, upload it to firebase. Feel free to use the implementation below:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if (this.photo &amp;amp;&amp;amp; this.photo.length &amp;gt; 0) {
    this.fbProv.uploadPic(this.photo)
        .then((res) =&amp;gt; {
            this.toastCtrl.create({
                message: &apos;Uploaded photo successfully!&apos;,
                position: &apos;middle&apos;,
                duration: 3000
            }).present();
        }).catch((err) =&amp;gt; {
            console.error(err);
        });
} else {
    this.toastCtrl.create({
        message: &apos;No photo to upload.&apos;,
        position: &apos;middle&apos;,
        duration: 3000
    }).present();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Above that function is a neat little thing Ionic 2 provides for us: &lt;code&gt;ionViewDidEnter&lt;/code&gt;. Essentially, it&apos;s a function that gets called when the view enters. You can read more about the ionic view events &lt;a href=&quot;http://ionicframework.com/docs/v2/api/components/nav/NavController/&quot;&gt;here&lt;/a&gt;. Inside of this, I&apos;ve created a &lt;a href=&quot;http://ionicframework.com/docs/v2/components/#loading&quot;&gt;loading screen&lt;/a&gt; to show while photos are being retrieved. That way, the user knows something is happening and is not just presented with an empty screen. Below the presentation of the loading screen is an &lt;code&gt;if&lt;/code&gt; statement that checks to see if we have a user currently logged in. If so, we get the photos they&apos;ve stored, otherwise, we just hide the loading screen.&lt;/p&gt;
&lt;p&gt;Feel free to go ahead and test this on a device now. You&apos;ll have to test it on a device or emulator because the browser does not support the cordova camera plugin. I recommend using &lt;a href=&quot;https://www.genymotion.com/&quot;&gt;Genymotion&lt;/a&gt; for emulating android devices, myself.&lt;/p&gt;
&lt;p&gt;Again, hopefully everything worked out for you. If so, continue on to the next step, otherwise, &lt;a href=&quot;https://github.com/dually8/Ionic2-Workshop/issues&quot;&gt;open up an issue on my git repo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;So, we have a working login and photo upload now. Sweet. Next, we want to be able to view the photos we&apos;ve stored in firebase. Proceed to open &lt;code&gt;app/pages/view-page/view-page.ts&lt;/code&gt; for the next &lt;code&gt;todo&lt;/code&gt; on our list.&lt;/p&gt;
&lt;p&gt;In the &lt;code&gt;getPhotos&lt;/code&gt; function in here, let&apos;s call firebase to retrieve all the photos we have for the current user. &lt;code&gt;FirebaseProvider&lt;/code&gt; has a nice little wrapper function for your convenience again (&lt;code&gt;getPics&lt;/code&gt;). We need to also make sure the promise is resolved or rejected depending on what we get back from firebase. Feel free to use my implementation below:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;return new Promise((resolve, reject) =&amp;gt; {
    this.fbProv.getPics()
        .then((photos) =&amp;gt; {
            // store returned photos into view&apos;s photos
            this.myPhotos = photos;
            resolve();
        }).catch((er) =&amp;gt; {
            console.error(er);
            reject();
        });
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Feel free to test this in your app now. It should work in the browser if you decide to go that route. If you run into an issue, feel free to &lt;a href=&quot;https://github.com/dually8/Ionic2-Workshop/issues&quot;&gt;open an issue in this git repo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;That&apos;s it for part 1.  In &lt;a href=&quot;/2016/08/22/Ionic2Tutorial2&quot;&gt;part 2&lt;/a&gt;, we&apos;ll look at unit testing our application.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Notes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The reason we generally wouldn&apos;t use a base64 string to store photos is because today&apos;s cameras are really good, therefore, the size of the string could be over 3 million characters for a single photo. That takes a lot of memory to render, so generally, you&apos;d want to point the photos to a location on the device and just upload the binary data later.&lt;/li&gt;
&lt;li&gt;We use a firebase database in this because it&apos;s relatively easy to store and retrieve the base64 strings. Realistically, you&apos;d want to store photos and other large binary files in firebase&apos;s storage since it allows for more space. The database has the potential to fill up space very quickly, especially with high quality photos.&lt;/li&gt;
&lt;li&gt;Most of the photos used here are taken from my slideshow from the workshop I gave. I&apos;d be happy to post those if there&apos;s enough interest.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h4&gt;References&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://angular.io/docs/ts/latest/quickstart.html&quot;&gt;Angular Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://ionicframework.com/docs/v2/&quot;&gt;Ionic Framework&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://ionicframework.com/docs/v2/components/#modals&quot;&gt;ModalController&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://ionicframework.com/docs/v2/components/#toast&quot;&gt;ToastController&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://ionicframework.com/docs/v2/components/#loading&quot;&gt;LoadingController&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://ionicframework.com/docs/v2/api/components/nav/NavController/&quot;&gt;View Cycle&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>ionic</category><category>angular</category><category>tutorial</category><category>unit test</category><category>firebase</category><author>CJ Coffey</author></item><item><title>FIRST</title><link>https://cjcoffey.com/posts/first/</link><guid isPermaLink="true">https://cjcoffey.com/posts/first/</guid><description>So...my first post...</description><pubDate>Sun, 14 Aug 2016 13:03:45 GMT</pubDate><content:encoded>&lt;h1&gt;Initial Commit&lt;/h1&gt;
&lt;p&gt;So...my first post on my first website that&apos;s not MySpace. Neat.  There&apos;s a lot of stuff I need to do in order to clean up and make this place my own.  I&apos;ll be blogging about stuff I found that&apos;s neat.  I might make a few tutorials.  Who knows?  We&apos;ll see.  I just hope I don&apos;t get sued for something I didn&apos;t know about.  Anyways, have a random gif to brighten your day.&lt;/p&gt;
&lt;p&gt;&amp;lt;img src=&quot;https://i.imgur.com/NnoGhN1.gif&quot; title=&quot;source: imgur.com&quot; /&amp;gt;&lt;/p&gt;
</content:encoded><category>first</category><category>post</category><category>lol</category><author>CJ Coffey</author></item></channel></rss>