Category Archives: Uncategorized

Artificial Intelligence and Machine Learning Resources for Developers (or anyone “technical”)

Artificial Intelligence is the single most important endeavor ever under taken by humanity. If you care to learn the technical side of this venture, I’ve put together a short-and-growing list of resources to look at for introductory learning and exploration purposes.

Please enjoy and suggest additions.


Artificial Intelligence (MIT 6.034)

from the course description:

“introduces students to the basic knowledge representation, problem solving, and learning methods of artificial intelligence. Upon completion of 6.034, students should be able to develop intelligent systems by assembling solutions to concrete computational problems”

Deep Learning for Self-Driving Cars

MIT 6.S094

from the intro:

“an introduction to the practice of deep learning through the applied theme of building a self-driving car. It is open to beginners and is designed for those who are new to machine learning, but it can also benefit advanced researchers in the field looking for a practical overview of deep learning methods and their application.”

Develop Your First Neural Network in Python With Keras Step-By-Step

Introduction to Neural Networks on the high-level ML platform Keras.

Fast.Ai

trying to make AI less “exclusive”. Practical courses and tutorials. Cool branding.

Gitxiv

from the about page:

“GitXiv is a space to share collaborative open computer science projects. Countless Github and arXiv links are floating around the web. Its hard to keep track of these gems. GitXiv attempts to solve this problem by offering a collaboratively curated feed of projects. Each project is conveniently presented as arXiv + Github + Links + Discussion.”

Machine Learning with Andrew Ng on Coursera

This is the definitive college-level course on Machine Learning. It has nearly 12,000 reviews. I’m working through it presently. Includes a great intro/refresher to linear algebra (that I needed).

Thanks to Stanford for providing the material.

Machine Learning is Fun!

The world’s easiest introduction to Machine Learning

There’s also a video course on Lynda.

Recurrent Neural Network Tutorial for Artists

from the post:

“This post is not meant to be a comprehensive overview of recurrent neural networks. It is intended for readers without any machine learning background. The goal is to show artists and designers how to use a pre-trained neural network to produce interactive digital works using simple Javascript and p5.js library.”

Simple Reinforcement Learning with Tensorflow

Introduction to practical application of Q-learning and neural networks using TensorFlow.

TensorFlow for Poets

How to build an image classifier in TensorFlow for poets.

Day 8: Oktoberfest and Fleeing Munich

This was just one of the eight or so large beer tents. They're all decorated differently.

This was just one of the eight or so large beer tents. They’re all decorated differently.

Oktoberfest is a three week festival. You start drinking beer by the liter at noon and you don’t stop until… well, actually, that’s unclear.

I attended this festivities on Saturday. It was raining but many people still went to der Wiesn early on Saturday morning. I had made friends with a Naval Police Officer from California who is currently living in Spain. We went together and found seats at a medium sized tent called Zum Stiftl.

Making new friends at the Zum Stiftl tent at Oktoberfest 2016.

Making new friends at the Zum Stiftl tent at Oktoberfest 2016.

In total I spent about €100 on food, drink, and entertainment on Day One. Oktoberfest is a massive festival with many delicious treats to try and carnival rides to jump on. So, you could spend a little less or a lot more.

I was supposed to be in München for 7 days and go to Oktoberfest for two of them. Unfortunately on the Friday before Oktoberfest started, it began to rain a lot.

I was staying at a wonderful campground called The Tent. The Tent is a cheap hostel and campground where you can camp for €99  for a whole week. There was only three problems:

  1. The Tent is extremely busy during Oktoberfest. My inner introvert was screaming for alone time by Sunday morning.
  2. The rain didn’t let up by Sunday morning and it negatively impacted everyone’s mood.
  3. Everybody was drunk and or hungover by Sunday morning. This further darkened the mood.

For these reasons. I decided not to attend Oktoberfest on Sunday. Furthermore, I had a good friend in Utrecht invite me to stay at their place.

