Examples of Inversion of Control

In the post Inversion of Control (IoC), I described what was. Here I describe several examples of Inversion of Control.

Dependency Injection

When creating a class or module, it is good practice to reduce concrete dependencies when possible (Dependency Inversion Principle) . Concrete means having a hard dependency on another piece of code rather than a dependency on an abstraction.

This can be illustrated by defining a class. For example, a BillingForm may depend on a PaymentProcessor:

class BillingForm {
  constructor() {
    this.processor = new PaymentProcessor();
  }
  processForm(...) {
    this.processor.process(...);
  }
}

Contrast above with the following example where the dependency is added as an argument when constructing a BillingForm instance.

class BillingForm {
  constructor(paymentProcessor) {
    this.processor = paymentProcessor;
  }
  processForm(...) {
    this.processor.process(...);
  }
}
const paymentProcessor = new PaymentProcessor();
const billingForm = new BillingForm(paymentProcessor);

This is an example of IoC because the control of when a dependency is added is controlled by when the BillingForm is instantiated rather than immediately during the BillingForm instantiation.

React Lifecycle Methods

The Javascript frontend framework React.js has component lifecycle methods for components. Examples like componentWillMount, componentDidMount, and componentWillUnmount are defined in a component. These methods can be overridden by a component. The methods are then called at the appropriate time by the React.js framework.

Other examples includes: Command Line Interface, Javascript callbacks, Route Handlers, Object oriented class frameworks, and User Interfaces

Inversion of Control

Inversion of Control (IoC) is usually foundin programming, but it is a general concept. The concept relates to a program’s flow of control.

A program’s flow of control can be thought of as the direction a program executes. The simplest illustration of this is top-to-bottom line-by-line execution of a program.

console.log(1); 
console.log(2); 
console.log(3);

The numbers 1, 2, 3 will be logged into the console in this order. The written program has control of what and when the numbers are shown.

Contrast the above example with:

document.querySelector('.button-1')
.addEventListener('click', function(e) {
  console.log(1);
});
document.querySelector('.button-2')
.addEventListener('click', function(e) {
  console.log(2);
});

This code add event listeners to 2 buttons button-1 and button-2. The program describes what will happen (logging a number), but it has left when to the browser which in turn leaves it to the user of the browser. It is said that the control has been inverted away from the application/program (the code which defines the number logging) to the framework (the browser)

The word “framework” is an abstract and necessary concept when dealing with IoC since it would decide when certain methods shall be called.

To read more, check out Examples of Inversion of Control

Amazon Dash Button and Raspberry Pi Scripting

At home, I have several Amazon Dash Buttons throughout the house with a Raspberry Pi listening for clicks. I mainly use these buttons to track whether I have completed a specific task near the Amazon dash button. For example, I have have a button in my bathroom I click when I have flossed my teeth at night. Clicking this button would then mark the corresponding daily task completed.

Below is the script I use to mark a task done (some details omitted).

from scapy.all import *
import requests
# it takes a minute for the scapy sniffing to initialize, so I print this to know when it's actually ready to go
 print('Init done.')

USER_ID = ""
API_TOKEN = ""

mac_address_to_task_data = {
 "40:b1:cd:24:e2:1d": ("task_id", "task_name"),
 "18:74:fd:eb:82:17": ("task_id", "task_name"),
 "38:f7:3d:ca:32:dd": ("task_id", "task_name")
}

def execute_task(task):
 url = "https://task-management-app.com/tasks/%s/%s" % (task[0], "up")
 headers = {
   "x-api-user": USER_ID,
   "x-api-key": API_TOKEN,
 }
 requests.post(url, headers=headers)
 print "Executed '%s'" % task[1]

def detect_button(pkt):
 if pkt.haslayer(DHCP):
   if pkt[Ether].src in mac_address_to_task:
     task_data = mac_address_to_task.get(pkt[Ether].src)
     execute_task(task)
   else:
     print "Unknown: " + pkt[Ether].src

sniff(prn=detect_button, filter="(udp and (port 67 or 68))", store=0)

