What the hell is wrong with my phone?

My only phone since 2007 has been an iPhone. Every year or two I upgrade to the latest model. Tired of having to worry about disk space I paid for the 256GB iPhone 7+. The iPhone 7+ has been the absolute worst device I have ever owned.

The timeline:

Mid-May 2017: My phone restarted on its own. Later that day it ‘restarted’ again but never came back. The screen only showed the Apple logo. I could not update it, restore it, or restore from backup. It was just gone. The phone company replaced it.

Late-May 2017: The replacement phone had bits of white glue sticking out of the sides of the screen. The phone company replaced it.

8 July 2017: I unplugged my phone in the morning and it rebooted. It took 4 minutes to reboot again and then 1 minute to boot enough for me to log in. All of my saved passwords are gone. No apps are logged in and all the apps on my phone think it is a new device. I restore the device from a 4 day old backup and all of the passwords are saved again.

10 July 2017: I open Messages but I’m unable to type anything or select any conversations so I reboot the phone. After the reboot all of the history in Messages is gone. I restore from a 2 day old backup and my messages are now there minus ones sent in the last 2 days.

11 July 2017: While driving my phone stops responding. The screen is black, the home button does not work, and the power button does not shut it down. I force reboot the phone and it starts working again. I plug the phone into the computer and looked at the crash logs from the device. locationd crashes anytime it is accessed.

I try to back up the phone to my computer but get an error. I try to do an unencrypted back up but it fails. I try to backup to iCloud but I get an error that says “Some files were unavailable to backup.” I try changing the encryption password and it fails. I reboot my phone and the computer. I still cannot back up the phone.

12 July 2017: Any app that tries to access location data either crashes or hangs for 10 seconds (which is apparently the longest apps will wait for locationd to respond). Almost every app I use accesses location data for something: Twitter, Calendar, Maps, etc. So every app hangs for 10 seconds before allowing any input.

I get fed up with waiting so I decide to restore the device from a 4 day old backup. I still cannot backup the iPhone. Each backup that fails creates the backup directory and grows the file size to within 100MB of the older backup before failing and removing the directory.

After the restore location services still do not work, apps still take 10 seconds to accept input, and locationd is still crashing. The apps that rely on locationd still crash. Loading the Settings app takes ~20 seconds and it also crashes or hangs before allowing any changes. I CAN back up the phone which I do immediately. The phone company will be replacing the phone.

Out of the 6 iPhones I have owned I have never restored any of them more than once. This device has had to be restored 3 times in the 2 months that I have had it. After it crashed while I was driving I can no longer use any location services even after a complete restore of the phone software.

I have entertained the idea that all of this could be my fault. But it seems highly unlikely. I haven’t jail broken the device, dropped it, or installed an iOS 11 beta. I really doubt my ability to cause Exception Type: EXC_BAD_ACCESS (SIGSEGV) Exception Subtype: KERN_INVALID_ADDRESS at 0x0000000000000000.

What the hell is wrong with my phone?

A Sea of contractors.

Over the past couple years I’ve seen a lot of enterprise IT departments. Most of them are filled with contractors. In some of these companies there are only 5 or 10 technical employees. The rest of the people in the IT organization aren’t actually employed by the company. That means that the majority of the people who build, maintain, and manage their infrastructure and applications are contractors.

Most of the companies are “IT” companies. These are software companies, hardware vendors, and financial services companies. Software and hardware are their business. Without technology and engineering these companies don’t exist.

(One financial services company I saw with more than 400 employees had about 8 employees in the entire IT organization: the CTO, the VP of Engineering, 2 Directors, and 4 managers. The other 50, or so, people who worked in the department were contractors.)

A company over 50 people can’t function without some sort of “IT” department. Someone has to manage email accounts, desktop hardware, office WiFi, and the mix of SaaS applications most companies use. With almost all of the company’s business being done electronically it’s impossible to not have an “IT” department.

