Blaugust 2023

Weekly Wrap-Up (08.06.2023 to 08.12.2023)

Weekly Wrap-Up (07.30.2023 to 08.05.2023)

Another week, another weekly wrap-up. This is technically the trickiest post I’m doing right now, since it’s the only thing I can’t really pre-write up. If I were not trying to do 31 days of posts for Blaugust it wouldn’t matter, I’d just, skip it sometimes probably.

Not a lot new or exciting anyway. I had some craziness at work but I don’t blog about work.

Probably the most exciting thing this week was Guardians of the Galaxy 3 coming to Disney+, so I finally got to watch that. It’s not exactly glowing praise, but at the very least, I didn’t come off it thinking it was very “meh” like all of the newer MCU projects. Like Secret Invasion, which I think I finished last week. Secret Invasion was, ok, but not super impressive. A few things on GotG3, I kind of wish they had toned down some of the end a bit. Mild spoilers, as generic as possible but it felt like they needed to save that “large group of people”, entirely because for some reason every Marvel climax has to have huge stakes where the heroes have to save large groups of people. Like, maybe they could have just, gone there, and faced off with the bad guys and had a little fight, without all the extra.

The Activity Log

This part is partially just for my future reference, and it maybe deserves its own name. So we’ll call it the Activity Log.

No new toy stuff this week, not directly toys, I did buy another set of acrylic riser shelves from a daily deal off Amazon. I kind of needed one more set and now I’m pretty good for little shelves for a while. Being able to lift some of the stuff in the back side of a deeper shelf really helps with the aesthetics of a display.

I did pick up a bundle of games on Humble Bundle Because Baldur’s Gate III is the recently released hotness, Humble Bundle has a bundle (affiliate link) of older titles, including Baldur’s Gate I and II, Planescape Torment, Icewind Dale, and Neverwinter Nights. I think I may have a couple fo these on CDs somewhere but I don’t seem to have them on any modern platforms, and the bundle was cheap (a lot of HBs have become overpriced) so I figured why not.

Another one that is probably worth tracking a bit, if only for my own sanity, is books. Because I often will impulse buy books that seem interesting from Kindle Daily Deals (and elsewhere). This week’s books:

  • The Elderon Chronicles (Books 1-3): A Space Colonization Science Fiction Collection by Tarah Benner – I usually steer clear of these “bundles of Sci-Fi Books” but this one seemed appealing so I figured why not.
  • Bilbo’s Last Song by J.R.R. Tolkien – I have most of Tokien’s works already, and I didn’t have this one.
  • This Is Why We Can’t Have Nice Things: Mapping the Relationship between Online Trolling and Mainstream Culture by Whitney Phillips – I have a bad habit of picking up randomly are these sorts of, “cultural exploration with witty titles” books.
  • Nordic Tales: Folktales from Norway, Sweden, Finland, Iceland, and Denmark (Tales of Book 5) – I have a variety of these folktale books from different cultures because one of my many interests, in general, is various world cultures and history.

Lastly, there’s Music. I didn’t listen to anything new really, just a lot of stuff I already listen to. A little Nirvana, a little Orla Garland, a little Alanis Morrisette, a little Sigrid. Not trying anything out of the ordinary this week. It’s just been kind of a boring week overall I suppose.

Code Project – Goodreads RSS to HTML (Python)

I already have my Letterboxed watches set up to syndicate here, to this blog, for archival purposes mostly. When I log a movie in Letterboxed, a plug-in catches it from the RSS feed and makes a post. This is done using a plug-in called “RSS Importer” They aren’t the prettiest posts, I may look into adjusting the formatting with some CSS, but they are there. I really want to do the same for my Goodreads reading. Goodreads lists all have an RSS feed, so reason would have it that I could simply, put that feed into RSS Importer and have the same syndication happen.

For some reason, it throws out an error.

The feed shows as valid and even gives me a preview post, but for whatever reason, it won’t create the actual posts. This is probably actually ok, since the Goodreads RSS feed is weird and ugly. I’ll get more into that in a bit.

The Feed URL Is Here, at the bottom of each list.

I decided that I could simply, do it myself, with Python. One thing Python is excellent for is data retrieval and manipulation. I’m already doing something similar with my FreshRSS Syndication posts. I wanted to run through a bit of the process flow here though I used for creating this script. Partially because it might help people who are trying to learn programming and understand a bit more about how creating a program, at least a simple one, actually sort of works.

There were some basic maintenance tasks needing to be done. Firstly, I made sure I had a category on my WordPress site to accept the posts into. I had this already because I needed it trying to get RSS Importer to work. Secondly, I created a new project in PyCharm. Visual Studio Code works as well, any number of IDEs work, I just prefer PyCharm for Python. In my main.py file, I also added some commented-out bit at the header with URLs cut and pasted from Goodreads. I also verified these feeds actually worked with an RSS Reader.

