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.

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.

Emacs Ruby on Rails Mode: Rinari

I have been developing with Ruby on Rails and Emacs for a good three months now, but I haven’t been using the emacs editor to its full potential. Nothing illustrates that more than not using a Ruby on Rails minor mode like Rinari. I just enabled rinari-minor-mode today and watched the introduction Rinari Screencast, and I’m blown away at how much time I could be saving using come of the commands shown.

You could switch over to the controllers, models and views using the c-c ; f c, m, or v command keys. What I was really looking for was to make the erb <%= %> tags, and the rinari minor mode can do that as well with c-c ' e.

Cheatsheet

 C-c ; f c  rinari-find-controller
 C-c ; f e  rinari-find-environment
 C-c ; f f  rinari-find-file-in-project
 C-c ; f h  rinari-find-helper
 C-c ; f i  rinari-find-migration
 C-c ; f j  rinari-find-javascript
 C-c ; f l  rinari-find-plugin
 C-c ; f m  rinari-find-model
 C-c ; f n  rinari-find-configuration
 C-c ; f o  rinari-find-log
 C-c ; f p  rinari-find-public
 C-c ; f s  rinari-find-script
 C-c ; f t  rinari-find-test
 C-c ; f v  rinari-find-view
 C-c ; f w  rinari-find-worker
 C-c ; f x  rinari-find-fixture
 C-c ; f y  rinari-find-stylesheet
C-c ; s    rinari-script              
C-c ; e    rinari-insert-erb-skeleton 
C-c ; r    rinari-rake                
C-c ; w    rinari-web-server          
C-c ; x    rinari-extract-partial     
C-c ; ;    rinari-find-by-context     
C-c ; d    rinari-cap
C-c ; q    rinari-sql
C-c ; t    rinari-test
C-c ; c    rinari-console
C-c ; g    rinari-rgrep
C-c ; p    rinari-goto-partial
C-c ; '    rinari-find-by-context

more bindings can be seen with c-h b. I just learnt about this command through the Rinari video. It is useful because you can see all the commands associated to different minor modes.

Use `gits` instead of `git status`

After using git version control for sometime, you may notice yourself running git status multiple times right before you commit. Like the programmers we are, we are inherently lazy. in a good way. Instead of typing git status numerous times a day, type gits.

Here’s line you’ll need to alias it in the bash terminal

alias gits='git status'

Add this line to either you ~/.bashrc or ~/.bash_profile. Remember to reload bash again by opening a new terminal window so bash can import this alias.

Bonus

alias gita='git add'

Easily create database records with db:seed

I have a project and a task model. Projects has many tasks. I can easily create many records of these in the database using the db/seed.rb file. In this file you can write many ActiveRecord commands to be executed when you run rake db:seed Example where the seed.rb contains

Project.create!(name: 'Project')
Project.create!(name: 'Project1')

This is will create and save two records into the database when you run rake db:seed

If you wanted to create many projects and tasks, then you would not want to be defining each record like what I had above. Instead you would want to dynamically generate as many projects and tasks as you want. The way I did it was through looping through a range in order to assign a number to the project and task attributes.

project_array = []                                                         
(1..4).each do |num|                                                       
  project_array <<  Project.create!(name: "Project#{num}")                 
end                                                                        

project_array.each do |project|                                            
  (1..20).each do |num|                                                    
    Task.create!(description: "Task#{num}", project_id: project.id)        
  end                                                                      
end      

We first define the project_array to store all the created projects. We have a range passed into a block in order to generate the dynamically named project name. The project_array is then appended with Project objects.

The second loop first loops through all the projects then a range. The project loop comes first because you want to have many tasks under a few projects. In this case we are creating 20 tasks with the project_id attribute set to the project.id

This can be refactored and extended further, but for such a simple goal, no need to give it too much thought.

Rake db:reset

If you happen need to reset the database, then you do not need to run rake db:seed afterwards. rake db:reset performs the dropping, migrating, and seeding of the tables for you.

Terminal: Copy a folder

Similar to the way you would delete a folder with:

rm -rf folder_name

You must include -rf when doing a copy or cp

cp -r folder_name new_folder_name

-rf stands for recursive force. This will include the directory as well as all the files and subdirectories within.