Close

The Truth About the The Complete iOS 9 and Swift Course by Rob Percival

This is my review of Rob Percival’s Complete iOS9 and Swift course on Udemy. I’m writing this review because it’s a very popular course on Udemy and a topic I know my audience is interested in… so I want to help you decide if it’s the right course for you.

Here’s my review of the course:

Overview

The Complete iOS9 and Swift course is meant to be an in-depth treatment of building iOS apps using Swift. In the course you’ll learn the following topics:

  • XCode and Interface Builder
  • Inputs, Buttons, and Reactive Interfaces
  • Apple’s New Programming Language: Swift
  • Variables, Arrays, Tables, and Loops
  • Navigation, Storage, and Live Content
  • Images, Maps and Music
  • Accelerometers and Motion Feedback
  • Core Data and JSON
  • Online Storage With Parse
  • Games and the Sprite Kit
  • Instagram and Snapchat Clones
  • App Store Submission
  • Making a Marketing Website For Your App

A comprehensive list to say the least. With that massive list of topics, the course boasts 207 lessons and 29 hours of content. You also build 18 real-world apps including Instagram, Tinder, Snapchat, Flappy Bird & Uber Clones .

Teacher

The course is taught by Rob Percival. Rob has a degree in Mathematics from Cambridge University and spent the first part of his career as a math teacher.

After building websites in his spare time for friends and family, he realized he enjoyed web development and it was a lucrative career so he gave up teaching to become a web developer full-time.

Here’s what I like about Rob’s teaching style:

  • He’s well-spoken and clear in his communication
  • As a former teacher, he can communicate complex concepts in easy-to-understand terms
  • He’s very knowledgeable regarding web development
  • He’s active in the course chat and answers questions promptly
  • He’s to the point and doesn’t drone on and on

Here’s some things I wish were better:

  • I think he speaks a bit too closely to the microphone and there are some “pops” in the audio
  • You catch some of the background mouse clicks, etc.

The audio is crisp and clear and there’s no concern about hearing what he’s saying… but after 29 hours you start to notice the few minor audio hiccups.

Who Is the Course For?

I believe this course is a great fit for developers who fall into the following categories:

  • Full-stack web developers looking to round out their complete development skills
  • Aspiring game developers looking to build apps for iOS
  • Intermediate developers who want to ensure they know everything they need to
  • You’re self-taught and looking for clear outline of what you need to learn
  • You’re just out of college and feel like you’re missing some of the in-demand skills

Who Is the Course NOT For?

I believe the course won’t be useful to developers in the following categories:

  • You’re an advanced developer looking for very advanced topics
  • You prefer written tutorials over video tutorials

Pros and Cons of the Course

Here’s a list of the pros:

  • It really is complete covering all the essential topics
  • Rob is a talented teacher who explains things well
  • Rob is entertaining and keeps you engaged throughout the lessons
  • The course is laid out intelligently
  • The video quality is excellent
  • Rob is active in the chat and answers questions
  • It has a large student base (64,754+) so you have lots of other developers to learn with

Here’s a list of the cons:

  • I wish some parts were explained with a touch more detail
  • It’s a technical topic but a few parts got a bit slow
  • A bit more detail on Swift
  • At $199, the price can be prohibitive for some (I’ve solved this)

How Do You Get the Course?

The Complete iOS9 and Swift course is available on Udemy for a fee of $199. The good news is that I’ve worked out a deal with Rob for my online audience and he’s agreed to offer you a 75% discount on the course.

If you purchase his course through my affiliate link, you’ll get the 75% discount:

Click here for the 75% discount

Full disclosure: I will (at NO cost to you) earn a small commission if you purchase the course through that link. I wouldn’t recommend the course if I didn’t believe it would truly help you. The small commission is just a side benefit.

Special Bonus

I believe strongly enough that this course will really help most up and coming web developers that I wanted to offer a special bonus with Rob’s course to help give you every reason to invest in it.

So, if you purchase the course through my affiliate link I will send you my revised Web Developer Learning Guide where I outline the order in which I would learn the various skills necessary for a web developer.

To get the bonus, follow these steps:

1. Purchase the course through my affiliate link 75% off

2. Forward your Udemy invoice to cwdc at johnmorrisonline dot com and I’ll email you the Web Developer Learning Guide PDF.

June 25, 2015

Top 10 Web Development Courses on Udemy

This is my list of the top 10 web development courses on Udemy. My reviews are based on my experience with the course and my 10+ years experience as a web developer.

I am an affiliate for Udemy, so if you choose to purchase a course using my discount links below I will (at no cost to you) earn a small commission.

But, my reviews are based purely on my objective opinion of the courses.

So, here’s my top 10:

1. Complete Web Developer Course – Build 14 Websites

This is #1 because it’s the most comprehensive web development course I’ve found on Udemy. It has 235 lectures and 18+ hours of content. It covers HTML, CSS, JavaScript, jQuery, PHP, MySQL, WordPress, APIs, Mobile Apps and more. It retails for $199, but you can get it 25% off with this coupon code.

Read My Full Review Learn More on Udemy

2. Multi Page Online Form With PHP, MySQL and Session Variables Course