For the actual code there are basically three steps to this process needed:

  • Retrieve the RSS feed
  • Process the RSS Feed
  • Post the processed data.

Part three here, is essentially already done. I can easily lift the code from my FreshRSS poster, replace the actual post data payload, and let it go. I can’t process data at all without data to process, so step one is to get the RSS data. I could probably work it out also from my FreshRSS script, but instead, I decided to just refresh my memory by searching for “Python Get RSS Feed”. Which brings up one of the two core points I want to make here in this post.

Programming is not about knowing all the code.

Programming is more often about knowing what process needs to be done, and knowing where and how to use the code needed. I don’t remember the exact libraries and syntax to get an RSS feed and feed it through Beautiful Soup. I know that I need to get an RSS feed, and I know I need Beautiful Soup.

My search returned this link, which I cribbed some code from, modifying the variables as needed. I basically skimmed through to just before “Outputting to a file”. I don’t need to output to a file, I can just do some print statements during debugging and then later it will all output to WordPress through a constructed string.

I did several runs along the way, finding that I needed to use lxml instead of xml in the features on the Beautiful Soup Call. I also opted to put the feed URL in a variable instead of directly in the code as the original post had it. It’s easy to swap out. I also did some testing by simply printing the output of “books” to make sure I was actually getting useful data, which I was.

At this point, my code looks something like this (not exactly but something like it:

import requests
from bs4 import BeautifulSoup
​
feedurl = "Goodreads URL HERE"
​
def goodreads_rss(feedurl):
   article_list = []    try:
       r = requests.get(feedurl)
       soup = BeautifulSoup(r.content, features='lxml')
       books = soup.findAll('item')                
       for a in books:
           title = a.find('title').text
           link = a.find('link').text
           published = a.find('pubDate').text            
           book = {
               'title': title,
               'link': link,
               'published': published
              }
           book_list.append(book)        
           return print(book_list)

print('Starting scraping')
goodreads_rss()
print('Finished scraping')

I was getting good data, and so Step 1 (above) was done. The real meat here is processing the data. I mentioned before, Goodreads gives a really ugly RSS feed. It has several tags for data in it, but they aren’t actually used for some reason. Here is a single sample of what a single book looks like:

<item>
<guid></guid>
<pubdate></pubdate>
<title></title>
<link/>
<book_id>5907</book_id>
<book_image_url></book_image_url>
<book_small_image_url></book_small_image_url>
<book_medium_image_url></book_medium_image_url>
<book_large_image_url></book_large_image_url>
<book_description>Written for J.R.R. Tolkien’s own children, The Hobbit met with instant critical acclaim when it was first published in 1937. Now recognized as a timeless classic, this introduction to the hobbit Bilbo Baggins, the wizard Gandalf, Gollum, and the spectacular world of Middle-earth recounts of the adventures of a reluctant hero, a powerful and dangerous ring, and the cruel dragon Smaug the Magnificent. The text in this 372-page paperback edition is based on that first published in Great Britain by Collins Modern Classics (1998), and includes a note on the text by Douglas A. Anderson (2001).]]&gt;</book_description>
<book id="5907">
<num_pages>366</num_pages>
</book>
<author_name>J.R.R. Tolkien</author_name>
<isbn></isbn>
<user_name>Josh</user_name>
<user_rating>4</user_rating>
<user_read_at></user_read_at>
<user_date_added></user_date_added>
<user_date_created></user_date_created>
<user_shelves>2008-reads</user_shelves>
<user_review></user_review>
<average_rating>4.28</average_rating>
<book_published>1937</book_published>
<description>
<img alt="The Hobbit (The Lord of the Rings, #0)" src="https://i.gr-assets.com/images/S/compressed.photo.goodreads.com/books/1546071216l/5907._SY75_.jpg"/><br/>
                                    author: J.R.R. Tolkien<br/>
                                    name: Josh<br/>
                                    average rating: 4.28<br/>
                                    book published: 1937<br/>
                                    rating: 4<br/>
                                    read at: <br/>
                                    date added: 2011/02/22<br/>
                                    shelves: 2008-reads<br/>
                                    review: <br/><br/>
                                    ]]&gt;
  </description>
</item>

Half the data isn’t within the useful tags, instead, it’s just down below the image tag inside the Description. Not all of it though. It’s ugly and weird. The other thing that REALLY sticks out here, if you skim through it, there is NO “title” attribute. The boot title isn’t (quite) even in the feed. Instead, it just has a Book ID, which is a number that, presumably, relates to something on Goodreads.

In the above code, there is a line “for a in books”, which starts a loop and builds an array of book objects. This is where all the data I’ll need later will go, for each book. in a format similar to what is show “title = a.find(‘title’).text”. First I pulled out the easy ones that I might want when later constructing the actual post.

  • num_pages
  • book_description
  • author_name
  • user_rating
  • isbn (Not every book has one, but some do)
  • book_published
  • img

