My evolving relationship with my sister with Angelman syndrome

[This post was originally written for and published on The Arc’s blog on March 19, 2018 for Developmental Disabilities Awareness Month.]

It’s now been almost five years since I first wrote about future planning. I was 22, and living in Washington, DC — 1,300 miles away from my family in Dallas.

At the time, my sister Caroline was 18. We were both entering new phases of our lives. I was fresh out of college, and she had just reached legal adulthood. (Her birthday milestones honestly were always more striking to me than my own). Caroline was born with a rare neuro-genetic disorder called Angelman syndrome. The prevalence of AS is estimated to be somewhere between 1/12,000 and 1/24,000.

I was in third grade when we finally discovered my sister’s diagnosis. I know, because my mom tells the story of how I went to school, and told my third grade teacher that I was worried about how I would take care of Caroline when something happened to our parents.

Years later, when my parents took our family out to dinner to celebrate my high school graduation, I have a perfect memory of sitting at the table feeling deeply guilty, and near tears. I was soon to move to DC for college. At the table, my parents expressed how important they thought it was that I go. When I later moved away to college, it was deeply unsettling for about a semester. Everything I had to do every day suddenly only revolved around, well, me.

The years passed, and I thrived in DC. I love that city. It’s my home away from home. But I felt those tugs. Sometimes the feeling was quiet, sometimes it was loud; but it was there. Feeling too far away, feeling too selfish. Feeling the desire to be a present fixture in the lives of my family members — to be a more active part of Caroline’s care network.

I’m now almost 28; she is almost 24. I lived in DC for eight years. Two years ago, I moved back to Texas. For one of those years, I lived in Dallas. It’s hard to explain the internal battle between feelings of obligation and not knowing with any certainty what you really want, personally. But you know what I’m talking about. It’s part of the human experience. It has nothing specifically to do with having a sibling with disabilities. It’s a universal experience. This is just a particularly salient part of how I experience this struggle. None of us can know if we’re making the right choices; We just do what we can, and keep moving forward.

What I can say with certainty is that living in closer proximity to my sister deepened our connection considerably. When living further away, I could still say hi to her on the phone. (Or like when she somehow figured out how to FaceTime with me while I was at work and she was in class).

Screenshot of FaceTiming with my sister

But living back home, she would spend the night over at my apartment. We’d make dinner, and watch The Great British Baking Show. She loves to watch my pet rabbits run around. I got back in sync with her nonverbal cues, and she got back in sync with my micro-movements. (I swear to you she can tell when you’ve had a thought, and haven’t even said anything yet — her emotional intelligence is through the roof). It’s these subtleties that were difficult — near impossible, even — to maintain, in a long-distance relationship with her.

Me and Caroline

 

There’s no right decision for me, or for other siblings. But I can say for certain that I don’t regret moving back to be closer.

I was reflecting on these past ten years just recently; I was doing some work in a coffee shop, and a family came in. A mom, dad, older sister and younger brother. The younger brother had Down syndrome. They were all hanging his art on the coffee shop wall. As I understand it, the sister had independently reached out to the coffee shop about featuring her brother’s work, and the other artist currently featured on the wall had volunteered to share space. As I chatted with them, and watched as they arranged his art, I had an odd sense of deja vu. Reflecting on being the sister’s age, and pondering college. (She appeared to perhaps be in high school). These thoughts can feel so isolating, but they are such a deeply shared experience. Meeting them by happenstance reminded me of that.

Growing up feels like continuously uncovering that behind the tapestry is a mess of loose ends. From chaos, comes order (or at least hindsight). When I was younger, I worried about Caroline’s future with a general sense of anxiety. Now that I’m older, I worry about increasingly complicated specifics. We have been having active planning conversations for years, and on some level, it grinds away in the back of my brain nonstop. Despite working so proactively, we still don’t feel close to having an answer, or feeling prepared.

I hope that for anyone reading this, these thoughts inspire thoughtfulness, not paralysis. I accept that we can’t ever know anything for certain. It can be overwhelming, but I fervently hope that other siblings and families don’t shy away from these conversations.

Amberley Romo is a software developer in Austin, Texas. She is part of a project to build a free, open-source, web-based communication app.

Getting started with GatsbyJS and WordPress

[This post was also published on the Gatsby blog on January 22, 2018.]

Earlier this week I began rebuilding my blog using GatsbyJS + WordPress. As I familiarized with Gatsby, I found myself flipping through a million tabs, and I thought it might be useful to summarize concepts and to aggregate links I found helpful.

I recently decided to tackle a redo of my blog. I wanted to do something different and I’ve been hearing a lot about GatsbyJS. A static site generator for React that I can pull my existing WordPress data for? Sold. I’ll try it.