I got a refund on my last two nights at The Tent (€28, thanks!) and bought a bus ticket to Utrecht.

I arrived in the Netherlands early Monday morning, and was glad to be greeted with clear weather:

There is water everywhere.

There is water everywhere.

 

Primer’s browser tab notification UI got me to opt in

If I had a list of top ten blogs for startup entrepreneurs, First Round Review would be near the top. They caught my eye with an article on designing mobile apps for explosive growth featuring Kamo AsatryanOf course I had to check out his latest project so I navigate over to http://goprimer.com

I’m met with a…

Primer-landing-page
primer-notification

 

Here’s a closer look at the tab:

primer-notification-closeup

First of all, I was so impressed by this conversion tactic that I immediately went back to the page and signed up. Sure, I probably would have signed up anyway given the fact that I help startups build apps for a living. But maybe not? It’s certainly not uncommon for me to just kill every tab for sake of killing tabs. This little UI feature reminded me that this tab is important.

Now, I’m on Primer’s wait list and I sent the product to several of my colleagues. All because of a red dot on a browser tab.

Good job Primer 😀

 

My Idea of Fun on a Friday Night is Writing this Blog Post

I wrote the following on a Friday night in March of this year:

There is a live band playing in the ballroom.

The Beacon Hill Friend’s House is a Beacon Hill mansion that houses a diverse community of twenty adults. I eat, sleep, and commune here when I’m not working at Pavlok(which is, by the way, not often because these things are shipping in May!).

I’m actually a little bit wiped out from work. Writing is how I decompress from a day of writing software and talking to customers.

Introverted as I’m feeling tonight, I can hear the music from my room and it sounds wonderful.

Funny how a few notes scrawled before bed at night can tell you a lot about a person, especially in the context of other records.

According to my timesheets, I worked on Pavlok 175 hours in March. That’s a lot of if you consider full-time is 160 hours, I took off sick one day, and was home visiting family for two days as well. The next month, I worked a record high 272 hours. Then I fell back down to 171 last month. The first two weeks of June have been a light 40 hours weeks. There haven’t been any fires.

Why am I paying such close attention to my working hours? Why am I writing about it here?

I believe that doing excellent work requires good work/life balance.

In the last two weeks, I’ve picked up sailing and will be spending my Saturday on the Charles River. I’ve spent time in the sun, enjoyed Boston’s beautiful parks and public spaces. I’ve listened to 90% of Nassim Nicholas Taleb‘s Antifragile and am burning through 100 Years of Solitude by Gabriel Garcia Marquez.

On Tuesday, I go to Huatusco Mexico to teach sustainable agriculture with a mentor. While I’m there, I’ll contribute to the Pavlok product remotely. It’ll go smoothly because Pavlok’s software operations have been crafted with an eye for adaptable self-improvement (or as Taleb says: antifragility).

When I return, the team will have learned from my absence. We will have become more versatile, more adaptive to unpredictable changes.

Every now and then, an organism has to struggle to thrive. Some months we’ll crack a couple hundred hours. That’s ok, the job has to get done and 50 hours a week isn’t going to kill us.

Today, there was another concert at the Beacon Hill Friend’s House. I missed it because I was at the office, doing one-on-ones with my team and coding. That’s ok.

Pavlok’s mission is important and deserves at least 1/3 of my waking life. The non-profits I work for (B.H.F.H., Resilient Coders, fsharex, etc) also have important missions and should command the attention of another 1/3 of my waking life. Finally, my own health and wellbeing is important, and deserves the final third.

This is why I’ve resorted to such measures as giving up a cellphone or only checking email once per week.

I want balance for my team and I want it for my clients and hope to lead by example. Achieving that balance is very much within the reach of most young professionals. I would urge all my peers to join companies and organizations that help you advance your life purpose. Don’t waste a single moment on something insubstantial or impersonal.

I’m always looking for a good cause. For-profit or non-profit, if you think you bring great value to the world, email me.

Bad Habits: How to Quit Cowboy Coding using Pre-commitment