For more info, then check out this blog post on hacking the Amazon Dash Button which helped in getting started with this.

Apply To All Jobs on AngelList

TL;DR: Copy and Paste this code snippet into AngelList Jobs page to apply to all jobs.

$('a.interested-button').each(function(_, button) {$(button).click()})

AngelList is a useful resource for startups, investors, and individuals looking for startup jobs. For this post, I fall into the latter category. As part of my recent job search, I perused the jobs section of AngelList, and I even expressed that I was interested in a few startups. As I went through this job search process, I asked if there was an easier way to go about this.

AngelList Jobs

My solution was to apply to all the jobs within a given search. The first thing I noticed was that a user must click on an “Yes, I’m interested” button. When I examined the source code closer within Google Chrome’s Inspector, I realized that the “Yes, I’m Interested” buttons had a class of .interested-button and that each startup item had its own button already rendered to the page.

interested-button

The actual solution took only one line of jQuery to implement:

$('a.interested-button').each(function(_, button) {$(button).click()})

The End You scroll to the bottom until you have all the search results loaded onto the page and you see “The End”

Apply all using the script in the console

Apply script with the console

Expressed Interest Now you’ve successfully applied to all the jobs within a given AngelList jobs search by pasting the above snippet into the console.

One Catch Add note to show interest There is one catch however. You will not be able to apply to jobs that require a note as part of you showing your interest in the job. For a bulk apply all, this seems like a small problem. Pareto’s Principle applies here.

This being said, I do believe that a more targeted approach to job searching is more effective. A strategy where you find a handful of companies you are interested and you express interest via a warm connection or at the very least a direct email to someone within the organization with hiring authorization. You could use a tool like DirectContact to find these individuals’ email addresses

A Fix In case someone at AngelList is reading this, here is one possible solution to prevent this script from working in the future. Instead of POSTing a user is interested directly from an .interested-button click, require a user to have opened the startup job description. This way a boolean variable must be toggled before an interest is POSTed.

My modeling/acting career in the Philippines

Want to fast-track your modeling career in the Philippines? Start your modeling and acting career in the Philippines. Click Here to Join The Program Be Discovered.

I’m writing this on the flight back from my three months endeavor to become a model/actor in the Philippines. Here I want to write about my experience.

For the longest time, my brother and I have heard from other Filipino family and friends that we were good looking and that we could become ‘Sikat’, popular. We would hear, “If you went back to the Philippines, then you could become ‘artista'”, or an actor. For the most part we appreciated the compliment but left it at that for many years. It wasn’t until I was not attending school and I was considering interesting experiences I wanted to try, did I finally decide to take the leap and try to become an actor in the Philippines.

The conversation with my mom started with me telling her my plans to return to college in the Fall after taking a year off after my sophomore year. This was around the end of May and during the Summer months of the Philippines. She was planning to go to the Philippines anyways for my Grandmother’s 70th birthday, so she asked me if I wanted to go. Lastly, off the cuff and casually she suggested that could also try becoming an actor while we’re there and she would help.

When such suggestions are made I typically ask myself, “Why not?” I’ve been told that I could make it for a good part of my life. I had nothing locking me down to being in the States until school starts in September. It sounded like an unique experience to say the least. Best to take chances and risks while you’re young and without too much responsibility. All of these thoughts eventually brought me to say yes.

May 24, 2014, I arrived at Ninoy Aquino International Airport. The week I arrived consisted of seeing family and hanging out with the family. While we were catching up with family, my mom and I talked about how I came to the Philippines to try to become a model/actor. Once they knew, they supportively told me about people and places I should talk and go to. An uncle I only just met, though I was told otherwise, told me co-founded a talent agency in the Philippines and knew a lot about the entertainment industry. He gave me a few contacts I should try to get in contact with.

The contact’s name was Patricia AKA ‘Pat’. My uncle describe her as a socialite. She supposedly hanged out with people in the industry and could provide introductions. We started messaging, and she asked for a “set card”. I had to good what a set card was and create one in Photoshop. [SET CARD]

