23 Oct 2015, 20:53

A health update

First of all, thanks are in order. We have been overwhelmed by the outpouring of love, support, and generosity from our friends and family over the past two weeks. It means so much to both of us–thank you!

For anyone who’s curious, I thought I’d write up a summary of what’s been going on, and what we know at this time.

Timeline thus far

Sunday October 11th

I woke up feeling a bit dizzy, with numbness in my right leg. It went away after about a minute, but then it happened three more times that morning, so Laura and I decided to go to urgent care.

The nearest urgent care center was at a hospital (in Bridgton, Maine), but the urgent care center itself was closed. They did have an emergency room that was open, but at that point in time it didn’t feel like an emergency, so we left to go to the next nearest urgent care. On the way, the numbness returned, but this time accompanied by visible twitching in my leg and abdomen. At this point, Laura said, “We’re going back to the hospital,” and turned the car around. Seconds later, I began having a seizure.

[begin long period of hazy forgetfulness for Jordan]

Laura pulled over, called an ambulance, and they arrived and brought me back to the Bridgton hospital where we had just been a few minutes prior.

Shortly after we arrived, I had a second seizure. They performed a CT scan and found a mass in my brain. We were told we’d need to go to another hospital (with a neurologist): either in Lewiston, ME, Portland, ME, or Massachusetts General in Boston.

Laura chose Boston, and an ambulance took me there. Upon arrival I got an MRI, and they confirmed the mass was likely a cancerous tumor.

Monday October 12th

The next day we met the neurosurgeon and neurooncologist.

[Jordan starts to come out of haze]

My neurosurgeon showed us a print out of my tumor in the left parietal lobe. We learned we’d be doing surgery to remove it, and that I would be conscious during the procedure.

Tuesday October 13th

I underwent a functional MRI, which is pretty much a regular MRI that they do while you’re performing various tasks. The fMRI captures images of increased blood flow to different brain areas, and those areas are then correlated with the tasks performed. This is done to assist in planning the surgery.

That evening I was released from the hospital.

Wednesday October 14th through October 22nd

Recuperating, regaining my memory, and just hanging out in the Boston area (thanks to Aaron & Elissa for your hospitality last week!). Received much-appreciated visits from friends and family.

Friday October 23rd (today)

Had a pre-op meeting with the neurosurgeon where we learned about what to expect in surgery.

What’s next

There’s a lot of uncertainty at this point. I go into surgery on Monday the 26th, which should take most of the day. The goal is to remove as much tumor as possible while avoiding damaging brain function. In order to accomplish that, I’ll be awake and the surgeon will be electrically stimulating tumor areas he wants to remove, to make sure that when he does I can still do things like talk, move my foot, do math, et cetera. If all goes well, I could be out of the hospital as soon as two days later, but that’s entirely dependent on how well surgery goes.

Then it will be another two weeks before we receive a diagnosis regarding the type of tumor, at which point we’ll find out more about next steps for treatment.

05 Apr 2015, 09:02

A perspective on internet shaming

This morning on Reddit, I saw a post with the following title: “This f—face threw a drink at a landscaper and drove away laughing.” It was a link to a blurry picture of a guy in a Jeep. I immediately felt anger towards the anonymous face in the driver-side window, the face of someone so entitled and lacking in empathy that they’d ruin someone’s morning just for laughs.

Almost as quickly, I was reminded of this article: http://www.theguardian.com/technology/2015/feb/21/internet-shaming-lindsey-stone-jon-ronson. Even if you’re not familiar with Lindsey Stone’s story, you’ve probably already heard it, just with different names and circumstances: a person does something that looks really bad on camera, it’s picked up on social media, and within days that person’s whole life has turned upside-down. The internet has made this sort of thing possible. Before it was the case that everyday people had the ability to rapidly share a photo with millions of others, one of two things would have happened to folks like Lindsey Stone or the man in the Reddit post:

  1. No one would have said or done anything at all.
  2. A witness who was sufficiently annoyed would have confronted them. In all likelihood, the confrontation would have been over within seconds or maybe minutes, and everyone would go on with their lives.

Things are different now. Sure, most of the time nothing nearly as extreme happens as what happened to Lindsey Stone, but what happened to her is now possible in a way that it didn’t used to be.

Let me be clear: I’m not very interested in discussing whether this new state of affairs is good or bad, right or wrong. You may feel bad for Lindsey Stone, or you may think she got what was coming to her. I’m not taking a position on that, or on anyone else who finds themselves in a similar situation. I have my opinions on it, but I don’t want to go into them here.

Instead, what I find fascinating is how similar these technologies (the internet and social media) in this context are to the conception of a very different technology, firearms, in Freakonomics by Stephen J Dubnar and Steven D Levitt. Here’s a quote from the relevant section of the book:

It might be worthwhile to take a step back and ask a rudimentary question: what is a gun? It’s a tool that can be used to kill someone, of course, but more significantly, a gun is a great disrupter of the natural order.

A gun scrambles the outcome of any dispute. Let’s say that a tough guy and a not-so-tough guy exchange words in a bar, which leads to a fight. It’s pretty obvious to the not-so-tough guy that he’ll be beaten, so why bother fighting? The pecking order remains intact. But if the not-so-tough guy happens to have a gun, he stands a good chance of winning. In this scenario, the introduction of a gun may well lead to more violence.

In case you’re wondering, the authors do not go on to take an anti-gun position. However, just as I said above regarding internet shaming, I’m not here looking to wade into the gun control debate.

Rather, I just find it interesting to notice the similarities of the two situations. In both, a piece of technology seriously alters the natural order. Whether it’s a gun or social media, the technology has the potential to dramatically change the way humans interact. I’m curious if our culture will catch up to the possibility of internet shaming; that once people become more accustomed to the new world in which we live, they’ll behave better (or be more inhibited) due to fear of the social media consequences. If I had to guess, I’d say it isn’t likely, just as the existence of guns has not eradicated bar fights. But who knows.

20 Mar 2015, 13:50

Don't fake it in software job interviews

A friend of mine interviewed for his first development job today. He’s been taking some classes on the side for the past few months in the hopes of making a career change to working in software. When I found out he got an interview, I had some advice I wanted to give him, but I wasn’t sure if I should just keep my mouth shut. Everyone’s different, including people who interview software job candidates, and not all of them will necessarily agree with me. But I gave it to him anyway:

  1. If you don’t know the answer to a technical question (or maybe don’t even understand the question at all), don’t be afraid to ask for clarification. “Can you explain more what you mean by that” is better, in my opinion, than pretending to know what they mean.
  2. If, after clarification, you still don’t know the answer, simply say so (and make a note of the topic so you can look it up later).
  3. Finally, after having admitted you’re not familiar with what they’re asking, make an attempt to reason about the topic and perhaps make an educated guess.

Nothing profound, I know, but I think it’s sound advice. Especially if you’re a junior developer, it’s unlikely that you’ll fool anyone by BS-ing. It won’t save face, it will only make your ignorance painfully obvious. However, a mere “I don’t know” without any follow up isn’t great, either, because the interviewer might be hoping to see you struggle a bit and observe your critical-thinking process. Personally, when I interview developers, I’m not a big fan of that; if I want to see how they think, I’ll let them know: “It’s fine if you don’t know the answer, but I’d like you to use what you do know to make an educated guess.” But not all interviewers agree with me, so that’s why I included number 3.

To be clear, it’s still important to project confidence in interviews. If the interviewer says, “We’re looking for someone who’ll be able to help maintain our build configurations,” and you don’t know what that means, don’t reply, “I don’t know how to do that.” You can probe a bit to find out what’s involved, and then you should express confidence that, given some time to get up to speed, you can contribute to the team in that way. The point of this post is to admit what you don’t know when asked to comment directly on unfamiliar things of a technical nature, not to advertise a lack of confidence.

05 Mar 2015, 10:37

ng-conf 2015: Immutable data structures

I’m watching ng-conf live from home today cause I wasn’t able to go with the guys from work (which is a story in itself; not an interesting one, though), and so far the most exciting thing I’ve seen was in the keynote about Angular 2 by Brad Green and Igor Minar.

They mentioned that the Angular 2 team has taken advantage of ECMAScript 6 immutable data structures in order to vastly improve performance. If you’re unfamiliar with ES6 immutable data structures, they are implemented with the const keyword:

const x = 'this string cannot be modified';

Angular 2 will take advantage of this in order to enhance performance, with stunning results:

image image image

As you can see from the third screenshot, if your context allows you to get away with using immutable data, Angular 2 will drop your table rendering to O(1), decoupled from the number of tables!

Of course, my excitement should probably be more directed toward the ES6 specification, but kudos to the Angular team as well for taking advantage!

27 Feb 2015, 13:15

I am not everyone (duh)

A friend of mine has a growing audience on his real estate investment blog. He specializes in buying vacant land, sight unseen, at deep discounts, but he also does income properties and other investing. Last night, he called to ask for some advice on how to start a paid membership forum in connection with his blog, to give his most devoted readers the chance to learn from and interact with him and each other more extensively.

Of course, this project is also motivated by the prospect of increasing his income. However, whenever the subject of “pay walls” (or paying for digital content in any way) comes up, there are certain segments of the internet population that have extremely negative responses. They not only won’t pay, but seem to be incensed that anyone would have the gall to ask them or anyone else to. I happen to disagree with this outlook, but that’s not what I want to discuss.