One of the core principles of habit modification is pre-commitment: Success is more likely if you plan for it.

Remember elementary school? My mother would pack my bag the night before school, when there was no hurry. This allowed me to walk out the door in the morning without forgetting anything in a hurried bustle.

Today,  pack my bag before I go to bed. This serves two functions:

  1. I go to work prepared, consistently.
  2. It’s a fixed moment in time after which I cannot attend to work concerns.

Today, I’m learning to apply these principles to Pavlok’s development sprints.

I have had a bad habit of cowboy coding features in the interest of saving time. I’ve been working on this habit more than a year now and I think I’ve hit the tipping point.

Here’s what worked:

A Recovering Cowboy Coding Addict

I spend some time on Sundays planning out my week. I know I will spend Monday prepping for the week’s sprint.

This means putting our stories into trello cards and writing SAFE tests.

The user stories are quick-n-dirty Trello cards that become more detailed as more information becomes available. Pavlok is a lean start up, so we have to ship features every week.

I spend mornings heads down. This morning (Monday), I’ve moved three cards into the “Current” column on Trello. We have five columns: Icebox, Backlog, Current, Doing, Done.

These are pretty self-explanatory. Right now I have about a dozen trello boards with those five columns. In this newest board. I have 0 cards ice boxed, 4 cards backlogged, 2 cards in my current sprint, and one card that I’m working on now.

This morning I am writing SAFE tests for all of the cards in my current an doing columns.

SAFE tests are integration tests that cover the ideal user experience, what some people call the happy path. This idea is adapted from a talk I saw at BostonRB by Justin Searls.

Today if I have time, I will flesh those tests out to include some exceptions and edge cases. I will write as many as I can, then go into feature development tomorrow no matter what.

This plan depends on limiting the amount of time I dedicate tests, but STILL DEDICATING TIME.

At Pavlok we alternate weekly design and development sprints. Like I said, we’re lean. So realistically this dedicates two days a month to writing tests. That’s 10% of my time coding.

Our design sprint process is borrowed/adapted from Google Ventures.

In order to achieve a desired result, you need to build the output mechanism into your existing institutional routines.

How else do we use pre-commitment and planning to undermine our bad habits?

Coming Next Week:

How I convinced my boss to buy the whole team bells and whistles.

Good Habits: Making Your Bed

madebed

Honestly, this is one I’m horrible at. I want to write about it today because I just picked it up and a particular effect is stuck in my mind.

This morning, somewhat accidentally, I made my bed. I don’t normally make my bed. It is not a habit I was actively trying to build. I just did it.

It didn’t interrupt my morning routine. I did my morning pages and had my green tea. I’ve been intermittently fasting, so there was no breakfast.

After my tea, I made my bed. I didn’t try too hard. I just threw it together. It took all of fifteen seconds.

Now, it’s 4:45 pm. I just returned from work and was pleasantly surprised by my made bed. I didn’t expect my bed to be made. It normally isn’t. But today it was. Like I left it in someone else’s hands.

I recently got out of a relationship that involved loving acts like making the bed. Maybe I took it for granted. Today, I had the experience of giving that act of love to myself.

Maybe we have to know how to really love ourselves before we can know how to love others. Somehow this tiny step is going to change my life. Love yourself now, right in this moment. And love yourself in the future.

Think about the habits you do in the morning as little gifts you give to yourself later in the day. If you write in the morning, your afternoon-writer feels good about himself. If you code in morning, your afternoon-coder feels good about himself.

If you make your bed in the morning, your tired and willpower-depleted self will feel a little loved at the end of a hard day.

That’s a good thing. That’s a good habit.

Peace,

Justus

Sleep Wars: A New Hope

Over the years I’ve struggled with falling asleep at night. I used to lie awake for hours with my brain chugging away a mile a minute. I would sleep 3-4 hours a night and nap during the day. It was an unhealthy existence.

