Behind the Scenes

Going to need a bigger boat.

Posted on

I was planning to do a follow-up post with my list of projects from Evernote. That would be easier said than done. The attached image shows some, but not all of my lists. Instead of overwhelming you with all of this nonsense. I’m going to dig in on my own and pick a few to expand on. Also, there are probably quite a few items on here that aren’t even going to make sense to me. This will be a good culling exercise.

In the meantime, I was trying to come up with a Python script for playing Spider Solitaire. I play on my iPad and I’m usually pretty good at solving the puzzles (up to three suits). When I get stuck, though, it really feels like I’m spinning my wheels. I don’t know if I want to calculate the probability of a given move being useful, or maybe just keep track of the choices I’ve made so I don’t make the same ones again? Or maybe this isn’t a problem that lends itself to Python. I’m sure I can find something better to do.

Behind the Scenes

Relaunch, Step 1

Posted on

Hi, all. Last week, I started working through the book Relaunch You, by Catherine Morgan. I’m trying very hard to make my job search work and a big part of that is figuring out what I really want and focusing on it. I brainstormed on the first set of questions and, here, I’m going to flesh out my scribbled down notes. With some screen grabs from TinyKittensHQ thrown in for interest.

Grandpa Mason and kittens

Question 1: What did you like doing in the past?

These questions are all tricky for me. When I’m doing things, I don’t tend to think about them. Every now and then, however, something will jump out at me. Like, I’ve noticed that I can spend a lot of time working on fussy little details, whether it’s cleaning up keyframes in an animation or reconciling data in an accounting spreadsheet. These are things that should be boring and tedious but, for me, they push the same buttons as playing solitaire or doing a sudoku. And I like those sort of puzzle games. (Cryptic crosswords are my favorite.)

I like making order from chaos. Arranging things into like groups; smoothing raw edges, that sort of thing. (And yet, somehow this doesn’t translate into a tidy apartment.)

I like visible results. I knit as a hobby and I love seeing a simple progression of stitches turn into a beautiful lace scarf. Or seeing some patches of graphite suddenly render a three dimensional form. (I also draw as a hobby.) I find it challenging to work on things like error-checking, where – unless you find problems – your work looks the same when you’re done as it did when you started. On a similar note, I like feedback. Maybe that reveals my insecurity, but I’m trying to include everything here. When I say feedback, I don’t even mean praise, so much as reassurance – being openly praised actually makes me uncomfortable.

My favorite kind of feedback is getting a laugh. I enjoy laughing, but making other people laugh is a thrill like nothing else. But it has to happen organically. I can’t be funny on demand.

I like to learn. The less relevant, the better. As I type this entry, I’m listening to a group of scholars discuss ancient Persia. My grades in college were okay for classes in my major, but excellent for all my electives.

I like coming up with ideas and making plans. There are half a dozen “ideas” lists in my Evernote files. Knitting ideas, data viz ideas, “million dollar” project ideas, and even ideas for books and movies – I’m not a writer. If anything, I have too many ideas. The plan is for that to be the next big blog post, actually. Take a closer look at some of my idea lists and see which would make a good coding project.

Kittens can climb!

Question 2: What would you change?

What would I change? About what, book? My past jobs? My self? The world?

Something I definitely ran into in my actuarial jobs, and I see a lot of it in coding culture now, is people being very into the tools. I don’t know why this is such a barrier for me. In the past, I suspect it was because deep down I disliked being an actuary and wanted to minimize the amount of mental energy I gave to it. Now, I think it’s because it reminds me of the actuarial world and also because – let’s face it – it makes me feel stupid. There’s so much to learn and I try to join these Meetup groups and Slack chats to get more exposure, but I come away feeling like I’ll never know enough. And, I’ve started to realize, running down all those rabbit holes is keeping me from making actual progress. Now I just add them all to a list and I’ll learn them when I learn them.

Another thing I’d change from my old jobs is a tendency to have arbitrary and inconsistently applied rules. A great way to help favored employees succeed is to let them let them know which rules could be ignored. When less-favored employees eventually learned the shortcuts, they’d be punished for breaking the rules – pointing out that your peers were doing it too would only make you look childish. [The urge to delete this paragraph is so strong.]

One big thing I’m trying to change about myself is to be more willing to make mistakes. I have a tendency to hold back and wait for a “grownup” to tell me what to do. It ties in with that need for feedback I mentioned above. I hold back because I don’t trust myself not to break or ruin something. It wastes time and it makes me look like I don’t know what I’m doing. It’s why it’s taken me so long to learn to code. The language part is easy. The obstacle has been setting up the infrastructure; installing things and connecting things and all that tinkering under the hood, software-wise.

