Coding Part II: Radfems

 

Hi there!  Read Part I of my coding journey here and get the chrome extension here!

Part of what reignited my desire to code was a project I did in December 2016 called He to She.  It was a simple chrome extension that changed instances of masculine pronouns (he, his, him) to feminine ones (she, hers, her).  It was pretty janky (code is here) and was largely written with the help of tutorials.

But it was SO much fun to write!

And I wanted to do more.

For my next project, I wanted to create a chrome extension that brought up a new woman in STEM with each new tab.  There are plenty of new tab extensions out there and I figured it should be within my realm of understanding.

Nope!

It was way beyond my capabilities.  So I headed back to the drawing board with CS50.  This time, I was determined to finish.  I had projects to create!

Granted, it wasn’t a straight shot.  I got distracted and built a shelf and a robot, but I got through the course in the end.

So there I was with a blank sublime text page, an idea for a project, and no idea how to start.

Sketching out the plan

I began by sketching out the user experience of my project:

  1. User opens a new tab.  A page with a random woman to know in STEM appears.  There is a picture, her name, and a short bio pulled from Wikipedia.  At the bottom of the page, there is a link to read more on Wikipedia.

Then, I broke down the actions I would need to figure out:

  1. Get the name of a woman in STEM
    1. I decided to put a pre-determined list of names in a txt file since I couldn’t find a good RSS feed or other such list of women in STEM
  2. Get info on the woman from Wikipedia
  3. Get picture of the woman from Wikipedia
  4. Add Wikipedia information to the new tab page
  5. Add some sort of backup option if the user is offline or Wikipedia doesn’t work
  6. Format the page so it looks pretty!

Using the Wikipedia API

I decided to tackle the info from Wikipedia first.  This was, in my mind, the meat of the program and so it was important to get it working.

To do this, I knew I would need to get a JSON object from Wikipedia.  JSON (JavaScript Object Notation) is basically an easily readable bundle of information from a website.

To get a JSON object, you need to request it.  One way to do this is to use JQuery to request a JSON object from an API.

Side note: We had used JQuery in CS50, so I understood the basic concepts, but I hadn’t sat down and read the documentation.  Like I said in Part I, I like getting context then going back for the foundation.  For me, it’s much easier to write a program using JQuery then go back and read the documentation than to read the documentation top to bottom and sit down to write a program.

CS50 is set up in to facilitate that style of learning.  They give you serious training wheels so you don’t really need to understand what you’re writing.  It’s up to you to follow up and read documentation to truly understand what you’re doing.

Back to my project: I started looking into whether Wikipedia had an API and found this page.  I also found this page about parsing JSON responses from JQuery and this one about Wikipedia extracts.  I used the URL from the Wikipedia extract page and some of the code from the parsing JSON page to put together a first working version of my javascript code.  A screenshot of my first successful grab of Wikipedia info below!

Screen Shot 2017-04-14 at 9.59.41 AM.png

link to v1 js code on Github

Seeing the words appear on the page was IMMENSELY satisfying, but I was a long way from a launch ready extension.

Making my JSON request dynamic

My next step to make my JSON request dynamic.  In v1, I had hard-coded in a single URL that retrieved the summary info for the wikipedia page for “Weather.”  I looked around for how I might build the wikipedia request and had an a-ha moment after re-reading the JQuery documentation on .getJSON.

I realized that “Data that is sent to the server is appended to the URL as a query string.”  This meant I could pass a number of parameters into “data” as an object, and the output would be url.com?A=B&X=Y for the object {A: B, X: Y}.

So I looked again at my wikipedia URL and translated the query string into a data object like so:

https://en.wikipedia.org/w/api.php?format=json&action=query&prop=extracts&exintro=&explaintext=&titles=Weather&redirects=1
{ "format" : "json",
  "action" : "query"
  // etc etc etc
}

You’ll notice that the empty parameters like exintro=& are linked to empty strings in my data object like this –> {“exintro” : “”}

I also (later on) read on the Wikipedia API documentation page that you can (and should) pass multiple variables to the same parameter using the pipe symbol “|”.

For example, prop=extracts&prop=pageimages became:

{ "prop" : "extracts|pageimages" }

