Author Archives: Michael Descy

My Hobby: Moving Files Around

I have found that my home server hobby is more a “moving files around” hobby. I have reached this conclusion based on the countless times I have found myself moving files from one place to another.

My FreeNAS media server

I have run FreeNAS on a HP N54L Microserver for over five years. It has been a fantastic server. I bought it, a slightly used review unit, loaded with four 500 GB drives that it would not have normally come with, for a song—less than a new one with no storage drives included. Over the years, I updated the storage (now I have 16 TB total, with 8 TB usable space, set up in a single RAIDZ2 volume), and the RAM (from 8 GB to 16 GB). Over that same time period, 8 TB went from an impressive amount of storage to something a relatively inexpensive single drive could handle.

What those single drives don’t have, however, is redundancy and data integrity features. My little FreeNAS server has that, thanks to the ZFS file system. At several times in my home media streaming career, the external hard drive I used to store my media files died, and I lost all my data. Thankfully, no important personal data, like my photos, was ever lost, but the experience was upsetting enough not to want to repeat any more.

Hard drive failures can happen to anyone, at any time, even if you have a nice server rather than a Raspberry Pi with an external hard drive attached via USB. Less than a year after I upgraded my FreeNAS server’s drives, one of them failed. The FreeNAS server emailed me about the error, and its UI showed that my drive array was operating in a degraded state. I quickly ordered a new drive, swapped it out the next day, and never lost a bit of data. (I returned the failed drive for a free replacement, so now I have a replacement available, in case I ever need it.)

File servers fill up, if you let them

FreeNAS has been stable, reliable, and a joy to use. One thing I have learned from running it, however, is that its file system, ZFS, degrades in performance when a volume (a pool of drives) is more than 80% full. FreeNAS will warn you about this threshold, but I never took it too seriously, because poor performance is mostly an academic concern when all you are doing with a server is transferring a few gigabytes a day. I do like to silence warnings, however, so I normally have to prune my media collection, or move some videos I want to keep, but am unlikely to watch again soon, to external, mostly cold, storage.

Of course, where is that old, external drive with my files on it? I have no idea. So, this week, when my FreeNAS server filled up way over the 80% warning threshold, I decided, rather than continuing to free space by deleting movies and TV series that I didn’t want to delete, to add some more redundant storage to my network, and move the old files there. This decision was mostly based on having some extra hardware lying around, unused. I have a 2 TB, two-bay Seagate NAS, which is a little, Linux-based server with a consumer friendly web UI for administration. Unlike FreeNAS, it is very locked down, and unlike my HP microserver, it has only two drive bays rather than four.

At any rate, I set that up again and started moving some files to it, which sounds simpler than it really is. I am cherry picking files that are less likely to be accessed to the new server, so I have to go through everything I have, to some extent. Because the files either number in the thousands (like music files) or are multiple gigabytes in size (like video files), moving them has been very slow. Because the Seagate NAS’s filesystem (EXT4) is different than the FreeNAS filesystem (ZFS), there are other interesting problems, like file naming rules, that trip up file transfers. Because these are two different UNIX-like systems with different users configured on them, sometimes there are permissions issues that prevent files from being moved, renamed, or deleted.

As cool as it is to stream movies and music throughout my house, making it all work requires, from time to time, a lot of low-level file transfers. It has been taking a lot more time and attention than I would like.

Temporary, by Feathermerchants

I was poking around my iTunes library, found an old album I loved from senior year of high school, by a local Connecticut band called Mr. Right. After some Google searches, I found a copy of a song that was one of my all-time, lost, never-had-it-on-a-proper-CD, never-could-get-it-anywhere songs: “Temporary”. It wasn’t what I expected, however. It was a different arrangement, which was entirely unexpected.