The biggest thing I’d change about the job market is the whole way we do salaries. The secretive, adversarial process that makes nobody happy. Why should you be paid based on how good you are at negotiating instead of how good you are at your actual job? Why is it taboo to talk about? I’m very glad that there are sites like Glassdoor that make that information public, but it’s only a start.

All together

Question 3: What have you always wanted to try?

And the questions get harder and harder. I don’t have a lot of wants; I’ve always considered myself a fairly complacent person. [Says the woman who threw away over a dozen years of hard work to start her life over with no plan. I guess I save my discontent up for a grand gesture?]

I would like to work in a “cool” office, like the ones I see at some of these Meetups I go to. I’ve always liked offices. As a kid, I used to look through office supply catalogs and want a reason to use all of the stamps and hole punches and colorful hanging folders. I still get a kick out of having the right tool for the job. [Wait! Wasn’t I complaining half a page ago about the people who are too into the tools??? I contain multitudes.]

Aiming a little higher, I’d love to be an anonymous benefactor. But crazy stuff, like paying a crew to sneak out at night and fix potholes. And mundane things too. Buying a round of drinks for the whole bar. That’d be great. I guess that’s more of a “bucket list” item, which is the next question.

A realistic thing I’ve always wanted to try is creating educational content. That’s a thing I can do; I just have to pick a thing and focus. I’d like to tie this in with the coding and the data visualization, but I know that facts and data don’t always change minds. [Hmmm. Add that to my list of reservations about pursuing data science. Oh, did I not mention I have reservations? That’s part of why I’m doing this exercise.]

Nap time!

Question 4: What is on your bucket list that you’ve been meaning to do?

I’m not sure this isn’t the same question as the last one. (In the book, these four questions were in a paragraph. The numbering is mine.) As I mentioned way back in Q1, I have a lot of ideas saved in Evernote docs. And I plan to write more about them in the coming days. Those are my bucket lists. That, and buying a round of drinks for the whole bar. Maybe I’ll do that when all of this introspection leads me to a great new job. Cheers!

Behind the Scenes

New Project: Conversational Python

Posted on

As I’m trying to learn Python, I try to go to coding Meetups and other events. When I go, however, I’m hit with so many things that I don’t understand that people are discussing so casually. It makes me feel like I’ll never get there. Meanwhile, the coding books and tutorials move so slowly and helpfully through the fundamentals that I fear the two will never meet up.
For that reason, I’m making a point of writing down and looking into any concept that I don’t get. The plan is to build an e-learning module to go along with a code-learning plan, but it’s also for me.

My first real attempt was today. I listened to the first half of Talk Python to Me Ep. #153 with Nick Coghlan. Every time I started to get lost, I paused the feed and wrote down what I didn’t understand. Often phonetically.

The following partial glossary is just from the first half of the podcast. Maybe I will get to the rest tomorrow.

My messy notes

PEP: Python Enhancement Protocol

wire protocol structure using destruct(?) module to construct messages to send them back and forth.

ordinary squelchers don’t work in HF. Have to do signal analysis to detect voice.
Squelcher: An electric circuit that cuts off a radio receiver when the signal is too weak for reception of anything but noise.

C Programming for the DSP but we didn’t have a proper test harness; just a C application
DSP: Digital Signal Processing

next level of integration testing

control and orchestration language

Python unit test module

I-fall(?) [extreme programming; test driven development]

It’s Dave Beazley’s fault… SWIG existed. C++ driver ran on host. Used to talk to DSPs.
SWIG: a tool for building C/C++ extensions to Python.

Wrote one .i file for SWIG to wrap the production driver

Can express more simply in Python code than in production code. Tests in Python express your intent, then it doesn’t matter what your production code is.

Open source supply chain managment

Anything it didn’t do, I just added a library. Doing a lot with CORBA distributed communication protocol.

request brokers: In distributed computing, an object request broker (ORB) is a middleware which allows program calls to be made from one computer to another via a computer network, providing location transparency through remote procedure calls.

Used for test automation, hardware simulators, web app dev dating from the CGI days – which is actually how we wrote the original distributed system orchestration. Which you now mostly see in things like Ansible and Salt and Python wrappers around Docker and Kubernetes.

Micro controller code where your Python program almost is the operating system – wire your lambda expressions directly to hardware interrupts.

Origins in ABC research language (to teach people to think computationally). Base layer of imperative procedural programming (how humans think; doesn’t scale)

privileged access

interpreter can do things that ordinary python code can’t.

syntactic sugar – make sure there’s a procedural equivalent

Web frameworks, gui libraries, scientific stacks