I have spent a long time trying to figure out why a company would do this. I have a few ideas:

  • Maybe the company bought into the “IT is a cost center” mentality brought on by CFOs and people with MBAs. As if there is a single part of the company that can function without IT resources. I’d like to see a breakdown of the marginal cost/revenue of engineering vs. accounting employees.

  • Maybe the engineering teams were really behind schedule and adding more project managers didn’t get the software shipped. Having a product owner for every component didn’t work. So now, it’s time to throw engineers at the problem and hope that helps.

  • Maybe it is financially motivated. Spending $150,000 a year, total, for a competent contractor is a lot less than a full time employee would cost. The team of contractors can always be supplemented with consultants. Plus, without all those employees the Director’s bonus looks huge!

  • Maybe it is the only way to get work done. If it is easy to hire and fire contractors but almost impossible to hire and fire full time employees contractors make sense. (Keep thinking about the government benefits if you do get hired full time!)

There are good reasons to bring in contractors: getting a specialist to set up a particular piece of software, building out prototypes without taking away from your core set of engineers, a contract-to-hire employment plan, and event services. These are all reasonable things for which to hire a contractor.

I don’t have anything against contractors. I’ve been one. It can be rough. Since they are not employees they have to provide their own hardware. They don’t have access to the same benefits (or maybe even holidays) as employees. They know that a bad quarter means that their contract might be terminated. (Cisco seems to be one place where actual employees have this problem.) Or Congress could have another budget showdown (all the downside of working for a government but none of the upside).

To mitigate these risks people have started companies that hire employees and then contract them out to larger firms like a “temp” agency would. This provides them with the benefits and stability of being fully employed and mitigating the risks.

As someone who has run a business I cannot think of a worse outcome than the people who my business depends on not having the same incentive to see it do well as I do.

I’m afraid I’m not as smart as I used to be.

I spent a few minutes this evening going over some old philosophy paper assignments. Looking at them, I can’t believe I was able to write those papers. I almost cannot imagine myself writing those papers. I vaguely remember reading some of the essay pieces but, now, I don’t remember enough to write anything coherent about them.

I wish I had been a better student.

How many things am I, are we all, half-assing our way through that we could be doing the right way? I feel that the answer is “too many”, but why? Why are we doing things that we absolutely know will hurt us in the future? Is it because we’re discounting the future value? Are we valuing the present too much?

I remember wanting to watch some TV show instead of doing one of the assigned readings. I can’t say now why that was a better thing to do other than “that’s what I wanted at the time”. I stayed up late so many nights reading assignments and writing papers that were due in 8 hours because I hadn’t bothered doing the work during the week that I was given.

I never did my best work because I never put everything into it. I could make excuses, I had a full time contracting job, I went to school full time, I had a wife and four kids. All true, but I stopped myself from doing my best. Despite all of that I was able to write the papers. Even though most of them were late.

I’m afraid I’m not as smart as I used to be but I am surely more wise. I may not be able to offer Socrates’ argument showing that there is no akrasia. But I know what’s important and I know how to prioritize and execute the tasks that need to be accomplished, shut out distractions, and complete my work.

This must be how my elementary school friends who were WWE fans felt.

I don’t get excited for sporting events or other TV shows. I’ll waste time watching good TV but I don’t get excited about it. It’s to something to do while I’m doing something else.

I can’t wait for the UFC 182 bout between Jon Jones and Daniel Cormier. Both of them undefeated, both of them extremely good at what they do. The stats and skills are so even that I can’t even guess who will win. There’s been a lot of bullshit leading up to the fight so I expect it will be good.

This must be how my elementary school friends who were WWE fans felt.

Docs and Spreadsheets

I worked as a middle manager in a large corporation so I’ve been on the sending and receiving end of emailed spreadsheets and Word docs. Why? Because that’s how business was done.

I worked in a training organization where we were required to report on training completion numbers. The official training completion report was created by me (and others) copy/pasting a list of names filtered from a website into a specific tab on a spreadsheet, deleting the extra cells that were not needed, and making sure the VLOOKUPS in the spreadsheet actually did what they were supposed to do. As manual as this sounds this was the automated version. We used spreadsheets as a business automation tool.

Since we didn’t have the option to just get completion numbers from the website we had to create our own solution. It probably took 5 people 200 or so hours (not including continued maintenance) to get to that level of automation when it would have taken a person on the web team an hour or two to just add in a completion percentage. This was the process for reporting numbers that carried penalties in the millions.

