The Internet I wish we had: Making Toast

“Why is the light in the refrigerator purple? It looks like I’m making a breakfast for zombies!”

I grab the makings for a mushroom cheddar omelet. We’re running low on butter.  I say “Ok refrigerator” and then wait.. its display shows it’s thinking about what I said and then beeps an error tone at me. It writes out “unrecognized command”. This time I hit the listen button and say, “We’re running low on butter.” It shoots back, “Salted or unsalted?”, “Salted” I say. It beeps happily having understood that I want butter added to my shopping todo list. I hit the settings button, and follow the menus to “light”, “color” and set it back to “natural full spectrum”. The food glows a healthily once again.

I start cooking while my family runs around getting ready for work and school. I put the kettle on the stove for tea, I leave the frying pan heating up, put the toast in the toaster. A usual weekday morning. As the eggs are starting to firm, up the toaster in a loud shrill voice beeps three times that it’s done. It waits a few moments and beeps again, three times. I’m still working the eggs but the toaster doesn’t care. It wants me to walk over to it and hit “cancel” even though it’s done and there’s nothing to cancel. I glance in its direction and it flashes its LED display back at me in annoyance. “DONE” it reads and then beeps three times again. Something needs to be done about that toaster.

I go to put the eggs back into the fridge and the lights are purple again. What the hell? Must be one of the kids’ idea of a joke. “Hey Sara, can you grab me my debugging cable when you have a chance?” I serve breakfast and it’s devoured before I even get a chance to sit down. Everyone starts to head out, leaving me with hugs and kisses and dirty dishes. Sara hands me my debugging cable with her goodbye kiss and runs off to catch the bus. I clean up from breakfast and then get to work. That toaster has it coming.

A debugging cable isn’t much more than a USB host cable. One end plugs into my cell phone and the other is an octopus of different usb ports, mini, micro, A and B. The toaster is a little older too, so it has a micro usb port. Newer ones would just have the USB C ports with the nifty cables that you can plug in to either end and upside down. Remember when no matter which way you plugged in your cable it was wrong? Those days are almost long gone. I pull up the CodeCat app on my phone. I’m sure the toaster has an official app but the community keeps better track of these things. The app detects it’s plugged into a “SmartTek Heatmaster 1520” with stock firmware. It downloads the code from the toaster and opens it up. Boy this thing is a mess. I find where it keeps beeping but I can’t figure out why it keeps beeping, something must be calling the beep function over and over.  I hit the “community firmware” tab on CodeCat I bet someone has already solved this. It’s not a popular toaster oven but there are at least 3 firmwares with “STOP THE BEEPING” in their names so I hit the most popular one and view a diff.

It shows me where the firmware was changed to stop the beeping, and it also looks like they turned the toasting levels down a bit. That’s great! It used to be “kinda toasty”, “burnt”, “burnt to a crisp”, “fire hazard”,  and two more levels I’ve never dared to toast with. I wish they had said they fixed that in the docs but this is wonderful news. I hit install and it downloads into the toaster. I then test it with a nice piece of fresh sourdough. The bread turns golden brown and then a nice low “beep” happens once. The display reads “Thank You”.

Now for the fridge! Something keeps changing the settings, and I bet it’s a script written by someone who wants to paint their room black and purple. The fridge has its own display and is capable of user scripts. This lets us write a script that runs either in response to events or all the time. It also lets us fork the scripts that the fridge came with. When we first got the fridge I played around with it a bit, and modified the light script to slowly increase the brightness when you open the door and then flash it a few times if the door is left open more than 30 seconds. In all honestly I thought it was a gimmick at the time. But when I figured out how to bypass the fridge’s quaint todo app and have it send todos to a shared shopping list on phones, I was sold 100 times over. There’s not much more I want from my fridge. And thank god fridge companies stopped trying to automatically detect what’s in there and place orders for us. Those were dark days. I mean someone even tried to get RFID chips put in individual eggs. Crazy, right?

There were no additional scripts but the modification time on my light script had been updated. I checked a diff and noticed almost every line had been modified, but only its whitespace? The fridge doesn’t support suppressing changes to spaces and tabs and only showing the actual code differences. So I plugged in my phone again (this time with USBC!) and pulled up CodeCat again. I found the lighting script again and had it show me only the code changes, no spaces this time. A new section had been hidden in the middle that would reset the color of the light every 7 minutes. Crafty. I copied it out and then reset the file to the previous version.

With the fridge fixed, I logged into my house’s command and control box. This is an old mini computer (about the size of my phone) that I had laying around and hooked up to the wifi. It primarily listens for all the switches and turns on the lights in whatever room you’re in. It can also listen for commands from your phone and it knows if we’re home or not and can turn on the porch light. Simple stuff. I add a new script for the switch in the kids’ bedroom, every 3rd time the light is turned on, and only if it hasn’t happened in the last 2 hours, flash the lights bright green for 30 seconds and then go back to purple or whatever. That will show them!