Lastly, I also pulled out the “description” and set to work parsing it out. It’s just a big string, and it’s regularly formatted across all books, so I split it on the br tags. This gave me a list with each line as an entry in the list. I counted out the index for each list element and then split them again on “: “, assigning the value at index [1] (the second value) to various variables.

The end result is an array of book objects with usable data that I can later build into a string that will be delivered to WordPress as a post. The code at this point looks like this:

import requests
from bs4 import BeautifulSoup
​
url = "GOODREADS URL"
book_list = []
​
def goodreads_rss(feed_url):
   try:
       r = requests.get(feed_url)
       soup = BeautifulSoup(r.content, features='lxml')
       books = soup.findAll('item')
       for a in books:
           print(a)
           book_blob = a.find('description').text.split('<br/>')
           book_data = book_blob[0].split('\n                                     ')
           author = a.find('author_name').text
           isbn = a.find('isbn').text
           desc = a.find('book_description').text
           image = str(a.find('img'))
           title = str(image).split('"')[1]
           article = {
               'author': author,
               'isbn': isbn,
               'desc': desc,
               'title': title,
               'image': image,
               'published': book_data[4].split(": ")[1],
               'my_rating': book_data[5].split(": ")[1],
               'date_read': book_data[7].split(": ")[1],
               'my_review': book_data[9].split(": ")[1],
               # Uncomment for debugging
               #'payload': book_data,
              }
           book_list.append(article)
       return book_list
   except Exception as e:
       print('The scraping job failed. See exception: ')
       print(e)
​
print('Starting scraping')
for_feed = goodreads_rss(url)
for each in for_feed:
   print(each)

And a sample of the output looks something like this (3 books):

{'author': 'George Orwell', 'isbn': '', 'desc': ' When Animal Farm was first published, Stalinist Russia was seen as its target. Today it is devastatingly clear that wherever and whenever freedom is attacked, under whatever banner, the cutting clarity and savage comedy of George Orwell’s masterpiece have a meaning and message still ferociously fresh.]]>', 'title': 'Animal Farm', 'image': '<img alt="Animal Farm" src="https://i.gr-assets.com/images/S/compressed.photo.goodreads.com/books/1424037542l/7613._SY75_.jpg"/>', 'published': '1945', 'my_rating': '4', 'date_read': '2011/02/22', 'my_review': ''}
{'author': 'Philip Pullman', 'isbn': '0679879242', 'desc': "Can one small girl make a difference in such great and terrible endeavors? This is Lyra: a savage, a schemer, a liar, and as fierce and true a champion as Roger or Asriel could want--but what Lyra doesn't know is that to help one of them will be to betray the other.]]>", 'title': 'The Golden Compass (His Dark Materials, #1)', 'image': '<img alt="The Golden Compass (His Dark Materials, #1)" src="https://i.gr-assets.com/images/S/compressed.photo.goodreads.com/books/1505766203l/119322._SX50_.jpg"/>', 'published': '1995', 'my_rating': '4', 'date_read': '2011/02/22', 'my_review': ''}
{'author': 'J.R.R. Tolkien', 'isbn': '', 'desc': 'Written for J.R.R. Tolkien’s own children, The Hobbit met with instant critical acclaim when it was first published in 1937. Now recognized as a timeless classic, this introduction to the hobbit Bilbo Baggins, the wizard Gandalf, Gollum, and the spectacular world of Middle-earth recounts of the adventures of a reluctant hero, a powerful and dangerous ring, and the cruel dragon Smaug the Magnificent. The text in this 372-page paperback edition is based on that first published in Great Britain by Collins Modern Classics (1998), and includes a note on the text by Douglas A. Anderson (2001).]]>', 'title': 'The Hobbit (The Lord of the Rings, #0)', 'image': '<img alt="The Hobbit (The Lord of the Rings, #0)" src="https://i.gr-assets.com/images/S/compressed.photo.goodreads.com/books/1546071216l/5907._SY75_.jpg"/>', 'published': '1937', 'my_rating': '4', 'date_read': '2011/02/22', 'my_review': ''}

I still would like to get the Title, which isn’t an entry, but, each Image, uses the Book Title as its alt text. I can use the previously pulled-out “image” string to get this. The image result is a complete HTML Image tag and link. It’s regularly structured, so I can split it, then take the second entry (the title) and assign it to a variable. I should not have to worry about titles with quotes being an issue, since the way Goodreads is sending the payload, these quotes should already be removed or dealt with in some way, or the image tag itself wouldn’t work.

title = str(image).split('"')[1]

I’m not going to go super deep into the formatting process, for conciseness, but it’s not really that hard and the code will appear in my final code chunk. Basically, I want the entries to look like little cards, with a thumbnail image, and most of the data pulled into my array formatted out. I’ll mock up something using basic HTML code independently, then use that code to build the structure of my post string. It will look something like this when finished, with the variables stuck in place in the relevant points, so the code will loop through, and insert all the values:

post_array = []
for each in for_feed:
   post = f'<div class="book-card"> <div> <div class="book-image">' \
          f'{each["image"]}' \
          f'</div> <div class="book-info"> <h3 class="book-title">' \
          f'{each["title"]}' \
          f'</h3> <h4 class="book-author">' \
          f'{each["author"]}' \
          f'</h4> <p class="book-details">' \
          f'Published: {each["published"]} | Pages:{each["pages"]}' \
          f'</p> <p class="book-review">'
   if each["my_rating"] != "0":
          post += f'My Rating: {each["my_rating"]}/5<br>'
   post+= f'{each["my_review"]}' \
          f'</div> </div> <div class="book-description"> <p class="book-summary">' \
          f'Description: {each["desc"]}' \
          f'</p> </div> </div>'
​
   print(post)
   post_array.append(post)

I don’t use all of the classes added, but I did add custom classes to everything, I don’t want to have to go back and modify my code later if I want to add more formatting. I did make a bit of simple CSS that can be added to the WordPress custom CSS (or any CSS actually, if you just wanted to stick this in a webpage) to make some simple cards. They should center in whatever container they get stuck inside, in my case, it’s the WordPress column.

.book-card {
background-color: #DDDDDD;
width: 90%;
margin: 20px auto;
padding:10px;
border: solid 1px;
min-height: 200px;
}
​
.book-image {
float: left;
margin-bottom: 10px;
margin-right: 20px;
width:100px;
}
​
.book-image img {
width: 100%;
object-fit: cover;
}
​
.book-info {
margin: 10px;
}

The end result looks something like this. Unfortunately, the images in the feed are tiny, but that’s ok, it doesn’t need to be huge.

Something I noticed along the way, I had initially been using the “all books” RSS feed, which meant it was giving all books on my profile, not JUST read books. I switched the RSS feed to “read” and things still worked, but “read” only returns a maximum of 200 books. Fortunately, I use shelves based on year for my books, so I can go through each shelf and pull out ALL the books I have read over the years.

Which leads me to a bit of a split in the process.

At some point, I’ll want to run this code, on a schedule somewhere, and have it check for newly read books (probably based on date), and post those as they are read.

But I also want to pull and post ALL the old reads, by date. These two paths will MOSTLY use the same code. For the new books, I’ll attach it to the “read” list, have it check the feed, then compare the date added in the latest entry, entry [0], to the current date. If it’s new, say, within 24 hours, it’ll post the book as a new post.

Change of plans. Rather than make individual posts, I’m going to just generate a pile of HTML code, and make backdated posts for each previous year. Much simpler and cleaner. I can then run the code once a year and make a new post on December 31st. Goodreads already serves the basic purpose of “book tracking”, I mostly just want an archive version. It’s also cleaner looking in the blog and means I don’t need to run the script all the time or have it even make the posts itself.

For the archive, I’ll pull all entries for each of my yearly shelves, then make a post for all of them, replacing the “published date” on each with the “date added” date. Because I want the entries on my Blog to match the (approximate) finished date.

I think, we’ll see.

I’ve decided to just strike out these changes of plans. After making the post, I noticed the date added, is not the date read. I know the yearly shelves are accurate, but the date added is when I added it, probably from some other notes at a later date. Unfortunately, the RSS feed doesn’t have any sort of entry for “Date Read” even though it’s a field you can set as a user, so I just removed it. It’s probably for the best, Goodreads only allows one “Date Read,” so any books I’ve read twice, will not be accurate anyway.

This whole new plan of yearly digests also means in the end I can skip step 3 above. I’m not making the script make the posts, I can cut and paste and make them manually. This lets me double-check things. One little bit I found, there was an artifact in the description of some brackets. I just added a string slice to chop it off.

I guess it’s a good idea to at some point mention the second of the two points I wanted to make here, about reusing code. Programming is all about reusing code. Your own code, someone else’s code, it doesn’t matter, code is code. There are only so many ways to do the same thing in code, they are all going to look generically the same. I picked out bits from that linked article and made them work for what I was doing, I’ll pick bits from my FreshRSS poster code, and clean it up as needed to work here. I’ll reuse 90% of the code here, to make two nearly identical scripts, one to run on a schedule, and one to be run several times manually. This also feeds back into point one, knowing what code you need and how to use it. Find the code you need, massage it together into one new block of code, and debug out the kinks. Wash, rinse, repeat.

The output is located here, under the Goodreads category.

Here is the finished complete script:

url = "GOODREADS URL HERE"
​
import requests
from bs4 import BeautifulSoup
​
book_list = []
​
def goodreads_rss(feed_url):
   try:
       r = requests.get(feed_url)
       soup = BeautifulSoup(r.content, features='lxml')
       books = soup.findAll('item')
       for a in books:
           # print(a)
           book_blob = a.find('description').text.split('<br/>')
           book_data = book_blob[0].split('\n                                     ')
           author = a.find('author_name').text
           isbn = a.find('isbn').text
           pages = a.find('num_pages').text
           desc = a.find('book_description').text[:-3]
           image = str(a.find('img'))
           title = str(image).split('"')[1]
           article = {
               'author': author,
               'isbn': isbn,
               'desc': desc,
               'title': title,
               'image': image,
               'pages': pages,
               'published': book_data[4].split(": ")[1],
               'my_rating': book_data[5].split(": ")[1],
               'date_read': book_data[7].split(": ")[1],
               'my_review': book_data[9].split(": ")[1],
               # Uncomment for debugging
               #'payload': book_data,
              }
           book_list.append(article)
       return book_list
   except Exception as e:
       print('The scraping job failed. See exception: ')
       print(e)
​
print('Starting scraping')
for_feed = goodreads_rss(url)
​
post_array = []
for each in for_feed:
   post = f'<div class="book-card"> <div> <div class="book-image">' \
          f'{each["image"]}' \
          f'</div> <div class="book-info"> <h3 class="book-title">' \
          f'{each["title"]}' \
          f'</h3> <h4 class="book-author">' \
          f'{each["author"]}' \
          f'</h4> <p class="book-details">' \
          f'Published: {each["published"]} | Pages:{each["pages"]}' \
          f'</p> <p class="book-review">'
   if each["my_rating"] != "0":
          post += f'My Rating: {each["my_rating"]}/5<br>'
   post+= f'{each["my_review"]}' \
          f'</div> </div> <div class="book-description"> <p class="book-summary">' \
          f'Description: {each["desc"]}' \
          f'</p> </div> </div>'
​
   print(post)
   post_array.append(post)

Blaugust 2023 – Introduction Week

There isn’t a hard schedule or any real requirements for Blaugust, it’s literally just an excuse that people can use to write blog posts. The timing feels really great though considering social media seems to be starting to collapse on itself and maybe people are more primed for “personal blogging”. Week two is “introduction week”. Since the month started last week on Tuesday and my post then pretty much met the “Welcome to Blaugust” theme, I figure today I could go ahead and keep up with that with an introduction post.

I’ve written plenty of introductions in the past, and a lot of this all may already be covered on my About Page, if it’s up to date. I tend to get a bit rambling on these sorts of things so I’ll do my best to keep it down, it just feels like there is a lot to cover and a lot of it could easily be it’s own blog post or blog post series.

I am, Josh Miller, aka Ramen Junkie. I like to push the “fun fact” that I have been “Ramen Junkie” for more of my life than I have not been Ramen Junkie. People often shorten it to simply “Ramen”. I’ve been called “Ramen” in real life by real people in person. I originally started using the name online back in the late 90s on Usenet, most often in alt.games.final-fantasy or alt.toys.transformers, but elsewhere on Usenet as well, I was really big on Usenet back in the day. I am also the duly elected “Supreme Dictator for Life” of alt.games.final-fantasy.

I have run into a few other Ramen Junkies, though the only two notable ones are on Something Awful’s forums, that isn’t me. And more notable, is Ivan Orkin, who runs several actual Ramen shops and is RamenJunkie on Instagram, and I think X-box. I say X-box because when I tried to reset the password, the domain attached was clearly “ramenjunkie.com” and dude has that domain. If I ever get out to New York, i hope to go to his place there and maybe meet him. Just for fun.

I was going to move on, but I wanted to also add that the name has several sorts of origins, like a Marvel hero. One, Ramen is “cheap hacker food”, so being a ramen junkie seemed cool at the time. I also do like Ramen, and regularly make ramen for meals, both instant (of a wide variety, I like trying new ones) and more homemade with custom broth and noodles and ingredients. The other (true) origin was that I wanted to make a slightly more “trollish” name on Usenet, at the time I had been posting as Lord Chaos, and part of why I picked “Ramen” was because many people who were not Japanese would post using Japanese names from anime. Ramen was an intentionally shitty take on people with usernames like “Shinji” and “Tenchi” and “Usagi”.

Anyway, it’s just sort of stuck.

So now, moving on, the blog itself. I’ve always enjoyed just, writing. My first real website was on Geocities, and though it didn’t have a proper “blog engine”, it has a “blog format” made with manually coded and edited HTML pages. For a while I was using SHTML, which had a mechanism to embed a header and footer page so things could be universal across the site. That first site was The Chaos Xone (The X is for Xtreem!), because in the 90s, Xs were cool. Unlike some folks, I eventually moved on from the cool X. For while I had a second, fairly popular website called “The Geocities Pokemon Center” with all you needed to know about Pokemon Red and Blue.