A lot of the reason we had to do the completion numbers like this is because we had agents who were on vacation, sick leave, FMLA, absent, or simply didn’t work for us anymore. It seems to me that since this is an employee and I am able to track that status somewhere it would be trivial to pull from our HR solution (PeopleSoft) and compare with the vendor’s site.

I think reasonable people could agree that this wasn’t a good solution for the problem we had.

I’m not quite sure how the idea for Google Docs came about but I imagine it went something like this, “Executive: I’m tired of having to email people Excel spreadsheets and Word Docs because I can never tell who is reading them or who they might have emailed them to” but it was probably way more creepy.

I’m also not sure what problem they are solving other than “I no longer have to email these docs or spreadsheets around” and creating the problem of “I don’t know what anyone has shared with me, when, or how to find it”. I spend about 30 minutes a week trying to find an old spreadsheet or doc that someone has shared with me. To combat that problem I’ve begun making a copy of each doc that someone sends me so that I’ll be able to find it. Another thing that trips me up here is the difference between “Drive” and the Apps, I don’t know what data will be stored where.

So what is the problem that is being solved with Docs? Is it that we need a minimally viable word processor in a browser (that breaks copy/paste about half the time)? Or the ability to share and restrict permissions to the file? Or the ability to allow everyone to view, some to comment, and others to edit?

Spreadsheets seem to exist to keep arbitrary numeric data and Docs seem to exist to keep anything longer than an email. Is that all? Billions of dollars over the last 20 years for something as simple as “arbitrary numeric data” and “more information than will fit in an email”.

I’ve seen a couple start-ups in the last few days that are trying to fill a perceived gap between what companies actually need and what is provided by Google Apps. Spaces, which was recently bought by one of my favorite group chat applications, Slack (affiliate link) is clearly aimed at the Docs aspect. The second is airtable which is obviously going after the spreadsheet aspect.

Let’s talk about OS package management.

This post is quite long so here are some links to the relevant material:

Introductions

On most modern operating systems there is a package manager that does the following: installs, un-installs, updates, and downgrades packages (software). The names vary by operating system as do the command(s) to invoke the package manager. (For anyone thinking that Mac OS X doesn’t have a package manager: I’m counting the Mac App Store as a package manager since it does the above. It is a smaller subset of packages and they all have to be blessed by Apple but it still performs the functions listed.)

I’ll be writing about YUM and RPM since those are the systems that I know. From conversations I’ve had with people who run Linux versions that use apt, apt-get, or aptitude most of what I’ve written here applies to it as well.

The most used versions of Linux: Ubuntu (Debian) and Red Hat the package managers are written in the Python programming language. The choice of programming language doesn’t really matter; the fact that it is tied to the version of Python installed on the machine is the problem. This brings me to a set of rules on which a better package manager should be based.

The Rules

1. Package managers should never be dependent on the system version of anything.

Perhaps you, dear reader, haven’t had the opportunity to re-install every RPM on a production machine because they were all deleted somehow. I have had that displeasure and it was not a good time. A package manager that becomes broken when the main version of Python on the system is upgraded from Python 2.4 to Python 2.5 or Python 2.6 is completely worthless. A package manager that no longer works if the system’s Python packages become corrupt is worthless.

This is not to say that the package manager versions shouldn’t be tied to a specific OS versions. Having a YUM 5.x for CentOS/RHEL 5.x makes sense. This means that the package manager is completely self sufficient and self contained.

2. Package managers should never be allowed to un-install themselves or their own dependencies.

This goes with rule number 1. The package manager shouldn’t depend on the system version of anything. No package manager should be able to break itself by un-installing its own dependencies e.g., you can use YUM to un-install glibc, a .SO file on which EVERYTHING in Linux depends. This would be fine if you were able to use YUM to install glibc again but you cannot because it depends on glibc to fucking work. The YUM version in RHEL 5 and up include a re-install command. If you’d think it would work in this case, you’d be wrong.

3. Package managers should be able to upgrade you from one version of an operating system to another with minimal downtime and minimal configuration.

Ah the days of CentOS 6’s release! All the awesome new features with a more sane default filesystem: ext4. (I wrote more sane; it’s still not a production file system.) How great and wonderful, we can upgrade CentOS 5 machines to it, right? NOT A FUCKING CHANCE LOSER. The official answer about upgrading between them was: re-install the machine. Wow, what a fantastic idea; just re-install the machine and restore all of its data and all of your customers’/users’ data, they won’t mind at all.