The kids haven’t really figured out about the house control as it’s not right in front of them like the fridge, and they’re still pretty young. I leave them with write access to the script so they can fix it if they figure it out. No point being completely mean. Time for work I suppose!

The Internet I wish we had: Texting

I hung up my phone and started typing. “Jason just called me, ideas for dinner before the movie?” and sent it to Sara. My phone know’s a lot about Sara and where she might be. It encrypted the message for her eyes only, indicated that the message will probably be delivered in midtown with a 70% confidence rating. After all it was 4pm on a Thursday, where else would she be?

My office runs a messages hub. It takes messages from nearby devices and puts them on the internet where they’re sent to hubs closer to their delivery locations. Midtown is full of hubs and even if it wasn’t there’s enough people in manhattan that it would only take a few extra seconds to go phone to phone.

My office’s hub took at look at the message and queried it’s routing database. It didn’t have a better idea of where Sara might be so it remembered mine and chose it’s favorite hub in midtown the one at Egyptian restaurant down the block. This hub has the best relationship with mine out of all the nearby hubs. It’s rarely overloaded, has a decent enough connection and it’s pretty close to Sara’s phone most of the time. It also knows my hub is in a similar situation when sending me messages.

The Egyptian restaurant’s hub broadcasts the message, it’s too far away from Sara’s phone for it to hear but a business man is walking near by. His phone picks up the message and sends it to everyone on the block. A woman at the far end had recently taken the elevator past Sara’s floor of the office and their phone had seen hers. Her phone relays it to the doorman of her building who’s still in range. The doorman always kept his phone plugged in and is in a perfect spot to relay messages. He doesn’t really know too much about the messaging app, other than it gives him some spending money at the end of the month and people are happier when he keeps it on.

Sara had tried to get reception to put in a hub, or at least keep the messaging app in “hub mode” on their phones. They’re plugged in, someone is almost always there and they’d help relay all the messages to the floor of the office. It would be great for everyone! Except one of the receptionists claimed it slowed down his phone. (Probably gave his online games some lag.) And the other one jacked up the price for each relay 100 times the market rate and everyone routed around him. He never made any money and turned it off. Their loss, they can keep paying for their service plans.

The doorman’s phone sends the message bouncing up the phones in the elevator cars until it hits someone walking across the office on the floor above who’s also in range of Sara.  Her phone receives the message with a “Beep Boop” The whole affair took 7 seconds and negligible battery life.

“I just left work. Swinging by comics, then I’ll head towards the theater. I had pizza for lunch, what did he say?”

 

Arranging Complex Factories (for fun and profit)

FactoryGirl the oddly named testing tool for database models is something we use a lot at Wizard Development. If you’re unfamiliar with how it works, I strongly suggest you check it out. Unlike fixtures which loads a bunch of data into your database, factories will create the objects you need with the data preloaded. The difference allows you to only get what you need, allows skipping using the database all together (for much faster and more isolated tests) and a few other great things.

Individual models are fairly straightforward to test. I’ll be using examples with rspec and ActiveRecord.

# Model
class User < ActiveRecord::Base
  scope :admins, -> { where(admins: true) }
  def admin!
    update!(admin: true)
  end
end
# Factory
FactoryGirl.define do
  factory :user do
    sequence(:name) { |n| "#{Faker::Name.name} #{n}" }
    sequence(:email) { |n| "#{n}#{Faker::Internet.email}" }
    admin false

    trait :as_admin do
      admin true
    end
  end
end
# Test
require 'rails_helper'

describe User do
  let(:user) { build_stubbed(:user) }
  let(:admin) { build_stubbed(:user, :as_admin) }

  describe '#admin!' do
    it 'makes a user an admin' do
      user.admin!
      expect(user.admin?).to eq(true)
    end
    it 'keeps admins in power' do
      admin.admin!
      expect(admin.admin?).to eq(true)
    end
  end

  describe '.admins' do
    it 'returns only the admins' do
      admin = create(:admin)
      create(:user)
      expect(User.admins).to contain_exactly(admin)
    end
  end
end

For the model’s instance functions we used FactoryGirl.build_stubbed a method that creates a model that pretends it’s saved to the database. All validations, and database methods will pretend to work as expected and we’ll be sure to never actually talk to the database, which is significantly faster.

For the scope we have to talk to the database so we create both models and ensure the result only has the admin object. Since only those two objects are needed, that’s all we make.

As your app grows you’ll start needing to test service objects that work with several models at once, and your models themselves will get more complected requiring each other to be in specific states to be valid. It’s going to get difficult to have a single factory properly setup the environment for testing. (If you find it impossible to use factories you need to have a long hard look at your design because it wont ever get easier on it’s own.)

A common situation is when you want “Multitenancy” where your app needs to support users having their own objects. This is very straightforward to support with factories, at first.