When I first heard “Temporary”, it was a power pop song, recorded by Mr. Right (or maybe just Jim Chapdelaine). Apparently, he dusted the song off almost ten years later to record with his new band, Feathermerchants, and reimagined it as a folk-rock (dare I say, Americana?) ballad, sung by a feather-light soprano.

When I was seventeen, I recorded, with my high school band, an EP weeks before we all left for college. Due to dumb luck (one of our friends grew up next door to a bonafide music producer—and the knew each other), two of our four-song EP was recorded, mixed, and mastered by Jim Chapdelaine, who went on to become a 13-time Emmy winner, among other amazing things. We first met up with him because his band at the time (in 1995), Mr. Right, played a gig at my hometown’s annual fall festival on the green. My friends and I pretty much idolized him for a little while after high school graduation.

Jim played a recording of the original song through his board as we were waiting for something to happen—probably while we were waiting for our gold master CD to be written, at 1/2X speed, in Jim’s basement music studio. The chorus is an ear worm, and I really enjoy the lyric. I remembered it to this day, and hearing it made me feel nostalgic.

Journal 2019-04-07

This weekend was great.

On Saturday, my wife and I took the kids to the Staten Island Zoo. One of my wife’s best friends is the director of education there, and she gave us (my 6-year-old daughter, mostly) a private tour. We all had a great time, and my daughter had an absolute blast. She loved everything about it, and got to touch a bunch of animals (sheet, goats, birds, snakes, lizards, an armadillo, a rabbit, and a chinchilla) that we never through she would touch. (You can’t touch most of these animals unless you’re on a field trip or you know someone who works there.)

On Sunday, my wife and I took the kids to one park in the morning and let them play a long time. My 2-year-old son, of course, only wanted to be pushed on the swing, but my daughter wanted to climb and jump and slide and dig in the same, and so on. We had a blast. I took her to another park in the afternoon, where she played for hours, blew bubbles, and made some little friends.

It was great to be able to watch my kids learn and play all weekend. We didn’t go too far from home, or spend that much money, but we all had a great time together.

My (Former) Hobby: Home Media Streaming

For someone who is, now, only marginally interested in television and movies, I have spent a lot of time and money over the years to make my television watching experience awesome. I used to be really into it, and—unless you had a lot of money to burn—it used to be hard to get it working correctly, which fed into my engineering mindset and led me to tinker with hardware and software frequently, for almost a decade.

I started in 2008 by connecting my 13” white MacBook to my (non-HD) TV via a $30 video adapter. Even though my TV was primitive, picture quality was way better when playing video this way, and I could watch streaming videos directly from the networks’ web sites, like “Lost”, on my real TV for the first time. I loved it. After about a year of this, I got a mini-PC as a Christmas gift, which I started using, with an external hard drive, as a home media server.

For the front end, I bought a set-top box that Western Digital used to sell. The system worked…mostly. Streaming over WiFi was reliable for non-HD (480p) and 720p HD encoded TV shows, but anything with higher resolutions, higher bit rates, or DTS audio would usually be impossible to play.

I was never serious enough to buy an expensive computer to connect to my TV, because I figured, correctly it turns out, that video streaming devices would become cheaper and more capable over time. Of course, during that time, I cycled through a ton of set-top boxes (most of which I got for free as review units): Roku boxes, a couple Roku knock-offs, the Boxee Box, the first Amazon Fire TV, an Amazon Fire TV Stick (which was quickly returned), a couple Raspberry Pis running XMBC (which worked great for TV but stumbled on DTS audio), and eventually a number of Apple TVs (fourth generation).

The reason I went through so many front-ends is that they all had two limitations. First, each one left out at least one of the top video sources: either iTunes, Amazon Prime Video, YouTube, or Plex. (Nothing left out Netflix.) Second, all of them choked on certain sorts of videos, depending on their audio or video encodings.