The only time I’ll accept the answer ‘re-install’ is when moving from a 32-bit OS to a 64-bit OS since that is a major ABI change. However, I still think there should be a way to upgrade from a 32-bit OS to a 64-bit OS with minimal downtime and minimal hassle.

Where’s the Code?

This is just my idea for a better package management system that would actually fucking work. I’m extremely hateful towards YUM and RPM because I’ve been burned too many times by just how shitty they both are.

There are no pull requests with this post, there’s no code, and there’s no suggestions for how to implement any of this because trying to change the way a Linux vendor does anything is pointless. Unless, you want to fork the project and spend the rest of your life maintaining it.

If you think it cannot possibly be that bad to change the way a Linux vendor does things: spend a couple days following some sysadmins and software developers on Twitter. You’ll see plenty of people who have tried to add their software to a distro or just update it and are met with constant bureaucracy.

If you write your own software and want to make it available for people to use: You are far better off building OS packages on your own using tools like FPM, or RPM itself and whatever Debian based systems use. You can host your own YUM/APT repo for pretty cheap and there’s 0 bureaucracy with which to deal. Another acceptable method for making your software available would be putting your code up on GitHub and include a Makefile that will build .deb and .rpm packages.

Conclusions

I just want a working package manager that isn’t dependent on system libraries that it can un-install on its own and also be used to upgrade me to a newer version of the operating system I’m running.

Are there things out there like this? Yes. I keep a Joyent SmartMachine around for the times when I need a VPS. It’s fairly cheap, runs SmartOS, and has a production filesystem: ZFS. Upgrading SmartOS from one version to a new one works pretty well. You simply follow Joyent’s documentation. The documentation isn’t updated very often which irritates me but if you check that there is a newer Quarterly release and follow the instructions your machine gets upgraded. SmartOS uses pkgsrc which is available on numerous systems. After logging out and back in your SmartMachine should be in the state that it was. In some cases I’ve had to re-install Python packages I was using but I’m not sure if that is the case for everyone. While SmartOS upgrades seem to work this isn’t a production machine and I don’t use it for anything that would impact users.

Now that I’ve distilled this caremad into more than a thousand words I don’t know why the systems are set up they way they are now. Who thought it would be a good idea for a package manager to be dependent on the installed system software? Who thought it would be a good idea for the package manager to be able to un-install its dependencies? Who thought that making people re-install an OS in order to upgrade to the newest version was a good idea? Why would anyone think that this is a good idea? I’m happy to listen to any of the reasons behind this. If you’d like to discuss further @ reply me on Twitter (@klyntonj). If this is just some remnant of times when hard drive space was a precious commodity or when RAM was scarce; I’d love to see it die.

Linux ruined my lunch.

Popped a DVD into the Lenovo (linux box) so I could watch a movie while I ate since both the Mac and additional monitor were already full of stuff. Totem launches asking if I want to play the movie, I click yes. An error pops up saying additional software is required to play this DVD because LINUX.

So I go to the help page to find out what it needs. Try installing the RPMs it says are available but they aren’t in any of the repos I already have installed because LINUX. Find that people use mplayer instead so I install the RPMForge repo and then install mplayer but it’s not added to any of the menus so I can’t just click on it to run because LINUX.

I go back to movie player and it finds the files it needed on the RPMForge repo and installs them but still can’t play the DVD because LINUX.

Log out and log back in to see if it’s been added it hasn’t because LINUX. Go to the mplayer docs and find that I have to run it from the command line like: `mplayer dvd://` because LINUX. Since I launched it from the command line it doesn’t accept any mouse input, I can’t double-click, right-click, or make it full screen because LINUX.

My food is now cold. I decide to put the DVD into the Mac and just move the stuff off the second screen. VLC just crashes, so I have to use Apple’s DVD Player app. Decide to write this shit down.

My food is completely cold and my lunch break is over because LINUX.

Here’s why I like Django better than Pyramid or Rails.

