How Far I’ll Go

Moana was a great movie, and I liked how it had a really compelling hero’s journey with a main female character that didn’t fall in love with anyone! Also the music is amazing, so here’s a small tribute to my favorite song in it.

On reflection, the message in the song is a pretty positive one. During my work at Amazon Robotics, we’re always told to “Think Big” and have a “Bias for Action”. In other words, staying in the shallows where results are always known will also cause you to develop code/products that are squarely inside the box. Sometimes it takes a big failure in order to see possible paths for improvement in ways one couldn’t have otherwise known. Well, of course impulsively jumping into the ocean like Moana on her first voyage is a bad idea–but we’re all smarter than that. 😉

Image Steganography in Python

Second Title: Hiding Secret Messages in Cute Pictures of Dogs

What is this pupper hiding???

I developed this activity to as an interesting way to introduce students taking the foundation level software class at Olin to image manipulation and binary math. Since I spent quite a bit of time working on it, I wanted to publish the entire thing as a blog post in case other people on the web are interested in steganography. This exercise was modified from a similar one found at Interactive Python, though this version encodes an image into another image instead of ASCII text.

Because I wrote this as a learning exercise, there’s a neat little repo that holds starter code and solution code. You can clone/fork it here. The starter code is in steganography.py and has some missing functions for you to fill out, while the full solution is in solution.py. There are two main functions to this code. The first is a decoding function that can extract secret information from an image file, while the second is a function that can encode secret messages into images.

This code uses the Python Pillow library. You can install it using pip if the package is missing from your computer by typing sudo pip install pillow into your terminal window.

If you don’t wanna learn about how to do steganography and just want a neat script that will hide messages in images for you, you can use the code in solution.py. It is also embedded at the end of this post.

What is steganography?
In a nutshell, the main goal of steganography is to hide information within data that doesn’t appear to be secret at a glance. For example, this sentence:

Since everyone can read, encoding text in neutral sentences is definitely effective

turns into

Secret inside

if you take the first letter of every word. Steganography is really handy to use, because people won’t even suspect that they’re looking at a secret message–making it less likely that they’ll want to try to crack your code. In the past, you may have tried to accomplish this kind of subterfuge using invisible inks or using special keywords with your friends. However, as fearless coders we have access to fancier ways to sneak data around. *evil laughter here*
[Read more…]

He is the sad frog trapped in a pot.

Okay, this one is more a “People” post directed towards some thoughts that have been rolling around in my head lately rather than a specific person.

Kind of heavy for a public blog post, but hey! These are the kinds of things I think about, for better or for worse. Next post will have more levity, promise. 😀


“Forgive me,” He whispers to me in low tones, “I don’t mean to be happy.”
How can he, when the one he hates is himself? He says that its easier this way, because it grants him an excuse. He looks for brighter avenues because that’s what people say he should do, but consoles his wholly failed half-measures with the reprieve of being hated. To him, his daily defeats are wounds only bearable because he knows he has already failed. He sits in a little hole dug by his hatred, face buried in his arms so the rocks tumbling into his pit hurt less.

The one he hates is himself.
A comforting sureness of who he is, in one pair of eyes at least. He hides behind this ugly excuse, crouching lower so as to let the hatred smother him faster.

“Forgive me.” He says to the world
“I don’t mean to be happy.” He cries into his arms.
But he’s forgotten that the world doesn’t give a shit. He won’t be glossed over. He won’t be forgotten, forgiven, have nothing expected from him just because he is hated. His pit is a pothole, and he will naturally be run over if he insists on sitting in the middle of an avalanche.

I want to shake him from his dark reverie, tell him to take one step–just one step!–out of that hole. But I know that the walls of his prison stretch high, and this yawning cavern only echoes back his ironic fear of the world outside. He insists on staying.

It is not my place to tell him what he needs to do, I know that. It is also not my place to assume that I know what is best for him. But I do so want to see his face, the original–unhidden by tearful creases and shadowed hatred.

Algorithm for solving Knights Tour with Python(revisited)

The original Algorithm For Knights Tour was a pretty popular post, so I decided to revisit it thanks to an interesting email I got. This implementation has a couple changes:

  • You can define a ruleset for locations the knight must be at any given move
  • You can define whether the path needs to be closed or not (Knight returns to starting position)
  • There’s a visualizer now! (You’ll need to have pygame installed for it to work though)
  • No more ugly exiting using sys.exit(), we catch custom exceptions this time around

Here’s what the visualizer looks like:
(pink because pink is the best color obvs)

tour.py

The tour code is mainly the same as the original post, but with the added custom exception class and booleans. Lines 137-146 deal with obeying to a custom tour ruleset 
[Read more…]