class User < ActiveRecord::Base
  has_one :photo
end

class Photo < ActiveRecord::Base
  validates :user, presence: true
end

FactoryGirl.define do
  factory :user do
    sequence(:name) { |n| "#{Faker::Name.name} #{n}" }
    trait :with_photo do
      photo
    end
  end

  factory :photo do
    title "My cat Kris"
  end
end

# to build a stubbed user with a stubbed photo
FactoryGirl.build_stubbed(:user, :with_photo)

Now you’ll probably want to support a user with many photos. FactoryGirl suggessts using the after and before callbacks for creating the associations. Lets try it

class User < ActiveRecord::Base
  has_many :photos
end

class Photo < ActiveRecord::Base
end

FactoryGirl.define do
  factory :user do
    sequence(:name) { |n| "#{Faker::Name.name} #{n}" }
    trait :with_photos do
      transient do
        photo_count 2
      end

      after(:create) do |user, evaluator|
        create_list(:photo, evaluator.photo_count, user: user)
      end
    end
  end

  factory :photo do
    title "My cat Kris"
  end
end

# to create a user with 2 photos
FactoryGirl.create(:user, :with_photos)

# When we build_stubbed or build or any of the other methods, we no longer have any photos!
FactoryGirl.build(:user, :with_photo) # no photos!
FactoryGirl.build_stubbed(:user, :with_photos) # no photos!

Since this approach only works with specific methods, you’ll either need to write callbacks for each method or do some magic. I’ll rewrite the factory with some magic.

FactoryGirl.define do
  factory :user do
    sequence(:name) { |n| "#{Faker::Name.name} #{n}" }
    trait :with_photos do
      transient do
        photo_count 2
      end

      photos do |t|
        photo_count.times.map {
          t.association(:photo, user: t.instance_variable_get(:@instance))
       }
     end
    end
  end

  factory :photo do
    title "My cat Kris"
  end
end

# Now however we want our test data we'll get what we expect!
FactoryGirl.create(:user, :with_photos)
FactoryGirl.build(:user, :with_photo)
FactoryGirl.build_stubbed(:user, :with_photos)

The t that’s passed into the block on photos, I think this is called an evaluator internal to FactoryGirl, but I’m not positive. Names are hard. We’re able to use the t.association to mimic however we called the parent factory. When we are building a factory it uses build() when we’re creating it uses create(). Yay!

I know t.instance_variable_get(:@instance) looks very strange but there doesn’t seem to be another way to get a reference to the parent object to give to the child object. Not all children need their parents, but when they do you need to provide them.

We should also note that we’re using a transient attribute to allow us to customize how many photos get created.

# if we want a ton of photos
FactoryGirl.create(:user, :with_photos, photo_count: 400)

Lets go for an even more complex example.

class User < ActiveRecord::Base
  has_many :photos
  has_one :album
end

class Album < ActiveRecord::Base
  has_many :photos
  validates :user, presence: true
end

class Photo < ActiveRecord::Base
  validates :user, presence: true
end

Photos still belong to users but can now also belong to an album that belongs to a user. Lets also ensure there’s always a user for these objects.

A factory setup could be

FactoryGirl.define do
  factory :user do
    sequence(:name) { |n| "#{Faker::Name.name} #{n}" }
    trait :with_album do
      album
    end
  end

  factory :photo do
    title "My cat Kris"
    user
  end

  factory :album do
    user
    title "Kitties"
    transient { photo_count 2 }
    photos do |t|
      photo_count.times.map { t.association(:photo) }
    end
  end
end

Lets try this out

user = FactoryGirl.create(:user, :with_album)
user.album.photos.count # 2
user.photos.count # 0 !?!?!?!
User.count # 4 !!!!!

We have a user with an album of other users photos! That’s not what we wanted.

The photo factory was creating it’s own users for it’s photos since we didn’t specify who should own them. Additionally the album factory created a user and then got assigned to the one we created. Lets try again.