Eventually, I began to watch video on my iPad while I work. This led me to discover Plex in the App Store. Plex is a server that you can install on a computer, coupled with client apps that run on many different devices. Plex looks great, has server side transcoding to make video formats less of an issue, and allows you to manage a centralized library of TV, movies, music, and more. I used Plex on an Amazon Fire TV for a year or two. I started out very happy with it, but the software stability of the Amazon Fire TV decreased over time, and Plex and Amazon did not release software updates timely enough to fix it. Eventually, I was very unhappy with the Fire TV + Plex combo, but still pretty happy running Plex on my iPad.

When the Apple TV, 4th generation, was released, with support for iTunes, Apple Music, Netflix, YouTube, and Plex, I bought one right away. I figured, at the time, that Apple was so big that only it had any chance to get all the major video providers on a single box, and get them to stay long term. (Amazon, of course, was conspicuously absent for several years, but that was not as important to me back then as it is now.) I didn’t expect to love it for to watch baseball on MLB At Bat, but it plays games at 1080p/60fps, which looks amazing, so I do.

Over time, home media streaming went from being a niche hobby, in which nerds like me tried to hook up computers to their TVs, to a very mainstream way to consume video and audio. Thanks to cheap and nearly ubiquitous modern hardware, my home media streaming “hobby”, has basically come to an end. I still maintain a Plex library, but I no longer have to upgrade or to fiddle with hardware connected to my TV, or worry about audio and video encodings and bit rates before I watch a movie with my wife. I also stream a lot more video from outside the home (not via Plex) than I ever did before—just like everybody else these days. It’s not special any more; it’s just another entertainment product, and it deserves very little thought, because it just works. Things are much better now, but sometimes I do miss tinkering with hardware.

Apple Card

Apple announced Apple Card at its event on Monday. Details are incomplete, but its announcement excited me more than the media-related services Apple announced at the same event. Perhaps that is because I pay for things every day, but don’t watch much TV, and my wife and I are happy with our New Yorker subscription (she reads the physical magazine; I read it online) and our New York Times subscription (which we both read via its iOS app).

Apple Card interests me because I use Apple Pay all the time, and Apple Card’s Apple Pay-specific cash back rewards are a 33% better than what I get from either of my two current credit cards on the things I purchase most. From a pure spending and getting rewards perspective, Apple Card seems like a winner to me.

I am a somewhat baffled, however, at the Apple commentators’ many takes on how Apple Card’s rewards are mediocre. I suppose that may be the case for people who want travel rewards, but if you want cash back and can use Apple Pay at your local supermarkets and restaurants, Apple Card is a winner.

I base my opinion on lots of research into the best cash back cards. For the past twenty years, I have been a cash-back-rewards seeker who researches credit cards on NerdWallet and BankRate at least once a year, and occasionally jumps from one card to another. Based on my research, I already have the best credit cards for me, from a rewards perspective. Apple’s credit card’s cash back rewards system is better than all of them, again, for me. Two percent cash back on all Apple Pay purchases would increase the cash back I get from my largest non-mortgage monthly expense category, supermarket spending, from 1.5% to 2%.

I heard on TWIT this week that Apple Card does not have certain protections most credit cards come from, like purchase price protection and extended warranties. That doesn’t matter to me, though, as I have not used those benefits in the 20+ years I have had a credit card.

Apple Card’s announced interest rates fall within what I think is a normal range. Each customer’s interest rate will depend on their credit rating, so it is technically unknown until each person applies for it. Apple has not made it clear whether there is a monthly billing cycle with an interest-free grace period, which is common. This leads to more uncertainty about it, as better cash back rewards are not helpful if you have to pay interest on every purchase. I almost never carry a credit card balance, though, so whatever Apple’s interest rate is for me, and provided there is a normal grace period for purchases, it does not matter.

All in all, Apple Card sounds like a good deal for a lot of Apple’s customers.

Journal 2019-03-20

I have been working pretty steadily on finishing version 4.0 of SwiftoDo Desktop. I feel pretty good about the app, in general. It is coded in Swift now, as opposed to Objective C, and has a much more mature, and hopefully easy to support, architecture.