My final query looked like this:

 var wikiAPI = "https://en.wikipedia.org/w/api.php?";
 var test = $.getJSON( wikiAPI, {
 format: "json",
 action: "query",
 prop: "extracts|pageimages",
 exintro: "",        // this is to get just the intro paragraph
 titles: fem,        // variable with name of the random woman to lookup
 piprop: "original", // this is to get the image
 redirects: "true"   // this returns the final page after any redirects

Loading in my ladies

Now that that was done I had to figure out how to load in a list of ladies, and retrieve a random lady to look up.  In CS50, we had used separate text files to hold long lists so I decided that’s what I would do.  I created a .txt file and manually typed in a list of women in STEM.  (The list is basically a mashup of various buzzfeed/wikipedia/other lists, with some women who’s bios are super short removed, so suggestions/edits welcome!).

To do this, I would need to use a GET request.  This is exactly what I had done with the Wikipedia request, so this would be easy!  Also, since my file was local and I didn’t need to send any additional parameters, my GET request was VERY straightforward.  Just $.get(filename).  See below for my code:

 $.get("radfems.txt")
   .done(function(femlist) {
   var femlist = femlist.split(/[\n,]+/);
   console.log("getFemList success");
   randomFem(femlist, callback);
   })
   .fail(function() {
   console.log("getFemList error");
   })
   .always(function() {
   console.log("getFemList complete");
   })

You’ll see there are no additional parameters passed to my GET request outside of the filename.

The next piece was to parse the returned object.  Basically, I got back a big string, and I wanted to split it into an array of names.  Unfortunately, I had formatted my text file so that each woman was separated by both a comma and a newline.  I didn’t want to go back and reformat, so I decided to use a regular expression (regex) to match the comma+newline pattern.

Using an online regex tester, I tested out my regex and got back an array of my women’s names.  Success!

Retrieving a name

Now that I had my list of women loaded in, I needed a way to get a random name to then lookup in Wikipedia.  This part was very straightforward.  I used the built in Math.random() utility to generate a random number, and then used that number as the index to get a woman from my array.

var random = Math.floor((Math.random() * femlist.length));
 var fem = femlist[random];
 while (fem == "") {
 fem = femlist[random];
 };
 getFemInfo(fem, callback);

Local/backup image

The last piece of the puzzle was having some sort of backup image or text for when the user was offline.  I googled around and found this women in STEM bio series jewelry designer aubergdesigns had created.  I pulled a few of these images to use as my backups.

I put these images into their own “imgs” folder, and then linked to a random image in that local folder whenever the Wikipedia request failed.

 var test = $.getJSON( wikiAPI, {
    .... // this part is shown above...trying to keep it concise!
 })

 .done(function(test) {
   .... // this part is really long, see github for code
.fail(function() {
 console.log("getFemInfo error");
 getLocalFem(callback);
 })

// LOCAL FILE RETRIEVAL FUNCTION
var getLocalFem = function(callback) {
 console.log("getLocalFem");
 var random = Math.floor((Math.random() * 3));

 var img = "/imgs/" + random + ".jpg";
 callback("", "", img, "");
}

Callback functions

Up until this point, I had been using a global object container (more here) to store a number of variables – such as the name of the woman I was looking up and the Wikipedia page ID – that I wanted to access from several functions.

However, I had read that it’s generally discouraged to use global variables.  I think using a global object container is less discouraged, but still I wanted to see if there was another way.

Much googling led me to the concept of callback functions.  I wanted certain functions not to execute until the data they needed was ready, so I thought it made sense to use callback functions.  Essentially, a callback function is a function that is passed to another function as an argument.  The callback function is then called/executed WITHIN the other function.

I like examples so I googled around some more and found this code for displaying a quote in each new tab which helped me to understand how callbacks are used in the wild.  (I often find it helpful to look at longer pieces of code in Github, as examples in documentation are often really short snippets and I find it helpful to see more context.)

I then structured my code similarly to the code from csoni111.

  1. updateFem: I called a main updateFem() function once my document (the new tab) loaded.  That function contained the code to actually place my content on the page.
  2. getFemList: In order to be able to place content, I needed to get content.  I passed the function for placing content (my callback) to the next function which loaded the list of fems from my text file.
  3. randomFem: Once the list was loaded, I passed my callback (function to place content) onto the next function – the one that got a random name.
  4. getFemInfo: After I had a random name, I passed my callback over to the next function to get information from Wikipedia.
    1. callback: If I was able to successfully retrieve info from Wikipedia, I passed the info to the callback function to execute.
    2. getLocalFem –> callback: If I was unsuccessful (e.g. if I was offline when I opened a new tab), I retrieved a backup image from a local directory and passed this to the callback function to execute.

The callback was the very last function I wanted to execute.  I thought of it as an empty box with a bunch of gears inside that was getting handed from function to function.  Once all the other functions had executed, the final function handed all the necessary parts to my callback function and told the callback function to execute.

So that was the info retrieval side of things.  Read on to Part III to learn about how I displayed my content!

Advertisements

Coding & learning with context

Hello, world!

I’m incredibly proud of this next project.  It captures perfectly the goal of Zeynep and my quitting quitting project.

I started taking CS50x in December of 2015.  At the time, I thought I could blow through the class in a month if I plugged away at it for 10 hours a day.  I had big plans of taking additional math and CS classes after CS50x and possibly going back to school for a master’s in CS.  What, a master’s in CS?!?  But you majored in Art and International Relations!  Yes, dear reader.  I had the exact same thought.

So then, why a master’s in CS?  I wanted a career change.  I hated my job (project management) and I wanted to make things.  I had taken a Udacity Intro to Python course back in 2011 and loved it.  But I didn’t really know where to go from there.  I ended up writing a bunch of Google Apps Scripts since they were easy to get started with, and useful for my job.  But I wasn’t really learning much else.  I felt I had hit a wall and wanted to be back in a school-like environment.

I spent HOURS reading through reddit and quora blogs about going back for a second bachelor’s in CS, or going to a coding bootcamp.  The consensus seemed to be a second bachelor’s was a waste of money and a bootcamp wasn’t rigorous enough.  Instead, most people suggested taking the core classes on your own and applying directly for a master’s program.  So that’s what I was doing, or so I thought.

My biggest problem, at least in the last few years, has been split attention.  There are SO MANY projects I want to do and not nearly enough time to do them all.  Instead of picking one things and diving into it, I would start down one path, get frustrated that I wasn’t making progress fast enough, and then switch to something else.  The end result was that I got nothing done.

The problem with this approach was that I was a beginner at a lot of the things I wanted to do.  It’s like wanting to play Beethoven’s Symphony #5 on the piano, but not knowing how to play the piano.  You have two options.

  1. Watch a bunch of YouTube tutorials of people playing Symphony #5 and copy their finger movements exactly.  Eventually, you’ll be able to play that one piano piece, but nothing else.  You won’t have really learned to play the piano.  HOWEVER, with every note you hit you could hear Symphony #5 somewhere in there, struggling to get out which kept up your enthusiasm.  Also, you will have learned a LOT about piano playing (though you may not realize it) which will serve as a good foundation to learn to play the piano later.
  2. Start with the basics (reading musical notes, practicing scales) and work your way up to playing Symphony #5.  You’ll actually learn to play the piano, but during the learning process you won’t be playing Symphony #5.  That means you’ll need to keep reminding yourself what all that boring scale playing is leading to.  However, you’ve built a strong foundation about music playing that you can apply beyond Symphony #5.

That’s what it was like for me with programming.  The Udacity course was like starting with method #2, but stopping with scales.  After the course was done, I had no idea how to apply anything I learned to the projects I wanted to create.  I didn’t know how to go from playing scales to playing a real piece of music.

So I shifted to method #1.  I dove into a bunch of Apps Scripts projects, frankenstein-ing programs together using other people’s code, tutorials, and the Apps Scripts documentation.  I didn’t really get half the errors I was seeing.  I didn’t really understand why things worked when they did, but I could generally get things working.

However, this was deeply unsatisfying.  Which is why I came to CS50.  I wanted to be back in a school-like environment.  To learn things the “right way.”

Taking CS50 after having spent two years frankenstein-ing code was GREAT.  Going with method #1 gave me context so that when I saw lessons in CS50, I could think “Oooooohhh, THAT’S why that works” instead of thinking, “Ok, I get the theory now how do I apply it?”  I had already applied it and now I was backing into the theory.

But back to December 2014.  Taking CS50 was great, but it was hard.  I was itching to get started on projects and the thought of having to take 11 weeks of courses was overwhelming.  I got frustrated that I wasn’t making progress fast enough and quit.

This is totally counterintuitive and I know it, but I still do it all the time.  I think it’s going to take too long to learn something, so I quit.  But then 11 weeks later I’m sitting there thinking, why didn’t I just invest in this 11 weeks ago?  The problem?  Learning scales is boooring and I wanted to play the Symphony NOW!

Anyway, I quit the course in Jan 2015.  There was the issue that I wasn’t progressing fast enough coupled with my life getting busy.  I was also taking a sci-fi writing course at the time which I really threw myself into.  It was my 10 hour a day project.  On top of that, I was applying to new jobs.  I started a new job in April 2015 and just got distracted getting up to speed and working hard at the new gig.

But the new job was still in project management so, inevitably, I begin to feel the itch.  I wanted to *make* things.  So I picked the course back up Dec 2016 and really got to it in Feb/March 2017.  I finished the course last week (April 2017) and it was HARD.

I admit there were a few additional stop and starts in there, though not quite as long, and I skipped two problem sets, but I got through it!

My next post is about my final project!  Read on here…

Update #4: Part 1 of 7 complete

Greetings from a cozy cafe in Stockholm with a snowstorm raging outside. It’s the never-ending winter but I must admit I am kind of enjoying writing here with candle light and coffee.

As promised, here is a draft of the short story I am working on for my creative writing group here in Stockholm. Although I am behind in terms of the overall project, I promised the rest of my team members that I would have a draft complete and sent to them by the end of April.

Although not very writerly or artistic or mythical, I am taking a very administrative approach to my writing process. I Googled the average number of words in a short story and decided on 7,000 words. I am now trying to write about a 1000 words a day. My aim until next weekend is literally to just PUMP SOMETHING OUT no matter how crappy it is. I will edit afterwards.

The reason for this is that I am usually so paralyzed by anxiety and worrying about having something perfect the first time around that I end up just avoiding the whole creative process altogether and procrastinate.

So, in line with this blog and trying to change my processes that clearly do not work, I am just writing things as they come to me.

If you are interested in reading my current draft you can click here. Obvious disclaimer: it is in VERY ROUGH DRAFT FORM.

Happy Sunday!

xo

Zany

Update #3: Mapping out my life

Hey y’all,

As promised, Ann, here is my blog post about mapping out graduate schools I am interested in and what the requirements are.

I got so into mapping things out visually for school, I also added a sheet about what I want from life. Haha. And then I made a final more “realistic” flow chart with actual dates, with what I am doing when.

I’m not going to lie some of this has caused me a little bit of anxiety, which I think is heavily related to why I procrastinate. But, I think overall it’s a good thing: it means that something is stirring and it’s touching a nerve. And the only way out is through.

So without further ado, here are my “maps.”

1. What do I want out of life

IMG_0813

I first started with the question, What do I want? I felt like I had to add a date because, well, I’m human and wants change. I tried to not think with a scarcity mentality of what I can do or should do or get paid to do but really, just to let it loose and write whatever the fuck I wanted. Turns out, the things I want are pretty simple: a family, to have mental and physical health, to make art, to write and to have a job that solves problems, helps people and is creative. Oh, and a summer house on the Aegean coast of Turkey and a boat (happy shiny golden boat, Ann!).

I then got some yellow post-its and wrote actions I can do (daily, weekly or whenever) to not just “get” what I want but to also to create experiences of what I want in the present. For a family, I can start by not dating assholes and to be a good friend, partner, family member. For mental health I can go to therapy, do yoga, eat well, and exercise. For writing I can… write? Set goals to achieve with writing (hello, purpose of this blog!). For making art… I can make art? Take classes? Have deadlines (hi blog!). And in terms of a creative, fabulous job – well, I can just search for it and maybe get educated for it.

2. Mapping out schools 

This was actually the first visual map I created but I am ordering my maps going from broad to specific. As such, here is the map of the schools that I am currently interested in.

IMG_0810
Pick a card, any card

I decided to color code the most important aspects of the programs:

  • Cost
  • Deadline
  • Length
  • Requirements
  • When and location 
  • Why

This first five aspects were easy enough to fill in with information gleaned from the websites. The final question of why was a little harder – but it helped me figure out my real reasons for applying to certain programs. They ranged from switching jobs, to moving to Canada to just having fun!

I thought this was valuable insight and a starting point for myself for a future decision-making process of either applying or even attending the programs.

Again, I tried not to think about whether or not I could get in or even the costs – both financial and time. I will do that at a later stage.

3. 2017 – timelines 

My final incomplete visual map included concrete dates, activities, goals and how those activities are further conducive to my goals which were written in pink.

IMG_0814

This was a little more anxiety-inducing as I realized I was trying to map out 8 months ahead. And given that one of my original problems is that I plan but don’t do, I started feeling like this was a little bit pointless. So instead, I marked down actual activities (like art classes that I had signed up for and will obviously put up on this blog because I don’t want to quit them like I always have!) as well as a concrete date – for example, for a 10K I am running in September with a goal time. As well as activities I can do in August to prepare in advance for grad school applications (even though the earliest one is due January 2018) by at least writing the letter of intent and statements of intent.

I also realized that mental health and “soul”-health are the core of my ability to not only be happy but also to be able to complete projects and have the confidence in doing so. So I drew a little helpful visual map in the center that highlights the more frequent, recurring activities I need to do to be happy such as exercising, eating well, reading more, listening to good music and going to concerts, meditating.

Anyway, I realize this all looks a little bit all over the place but I think the end result is that I have something visual to refer back to every time I am feeling the urge to escape from the world and myself.

Next challenge: completing my short story for my creative writing group! I will keep you updated on the writing process and progress – if not every day, every couple of days!

Over and out!

 

 

Teleabsence

Hello readers!

Today I’ll be updating you on my teleabsence robot.  I was inspired by Leila Takayama’s research on telepresence systems.  I was curious how a person’s interactions with others might be affected if they were not in control of the system.

The first system I wanted to build was a teleabscence robot.  I wanted the robot to turn away from people who approached it and tried to speak with the person dialed into the system.

My original idea was to use a microphone to detect if someone was speaking to robot, and then have the robot roll away.  There was one big problem with this approach.  Hobby microphones aren’t very sensitive so it wouldn’t be able to tell the difference between someone talking to the robot, someone talking near the robot, or the remote user talking over the telepresence system.

My next idea was to use a contactless IR sensor.  I wanted the robot to be able to differentiate between a wall and a person, and a person talking in the same room vs. someone talking to the robot.

I wired up the system, had it work for a hot second, and then fried the IR sensor while trying to rewire the system to consolidate 3 breadboards –> 2.  The sensor was pretty expensive (~$15) and it wasn’t all that great at detecting people to begin with, so I decided to take a different approach.

I thought about buying a motion detector (which I think is the easiest way to detect people), but decided to change the behavior of the robot so that it would act how I wanted it to act with the parts I had:

The first step was to wire the system up.  Since I didn’t buy a full-on robot car kit, I needed to figure out how to set up the motor driver and distance sensor.  I followed this tutorial for the driver, and this one for the ultrasonic distance sensor.

Then I loaded in code for a simple object avoiding robot to make sure everything was working as intended.  I think this code is a little different than what’s in Github (the robot doesn’t back up for 2 seconds before turning), but below is an early system test.

There are many problems with this simplistic system, but one of the biggest is that the field of view just wasn’t very big.  The robot wasn’t able to see (and avoid) objects that came in at an angle (see video below) or objects that were below or above the distance sensor (e.g. wires or a chair with a low crossbar).

Another problem that’s more obvious in the first video is that the chassis is pretty janky.  One of the screws on the motor had come off which is why the robot drifts to the left instead of going straight.

However!  The robot was *basically* working.

Shortly after the above videos were taken I fried the IR sensor and decided to go with a behavior change instead of a motion detector.

Originally I had wanted my robot to roam around aimlessly, but quickly go in the opposite direction if anyone tried to approach it.  However, it was quite tricky to tell the difference between a person and any other object that’s obstructing it’s path.

I decided for v1 to instead have the robot stay still, but then turn away if someone tried to approach it.   If the person continued to “bother” the robot (approach it 3x), then it would retreat to a safe distance.

In addition, I wanted the robot to still be able to avoid objects (walls etc.) if it encountered something while it was retreating.  As far as I can tell, there is no way to check the sensor input while the robot is moving forward, since in order to code the forward motion I needed to put in a delay.

What I did to deal with this issue was to add a second ping within the forward function.  If the robot encountered an object, it would simply stop.  Then after the forward function was finished being called (total 2 seconds), the main loop would begin again and the car would turn since it has encountered an object (remember, it stopped when it encountered the obstruction <= 20 cm away, so the obstruction is still there).

Now that I had the code working the way I wanted, I turned to the design of the casing.  I wanted my robot to look approachable, and decided to create something that looked like Miyazaki’s soot sprites from Spirited Away.sootballs.gif

Unfortunately, I didn’t take into account that a soot sprite is tiny and adorable, and my robot is (relatively) huge.

My husband thinks it looks like a runaway toupe.  My classmates thought it looked like a cat.  See for yourself below…

But wait!  You’re probably thinking.  where is the telepresence/absence aspect?  Good eye 😀  I haven’t implemented that yet since getting to this was all I could manage in the time I had for the class.

If you’re interested, my v1 robot code is here.

Next time, I’ll discuss the soldering and v2 design process.

Thanks for reading!

Update #2: Adjusting

Greetings from a cold, windy Tuesday in Stockholm.

It took a little time for me to get back on my feet with the Prime Number Project as I faced some unexpected challenges!

Challenge 1: Bureaucratic barriers discovered

I discovered all school applications required me to have verifiable evidence of my residency status in Sweden. As I am currently in the process of applying for permanent residency, this caused me to drop all school applications until 2018.

I was a little upset, but I bounced back by thinking about the positives:

  • more time to research alternative schools
  • more time to have coffee dates with industry professionals who can inspire me
  • more time to have better quality applications for 2018!

Challenge 2: Terror attack in Stockholm on April 7

As you may have heard, there was a terror attack in Stockholm last Friday. It was really scary and although I am from Turkey, which has had a much deadlier and more frequent occurrence of such attacks, it threw me for a loop since it is in the same city in which I live. Although not an excuse to not complete projects, I ended up spending the weekend with friends and trying to do “normal” activities like exercising and cleaning to get back on track mentally.

Which helped me realize a systematic challenge that I face when completing projects: I get thrown off by external events and emotional ups and downs. I am great at making plans because in that moment I truly believe that the plan will be carried out without any extenuating circumstances, but when those circumstances occur, I tend to drop long-standing plans in favor for short-term gratification.

I will try to take this into account when going forward.

So here is my updated Prime Number Project Plan.

I still like the bite-sized approach to our plans, Ann, so I think I will try to see if I can make it work by switching around the order of prime numbers but still allocating a certain amount of time to complete tasks… since my (our?) original problem is lack of external deadlines.

  • 1 day to map out schools I am interested in, their application requirements and deadlines for 2018 – I plan on creating a visual board and uploading it in my next blog post. (Due: Thursday April 13th) (the purpose of this is so I can have a “plan” for the rest of 2017 and for 2018 of what I have to do by when so I can relax)
  • 13 days to write my short story for my creative writing group (Start: Friday April 14th, Due: Wednesday April 26th)
  • 5 days of blogging: 1 blog post per day (Start: April 27)
  • 7 days of Ashtanga Yoga (Start May 1)

I will keep you posted as I complete tasks!

Looking forward to your next post Ann – and WELL DONE on the shelves! They look beautiful ❤

 

The shelf

My first task is complete!  I didn’t really follow the prime number format, but I finished my first Ikea hack.  The finished piece is below.

IMG_2194

Time: 1-2 hours a day for 5 days

Difficulty: Moderate

Pain-in-the-ass-ness: 4 out of 5.  Shelves are a pain to hang and spray paint is pretty much a no go unless you have access to outdoor space or a large garage.

Worth it?  Myeh.  I’m pretty happy with how it turned out, but I was pretty irritated during the process.

###

Why I did it

This project started as a vague concept to sell Ikea hacking services.  My first step was to hack a few pieces to get a feel for the process and get some nice images for my website.

How I did it

I was loving the brass trend and spotted these fabulous shelves on Pinterest.  These look DIY-ed and I figured they’d be super easy to recreate, so I took them on as my first challenge.  (I realized later he has DIY instructions for the shelves here.)

Materials

Since I was just testing out the concept, I decided to go for a small shelf unit instead of a full-on wall of shelves.

  • (2) Rubbermaid 30″ double track shelf tracks (I got mine at home depot)
  • (4) 11.5″ Shelf brackets (also from home depot)
  • (1) Can of Krylon metal paint primer in white
  • (1) Can of Montana Black spraypaint in gold (can’t find it on their site, I got it from Blick)

IMG_2100.JPG

Step 1: Painting

I started by sanding down the brackets and giving them two coats of primer.  I used medium grit sandpaper and went over the brackets until they were no longer shiny.  This took maybe an hour or so.  It’s a really dusty process, so I’d recommend wearing gloves.

Next I gave the brackets three coats of gold spray paint.  At first, I went on pretty thick and got a really shiny, smooth finish.  The bracket I tested this on looked like a block of gold.  Unfortunately, because I went thick I ended up with big drips down the sides.

I wiped the test bracket down with mineral oils to get rid of the paint, then re-sanded and primed.

On my second go-round, I tried to do multiple passes of thin coats.  I don’t know if it was the paint, my spraying technique, or the wind, but the paint didn’t go on as a smooth mist.  It looked pretty spackled.  As I built up the second and third layer, the finish ended up being bumpy.

I did a test spot where I sanded in between the first and second layers, but this did nothing to smooth the finish.  The sanding also took the shiny-ness away from the gold, leaving an ugly brown color.  I decided to just leave it as it was.  As the paint dried, it ended up spreading out and smoothing a bit, so it looked fine in the end.

IMG_2181

Here are the finished brackets drying in my shower where there is a strong vent to draw away the toxic paint air D:

Step 2: Hanging

To hang the shelves, I used all-purpose drywall anchors rated for 85lbs (which is complete overkill, but I had these lying around) and 2.5″ screws (which I also had lying around).  I didn’t use the screws that came with the anchors because I liked the flat look of the black screw rather than the big, bulbous top of the silver screw.

You’ll notice the black screws are much longer, but that ended up being fine since the bracket sticks out from the wall quite a bit, so when you take that into account the black screw was a good length for the anchors.

img_20170405_205135.jpg      IMG_20170405_205512.jpg

I followed the technique in this video to get the brackets lined up.  I used a different type of anchor from the video, so I had to pre-drill holes before hammering my anchors in.

Next, I marked off the top screw location of my second bracket and drilled my anchor hole.

Sadly, I hit a bracket 😦  I don’t have a drill bit to go through metal, so I didn’t have any choice but to drill a second hole slightly to the right.  Luckily (trying to be an optimist here!) I had just painted the wall, so I’ll be able to spackle and match the paint color to cover just the drill hole.

IMG_2190

Disaster!

Finally, I got the anchors in and put up the second set of tracks.  Then I slotted in the brackets, placed my shelves (cannibalized set of billy bookcase shelves) and that was that!

IMG_2194

Here is my shelf with my trusty drill.  (I thought the lower right corner looked lonely in the first picture.)

IMG_2196

And a close up of the brackets.  You can see there is a little bumpiness to the finish, but overall I think it looks quite nice.

IMG_2197

Thanks for reading!

Creativity porn

So…this blog is working!

Now that Zeynep has posted her update, I feel obligated to post mine.

First off, I’ll admit I did nothing over the weekend.  I have a million excuses, mostly doing with my husband being out-of-commission resulting in me being the sole baby-watcher, but in reality I could have gotten work done at night but I didn’t.

Watching a baby is exhausting so at night I ‘treated’ myself to some TV.  But let’s be real.  There was a time when making creative work was a ‘treat.’  And there was a time, not so very long ago, when reading was a treat.  Both of those activities are loads better than TV.  So I need to replace TV with a different treat.  To that end, I’m going to put a mini-challenge to myself for today to find a new book.

OK!  Now moving on to last week’s results.  I’ve been working on Ikea hacks.  When I started out, I had this grand plan that I’d hack all of this Ikea furniture, post a bunch of pretty pictures, then find people who would pay me to hack their furniture for them.  I mean, people already pay for Ikea furniture assembly, so they’d totally shell out another $100 to beautify their billy bookcase, right?

Besides, I’ve painted furniture before so it couldn’t be that hard to do this more professionally.

Nope!

Painting Ikea furniture is a fucking pain in the ass.

Who is this person who stripped down and redid her cabinet after round 1 didn’t go as planned???  Or this person who painted and wallpapered a Pax dresser to make a custom vanity??  Or any of these people who probably spent more money revamping their Rast than buying it?

So there I was on Wednesday (or was it Thursday?) spray painting a set of generic white brackets brass thinking to myself, what the fuck am I doing?  I don’t even like painting furniture.  I like hacking things, for sure, but I have never enjoying the prime, sand, prime process.  Not for furniture, not for canvases.  In fact, that was my least favorite part of painting.  So…once again that brings me to…what the fuck am I doing?

And as I painted I began to wonder, how many people actually try these hacks?  Maybe I’m just over-confident, but I look at these home improvement blogs or instructables and read over the instructions and think, no problem.  I can totally do that.  Then when it comes down to it, it’s a complete mess.

What I realized as I was painting (epiphany brought on by paint fumes?) is that nobody does this stuff.  People love reading about these cools hacks and sitting there thinking (as I naively did), I could totally do that.  And perhaps with enough time, space, and patience they could.  But in reality most people won’t bother.

Ikea hackers and home improvement bloggers are selling creativity porn.

Of course, there are people who do want to be creative.  To make things.  To hack furniture.  But most people just want to fantasize.

And me?  Maybe I’m in the fantasize bucket too, when it comes to furniture.  Part of what I’m trying to do with this blog is find what it is that helps me get to flow.  I’ve been there while painting/drawing, while working on a design problem, a puzzle, or coding.  But not so much while furniture hacking.

 

Update #1

Good morning! It’s a glorious Monday morning here in Stockholm and as promised, I am cluing you in on my progress with the PNP.

IMG_0684
View from my office window. I think this is the first blue sky of 2017.

Update

The good news is that I have completed my first task which was to set up my rudimentary website. Check it out here. (Please feel free to give any and all feedback!) It really did take just 1 day, which was as planned. I am feeling proud that it’s at least out in the world and the fact that I limited myself to 1 day allowed me to stop focusing on time-wasting details like font size/layout and just to birth something. I cheated a little and stalked some other personal websites. I’m pretty happy with the outcome. Soon a task will be set up to blog more… but that’s for later 🙂

The bad news is that my 2-day plan of catching up on my design online course did not come into fruition – I worked on it over the weekend for a couple hours, but then let social obligations (and who are we kidding, sheer laziness) get in the way…. ahem, by going out dancing on Saturday night until 3AM and then being too tired on Sunday to focus and being really determined to finish Vikings. Which, I have. And today the TV gets put into storage to be unearthed in the fall. So long, farewell, au revoir, auf wiedersehen, old friend.

And, with a hard deadline looming for a grad school application (April 13th), I now feel I need to switch into my next plan of completing my application. Instead of stressing myself out with only 3 days during the weekday, I have decided to allocate this entire week to it so that’s 7 days. Wish me luck!

Reflections

I feel that the upside to this project is that we have at least set some deadlines that are forcing me to be more aware of how I am spending my time. It’s a case of “shoot for the moon and if you don’t land there you’ll end up among a couple of stars” … so this is me hanging out with a bunch of stars.

I did feel a little bit stressed over the weekend, like I was disappointing myself, and you, Ann, but a part of me decided that that was an unproductive emotion and to get back on the saddle and power on through. Also, who says Prime Numbers have to be ordered from smallest to largest … right?!

I’ll keep you posted on my school application by the end of this week. Here is the revised plan and achieved benchmarks.

– 1 day to finalize my personal website on Squarespace: DONE

– 2 days to catch up with a website design on DesignLab: NOT DONE

NEXT PROJECT7 days to apply to Hyper Island (due date: April 13th)

Revised: 7 days for my application to an industrial design intensive course (Due date: April 20th)

– 11 days of writing my short story for my writing group

– Revised: 13 days of ashtanga yoga