new blog post and cleaning up layout/styles

This commit is contained in:
yequari 2024-11-23 13:01:10 -07:00
parent 22764b7276
commit a64d81c5e6
37 changed files with 139 additions and 111 deletions

View File

@ -4,6 +4,7 @@ title: yequari.com
theme: dreamcast
enableGitInfo: true
params:
author: yequari
# about: "I write code and occasionally blog posts."
webmentions: https://webmention.io/yequari.com/webmention
pingbacks: https://webmention.io/yequari.com/xmlrpc

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 212 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 191 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 179 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 222 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 232 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 212 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 173 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 KiB

View File

@ -0,0 +1,61 @@
---
title: "Fixing Up iPods"
date: 2024-11-19T18:26:41-07:00
year: "2024"
categories:
- tech
tags:
- music
---
A couple of weeks ago my brain suddenly got an itch. I was at the office listening to music on my old Sansa Clip+ player when it's battery died halfway through the day again. Disappointed, I put it and my headphones away and continued my day in silence. But my brain would not be silent. This was a problem and it needed to be solved **now** (or at least as soon as the postal service allows). I started researching many different models of modern mp3 players (I guess we call them DAPs now?) and didn't quite like what I found, until I eventually landed on fixing up an old iPod, partially due to ["My iPod is better than my phone" by Veronica Explains](https://tinkerbetter.tube/w/q5ommxAYYy7kmG8P5M4yq9), which showed me that this was even possible.
## The Haul
The first step was to acquire an iPod, so I started searching eBay, which had me going insane. What's with people selling their broken iPods for $75? At that pricepoint I'd be better off buying a fully repaired and tested unit. After searching through a sea of way overpriced listings, I eventually stumbled on a gem: An auction for an assortment of *7 iPods and Zunes*, including two 5th generation iPod classics! For $60! I placed my bid, watched it like a hawk until I won, and waited for them to come in the mail.
In addition to the 5th generations, the assortment also included a greyscale iPod classic 4th generation, an iPod Nano 1st generation, an iPod Nano 5th generation, and two Zune 30GBs, the first model of Zune! The iPod classics were in varying conditions. The 4th generation is in decent shape, bearing an amount of scratches and dings one would expect from a 20-year-old portable device. One 5th generation came in a hard-shell case, the other did not. The one without a case is pretty beat up. The faceplate has a lot of scratches and dings, and is especially worn around the corners. The chrome backing is reasonably scratched but also dented in a few spots. The 5th generation in the case is in the complete opposite condition, it is *pristine*. It must not have left the case much, if ever. It is a shame that this iPod isn't working because I would feel bad about damaging the the outer shell while trying to repair it, which is one of the reasons I specifically sought out broken units in the first place: ~~if~~ when something goes wrong, I will not have broken a working device.
[![](classics_back.jpg)](images/classics_back.jpg)
[![](classics_front.jpg)](images/classics_front.jpg)
[![](classic_pristine_front.jpg)](images/classic_pristine_front.jpg)
[![](classic_pristine_back.jpg)](images/classic_pristine_back.jpg)
The Zunes are in decent shape, and one actually (kind of) works! Its battery holds a charge, but only for about 4 hours. The Zunes are pretty comparable to the iPod Classics in terms of repairability, even taking the same battery. I'll fix these up and talk more about them in the future, but, because they are Zunes, they are lower on my list of priorities.
[![](working_zune.jpg)](images/working_zune.jpg)
[![](zunes_back.jpg)](images/zunes_back.jpg)
The iPod Nanos are also in decent shape. The 1st generation is almost spotless and the 5th generation is a little scratched up but otherwise fine. Both boot up when plugged in, but immediately die when disconnected. The 5th generation still had the previous owner's music on it, which was fun exploring for a few minutes. As for repairability, according to [iFixit](https://www.ifixit.com/Device/iPod_Nano), both technically fixable, but are rated as "very difficult" due to requiring soldering for the battery. On top of that, the 5th generation is on a whole other level compared to the 1st, which opens up in the same way the Classics of the era do. Just take a look at the pictures in the iFixit guide to get an idea of how cursed it is. 😬
[![](nanos_front.jpg)](images/nanos_front.jpg)
[![](nanos_back.jpg)](images/nanos_back.jpg)
## Performing the Repairs
My plan was to start off with repairing / upgrading the 4th generation and one of the 5th generation iPod classics by replacing their batteries and swapping their original hard drives with [iFlash](https://iflash.xyz) SD card adapter boards. Once the replacement parts came in, I started off with the 5th generation. Getting it open was a struggle at first. The tool from iFixit was slightly too thick to fit well in the seam between the faceplate and the back housing, but after a while I was able to get it. After getting it open, the repairs were straightforward, or so I thought. Once everything was put together and I plugged it in, the only showed "OK TO DISCONNECT" when plugged in, and showed no indication of charging. This is apparently an issue that happens when the ribbon cable is not fully plugged into the iFlash adapter, which I confirmed by putting the old hard disk back, at which point it booted up and started showing it was charging. So I started disconnecting everything again to replace the iFlash board, heard a tiny snap noise, and looked in disappointment as I saw the battery connector completely separated from the motherboard. Fuck.
Repairing the battery connector requires SMD soldering, that is, soldering it to a pad on the motherboard, rather than soldering a wire through a hole. Which is to say it's well above my skill level. In order to salvage this iPod, my other option was to replace the entire motherboard, so I went on eBay, once again, and found one. I also ordered a better tool for opening it, a really thin piece of metal that is much more effective at getting in the seam, and a new purple faceplate. I figure if I have to tear down the whole thing, I might as well customize it a bit. After waiting for my parts to come in, once again, I opened the iPod back up, and completed the repair by following the iFixit guide. While this one was certainly more difficult than just the battery or the iFlash board, it was still fairly easy, since all of the components are just attached with ribbon cables and light adhesive.
[![](ipod_surgery_01.jpg)](images/ipod_surgery_01.jpg)
[![](ipod_surgery_02.jpg)](images/ipod_surgery_02.jpg)
There are two lessons I took from this that I will keep in mind for when I get to repairing the remaining iPod classic. First, the battery connector is *extremely* fragile (which is pointed out on the iFixit page), but the advice to pull straight up on the clip holding the ribbon cable doesn't seem quite right. I had better success on the new board using tweezers to pop one side of the clip up, then fiddling a little bit with the other side to fully release it. Second, make sure the ribbon cable connecting to the iFlash board is in all the way. It is a snug fit and requires a bit of force.
[![](working_ipod_4g.jpg)](images/working_ipod_4g.jpg)
While repairing the 5th generation iPod was quite eventful, to say the least, fortunately, the 4th generation went as smooth as possible. I opened it up (the new tool made it a breeze) and pulled out the hard drive and the battery, which interestingly uses a different connector, it plugs into the motherboard via some pins, rather than using a ribbon cable. Then I put in the new battery and the iFlash board, booted it up and restored it with iTunes! I now have two working iPods!
## Using the iPods
Using the iPods themselves has been a joy. I actually found myself enjoying the 4th generation the most. The screen is readable in a well-lit room without the backlight on, which helps extend the battery life and also doesn't flood my eyeballs with blue light every time I want to change songs. The 5th generation isn't bad to use at all, however the version of the iPod software it runs is basically the exact same as the 1st generation Nano, just on a wider screen, which leaves a lot of empty space that could be used to improve the interface. It seems Apple was aware of this as well, given the overhaul the UI got for the 6th generation.
[![](working_ipods.jpg)](images/working_ipods.jpg)
There are some annoyances, though. The worst part of the experience by far is iTunes. Since my daily driver OS is Linux, my options for using iTunes are to buy a Mac, reboot into Windows, or use a Windows VM. I went with the Windows VM, which works fine except it is slower The second worst part of the experience is how iPods handle ID3 tags. iPods cannot sort music by Album Artist, it is only possible to sort by Artist. iTunes sorts music by Album Artist just fine, so why can't the iPod? It is a major annoyance to end up with artist entries like Daft Punk, followed by Daft Punk feat. Nile Rodgers and Daft Punk feat. Pharrell Williams, each having a song or two from a shared album. Interestingly, the iPod honors the sort order field, so if your music tagger tries to sort Frank Zappa by Z instead of F, the iPod will list it in the Zs. It seems odd that it is inconsistent like this, which leads me to believe that not using the Album Artist tag was a deliberate design decision and not an oversight.
The annoyance of this actually led me to try out Rockbox, a third-party firmware with a bunch of what I would call "power user" features, including support for theming. While not as polished as the Apple firmware, it ended up being really nice to use. I would actually rate my preferred devices as 5th generation with Rockbox > 4th generation with Apple firmware > 5th generation with Apple firmware. The problem, though, is that Rockbox drains the battery *really fast*. I read that this is likely because the iFlash adapters I used do not fully implement the standard interface for disk control, which is what Rockbox uses to determine if it can enter the device into a low-power mode. Recent builds are apparently addressing this, but it makes for a rough user experience in the meantime.
## Conclusion
This was a really fun project that absolutely consumed my mind for a couple of weeks. The iPod is nostalgic for me because it was culturally significant during a time when I was first developing my relationship with music. [I've never owned an iPod classic before](/blog/2022/05/ripipod), so it is fun getting to explore them 20 years later. It's striking to me how well the user interface holds up after all these years. In addition, using an iPod has reignited my desire to maintain my own library of music. While I never truly stopped, I did neglect it for several years, so it is nice to get back into it, clean up items I don't vibe with anymore, and rediscover old favorites. I'll write more about the library management aspect later on, but for now I'm just going to keep on jammin'.

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

View File

@ -6,8 +6,16 @@ date: 2023-04-17T15:00:46-07:00
One day this page will pull some info from APIs to create a more interesting page but for now I just manually update it as needed.
**Games I'm playing**: Octopath Traveler, Vampire Survivors
### Video Games
Octopath Traveler, Vampire Survivors, Baldur's Gate 3, TFT Set 13
**Shows I'm watching**: Nothing currently
### Tabletop Games
Running Rise of the Runelords adapted to Pathfinder 2e
### Shows and Movies
Arcane Season 2
### Music
Sleep, Kyuss, Monster Magnet, Jethro Tull
**Music I'm listening to**: Sleep, Kyuss, Brant Bjork, Queens of the Stone Age, Monster Magnet

View File

@ -2,23 +2,18 @@
<html>
{{- partial "head.html" . -}}
<body>
<div class="wrapper">
<header>
{{- partial "header.html" . -}}
</header>
<nav id="main-navbar">
{{- partial "nav.html" . -}}
</nav>
<div class="main-sidebar">
{{- block "sidebar" . }}
{{ end }}
<main>
{{- block "main" . }}{{- end }}
</main>
<footer>
{{- partial "footer.html" . -}}
</footer>
</div>
<header>
{{- partial "header.html" . -}}
</header>
<nav id="main-navbar">
{{- partial "nav.html" . -}}
</nav>
<main>
{{- block "main" . }}{{- end }}
</main>
<footer>
{{- partial "footer.html" . -}}
</footer>
</div>
</body>
</html>

View File

@ -12,5 +12,3 @@
{{ end }}
</section>
{{ end }}
{{ define "sidebar" }}
{{ end }}

View File

@ -1,5 +1,3 @@
{{ define "main" }}
{{ .Content }}
{{ end }}
{{ define "sidebar" }}
{{ end }}

View File

@ -3,9 +3,7 @@
{{ if .Params.reply_to }}
<p class="context">⬑ Reply to <a href="{{ .Params.reply_to.url }}" class="u-in-reply-to">{{ .Params.reply_to.title }}</a> by {{ .Params.reply_to.author }}.</p>
{{ end }}
<a class="p-author h-card hidden" href="https://yequari.com">yequari</a>
{{ partial "post-header.html" .}}
<a class="u-url permalink hidden" href={{ .RelPermalink }}>Permalink</a>
<div class="e-content">
<h1 class="p-name">{{ .Title }}</h1>
{{ if .Params.Subtitle }}<p class="subtitle">{{ .Params.Subtitle }}</p>{{ end }}
@ -14,5 +12,3 @@
</div>
</article>
{{ end }}
{{ define "sidebar" }}
{{ end }}

View File

@ -1,4 +1,6 @@
<div class="metadata">
<a class="p-author h-card hidden" href="{{ .Site.BaseURL }}">{{ .Site.Param "author" }}</a>
<a class="u-url permalink hidden" href={{ .Permalink }}>Permalink</a>
<div>
<time class="dt-published" datetime="{{ .PublishDate }}">{{ .PublishDate.Format "Mon, Jan 2, 2006" }}</time> {{ partial "categories.html" .}}
</div>

View File

@ -1,5 +1,6 @@
{{ $taxonomy := "tags" }}
{{ with .GetTerms $taxonomy }}
Tags:
{{ range $k, $_ := . -}}
{{ if $k }}, {{ end }}
<a class="tag" href="{{ .RelPermalink }}">{{ .LinkTitle }}</a>

View File

@ -1,4 +1,4 @@
@import url(https://fonts.bunny.net/css?family=ibm-plex-mono:400|noto-sans:400,500,600,700|m-plus-1:400,500,600,700|audiowide:400|koulen:400|catamaran:400,700);
@import url(https://fonts.bunny.net/css?family=ibm-plex-mono:400|noto-sans:400,500,600,700|m-plus-1:400,500,600,700|audiowide:400|koulen:400|catamaran:400,700|adlam-display:400);
/* CSS HEX */
:root {
--heading-1: 2.75rem;
@ -70,13 +70,10 @@ body {
margin: 0;
}
body::-webkit-scrollbar {
display: none;
}
h1,h2,h3,h4,h5,h6 {
color: var(--secondary-text);
font-family: 'Koulen', sans-serif;
/* font-family: 'Koulen', sans-serif; */
font-family: 'ADLaM Display', display;
}
h1 {
@ -159,28 +156,15 @@ a.summary {
header h1 {
font-family: 'Audiowide', display;
/* font-size: 1rem; */
color: var(--header);
display: inline;
text-transform: uppercase;
}
ul.social {
list-style-type: none;
padding: 0 0;
margin: 0;
}
li.social {
padding: 5px 0;
}
img.social {
width: 16px;
}
header {
font-family: 'Noto Sans', sans-serif;
max-width: 1024px;
margin: 0 auto;
}
header a.sitetitle {
@ -195,16 +179,6 @@ header .profile {
text-shadow: 3px 3px 5px var(--link-shadow);
}
header .profile img {
display: inline-block;
}
.wrapper {
max-width: 1024px;
margin: 0 auto;
}
nav#main-navbar {
/* From https://css.glass */
@ -217,7 +191,8 @@ nav#main-navbar {
text-align: center;
padding: 0;
border-radius: 15px;
margin-bottom: 10px;
max-width: 1024px;
margin: 10px auto;
}
nav#main-navbar ul {
@ -245,7 +220,6 @@ nav#main-navbar li a {
display: inline-block;
padding: 20px;
font-size: 1.1rem;
text-transform: uppercase;
font-family: "Noto Sans", sans-serif;
font-weight: 500;
@ -330,38 +304,54 @@ nav#main-navbar li a:active {
}
}
.main-sidebar {
background-color: var(--content-bg);
border-radius: 15px;
z-index: 1;
display: flex;
flex-flow: row wrap;
box-shadow: 3px 3px 5px var(--shadow);
padding: 0;
margin-bottom: 10vh;
}
.sidebar {
flex: 0 1 20%;
border-right: 1px solid #c7c7c7;
padding: 30px 25px;
}
.sidebar h1 {
border-bottom: 1px inset grey;
padding-bottom: 5px;
}
.sidebar p.about-me {
text-align: center;
}
main {
flex: 1 3 70%;
background-color: var(--content-bg);
box-shadow: 3px 3px 5px var(--shadow);
border-radius: 15px 15px 0 0;
box-sizing: border-box;
padding: 2vh 4vw;
max-width: 1024px;
margin: 0 auto;
}
footer {
/* border-top: 1px dotted var(--secondary-text); */
background: var(--content-bg);
text-align: center;
color: var(--secondary-text);
flex: 1 1 100%;
width: 1024px;
margin: 0 auto 10vh auto;
border-radius: 0 0 15px 15px;
box-shadow: 3px 3px 5px var(--shadow);
padding: 2vh 4vw;
box-sizing: border-box;
}
footer p {
font-size: 0.8rem;
}
footer a, footer a:link, footer a:visited {
color: var(--ternary-link);
text-decoration: underline dotted;
}
footer a:hover, footer a:active {
color: var(--ternary-link-hover);
}
ul.social {
list-style-type: none;
padding: 0 0;
margin: 0;
}
img.social {
width: 16px;
}
main li {
padding: 0.2em 0;
}
@ -376,8 +366,6 @@ article p {
}
article img {
display: block;
width: 85%;
object-fit: scale-down;
margin: 8px auto;
}
@ -420,26 +408,6 @@ li.page-item {
padding: 0.3rem;
}
footer {
/* border-top: 1px dotted var(--secondary-text); */
text-align: center;
color: var(--secondary-text);
flex: 1 1 100%;
}
footer p {
font-size: 0.8rem;
}
footer a, footer a:link, footer a:visited {
color: var(--ternary-link);
text-decoration: underline dotted;
}
footer a:hover, footer a:active {
color: var(--ternary-link-hover);
}
#theme-toggle {
background: var(--content-bg);
color: var(--primary-text);