It will be a massive upgrade from version 3. While I would like to charge for it, even for my current customers, I feel bad enough about drastically changing an app I sold, even if it is for the better, that I am strongly considering just releasing it as a free upgrade. That’s basically my plan for the next version of SwiftoDo on iOS, which will be based on this codebase as much as possible.

My day job has been super interesting lately. I have hundreds of data analysis work papers to write, and I coded some pretty sophisticated scripts to generate all the data analytics I need to run, review, and report on. If only the software I was using made it easier to generate my work papers. I still have days and days of work ahead of me writing all the work papers that document the process. I also re-learned today about VBA’s superannuated support for interfaces, polymorphism, and delegation, for another project I am working on.

My wife has been baking cookies for Purim this week, which is a lot of fun, but incredibly tempting to me, as I have been on a low-carb diet the past few weeks. I have to loose all the weight I gained over the past 14 months, due to stress- and grief-related overeating. I am using MyFitnessPal, once again, to track my eating. I have also been doing low-paced treadmill workouts in the evenings, though not every night. So far, my diet and exercise regime has gone really well, but sweets can still be tempting.

One new wrinkle in parenting that my family is dealing with is that my two-year-old son has recently developed separation anxiety, which is normal at his age. It has lead to a good deal of interrupted sleep late at night, when he wakes up and screams “Mommy!” My wife bears the brunt of it, though. He cries for her, but not for me. I am definitely second banana during these intermittent nighttime terrors.

Journal 2019-03-15

I am going to try to post a journal entry now and then, because I have been neglecting my blog, and even my micro blog, for a long while now.

Today was a good day.

At work, I automated a data analysis process—and, just as importantly, the work paper creation process associated with it—that I will have to run about sixty times for one of my current projects. I am hopeful that all the effort will have been worth it when I can start using it next week.

I am stressing myself out a little bit while doing this work, though, because it would look like I spent the past day or two not moving forward on actual output at all, even though moving forward next week will be much more efficient. I always have to compare the time it will take me to automate parts of my work with the time it will take me to simply ground it out. Of course, both time estimates are usually just guesses for me, because most of my work is one-off project work, which is never repeated (at least not in the same way) on the next project. Luckily for me, I have the weekend off to forget about time and budget pressure for a couple days.

My daughter passed level 50 in Reading Eggs tonight, which she does at school and at home on her Chromebook. I am very proud of her. She has recently started working much harder at learning to read. My wife and I have been pushing her a little harder lately, too, and even hired her a reading tutor (who is super nice) to help her. The best thing to happen about it this week is that we are now all on the same page about, and saying aloud to each other, that increasing her reading skills is the top priority. It helps to be able to prioritize things.

My son probably will never need a reading tutor, but he will need to go to preschool in the fall, and my wife and I have to figure out how to pay for it. We have already started scaling back our expenses (mainly monthly subscriptions and dining out), but have not gone into full-on budget mode just yet. We have started talking about money again, which is good. We may start using YNAB again, but I don’t care for the price of their subscription.

I have been working on a huge update to one of my apps, SwiftoDo Desktop, which is a todo.txt task list manager for the Mac. The current version is super old now, and I re-wrote it from scratch, basing the model code on the iOS version I have been working on for a couple years now. At this point, the new Mac version is even better than the iOS version, but it is still not ready for release. Based on the brief time I can work on it, late at night, I imagine I have several weeks to go before I can release it.

Also, today, I released a bug fix update to one of my other apps, Simple Call Blocker. I fixed a bug that made its call blocking extension not load for a lot of people. It turns out the problem had to do with calling an Apple API incorrectly—and I think the rules changed since I initially released the app, because it used to work without a problem. I had thought the bug was related to the app’s Core Data stack, which I had no way to fix, but it turned out to be something different. It feels good to fix that bug, and hopefully put a stop to all the customer emails I get about it.