The Holographic Universe

I’m currently reading “The Holographic Universe” by Michael Talbot. I expected quite a bit more science than is actually present in the book,  but it’s an interesting read nonetheless. (Though the book definitely explains science through a super new-age lens.) Only a quarter of the way through so far, but chapter three bought something up that blew my mind.

First, holograms 101:

The reason we can see stuff is because light bounces off of everything. Traditional images taken by cameras record incident light intensities as the photons hit the elements in a CCD or whatever sensor the camera is using. A hologram also records the phase of this light as well, meaning that playback of the recorded image retains all of the information during the recording phase.

Recording a holographic image. [Source: Wikipedia]

To record an image, a coherent light beam (aka laser) is sent through a beam splitter so we have two identical beams of light. One beam is reflected off the object to be recorded while the other beam serves as the reference of the recording laser. The two beams (object & laser) form interference patterns when they intersect, and this is recorded on the photographic plate.

Reconstructing the image. [Source: Wikipedia]

When the image is to be read/reconstructed, the original recording beam (or laser of same wavelength) is shone through the plate. Interference allows the original beam to be recovered, restoring the recording of the object to the identical state it was in when the image was recorded. Because we literally recorded the light bouncing off the image, the holographic result is actually identical.

In this way, a mirror recorded as a hologram will also reflect light. And a holographic recording of a magnifying glass will actually magnify objects behind it. The recording plate can also be cut into as many pieces as desired, while the full original image can still be restored albeit being a little more blurry because of the cutting. SO COOL. TOO COOL.

[Read more…]

Sync iTunes playlists to Spotify

iTunes is dumb and has a super restrictive API. Spotify is awesome, and has an API for all my things, like my PS4 and Amazon Echo. But I like the iTunes UI, and it plays better with my local library than Spotify. As a result, I subscribe to both services, but it’s such a pain managing playlists between the two.

I present to you, the super not janky at all sync script/setup that I wrote up in a 3 hour burst of inspiration last night. The main flow of the idea is this:

  1. CRON job runs AppleScript periodically
  2. Applescript queries iTunes for playlist information and saves each playlist and its songs to a .txt file
  3. Python script compares .txt files to Spotify playlists – information retreived via API calls
  4. Python script updates Spotify playlists with differences found between the two services

AppleScript is a very interesting programming language, where the code is incredibly human readable at the cost of ease of use when coding. Here’s what I wrote for extracting playlist information out of iTunes:

This extracts playlist information and saves each playlist as a .txt file to a specified directory. The Python component does most of the legwork in terms of finding which tracks needed to be added to Spotify. You’ll need to create a new application at the Spotify Developers page to get a client_id and client_secret_key.
[Read more…]

Teaching cars to drive with genetic algorithms

“What the heck Sophie?!” You say, “Why are you writing a debrief for a project you did 3 years ago???”

Hahaha, please bear with me dear reader. If I don’t, I’ll forget about the cool thing I did as a freshman in college still stumblin’ through Python. And how cool and easy genetic algorithms are. 😀

Anyhow, carrying on….


For our software design final project, we wrote a simulation program that would allow you to draw a track, then generate cars that would eventually learn how to drive around said track. It was a pretty fun project, and we got a pretty cool result.

Here’s our website!
Here’s the code!

Demo video:

What’s happening is that the cars are starting with random parameters for their wheels relative to its distance from the wall. As the the cars progress through the generations, these parameters are selected using our parameters, such that the car that make it around the track is the only one that survives.

[Read more…]

Installing and setting up ROS in 5 mins

[*disclaimer: not really 5 mins. Downloading ROS will probably take longer than that lol]

ROS is a really great library for robotics research. It might even be good for not robotic applications, I don’t know, but my general feel is that I like ROS about as much as I like nutella. (read: a lot). The ROS install tutorial is really good at explaining the process, but it’s spread over too many pages and requires too much scrolling. I’ve consolidated the information here in one page for ease of use. Our robotics lab only uses ROS Indigo, so I’m writing install instructions with that in mind. Also, ROS only works well with Ubuntu, so I’m assuming you’re also using the correct OS.

Everything that follows, unless explicitly stated, should be typed in a terminal window. Okay, so the steps:

1. Set up sources.list
We need to add the ROS package sources to our sources list so we can actually find the ROS packages using the apt package manager. Open up a terminal window and paste the following:
sudo sh -c ‘echo “deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main” > /etc/apt/sources.list.d/ros-latest.list’

