a work in progress

panorama of Vancouver/English Bay in summer

Category: Uncategorized Page 2 of 4

Building SelfControl from [REAL] scratch

As someone who is easily distracted by brightly coloured shiny things, which is great when scuba diving in the tropics, but not so great when working on a pretty Retina Display Mac with all sorts of bouncing icons, infinite browser tabs, etc, I use the tools available to remove obstacles in my way. Or indeed, the ones NOT in my way but off to the side of where I want to be going but that are so tantalizing. One such tool is the open source Mac app SelfControl.

The basic functionality of SelfControl is that you set up either a blacklist of sites you don’t want to allow yourself to access for some amount of time or you go hardcore and set up a whitelist of sites that you WILl allow and ban the rest of the world as unacceptable distractions. [Aside: an anti-spam/anti-virus company I used to work for preferred the terms ‘blocklist’ and ‘allowlist’ instead of ‘blacklist’ and ‘whitelist’ for a variety of reasons, some cultural, and where I need to use them, I’ll be using those terms as well.]

With SelfControl, you  decide how long you want to focus for, set the slider for that amount of time, and press ‘Start’.

The way it blocks sites is by modifying the Mac’s hosts file (and firewall) so it needs to use admin privileges, which is why you have to enter your password. For many, that’s a decent way of it asking “Are you sure?” because the average user isn’t going to know how to undo the changes manually – that’s part of why it’s effective.

And that’s a perfectly helpful use case: person says “I need to focus for 2 hours straight, and I’m my own worst enemy, so block distractions RIGHT NOW”. But it’s not the one I’m most interested in, personally.

You see, when there’s something that I’m particularly avoiding starting (usually writing), I won’t necessarily even get to the point of starting the app. There are different tiers of self control and what I’d like to do is set myself a regular schedule with blocks at certain times of day. There’s an argument to be made that if I can’t even boot the app & click the button, I have bigger problems to sort out, but if there’s a way to make the process more structured and automatic, I’d prefer that. And I’ve heard from others that they feel the same way – they think scheduling would be useful.

There are a number of things that I’ll need to work through to get that going (not least of which is figuring out how to automate the privilege escalation on a scheduled basis – maybe cron?) but the first hurdle I had was getting the app to build at all.

I had tried to do this about 8 months ago, with NO success. I haven’t been a Mac developer at all and until fairly recently, I hadn’t been a developer for over 10 years. A lot has changed, y’all! And one of the biggest changes has been the burgeoning mass of package managers to simplify installation of apps, libraries, etc. Although I use Homebrew to install apps on my Mac, I hadn’t heard of CocoaPods and didn’t know there was a required step to run ‘pod install’ to get the required prereq libraries installed in the build directory. [It’s useful to run your build instructions past true newbies to find the steps that are SO familiar/basic that it doesn’t occur to you to write them down].

At the Recurse Center, I learned about a lot more package managers, and that there’s at least one for every platform. I already knew about npm & gem, but not pip, and definitely not pod. So I realized that there was a missing step in the SelfControl instructions – one that would be so automatic for Mac app developers that they wouldn’t consider it missing, but for someone who wanted to start their Mac OSS development with SelfControl, it was pretty crucial. Now, I don’t want to suggest that I don’t know how to search for solutions to issues, nor that you don’t. But when you run up against something where you don’t have a reference point for what’s missing, the amount of the unknown is completely unbounded. You have no idea how far away the finish line is, and if your drive to do this is hobbyist-level, you may bail, like I did last summer.

So, armed with this new knowledge, I tried again to build SelfControl from scratch. I got a bunch of failures (including the promised code-signing ones) but some of them are due to a recent Ruby change that apparently breaks CocoaPods. This post is getting long, so here’s a link to how I got through ’em. It’s ALSO long but that’s largely due to a bucketload of screenshots.

Steps to build SelfControl from scratch with no prior OSX dev experience

Preamble

This post documents the steps required to be able to clone and build SelfControl from absolute scratch – as in, you haven’t done any Mac development to speak of before at all *as of Feb 12, 2016*. I assume you’re running El Capitan.