FactoryGirl.define do
  factory :user do
    sequence(:name) { |n| "#{Faker::Name.name} #{n}" }
    trait :with_album do
      album { t.association(:album, :with_photos, user: t.instance_variable_get(:@instance))
    end
  end

  factory :photo do
    title "My cat Kris"
    user
  end

  factory :album do
    user
    title "Kitties"
    trait :with_photos do
      transient { photo_count 2 }
      photos do |t|
        photo_count.times.map { t.association(:photo, user: user) }
     end
    end
  end
end

The user now gives itself to the album, the album now gives it’s user to the photos and we always get what we expect. We can create any factory and get a user who owns the photos that were generated and never get more users than we expect.

I think this is too complicated. I’m convinced there are easier ways to do the advanced examples in this blog post. When I find them I’ll happily update this post and a bunch of my factory code. In the meantime I’ll live with slightly complicated factories and enjoy easier testing.

Let me leave you with a with a small spec we include with most projects. It ensures that every factory and trait is valid and can be stubbed. And helps you keep all factories usable with expected results. FactoryGirl.lint has some unexpected creation of models and doesn’t cleanup after itself. If you’re using Foreign Key Constraints you’ll get an added bonus of errors when you accidently create models related to stubbed models.

require 'rails_helper'

FactoryGirl.factories.map(&:name).each do |factory_name|
  describe "#{factory_name} factory" do
    it 'builds valid' do
      model = FactoryGirl.build(factory_name)
      expect(model).to be_valid if model.respond_to?(:valid?)
    end

    it 'builds stubbed' do
      model = FactoryGirl.build_stubbed(factory_name)
      expect(model).to be_valid if model.respond_to?(:valid?)
    end
  end
end

The Winnower API

We recently added an API to The Winnower to support our new WordPress Plugin. It was a great experience in both product and software design. WordPress support is the first of a few great features we’re adding to The Winnower to aid our users in publishing.

cover

It was suprising to me, but these days a lot of academic publishing, if not in journals, is done on blogs. The Winnower provided publishing services to papers which were uploaded via Word or Latex, but people would have to copy their blog published papers from whatever they currently use into Word if they wanted publish them. That wasn’t great.

WordPress.org is one of the largest blogging software platforms. It’s crazy customizable and very easy to use. It was a very good first candidate to support. We figured a WordPress plugin would allow people to keep publishing as they do now, and allow them to get DOI’s and go through the open review processes through The Winnower.

The plugin needed to integrate with the site via some sort of API, and we wanted to adopt the JSON Api spec wich describes a restful JSON interface. Internally, the Winnower’s APIs were a bit of a mess. The site had evolved a lot since the initial structure was created and the technical debt that had accrued caused the APIs to loose some of their elegance. Because of that, they didn’t map cleanly to JSON API, or any other restful API.

We started by “green fielding” the API design to match the needs of the plugin and it’s users. Then we built the API alongside the existing interfaces. We built a bridge between the new and the old by creating some service objects that wrangled the internals into a reasonable shape and interface. Finally, we built out the controllers to handle the particulars of the JSON API requests.

This taught us a lot about what we really needed to publish a paper, and how we could restructure the internals across the site. Thankfully, we already had great integration test coverage for our publishing papers. We’re now able to start moving towards a much better designed app without the risk of breaking everything.

The coolest part of this sprint was that we got a lot of insight into our existing user experience (UX). Much of it existed to accommodate the original design as opposed to the features the users needed. We’re going to have a much easier time improving the experience after the internal restructuring and we’re going to find ourselves with a much better product in the end.

-Francis

PS If you’re interested in programming for The Winnower’s API please let us know! In the meantime we’ll keep building new uses for it. =)

Steam Heat

My home has radiators that are 70ish years old. I’m going to guess the air vents are 10-30 years old. It’s supposed to let the air out while the pipe fills with steam. Then and this is the important part, it stops letting anything out of the pipe and keeps the steam in the pipe. Some of our valves weren’t letting the air out, and some was letting everything out.

Also;

  1. It’s cold in my room
  2. Our boiler runs out of water too often
  3. Our windows take a constant bath from condensation

So lets fix some things.

This slideshow requires JavaScript.

The vents in the peanut butter jar were old, came with the house. They didn’t quite close when the steam hit them so they whistled a ton. So if you have a PB jar full of vents I recommend installing them at night so nobody is awake to hear them. The next day Sara drove me in the snow to spend a lot of money on valves from a store. I replaced the vents in my bedroom which were clogged. The air couldn’t escape so it couldn’t fill with steam. The one in the bathroom would never close, so while our bathroom was very warm, it also very damp. Notice the rust around the vent in the photo? That’s crazy. The last two had similar problems.

It’s so quiet! I love it! I hope my bedroom is warmer, I’ll find out. I can’t confirm it but I bet the house will heat a little faster, and my hunch is that the air will be much less humid.

I wish I could somehow measure the heat in the house vs outside, the time it takes to warm the house, the humidity, etc etc. Oh wait! I know how!

nest

I’ll use my Nest! Unfortunately they don’t seem to make it easy to use the data. Looks like I may have to get clever.

Money Transferring

I was expressing frustration with moving money around the other day and was asked to share what I knew. This is an incomplete list of ways to move money, and their consequences. Moving money (and in turn getting paid or paying others) is one of the most important yet strangely high-friction things a business has to do. On top of that, most of it is frustrating from a technical standpoint.

I’m not going to cover moving money on behalf of other people, which is worthy of it’s own blog post. I also think it’s one of the more interesting areas for exploration (as far as money is concerned). I’m also going to gloss over specifics around the Automated Clearing House (ACH) and other payment networks. Just know that it’s actually a lot more complicated, with a ton more rules and a few more players then I talk about.

cover