This course is in my top 10 for the sheer awesome-ness of the end result. Sebastian shows you how to create a great-looking multi-page form that retains its values from page to page and stores the results in a database. It’s a very slick form and worth looking at the demo video just to see what’s possible.

Learn More on Udemy

3. The Complete iOS 9 and Swift Course: Learn by Building 15 Real-World Apps

This course comes in #3 because of the value of learning to develop iOS apps and just how comprehensive it is. Rob has a knack for these kinds of courses. This one boasts 207 lectures and over 29 hours of content and you’ll build 15 real-world apps throughout the course. It retails for $199 but get it 25% off with this coupon code.

Read My Full Review Learn More on Udemy

4. Build Websites From Scratch With HTML and CSS

This is one of the more advanced HTML and CSS courses I’ve found. What makes it great is the detail Brad goes into. If you want to really dig and master HTML and CSS at a high level, this is the course. It retails for $149 but get it 25% off with this coupon code.

Read My Full Review Learn More on Udemy

5. Learn and Understand AngularJS

This course makes the list because it really does simplify learning AngularJS and covers one of the up and coming frameworks developers will need to know going forward. Anthony is an experienced developer who’s been coding since 12 years old and explains Angular JS in a way that makes quicker to grasp and use. It retails for $99 but get it 25% off with this coupon code.

Read My Full Review Learn More on Udemy

6. WordPress Theme Development With Bootstrap

WordPress has become a must for web developers. I chose this course because it shows you how to build WordPress themes using Bootstrap which is my personal favorite combination… and is frankly about 100 times easier than starting from scratch. You’ll build a full WordPress theme in this course. It retails for $197 but get it 25% off with this coupon code.

Learn More on Udemy

7. Responsive Web Design AND Web Development with HTML5 & CSS3

Responsive web design IS web design. If you want to be a web developer, you need to know this. And with 77 lectures and over 12 hours of content this course will teach everything you need to know plus all the fancy tricks to make your responsive sites really stand out. It retails for $199 but get it 25% off with this coupon code.

Learn More on Udemy

8. The Complete Apple Watch Developer Course – Build 14 Apps

I’m and Android guy… but there’s no denying the Apple Watch is taking off. As a developer, you can tap into a huge opportunity for more clients and career opportunities by being ahead of the curve on trends like this. In this course, you’ll build 14 Apple Watch apps and master app-building for this new form factor. It retails for $199 but get it 25% off with this coupon code.

Learn More on Udemy

9. Writing Secure PHP Code

This is probably the most overlooked topic for new developers.. but the most critical. This course is great because it actually explains the different types of attacks hackers will try to make against your sites and applications then shows you how to write your code to deal with all of them. This course is a must for serious developers.

Learn More on Udemy

10. User Experience Design Fundamentals

Another fairly overlooked topic but so important. Being able to write code isn’t enough… you need to know how to design applications that people will actually use. This skill can be put you head and shoulders above other developers because so few take this serious.

Learn More on Udemy

June 20, 2015

Prevent XSS Attacks. Escape Strings in PHP

Here’s how to prevent XSS attacks by escaping output in PHP:

Here’s the code I used in the video:

<?php
function _e($string) {
echo htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
//echo htmlentities($string, ENT_QUOTES, 'UTF-8');
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Escape Output</title>
</head>
<body>
<?php _e('This is a problem: <script>alert("Yikes");</script>'); ?>
</body>
</html>

What Is XSS?

XSS stands for cross-site scripting and it refers to a type of attack where a hacker injects malicious client-side code into the output of your page.

Applications that don’t escape their output are vulnerable to this type of attack.

XSS Example

A simple example is a blog comment. If not properly escaped, an attacker could enter (for example) JavaScript code into the blog comment.

That code would be stored in the database, output to the page when loaded, and because it’s not escaped… render and run.

Thus, the attacker would have the full range of JavaScript capabilities to attack you and your site visitors.

How to Prevent XSS Attacks

As illustrated in the video above, you prevent XSS attacks by escaping your output using htmlspecialchars() or htmlentities().

Both PHP functions convert problematic characters into HTML entities causing the injected code to be output harmlessly and not rendered.

htmlentities vs htmlspecialchars

Both will prevent XSS attacks. The difference is in the characters each encodes. htmlentities will encode ANY character that has an HTML entity equivalent.

htmlspecialchars ONLY encodes a small set of the most problematic characters.

It’s generally recommended to use htmlspecialchars because htmlentities can cause display problems with your text depending on what characters are being output.

Think of htmlspecialchars as a scalpel and htmlentities as a hammer. Both can solve the problem… one is just a little more precise.

If you get value from this code snippet, please consider sharing it with another developer or group who could benefit from it.

June 18, 2015

Coupon Code for the Build Websites From Scratch With HTML and CSS Course on Udemy

The Build Websites From Scratch With HTML and CSS course on Udemy is a step-by-step look at building websites using HTML and CSS. The course covers these topics:

  • Building your first web page
  • DOCTYPE
  • Hyperlinks
  • Images
  • Tables
  • Forms
  • HTML5
  • Inline Styles
  • External Styles
  • Selectors
  • Classes and IDs
  • Inheritance
  • Pixels vs ems
  • And a bunch more

You can check out my full review of the Build Websites From Scratch With HTML and CSS course here if you still have questions. Otherwise, you can use the special link below for an 73% off coupon to the course:

[evd_link_tracker text=”Click here for the 73% off coupon code” u1base=”jmohtmlcsscoupon” url=”http://www.johnmorrisonline.com/go?id=htmlcss”]

That is an affiliate link and I will earn a small commission (at NO cost to you) when you purchase the course through that link.

June 8, 2015

The Truth About the Build Websites From Scratch With HTML and CSS Course by Brad Hussey

This is my review of Brad Hussey’s Build Websites From Scratch With HTML and CSS course on Udemy. I’m writing this review because it’s a very popular course on Udemy and a topic I know my audience is interested in… so I want to help you decide if it’s the right course for you.

Here’s my review of the course:

Overview

The Build Websites From Scratch With HTML and CSS course is meant to be an in-depth treatment of both HTML and CSS covering topics such as:

  • Building your first web page
  • DOCTYPE
  • Hyperlinks
  • Images
  • Tables
  • Forms
  • HTML5
  • Inline Styles
  • External Styles
  • Selectors
  • Classes and IDs
  • Inheritance
  • Pixels vs ems
  • And a bunch more

A comprehensive list to say the least. With that massive list of topics, the course boasts 77 lessons and 9 hours of content. You also build several HTML and CSS examples, web pages and websites along the way.

Teacher

The course is taught by Brad Hussey. Brad is a full-time web designer and developer building websites everyday for his clientele so he has a good grasp of what you really need to know to be successful.

Here’s what I like about Brad’s teaching style:

  • He speaks clearly and is easy to understand
  • He’s entertaining and keeps the lessons fun and engaging
  • He’s direct and to the point
  • He obviously knows HTML and CSS very well
  • He keeps is his lesson short so they’re easy to consume

Here’s some things I wish were better:

  • His demos are on a Mac with a Mac code editor. Not a big deal but would’ve been nice to see a PC editor too.
  • Some of the more super advanced topics aren’t covered like animations, transformations, iframes, etc.
  • He types a bit fast. 🙂

That said, I really am being picky.

Who Is the Course For?

I believe this course is a great fit for developers who fall into the following categories:

  • You’re brand new to HTML and CSS and want the fastest learning path
  • You’re an intermediate developer who needs a good refresher
  • You’re self-taught and looking for clear outline of what you need to learn
  • You’re just out of college and feel like you’re missing some of the in-demand skills

Who Is the Course NOT For?

I believe the course won’t be useful to developers in the following categories:

  • You’re an advanced developer looking for very advanced topics
  • You prefer written tutorials over video tutorials

Pros and Cons of the Course

Here’s a list of the pros:

  • It really is complete covering all the essential topics
  • Brad is a talented teacher who explains things well
  • Brad is entertaining and keeps you engaged throughout the lessons
  • The course is laid out intelligently
  • The video quality is excellent
  • Brad is active in the chat and answers questions
  • It has a large student base (39,000+) so you have lots of other developers to learn with

Here’s a list of the cons:

  • The use of the Mac editor I mentioned
  • Brad types a bit fast
  • At $149, the price can be prohibitive for some (I’ve solved this)

How Do You Get the Course?

The Build Websites From Scratch With HTML and CSS course is available on Udemy for a fee of $149. The good news is that I’ve worked out a deal with Brad for my online audience and he’s agreed to offer you a 25% discount on the course.

If you purchase his course through my affiliate link, you’ll get the 25% discount:

Click here for the 25% discount

Full disclosure: I will (at NO cost to you) earn a small commission if you purchase the course through that link. I wouldn’t recommend the course if I didn’t believe it would truly help you. The small commission is just a side benefit.

Special Bonus

I believe strongly enough that this course will really help most up and coming web developers that I wanted to offer a special bonus with Brad’s course to help give you every reason to invest in it.

So, if you purchase the course through my affiliate link I will send you my revised Web Developer Learning Guide where I outline the order in which I would learn the various skills necessary for a web developer.

To get the bonus, follow these steps:

1. Purchase the course through my affiliate link 25% off

2. Forward your Udemy invoice to cwdc at johnmorrisonline dot com and I’ll email you the Web Developer Learning Guide PDF.

June 8, 2015

Simple CSS Button Styles Tutorial and Code

Here’s how to create some simple CSS button styles:

Here’s the code I used in the video:

<!DOCTYPE html>
<html>
<head>
<title>CSS Buttons</title>
<style>
.btn {
display: inline-block;
border: none;
padding: 6px 12px;
margin-bottom: 0;
font-size: 14px;
font-weight: normal;
text-align: center;
cursor: pointer;
border-radius: 4px;
}

.btn-lg {
padding: 10px 16px;
font-size: 18px;
border-radius: 6px;
}

.btn-sm {
padding: 5px 10px;
font-size: 12px;
border-radius: 3px;
}

.btn-success {
color: #fff;
background-color: #5cb85c;
border-color: #4cae4c;
}

.btn-success:hover,
.btn-success:focus,
.btn-success:active {
color: #fff;
background-color: #449d44;
border-color: #398439;
}
</style>
</head>
<body>
<p><button>Submit</button></p>
<p><button class="btn">Submit</button></p>
<p><button class="btn btn-sm">Submit</button></p>
<p><button class="btn btn-lg">Submit</button></p>
<p><button class="btn btn-success">Submit</button></p>
<p><button class="btn btn-success btn-sm">Submit</button></p>
<p><button class="btn btn-success btn-lg">Submit</button></p>
</body>
</html>

If you get value from this code snippet, please consider sharing it with another developer or group who could benefit from it.

June 4, 2015

PHP Try Catch Error Handling

How do you PHP try catch blocks to efficiently handle errors? Here’s the answer:

Here’s the code I used in the video:

<pre>
<?php
try {
echo "Try to do something here.<br />";
throw new Exception("Yikes. Something went funky.<br />", 234);
} catch (Exception $e) {
//print_r($e);
echo $e->getMessage();
} finally {
echo "This will always run in our try block.<br />";
}

// try {
// // connect (create a new MySQLi object)
// $mysqli = new MySQLi('localhost', 'root', 'root', 'snippet');

// if (mysqli_connect_error()) {
// throw new Exception(mysqli_connect_error());
// }

// $sql = "SELECT * FROM search LIMIT 10";
// $result = $mysqli->query($sql);

// if (!$result) {
// throw new Exception($mysqli->error);
// }

// while($row = $result->fetch_object()) {
// $results[] = $row;
// }
// }
// catch (Exception $e)
// {
// echo 'We are having issues. Here is how to get help.';
// }

// print_r($results);
?>
</pre>

If you get value from this code snippet, please consider sharing it with another developer or group who could benefit from it.

May 28, 2015

How to Create a PHP 301 Header Redirect Script

How do you implement a 301 header redirect in PHP? Here’s the answer and how to do it:

Here’s the code I used in the video:

<?php
/**
* PHP Redirect Script
*
* @author http://johnmorrisonline.com
*/

// Map IDs to URLs
$accepted_ids = array(
'goog' => 'http://www.google.com',
);

// Die on no ID
if ( !isset( $_GET['id'] ) ) {
die('Oops. Need an ID');
}

// Set ID
$id = $_GET['id'];

// Die on ID not supported
if ( ! in_array( $id, array_keys( $accepted_ids ) ) ) {
die('Oops. That ID is not supported.');
}

// Get campaign if set
if ( isset( $_GET['utm_campaign'] ) ) {
$campaign = $_GET['utm_campaign'];
}

// Create redirect
$redirect = sprintf('%s?q=%s', $accepted_ids[$id], $campaign);

// Run the redirect
//echo $redirect;
header("HTTP/1.1 301 Moved Permanently");
header("Location: {$redirect}");

// Exit
exit;

If you get value from this code snippet, please consider sharing it with another developer or group who could benefit from it.

May 21, 2015

MD5, SHA-1 or BCRYPT For Hashing and Storing Passwords in PHP?

Should you use MD5, SHA-1 or BCRYPT when hashing and storing passwords using PHP? Here’s the answer and how to do it:

Here’s the code I used in the video:

<?php
/**
* Performs password hashing
*
* This class is used to perform common password hashing routines
*
* @version 1.0
* @author John Morris <support@johnmorrisonline.com>
*/
class Hash_Password {
/**
* Hashing algorithm
* @access private
* $var int
*/
private $algorithm = PASSWORD_DEFAULT;

/**
* Hashing options
* @access private
* $var array
*/
private $options;

/**
* Constructor
*
* Sets up class options
*/
public function __construct() {
$this->options = array(
// Add SALT and cost options here if desired
);
}

/**
* Hash and store password
*
* Hashes the password then stores it in the database
*
* @param string $password The password to hash and store
*
* @return boolen true/false True if hash and store is successful. False if not
*/
public function hash_and_store($password) {
// Hash the password
$hash = $this->hash( $password );

// Check for successful hashing
if ( ! $hash ) {
return false;
}

// Store password in database
// Check if storing was successful. Return false if not

return true;
}

/**
* Verify password
*
* Gets the hash from the database and verifies user-submitted password
*
* @param string $password The password to check
*
* @return boolean true/false True if password matches. False if not
*/
public function get_and_verify($password) {
// Get hash from database
$hash = '12lkjrelkjelkjrekjel';

// Check if user-submitted password matches hash
if ( $this->verify( $password, $hash ) ) {

// Check if password needs rehashed
if ( $this->needs_rehash( $hash ) ) {

// Rehash and store new hash
if ( ! $this->hash_and_store( $password ) ) {
return false;
}

}

return true;
}

return false;
}

/**
* Hashing method
*
* Hashes a password
*
* @param string $password The password to hash
*
* @return $string $hash The hashed password
*/
public function hash($password) {
return password_hash( $password, $this->algorithm, $this->options );
}

/**
* Verify method
*
* Verifies a password matches the hash
*
* @param string $password The plain text password to check
* @param string $hash The hash to check against
*
* @return boolean true/false True if it matches. False if not
*/
public function verify($password, $hash) {
return password_verify( $password, $hash );
}

/**
* Needs rehash method
*
* Checks if a hash needs rehashed. For new algorithms/options
*
* @param string $hash The hash to check for rehashing
*
* @return boolean true/false True if needs rehashing. False if not
*/
public function needs_rehash($hash) {
return password_needs_rehash($hash, $this->algorithm, $this->options );
}

/**
* Get hash info
*
* Gets the hashing algorithm and options used while hashing
*
* @param string $hash The hash to get info from
*
* @return array $info An associate array containing the hashing info
*/
public function get_info($hash) {
return password_get_info($hash);
}

/**
* Find cost
*
* This code will benchmark your server to determine how high of a cost you can
* afford. You want to set the highest cost that you can without slowing down
* you server too much. 8-10 is a good baseline, and more is good if your servers
* are fast enough. The code below aims for ≤ 50 milliseconds stretching time,
* which is a good baseline for systems handling interactive logins.
*
* @param int $baseline Baseline cost to start testing from
*
* @return int $cost Cost to use for server
*/
public function find_cost($baseline = 8) {
// Target time. 50 milliseconds is a good baseline
$time_target = 0.05;
$cost = $baseline;

// Run test
do {
$cost++;
$start = microtime( true );
password_hash( 'test', $this->algorithm, array( 'cost' => $cost ) );
$end = microtime( true );
} while( ( $end - $start ) < $time_target );

return $cost;
}
}

<?php
// Require password hashing class
require_once('/class-hash-password.php');

// Example password
$password = '1234567qwerty';

// Instantiate new instance of class
$hash_password = new Hash_Password();

// Hash a password
$hash = $hash_password->hash($password);

echo $hash;

// Spacer
echo '<br />';

// Verify a password
echo $hash_password->verify($password, $hash);

// Spacer
echo '<br />';

// Get hash info
print_r($hash_password->get_info($hash));

// Spacer
echo '<br />';

// Find appropriate cost
echo $hash_password->find_cost();

If you get value from this code snippet, please consider sharing it with another developer or group who could benefit from it.

May 12, 2015

Coupon Code for the Complete Web Developer Course on Udemy

The Complete Web Developer Course on Udemy is as the name says a comprehensive web development course for new to intermediate developers. The course covers these topics:

  • HTML
  • CSS
  • Javascript
  • jQuery
  • Twitter Bootstrap
  • WordPress
  • PHP
  • MySQL
  • APIs
  • Mobile Apps

You can check out my full review of the Complete Web Developer Course here if you still have questions. Otherwise, you can use the special link below for an 25% off coupon to the course:

Click here for the 25% off coupon code

That is an affiliate link and I will earn a small commission (at NO cost to you) when you purchase the course through that link.

icon

May 6, 2015

How to Insert Form Data Into a MySQL Database Using PHP

Why won’t my form data insert properly into my MySQL database? Here’s the most common reasons why:

Get the updated source code for this video here.

The two most common issues I see developers having are:

  1. Not connecting to MySQL properly
  2. Not matching form fields to database columns properly

Issues Connecting to MySQL

When you run into connection issues, you’ll usually see an error that will say there was a problem connecting to the database.

More often than not, it’s simply a typo in your database name, username, or password.

Make sure to triple-check that information. Also, keep in mind if you’re using source code I’ve provide you’ll need to change those values to whatever they are for YOUR database.

Issues Matching Form Fields to Database Columns

Almost always, this is caused by a mis-match between your form field names and your database column names.

In your SQL statement, you do the matching directly. Here’s a quick example:

INSERT INTO table_name (database_column_1, database_column_2) VALUES (form_field_1, form_field_2)

So you need to match the form field value to the database column.

I go much more in-depth with this in the video, so be sure to watch it if you’re having this problem.

If you enjoyed this tutorial and want to keep learning PHP, you can start taking my full course for free on my free tutorial site here: https://johnsfreetuts.com/php/

April 29, 2015

How to Validate an Email Address (By Domain) Using PHP

How can I validate an email address (by domain) using PHP? Here’s how:

Here’s the class that does all the heavy lifting and an example page for including and using the class:

<?php
/**
* Validates email addresses
*
* This class is used to validate email addresses using several different criteria.
*
* @version 1.0
* @author John Morris <support@johnmorrisonline.com>
*/
class validate_email {
/**
* Accepted domains
* @access private
* @var array
*/
private $accepted_domains;

/**
* The class constructor
*
* This sets up the class
*/
public function __construct() {
// Set the accepted domains property
$this->accepted_domains = array(
'unl.edu', 'uni.edu'
);
}

/**
* Validate email address by domain
*
* Checks if the email address belongs to an accepted domain
*/
public function validate_by_domain($email_address) {
// Get the domain from the email address
$domain = $this->get_domain( trim( $email_address ) );

// Check if domain is accepted. Return return if so
if ( in_array( $domain, $this->accepted_domains ) ) {
return true;
}

return false;
}

/**
* Get the domain
*
* Gets the domain from an email address
*/
private function get_domain($email_address) {
// Check if a valid email address was submitted
if ( ! $this->is_email( $email_address ) ) {
return false;
}

// Split the email address at the @ symbol
$email_parts = explode( '@', $email_address );

// Pop off everything after the @ symbol
$domain = array_pop( $email_parts );

return $domain;
}

/**
* Check email address
*
* Checks if the submitted value is a valid email address
*/
private function is_email($email_address) {
// Filter submitted value to see if it's a proper email address
if ( filter_var ( $email_address, FILTER_VALIDATE_EMAIL ) ) {
return true;
}

return false;
}
}

<?php
require_once( dirname( __FILE__ ) . '/class-validate-email.php' );

$validate_email = new validate_email;

// Valid
if ( $validate_email->validate_by_domain('justin@unl.edu ') ) {
echo '<p>This is valid!</p>';
} else {
echo '<p>This is NOT valid!</p>';
}

// Valid
if ( $validate_email->validate_by_domain('jason@uni.edu') ) {
echo '<p>This is valid!</p>';
} else {
echo '<p>This is NOT valid!</p>';
}

// Not valid
if ( $validate_email->validate_by_domain('ramone@ui.edu') ) {
echo '<p>This is valid!</p>';
} else {
echo '<p>This is NOT valid!</p>';
}

These are the exact steps for using this:

  1. Include/require class-validate-email.php into your application or web page.
  2. Instantiate a new instance of the validate_email class.
  3. Pass the email address to the validate_email::validate_by_domain() method.

If you get value from this code snippet, please consider sharing it with another developer or group who could benefit from it.

April 28, 2015

How Important Are the oDesk Skills Tests?

Do the oDesk skills tests really matter when you consider the answers are available everywhere on the web?

Thing is, the upside of getting high scores on these tests is very limited; however, the downside of NOT having them is enormous.

Here’s what I mean:

Do the Tests Matter?

They matter in the sense that if they’re not there clients will wonder why.

Imagine a client looking at 10 different freelancer profiles. Nine of them have a PHP test with a score in the top 1% and one of them doesn’t have it at all.

That will stick out to them and could be enough for them to pass on your profile.

So, the prevalence of the tests on freelancer profiles makes them important have.

However…

Click here for my full list of web developer resources including my top recommended courses and tools.

You Won’t Instantly Get Clients Hiring You in Droves Because You Pass the PHP Test

The upside is very limited. Clients will see it, like that it’s there but it won’t do a ton to convince them to hire you.

Think of it as a hedge.

The tests are about eliminating a negative not generating a positive.

Especially, since a lot of clients know the answers are available all over the web. They don’t put a ton of stock in it.

But…

This Brings Up a Larger Issue

The truth is… there’s not ANY one thing on your profile that will suddenly make clients trust you enough to hire you.

It’s about ALL the things.

It’s about:

  1. Specializing and make a very specific offer on your profile
  2. Creating congruence among all the items ON your profile

Meaning, everything on your profile should be relevant to the specific offer you’re making.

Your headline, service description, photo, tests, certifications, job history, portfolio, testimonials… all of it.

I purposefully keep things I’ve done off my profile and website because it’s not perfectly relevant to what I’m offering.

Makes sense, but here’s the thing…

To Know and NOT Do Is Really Not To Know

I’ve mentioned a lot of this stuff before. Some of it I even harp on in almost every podcast I do.

The problem is, I see so few people still doing it… and it’s so fundamental to having success as a freelancer.

So, I challenge you to put this into action:

  1. Identify your niche. What specific offer can you make to clients?
  2. Upgrade your profile. What changes do you need to make so everything is relevant?
  3. Bid on RELEVANT jobs. What relevant jobs exist NOW that you can bid on?

Start doing these things and you should see more success.

April 22, 2015

What Are the Best Sources of Potential Freelance Jobs?

What are the best places to find quality, high-paying freelance jobs? A lot of freelancers struggle with this and frankly make mistakes in their approach.

But, making a simple switch in how you go about looking for freelance jobs you can open you up to a greater array of clients…

So you can get as much freelance work as you want. Here’s how:

Finding Freelance Jobs

I find a lot of freelancers believe in an “all-in” approach to freelancing.

  • They either go “all-in” with freelance sites or “all-in” with getting clients from their website.
  • They go “all-in” with oDesk or “all-in” with Freelancer.com (or whatever other network).
  • They go “all-in” with ABC strategy for getting clients or XYZ strategy.

The idea is to keep things simple. They already hate selling themselves so they’re going to do as little of it as possible.

It’s a losing approach.

Elance-oDesk had 2.8 million jobs posted to its sites in 2014. Freelancer.com has 7.5 million freelance jobs posted to its site.

In the United States, freelancers earned $715 billion in revenue.

Why cut yourself off from any of it?

The right approach is to leverage every aspect of the market in order to get jobs.

Be on Elance. Be on oDesk. Be on Freelancer.

Get work from your own website.

Diversify and put yourself where the jobs are and increase the opportunity for a client to come across your profile and hire you.

Still need to upgrade your web design skills? Here’s my top web developer resources to get you there.

It’s not that much more complex. You can use the same information on one site as the others.

And, if a client wants to give you money… do you really care that you have to login into Freelancer instead of oDesk?

(Hint: you shouldn’t)

So, snap out of it! Don’t worry so much about the “best” site… find the top 3-5 and be on ALL of them. The jobs are there.

Now, that you have the right approach…

What Are the Best Places to Find Potential Freelance Jobs?

First, you ultimately want to get the majority of your clients from your own website.

Freelance sites are designed to make you compete so you’ll always make less and work more when you get jobs from them.

So, #1 on the list is: yourdomain.com

From there, you have two distinct types of freelancing sites:

  1. Open networks
  2. Curated networks

Open networks like Elance, oDesk and Freelancer.com are easy to get approved on and have a high number of jobs available.

But, they also have millions of freelancers and the competition is fierce.

Plus, you will often find yourself competing on price and getting undercut by developers charging $5 or $10/hour.

There ARE ways around it… but it’s still annoying.

Curated sites like Crew, TopTal and Ziptask have a more rigorous application process… but once you’re approved they’re in the business of keeping you employed.

There’s a lot less competition and you’ll generally get paid more for what you do.

Which Freelance Site Should You Choose?

Again, the ultimate goal is get most of your work from your own website.

But, if you’re just starting out you’ll likely have to go with a site like Elance, oDesk or Freelancer.com, gain experience and build up your portfolio.

Once you’ve established yourself you can then move toward the curated sites and work on getting accepted there.

Eventually, you’ll build enough of a reputation where clients will seek you out and you’ll get most of your work from your own website.

So, the freelance site you choose depends where you’re at in the above process:

  • If you’re brand new, go with an open network
  • If you’re fairly established go with a curated site
  • If you’re a pro you can likely use your own website

Here’s how to get started with all this..

  1. Determine where you’re at with your career.
  2. List 3-5 freelance sites to target based on your position.
  3. Write up your bio/application and apply to those sites.

Here’s resource list to help you with the links…

Open networks:

Curated networks:

Now, hopefully that helped you out. Please, if you know a freelancer who could benefit from this please help me out and send them this way. 🙂

April 21, 2015

How to Eradicate Annoying Scope Creep

How do you eliminate scope creep without coming across rude? I find a lot of web developers deal with this and are terrified to set boundaries with their clients.

But, you can do it in a way that will actually make your clients like you MORE… not hate you forever. Here’s how:

Tips for Eradicating Scope Creep

I find a lot of web developers, especially newer ones, are terrified of setting boundaries with their clients because they believe no matter how they do it they’ll come across rude.

Your client will get pissed, fire you and tell everyone they know what a jerk you are.

Nope.

It’s actually the opposite if you approach it right. Setting boundaries creates respect. Clients will see you as more of an expert because you aren’t a “yes man”.

You know when to say no and aren’t afraid to say what you think… and you can do it tactfully.

What that means is setting boundaries and squashing scope creep before it gets started isn’t a “necessary evil”.

In fact, it’s a way to increase your client’s affinity for you and something you should do enthusiastically.

So, here’s how to do it the “right way”:

1. Be a Specialist

Specialists make more. They work less. And, they deal with fewer annoying problems like scope creep.

When you specialize, clients see you as a hired gun brought into accomplish a very specific task. In that context, they rarely even think of increasing the scope of what you’re doing.

When you generalize, the very value you’re offering is the fact that you can do a bunch of different things. That’s what you’re selling!

So, is it any wonder a client tries to add items to your scope of work? It just seems natural.

Think about it from the client’s perspective. How many web developer websites or bios have you seen where the developer lists about 10 different things they’re good at.

Then, has a sales page dedicated to selling you on why they’re so great at each one of those things.

They’re selling themselves as someone who can “do it all”.

Guess what the client then wants?

Someone (YOU) to do it ALL.

Don’t do that.

Specialize. Make more money. Work less hours. Deal with less annoying problems.

2. Manage Expectations

I often say that I spend more time telling clients what I won’t do that what I will do. You HAVE to. It has to be clear from the start what your boundaries are.

When it’s not, clients will always try to push for one more thing. That’s why #1 above is so important. It sets the context.

Click here for the web developer resources I use to learn fast and run my business.

Then, you specifically state the things you won’t do. You likely already know all the common things clients try to get you to do that you don’t want to do.

TELL them that from the start. Make it clear.

Then, even if they do ask… they’ll already know the answer and the “NO” is easy for you.

3. Be Transparent

I’d imagine you already have a handful of horror stories related to scope creep. That’s WHY you’re even interested in knowing how to stop it.

Don’t be afraid to tell those stories and open up about WHY you’re so concerned about it.

The last thing clients want is for their project to be ruined. And, you KNOW it very well could end up that way if you let the scope get out of control.

So, tell them about your experience and open up about your concerns. The more transparent you are, the more they’ll understand you’re reasoning.

Your Challenge

So, good information on eradicating scope creep… but let’s put some teeth to it. Here’s my challenge to you to put this baby into action:

  1. List 5 ways clients try to increase the scope on you.
  2. List 5 experiences where scope creep killed a project.
  3. Write a script for each scenario outlining your “no” answer and the story that goes with it.

When you do this don’t get too caught up in the details of it. The point isn’t to have a copy/paste script. It’s to think it through so you have a framework for your answer.

Then you can adapt your answers to each client and scenario you encounter.

April 20, 2015

What Makes a Great Web Developer?

What makes a web developer great? I think most people think about this the wrong way and get too focused on technical skills. Here’s my reasoning:

What Most Web Developers Get Wrong

The standard advice is that a great web developer is defined by how technically skilled he is. Ask most seasoned developers this question and you’ll get responses like:

  • “Deep knowledge of HTML and CSS”
  • “Excellent debugger”
  • “Knows PHP like the back of his hand”

And, so on.

But, to me, those things aren’t what make a great web developer.

Certainly, your technical skill is important… but that is a pre-requisite. Technical skill isn’t what makes you great… it’s what makes you a developer.

What makes you great are your “soft skills”.

  • Are you focused?
  • Are you driven?
  • Are you detail-oriented?
  • Are you reliable?
  • Do you communicate well?
  • Are you easy to work with?
  • Do you learn new things quickly?

These are the questions whose answers define greatness.

Michael Jordan is known as one of, if not THE greatest, basketball players of all time. On the court, all of us marveled at his athleticism and his ability to deliver in crunch time.

But talk to his teammates or his coaches…

And, they’ll tell you it was Michael’s competitiveness and work ethic that made him special.

Teammates routinely talk of how fiercely competitive he was even in practice. That he was the first to arrive and last to leave.

How he would spend hours practicing at his house before going to the gym for his regular practices with the Bulls.

It wasn’t the mechanics of Michael’s jump shot or drive to the lane that made him great… it was the work ethic and competitiveness behind it…

  • That made the jump shot great…
  • That made the drive to the lane unstoppable…
  • That made him devastating in crunch time…

It’s the same with web developers. Your technical skill isn’t what makes you great. No. Your technical skill is a by-product of your greatness.

WHO you are is what matters.

So, how do you cultivate greatness in yourself?

Recognition is a start… but it also requires commitment.

  • Are you willing to spend hours obsessing over a line of code to make it perfect?
  • Are you willing to embrace the “buck stops here” responsibility your clients will expect from you?
  • Are you willing to learn whatever is necessary in order to deliver like you said you would?

From there, it’s focus.

  • Can you block out all the external distractions and get to work delivering quickly and “in flow”?
  • Can you temper the internal distractions that would stop you?
  • Do you know who you are and the art you want to give to others?

Finally, it’s work ethic.

  • Are you willing to push your limits?
  • Are you willing to be the first to arrive and the last to leave?
  • Are you willing to put in whatever hours are necessary in order to deliver?

Commitment, focus and work ethic.

Those are the things great developers… no… great PEOPLE are made of.

My challenge to you from all this is to take a moment and think about the commitment questions. Be honest with yourself and figure out if you’re really truly committed.

Because when you ARE committed at a deep level, finding the will power to be focused and work hard comes naturally.

April 17, 2015

How to Learn HTML, CSS and jQuery Fast

What’s the fastest way to learn HTML, CSS and jQuery? This video gives you some simple instructions for self-learning, in general… AND a step-by-step resource list for learning HTML, CSS and jQuery specifically:

Tips for Learning ANYTHING Faster

First, a few tips for self-learning, in general, to speed up the process:

1. Build REAL Things

If you just take courses or tutorials and don’t build anything with them, you’ll lose a lot of what you’re learning, you’ll have to go back and re-learn things and it’ll take you longer.

When you build real applications as you learn… the learning sticks, you remember more of it and learn faster.

Pick 5-10 “things” you can build as you learn and build them as you go through your training.

2. Take Courses

It seems to be a foregone conclusion in the development world that you have to learn everything on your own and you’re somehow less smart or less of a developer if you take courses.

Nothing could be more wrong.

Taking courses (even paid ones) is the smartest thing you could do because those instructors have taken the time to structure your learning for you so you don’t waste time wondering WHAT you should learn. Plus, they can teach you things you might never have thought of.

Don’t be afraid to take professional courses and spend money on them if you have to.

3. Find a Mentor

I was resistant as anyone to getting help from a mentor. I resisted it for years because I thought it would be an insult to my intelligence if I needed a mentor.

Wrong again.

I ended up in a situation where I was forced to have a mentor and it was the best thing that ever happened to me. I learned faster than I ever had with him because things that were so difficult and frustrating to me were simple and easy to him… and he could explain them to me in minutes.

Resources For Learning HTML, CSS and jQuery

April 16, 2015

STOP Pointing Out All Your Flaws!

If you’re selling yourself this way to potential clients or employers… THIS is why you’re having problems. Watch this clip, then check the full episode on YouTube.

STOP Pointing Out All Your Flaws

If you're selling yourself this way to potential clients or employers… THIS is why you're having problems. Watch this clip, then check out the whole episode in the comments. #freelance #webdesign #webdev

Posted by John Morris on Wednesday, April 15, 2015

April 15, 2015

What WordPress Theme Should Developers Use?

I used the wrong WordPress theme for about 3 years and it made my life miserable. Finally, I switched it up and have never looked back. Here’s what I learned. Watch this, then check the full episode on YouTube.

What WordPress Theme Should Developers Use?

I used the wrong WordPress theme for about 3 years and it made my life miserable. Finally, I switched it up and have never looked back. Here's what I learned. Watch this, then check the full episode in the comments. #wordpress

Posted by John Morris on Tuesday, April 14, 2015

April 14, 2015