Ansible: Python had been part of Linux distributions almost from the beginning. So sys admins started doing admin scripting.

Procedural model; move to declarative model further up the stack

random forest

deep learning

sql alchemy (watch talks about its design)

In computer architecture, cache coherence is the uniformity of shared resource data that ends up stored in multiple local caches.

Tcl/Tk: Tcl is the short form for ‘Tool Command Language’ and Tcl Tk is the term used for referring to the toolkit available for this programming language.

GNOME: a desktop environment composed of free and open-source software that runs on Linux and most BSD derivatives

AIX (Advanced Interactive eXecutive, pronounced /ˌeɪaɪˈɛks/[3]) is a series of proprietary Unix operating systems developed and sold by IBM for several of its computer platforms.



IDLE (in standard library)

QT as a C++ wrapper tried to use native widgets when it could

GTK emerging as way Linux distros would do desktop

Microsoft Foundation Class Library (MFC) is a C++ object-oriented library for developing desktop applications for Windows.

WX Python, WX Widgets, PY QT

Unresolved fight between QT and GTK on Linux

GTK’s efforts to support anything cross-platform isn’t really a thing. Linux/Unix equivalent of Win32 API. Not really cross-platform because it doesn’t delegate to platform-native stuff when you’re running someplace other than Linux. And that (native widgets) is what it takes to make your app look like it belongs.

(tuned out for a bit here)

Android on Dalvik layer (of Linux)… Java Runtime?

Electron JS, Cordova, Ionic, all the other frameworks

Phoenix Project, WX Python 4.0.

(halfway through at this point and enough to be going on with)


Behind the Scenes

Shawl Math

Posted on

I had a phone call with a potential employer the other day and I found myself trying to explain one of the ways that I use my mathematical and forecasting skills in a situation where someone else might not recognize the opportunity. They make perfect sense in my head, but sound a little bit rambling when I try to explain them. Putting these instances in writing, with examples and diagrams, can only help. The example that came up on the phone was from my time with Mochimochi Land, and I’ll cover that in a future post. Today, I’ll stick to something more current.

I recently started knitting the Nurmilintu shawl out of some beautiful gradient yarn. The wedge shaped shawl alternates between solid garter stitch and panels of lace. When I finished the first garter section, I still had quite a bit of yarn left. In general, that’s a good thing, as it’s better to have too much yarn than not enough. In this case, however, failing to use all of the yarn would mean not using what I considered to be the prettiest color at the end of the gradient. So, last night, after finishing the first section, I stopped, weighed my yarn, and made adjustments using a Google spreadsheet. (I miss Microsoft Excel, but can’t justify the expense.)

The first step was to count the stitches in the shawl. It starts with a cast-on of four stitches. On odd rows, there’s an increase at the beginning of the row and a decrease at the end. The stitch count doesn’t change. On even rows, there’s only the increase at the end of the row and the stitch count increases by one. So, every pair of rows, the stitch count increases by one. The instructions are to repeat these rows until there are 79 stitches. 75 repeats (150 rows) will accomplish this. Using the geometric formula for the area of a trapezoid, the total number of stitches is:

(150 rows) * (4 stitches + 79 stitches) / 2 = 6,225

Making the same calculations for each section, I ended up with a total of 20,720 stitches. So, the first section of the shawl represents 30% of the stitches. Weighing what was left of my 100g skein of yarn, I found that it was only 25% used up.

My first thought was to add an additional section, as suggested by the pattern. I was able to try this out on paper. Each garter section after the first is 36 rows long (+18 stitches) and each lace section is 18 rows (+9 stitches). This would increase the total to 29,225 stitches and that would mean that I was only 21% through the pattern with 25% of my yarn gone. So, not an option. Instead, it made sense to increase each section.

If my first section (6,225 stitches) took 25g of yarn, then 100g of yarn should get me 24,900 stitches. I set my calculations up in a spreadsheet, multiplying each row length by the same factor and then adjusting that number to get close to 24,900.

  • First of all, I added two more rows at the end to account for binding off the stitches. Three might make more sense, as it’s important to bind off a lace project very loosely.
  • Secondly, while the garter sections can be any length, the lace sections need to follow a chart. This limits them to a repeat of six rows.

If I needed these calculations to be more robust – for example if this blog post results in a lot of knitters asking me to make custom pattern adjustments – I would set this up with a bit of code and/or formulas. As I only needed this answer once, the sheet is set up to require a little trial and error on my part to get to the optimal number. Once I knew that the adjustment would be small, I hard-coded the number of lace rows at 18 and then recalculated the adjustment for the garter rows only. When I was happy with the closeness of my number, I replaced the calculated row counts with the next-lowest even integer.