The cover photo is of NYC’s MTA Money Train by “Orange Suede Sofa”.

Cash

Cash is the easiest to understand. It’s what we grow up with. It’s a physical object that holds value and it’s instantly convertible either to products or your bank account. The retail currency exchanges take a large cut, but if you’re in a single country it can’t be beat. Because of it’s physical nature there isn’t an accounting system in existence that doesn’t require you to manually track what you spend it on or where it goes.

  • Cost: Low – Usually none unless you have to change currencies
  • Time to clear: Instant
  • Hassle: High – You have to go get it and then physically give it to someone.
  • Risk: High – No fraud protection
  • Traceability: Very little
  • Accounting Cost: High – No way to know who received it or why without keeping your own records

Check

I don’t like checks but they are very common and are almost as cheap as cash. The checks themselves are not actually worth money. I don’t like them because they are unpredictable. If I give you cash, I no longer have it. If I give you a check, I need to ensure I have the money in my account until you deposit the check and it clears. It requires me to keep a separate log of accounting to ensure I don’t accidentally double spend. The Automated Clearing House (ACH) processes is crazy too.

Here’s the general processes:
1. I physically have to write how much money I want you to have on a piece of paper. (Or print it, but that isn’t easier.)
2. I have to physically get it to you. (mail, in person, etc)
3. You have to bring it to a branch of your bank and deposit it. (“Mobile deposit” is great but banks usually only risk around $2000 max on a single mobile deposit.)
4. Your bank scans the check and sends it in a nightly batch processes to the ACH.
5. The ACH does some level of fraud protection that I am unclear of the specifics.
6. The my bank receives a notice of my check and verifies the funds and authorizes the withdrawal.
7. The ACH lets your bank know that it was approved.
8. Our banks reconcile the funds. (Do their own bank to bank transfers.)
9. Sometime in the past few steps your bank updated your account with some or all of the balance.

The worst part for me is that you have around 6 months to deposit the check. Some banks will allow you to try to deposit checks of any age.

  • Cost: Low – Unless there’s a returned check, then fees are levied to both parties around $20-$60
  • Time to clear: Long – 2-4 days to clear plus 0-160 days to deposit
  • Hassle: High – Lots of physical interactions, lots of waiting and often you have to use the US postal system
  • Risk: Medium – Checks aren’t worth money but they can be faked. You can also deposit a “bad check” which can incur you fees.
  • Traceability: High – Every check comes from an account and goes to an account. Accounts usually have names and it shows up as an item in your bank statement.
  • Accounting Cost: Low – It’s easy to see to whom a check was written and the memo field usually says why (eg invoice number). It also usually reconcilable from the bank statements. That is of course they deposited the check.

Wire Transfer

This is pretty easy and can usually be done from an online interface with your bank. In the US it uses the ACH like checks but electronically sends the account information. Internationally it uses IBAN and SWIFT, which are neat. This will usually cost between $10-$40 to both send and receive.

  • Cost: Medium $10-$40 for all parties involved
  • Time to clear: 2-4 days
  • Hassle: Medium – You need address, name, account info, routing info and for the person you’re paying to know what an ACH transfer is.
  • Risk: Medium – The money is usually immediately withdrawn. The medium rating comes from having near zero recourse if you send the money to the wrong place.
  • Traceability: Medium – I’d say high except if you have the information wrong you can’t easily find out who you sent the money to.
  • Account Cost: Low – Same as checks

Direct Deposit

This uses the same infrastructure as checks and is usually free to the sender and receiver. Same hassle as a wire transfer with a little extra because you need a service to assist. I’m hazy on the details.

Online Bill Pay

Your bank will helpfully send a check. They may or may not debit your account and send a bank check. They may or may not fine you for overdraft fees. They may or may not send a check regardless of balance (and then fine you for a bounced check). They may or may not fall back to electronic means with larger companies that have accounts with them. For most small businesses, you’ll get a check in the mail if someone pays you via this method.

I am unaware of the regulation of this feature.

Credit Cards

In the past you’d have to open a merchant account and negotiate fees. These days the merchant account is virtual and you’ll get an ACH transfer for free with your cash minus $0.30 and %3 in a few days. Stripe, Braintree and a few others are great in this space.

  • Cost: Medium – $0.30 and 1.5-5% This can add up for large payments when compared to checks or wire transfers, but if you have volume and are a low risk you can negotiate the fee down.
  • Time to clear: Medium – You’ll get the money in your merchant account instantly, but can’t get access to it for 2-7 days depending on how nice your relationship is with your processor / merchant account and how much risk they think you are. If you’re using a modern payment gateway it’s usually 4 days and you don’t have to have a merchant account.
  • Hassle: Low – Easy to initiate, money usually shows up without issue. Some larger charges will fail for unspecified reasons, but a phone call to the bank will usually clear it up.
  • Risk: Low – There is fraud protection on both sides of the transaction. You get to verify credit card details if you wish before authorizing the charge. If your card is stolen you usually get the charges refunded. If you are receiving money a chargeback can cost you $10-$75 but they are usually rare depending on your business.
  • Traceability: High – Everyone has their name on both sides of the charge.
  • Accounting Cost: Low – It’s like another bank account. You know where your money went and where it came from.