As part of my day job I get to see a lot of different web frameworks. I also get to see all of their dependencies, requirements, and craziness when building stand-alone installers for them. Some of the frameworks I see have a ridiculous amount of dependencies. Django is so delightfully simple to install and run. Here’s the install_requires from Django’s setup.py:

Z0FL:Django-1.4 klynton$ grep "install_requires" setup.py
Z0FL:Django-1.4 klynton$

None. The only thing you have to have is Python.

Here’s the list of install_requires from Pyramid:

install_requires=[
    'setuptools',
    'Chameleon >= 1.2.3',
    'Mako >= 0.3.6', # strict_undefined
    'WebOb >= 1.2dev', # response.text / py3 compat
    'repoze.lru >= 0.4', # py3 compat
    'zope.interface >= 3.8.0',  # has zope.interface.registry
    'zope.deprecation >= 3.5.0', # py3 compat
    'venusian >= 1.0a3', # ``ignore``
    'translationstring >= 0.4', # py3 compat
    'PasteDeploy >= 1.5.0', # py3 compat
    ]

tests_require = [
    'WebTest >= 1.3.1', # py3 compat
    'virtualenv',
    ]

if not PY3:
    tests_require.extend([
        'Sphinx',
        'docutils',
        'repoze.sphinx.autointerface',
        'zope.component>=3.11.0',
        ])

testing_extras = tests_require + ['nose', 'coverage']

Rails is even worse, here are all of the dependencies required to install Rails 3.2.1:

i18n-0.6.0.gem
multi_json-1.0.4.gem
activesupport-3.2.1.gem
builder-3.0.0.gem
activemodel-3.2.1.gem
rack-1.4.1.gem
rack-cache-1.1.gem
rack-test-0.6.1.gem
journey-1.0.1.gem
hike-1.2.1.gem
tilt-1.3.3.gem
sprockets-2.1.2.gem
erubis-2.7.0.gem
actionpack-3.2.1.gem
arel-3.0.0.gem
tzinfo-0.3.31.gem
activerecord-3.2.1.gem
activeresource-3.2.1.gem
mime-types-1.17.2.gem
polyglot-0.3.3.gem
treetop-1.4.10.gem
mail-2.4.1.gem
actionmailer-3.2.1.gem
thor-0.14.6.gem
rack-ssl-1.3.2.gem
rdoc-3.9.4.gem
railties-3.2.1.gem
bundler-1.0.22.gem
rails-3.2.1.gem

Oh, and these have to be installed in this order or the gem dependencies will fail causing the process to exit, this doesn’t include the Ruby version required to run this version of Rails. Why are you installing gems or python packages manually you may ask, here’s why: AVAILABILITY.

I know who owns my availability and it sure isn’t rubygems.org or Pypi (lmao if you trust the uptime of either) or anyone else but me.

Building an installer for Django only requires the Django-${VERSION}.tar.gz file, it doesn’t require any of the nonsense that Pyramid or Rails does.

Compiling and Installing tmux on SmartOS.

Update: The SmartOS repository starting at 2012Q1 has Tmux1.6 that can be installed by simply running: pkgin in tmux. Here’s a link to the documentation on how to upgrade to 2012Q1.

Since SmartOS was released I’ve been meaning to take it for a spin and see if I like it. Over the weekend I used the Joyent Cloud to spin up a SmartOS64 instance and play with some configuration. The list of packages is OK but not incredible and some of them are pretty outdated. The version of pkgin that comes with SmartOS is missing the provides command which is a real pain in the ass when trying to compile from source.

I, honestly, wouldn’t have ever finished the install without the help of my co-worker Ryan S who, it seems, is really good at tracking down dependencies that are failing and all sorts of other Unix problems.

To install tmux on SmartOS you’ll need to compile some things yourself. You’ll need to compile and manually install:

  • zlib
  • libevent
  • tmux

The versions of zlib and libevent that come with the pkg repo Joyent provides DO NOT work to compile tmux because they’ve been compiled with the wrong ELFCLASS and you’ll just get this error:

ld: fatal: file /opt/local/lib/libz.so: wrong ELF class: ELFCLASS64

There are some packages that you’ll need to install before you can compile and install these modules:

  • python27
  • openssl
  • gcc-compiler
  • gcc-tools
  • gmake
  • gtar
  • gzip
  • libtool-base
  • ncurses

