bio

My first acceptance

So if you have been following me at all recently, my new music blog is taking all of my spare time right now. It's a labor of love, and things are just perfect right now. For the first time in my life I feel like I am making a very real, if small for now, difference in the lives of other musicians. And that makes me feel good. It's really nice to think that I might help someone connect with a song they wouldn't have heard otherwise, and help an artist connect with a fan they might not have found in some other way.

I started out just wanting to do playlists on Spotify, but I quickly realized that I really like writing about the songs I get. it occurred to me yesterday that as a poet, a decidedly non-academic one at that, it makes a lot of sense that I enjoy writing song reviews. The way I write them, it feels a bit like poetry, because music description is fraught with opportunity for metaphor. It just feels natural for me.

So I would like to announce that after 28 days of being a blogger for SubmitHub, I have been accepted into their "Really Good Bloggers" program (#RGB), which just means I get a star next to my name, I get to feel cool about it, and I make slightly more money.

Perhaps the first recognition I have ever had as a writer. They just put lil star next to your name.

And I get to do things like this: write a review that gets top listing, and help my artist climb the chart a bit. It's not much, but it's something.

 Top 3 listing of 8 blogs.

Top 3 listing of 8 blogs.

 If you are on the charts when your piece posts, I will vote for you.

If you are on the charts when your piece posts, I will vote for you.

And the best part is the thanks I get for the blogs I do. I feel more appreciated right now than I ever thought possible.

Thank you.

it is all about the Javascript

So there I was, on an interview with a cool company called Clevertech, with a pleasant lady named Rena, and the question of Javascript came up, and I mentioned that I saw basically most of their dev team was Javascript developers, and I said something like 'I guess they are doing a lot of front-end'... Not sure why I said that, knowing full well that we already live in a world where Javascript is taking over the back end, but you know sometimes things just come out, and I probably won't get that job anyway but at the end of the day I'm never sure which is which in terms of good vs. bad. Quite to the contrary - when I think I've done well, I've often done rather poorly, and when I think I messed up a bit that is often when I get an offer. But either way, JS is taking over the world, and unless I want to hang my hat on being a Rails dev forevermore (please, no?) -  then I had better get with the program. And now I am doing a little 'code project' for a prospective employer, and pardon my French but I love that shit, because no one ever says no once they see my code. I am a poet who writes code, and that means I care about every line.

So anyway I am working my way through a Node.js proof of concept, and seriously I am having more fun than I remember having in a long time (Node + Express + EJS). Coding is fun, anyone will tell you that, that is how we all get hooked; but if you keep your head down long enough you may forget it is art at the end of the day. I can't tell you how excited I am to get started on something new. I've got a lot more interviews coming up and it all just feels really good right now.

It is really strange to be back on the market, so to speak, it has been almost a decade now since I've been looking for full-time work. But I feel really ready right now for whatever comes my way. And I have until next Friday to deliver on a pretty simple POC in Node.js, and I'm telling you, that app is going to fart rainbows by the time I'm done with it. :)

the reverse interview

So after 20 years of doing this, I've learned a few things about the interviewing process. One of those things is the concept of a reverse interview.

For my example, I am going to use the interview I did for a company called Recurly (in San Francisco), they were based in the Mission near where we used to live and I was excited to finally get one of those 'warehouse' dev jobs, like I used to pine for in LA when I used to live east of Hollywood with my view of the downtown skyscrapers. So I get the interview, I talk to Scott, their lead dev, my prospective 'boss', and we hit it off like gangbusters. Seriously. I was super-excited to work for this guy.

And then he says, one last thing - we need our boss to sign off on you. He's going call you tomorrow. He's going to do an online 'code' interview. We'll call Scott's boss Steve. So Steve gets on the phone, hey how you doing, I am going to ask you how to code a binary tree, we need a left method and a right method and some sort of object. Pick a language. We were using a screen-sharing service, it might have been a shared google doc or something. I could type and he could see it. And I'm saying to myself, 'sweet! I just learned about data structures at Stanford - this is going to be easy'.

I had just finished a class about structures and algorithms at Stanford with Cynthia Lee, and although we used C++ for that I decided to write something with Ruby, because that's my go-to. And I decide to write an implementation using recursion, because had just finished that section with Cynthia and I was excited to show off.

ME: Ok, well the first thing we need is a base case.

STEVE: can you start with the left and right methods?

ME: OK...

and it all went downhill from there. Basically, if you don't understand recursion, it can't be explained to you in a few minutes. It's like the concept of limits - you need some time to wrap your brain around it. And it became clear that Steve did not really understand recursion, or worse yet, thought he did but hadn't put it into practice.

I did not get that job, and for a while I was angry because I really liked talking to Scott, but then I realized, that Steve guy is running the ship. And he was a mess. Put simply: he decided to veto a candidate that his own manager had already approved, based solely on his own limited understanding of Ruby, and recursion, and his inability to see his own limits (pun intended).

So that's what the reverse interview is - if you are not paying attention, as an interviewEE, to all of the details available to you in terms of what kind of culture exists at the company, then you are missing a huge opportunity to vet the organization before you are tied down. I believe great organizations are easy to spot - as are uneasy ones. Most of the time all we have to do open our eyes, and pay attention.

EDIT: I was shooting for something like this implementation but I didn't think to rope in the enumerable module.

it's the privacy

Very often, I promise myself that I will write more. I am a writer, after all. That's my qualification. Sure, I've been writing software for web apps since the invention of the internet, but my degree is in Creative Writing. Go figure. So I go round in circles, because I want to create things, and I want to SHARE, but I can't just talk candidly about the people in my life, because that is a violation of privacy, and I am a pretty private person. But I also don't want to write things that no one will read. And as far as I can tell, unless I want to be a 'real' writer, and start my first novel, I am stuck being a blogger, and bloggers live and die by page views. Plus, my life revolves around a 4 year old and a 1 year old, and I don't feel right posting lots of photos and talking about them online. So it's quite a waste of time. I don't really even want particularly to be a successful blogger - I just want to feel like I am writing.

So what is there to talk about? Two things, really. The last few weeks were spent vetting new BI platforms, and although Tableau Online and Mode Analytics were both close, it became pretty clear that the only option for us is to continue with Periscope. They look the best, and they make my life the easiest. Sold. So here is a good example - my proof of concept was basically to recreate part of the main dashboard, and see how easy that is.

So, in Periscope, for the first chart the query is this:

select sum(amount) day_total, sum(f1) count_of_items, f3 merchant, ds
from temp_ps 
where p_type='Periscope Retailer 180'
and [f2=partner]
and ds > DATE_FORMAT(CURRENT_DATE - INTERVAL 31 DAY, '%Y-%m-%d')
group by ds, f3
order by ds, sum(amount) desc

Now, Tableau won't even let you give it a query, it likes to sit on a whole table and you drag fields around until you are happy. Not how I like to work. But Mode, on the other hand, looked pretty good, until you realize that:

  1. there is no Top X functionality;
  2. If you want to do that yourself you have to: write the query yourself, and handle the the settings in Python

So just as an example, the query, compared to above, for 'rolling your own' top x query - in this case, top 20:

select * from 
 (
( select * from
(SELECT (@rownum:=@rownum + 1) AS myrank,
merchant,
total
FROM ( SELECT merchant,
SUM(day_total) AS total
FROM {{@dash1}}
WHERE partner = "Facebook"
GROUP BY 1
) AS merchants,
(SELECT @rownum := 0) r
ORDER BY total DESC) z
where myrank <= 20 ) x
right join 
(
select sum(amount) day_total, sum(f1) count_of_items, f3 merchant, ds, f2 partner
from temp_ps 
where p_type='Periscope Retailer 180'
and ds > DATE_FORMAT(CURRENT_DATE - INTERVAL 31 DAY, '%Y-%m-%d')
group by f2, ds, f3
order by ds, sum(amount) desc
) y on x.merchant = y.merchant )

which as you can see is brutal, mostly because MySQL has no native ranking function, but to be fair that is before you even handle the presentation using python.

So it just quickly becomes a mess. I love the level of control, but I also need a simple workflow, and for Periscope you just click the damn checkbox. Yes please.

So it is nice to feel like I put us in the right direction. I hope that we can work with Periscope for a long time.

The only other piece of news is that I will be going to Austin at the end of the year to record an album with my buddy Shawn Pander as producer. I am super excited. Seriously this is going to be a pretty big deal. This is the song list (album working title: 'Nothing Can Keep Us'):

Go My Way
Roll Easy
Seeing Stars
You Got Me Running
Never Say Goodbye
A Little Dying
There's Nothing Beneath This
Dernier Coup

Holy Crap It's March - or How I Made My Lenovo Flex 4 a Ruby Slave

I just have not been writing. I can’t believe it’s March. These last few months have flown by. We had a flood in the basement, which is stressing me out a bit, and I had to postpone doing my taxes this year because Wells Fargo screwed up my paperwork, so that’s a bummer.

And I spent a few weeks prepping my laptop for a trip to San Francisco, and we had to cancel because everyone got sick. But we are heading over this weekend instead, so that’s good.

I guess I’ve just had a lot on my mind. My friend Mike passed away sort of suddenly from cancer, and that is just a tough pill to swallow. I feel super guilty because the last time I saw him he had his guitar out behind The Hotel Cafe, and was playing the blues, I was there for Sally Jaye’s release for Amarillo, and I just felt like he was going to be there forever. And now that was 10 years ago and that is the last memory I have of him. So sad.

And after looking at our finances for last year, we really needed to pull in the belt a bit. So when I was looking at getting a new laptop, for the first time ever, really, I seriously considered getting a Windows laptop instead of a MacBook because the price differential is pretty much out of control.

I settled on a Lenovo Flex 4 / Yoga, which ran me just under $600. The cheapest MacBook with the same specs would have been close to triple that. I just couldn’t justify that expense.

I set it up in about 2 days, and now it is running a Rails 3.2 stack and it is a fully functional work laptop. It’s amazing how far things have come.

So if you want to do your Rails Development on a laptop that is not a Mac, perhaps this list of steps can help you a bit.

1 - Windows 10, or nothing. You need Windows 10, because it is the Anniversary Upgrade for Win 10 that introduced something called WSL (https://blogs.msdn.microsoft.com/wsl/) ‘Windows Subsystem for Linux’, and that is what makes this all possible.

2 - You cannot access localhost from WSL, but the ip 127.0.0.1 works just fine. And Windows properly can access localhost inside WSL. So it goes like this:

Database - lives in windows, accessed by WSL server via 127.0.0.1

Browser, lives in Windows (I use Chrome), accesses WSL server via localhost

server, runs in Ubuntu

Editor, lives in Windows, accesses linux docs w symlink 

3 - Apps. You might be worried about what apps are available, but it seems like a decent environment at this point. I love my Mac apps - Fetch, Sequel Pro, Textmate - but there are perfectly decent replacements available. And for any old Textmate people, like me, you might want to take a look at Atom. The auto-complete works really well and reminds me of my old Visual Studio days inside the Microsoft machine.

I use - 

Cmder (http://cmder.net)

Atom (https://atom.io)

mysql command line client for Windows (https://dev.mysql.com/downloads/installer/)

NOTE for MySQL - the 32-bit installer does indeed install a 64-bit version if you want. That was not documented at all that I could see, and if you are looking for a 64-bit installer you are not going to find one.

Sqlectron (https://sqlectron.github.io)

and I haven’t checked yet but I’m sure I can find a decent ftp tool.

I used this walkthrough as a reference.

and the last caveats are that, for ubuntu, only Rails 3.2 and 4.3 are available; and MySQL is only supported up to 5.6 (at least as of a few weeks ago).

All in all, I am very happy with my experience with Windows 10. It has been pretty great so far.

The steps (roughly):

1 - install WSL

2 - test out bash command, set up aliases

3 - follow rvm instructions for installing on linux (use stable version - https://rvm.io/rvm/install)

4 - rvm install Ruby

5 - gem update --system && gem update

6 - sudo apt install git

7 - gem install bundler

8 - symlink linux docs folder back to windows documents -  (ln -s /mnt/c/YOURUSERACCOUNT/Documents ~/Documents)

9 - set up new key gen (I used the GitHub link as reference: (https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/)

10 -start trying bundle install, use apt-get as needed

for example: sudo apt-get install mysql-client-core-5.6, sudo apt-get install ruby-railties-3.2, sudo apt-get install ruby-dev, sudo apt-get install build-essential g++, sudo apt-get install libmysqlclient-dev will all be necessary

11 - gem install mysql2 -v '0.4.5'

12 - gem install activerecord-mysql2-adapter

and then the occasional sudo apt-get upgrade should keep you running.

good luck!