2. Set up your keys
Next we need to set up keys so Ubuntu will actually allow us to download + install the packages.
sudo apt-key adv –keyserver hkp://ha.pool.sks-keyservers.net –recv-key 0xB01FA116
If you get a gpg: keyserver timed out error, use this instead:
sudo apt-key adv –keyserver hkp://ha.pool.sks-keyservers.net:80 –recv-key 0xB01FA116

3. Install ROS via apt-get
Make sure the apt package index is up to date from when we added those new sources at step 1.
sudo apt-get update
Then install ROS!
sudo apt-get install ros-indigo-desktop-full
There are a couple of flavors of ROS that you can install, but for most applications, you might as well do the full install to make sure you get all the packages you’ll ever need.
[Read more…]

She doesn’t mind pebbles.

I started writing this one 8 months ago, but never really found the inspiration to finish it. For some reason, inspiration is hitting me like a hailstorm today, so here’s the finished piece.

Posts tagged “People” are short pieces inspired by people I know in real life. No naming names here~

Also — Checkout this cool photo I took when we went hiking! 😀

the drive


I couldn’t understand her the first time we met. She was loud–so loud, and her laughter bounced like a bowling ball across the nervous tension of that room filled with complete strangers. The way she spoke had a curious lilt, her sentences always rushed towards the periods like she was scared they wouldn’t have a chance to be spoken fully. She spoke a lot, and listening to her talk was like listening to roller coaster scream down a metal track.

Three years ago, I could recognize her voice from a mile away just by the sound of wind whistling past her words. People here are nicer than most, they remember to drop the stones they hold instead of throwing them at things they don’t like. Despite that, she used to cause people to pick up an awfully many number of rocks. I remember wondering why she never noticed all those stony stares and pained laughs scattered around her path.

At one point, I asked her if she tripped a lot when she walked.
“Oh, I do.” She had laughed, meeting my slanted gaze with confidence. “But I don’t mind it now.”
“Why?”
“I’ve learned to like myself.”

A cliche one-liner from the mouth of any other,  but I knew her words were formed by the kaleidoscope of purple bruises on her shin where she had collided with those dropped rocks. Her answer struck me like a knife. At that time (maybe even now), the thought of liking myself felt like a lonely dream. I remember this single moment as the one when I thought that we just might be able to be friends.
“Why?”

She responded slowly, quietly, so as to make it clear that the words she spoke next were important.
“Because if I don’t, how can anyone else?”

 

Summary of modern bone trauma analysis

*Edit 10/21/16: Fixed broken link to pdf, sorry. :C


tl;dr contents:

  • Material Properties of Bone
    • Classifying bone trauma by time of occurrence
  • Types of bone trauma
    • Ballistic
    • Blunt force
    • Sharp force
    • Thermal

I’m not gonna include a lot of pictures because this is a topic that not everyone will want to see images of. You can google stuff if you want to see examples, or read my final paper where everything is cited.

Material Properties of Bone

Bone is divided into two kinds of osseous material. Cortical bone is about 80% of the mass of the exoskeleton, and forms a hollow cylinder in which the cancellous bone resides. The main purpose of cortical is for structure, while cancellous bone is spongy interior that is responsible for nutrient storage and transport. 

A cross-section of a human femur, look at how cancellous bone is a lot less dense than the cortical bone.

A cross-section of a human femur, look at how cancellous bone is a lot less dense than the cortical bone.

Injuries to bone are classified based on when the injury occurs.

Ante-mortem trauma: Refers to trauma on the skeleton that occurs prior to the death of the individual. In-vivo bone exhibits healing, and edges of a fracture will be fairly smooth. As healing rates differ depending on the characteristics of the individual, the same injury may look different from case to case.

Peri-mortem trauma: Refers to trauma occurring around death. Fracture patterns observed in peri-mortem trauma can be similar to those seen in ante-mortem trauma, but have sharper edges since no healing will have occurred (in most cases). Patterns will show evidence of some terminal event, i.e fast collision with an object, but fracture edges will show characteristics of plastic deformation as the external fibers of the bone tissue begin to show micro-tears.

Post-mortem damage: Refers to damage occurring after death. Bone becomes brittle once it has dried out, and exhibits ceramic-like material properties. Fractures will be jagged and exhibit no healing, and may also be irregular. I.E: Fractures lack a common correlation to an event that caused the damage, such as those resulting from post-mortem bone shrinkage.

Types of Bone Trauma

Ballistic
Ballistic trauma on bone is usually the result of a bullet or an explosive, though this categorization may be applied to any fast traveling object that has collided with bone. Features that indicate possible ballistic trauma include the presence of a projectile that can be associated with bone, fracture patterns corresponding to a high velocity impact, or fragmentary foreign material found within the bone or the environment.

[Read more…]