There are also those who, when the topic of something like a paid membership forum comes up, are not hostile but rather just dismissive. “Why would you pay for access to a forum?” I have to admit, I sympathize with this position. This is likely due in part to the strong sharing culture in the software community, but also due to our reference points. For instance, which is superior, StackOverflow (free) or Experts Exchange (paid)? I can’t even imagine a professional developer paying for access to Experts Exchange anymore.

However, this dismissive attitude misses an important point: I am not everyone. For one, I’m a software developer, so right away I probably think about things very differently from your average real estate investor, just because of our vastly different daily lived experience. But also, there are (apparently) still people who pay for access to things like Experts Exchange, in spite of my inability to conceive of it. A non-zero number of people out there are getting enough value out of it to make paying a monthly access fee worthwhile. It may not be nearly as many people as visit StackOverflow each day, but that’s not really the point. My friend who wants to start a paid membership forum isn’t expecting to dominate the entire global market for online real estate investing content. He’s got his little niche, and just wants to expand it a bit and make it more profitable. Instead of being skeptical or dismissive, I had to remind myself that:

  1. He knows his audience much better than I, and
  2. I am most certainly not representative of his core audience

So, it’s not for me to decide whether this venture will be successful. Instead, it’s for me to help him figure out the best way (from a technical standpoint) to try. More about that later.

11 Feb 2015, 19:47

New hugo site

After the Drupal kerfuffle back in October, I just took my blog offline. I rarely post, and taking it down was simpler and less painful than worrying about whether it had been compromised. It’s not as though there was anything there to interest an attacker anyway, but still.

This week, I came across Hugo on HN, and wanted to play around with it some, so I decided to resurrect the blog toward that end.

So far, I’m a fan.

31 Mar 2013, 18:09

Exclude your own traffic from google analytics

So, I’ve been developing on the web for several years now, but this weekend was the first time I’ve found it necessary to try to exclude my own traffic from Google Analytics. Well, actually I found it necessary to exclude a friend’s traffic from GA on his own blog.

I figured I’d need to set a custom variable on a page that would set a cookie for him when he visited it, and then filter out traffic containing that custom variable in the Google Analytics admin pages, but then I came across a much simpler and faster solution: Google provides a plugin for all major browsers that prevents the GA Javascript from sending data back to Google. Not only is this faster than mucking around with custom variables in two different places, it’s much easier for non-technical clients to implement and be confident that it’s working. All they have to do is install it.

Not exactly an amazing breakthrough, I know, but still something that I hadn’t heard of that ended up making my life a little bit easier. Here’s a link:

http://tools.google.com/dlpage/gaoptout?hl=en

03 Jan 2013, 09:08

Can't find the IIS process when attaching debugger in visual studio?

TL;DR - If you can’t find your IIS process in Visual Studio’s debugger’s “Attach to Process” dialog, try visiting one of the sites that IIS serves in a web browser and then check the “Attach to Process” dialog again.

It took me a while to find the answer to this problem, so I thought I’d share. I’m running IIS on my local machine so I can debug my ASP.NET app while also using the app’s production URL instead of the “localhost” domain that the built-in Cassini server uses (just modify your hosts file to point production URLs to the web app on your local box). In order to debug, I go to Debug -> Attach to Process and then choose the process named w3wp.exe. I had been working like this successfully for a bit when one time I went to attach to the process and w3wp.exe wasn’t in the list. That was weird because when I looked in the IIS Manager it was clear that IIS was running. I tried opening and closing the attach to process dialog box several times, restarted Visual Studio, restarted IIS, and even rebooted my machine. Turns out the answer is simple: the IIS process doesn’t actually start running until one of its sites is accessed. So, all you have to do is visit one of the sites that IIS is serving in a web browser. I did this, went back to Visual Studio, went to attach my debugger to a process and there it was in the list: w3wp.exe!

This took awhile to figure out because I assumed the IIS process was already running, and the problem lay with Visual Studio, so my Google searches were all in that vein. I eventually found it on Stack Overflow: http://stackoverflow.com/questions/4313206/cannot-attach-debugger-to-w3wp.

19 Nov 2012, 00:27

Chinese tweets and the basic idea behind character encoding

Tonight my wife and I were on Reddit and we found a TED Talk by Michael Anti called “Behind the Great Firewall of China." At one point during his talk, Anti mentioned that the information-density of written Mandarin is much higher than English and demonstrated with the following image:

Tweet comparison of Mandarin and English

The idea of course is that in just 140 characters you can get a lot of meaning across in Chinese, especially compared to what you can convey in similar space using English. Interesting enough. I pointed out, though, that while the written information-density of Mandarin is quite high compared to English, it’s likely a wash when you consider the digital information-density, since you can express most anything in English using 7 bits in ASCII while Mandarin requires several more bits. My wife’s not programmer, so I tried to explain what I meant, and did a very poor job of it. She gave me a couple tries, but I only succeeded in making a seemingly boring subject sound even more boring.