Paypal, Venmo, Square Cash, etc

They use a combination of Credit cards, ACH transfers and debit card refunds to move money around.

  • Cost: Low – They range from free to credit card style fees
  • Time to clear: Medium – Unless you stay within their network you usually need to wait 2-7 days to get your money. You often need to “transfer” it into your bank account via the ACH.
  • Hassle: Medium – If you already have an account on the payment network it might be low, but chances are you or your client won’t.
  • Traceability: Varies
  • Risk: High – There’s a good chance you’ll get your money, there’s a big chance you won’t know the rules of the network or be able to access your money right away. Fraud protection is often amped up very high on these networks and they’ll lock down accounts involved in any transaction of scale, to give them time to check you out.
  • Accounting Cost: Medium – It’s not unlike a credit card processors account but each system has their own reporting and accounting systems. You may or may not have accountability

Bitcoin

This is a funny one. Currently there are many exchanges where you can buy and sell bitcoins. Some legitimate, some shady, some with large fees and some with very low fees. Coinbase for example lets you take payment with bitcoin and instantly transfers it to cash like a credit card processor would. It’s fees are only 1% but may not give your customers the best exchange rate. Bitcoin to bitcoin transactions can be made with a transaction fee well under $0.05. Obtaining bitcoins isn’t easy and their value is volatile.

  • Cost: Low – There are no or very low ($0.05 cents to 1%) fees depending on if you’re keeping bitcoin as a currency or using it as a fund transfer mechanism.
  • Time to clear: Medium – Bitcoins will transfer in a matter of minutes – usually less than an hour to be safe. Getting your money from an exchange will either use the ACH or checks and that may take days to weeks.
  • Hassle: High – Coinbase makes it easy but very few people will have bitcoins or a coinbase account. Buying bitcoins without fees is very hard. Storing bitcoins online isn’t recommended and it’s easy to lose them as they can be erased or stolen.
  • Risk: High – Lots of bitcoin based companies have been hacked. It’s not safe to keep large amounts of bitcoins online. There is no fraud protections. Some exchanges will even monitor what your coins were used for and shut down your account if they think you’re part of illicit activities.
  • Traceability: High – There are no names on accounts but every transaction is public.
  • Accounting Cost: High – Try explaining bitcoins to your accountant. The statements from exchanges won’t look much different from a credit card processor however.

Nodebots NYC {2015-001}

Earlier this week we had this year’s first NodeBots NYC event! Andrew and Myself were happy to host. We need to thank About.com for giving us food, space and heat.

cover

As you may know, we share our library of electronics with ScriptEd, a non-profit which teaches programming in under-resourced schools around the city. So we were quite overjoyed when the NYC conference, Empire Node, donated their Arduino kits from their conference this past Fall. These kits will make teaching a ton easier, both in high schools and at our events!

Our event last week had a nice mix of newbie and experienced roboticists. I took a bunch of notes on links that I wanted to send to attendees, so here it goes:

  • More than a few people wanted to buy an Arduino Starter Kit. I can wholeheartedly recommend the $64 Starter Pack for Arduino from Adafruit. It will have everything you need to get started. If you want a little more or less to play with, they also have a $50 and an $85 version.

  • A Johnny-Five Chat can be found on Gitter. It’s a great place to ask questions about Johnny-Five and electronics in general.

  • We had a primer on how to blink a light (the “hello world” of robotics), and combined it with how to read values from buttons and potentiometers.

  • We learned about John Yeh’s Edison Scope, which is an oscilloscope built on top of an Intel Edison, a MSO-28, and NodeJS. It’s open source and amazing. John not only designed the software for this project, but also designed the MSO-28! He built them for his local highschool’s FIRST robotics team and there are currently a few of them on the Internation Space Station!

    Oscilloscopes show changes in voltage over time, and are very useful for seeing what our robots’ brains are outputing. Make has an interesting little video that explains the basics.

  • We talked about the Mesh Thing a bunch, I can’t wait for it to come out.

A few people decided to start playing with LED strips for next month. Adafruit has a great guide to NeoPixels. They’re a ton of fun and might just be the focus of next month’s event.

Once we confirm a few things we’ll be posting our next event, which will be Feb 10th 2015! Watch our Meetup page for more info!

-Francis

Cover image by Matthew Bergman @ Robotsconf 2014

2014 Year End Review

In 2014 our plan was twofold; Help small business’s dreams come true and to be a model for how we’d like our industry to operate. In 9 months we came close to achiving everything we wanted to. Close enough that I don’t think we were ambitious enough.