The only prerequisite I’m going to assume you have is Xcode because:

  1. I really don’t want to try to fully uninstall it from my machine for the purposes of this walkthrough and
  2. if you haven’t got it fully installed, the steps to getting that going are trivial (if you try to run something and it says you need to install more components, install those components. If it says you need to accept the command-line license, page through the full license text in the Terminal and type ‘agree’ (or whatever it asks you to type – I don’t recall the exact text)

(Edited: the above is not quite true. While writing the below I realized that I’m also assuming you are using Homebrew. Look, I’ve tried Macports, and I’ve tried Homebrew, and although there are a lot of pluses about Macports, the developer zeitgeist seems to be around Homebrew. It’s just easier, ok?)

Other than that, I’m assuming you don’t have any extra libraries or tools installed. The reason I’ve listed an exact date above is that I think that part of why this didn’t work for me but did for others is because of a recent change to Ruby that broke CocoaPods. So others couldn’t help me because either they weren’t using that version of Ruby or they’d already gotten their pods successfully installed; the SelfControl build wasn’t failing for them.

Steps

We’ll start with the official build instructions & go from there. I may submit a pull request to update some of the steps – step 2 is definitely wrong once you install the CocoaPods.

  1. Clone the repository
  2. Open SelfControl.xcodeproj in Xcode
  3. Switch the Scheme selector (upper-left-hand corner) to SelfControl — not Distribution
  4. Build!
1. Clone the repository

This is completely correct. However, if your goal is to contribute to SelfControl, you probably want to fork the repo and then clone your fork instead (after all, why are you building from scratch if you aren’t planning to contribute?). But for this walkthrough, you can just clone the official repo if you want. Go to the directory where you want to do your build and run:

git clone https://github.com/SelfControlApp/selfcontrol.git

If you forked the repo, you’d just replace it with your copy, e.g.

git clone https://github.com/karamcnair/selfcontrol.git

That’s what I did. Here’s what you’ll have in the directory after the clone.

 

git_clone

2. Open SelfControl.xcodeproj in Xcode

Nope. I’m not sure if the instructions are just out of date or whether there are multiple paths to building this project with CocoaPods but if you follow the instructions directly and try to build the .xcodeproj file you’ll get missing dependencies because the CocoaPod libraries aren’t there.

See?

So we’re going to take a detour from the official instructions at this point because this is what threw me off last summer and where we’re going off-road in our quest to get this working.

Let’s install CocoaPods

The way we do that is to use ‘gem’, the Ruby package manager.  The process should be:

  1. gem install cocoapods 
  2. pod install ***

WARNING: CocoaPods is currently (remember, this post is as of 2016-02-12) in beta for a new version with a totally different Podfile format. At first I accepted their suggestion to upgrade to the beta version, ended up rewriting the file, and it STILL didn’t work. Do not accept the beta version at this point. That’s not what the problem is.

Note the error we’re getting here: Undefined method ‘to_ary’ ? ¯_(ツ)_/¯

And at the end of the output we see this:

Something that took me longer than I’m happy with to notice:

/usr/local/lib/ruby/gems/2.3.0/gems

[But why would I even care? It knows what it’s doing, right?]

So what is the problem? How come everyone else building SelfControl doesn’t have this error. Well, it turns out that we’re too up to date, my friend! Our systems are too pristine, too fresh! We have the newest Ruby, the version that ships with OSX, and it’s version 2.3.0 (in my case) and not version 2.2. And there’s a problem with 2.3.x, as far as CocoaPods is concerned.

github_writeup

(Look familiar?)

Let’s see if that’s the problem. What Ruby we have now?

Yup. That’s probably it. So how do we fix that? This helpful person has an answer for us:

 

pod_solution

To do that, we use these instructions and to install rvm (Ruby Version Manager) to tell OSX which version of Ruby we want to use. But before we do that, let’s get rid of our current (bad) install of CocoaPods.

I know I could have just had you start by using rvm to pick Ruby 2.2 so that you wouldn’t hit the failing pod install but there are two reasons I didn’t:

  1. there are probably a non-zero number of people out there who have the same problem with the bad CocoaPods & by following these steps, this includes how to recover from that setup and
  2. it’s useful to document thought processes of how to debug & fix borked systems

gem uninstall cocoapods

Then install RVM as per the instructions:

Huzzah! We have the right Ruby! Let’s see if we can fix the Pod Problem!

Let’s REALLY install CocoaPods

So

gem install cocoapods

followed by

pod install

Hey! look at that! It worked.

So here’s where something weird is, that I don’t want to take the time to fully replicate on a freshly installed machine: The first time I got this working, THIS was the output from the ‘pod install’ command:

Note that it says to use the .xcworkspace file, not the .xcproject file. And it’s telling the truth. My directory has a SelfControl.xcworkspace file in it after ‘pod install’ but it didn’t tell me to use it this time. But if I don’t, and use the SelfControl.xcproject file, here’s what Xcode complains about:

See? The pod dependencies aren’t built. So we use the Workspace instead:

Cool, cool. Now we’re actually getting somewhere. The pods are building and so is SelfControl! But. Here come the promised code signing issues.

 

codesign1

OK, this post is too long now. And the code signing issues are ones that are likely common to multiple projects that have nothing to do with CocoaPods, so I’ll be adding a follow-on post just to walk through the OSX Code Signing traps!

Stew Chicken with Rice & Beans

I’m stashing this here because I’m terrible about improvising on recipes, nailing one, and then not having any record of it later for reproduction (look, my brother’s the scientist in the family, my strength is logic, not careful replicable procedures (although I’m working on that with this weekend’s ReimageFest(tm))) (also, I’m the one in the family who’s comfortable with Lisps, as you might well glean from my rampant use of parentheses)

But tonight we’re making a variant of our beloved Belizean stew chicken with fried plantains, rice & beans, and coleslaw and I wanted to learn from my mistakes/victories. Here are the base recipes:

I’m futzing with them in the following ways:

  • 1/2 the amount of chicken in the recipe, but full amount of spices & vegetables. (Probably twice the cumin, tbh. Also, using achiote roja instead of recado because we’re out of the latter).
  • used white vinegar, not lemon juice.
  • adding the optional green pepper and a tomato (technically two seeded roma tomatoes but that’s roughly the size of a normal tomato). The jury is out on the cilantro and brown sugar. Cilantro doesn’t scream ‘belize’ to me.
  • roughly 3 cups of water to cover the chicken etc.
  • I totally don’t understand the “Heat the oil in a heavy pan or deep skillet and sprinkle flour, stirring to dissolve (like a thin roux) before adding chicken pieces.” No oil was specified in the ingredient list, nor flour. I winged (ha) it with about 2mm of grapeseed oil to cover the bottom of the pan (quite a wide pan – ~14″ diameter?) and ~3 tsp/1Tbsp flour.
  • oh, and I had it on medium-high heat. Also not specified 🙂
  • For the beans, we cheated on the soak time b/c we’re using an electric pressure cooker (hi, Instant Pot!). We got some small red beans (supposedly Chilean (I’m really annoyed that I didn’t make room in my suitcase to bring back the “Central American Red Beans” that I bought in NYC – surely those were the exact right ones! (GOYA brand, in case you care))) and soaked them for 3.5 hours.
  • We’re making 1/2 the recipe of this as well, so 1/2 lb beans & ~2.5 cups water (I used the soaking water because I’ve heard that helps with… um… digestion).
  • 1 onion, 3 cloves garlic, the soaked beans, the 2.5 c soaking water into the Instant Pot & set to ‘beans/chili’ for 10 minutes and then natural pressure release. Research suggested 8-9 minutes for beans soaked overnight & ~25 min for dry beans. No one is very clear on how much water so I winged that as well. If the beans aren’t done when the cooker is done, we can throw ’em back in before adding the rice.
  • We actually bought ‘normal rice’ for this! (My understanding is that normal rice is long grain white rice. YMMV. We have about a dozen different kinds of rice in the house but that was not one of them.) Plan is to halve that as well, which should be about 2 cups, but I’ll check the ratio of beans:rice when adding it before re-cooking on ‘rice’ setting.

Update: the beans lie like a rug. 10 min at pressure was not even close. 10 MORE minutes still wasn’t done! (although I may have needed to add more water that I didn’t. Fine. FINE. Added another cup+ of water & back in for another 10 minutes. Still waiting to add the rice. Apparently we’re eating at midnight.)

Chicken update: very flavourless – added all the rest of the achiote roja we had (which, to be fair, was probably stale & had suffered a loss of potency.) Finally, between adding that (about 6x the suggested amount of recado), about 1 Tbsp of Frank’s Red Hot sauce (because we’re almost out of Marie Sharp’s), and about 4 Tbsp of Worcestershire sauce and taking the lid off, we have something that is still basically flavourless to me but Bill says is really good (the peril of being the chef is that spending so much time among the odours means that you become desensitized and can’t necessarily judge the taste properly). So, original recipe, quintuple the spices, add Worcestershire & hot sauce, and we’re good, apparently.

Addendum: We’re also having cole slaw & fried plantains. Bill is a staunch advocate of plain mayonnaise (rather than Miracle Whip, which I prefer) so we based the recipe for cole slaw around that. Turns out that “salad cream” is what we really want (which is apparently better approximated by Miracle Whip than mayo, so there!) so we had to improvise. “Steve” suggests this approximation & although we don’t have any icing sugar, we made do with cane sugar. We shredded cabbage & carrots for the cole slaw & nothing else. The plantains are just plantains, fried in butter. Some things are best in simplicity.

Trying something new

For quite some time now, I’ve been telling myself that I want to write more. There’s plenty of research that shows that writing is a great way to get to know yourself better and, in many situations, to feel better. A lot of Cognitive Behavioural Therapy is based on getting your thoughts out of your head and out into the real world where you can see how distorted they are.

And I have been writing more! Since December 12th, I’ve been doing the ‘morning pages’ exercise from Julia Cameron’s The Artist’s Way and I’ve been finding it to be really helpful for my overall mood and willingness to try new things.

But that’s really only basically stream of consciousness writing, not anything more structured. And it’s just thoughts, not creativity, really (I mean, it COULD be – you can write anything you want in the morning pages, but for me it’s a cross between a ‘brain drain’ (Cameron actually refers to it that way and it’s a good metaphor) and a bit of a journal (which I ALSO want to do more of). It’s not really the type of writing I think I want to try.

So day after day I say to myself “I should sit down and write something.” (THAT sentence shows up in the morning pages pretty regularly). I borrowed “The Writer’s Lab” from the library & it’s due back tomorrow, unused. So I decided to get curious about what was really holding me back.

My first thought was “well, I don’t really have a place to write” Sure, nobody ever does any writing in coffee shops or in bed or at the desk or at one of the THREE computers they own (in fairness, two of them are over five years old).

That was followed by “but I don’t know what tools I should use!” Ah yes… The self-perpetuating variant of yak-shaving that is tool-smithing. Perhaps the greatest method of procrastination ever invented by humans (and one particularly beloved by software developers because we can make new tools to avoid doing what the tool is supposed to make easier).

But there’s a little bit of truth in that last one. I am very much enjoying writing with pen & paper for the morning pages and have developed a bit of a fetish for nice stationary and writing tools. But there are pragmatic reasons to write on a computer, not least of which is the complete illegibility of  my handwriting (not good to start with and completely devastated by a career in software). It’s also pretty much a given that any publication of what I write will be done via computer. Transcribing my own writing doesn’t sound like a lot of fun to me, although there are benefits to that type of process. It forces a write/edit/revise cycle that can too easily be short-circuited by ‘live’ writing. But I think it makes sense for me to start out on the computer and go from there.

“Medium” or “WordPress”†? “WriteRoom” or “Sublime”? “Scrivener”? OK, now you’re just fucking around. Pick one and get on with it. Delay any decision you can (a good rule in general, as long as you’re taking into all the factors that make up whether ‘you can’) and start.

So I am. I am making one concession to my poor mind that is afraid of failing/rejection/mockery. I’m going to do all the fiction-type writing on the MacBook Air, using WriteRoom, with wifi turned off. That machine will become THE place to write creatively and that will also lend a bit of ceremony to the act of sitting down to write. Not so much that it’s ‘precious’ but enough to give it a bit of a sense of occasion and to celebrate that I’m trying something new.

† While I was trying to figure out what it was that was stopping me from getting started, I realized something surprising. I was worried about writing on WordPress at this site because I was afraid no one would find and read what I wrote. But I was also worried about writing on Medium because I was afraid that people WOULD find and read what I wrote. Recognizing that last part was the thing that got me moving.

 

Today in computery things.

Success! I sorted out a git merge problem all by myself and it worked! And wrote some unit tests in Xcode, thanks to Natasha The Robot!

Fail! My mac had two kernel panics today. The first time I suspect Xcode because it had been a bit crashy, but it wasn’t running the second time. So I’m now side-eyeing Spotify and vagrant.

Neutral, followed by hilarious! I thought of a Zulip feature I wanted to add that I thought would be pretty quick to do because there were examples in other parts of the system for all the required ‘chunks’ (display sublist over here, find all PMs over there – should be a pattern matching exercise. And it was, at first, as I added code and tested it in the Chrome dev tools. (Have I mentioned how freakin’ ecstatic I am to have access to a proper debugger in a browser? I learned about it two weeks ago and I still catch myself giggling with delight). Then all of a sudden Zulip completely stopped working. So I undid my most recent change. Still busted. Undid the previous one. Still busted. Here’s where I start shaking my fist at dynamically typed/interpreted languages that don’t have compiler errors. I worked on it for a while and finally sent up a flare, asking for anyone who knew python well and the Zulip codebase at least a bit.

A fellow Recurser came to my aid and I started walking him through my code, talking pretty quickly until I saw the look of confusion on his face. I asked him what wasn’t clear and he said “I thought you said you were having trouble with python. This is Javascript.”

He was, of course, correct. I had been working in Javascript all afternoon (c.f. delight for the Chrome debugger above – bit of a tip-off, eh?). I just had been so used to working in the Zulip back end, which is written in python, that my brain had set WORKING_LANGUAGE=”python”. I mean that context was well and truly set, to the point where I had looked up the best way to determine if a python Dictionary contained a key and written some code in that format. But I had deleted it before saving & running it because I’d realized I didn’t need that check.

I don’t know if it’s a good thing or a bad thing that I can work in a language without knowing which one I’m in (in truth, I tend to base so much of my coding style on the style of the code that I’m modifying that it’s not terribly surprising) but I’m guessing it didn’t boost my credibility very much 🙂

At any rate, I have fallen back to what all of us with more than a couple of year’s programming experience do when we hit these types of errors-that-can’t-be-possible: copy all my changes somewhere else, grab a fresh copy of the pre-modified code, and reapply each tiny change one by one, testing & committing after each change. Same as it ever was.

It has been ‘a week’ (wait for it – there’s an upturn at the end)

Of the 6 subway trips I have taken (so far) this week, the first 4 had major issues: train taken out of service, “sick passenger” at a downstream station (which I truly hope is not a euphemism for someone on the tracks), track situation (based on the MTA ads, likely a track fire due to litter (people, pick up your litter!)), and just an unknown ¯\_(ツ)_/¯ delay. Each was 30 minutes minimum. I didn’t mind much: the out of service was the day I took the J, so I was above ground & got a lovely view of early morning sun, the ‘sick passenger’ was no doubt having a MUCH worse day than I was, the track situation one I was on the train with a friend who I enjoyed talking with, and for the ¯\_(ツ)_/¯ I was listening to a Pema Chödrön track I had somehow not heard before!

The thing that had bothered me a bit was that I finally gave into the pressure to drop off my laundry instead of doing it myself and that.. did not go well. I stopped to drop it off Monday morning (including pyjamas) on my way in to the Recurse Center with the expectation that it would be done for pickup that evening. It was going to be $8! Less than it cost me to do it myself! But… apparently it would be done Tuesday evening.

That’s not what I had been led to expect. ALL my clothes were in there (like I said – even pyjamas!). I asked if there was a way to pay more for express service and the gal behind the counter looked slowly over her shoulder. As I gazed along the wall of bags of laundry, I knew what the answer would be. No. Ok, that’s fine, I hate sleeping in clothing anyway – it’s only b/c I’m at an Airbnb that I even bother. And I have either some summer capris or some fancy clothes I can wear on Tuesday. [Note: this was before the first of the Train Events so I didn’t know what was coming.]

Fast forward past a lotta train stuff to me stopping by Tuesday evening (7pm) to pick up my laundry. When I dropped it off, I tried to pay for it but the credit card processor wasn’t working (shoulda been a tip-off). The woman gave me a receipt anyway (which confused me because I hadn’t had any coffee yet – it was for my actual laundry pickup as opposed to a credit card slip) and told me to call to make sure it was done. In a fit of optimism (and because the laundromat is only 2 blocks from my place) I stopped by without calling.

Yeah. Not only was it not done, it wasn’t started. And when I asked about it by the receipt number, it wasn’t in the job log. The only reason she found it was that ‘black mesh bag’* was written on the slip (and the fact that I could see it as one of the foundation blocks in the new laundry wall and pointed at it). Here’s where it was a blessing that the CC didn’t work because when I said “Can I just have it back?” she asked “Did you already pay?” Since I hadn’t, she gave it to me. (I assume that she’d have given it to me anyway if I was willing to forfeit the $8, but clearly there was no way to give a refund).

So today, the day when the trains didn’t turn on me, I left RC early to do laundry. [It was windy & rainy enough today that an RC-er from Seattle went to buy an umbrella. Remember how I have a mesh black laundry bag? It’s technically a scuba fin bag which is great for letting wet fins drain and not so great for protecting freshly dried laundry from the rain] I loaded up the Stanford iTunes U Swift course on my iPad, grabbed the noise-cancelling headphones, wrapped the mesh <smdh> laundry bag in my trenchcoat & headed out.

The laundromat actually didn’t require the noise-cancelling headphones that early (by comparison, when I stopped by last night to pick up my clothes, there was a kid literally racing around the place on a razor scooter and three others screaming and hunting each other. At least I assume it was hunting. It didn’t look like playing) and things were going well. When it was time to change over to the dryer, I had to go get one of those baskets to move my clothes. I was overloaded with raincoat, trenchcoat, annoying mesh bag, backpack to protect iPad & headphones, iPad & headphones, laundry soap and dryer sheets. I dashed over to get the rolling basket & came back & piled all the stuff on the clothes, loaded & started the dryer.

Then I went to check my email on my phone.

So, I didn’t mention my iPhone above b/c it’s usually attached to me. iPad is extra, headphones extra, backpack extra, etc. iPhone is in pants or coat pocket. But this time, because all clothes are in the laundry (and coats are piled on the laundry) I’m wearing running tights & an exercise shirt and have no pockets.

Hm.

Thus began a 14 minute panicky search for my phone. Is it somehow in the dryer? (IS IT MELTING?) No. Is it in the coat pockets, all wet? No. Is it on the washer I just left? No. Is it in the laundry soap bag? No. Is it … wait. There IS nowhere else. Is it over by the rolling baskets? No? The dryer? (yes I checked again) No. The coats?? NO. THE WASHER? NO. THE???? NO!

I started looking at the three other people in the laundromat panically. I went to the front and asked “did… did anyone turn in a white iPhone?” No. (I mean, of course not, right?)

So. It’s gone. Given the way the week had been going, this was almost to be expected, right? I mean, there are a couple of other things about the place I’m staying that I didn’t mention (but were in my mind) that just made me feel “oh, so THIS is what the week was building to”. And yet…

I wasn’t angry. I was barely even sad. I mean, it’s just a ‘thing’, right? The only part I was really upset about was that I was chatting with Bill and was worried that he’d be concerned about me and I needed to wait for the clothes to be done before I could got home and tell him what happened. The only other bit that pissed me off was that I wasn’t even supposed to be doing laundry b/c I had dropped it off and that was supposed to have worked. Anyway. I took a deep breath and did some walking meditation (I credit a lot of the buddhist stuff for my fortitude and equanimity on the trains this week) and there it was. On the top of a dryer (that I had looked at before but not seen due to panic).

I was so elated that I went to tell the woman at the front – I thought “I want to share this happiness with other people”. She was very happy for me (as was the ~70-yr-old woman doing her laundry who had tsk-tsked when I asked if anyone had turned it in), but very sincerely warned me to be careful because “some people aren’t nice”. This was a lovely young woman, max 22 years old, working at a laundromat in NYC who was really genuinely concerned for me because she thought I might not be taking enough care. (Which, partly true, but still…) That was so sweet and kind that I found myself wondering if all the shenanigans that had occurred up to then, including the laundry fail, were just a set up for me to experience that moment of faith in humanity.

[j/k, I don’t believe in serendipity or fate or superstitiony things, but I do believe that meditation practice, and certain kinds of emotional and mental practice can help you find this kind of grace when it happens rather than not noticing it]

I think I am going to move

I’m staying in the farthest east part of Bed-Stuy and it’s about a 1 hr commute door-to-door to the Recurse Center and as a result, I’m not going to some events in town in the evenings because I feel like I have to go home.

I’m nervous about it because I’m worried about upsetting my Airbnb host. Because I have an overactive loyalty gland. One that trumps market realities, apparently! There’s a 30 day cancellation period, so I found myself thinking “oh, is it really WORTH moving for just one month left at the end?”

Well, duh. I brought ONE suitcase. I can move in 10 minutes. I HAVE moved in 10 minutes in the past, while traveling, out of pure need/fear. So it’s silly to have hangups about moving – I should move every week!

[Update. Not moving, and here’s why 🙂 ]cat on bed

[Update to update. Moving. But not until mid-late Nov]

Recurse Center, Day 4

I’ve been doing the Stanford iOS development in Swift course for the past few days (as well as attending talks and doing a bit of C pairing (I apparently remember C! Huzzah!)) and I’m feeling a bit… static. Lots of other people are already writing code and I’m just doing tutorials. I do want to write a couple of iOS apps, so I want to get through that course, but I think that I might be using it as a procrastination tool. So I’m going to mix that up a bit today.

Here is a list of things that, as a programmer, I basically nopetopus away from:

nopetopus gif

Nope to ALL of these:

  • UTF-8, Unicode, any of that sort of thing
  • Cryptography
  • Bash/shell scripting
  • Audio, video, general media formats/manipulation

I’m sure that list will grow, but in the spirit of diving deeper into understanding and moving closer to things that make me uncomfortable rather than avoiding them, I’m going to spend today (and possibly tomorrow) working on the Matasano crypto challenges. And I’m going to try to do them in  Rust (learning that language as I go). Wish me luck!

Placeholder for things to come

I’m in NYC for the next 3 months; I arrived at Newark on Friday at 5pm local time and have been pretty slammed since. I’m here for a few reasons, but specifically the reason for NYC is that I’m attending The Recurse Center (Fall 2 batch) to reboot my software development skills. After I left Amazon, I spent about 8 months supposedly doing that, but mostly what I was doing was purchasing online courses about how to be a web developer/etc and not completing them because they always started at way too basic a level. I also realized that I work better with others and that I was unlikely to ever make progress on my own. The Recurse Center is not a software developer bootcamp, but more of a programming ‘retreat’ where people go to become better programmers (and boy, did that stump the border guard). So I think the odds of me actually making progress here are much greater.

But that’s not the only reason I’m here. I’ve fallen into a lot of bad patterns and habits at home, health & well-being wise and the plan is for this to be a bit more of a traditional ‘retreat’ as well as a programming one. I have goals to meditate daily, eat vegetarian, exercise 5 times/week, stretch and roll out my bad muscles daily, and not drink any alcohol. I also plan to write and reflect a lot more. To that end, I’m spinning up two new sites (one is a relaunch of a sadly abandoned venture but I actually had it printed on business cards this time, so you KNOW it’ll happen 😉

I’ll be launching learnwithkara.com and beupstry.com next Monday.

LWK will be a journal and writeup of all the stuff I’m doing at the Recurse Center as well as a writeup of that site’s creation overall (unlike this & the other, I’ll be using a static site generator at first and then gradually migrating that to hand-coded). It’ll also include host any projects I actually manage to complete that are web-demoable.

The Beupstry will be, as originally intended, a place where I reflect on becoming a happier, better person and talk about the things I am learning about how to think differently, how to react differently, and listing the resources I have found helpful in doing that. It’ll probably be pretty heavy on lay-buddhism and self-awareness and self-compassion.

But right now, it’s 9:51 EDT and because I have to get up early and exercise before going to the RC, I am going to sign off now (as noted in this Beupstry v0.1 post, sleep is critical to mental and physical well-being). Have a fantastic day!

Mouthbreather – Part 1

I have a confession to make: I am a mouthbreather. I always have been.

It’s not terribly obvious. If I’m not exerting myself at all, I can keep my mouth closed and get enough air through my nose to keep me functional, but if I’m moving around, or talking, or have even the slightest bit of congestion, my mouth is open. (It may not be open much, and as I have quite a small mouth, you may not notice it, but I assure you, it is).

That something is a bit goofy about my nose has always been obvious. My brother, my aunt, and I all have one visibly blocked nostril (the same one) and we’ve been known to jokingly push the tips of our noses over to the left to align with where the tips should be, relative to the cartilage.

(Ignore the hair - I have surgery today & am not focused on making myself purty)

Where the tip of my nose is actually pointed

I never thought too much about it until grade 5, when they started making us run in gym. All of a sudden, it was a problem.

The thing is, I didn’t know what the problem was. I knew that I couldn’t run without breathing through my mouth, and I knew that that meant that if I ran more than about 100m, my throat was going to dry out and I was going to start coughing. The teacher’s focus on running actually had a pretty long-term effect on my interest in physical activity, which had been quite high before grade 5. So I didn’t run, and I embarked on what would become a pretty damned impressive career of getting out of gym class.

While running and sports involving running were out, there were definitely things that were easier for me because of the nose situation. Not being inclined to inhale through your nose is a real perk in swimming, diving, and scuba diving. All those things came naturally to me, and I enjoyed them a lot (still do). I was a natural chorus singer, because if your choir is sustaining a long note, you need to get a lot of air in quickly during your staggered breathing – nasal inhalation won’t cut it.

But over the years it’s become more of a problem. Other than running (which I would like to do), it’s really impacting my sleep. It’s not just the snoring, it’s that there’s only one position I can sleep in and continue breathing through the night – a position I call an ‘inverted 4’

Every night, 7-8 hrs. Same position.

Every night, 7-8 hrs

  • I’m lying on my left side, but rolled forward so that it’s sort of on my front (but propped up)
  • My left arm is straight up (which wrenches my left shoulder & twists my left side forward)
  • My right knee is bent, my left leg straight down. This tilts my left hip/pelvis forward, shortening my hip flexors and putting excess pull on my hamstrings.

Spending so much time in that position has resulted in some postural and muscular issues in day-to-day movement. Because I’ve been spending this hiatus trying to improve my well-being overall, I went to a physiotherapist & now have exercises to work on training my lazy muscles to engage, but every night I reinforce the problem.


Back in the 90s, I was a huge fan of Dilbert and read Scott Adams’ blog fairly regularly.* When he wrote about having a deviated septum and the life-transforming effect that surgery to correct it had**, these thoughts went through my mind:

  • “Gee, that kinds of sounds like what I have, not being able to breathe through my nose when I run”
  • “My case is probably not as bad as his was – surely some doctor would have told me if it were. I’m just being overdramatic/hypochondriacal”
  • “It must be nice to have enough money to be able to get that done electively. I wonder if I could become a famous cartoonist….”***

* either his views have evolved in a way that I now find unpleasant, or mine have evolved, or his were always like they are now & I just didn’t notice.
** He described the actual surgery as being like having a live weasel stuffed up one nostril & threaded back down the other, which also stuck with me.
*** of course, at the time, a cartoon of my life would have just been a clone of Dilbert, so that would probably have been a non-starter.

But last summer, someone I had worked with mentioned that he had the same surgery done and like Scott Adams, described it in transformational ways (as did this other person who read Scott Adams’ post). A few choice (paraphrased) quotes:

  • “I feel like someone reached into my head and yanked out 35 years of misery”
  • “I feel like someone gave me a super-power”
  • “Not a day goes by that I don’t think about how happy I am that I did this”

Well, I thought, this is supposed to be the year of self-improvement and doing things that are good for me – I asked him what was involved in getting it done? How much did it cost? Was it covered by work insurance?

Well.

Apparently if a specialist determines that it’s necessary, it’s covered by regular healthcare. The process is to get a referral to a specialist for assessment (referrals are always covered by regular healthcare) and go from there. Since my friend was so happy with his specialist, I asked for a referral to him. I got an appointment, but as is common for non-urgent issues, there was about a 6 month lead time.

[Kicks herself for waiting so long before investigating this. Could have been breathing better DECADES ago.]


[6 months pass]


I go to see the specialist and he says that that yes, I definitely qualify as ‘sufficiently deviated’ (that one’s going on my tombstone, for SURE) for the surgery. In fact, remember that goofy nose tip thing from up above? Yeah, that’s too special for him to do. Apparently regular septoplasty is done where they kinda just stick tools up your nose, move stuff about, and then you bleed for a while and then heal. But if they did that with me, my nose tip would collapse.

Raccoons Cedric & Burt

I mean, I’m a good Canadian, I liked this show. But I didn’t consider it aesthetically aspirational.

The specialist also did a really interesting test (before sticking cameras up my nose to confirm) that completely changed what I thought was wrong with my septum.

In this picture, you can see that my left nostril is largely blocked by the bent nose tip.

Up-nose photo of blocked left nostril

I saved this image to include a bit later so that anyone skimming this post & deciding it wasn’t for them wouldn’t have to look up my nose. But you’re clearly committed at this point.

The doctor had me plug my right nostril & put his finger on my left cheek next to my left nostril and pulled my skin to the left.

Doctor: Does that make breathing easier?
Me: Definitely.

This wasn’t a suprise to me – I’d encountered that using BreatheRight strips (which I can only use sometimes b/c my skin is really sensitive & is too easily damaged by adhesives). He reversed to the other side – pulling my right nostril wider open, while having me plug my left.

Doctor: Does that make breathing easier?
Me: No, in fact it’s worse overall because my left nostril is blocked.

Then he brought in the cameras.

Here I’d always assumed that my nose cartilege was a “J” shape – straight at the top & hooked at the bottom. NOPE. It’s more like a dial that someone has turned 25 degrees, blocked at the bottom on the left and up inside at the top on the right! So I’ve been getting even LESS airflow than I thought I was.

Diagrams of actual septum shape and assumed septum shape

!!!

MIND-BLOWING. The left nostril is the GOOD one (despite its weird ‘gate’ at the entrance).

However. That meant that this guy couldn’t do the procedure for me and instead, I have to be referred to an extra-specialist – one of only two people in BC who perform ‘open septoplasty’.


STOP. I’m going to take a moment to warn you about something. If you have any curiousity about what the difference between regular and ‘open’ septoplasty is, for the love of god, TURN OFF GOOGLE RESULTS IMAGE PREVIEWS FIRST. Learn from my mistake, people.

OK. So. “Open” septoplasty involves them cutting the skin under your nose and then, um, kinda peeling back your nose/face so that they can get at the bits inside. They then do more significant construction. In my case they’ll apparently be widening the bridge & main part of my nose to strengthen it and building a brand new (centered) tip. Then they pull the skin back down and sew you up.

Yeah. All of a sudden I’m a bit less sure about going through with this, but I figure that I should at least meet with the extraspecialist to hear what he has to say. THAT appointment isn’t 6 months away, no. Only a few weeks.

[Google has surprisingly little information about open septoplasty and its complications. I assume that means that everyone who went through it is dead]

When I do go see the doctor, he’s extremely reassuring (not just in what he says, but in manner overall) and I feel much, much better about the prospect of starring in my own sweded version of Face/Off. I decide to go ahead with it and mentally prepare myself for an 8-12 month wait for surgery.

But. Apparently this doctor was recently granted 7 extra hospital days this year and because he just got them, they were wide open. So instead of an 8 month wait, it’s a 6 week wait.

And now those 6 weeks are up. My surgery is today. I’ll provide an update when I’m back home (assuming I’m not so miserable that I just want to go to bed), but fingers crossed for a life-changing improvement!

Page 2 of 4

Powered by WordPress & Theme by Anders Norén