It’s also important to remember that knitting is pretty variable in practice and the amount of yarn I’m using can vary. For this reason, I tried to keep the estimated stitch total well under 24,900. I also calculated how much yarn should be left in the skein at the end of each garter section. That way, I can check and adjust my estimates as the project continues, and I’ll be more likely to succeed in using all of the blue yarn without running out.

Behind the Scenes

Fun with Images

Posted on

My friend Rachel recently set a new personal record for weightlifting – and her husband asked me to commemorate it by Warhol-ing up this photo of her from the competition:

File Apr 02, 10 13 47 PMI looked into some tutorials online, but I wasn’t really impressed by any of them. Mainly, the problem was that they were trying to replicate the iconic Marilyn Monroe print with the 2×2 grid of garishly colored portraits. This picture is asking to be Elvis. Beyond that, a lot of the tutorial images just didn’t look that great. They seemed to lack subtlety.

Another obstacle I had to face is that my friend is wearing a black t-shirt and leggings with a high contrast pattern. After isolating the image, and adding some contrast filters, I made masked layers to specifically lighten the t-shirt and the leggings. I did one for her hair as well. To get the rough lithograph look, I added a Vintage Halftone texture from Creative Market. I selected the colors from the Warhol original and painted them on a multiply layer. This came out darker and more muted than the original, so I added a second, low-opacity version of the colors in Normal mode. In retrospect, adjusting the levels on the existing paint layer would have made more sense, but I was sort of making things up as I went.

Because my levels adjustment had to contend with Rachel’s contrast clothes, the shadows didn’t really pop as much as I’d have liked. I added another layer of Halftone texture and masked it out, painting the shadows back in.

All in all, I’m very happy with how it turned out:


Behind the Scenes

Pata Noir

Posted on

Have you checked out the PataNoir app yet? More importantly, have you watched the accompanying music video? My very good friend William Steffey wrote the song and he and I made the video together.  As of this posting, 1,500 people have watched it. No great shakes by internet standards, but it makes me happy to know so many people are seeing and enjoying my work.

Set dressingI’m especially proud of this piece because of the shoestring budget we made it on. We splurged on a green screen and some stock video and shot the whole thing in our apartment.

Yeah, we have a lot of vintage props lying around.

There’s not a lot of animation in the video. I made some scene transitions with bursts of letters as a nod to the text heavy nature of the PataNoir app.

My main contribution to the video was keying the green screen out of the footage. Here’s a little making-of video for one of the shots.  (That’s Tim Koelling, of Boolean Knife, on the saxophone.)


Behind the Scenes

Moving On

Posted on

At the end of this week, the great yarn dyeing experiment comes to an end. After an exhausting four and a half months, I’m leaving Lorna’s Laces. Trying to maintain a freelance career on nights and weekends became too much for me.

I learned an important lesson about myself dyeing yarn. Even though I was completely ill-suited to the work, I still did a good job. I need to remember this and not sell myself short going forward.
And as for my future plans? Building my skills and looking for more work doing the things I’m really good at!

Behind the Scenes

Back to the Drawing Board

Posted on

This was on the first try!I really should be sketching every day and I have not been.  Today, though, I was inspired to draw my friend Christina so that I could make a cute post about her.  I tried not to over think it and just draw.  I’m really pleased with how it turned out.  It’s not a perfect likeness, but – to me at least – it’s clearly the person it’s meant to be.

I brought it into Photoshop and traced it to a line drawing.  That part was harder than I thought it would be.  I definitely need more practice drawing with my Wacom tablet.  The traced drawing lost a bit of the energy of the original, but I was able to get something I could work with.

And here’s the final product:

I hope she finds this funny.


Behind the Scenes

Clean Slate

Posted on

I spent the long Labor Day weekend going through boxes of paperwork – mostly stuff from my time at the Illinois Institute of Art. Most of what’s in there has gone straight to the recycling bin. In a lot of cases, I’ve captured some of the notes on my phone before tossing the page – either because there was something useful or something completely incomprehensible.

A small sampling of my random notes!

I’m learning a few things about myself from going through these notes. First of all, I’m a really sloppy note taker! I don’t make a lot of distinction between one-time scratch pad calculations, important observations, and things to follow up on later. I guess I assume that everything will make sense later, but really I’m just making a lot of work for myself.

The more important thing I’m learning is that I have a tendency to take on overly ambitious projects. I often feel like I left school with not a lot to show for myself and now I see that this is why. Instead of taking two or three ideas to 100%, I have a dozen things ranging from 50 to 80% done.

As this blog continues, I plan to revisit these projects and look at what worked and what didn’t and what I can do better in the future.