From Geocities I went to Livejournal, and the name “Lameazoid“, a name chosen because it sounded a bit like “Freakazoid” but also had a sort of retro and self-depreciating undertone to it. For a while I also had a site hosted on my college’s computer hosting, because they provided web space to students, this was sort of the start of a split between having a personal blog and a fun blog. Eventually I landed on WordPress.com, and later with self hosting WordPress on a server of my own with its own domain name, at Lameazoid.com.

Lameazoid kind of stalled out for me, partially because I kept trying to make it more structured. I wanted someplace to put “personal blogs” that didn’t quite fit the “theme” of Lameazoid. At one point I had all my blogging there, but basically, I wanted a personal blog again, where nothing mattered and I could just, post what I wanted. That ended up becoming this blog, [Blogging Intensifies], which has stuck pretty well. It’s a play on the meme [XXXXX Intensifies], which is why it gets stylized with the brackets. I sometimes abbreviate it as [BI]

I’ve always had side blogs, and I have a bad habit of starting up new blogs and then just, folding the content elsewhere and deleting the blog. Sometimes I used WordPress, and sometimes I would try Blogger. Here is a list, of what I can remember, with the name, general content, and where the posts ended up, if anywhere.

  • Livejournal – General posting, Games, Reviews, etc – Ended up all over, though mostly archived due to low quality
  • Snapshot of the Mind – Personal blog on WordPress – Archived or maybe on [BI]
  • Pen to Paper – A writing-focused blog on WordPress – Archived mostly.
  • My BLARG – Shitposting blog on WordPress – Archived
  • OSAF (Opinion Stated as Fact) – A political commentary blog – Most of this has been archived because those opinions were shitty

I know there are more. I probably have a list somewhere.

I suppose more important for an introduction post, is interests. It would almost be easier to list what I am NOT interested in (sportsball) than what I am interested in. Lameazoid has always primarily been about my interest in video games and toys, with a side of comics and movies sprinkled in. My main hobbies are playing video games, of all sorts, and collecting toys, of all sorts. I also like to just create, in general, which is where a lot of the other content comes from, and these days, gets thrown here, on [BI]. Mostly these days I create code, but I also used to write a few stories and draw some, and I actually kind of want to get back to that at some point. I imagine I’m a bit rusty these days, it’s been probably 20 years since I did any of that seriously. I like taking photos and like to think I am ok-ish at it.

I also have always enjoyed music, though more recently, I’ve actually been more openly EXPLORING music, which is why currently this blog gets a fair amount of music-related content. Because it’s one of my current passion interests.

I also enjoy learning and trying new things. I learn to code (constantly). I learn languages (Spanish and Norwegian currently). I am trying to learn the Piano (and absolutely 1000% failing at actually trying). I want to get back into drawing and learn to get better at it. This is all content that sometimes I will talk about here, mostly, as i mentioned, it’s a place where there are no stakes and I can just write about whatever.

It occurs to me that I have written an awful lot about myself, but not a lot about ME. I actually don’t often but for the sake of completionism. I’m (as of this post) 43 years old. I live in a small city in the middle of Illinois. I’m married, going on 16 years now, and I have 3 stepkids who are all adults now, though they still live with us. They all have some sort of (varying) health issues, and my wife used to blog about it herself on her own site. I work in technology for a large company, and have worked on the back-end technical part of Television for around 18 years now. I have a degree in Mechanical Engineering, though I had considered Journalism.

I am generally a bit of a “jack of all trades” type, pretty good at a lot, master of little, that sort of thing.

Weekly Wrap Up (07.30.2023 to 08.05.2023)

Who knows how long this one will last, but I’ve decided to try something different for Saturdays. Basically, just a sort of, rambly, weekly wrap up of… life. No structured requirements, maybe nothing happened and it ends up being short. Basically just sort of, straight regular journaling. What I’ve been doing, what I’ve gotten new, any major events, that sort of thing. I won’t discuss work really, except in vague terms, for a variety of reasons.

Something little I’ve been wanting to do, I added some outside speakers to my music set up, so I can listen to music outside while on the deck. I actually mounted them below the deck, so they would work above and below, but if it doesn’t really work out I can always get a second set for above.

The big thing this week was working on doing Blaugust. I’m taking the mad man route of trying to post at least one post a day. So far, I have…. some… pre written and scheduled, and some TBD. I doubt I keep up this pace after August. I usually keep gaming posts on Lameazoid, but it helps a lot that I’m bored of Fortnite so I’m not super playing it these days. I managed to get Optimus Prime out of the Battle Pass, which that and Summer Meowscles were basically all I cared about. I will probably skip next BP and not play for a while unless it has some super amazing stuff in it. I saw a rumor they may do an Overwatch Collab, which…. I would be really likely to go in for. Because I really like Overwatch as a concept, but I absolutely HATE Overwatch as a game.

Anyway, grinding a game like Fortnite normally eats up too much of my spare time. It’s Unhealthy gaming honestly. In slightly more healthy gaming, I picked up the Avengers game, because it’s being de-listed and it’s on sale for $6, and a bundle of Train Simulator add-ons from Fanatical, because maybe one day I will get on a TrainSim kick like I do with Truck Simulator.