We tried to setup a lunch with one of her director friends, but the scheduling didn’t work out. Despite her being quite responsive and promising via messages, nothing really came from talking to her. A dead end.

At the same time I was messaging Pat, I followed up with a someone my aunt knew. This person, Jane, knew talent agencies in Manila and even had her daughter in appear a few times on TV and in print ads. She was willing to bring us around and show us the agencies to register at. These agencies included Discovery and ModelShop. Discovery ended up being another dead end, but ModelShop ended up being one of the three agencies that messaged me the most with new castings.

When my mom, Jane, and I arrived at ModelShop we got out of the elevator around the 30th floor of a tall building right in the middle of hot and humid Makati. I had a white t-shirt on, but a yellow sweater in my hand. This was my first time visiting an agency, so I nervously rushed to the the bathroom to change before anyone saw me in my street clothes. I really had nothing to worry about since I eventually realized this agency wasn’t as good as Jane brought me to believe. Nonetheless, I got dressed and filled out the necessary paper work to register my contact info and bio data. Then I was off to the shooting room for my first VTR, Video Tape Recording.

The VTR is the most fundamental thing every talent has to do for each casting. It is the only thing they really judge you own to begin with. So what is a VTR? [VTR VIDEO]

Please follow the following: 1. Your name, age, and height? 2. Any previous commercials or acting experience? 3. Any sports or hobbies? 4. Please turn to the right, turn towards the camera, and smile. 5. Please turn to the left, turn towards the camera, and smile. 6. Face front 7. Facial expressions. Please make the facial expression for each word I say while saying “Yes” 1. Happy 2. Sad 3. Surprised 4. Scared 5. Thinking 6. Worried 7. Super Happy 8. Thank you.

This whole process typically takes less than a minute to complete depending if the caster has extra things for you to do, in which case it is a good sign that they might like you. When I said this is the fundamental thing you’d do for castings, I meant it. You don’t only do this for filings agencies but for every single casting you’d do.

Some VTRs or Go-Sees vary on what they want you to do. Sometimes there’s fun and memorable VTRs. I remember one where you had to pretend that the camera was your crush and you needed to do cute things towards the camera. Another casting had me drink coffee with an expression of it tasting great. I specifically remember this one because the room was so cold. It was serious cold. I think they actually put the air conditioning on the highest they could in order to have all the talents actually cold for when it was their turn to drink the coffee. I felt sorry for the girls in their dresses.

I am not sure how I got this far into this post and I haven’t mentioned the girls. As you can imagine the girls you’d see at VTRs are attractive. Even though we were in the Philippines, there were some from Brazil, France, and other parts of the world. I joked with my brother that if I wanted to find an attractive girlfriend, then I knew were to go. Although my type isn’t Filipinas, I actually found a few I was attracted to. This all being said, after being surround by attractive people for a while, it becomes the norm. Not to say the girls were less attractive, but the effect you get lessens.

After doing a filing with ModelShop, I also filed with Reco and Monaco. These three were the agencies that I got casting texts from the most frequently. The way you find out about castings was through text messages. You would just wait for a text with a time, place, and any special requirements like type of clothing. The interval between VTRs spanned somewhere between a day and a week or so. I’ve had it where there were multiple VTRs in a day that took up the whole day.

The VTRs take up the whole day because of the waiting. For anyone interested in doing the model/acting route, I definitely recommend going earlier. If the text says you have a VTR between 1pm – 5pm, then get there a little before 1pm. Not only would you get done quicker, but it also has the effect of you staying in the mind of a caster longer. [Reference to casting tips about getting there early]

The combination of both the wait and the doing the same exact VTR was so annoying I actually consider creating a SaaS, Software as a Service, online web app to streamline the whole process for both the talents going to the castings and the casters selecting which talents they want in the commercial. This is one of those startup ideas I wish was out in the world but not so much that I want to actually build it, thus I’m writing it here for anyone to execute on. You’re welcome.