cover

In March 2014 after hanging out with the Flatiron BK-000 class for 4 months, I did an open call for applicants. I was starting a new dev shop and I wanted them. My theory was that I could teach them a strong processes to help shape their junior skills and provide them with enough time and feedback to make good software. I did a big interview with whoever showed up. (Too many people at once.) After a day long group project, some individual interviews, and a bunch of coffees. I had a team of 4 developers eager to get started with new projects.

I would be amiss if I didn’t point out that Amy is self taught and did not go through a boot camp.

We started with some intense training with regards to processes, app structure, testing and teaching the team. We had one internal project to get the hang of things. We set a low rate and started looking for client work.

Our first client was the wondrous One Month. They were short on developers and happened to be a coaching client of mine. After a few months helping build out their platform to support their ever growing list of online classes they leaned heavily into finding their product fit. This meant refining what they offered and how they offered it. I’m really excited to see them prosper.

We took a few prototype projects after that. Since the companies haven’t yet brought them to market we can’t share too much. One was in the “social goods” space and I hope to see them launch this year. Another was with a large tech company who wanted to improve their web presence.

The Winnower was a “rescue project” that turned into a partnership. Their mission is to fix academic publishing by turning it into an affordable open processes. Their platform however suffered from all of the most common mistakes you can make when building a new platform from scratch. We spent a lot of time rebuilding the core areas and sticking tests on the features that weren’t worth rewriting yet. The Winnower now commonly appears on the top of reddit’s science section. They are also soon to release a set of blogging tools to help people bring citability to the work they self publish. We’re really happy to be a part of developing their platform and watching it take traction.

We’re currently working on some longer projects. One is an upcoming SaaS app for the food industry (we’ve learned a ton about food) and another is a maintenance project for a startup that’s in the middle of a complete rewrite.

In the non tech side of the business, we spent a lot of time refining our inception and proposal processes. Probably too much time. We’ve tried several approaches and are still not 100% happy with the results. This may be a mismatch with our expectations or the resources of our clients, which usually keeps us from devoting too much time to research before a project. Communicating the value of a research and design period is something I’d like to work on for 2015.

We also left a few really exciting projects on the table. Since there are only a few of us we weren’t always available. This was incredibly frustrating as we’d love to see more of these projects come to life.

We aimed at startups and social good focused organizations and made an impact. I couldn’t have hoped for more.

As for being an example of how a development team should run? I think we knocked it out of the park and can’t wait to keep improving. It should be noted that we’re small, only 3 people. I’ve noticed most problems with development teams happen around 5+ people. So maybe we have it easy.

We started with five people and are now three. Hannah Nordgren playing to her talents is now at ESPN in a frontend focused development role and Gustavo Guimarães was asked by German Chancellor Angela Merkel to join the Alexander von Humboldt Foundation to do research into online education. They’re continuing to do good work and we’re proud of them both.

We did “lunch and learns” for half the year, and have brought it back for this year. We kept our 20% free most weeks and had to actively stop each other from working on those days so we could go learn something. Amy started teaching HTML, CSS and JavaScript at Girl Develop It and was joined by Armando to TA her classes. We’re planning on developing course work for them this year. I started running the NodeBots NYC chapter where we teach people programming through robotics.

Armando recently got covered by Business Insider. They wrote about how he changed his life by learning to code. It reminded us how rare stories like his can be, even if it’s not exactly rare here at Wizard Development.

We started our first open source app, which helps people find their local farmers markets in NYC. We’re working with Megan Taylor and Vico Zabel on that project and hope to launch it in a few weeks. We chose to help Megan build off of an app she had designed for a local meetup and to challenge ourselves. Could we build a useful app in a day? No, not yet. We were pretty happy with how much we accomplished and it was a great use of our 20% time.

Our team

I’m damn proud of what we’ve accomplished last year. It makes thinking about our plans for this year even more exciting. We decided to grow, change our focus, and keep doing the things that we love. We’re really excited about it. More on that in the coming days.

– Francis

Header photo of the Lower East Side by Douglas LeMoine

The MEGABUS

Rick was driving north on I-95, he had to find an uplink or this whole trip had been for nothing. “Rose, scan the vehicles ahead.” His onboard computer sprang into action attempting to connect to internal networks of each and every car on the road around him. “No joy” she responded. All the cars either were too outdated to allow wireless access or detected their connection attempt and shut it down before they could get in. Rick sped past the cars in front of him, he had to find what he was looking for and these cars weren’t going to help.

It had been three long weeks since he had access to the ‘hub. Way too long for any self respecting keyboard cowboy. Back in 2017 when the loss of net neutrality caused the global collapse the internet as we knew it, all of the east coast had lost their uplinks to the internet. The Silicon Valley was the only place where you could get a reliable public connection and nobody dared to go there anymore. The internet wasn’t dead it was just hard to get to. Large corporations had the only uplinks and provided their own cell and wifi coverage to only their most elite customers. Having cast off the chains of debt and credit cards Rick was not considered an “Elite” customer. As a result it was hard to get online, and he had code to push.