It’s probably worth mentioning new toy stuff for the week too, though that really is also a Lameazoid topic, so I’ll keep it to a minimum. My Pile of Loot from BBTS reached it’s 90 days and needed shipped, so I’ve added that to the collection. I also picked up a lone Transformer from Ross. Let’s just make this one a list.

  • Transformers Kingdom Deluxe Pipes (why did I never get Huffer, the superior one???)
  • Star Wars Black Series Cassian Andor and B2EMO – I need a better Cassian than the awful original Rogue One release and this two pack was cheaper than a single BS figure.
  • Star Wars Black Series Mara Jade – It’s fucking Mara Jade. No more reason needed. Why the Sequels cut all the existing post OT lore is beyond me.
  • Power Rangers Lightning Collection Rita Repulsa – My PRLC is pretty much limited to mighty Morphin’, and it was basically there except for Rita, which was previously only available in a 2 pack with Lord Zedd, whom I already had. Now I have Rita, and she’s a pretty good figure, but I’m a sucker for cloth goods.
  • Power Rangers Lighting Collection Minotaur – OK, Might Morphin’, and any cool monsters they put out. And I need to stop buying the monsters at full retail. They ALWAYS go on markdown/clearance. So far I’ve gotten them all except Pumpkin Rapper, which I should have done, and the Snake Man, which hits all the right buttons, but I can’t bring myself to get it because it looks kind of lame. Anyway, a Minotaur figure is useful to have in general for fantasy stuff.
  • Jada Toys Street Fighter Ryu – Everyone in the toy community is stoked for this line, and Jada in general. Now that I have the first two releases, I’m more excited, for Street Fighter and for their Mega Man stuff. Because these are good figures.
  • Jada Toys Street Fighter Fei Long – I like him even more than I do Ryu.

Something else that might be useful here, with no context, and mostly for my own reference, I’m going to throw out a list of new (to me) music I may have listened to this week. It’s easy at the moment because I’m trying out Apple Music. i tend to keep this huge list of random notes of “Artists to listen to,” but never actually get to them. I want to try to get better about just, throwing them onto the endless playlist and listening to them.

Ok, I said no context, but maybe, a LITTLE bit of context might be useful.

  • Apple had one of their suggested playlists that was just called something like “African Music”, which was a collection of music, by artists from Africa. Lots of sort of hip hip/reggae sort of music. It was good stuff, but I skipped over it after a bit because I wanted to get to well, something else. It’s not that I wasn’t enjoying it, I just wanted to try other new music.
  • Let’s Eat Grandma – I think this one was a Facebook or Instagram Ad. I want to say it was decent.
  • Bluhm – I think this was another FB/IG “Suggested post” This is actually a fairly common place for me to find suggestions.
  • Laufey – Ben Folds is hosting or performing with, I’m not sure what, but basically, Ben Folds and Dodie are doing a thing with Laufey, so I thought I would give her music a try. It’s pretty good. Dodie-ish.
  • Skyr0 – Another Instagram suggestion, but this time it was a Reels suggestion. Some pretty interesting Synth music.
  • Blondshell – A bit more rock/alternative, a photographer I follow who seems to share some of the same tastes in music posted photos from a Blondshell show, so I decided to give it a listen.
  • Jade Bird – Suggested I think in the Lauren Mayberry Discord. I need to give it another go to jog my memory of if I liked it.
  • Half Gringa – One of the acts that’s going to be at Pygmalion, which I am going to in a month or so. So I wanted to listen. I decided I liked it enough to try to catch the live act, then realized it’s not actually at the event I am going to, it was just, posted by the event’s IG.
  • Claud – This one IS going to be at Pygmalion, and right before Lauren’s show, so I’ll definitely be catching their show. It’s good stuff. Some strong “King Princess but maybe not quite as raunchy” vibes.
  • David Byrne/Talking Heads – Occasionally I am reminded of some older artists and I decided that I can’t actually remember which songs they did, so I’ll throw on the “Essentials” list from Apple Music. This was the case for David Byrne. I’ve decided I don’t really care that much for David Byrne, though Talking Heads are decent..
  • David Bowie – It was also the case for David Bowie, except I know what songs David Bowie did, I just…. wanted to listen to a bunch of Bowie.

Arduboy FX

I recently picked up a neat little device called an Arduboy FX. It was a bit of an impulse buy after someone posted about getting one on Threads. It turns out it’s not actually particularly new, the community goes back quite a few years, but it’s still pretty cool none the less, and I am happy with my experience with it.

