A while back, I got some new network hardware (a NAS and router, specifically) and decided that instead of paying extortionate prices for CAT6 cables, I'd get the tools to do it myself—after all, they'd pay for themselves after about five cables, and I could start reaching for my dream of having a completely clutter-free desktop (i.e. no loose cables dangling). After some time doing research, I realized exactly how tight the specification is and opted to throw in my Amazon shopping cart a specialty crimper and cable ends that purported to make the process of crafting cables much easier.
Several days later, all my boxes had arrived, and it was time to start wiring things up. I sat down with a tutorial on my screen and my tools in front of me, and started making some test connections. For some reason, I couldn't get the cables to work, and after some inspection I could see that the wire "teeth" that are meant to cut through the insulation and into the wire weren't getting pushed in all the way. I figured, the most likely scenario here is that I'm not using the tool right or the CAT6 spec is even trickier than I thought, but after a half dozen more attempts I still couldn't get a working connection. At this point, I decided to look closer at the manufacturer's website, and realized I'd been duped.
The tool itself seemed to be correct, but the box of ends (that cost probably 5x as much, each, as a normal CAT5e termination) were … wrong. The molded plastic and one-time locking piece didn't look like they were supposed to. "Sometimes that happens," I told myself, "when manufacturers tweak things. Maybe I just have an older version or something."
Nope. Amazon had sent me a fraudulent part.
This became a bit of an obsession over the next few weeks. I fired off a bad review (with pictures to prove it), notified the manufacturer, told everyone who would listen that Amazon aren't to be trusted, and so on. Eventually, I stumbled on a tweet (linked from HackerNews) that discussed why this happened.
Long story short: Amazon has a program called "fulfilled by amazon" that sellers generally like because it allows someone else to manage their inventory and online listings (i.e. Amazon), customers like it because it means more products can be fulfilled in a single shipment (from an Amazon warehouse, instead of some rando 3rd party), and Amazon likes it because they get more of a cut from each sale.
However, Amazon generally trusts/has trusted sellers to provide them with authentic goods. When they get an item that claims to match some SKU, they toss it in (I imagine) a big bin of crap, and then when someone orders from any vendor claiming to sell that particular FBA product, the pickers grab one at random and toss it in your box.
As a vendor, you hate this, because when you supply real merchandise but your customers receive fake merchandise, you take the reputation and restocking hit. (It should, of course, be obvious that customers generally hate receiving cheaper goods than they paid for.)
The poison goes deeper
Meanwhile, articles were being published. Over the past three or four years, we've all read about how Amazon mistreats their warehouse workers, how Amazon mistreats their delivery drivers, how Amazon mistreats their corporate employees…
Turnover in all divisions is huge. There are reports of people in corporate crying at their desks every day, of warehouse workers being promoted to manager after six months because of attrition, of people not lasting a week in delivery roles. Everyone in New York hates LaserShip (who, I gather, are a third-party delivery service that contracts mostly to Amazon) because they're lazy and unreliable1.
So why do we use Amazon? Are we heartless? ("No," we tell ourselves, "but why pay more?") Well, you can find anything, right?
… not exactly. Have you ever tried finding all items of a category on Amazon? Let's say you're looking for a class of products—in my case, Network Attached Storage drives, by one of a small number of companies, with certain features—and want to comparison shop. Admittedly, it's gotten better, but it's still not good, because here are your hurdles:
- You do a search, and Amazon thinks it's narrowed down to the product category. You are still seeing some things that don't apply, so you drill down.
- Now, you see mostly the right product, but not just the brands you want to comparison shop. So you check off those filters.
- Now you're seeing mostly what you're looking for, but a recent model you know exists isn't showing up.
- Further, you want to find a specific product in a particular price range, so you sort low to high. However, the first ten pages are filled with accessories that are either appropriate to your product class (RAM, cables) or completely wrong and simply associated with your search for what you can only assume is a result of sellers keyword spamming.
- You re-do the search with more specific terms to try to surface the product you know exists, but now you're not seeing another product that came up during your previous search.
- Worst yet, on some searches variations on a single product show up in the item itself (e.g. pant sizes/colors), whereas others show up as completely different items, swamping out meaningful search results with page after page of noise.
And so on, and so on.
One solution is to window shop at the manufacturer's website. But now you're endlessly cross-referencing searches and reviews anyway, so what service is Amazon providing in this situation? Sure, it's the "world's largest store" (or whatever their motto is), but I'll be damned if I can ever find anything.
Meanwhile, I get so exhausted by the search itself that when I'm trying to build up a big enough order to hit the free shipping mark, I often discover that I've overlooked some important detail of what I've ordered. On average over the past ten years, half the stuff I've received from Amazon has been inadequate to the task I purchased it for. Maybe the windup is too much for me—I spend five days or a week expecting something that will solve my current problem, whereas if I made the same mistake with a brick-and-mortar store it'd only be a half hour until I discovered my mistake—but all too often, I find that whatever arrives is not at all the size, or quality, or even product, I expect.
Maybe when I go to the store, I see fewer goods overall. Maybe I pay more. Maybe I would have been happier with something different, that I never learned about. But at this point, the only things I buy there are products that have been surfaced somewhere else (a blog, or a twitter post) that I literally cannot find anywhere else.
Amazon isn't good at surfacing products I'd like to know about, and their failings and abuses mean that I am now going out of my way to never give them money whenever possible.
There's one final story I'd like to throw out to round this out.
My brother lives on the opposite coast, and I know his hobbies well enough to know that I could never get him anything he wants and doesn't already have. So, because I accumulate credit card rewards points, I just redeemed them for an Amazon gift card (as none of my other options are relevant to his interests. Olive Garden? Home Depot? Nope.)
In return, he ordered me three items related to a conversation we'd had, and relevant to our mutual interests. They were set for delivery on the day we returned from the midwest, so I hoped that they would, as usual, be located in our lobby when we arrived.
One box was there, and I had two "Sorry we missed you!" notifications.
No problem, I'll just swing by the UPS Store and the Post Office during the course of my normal errands!
After over an hour out, dealing with the cold and the ice and the crowds at those two locations, I had all three of my packages. Opening them, I looked at one and said "how am I supposed to use this?" I went back and forth with my brother, looked online a bit, and realized he'd accidentally purchased me a replacement part for the thing he meant to order, and that it was useless on its own.
I went online, setup the return (paying $6.50 for the shipping label), made another trip to the UPS store, paid for an envelope, and waited a week for the funds to appear in my account before I could order the right part.
At the end of the day, my brother tried to do something nice for me, and Amazon turned it into two hours of work and two more hours of confusion and frustration.
Thanks for everything, Amazon.
This may, of course, be a consequence of Amazon paying so little for shipping; LaserShip might not have the flexibility to provide better service because they have to try to eke out a profit margin. ↩
Every day has its own feeling. Saturdays feel different from Fridays feel different from Tuesdays, and this is true even when you're not working regularly.
I generally resent Sundays. The feeling on Sundays is that there is nothing new happening, that the world is holding its breath until Monday. After 2pm or so (when we've barely returned from church) it feels like nothing can possibly happen with the rest of the day, because there is no news, no social media, no chat, no email.
Today, I spent a good deal of time reading a large chunk of two different books, and a couple long-form articles I had on the burner. I also spent, and will continue to spend quite a bit of time writing. I think it's best, perhaps, to spend most of one's time on Sundays accepting the fact that there will be no external novelty, and, accepting that, spend your time in meditation—whatever form that may take. Religion, reading, writing in depth and so forth are all good places to be; the other days of the week can be for sharing and collecting and living and moving, but Sundays lend themselves to living inside your own head.
One of my understated goals is to transform ideas I've written down from single-sentence entries in a notepad somewhere into something a bit more robust and shareable. While sorting through Bear notes today, I found one idea that I feel I can expand on in short order.
Ticks are fascinating and terrifying creatures. They have one overall motive—to suck blood—and they are singleminded in that pursuit.
In the Army we went into the Kentucky backwoods for a group land navigation course, and during a break for lunch (happily, away from the Drill Sergeants) my battle buddies and I stopped for a tick check. One of our guys—Palmer—found a tick on the back of his arm, in a place that had been covered by his blouse sleeve, and spent the next five minutes freaking out as we attempted to get it off him.
By this late point in our training cycle, our DS allowed us to purchase and carry multitools, and having eaten MREs we had matches on hand. So, remembering the old wisdom about tick removal, we tried heating up a knife blade and putting it on the underside of the tick to get it to release. Between curses and shaking his arm, Palmer informed us that all we had accomplished was burning him. So, we got more aggressive: one of our knives had a pair of tweezers, and we used those to wrench the nasty creature out of his skin. After several attempts, we got the tick out, and (to the best of my knowledge) Palmer was shaken but otherwise okay.
The mere existence of ticks is enough to make me want to have nothing to do with them. If they bit and moved on, like mosquitos, I might tolerate them more. But they bite, and they suck your blood, and they spread diseases like Lyme—which is often misdiagnosed for years, and causes remarkable neurological effects—and can even cause you to become permanently allergic to meat. Seeking to avoid these effects, any time I go into the backwoods or anywhere that has a chance of having ticks, I spent ten minutes with a mirror fastidiously checking every part of my body for ticks. So far, I've been lucky.
However, in their quest for blood, they have pursued me. In 2013, I visited my dad in State College, PA, and together we traveled to Gettysburg to see the battlefield in person. There's a little trail on the east side of the battlefield, a little south of the Union artillery emplacements, that's mostly meant for horses and small vehicles. On a lark, my dad and I began to walk down this trail (consisting mostly of dirt and tall grass) when something—the twitch of a hair, a stir of breeze—prompted me to glance down at my legs.
You have to realize that since Iraq, and the Internet, I'm absolutely paranoid about parasites. So when I saw this little… <expletive> punaise1 crawling among the hairs on my leg, I about lost it. Imagine: here I am, a 230+ lb person, cursing up a storm while trying his damnedest to swat a tick off his legs, while the little bugger is holding on for dear life. It hadn't even bit into me, and already it had a firm grasp.
Now, the internet says that ticks can't jump, but I'm pretty sure I didn't brush any grass while we were walking up that path. Perhaps it got on board the Peter train much earlier, when we were walking out on the battlefield, and I only noticed it once it got higher up and the difference in feeling on my leg hairs clued me into its presence. No matter how it got there, though, I was pretty sure I managed to swat it off, and, not wanting to risk any further encounters, we turned back.
Well, wouldn't you know it, not ten minutes later I found another one (or perhaps the original was more tenacious than I thought). Just as profanely but much more focused, I got rid of this one, and promptly tied my shorts2 as far down my legs as they would go. Crisis averted, we spent a few more hours wandering the battlefield before hopping back in the car to return to the hotel. I spent a chuck of the ride back that night telling my dad (who was apparently uninformed) about the dangers of ticks and Lyme, and encouraging him to check himself.
All this is to say that ticks are very good at what they (try) to do. But there's another, more salient point that I want to bring home. There's a reason health professionals no longer recommend people use the "hot knife" method to remove ticks (other than the risk of burning your battle buddy), and further a reason they recommend you use shard tweezers and grab as far down the tick as possible when removing it.
You see, ticks aren't optimized for letting go; they're optimized for hanging on for dear life. Ticks that let go don't breed. Burning a tick can cause it to vomit into the bloodstream, increasing the risk of catching any diseases they carry, and failing to grab a tick far down its head can cause the head to break off while drinking. The head might not get the message that the body is no longer there, and continue 'drinking' well after it should be dead (again, raising the risk of infection).
Why don't ticks evolve to have a stronger connection between their heads and their bodies? Well, first of all, that's not how evolution works; they have to work in large part with the pieces they have. But, more importantly, a stronger neck is a cost without a direct benefit to the singleminded purpose of hanging on for dear life. A tick with a strong neck might have a better chance of surviving separation from the host, but a tick that risks getting separated from the host at all is a bad tick.
High ROI, from a tick's perspective, comes from a) skill in finding a host b) escaping detection while they seek a good feeding spot c) hanging on while feeding d) escaping to lay eggs. None of these criteria is improved by surviving removal, because when one tick dies, there are many ready to take its place.
If we view design, or business, as a competitive environment like nature, we can see parallels: there isn't much potential ROI from being a "careful" company, to insure against unlikely scenarios. The most successful configurations are those that are singleminded in their pursuit of survival, avoiding the risk of removal in the first place. Your survival chances are dictated not by how "good" a company you are, but rather how dogged you are in pursuing a single goal, and if someone comes along and cuts your company off at the head… that's just business.
On Black Friday two years ago, my now wife and I were at Target when we spotted a coffee burr grinder for much less than I expected. I had shopped for them in the past, and the "recommended" one was over $100, whereas the one we were seeing came in much cheaper—somewhere in the neighborhood of $30.
Now, I didn't expect much out of it, except for it to be a bit more reliable than the cheap bladed coffee/spice grinder I had picked up in 2009. We tossed it in the cart, and bought it along with the rest of our stuff. (Black Friday is seriously a good time to pick up household goods, because while everyone else is looking at cheap TVs you have full run of the entire store.)
We've been using it mostly without incident over the past two years. I say mostly, because I had to order a new hopper after a bit of plastic broke off bottom, where the stationary cutting face is screwed into the plastic. I tossed the broken chunk and the loose screw, and used it for the week it took the replacement part to come in.
Well, in the past month, the grinder began to shut itself off a couple seconds into each cycle. I can't decide what causes this, and the manual isn't much help: the only non-idiot troubleshooting step is that maybe the thermal fuse is tripping, which I could believe based on our non-standard duty cycle (we typically grind enough coffee for the week all in one go) or the location we store the grinder (right above the radiator, which is always super-hot as is the norm for Manhattan). After unplugging it for a couple hours at a time between grinds, the behavior persisted, albeit inconsistently.
So what? I knew the grinder was cheap, and I'm no dummy—when an American company sells me an appliance for $30, I understand that part of that bargain is that it uses the cheapest possible parts in the cheapest possible configuration. Still, we had gotten two+ years out of the thing, which works out to an amortized cost of probably $0.25 per pound of ground coffee—not bad, considering that ~fresh ground coffee is often cheaper, and certainly more delicious (and contains fewer bug parts) than pre-ground.
I figured, though, that I could save some money by opening the grinder up and looking for simple faults. I wasn't going to commit more than an hour to this endeavor, as the value of the grinder is so low, and I'm not about to spend more fixing something than it's worth. So, tools in hand, I dug into the internals, and got to see just how the thing was constructed.
Spoilers: it's cheap, and the general idea can be understood by a clever high school student. There is a board that controls the switching for the motor, a number of safeties that stop power if e.g. the hopper is out of place, and a small mechanical control wired up to a ~pot to control grind time. Everything else is physical structure meant to keep all this stuff in the right place, and there are none of the space-saving measures or plastic tabs that make working on consumer electronics so frustrating most of the time.
Well, for better or worse, I couldn't repair it in the hour I allotted (and actually left it worse off than before—the motor no longer engages at all). I suspect the thermal fuse is permanently tripped, or half-tripped, and the motor assembly's construction—as a collection of parts connected as cheaply as possible—means that it would be tremendously difficult to find it and … do anything. I may keep it around as a hobby project for later, when I want to kill an afternoon, but as it turns out there's another reason for me to keep it around.
Have you heard of white label goods? Basically, they're products that are produced on spec by factories, and then other companies come in and either add to them or simply package them up and sell them. White labels have become more popular thanks to Ali(baba/express) and drop shipping, but they have a long history.
As an example, back in the day I used to perform a lot of hard drive surgeries, for myself or as favors to others who were migrating computers or afraid of data loss. I wanted a very particular set of features: external power (because some USB ports didn't offer enough power to drive all hard drives), SATA inside, Firewire ports, and a metal case.
There was exactly one product that fit the bill. But that's not true, because there were actually three or four that fit the bill, but they were all sold by different US companies, but it was clear that ignoring labels and boxes these were all the same product. So I just bought from the one company that seemed the most reputable, and was happy.
The thing about white label goods is that they don't only appear in consumer purchases. I had a cheap Acer monitor start misbehaving, and it was clear upon opening it up that the problem was actually a power board (supplied by, I believe, Westinghouse) with some victims of the capacitor plague on it. It wasn't a good enough monitor to justify sourcing the parts for repair, but I could have easily opened up just about any other flat panel monitor of approximately the same vintage and found an equivalent board inside.
For commodity electronics, as for software, it often doesn't make sense to engineer your own solution when someone else has made a part that does 90% of what you need for a fraction of the price (specialization and economies of scale, yo). So while I understand the motivation to source parts like this, it's still weird to think that there are probably "good" monitors out there that use the same crappy PSU as commodity products that cost 1/4 the price.
Anyway, back to the grinder. Mr. Coffee (the maker of the first grinder) is owned by Jarden, which is a subsidiary of Newell Rubbermaid (now Newell Brands). The grinder that I was eyeballing to replace it is Amazon's best seller, available wherever disposable appliances are sold, made by Cuisinart (owned by Conair). Anyone who's read this far will be able to guess at the punchline, and at why I mentioned the parent companies of each brand.
When I got my new grinder home, I noticed that it felt familiar. Well, it turns out that the internals—the wiring, the position of the safety switches, the size of the coffee chutes, the grinding face—are all exactly the same between the Mr. Coffee and the Cuisinart.
… So, I guess I'm going to keep the Mr. Coffee around for parts.
There is no real consumer choice.
I don't think aimless journaling is necessarily the best thing for me; it will never be interesting to read except by my biographer. In time (= once I have more material to occupy the rest of this site) I will probably move journaling to a less visible place on the site. The nature of this digital journal is not meaningfully different than the stuff I used to write in paper journals, but I'm definitely more self-conscious about what I put up because it will be publicly viewable.
Not about the content, necessarily—I can't fathom there being anything here that's, let's say, incriminating—but the sheer inanity is just … intense. Where am I today? What am I doing? In the past, I would journal for the handwriting exercise, or as a spiritual house-clearing; this digital version is a lot more like just obligation. I can't tell if it's what I should be writing, if it's meaningful or whatever, but I know I have a long list of "more important" topics that I could reach for if I truly wanted to bust out something else.
I think there is a different kind of output I'm going to attempt: mini projects. The current one that's been on the tip of my tongue is "100 interview questions, and their answers." The concept would be more or less, find (or recollect) common interview questions, and answer them. These could then be collected on the site under an appropriate header, like my AppAcademy stuff. I've known that once I have two or more significant categories, I will be adding a navigation page to those items, and perhaps styling them to give readers a sense of locality; this is a definite example of a good one.
Another thing that I've been self-conscious about is the lack of clear technical content. Where I do talk about and allude to design, I feel that the kind of cursory reading this site will gather from (say) potential employers won't really show a that I know my shit, unless there's a clear corner for "here be code blocks." Case in point: there's a multi-line ruby code block, but it's only in maybe the second week of the AA posts? In the ensuing 80+ posts, there's no more than inline code. Does that make me a worse person? Or do I simply need to mark out a specific corner where that stuff can life now?
Regardless, writing about that stuff doesn't come naturally to me—I find that the same energies that drive my writing drive my coding, and so when I code I'm too drained/satisfied to write extensively about it, and vice versa. Furthermore, none of the stuff I "discover" while working on personal code seems particularly clever, but I know that I've benefitted from other coders' forehead slappers in the past, so I should probably get off my high horse and try to give back to the community, so to speak.
Finally, between Bear, Notes, and random and sundry other text sources, I have more than enough fodder to provide for all sort of Hot Takes™ for the indefinite future, but given how my last politics post went (mentally, not what's on the page necessarily) I worry that unless I find a way to set boundaries I'm going to get more constipated with ideas. There aren't that many truly new ideas I've had in some time, but if I don't find a way to get them out, they tend to build up in unproductive ways. One solution is wikifying, but I think I might start trying instead to view them as mini writing exercises: how can I explain the kernel of this thought in 100 (meaningful) words?
Writing long is easy; writing short and good is so hard.
So. I have a local version of my rails re-write of this middleman blog working. For various reasons I decided that going for full control made the most sense1, and thus I ended up with something that's mostly okay. It's clear that certain doors are open now that weren't before, but it's taken a lot of effort to get here.
One of the habits I wanted to train myself in is in learning to accept external code more readily. I think I'm mostly won on that front, but it's still not perfect. The time it takes to learn an API is not always trivial, and it's not clear when my own assumptions differ from those of the authors' whether I'm correct, or they are. Case in point: I wanted some way to slugify categories and tags, and so went looking for ruby libraries that enable that, and found
friendly_id. It's pretty capable, but one thing I wanted to do was
first_or_create_by_slug. After looking through the docs, then the code, for a solution that would make this possible, I started to open a new issue asking for a way to do this. I quickly realized that my request would be meaningless, and I was better off putting together a hack that addressed my own needs, rather than asking for a general purpose solution that wouldn't be a positive addition to the gem.
Would I have realized this if I had elected to write my own code, or would I have made some hack that got me halfway only for me to realize that it's completely infeasible?
I am certain that using someone's CSS library (in this case, Zurb's Foundation) was a step forward. I hate worrying about browser compatibility, and at the end of the day I simply want a vocabulary that allows me to express visual ideas in a flexible way. CSS is a nightmare to figure out from source; thus, front-end frameworks offer advantages through documentation, examples, and actually being tested by people who care.
Back to the main thread: I've sort of paused out. This is being written via a web page on my local computer, and… I added two-way data pathways (import/export) from rails so that I can import test data (== my old blog posts) and compose new posts that can then be slurped up by middleman. It's not ideal—it's not the hosted solution I alluded to in an earlier post—but it's quite similar to the "admin app for composing static pages" half-solution I sketched out. The interface, and codebase, are both things I feel comfortable working on, and some of the ancillary effects I was hoping to see have panned out.
That is to say, I'm seeing how I can better (solo) handle problems I haven't seen before (like, finding and using Foundation in the first place), and getting better at judging what is and is not worth my time, even when I don't always close the loop on this knowledge. And adding weird features for personal use—like a button to output a post to markdown—doesn't feel as off-putting to me now as it might have in the past.
On the other hand, I did spend too long getting this site's CSS re-written so I could get the form classes for free, so it might be that the biggest gain I've gotten is clarity. I can see clearly now in all the ways I'm doing things that aren't in my best interests.
But it's all so pretttttty, and flexible!
The wall, now, is that getting the proof-of-concept code/configuration for external hosting and e.g. blue/green is … not a priority anymore? I can output whenever I want, and I've found stopgap ways to track the things I want to say, and while they're not all going up on the web yet, I can see a path that will make that happen in due time.
Namely, I want to extend the blog model in ways that aren't easily enabled by most blog platforms/static site generators, and the convolutions I could see happening in the near future were getting extreme. ↩
For the better part of the past year, I've been asking myself on what basis we do, and should, select leaders on the national level. I have been asking myself what it is that the Executive Branch does and should do in its daily operation. I finally have a half-answer.
The scope of the Executive
The Executive Branch is huge. Just, massively, mindbogglingly huge. Seriously, click through that list and start scrolling—and compare it to this list of Senate-confirmable positions. There's not even a number attached to the number of confirmable posts; only a range exists. Twelve to fourteen hundred seats are filled by Executive nomination and Senate confirmation. Anyone who has done hiring can confirm that there is no way to vet and organize that many people quickly, especially in the short amounts of time available to an incoming administration.
A (typical) new administration can set its broad goals, but there is no way—short of freezing time and spending a year between November and January reviewing staffing decisions—to optimally build an organization like that. This is where party machinery comes in.
I suspect that the two major parties maintain lists of generally qualified candidates, specific shortlists for certain positions, and additionally know who to call to identify talent. Government of this scale doesn't turn on overnight, but with the right networks it might seem to. But this machinery is in many ways a consequence of a long-standing two-party system. There is no easy to conduct a national campaign in a country of 300 million people without leveraging some machinery, and one way to reward key pieces of that machine is by handing out jobs. Patronage is nothing new, and we can safely assume that among those 1400 positions there are bound to be a few sinecures.
Without describing other possible configurations of the Executive Branch, it's worth pausing to consider if this is the government we want. By their rhetoric, you might suspect that there would be more difference in the configuration of successive governments. Nevertheless, small-government conservatives have traditionally needed to reward their benefactors in the same way that tax-and-spend liberals do—winning national elections is hard—so I suspect the main difference, historically, is in the number of "good faith appointments." That is to say, the person nominated for a seat as undersecretary of the department of we-don't-really-care-about-this could be anyone.
The New York Times posted an excellent visualization of what issues were most important to Americans at different times. Click through the link and play around for a bit; there are arrows that allow you to navigate through history and not just those surveys conducted immediately prior to elections.
Anyone with a cursory knowledge of American history can see that there's a clear correlation between the concerns of the day and the specific administrations' actions. The recession of the early 2000s is writ there, as is NCLB; by contrast, domestic issues are predictably overshadowed by "foreign policy" (i.e. terrorism) by October 2001.
An administration is like the Eye of Sauron: it can see anywhere, at any time, as long as it knows to look there. When priorities turn 180º and it comes time to bring in the back-benchers, an administration's true nature can be revealed.
To put it another way (that's mostly for my own benefit), a election is decided on who offers the best piecewise linear match to an unpredictable function, and damn the rest.
"How can you support him?"
So: how do we decide who should be elected to office? (And not: how should we decide?)
There are ugly bits, such as party selection machinery (or party non-support, in "unwinnable districts"), the primary system, and so forth, but when it comes to early November, my theory is this: we can easily forgive a multitude of sins, as long as the problem that a candidate offers to solve is sufficiently big that the sins seem small.
In short, voters act like this: "If I sincerely believe that X" (where X is killing babies, the war on terror, global warming, inequality) "is an existential threat, I would elect Pennywise the Clown to office if I think he can help fix it, despite knowing that kids seem to mysteriously go missing at all of his campaign stops."
The sins that the right and the left can ignore vary, but both sides ignore sins in roughly equal measure. There are a different ways to win elections in this kind of climate, but one thing is clear: it's a pretty good way to end up with a congress full of clowns.
My goals are broadly to make big personal strides.
I started this year by losing my list of New Years resolutions.
This does not bode well.
Update: After searching a half dozen places, I found them.
One downside of trying to get your act together is that the process itself is bloody. Until your individual habits build up to the point that you do them without mental inertia, everything is fits and starts. Losing my resolutions is a side-effect of a related problem: I never know where to jot things down. The one thing that I have on me at all times is my phone, and there are a good three or four apps that I can use to save data, depending on the need. Offhand, I can
- Create a list in Notes
- Save a scribbling in Bear
- Create a Reminder
- Create a Calendar event
And when the intent of a chunk of mental energy isn't clear, it's not clear where to start[^1].
Regardless, I found my list, and I can see now that it was more of a brain dump (which, again, is why I had trouble finding it). Looking it over, I'm … cognizant of my goals, but I keep performing tasks that are related to one goal at a time.
If I had to summarize, my goal this year is about "process over results." I'd like to lose 50 lbs and (ignoring the problems of weather at the beginning of the year) that means meeting my step goal more days than not, and performing fitness activities more days than not. The beginning of the year has been consumed, on the other hand, with projects that are nothing but what I call "infinite work" problems—ambitious stuff with nebulously defined endstates where the outcome is second to the process itself.
This is fine in software development ("fine"), where you go into the office eight hours per day and work on whatever piece of the project is next, in sprints or tickets or whatever quantum you choose. In life, it's equivalent to doing nothing.
So, for reference, the processes I want to undertake this year: * Read 12 (hard, not pulp) books * Play 10 games (to the point where I feel I have gotten as much out of them as I can) * Watch 30 classic movies * Study Chinese * Hit my step goal more often than not (9/10 days, or 329 days total for the year) * Run X miles (I still haven't set a realistic goal here)
… and more. There's a nebulous "organization" block that sort of centers on content for this website, and a "project" block that involves things like getting this website in a state where every new feature is an addition, not a part of bootstrapping. And there are goals that are consequences of the processes I've identified: I want to stay informed, increase my depth of understanding of the world, and have my physical fitness no longer be a burden. I want to be better at some set of skills (which is why the project block is largely nebulous—there's an infinite slate of things to learn, and it doesn't pay to be a generalist, in general).
I do have to acknowledge that none of these things will be perfect, but that's also why I've concentrated on process goals over outcome goals. Process goals offer you/me a chance to start over with each new day, and while each day can be viewed as a failure, every moment offers the chance for small successes. Instead of futzing around on the internet at any given moment, I can lace up my shoes and go out for a walk or a run, or find the next book I can read (or read a half chapter). And certainly, I've seen some of that in my day-to-day since we returned from IL, but … but. But I'm not at the point where I'm honoring my own commitments, and that's going to be the big challenge.
There are topics we research once in a while to confirm that they're still bad ideas.
I jokingly recall that my dad tries cooking eggplant once every two years to see if he still dislikes it. The last time I was around, we both ate a single slice of a rather appealing looking Eggplant Parmesan, looked at each other, and threw the rest of the tray away.
Today, that mistake is
git-submodules. It makes sense that we'd want to have code that can be used together but that is upgraded at different rates! And, in all honesty, there are plenty of solutions for this kind of problem that don't demand submodules. A typical ruby solution would be to build a gem and either publish it on rubygems, or point the Gemfile to a known git repo; I imagine most other packaging systems offer a similar solution.
Back at Demyst, we used a monorepo, and while I can't decide offhand if that was the right decision, it was skill-appropriate for our situation, and we made it work.
For a time we considered using submodules, but our CTO waved me off and so I didn't do more than some perfunctory research into them at the time.
Today, I thought I'd look at them again, and (as you do), I ended up reading git-scm.
(For context, I'm also knees-deep in writing the book at the moment.)
Looking at the description of submodules, there's … nothing at all worrying here. As one person on HackerNews described it, "so the problem with submodules is that they don't work if you don't use them right."
While writing the book recently, I wondered how to explain to readers how to get over the biggest hump in algebra. And it occurred to me: most problems with git are the same problems people face when learning algebra.
Consider this: algebra is a way of describing highly abstract situations using symbolic representations. We wish to accomplish some task, so we convert the relevant information to symbols, then manipulate those symbols until we recognize that we've achieved a result. We then translate the result back into the language of the problem.
Students who never grasp algebra tend to view it as a collection of recipes. They find a formula that seems to fit their situation, plug numbers in, manipulate by rote, and hope for the best.
I think we've all met developers who do this with git. (Some of us are these developers.) The trouble in both situations is that we don't know what we're trying to accomplish; the canonical "developer who doesn't understand git" treats commits as a secretary treats saving in Microsoft Word: something to be done periodically to ensure you don't lose work.
git add .; git commit -m "Update". All that fits in their model of the world is "this is a way to save my progress and make it available to other developers."
Which can be fine, but it means that in a typical repo the value of using git at all can be lost in the mix1.
For math students and developers, the solutions are probably similar. Motivate the core abstractions, then practice applying them until a) they can see that the abstractions relate to their real-world problems and b) the actions they take mean things and aren't just arcane spells.
The syntax of algebra, and the syntax of git, can be confused as the goal itself, when in truth the syntax is a means; the goal itself is abstract, and without having a pre-existing understanding of what you're trying to accomplish, both skills will always seem like magic.
I for one am a huge fan of patch mode. Even when I'm editing files that span concerns, I'll use
git add -pto triage the files into multiple thematically related commits so that when it comes time to review the history of the codebase, I can remember why I did that particular stupid thing. ↩
One victory and a couple setbacks.
I've been thinking about moving to AWS for some time, which caused me to change my billing on Dreamhost to month-to-month. (Given that I did this probably two years ago, I'm not sure the economics have really worked out.)
Per my previous journal entry, I am considering moving to a static frontend/app backend. It's just and proper that I establish my motivations and desired outcomes for this configuration:
- The ostensible purpose of all this is to have my computing resources meet some standard for stability, reliability, responsiveness and usefulness.
- Stability and reliability are a function of delivering on DevOps skills, i.e. setting up automation and so forth.
- Responsiveness means no free heroku dynos, and no Wordpress slowness.
- Usefulness means again, no Wordpress slowness, and providing a lot of the features I sketched out in yesterday's brainstorming. Basically, the personal goal here is to have all this heterogeneous content available and browsable in a sensible way.
Now, the professional goals here are a bit orthogonal. This configuration should act as proof-of-concept for a number of infrastructure skills that I intend to profit from through work. So the idea of hacking together something that just gets the job done satisfies personal goals but doesn't satisfy the larger professional goals.
For the time being, journaling in sublime and pushing via
scpwill have to suffice, then.
Meanwhile, as much as I like the terms of DreamHost's happy hosting, there are some downsides. Although it looks like you can get away with installing a ~recent version of ruby and running whatever rails version you want, their knowledge base makes clear that they'd prefer you don't on shared hosting. I can move up to a VPS (which would allow me to gain some of the account controls I wanted—more on this later), at the cost of $15/month.
Here, I come to a fork in the road. A lot of the employers I've talked to are ~early stage enough that they get by running on heroku. While I'll admit heroku is a bit of a mystery to me (beyond their relatively painless ruby deploy process) I'm not sure that's the basket I want to put my eggs in.
Meanwhile, there are a couple other options. I could go with AWS because of its practical applications, or for instance DigitalOcean or Google Compute. I think I'll end up on AWS but it's probably worth considering all the alternatives.
If I go with AWS, the temptation is to proof-of-concept setting up overkill architecture to gain experience with as many technologies as I can. That's kind of the point, but I can foresee there being a lot of barriers to success there if I'm not careful. (Also, I don't much like Amazon, the company.)
Ultimately it doesn't much matter, except inasmuch as I don't rely on the crutches of one-click installs and GUIs to configure everything.
Finally, there's a lot of variability in terms of pricing, and I should really look into that a bit more before I commit to a particular infrastructure.
All this said, I have some concrete goals in mind. First, keep this site (ed: static site hosted with DreamHost) resolving as long as possible.
Second, set up an acceptable dev environment, and begin automating everything. Figure out setups/teardowns and immutable infrastructure, backups, etc. before committing significant data to it. This approach has the advantage of saving costs while the system isn't running fully.
Third, establish migration tools to move the data from middleman to the new platform.
Fourth, test everything and then close down shop and re-route DNS to the new server.
I alluded to a victory in the first paragraph. Well, it turns out that for a site like this one, rails offers pretty turn-key page caching that gets served directly from nginx or apache. Score.