SwiftoDo Development Notes, September 2018

Files integration

In late August I released a version of SwiftoDo that added sync support for any cloud data provider, via integration with the Files app. I think that this integration can be improved in the future. For example, right now, you cannot create a todo.txt file in the Files app using SwiftoDo, and you cannot open an existing todo.txt from the Files app.

If I add those features, I may as well rewrite the app’s UI, so that you have to create or open a file upon SwiftoDo’s launch. I would also have to rewrite how preferences are stored, so users could define different preferences for different files they open.

Those changes would, I think, necessitate dropping the offline support features that currently exist—namely manual sync mode, and the failsafes in place for when automatic sync fails (typically due to network unavailability). I am actually not sure how other document-based apps on iOS handle things when network connectivity is lost or unavailable. I would assume they simply cannot work without a constant network connection, because they cannot access their file, but I am not sure.

I do know that a task list is not a typical document-based app, like a text editor. Users typically want it to be always available, rather than dependent on a constantly-available network connection. Because I would rather not remove offline features from my app, and because I currently have very little time for app development, I do not plan any big changes to the app related to Files integration in the near future. When they do happen, I would expect that the UI of the app would be changed pretty significantly.

iOS 12 Support for SwiftoDo

The current version of SwiftoDo runs on iOS 12 without incident. I have, however, compiled a new version of SwiftoDo on the iOS 12 SDK. It has no new features, but the SDK is newer, so it inherits upstream bug fixes from Apple, and I updated my codebase to Swift 4.2. I am dropping support for iOS 10.x, too, because iOS 12 will be released imminently, and it honestly makes no sense for anyone with an iOS device from the past four years or so not to upgrade to it (iOS 12 performance is that good). Because of the under-the-hood changes, and the dropped compatibility with iOS 10, I am bumping the version number to 3.0.0. (Don’t get too excited!)

macOS Mojave Support for SwiftoDo Desktop

I am running the MacOS Mojave beta, and have been testing out its new dark mode. I love dark mode, and it took me about two seconds to realize that dark mode support is not a nice-to-have—it is an absolute necessity. Therefore, have coded support for it in a new build of SwiftoDo Desktop. I will submit it to the App Store soon.

The next version of SwiftoDo Desktop will be compiled on the macOS 10.4 SDK, and will no longer support macOS versions lower than that. (If you are not going to upgrade to Mojave, you can continue to use the version of SwiftDo Desktop you are currently using, of course.)

Other than dark mode support, there are no new features. (Sorry!) Because of the under-the-hood changes, and the change in minimum system requirements, I am bumping the version number to 3.0.0, though. (Again, don’t get too excited, but be happy your app is being supported.)

The future of SwiftoDo Desktop

It is a weird coincidence that SwiftoDo and SwiftoDo Desktop will be on the same version number for a while, but it is only a coincidence. At present, they do not share any underlying code.

My long term plan is for SwiftoDo to resemble, and share tons of code with, the iPad version of SwiftoDo. The approach I would prefer to take would be to use the joint iOS/macOS framework that Apple said is coming next year. I will probably continue work on improving the iOS version’s codebase in preparation for eventual macOS support as well.

I am not sure if every user will want the iOS version on the desktop, but I know that I would. I have considered releasing the next-generation version, whenever it is ready, under a new name (SwiftoDo Desktop 2, maybe) and SKU, so owners of the current SwiftoDo Desktop could continue to use it until it no longer functions on macOS. I have not decided exactly what I will do just yet.

I do not expect that anyone outside Apple will learn anything about Apple’s new framework until WWDC 2019, which will be held in June. What I learn at that time will have significant impact on the direction in which I take SwiftoDo Desktop.

Altec Lansing M650 iPod Speaker Dock