So what is it? It’s a small credit card sized handheld based on the Arduino. On a related note, it’s “credit card sized” in footprint, not so much in thickness. I wouldn’t trust putting this in a wallet at all, because I feel like my fat ass would snap it if I sat on it. The form factor is worth mentioning though. Traditionally for handhelds, I prefer the “larger options”. I had the full sized 2DS, and the XL 3DS and the large wide Retroid, and I just like, more hand real estate. Despite the Arduboy’s pretty small size, it’s still surprisingly comfortable and I don’t have any problem using it.

Also, the platform itself is open source, so one could buy components and just, build their own, if desired.

This specific version, the Arduboy FX, is different from the older original release, simply called the Arduboy. I believe the main (and possibly only) difference is that the FX includes an add on FX chip and has 200+ built in applications and games. When I ordered mine, I noticed that they sell just the FX part as an add on for the original Arduboy. They both play the same games, but the original can only play one game at a time, whatever is loaded onto it from the Arduino software. You can still load custom games to the Arduino FX.

One thing I want to mention, because it was the first question I had. What happens to the default games when you load a custom game. the answer is, they are all still there. When you upload a custom game or code from the Arduino software, the new game will load, unless you select a game from the included games list. If you choose and load another game, it will overwrite the custom game. I believe there ARE ways to overwrite the original 200 games firmware, but the standard method of upload through the Arduino IDE, does not.

As far as I can tell, most of the worthwhile available games are pre loaded on the Arduboy FX. Basically everything about this is open source in nature. I’m not going to cover any real specifics of the games here, I may do that later over on Lameazoid.com though.

The fun part here is developing games. There is a great multipart tutorial available here, though the last two parts to build Dino Smasher are not complete. The Arduboy is based on C and C++ like the Arduino is. It uses a special library to work the Arduboy functions for button presses and graphics. The tutorials are good and could be done by someone who has no programming experience, though I’ve had pretty extensive experience at this point and they were a nice refresher for my C/C++ knowledge, which I have not used in almost 20 years.

I don’t recommend the other tutorial path though, for the platform game. I’ll be blunt, its presented as beginner-ish, but it’s quite a few levels above the first set of tutorials. It introduces a lot of much more abstract coding concepts. It’s probably good information, but it’s kind of beyond a basic level and many of the comments in the community expressed as much. I was a bit worried when right out of the gate it’s starting with various types of int (integer) variables which can be used. I mean, that’s all great to know, but for the purposes of anything made here, just using int, is going to be fine.

I went through the first tutorial set myself, and built the Pong Game. This is the second time I’ve made Pong funny enough, the first being in Python. After finishing the tutorial, I went through and added a bunch of additional features. Most were things done by other commenters, but rather than pick through their code, I just made a list of ideas and added them all in. I’d recommend it for anyone looking to test their ability a bit beyond this Tutorial, especially if you have some coding ability and want to flex yourself a bit. Here is a little list of suggestions.

  • Add a pause option (easiest is when pressing A during a game)
  • Add a more complex Title screen and End Screens
  • Add a “net” line down the middle.
  • Add an ability to adjust the paddle size (this will probably also require adjusting the AI sensitivity to make the game winnable)
  • Add the ability to select how many wins are needed to win
  • Make the game a bit better by offsetting the ball starting location after scoring.
  • Make the game a bit better by starting the paddles in the middle (The AI tends to miss the first 2-3 shots right out of the gate otherwise)
  • These last couple will need to be added to the title screen.

Anyway, My finished code can be found here.

I’m pretty happy with the result. I’m looking a bit into how to embed these games into my website here, or on my Github.io page. Until then you’ll need an Arduboy to actually run the code.

I’m not sure what I want to do next yet. I may make a go at building a simple Tic-Tac-Toe game, from scratch, just to have a simple project to test my coding chops without using a Tutorial as a base. After that, I am thinking of remaking one of the first games I ever made, a simple text based RPG I had made back in High School called Dragon Quest.

Dragon Quest was vaguely based on Dragon Warrior, which at the time, I didn’t know was actually called Dragon Quest in Japan. The game itself wasn’t actually anything LIKE Dragon Warrior though, it just, was fantasy based, and had Dragons, and the name “Dragon Warrior” was taken. (and like I said, I didn’t know at the time Dragon Quest was ALSO taken, by Dragon Warrior). That game, would be well suited to remake for the Arduboy though as it too was for a simple 2 color platform, I had built it on my TI-85 Calculator. Unfortunately, I don’t have any of the code from it. A lot of people in school had gotten copies of it on their own calculators, and Iw ould get copies back after school forced my calculator to be wiped for tests, to prevent cheating. Also, my calculator is 25 years old now, so the memory has more than wiped itself. I did eventually get a TI-85 data cable, but not in time to save my RPG game code. But I still have a basic idea of how the game worked.

I may try to make the “first game”, which was just a loop of battling and healing in town, with two monsters and an end boss. Then expand it to be more like the second game which was similar, but added equipable items, more monsters, and just more complex game play. If that works out, I can try to add in the map system I had planned to use for a 3rd iteration, written in C, that I had never finished. I do have the code for that floating around.