Three quick “BEEP BEEP BEEP” sounded over the music, Rose flashed all the HUD’s alarms. His modified 6LOWPAN radio had picked up packets from a speed trap up ahead. He toggled back on his transponder and slowed down to the regulation 75 MPH. 6LOWPAN was supposed to be the savior of the net, allowing us to put all our devices online in distributed low power mesh networks. At one point you could send packets from New York to Boston via the ip6 mesh. The powers that be had different plans however. Private security had taken over the spectrum. Civilians quickly lost access to private low power networks and if you ran your own you were accused of interfering with national security and shut down.

Once he was sure he was clear of the trap Rick switched off the transponder and increased to hunting speed. This made him invisible to the EZPass speed checkpoints that littered the highway every few miles. They’d have no idea how fast he was going. It randomized his UUID whenever he switched it back on and appeared to be just another vehicle on the road. This got him past tolls and checkpoints. Even in this day and age it took the government a few weeks to even notice anything was out of the ordinary. Any tickets they would want to issue ended up in someone else’s inbox.

“Pay Dirt!” Rose exclaimed. A Fung Wah bus was up ahead and it had a connection to the net! Fung Wah had long since been shut down, but their buses still drove the roads. Their drivers were able to pick up the buses on the cheap after the company went bankrupt and had organized their own routes free of oversight and regulation. It was pretty lucrative. Luckily the bus’s uplink hardware was valuable enough that it remained in service and if you rode the bus you could use it to connect to your own systems. Someone on this bus had it activated and was using it right now!

Rick pulled up alongside the bus in the driver’s blind spot. If the driver or the passenger noticed him, either in real life or cyberspace, he’d be shutdown, reported and locked out from all uplinks until he could cycle his hardware address and that took weeks. Rose started the connection attempt. It was almost too easy. He had his 128 bit address in no time at all, and routes to all the backbones populated almost instantly. It was never this easy. The passenger on the bus either had no security or had seen him coming miles away. “Fuck it, git push.. wha!?” Rick was cut off by a squeal of sound. The whole car shuddered and the smell of magic blue smoke sifted into his nostrils. The safety circuits kicked in and the car drifted slowly to the side of the highway. It stopped, dead. What happened! Had been back hacked? “Rose!”

After what seemed like an eternity Rick was able to get the car to spring back to life. It took flashing the firmware in his starter circuits twice to get the engine running. Rose had detected the hack and shut everything down before the hacker on the Fung Wah bus could get too far. The navigation and scanning circuits were toast however. Not only were they hacked but the hacker had decided to pump emergency current into their subsystems and destroy $30,000 worth of equipment. Rose and the rest of his systems were fine. He could drive. And he better leave before any private security showed up to see why he stopped.

That was close but he couldn’t give up.

“You wont believe this” Rose piped up. It had been two hours and they had almost reached their destination. Rick had feared they wouldn’t be able to push any code tonight. “It’s a MEGABUS”. MEGABUS had been one of the few companies to survive the collapse. Every bus had power and material hookups at every luxury leather seat, and most importantly a corporate uplink connection active 24/7 for use by all passengers. Rick wasn’t going to mess around this time. He killed his lights and activated stealth mode. Rose picked up and identified packets from all 36 of the passengers on the megabus. Most were encrypted but one was downloading a ton of data. Mostly facebook, twitter and netflix. Streaming video on the east coast!? Gluttonous. This guy wouldn’t notice a little extra bandwidth. Rose cloned his MAC and carefully connected to the bus. Connections to twitter and the hub were successful. “I’m in” she reported. “Alright, easy now. cd johnny-five, git push origin master.” Rose connected via SSH to github and started pushing binary blobs of robot control data. “Eta 137 seconds” she reported. Rick decided to tweet.

There was only 30 seconds left when the MEGABUS driver noticed him and pulled hard to the right narrowly missing Rick as he slammed on the breaks. “We’re losing signal!” Rose yelled out as the bus sped away. 20 Seconds! Rick sped up, this time right behind the bus. It slammed on it’s breaks, and broke off towards an exit. Rose quickly deduced the situation “The Fung Wah hacker must have reported us to all uplinks in the area, they knew we were there from the second we pulled up!” Rick yanked on the wheel and slammed the pedal. Even if it meant leaving the safety of the highway he wasn’t going to drop this connection. 5 seconds left! He pulled ahead of the bus and slammed on his breaks. Time for some of the your own medicine! The buses safety circuits kicked in and the bus slammed on it’s brakes skidding to a halt before tapping Rose’s bumper. It would need a visual inspection before it was allowed to drive again. “Git push complete.”

Rick sped off into the night.

Bosty by Richard Cox