After enjoying the Philips Revolution speaker dock for a while, I started to look for a better sounding iPod dock. I found that in the Altec Lansing M650, which is a 2.1 channel system (yes, stereo speakers plus a tiny, down-firing subwoofer!) in a compact, triangular case, with a 30-pin iPod/iPhone dock on a ledge in front.

I thought, and still think, that it sounds great. Its sound is warm, rich, and natural. While I wouldn’t consider the bass response to be very tight, or there to be any stereo separation at all, it does sound really nice, and can fill a small bedroom or a home office with a pleasant sound that I could listen to for hours on end.

I used one as my main desktop stereo system for a couple years while I worked from home. It replaced my Harmon Kardon Soundsticks, which sounded better for music, but were not as easy to connect to my iPhone. It sounds great for music, podcasts, and for TV—thanks to its line-in jack, I often plugged an iPad into it for better audio when watching baseball or Netflix. I liked this speaker so much that I bought another one for the kitchen, where it was a great base station for phone charging and playing internet radio for several years.

Unfortunately, while this speaker sounds great, its 30-pin dock is poorly implemented. After several months, both speakers emit annoying static from the 30-pin connector unless the iPhone is seated just right. I think I’m the only one in my house who knows how to fiddle with it until the sound clears up. Plus, of course, the 30-pin connector was made obsolete by Apple’s change to the Lightning standard.

I still use both of my M650s in my children’s rooms to play white noise while they sleep, and occasional music while they are awake, through our old iPhone 4 and 4S. It has gotten increasingly difficult to seat an iPhone on them without getting static through the 30-pin connection, but it is still possible. However, because the 30-pin iPhones that drive them are old and barely work at this point (software-wise), these speakers’ days as iPhone docks are numbered. They have a line-in jack in the back, however, and are prime candidates to pair with an Amazon Echo Dot (or something similar) sometime in the future.

Philips Revolution Motorized Portable Speaker Dock for iPhone/iPod

The iPod had a monumental impact on how people listened to music. Not only did it turn people onto digital music downloads, rather than CDs, better than any preceding product; it also made listening to playlists and to shuffled music simple and extremely popular. The iPod’s 30-pin connector had a huge impact on home speaker systems as well. Suddenly, it became the default connection option for a bevy of home speakers. In stores, many speaker systems were repealed by iPod speaker docks.

While I had iPods since the first iPod Mini was released, shortly after I got married, I got an iPod Touch. It came for for free with my wife’s first MacBook Pro, and she had no interest in it. Of course, as a non-iPhone-owner, I found the iPod Touch to be an incredible upgrade from my iPod Nano. Around the same time, I got my first iPod speaker dock for free as well, in exchange for writing a review. It was a Philips Revolution speaker dock that looked somewhat like a boombox, could be driven by a bunch of D-cells or a power cord, and had a rotating dock that could accommodate (in portrait or in landscape mode) every iPod created to date and the first generation iPhone.

For sound, it was perfectly adequate. I liked it a lot at the time, but I thought of it like a boombox rather than a room-filling speaker system. It lacked a subwoofer, and thus had lackluster bass, but it was small, battery powered, and brought music into places in our apartment that it previously didn’t reach. My wife and I enjoyed using it with the iPod Touch for streaming music—mainly Pandora or streaming radio from WNYC—in the dining room while we ate dinner. I really enjoyed using it for background music during meals or for news radio, for which having the richest and best audio quality was not terribly important.

In the same way that my computer, once I got a CD-ROM drive, supplanted the stereo system as my main music player, this speaker system solidified the iPod’s (and later the iPhone’s) prime position as the source for music in my house. It also got me into the habit of streaming audio into the house, rather than only playing previously downloaded (or ripped) music. My wife and I used it in our kitchen for years to stream WNYC news and music. When the iPhone changed from the 30-pin connector to the Lightning connector however, this speaker dock’s days were numbered. And when that original iPod Touch’s software support was dropped by Apple, this speaker dock’s days were done.