Category Archives: Programming

Setting up Sidekiq and Redis on VPS

Sidekiq is useful for background Rails workers. Instead of tying up your rails server, it’s better to handle certain processes asynchronously.

Setting up Sidekiq on your VPS is simple.

Install Redis

With a Linode guide, install Redis. Make sure to use the latest Redis version (2.6.9 for me) instead of 2.2.2 as the guide discusses. Run [cci]sudo make test[/cci] to test your Redis setup. If all goes well, you should see [cci]\o/ All tests passed without errors![/cci]. The Linode guide will also go over the Deploy Init Script so that your Redis starts up when you reboot your VPS.

Config Capistrano File

With Capistrano, you need to edit your [cci]config/deploy.rb[/cci] to include the line [cci]require ‘sidekiq/capistrano'[/cci]. [cci]For config/sidekiq.yml[/cci] options, see the Sidekiq wiki.

That’s it. Make sure to have your server rebooted so that Redis is running on the default port, and Sidekiq can access Redis upon your [cci]cap deploy[/cci].

How jQuery text method works in JavaScript

jQuery has a popular method for accessing the text contents of a targeted DOM node named [cci].text()[/cci]. It allows you to either get the text content or set the text content.

For example, using [cci]text()[/cci] on [cci]$(‘#test’)[/cci] returns [cci]foobar[/cci] below:
[cc]

foobar

$(‘#test’).text(); //=> returns ‘foobar’
[/cc]

By using [cci]text()[/cci] with a parameter, you can set the text to the passed in parameter.
[cc]

foobar

$(‘#test’).text(“cupcakes”); // sets the value to ‘cupcakes’
$(‘#test’).text(); //=> returns ‘cupcakes’
[/cc]

There is a similar jQuery method named [cci]html()[/cci]. It returns the html contents within the targeted DOM node.
[cc]

foobar

$(‘#test’).html(); //=> returns ‘foobar
[/cc]

Before we dive into the jQuery source, we can guess that jQuery uses textContent.

In the jQuery source, you can see on line 5702:
[cc]
jQuery.fn.extend({
text: function( value ) {
return jQuery.access( this, function( value ) {
return value === undefined ?
jQuery.text( this ) :
this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
}, null, value, arguments.length );
},
[/cc]

jQuery checks the passed in parameter [cci]value[/cci] using a ternary operator. If [cci]value[/cci] is [cci]undefined[/cci], then jQuery calls [cci]text[/cci]. Else, jQuery sets the value with [cci]createTextNode[/cci].

[cci]jQuery.access[/cci] on line 784 allows jQuery to determine if the value is defined or undefined.

If undefined, [cci]jQuery.text( this )[/cci] runs.

[cc]
// line 5348:
jQuery.text = Sizzle.getText;
[/cc]

Sizzle’s getText looks like:

[cc]
/**
* Utility function for retrieving the text value of an array of DOM nodes
* @param {Array|Element} elem
*/
getText = Sizzle.getText = function( elem ) {
var node,
ret = “”,
i = 0,
nodeType = elem.nodeType;

if ( nodeType ) {
if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
// Use textContent for elements
// innerText usage removed for consistency of new lines (see #11153)
if ( typeof elem.textContent === “string” ) {
return elem.textContent;
} else {
// Traverse its children
for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
ret += getText( elem );
}
}
} else if ( nodeType === 3 || nodeType === 4 ) {
return elem.nodeValue;
}
// Do not include comment or processing instruction nodes
} else {

// If no nodeType, this is expected to be an array
for ( ; (node = elem[i]); i++ ) {
// Do not traverse comment nodes
ret += getText( node );
}
}
return ret;
};
[/cc]

You can see that jQuery either returns the string with [cci]textContent[/cci]

[cc]
// Use textContent for elements
// innerText usage removed for consistency of new lines (see #11153)
if ( typeof elem.textContent === “string” ) {
return elem.textContent;
}
[/cc]

or jQuery will traverse the DOM and append them into the [cci]ret[/cci] variable (initialized as as empty string) to return.

[cc]
// Traverse its children
for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
ret += getText( elem );
}
[/cc]

If you are passing in a param value into [cci]text()[/cci], then jQuery will empty out the contents of the targeted DOM node and use createTextNode to allow your passed in param to show up.

[cc]
this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
[/cc]

If you are interested in using Core JavaScript to replicate jQuery’s [cci]text()[/cci], you could try the following:

[cc]

lion

var div = document.querySelectorAll(“#test”);
div[0].textContent; //=> returns ‘lion’
[/cc]

This targets the [cci]#test[/cci] div and get the text content.

[cc]

var div = document.querySelectorAll(“#test”);
div[0].appendChild(document.createTextNode(‘pizza’));
[/cc]

This is one way to set the div contents to display ‘pizza’.

Thanks for tuning into to another jQuery without jQuery. Diving into the source code is great for helping you understand how it all works.

jQuery without jQuery is a series that aims to open up the jQuery black box. jQuery is just JavaScript, so you should feel comfortable working at lower levels of abstraction and looking at the jQuery source code written in JavaScript.

jQuery DOM ready handlers

As you work with JavaScript & jQuery, you will quickly get accustomed to wrapping your JS scripts with a DOM ready check. You generally want to do this, because you don’t want your DOM-manipulating JS to run before the DOM is fully loaded.

The standard jQuery ready function is:

[cc]
$(document).ready(function(){
// Your code here
});
[/cc]

If you’ve seen the jQuery ready shortcut, you can also use this (equivalent to the above):

[cc]
$(function() {
// Your code here
});
[/cc]

How does this work? Diving into jQuery source, you can see on line 173 that jQuery checks if what is passed in is a function and applies [cci]ready[/cci] to it:

[cc]
// HANDLE: $(function)
// Shortcut for document ready
} else if ( jQuery.isFunction( selector ) ) {
return rootjQuery.ready( selector );
}
[/cc]

Also, I want to show how you could wrap your JS code without jQuery. Traditionally, it looks like this:

[cc]
window.onload = function(){
// Your code here
}
[/cc]

Note the traditional way using [cci]window.onload[/cci] will happen later than jQuery’s [cci]ready[/cci] event. Code snippets to run your JS upon DOM ready without jQuery are available online.

Finally, if you want to wait for both the DOM and complete page (including all frames, objects and images) to be loaded using jQuery, you can use:

[cc]
$(window).load(function() {
// Your code here
});
[/cc]

Running JS with jQuery upon DOM ready is simple. Using the jQuery ready shortcut is easy and works well.

jQuery without jQuery is a series that aims to open up the jQuery black box. jQuery is just JavaScript, so you should feel comfortable working at lower levels of abstraction and looking at the jQuery source code written in JavaScript.

How jQuery CSS selector works

Diving into jQuery source code, you’ll find attribution for [cci]Sizzle.js[/cci] near the top. What is Sizzle? Sizzle is jQuery’s spinoff CSS selector engine.

jQuery is optimized for easy DOM manipulation and allows method chaining by returning the jQuery object. This means that the [cci]jQuery[/cci] (or [cci]$[/cci] shorthand syntax) allows you to target DOM elements with CSS syntax.

You can select a paragraph with the id “dino” in jQuery:

[cc]$(‘p#dino’)[/cc]

Pretty easy, right? How does jQuery do this?

BigBinary has a great article walking through the process:

  • If querySelectorAll works, use querySelectorAll.
  • Else, use Sizzle.

To use [cci]querySelectorAll[/cci] instead of jQuery, you could use:

[cc]document.querySelectorAll(‘p#dino’)[/cc]

This goes to show that anything jQuery can do, core JavaScript can do (since jQuery is JavaScript). With that said, I would recommend jQuery over writing your own JavaScript from scratch as jQuery is highly tested for edge cases and offers amazing cross browser support.

jQuery without jQuery is a series that aims to open up the jQuery black box. jQuery is just JavaScript, so you should feel comfortable working at lower levels of abstraction and looking at the jQuery source code written in JavaScript.

Javascript While Loop Decrement Explained

While watching Paul Irish : 10 Things I Learned from the jQuery Source, his code at the 31:30 mark looks like similar to this:

[cc]
var times = [42, 28, 75, 50, 62]
times = times[Math.floor(Math.random()*times.length)]

while (–times) {
do_something();
}
[/cc]

Not accustomed to seeing [cci]–[/cci], I wanted to research and explain what this snippet does. Paul’s code picks a random number in the [cci]times[/cci] array and runs [cci]do_something()[/cci] while [cci]times[/cci] is greater than 0.

The line by line breakdown looks like this:

[cc]
var times = [42, 28, 75, 50, 62]
[/cc]
Set the variable [cci]times[/cci] equal to an array of integers.
[cc]
times = times[Math.floor(Math.random()*times.length)]
[/cc]
Set [cci]times[/cci] equal to an integer chosen at random. [cci]Math.floor()[/cci] rounds down the integer. [cci]Math.random()[/cci] returns a random value between 0 and 1. [cci]times.length[/cci] returns the number of items in the [cci]times[/cci] array.
[cc]
while (–times) {
[/cc]
[cci]–times[/cci] runs the while loop while times is greater than zero. For instance, if times was 75, you can see that the while loop runs for the numbers 74 to 1, inclusive. Try it out in the JSFiddle.
[cc]
do_something();
[/cc]
[cci]do_something();[/cci] runs the function defined elsewhere.

Paul’s screencast is helpful, and diving into jQuery source is tremendously helpful.

Convert a Ruby Hash into valid JSON

This post is about how to get a valid JSON (JavaScript Object Notation) snippet from a Ruby Hash.

In the world of Ruby, Ruby loves hashes. It’s great because it allows you to access values with keys. With [cci]require ‘json'[/cci], you can easily parse a JSON formatted string into a Ruby hash with [cci]JSON.parse(json_string)[/cci]. You can easily tell hashes by their hash rockets ([cci]=>[/cci]) and JSON by its usage of colons ([cci]:[/cci]).

[cc]
require ‘json’
animal_count = {“tiger”=>3, “lion”=>2, “dog”=>2, “cat”=>3, “mouse”=>1, “bear”=>1, “frog”=>2, “fish”=>1}
animal_count.class #=> Hash
animal_count.methods #=> :to_json
[/cc]

By using [cci]require ‘json'[/cci], you get access to the [cci]to_json[/cci] method on hashes. Unfortunately, they look like this:

[cc]
json_animals = animal_count.to_json #=> “{\”tiger\”:3, \”lion\”:2, \”dog\”:2, \”cat\”:3, \”mouse\”:1, \”bear\”:1, \”frog\”:2, \”fish\”:1}”
json_animals.class #=> String
[/cc]

If you paste the string [cci]”{\”tiger\”:3,\”lion\”:2,\”dog\”:2,\”cat\”:3,[/cci]
[cci]\”mouse\”:1,\”bear\”:1,\”frog\”:2,\”fish\”:1}”[/cci] into JSON Lint, you’ll find that it’s invalid JSON due to a Parse Error.

The backslash character ([cci]\[/cci]) is there to escape the quotes for serialization (Ruby object to transportable string) and deserialization (string to Ruby object).

The good news is that the solution in IRB is extremely easy.

[cc]
puts json_animals #=> {“tiger”:3,”lion”:2,”dog”:2,”cat”:3,”mouse”:1,”bear”:1,”frog”:2,”fish”:1}
[/cc]

With [cci]puts[/cci], the new return String passes JSON Lint as Valid JSON.

Using [cci]puts[/cci] may seem obvious, but it’s the seemingly small things like this that make all the difference in the world. One is properly escaped but invalid, while the other is valid, usable JSON.

(Thanks to Avi for helping me with this @Flatironschool)

How to count Ruby Array items

While working in Ruby, I often find myself trying to get a count of the number of times each item appears in an array. Below, I’ll show you how to create a Hash that iterates through each item in the array and counts the number of occurrences.

We have an array of [cci]animals[/cci] that we want to count.

[cc]animals = [“tiger”,
“tiger”,
“lion”,
“dog”,
“cat”,
“mouse”,
“bear”,
“frog”,
“tiger”,
“lion”,
“frog”,
“fish”,
“cat”,
“dog”,
“cat”
][/cc]
We can count them up by creating a new Hash.

[cc]animal_count = Hash.new(0)[/cc]

Next, we want to iterate through the [cci]animals[/cci] Array and set the [cci]animal_count[/cci] Key as the animal name & the [cci]animal_count[/cci] Value as the counter.

[cc]animals.each { |animal| animal_count[animal] += 1 }[/cc]

For each [cci]animal[/cci] in [cci]animals[/cci], we’ve either created a new Key / Value pair in [cci]animal_count[/cci] or incremented the Value corresponding to the [cci]animal[/cci] Key.
[cc]puts animal_count
#=> {“tiger”=>3, “lion”=>2, “dog”=>2, “cat”=>3, “mouse”=>1, “bear”=>1, “frog”=>2, “fish”=>1} [/cc]

How to Close a Git Pull Request

With a git workflow, you become used to commands like [cci]git add filename[/cci] and [cci]git commit -m “add filename”[/cci]. When you maintain an open source project and get a pull request, the exact workflow may get murky. How do you review the pull request work? How do you accept the commit if it passes muster?

This post will cover how to review, accept, and close a GitHub pull request.

In our example, we are the creator of a popular open source project called breakfast-sandwich. In our rush to get the product out, we forgot a critical piece – the breakfast sandwich has no cheese! Luckily, our project is open source and we’ve already received a pull request to add cheese to our sandwich.

Here’s the ingredients [cci]list.txt[/cci] file initial state, missing cheese:

[cc]# ingredients list
* english muffin
* eggs
* sausage [/cc]

Here’s the pull request on GitHub:

Pull Request

A pull request received

The Pull Request detail

The Pull Request detail

1. Add the fork’s pull request repo as a remote

[cc]$ git remote add xta https://github.com/xta/breakfast-sandwich.git[/cc]

You can verify that the remote [cci]xta[/cci] has been added by running the [cci]git remote[/cci] command.

2. Fetch the git data from remote

[cc]$ git fetch xta
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 3 (delta 0)
Unpacking objects: 100% (3/3), done.
From https://github.com/xta/breakfast-sandwich
* [new branch] add-cheese-to-list -> xta/add-cheese-to-list
* [new branch] master -> xta/master[/cc]

3. Checkout the remote branch

[cc]$ git co xta/master
Note: checking out ‘xta/master’.
You are in ‘detached HEAD’ state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
git checkout -b new_branch_name
HEAD is now at be7c26d… add cheese to ingredients list[/cc]

4. Checkout to a new test branch

[cc]$ git co -b “test-add-ingredient”
Switched to a new branch ‘test-add-ingredient'[/cc]

5. Test the current branch

For this step, you would need to perform whatever steps your project deems appropriate before accepting a pull request.

We can open up [cci]list.txt[/cci] and see that it now contains cheese:

[cc]# ingredients list
* english muffin
* eggs
* sausage
* cheese[/cc]

As the updated ingredients from [cci]xta/master[/cci] pass our critiera, we need to merge it back into master branch.

6. Check your feature branch against master to make sure any merge conflicts happen in your feature branch

[cc]$ git rebase master
Current branch test-add-ingredient is up to date.[/cc]

7. Merge feature branch into master

First, switch to master branch:

[cc]$ git co master
Switched to branch ‘master'[/cc]

Then merge the feature branch into master.

[cc]$ git merge test-add-ingredient
Updating 5004985..be7c26d
Fast-forward
list.txt | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)[/cc]

8. Push your master onto GitHub

Great job! We’ve reviewed the feature branch, merged it into master locally. So now, we need to make sure the internet has access to our open source breakfast sandwich that includes cheese.

[cc]$ git push
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 343 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github-xtatest:xtatest/breakfast-sandwich.git
5004985..be7c26d master -> master[/cc]

When you look at your GitHub repo, you’ll see that the pull request is now closed. Most importantly, our breakfast sandwich has cheese!

Closed Pull Request

Closed Pull Request

Halloween Bash Profile Generator Demo

In Flatiron School, one of the first things we did was setup our bash environment. Many existing web resources for customizing your .bash_profile involved lots of reading, so I decided to make a tool so that anyone could spend a couple minutes with WYSIWYG instead of an hour reading online discussions.

HalloweenBash, a bash profile generator, was made to be as easy to use as possible. It doesn’t have every possible feature, but it updates instantly with a live preview.

The bash preview box shows what your bash will look like when you copy the text in box #3 into your ~/.bash_profile file. Box #1 and #2 allow you to drag and drop elements and click on color choices, respectively.

In this Screencast, I’ll show you step-by-step how easy it is to use:

If you have any questions or feedback, please don’t hesitate to reach out to me @rexfeng.

HalloweenBash is available on GitHub.

5 Essential Terminal Shortcuts

Terminal screen

The first time you see the Terminal screen, it’s very intimidating. “What am I supposed to do here How do I navigate? What can I type?” Over time, [cci]cd[/cci]-ing and [cci]ls[/cci]-ing will become second nature. Using a Command Line Interface (Terminal) is simply more efficient than leaving the comfortable home position to drag the mouse a few inches.

In OS X, Terminal wraps the Bash (Unix shell) application. I’ve learned some essential Bash shortcuts that will help you save time and be more efficient.

  1. [Tab]
    Command-line completion is amazing. Bash will automatically fill in partially typed commands. If you have a file named “profile-page.html” and hit [Tab] while typing out the first few letters, the rest of the file name will likely be auto completed for you.
  2. [cci]ls -a[/cci]
    While you probably know about typing [cci]ls[/cci] in a directory to show all files, typing [cci]ls -a[/cci] will let Bash show you all files (including the hidden ones) that Finder won’t show you by default.
  3. [cci]touch [/cci][file_name]
    The touch command takes in a file_name argument that is the file name created on the spot.
  4. [Cmd+T]
    Create tabs with [Cmd+T] Do you remember the first time you tried Firefox several years ago? Tabs are your friends.
  5. [cci]open [/cci] [target]
    The open command followed by the folder or file name will let you open up files in their default application.

Working out of the Terminal is amazing. If you’re interested in more power tips, I’d recommend reading about alias and subl symlink.