The core inefficiency in the casting of talents for commercials etc are the agencies. The agencies receives 30% of the the project’s payment for representing a talent. The agencies justifies this 30% because of their overhead in finding more opportunities for their talents. Since I did not sign a contract with any agency, although I was offered two contracts with one including a free gym membership at Gold’s Gym, I was technically a freelancer for three modeling agencies. Sometimes the agencies would send the same exact message with the same details on when and where to go. The only difference would be the name they attached to the bottom. So obviously they all had similar sources but wanted to “brand” the message so they get the proper credit for when a talent is selected. If only a talent had access to these “White-label” castings, then a talent would not need to share that 30%. Aside from finding opportunities for a talent, an agency can also help with career advice. This advice would have some bias of course.

Another inefficiency I alluded to earlier was the wait and the VTR itself. Depending on how many other people are also there and how early you get to the venue, the typical wait can be anywhere from 30 minutes to as much as 5 hours… After the wait you’d be asked to do the same exact thing you are always asked to. There are exceptions, but the base VTR stays the same. The way to solve this is to have each talent have a profile page with a video doing the normal VTR. It’s really that simple. The internet has had profile pages since the day of Myspace.

After you create a profile page, you open up models/talents to be messaged with more opportunities directly. That means the talents get more of the project’s fees and spend less time waiting to do something repetitive. The casters benefit by having a larger pool of talents to pull from and at lower overhead. This has the potential to even lower how much a project’s budget is as well. Of course you can’t just allow any person on the internet message these people, there should be some sort of verification that the person/organization indeed has an real opportunity for work and is real.

This type of web app should sound familiar. It’s a marketplace. Like all marketplaces you have the chicken and the egg problem. Which side should you focus on? I would suggest focusing on the models as they are open to more work and a larger cut of the project’s budget. The companies and faster searching are fewer but are more frequent in their search for talent. The business model could be priority listings, ads, or transaction fees. This marketplace tries to eliminate the middleman, the agency.

There you go a startup idea that anyone can take and run with. I would love to hear if anybody actually does work on this or even if someone has critiques to give. Feedback welcome.

Back to the story about my career as a model/actor. By mid-June my brother had joined me in the Philippines to also pursue this whim, this dream, this notion of becoming an “artists”. We both enrolled in singing and acting classes. Our 14 singing classes were taught at Ryan Cayabyab School of Music in Ortigas. Our month-long acting class was taught at Actor Studio East in Cubau.

Part two some time in the future…

Possible Email Ruby Gem

PossibleEmail Gem on GitHub PossibleEmail on RubyGems

This is a continuation of my projects relating to using the undocumented Rapportive API. My previous project, Find Anyone’s email: A Ruby script, was a popular project that spurred an issue on Github requesting the script to be written as a gem. After some work, here is the final product.

There were a few motivations in making this gem. When I first released the find-any-email script, I always thought of it as a proof-of-concept instead of the end all be all. Not only did it feel like a hack, but I thought about how easy and interesting it would be to integrate the functionality into a web app if the script was converted into a gem. Another motivation I had going into this project was to improve on my RSpec specification writing. I recently finished reading through the RSpec Book, and I wanted to practice writing specs for this project. If you actually take a look at the gem’s source code, then you might notice there are 75 tests for the gem. Those 75 tests were the result of going through TDD process of Red-Green-Refactor numerous times.

I’m interested to see how this gem would be used in other people’s projects. I was actually considering of creating a sort of SaaS product around the gem or an iPhone app. It seems that these types of email-mining things are of value to some people specifically sales and business people. I actually have something up that I built a few months ago, DirectContact, but I put it on the shelf at the moment. The ideas still seems to have value for people, so I might pick it back up after finishing another project. It gets a bit old thinking about a fairly simple idea after you’ve been thinking about it for awhile.

I would like to tip my hat to Jordan Wright for being a big inspiration for this gem after he wrote his python library Rapportive

CS139P Red and Black Playing Card Suits