The documentation is a little scattered — I started by reading the tutorial and quickly veered off. I generated a new site using the default starter and read through what it gave me. Assuming you have the Gatsby CLI installed, run:

gatsby new gatsby-example-site

That gets us a new site directory with a couple (mostly) empty “gatsby”-prefixed files and a src directory with some basic scaffolding. The configuration and lifecycle hooks for Gatsby get put in those “gatsby”-prefixed files, gatsby-config.js, gatsby-node.js and gatsby-browser.js.

gatsby-config.js

Essentially the Gatsby home base. The two main things defined here initially are siteMetadata and plugins.

module.exports = {
  siteMetadata: {
    title: 'Gatsby Default Starter',
  },
  plugins: ['gatsby-plugin-react-helmet'],
};

gatsby-plugin-react-helmet is just a plugin the starter includes. It’s a document head manager for React.

Also, there isn’t currently documentation on arguments for gatsby-config, but you can get an idea here if you’re (also) curious.

gatsby-node.js

We can make use of any of Gatsby’s node APIs by exporting a function with the name of that API from this file.

For my purposes, the only one I had to interact with so far was the createPages API. This gets called after our data has been fetched and is available to use to dynamically build out our static pages. More on this later.

gatsby-browser.js

Same as above, we can make use of any of Gatsby’s browser APIs by exporting them from this file.

I haven’t needed to make use of any of these yet, but they provide a hook into client runtime operations — for example, replacing the router component, as seen in this example.

Plugin: gatsby-source-wordpress

My natural next step is getting my data successfully pulling from WordPress. There’s a plugin for that. gatsby-source-wordpress is Gatsby’s plugin for sourcing data from WordPress sites using the WordPress JSON REST API.

(Fun fact: the WordPress REST API is already included starting with WordPress 4.7 — no longer requires installing a WordPress plugin. I didn’t actually know that, not having used the WordPress REST API for anything before).

I started by reviewing the code for the demo site for using the plugin.

Configure the plugin to pull your data

In gatsby-config.js, add your configuration options, including your WordPress site’s baseUrl, protocol, whether it’s hosted on wordpress.com or self-hosted, and whether it makes use of the Advanced Custom Fields (ACF) plugin.

module.exports = {
  ...
  plugins: [
    ...,
    {
      resolve: `gatsby-source-wordpress`,
      options: {
        // your wordpress source
        baseUrl: `amberley.me`,
        protocol: `https`,
        // is it hosted on wordpress.com,
        // or self-hosted?
        hostingWPCOM: false,
        // does your site use the Advanced 
        // Custom Fields Plugin?
        useACF: false
      }
    },
  ]
}

Use the data to dynamically construct pages.

Once your source plugin is pulling data, you can construct your site pages by implementing the createPages API in gatsby-node.js. When this is called, your data has already been fetched and is available to query with GraphQL. Gatsby uses GraphQL at build time; Your source plugin (in this case, gatsby-source-wordpress) fetches your data, and Gatsby uses that data to “automatically infer a GraphQL schema” that you can query against.

The createPages API exposes the graphQL function:

The GraphQL function allows us to run arbitrary queries against the local WordPress GraphQL schema… like the site has a built-in database constructed from the fetched data that you can run queries against. (Source)

I used the gatsby-node.js file from the demo to get started. For my purposes the ‘posts’ code does what I need it to do out of the box (at least for the moment) . It queries our local WordPress GraphQL schema for post data, then iterates through each post node to construct a static page for each, based on whatever template we define and feed it.

For example, below is the part of the demo gatsby-node.js file that iterates over all the WordPress post data (annotations mine).

const postTemplate = path.resolve(`./src/templates/post.js`)

_.each(result.data.allWordpressPost.edges, edge => {
  createPage({
    // will be the url for the page
    path: edge.node.slug,
    // specify the component template
    // of your choice
    component: slash(postTemplate),
    // In the ^template's GraphQL query, 'id'
    // will be available as a GraphQL variable
    // to query for this posts's data.
    context: {
        id: edge.node.id,
    }
  })
})

The documentation defines a Gatsby page as “a site page with a pathname, a template component, and optional graphql query and layout component.” See the docs on the createPage bound action creator and guide on creating and modifying pages for more detail.

… Take a step back to “templates”.

In the step above we dynamically create pages based on our data by passing the absolute path to a defined template to “component”. So what’s a template? Basically a page component we define and feed into the loop described above. We pass the post id to “context” to make it available as a graphQL variable in the template file. The graphQL query defined for the template then uses that id to query for data specific to that post.

… Take another step back to “pages”.

So a template is a just page component that we can use to programmatically create pages. Then what’s a page component?

Page Component — React.js component that renders a page and can optionally specify a layout component and a graphql query. (Source).