I’d like to say there was a single thing that fixed my insomnia, but there wasn’t. It took many lead bullets to take down the beast and I’m constantly refining my formula.

Today, I usually get to sleep before midnight and usually get between 8 and 9 hours of sleep per night.

That’s great, my productivity and health have been immensely improved. I have won the battle against insomnia.

Unfortunately, the war for excellence wages on. One side-effect of my lengthy sleep habit is a tendency to wake up late. This is no good for someone who is most efficient in the morning.

I’ve decided that waking up earlier is a priority for me, so I’m participating in a challenge:

Every night I will set my alarm for 6 am (I normally sleep without an alarm, wake between 8 and 9). Every morning I will write down the time I turn off my alarm.

Afterwards, I can go back to sleep if I like, or I can begin my morning routine.

Sunday was day one. I woke up, wrote the time (6:06) and went right back to sleep.

Monday, I woke up, wrote the time (6:11) and meditated for almost an hour. Then I went back to sleep.

Today, I woke up, wrote the time (6:00am exactly) and I conducted my entire morning routine. That means meditation and a protein shake. I even finished some laundry and was at my office before 7:30.

To be honest, I almost failed today’s challenge.

When I woke, my journal was in a different part of the house. I was totally wiped from yesterday, and it was still dark. I actually turned off my alarm and lie in bed for a moment debating (groggily) whether or not to wake up

Luckily, I had a little personal coach to jolt me into action.

My Pavlok Beta prototype was right next to my bed. So when I laid back down after checking (but not writing) the time, I was able to self administer a few shocks.

The experience was incredible. We’ve all conducted the timeless internal negotiation: To snooze or not to snooze? This time, my Pavlok device negotiated on my behalf: “If you don’t get out of bed, you’re just gonna keep shocking yourself until you do.”

It didn’t take long for me to make a decision. I got out of bed, found my journal, wrote down the time I woke up and settled into a blissful meditation.

Everyday we’re finding new uses for micro-aversion therapy. I’ve used it to quit wasting time on social media, beer, and now I’m using it to wake up on time.

We’ve helped users quit life-long addictions like smoking cigarettes and pick up (hopefully) life-long hobbies like painting. Our CEO is using the device to hack his dietary habits and even keep his apartment cleaner.

And these examples are only the beginning. I can’t wait to see all the uses people find for this elegant little device.

I hope you’ll be one of them. Preorder a Pavlok today 🙂

Adding a Contact to Infusionsoft in a Ruby on Rails App ( or: Why I’ll Never do Business with “Confusionsoft” Again)

Infusionsoft is a popular CRM and that is unfortunate.

I had a specification that required new user’s emails to get sent to an Infusionsoft list.

This appears to be a relatively easy task, right? They even have a Ruby gem, which I added to my Gemfile:

gem 'infusionsoft'

Then I performed the required config:

# Added to your config\initializers file
Infusionsoft.configure do |config|
  config.api_url = ENV['INFUSIONSOFT_URL'] # example infused.infusionsoft.com
  config.api_key = ENV['INFUSIONSOFT_API_KEY']
  config.api_logger = Logger.new("#{Rails.root}/log/infusionsoft_api.log") # optional logger file
end

And to test, I ran the recommended scripts in my rails console:

# Add a new Contact
Infusionsoft.contact_add({:FirstName => 'first_name', :LastName => 'last_name', :Email => 'test@test.com'})

No dice. I get this error:

SocketError: getaddrinfo: nodename nor servname provided, or not known
from /Users/Justus/.rbenv/versions/2.1.2/lib/ruby/2.1.0/net/http.rb:879:in `initialize'

Hmm. I wonder why? I do a bit of research. Let’s check the API docs for infusionsoft:

Infusionsoft API Getting Started Documentation

 

Hmm. The ruby gem’s documentation make’s no mention of client_id or redirect_uri. Maybe they mean API key?

I continue digging and find that Infusionsoft has a “developer portal” that requires a separate registration. Maybe I’ll get what I need from there…

Nope. I register my application and receive an “application key” and a “secret”.

What is a secret? Nobody’s mentioned a secret. Why do I need a separate account to use the API? Will be able to access my original account’s campaign and how?

I have a lot of questions, so I call Infusionsoft’s technical support:

“Hi Infusionsoft, I’d like to speak with someone about integrating your API with an existing Rails App.”

“Please hold.”*

*intolerably long hold*

“I’m sorry sir, we don’t have technical support services, please checkout our community forum for assistance with the API.”

Oh, ok then.

Let’s talk about their community forums.

I register for an account. I confirm my email…

I should be able to create a thread, no?

No.

I have to wait for a moderator to confirm my registration.

Fast-forward 24 hours.

I have a deadline and need to get this card completed. My forum registration is still restricted. StackOverflow and GitHub issues have yielded no useful responses.

I make a simple email form in the infusionsoft campaign builder and examine the HTML it provides:

Webform” />

Email *

Time for a hack.

Let’s dissect this HTML. We have form data being passed via POST request. Here are the pertinent key- value pairs:

inf_form_xid : SUPER_SECRET_NUMBER

inf_form_name : ‘Webform’

infusionsoft_version : ‘1.34.0.35’

inf_field_Email : “#{user.email}”

Ah now we’re getting somewhere. I test the POST request in Postman and receive HTML responses. If the email is invalid or a duplicate, the response is a form with error alerts. I already validate those in the rails app so I shouldn’t have to worry.

I use HTTParty to facilitate the request in a Rails service object called AddContactToInfusionsoft.rb

class AddContactToInfusionsoft
 def self.call(user)
   HTTParty.post("https://ns166.infusionsoft.com/app/form/process/961b755cc1de68e2d549824cf11890d5",
     query: 
     {
       inf_form_xid: '961b755cc1de68e2d549824cf11890d5',
       inf_form_name: 'Webform in Content App',
       infusionsoft_version: '1.34.0.35',
       inf_field_Email: '#{user.email}'
     }
   )
 end
end

I test the code in my rails console and it works fine. Push it and you should be all set.

*Paraphrasing obviously.

Will Auto Suggest Change the Way We Speak?

Tonight I was text messaging my girlfriend on an iOS device using SwiftKey. The autosuggestion mechanism was smart enough to predict simple phrases like: “I just got home” or “I’ll talk to you later”.

I thought: I can get used to this.

Then I thought about what life would be like if I always accepted the suggested message.

What if I had been intending to write: “I just got back” instead?

What if autosuggestion convinced enough people to specify “home” over “back”? Apple has an enormous user-base. Constantly altering their lexicon would certainly have an impact on popular communication and the larger english-speaking world.

What if auto-suggest recommended “tomorrow” over “later”? If you accidentally accept the additional specificity then in a sense you commit to it. Are we legally responsible for auto-correct? Some people text rapidly and are quick to hit the send button. There are innumerable examples of people sending ridiculous messages thanks to auto-correct.

I think intelligent language-learning interfaces are the future of technology.

And just like any other advancement in technology, there will be unintended consequences. Auto suggestion is only the beginning.

In the future you will dictate to smart transcribers which remove your ineloquent “uhs” and “likes” and channel your message to the other party, or onto paper.

Have you tried the voice-to-text feature on your phone lately? It’s only a matter of time before that technology is accounting for your regional dialect.

It might be happening already.

We’re in a renaissance of User Experience. Wearable technology is enabling interactional innovation and data collection unlike anything attempted before. Computing power isn’t going anywhere but our auditory and visual recognition capabilities are constantly growing. Trends in machine learning are only empowering these trends.

There is open source technology in voice recognition (CMU Sphinx, with a Ruby wrapper, just out this month!!!), open source facial recognition, and open source pattern recognition. A Boston start up called Indico is making Machine Learning Environments that could empower developers all over the world.

These are tools that anybody can pick up and start building off of.

I can’t wait to see what happens next.