After those are installed you need to install zlib, libevent, and finally tmux:

Installing zlib:

  • wget http://zlib.net/zlib-1.2.6.tar.gz
  • tar xvf zlib-1.2.6.tar.gz
  • cd zlib-1.2.6
  • CPPFLAGS='-I/opt/local/include' LDFLAGS='-L/opt/local/lib' ./configure --prefix=/opt/local
  • make && make install

Installing libevent:

  • wget https://github.com/downloads/libevent/libevent/libevent-2.0.17-stable.tar.gz
  • tar xvf libevent-2.0.17
  • cd libevent-2.0.17
  • CPPFLAGS='-I/opt/local/include' LDFLAGS='-L/opt/local/lib' ./configure --prefix=/opt/local
  • make && make install

Installing tmux:

  • wget http://downloads.sourceforge.net/tmux/tmux-1.6.tar.gz
  • tar xvf tmux-1.6.tar.gz
  • cd tmux-1.6
  • CPPFLAGS='-I/opt/local/include' LDFLAGS='-L/opt/local/lib -levent' ./configure --prefix=/opt/local
  • make && make install

You may run into a problem when doing the make step that looks like this:

gcc -DPACKAGE_NAME=\"tmux\" -DPACKAGE_TARNAME=\"tmux\" -DPACKAGE_VERSION=\"1.6\" -DPACKAGE_STRING=\"tmux\ 1.6\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DPACKAGE=\"tmux\" -DVERSION=\"1.6\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_CURSES_H=1 -DHAVE_DIRENT_H=1 -DHAVE_FCNTL_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_NCURSES_H=1 -DHAVE_STDINT_H=1 -DHAVE_B64_NTOP=1 -DHAVE_LIBXNET=1 -DHAVE_CLOSEFROM=1 -DHAVE_DAEMON=1 -DHAVE_SETENV=1 -DHAVE_STRLCPY=1 -DHAVE_STRLCAT=1 -DHAVE_ASPRINTF=1 -DHAVE_STRCASESTR=1 -DHAVE_STRSEP=1 -DHAVE_DECL_OPTARG=0 -DHAVE_DECL_OPTIND=0 -DHAVE_DECL_OPTRESET=0 -DHAVE_BZERO=1 -DHAVE_DIRFD=1 -DHAVE_SYSCONF=1 -DHAVE___PROGNAME=1 -DHAVE_PROC_PID=1 -I. -I/opt/local/include -D_XOPEN_SOURCE -D_XOPEN_SOURCE_EXTENDED -iquote. -I/usr/local/include -D_XPG4_2 -D__EXTENSIONS__ -D_POSIX_PTHREAD_SEMANTICS -std=c99 -MT arguments.o -MD -MP -MF .deps/arguments.Tpo -c -o arguments.o arguments.c
In file included from /usr/include/sys/types.h:33:0,
from arguments.c:19:
/opt/local/lib/gcc/i386-pc-solaris2.11/4.6.1/include-fixed/sys/feature_tests.h:362:2: error: #error "Compiler or options invalid for pre-UNIX 03 X/Open applications and pre-2001 POSIX applications"
make: *** [arguments.o] Error 1

If you get that error just edit the Makefile and remove the -std=c99 line and run make again.

Now run tmux and you should have a fully functioning tmux installation.

Apparently it isn’t elementary.

I started watching the Sherlock TV series sometime last week. Since there are only 3 episodes per season I went through it quite quickly. It was an OK few hours of television but it had the same hole as any other Sherlock TV show, book, and movie.

  • Sherlock does INDUCTIVE reasoning NOT deductive reasoning.

So the whole branch of science he “created”

  1. Already exists, it’s called deductive logic.
  2. Is completely wrong. He uses inductive logic.

For some reason, people writing adventures for Mr. Holmes have been unable to understand the difference between induction and deduction since 1887. Apparently there’s some other branch of logic that it actually is, called abductive reasoning. From the description it’s basic induction, some guessing, and finally after one has acquired these “facts” actual deductive logic.

I’m, probably, one of the few people who is irritated by this, aside from Philosophy professors who have to re-teach students the definitions. If only the creators were smart enough to see the difference; they could have used the correct terms to make the series more original and correct.

So ist das Leben.