React components living in src/pages automatically become pages . The file name of a page maps to its site path. My site in its current state only has one good example of this — src/pages/index.js maps to amberley.blog. If I had an ‘about’ page, it would live at src/pages/about.js , and map to amberley.blog/about. (Since that doesn’t exist, it will actually end up hitting the only other page currently defined in my site, which is src/pages/404.js — (read about 404 pages).

If you include the “optional graphQL query” noted above, the result of that query is automatically passed to the component on a data prop (this.props.data). (Read more on graphQL queries).

Onward

While this isn’t a step-by-step tutorial, more a guided walkthrough of me walking through an initial Gatsby setup, if you’re following along with the demo code you’re probably close to (or already!) seeing your WordPress data populate your Gatsby dev site if you run gatsby develop!

Sidenotes

  1. You don’t need to know graphQL to get started with Gatsby. I didn’t. It’s been a good introduction.
  2. Gatsby makes heavy use of plugins — both official and community — for a lot of things, from one that implements Google Analytics, to one that adds GitHub’s accessibility error scanner to all pages.
  3. Read through some of the source code. I particularly enjoyed reading through the bootstrap process. (It’s beautifully commented).
  4. Gatsby.js is a static Progressive Web App (PWA) generator, but to be PWA friendly (at least according to the Lighthouse PWA audit), look into two plugins: gatsby-plugin-manifest and gatsby-plugin-offline.
  5. I did end up deploying with Netlify, and I’m super happy with it.
  6. Figuring out how to get GitHub gists to embed correctly is now on my list 🙂

Resources (aside from those linked throughout)

  1. Rebuilding my portfolio website with the great GatsbyJS and WordPress
  2. Migrating to GatsbyJS Part 1
  3. Experimenting with GatsbyJS and the WordPress.com API
  4. The Web App Manifest | Web Fundamentals
  5. App Manifest Generator

The Road So Far Pt III

Exactly a year ago I posted The Road So Far Pt II. I now have two full years under my belt since undertaking this career pivot. I’m still not sure what I want these recaps to be, but I feel compelled to keep going now that it’s a pattern.

2017. 2017 was a “growth year”. I always laugh at that phrasing (because which year isn’t) but while it wasn’t the greatest year, I learned quite a lot.

Continue reading The Road So Far Pt III

The Road So Far Pt II

Almost exactly a year ago, I first started writing about my pivot to working full-time as a web developer (aka The Road So Far Pt I). tldr; after dancing around the edges of embracing this career (in every possible way, for my whole professional life leading up to that point), it had become clear I wanted and needed to commit. I find that reflection is the only way to take stock of progress, and a year seems like a good time to look back.
Continue reading The Road So Far Pt II

The Year of the Blanket

I love blankets (in general, and to knit!) Big, squishy, comfy, cuddly blankets– likely, at least in part, due to my conflicting relationship with actually paying attention to gauge. It doesn’t matter as much if it’s off by a bit — it’s a bit like cooking vs. baking. Anyway, onto the assortment of blankets from this year:

Continue reading The Year of the Blanket

Event Roundup: Emberitas and Front Porch

Finally, finally, I have time to hit up local events and meetups again, and Austin has not disappointed. (See what I was up to the first half of the 2016.)

#Emberitas

First up, Emberitas. I found out about this event through the Women Who Code – Austin network. Three awesome women in the Austin Ember community decided to organize this free one-day workshop to introduce women to Ember.js. (All bootcamp grads, by the way — two from MakerSquare and one from CodeUp).

Continue reading Event Roundup: Emberitas and Front Porch

Async patterns: Promises

Given our understanding of what async is, how the callback pattern manages async, and some of the deficiencies of the callback pattern, let’s dive into another, newer pattern — promises.

Promises are clearly exciting the JS community. As someone who never really knew JavaScript before promises, I have only an academic understanding of the magnitude of this shift. In fact, I think I was exposed to management of async first with callbacks to make promises seem just that much more awesome (like building a node server before meeting Express). Understanding both is important to a deeper understanding of each, individually.

As with callbacks, for a new developer, it can be difficult to sift through the massive amount of information available online. For the benefit of anyone else newly exposed to promises, in this post I’ve attempted to cull the resources and posts that I have found most enlightening through my own learning.

Continue reading Async patterns: Promises

Async patterns: Callbacks

So what is a callback function?

A callback function, also known as a higher-order function, is a function that is passed to another function (let’s call this other function “otherFunction”) as a parameter, and the callback function is called (or executed) inside the otherFunction. A callback function is essentially a pattern (an established solution to a common problem), and therefore, the use of a callback function is also known as a callback pattern. (Source)

Continue reading Async patterns: Callbacks