I’m going to give it another shot here, mostly as an exercise in ELI5.

In layman’s terms

Let’s pretend you want to write a letter to a friend. This friend has complained in the past that your handwriting is atrocious and she can barely read the notes you send her. You prefer to think of your handwriting as quirky and artistic, so this annoys you a little, but you knows she’s right. So, you decide to type her letter on your old typewriter (the printer’s out of ink and the cartridges are too expensive anyway). You get the typewriter out, only to discover that the letter keys don’t work; you try to type out the salutation but nothing happens. However, the numbers still work. Being a stubborn sort of person and not wanting to give up, you devise a plan: you’ll type the letter out using an easy-to-guess numeric code: 1=A, 2=B, 3=C, etc. Punctuation and things like that are too complicated for this endeavor, so you’ll just have to get by with using the numbers 1 through 26 to communicate. Simple enough, and you’re confident that your friend will be able to decipher it.

So you get to work typing. Right away you hit a snag: you want to start the letter with “Dear Guinevere”, but you realize you have no way of indicating the difference between capital and lowercase letters. This is annoying, but you decide to just live with it, although you think to yourself that a more perfect version of this code would include both lower- and upper- case.

Anyway, you write out your letter using only numbers. In it you happen to mention that since the two of you spent that summer in China two years ago, your Mandarin has really started to slip. You’ve got some friends who speak it that live nearby and you practice with them sometimes, but you rarely have the chance to work on your writing skills. You finish the letter and look it over. This is when you realize your second big problem. Even though the spacebar works, the numbers kind of run together, so it’s not always obvious what you were trying to say. For example, “Dear Guinevere” translates to “45118 7219145225185”. That’s actually pretty complicated; if you’re decoding the first word, it could be 4-5-1-1-8, 4-5-11-8, or 4-5-1-18, which would decode to “deaah”, “dekh”, or “dear”, respectively. In this case, you can figure out which one is meant, but it takes some tedious guessing and checking. And consider how difficult it gets when decoding a long, uncommon name like Guinevere! You really want the code to be straightforward, since after all, you’re doing this to make communicating to your friend more efficient. So, you come up with a fix. Instead of using the pattern 1=a, 2=b, etc., you use 01=a, 02=b, 03=c, etc. This way, the doubt while decoding is eliminated. You know that every two numbers, starting from the beginning of the word, represents one and only one letter. The word “dear” is now 04050118. A little longer, but perfectly clear as to where the letter-breaks are. You quickly rewrite the letter using this new code, and mail it off.

The next week, you receive a reply from your friend. In spite of having to decode your letter from numbers, she still found it much easier to read than your typical chicken scratch, and insists that you send all of your letters in encoded form from now on. I guess your handwriting was really quite bad. Just go with it.

She also has an idea: in order to practice your written Chinese, the two of you should start writing your letters in Mandarin! This actually makes the encoding even more important, because even if your typewriter was working normally instead of being in “numbers only” mode, it doesn’t have Chinese characters. So, you can write out your letter in Chinese with a pen, and then encode it, using a similar encoding as before, except now each number corresponds to a different Chinese character. You’re also excited by the fact that, since Chinese characters are so information-dense, you can write a long, meaningful letter to your friend without having to encode as many characters.

However, once you start encoding the Chinese into the numbers code, you realize something. Adding the leading zeroes to each character is even more important now than it was in English. That’s because you can have such large numbers because of the thousands of different characters in Chinese. For example, one word might be represented by the number “2173” because it’s the two thousand one hudred seventy-third character in your list. But if you’re decoding “2173”, it could be any of the following:

2-1-7-3

2-1-73

2-173

2173

21-7-3

21-73

217-3

2-17-3

So, you really need to use your leading zeroes in this case to avoid confusion, but that means that 2173 (which we meant to be 21-7-3) gets encoded to 002100070003. This drastically reduces the space savings you thought you’d get by writing in Chinese. It’s annoying but completely necessary to write “0003” every time you need to write “3”; otherwise the numbers would all run together and be too confusing to decode. But, you’re getting to practice your written Chinese and stay in touch with your friend, so you get over it and mail the letter.

This is at least a little bit similar to how computers send text to each other. They have to encode it to numbers, because that’s the language they speak. In order to be able to read the streams of numbers in the right context, they have to have an agreed upon length for each number, like say, 8 digits. Then they know that each 8-digit number represents a character that they can then display on a screen. So, there you have it; that’s an extremely over-simplified but hopefully helpful introduction to character encoding.