I am currently going through Stanford’s CS139P iPhone Application Development Course for iOS 7. I came upon the problem of having my suits only showing black for diamonds, spades, hearts, and clubs.

I started to look at other repos on GitHub of the same project, and I saw I had the same exact thing as the working solution. I then tried to copy validSuits class method in PlayingCard.m directly into my own project, and that fixed it. The problem might have been with choosing the wrong special character from the special character panel. After some looking around in the various tabs, I found the correctly colored suits and I was able apply them again.

+ (NSArray *) validSuits
{
    return @[@"♦️", @"♠️", @"♣️", @"♥️"];
}

You can copy the above class method into the PlayingCard.m to have red and black Playing Card suits.

I tried searching online, but there were no solutions to this problem. Hopefully the search engines indexes this page for others running into the same problem.

When your Backbone JS View Events not Firing

This is a direct copy of this file on GitHub. I’m reproducing here because I think it is a great checklist that actually solved my problem when my view events were not firing.

I’ve been using backbone.js to > develop some javascript-heavy application recently.

I find it quite common for new comers to come into the following > problem: why ain’t my view events firing?

By “view events” I mean a events hash like the following in a > Backbone View class declaration.

class Mine.Views.TasksNew extends Backbone.View
  events:
    "click #preview_button":"parse"
    
  constructor:(options)->
    super(options)
    
  parse:(e)->
    alert 'clicked'

  ...

When your events are not firing, the following is a useful > checklist to go through.

  1. Maybe you have in the previous class declaration something like “el:\$(‘#myelement’)” and expecting the View to be bound to that specific element. But be cautious! The class declaration may be executed before the page is fully loaded. (This is common since I have seen most people put the class declaration before everything else). Please try to move “el:\$(‘#myelement’)” to the spot where you instantiate the View class and maybe the problem could be solved.

  2. Maybe your “el” is too restrictive. You should be know that the objects mentioned in the events hash are restricted inside the el element.

  3. Be aware of the order inside "click #preview_button":"parse"! It’s event followed by selector followed by handler. Did you reversed the order?

  4. Trace down the code using firebug,etc. The code of backbone.js is well readable.

This checklist incorporated the bad things that has happened to me > that makes my events not firing. Hope it helps you!

My specific problem was solved after hitting the second item on the checklist. “el” was too restrictive. I had el: '#posts', so my events were being restricted to within the #posts div. I changed the el to el: '#posts', and that solved my problem of the events not being fired. I’m sure this checklist would come in handy one day.

The difference between -> and => in CoffeeScript

I had this following code:

@collection.each (post) ->
  $(@el).append @template(post.attributes)
@

I was running in an issue where @el and @template were returning Uncaught TypeError: undefined is not a function. I even created a StackOverflow question about it.

I got the template to render by using jQuery directly like so,

$('#posts').append _template.( $('#home-post-template').html() ).

So this told me that the el or template was not within the scope of the each function. I remembered I was originally referencing one of Buzzstarter’s Backbone files and I had => instead of the -> I had now. Just trying things, I switched out -> for =>. Now it was working. Of course I couldn’t switch it out without understanding why it made a difference. So to the CoffeeScript documentation about the fat-arrow. It basically passes another function passing the outer context of this into an argument. This can be better illustrated with the conversion of CoffeeScript to normal Javascript

Old CoffeeScript

    @collection.each (post) ->
      $(@el).append(@template(post.attributes))
    @

Javascript Equivalent

    this.collection.each(function(post) {
      return $(this.el).append(this.template(post.attributes));
    });
    return this;

New CoffeeScript

    @collection.each (post) =>
      $(@el).append(@template(post.attributes))
    @

Javascript Equivalent

    this.collection.each((function(_this) {
      return function(post) {
        return $(_this.el).append(_this.template(post.attributes));
      };
    })(this));
    return this;

Once I saw the Javascript of the CoffeeScript with =>, it was painfully obvious what I was doing wrong and how => solved the problem. This error was due to my unfamiliarity to CoffeeScript, but Js2Coffee is quite useful in learning the differences.