Using Quizizz in the Classroom

Quizizz is an app and website that is quite similar to Kahoot with a few interesting additions. Like Kahoot, a user can create a series of questions to ask a group of people who compete to answer them correctly and speedily. Scores are determined according to whoever answers correctly first.

Quizizz, unlike Kahoot, adds some additional features to the game itself including different Theme choices and Power-ups. And in Quiz creation, whereas Kahoot only has two “free” question types (multi-choice and true/false), Quizizz has a total of FIVE possible options:

  1. Multiple choice (one correct answer)
  2. Checkboxes (more than one correct answer)
  3. Fill in the blank (correct answers + alternatives)
  4. Open-ended (no correct answers, opinion based)
  5. Poll (multiple choice – or checkboxes – opinion based)

Quizizz also adds the option of connecting to Google Classroom to assign quizzes for homework to your classes.

Uses for the Classroom

  • Surveys (interest, voting, etc)
  • Competitive Quizzes / Games
  • Informal skills / knowledge tests & assessments (Reports)
  • Assign as Homework (Google Classroom connection)

Recommendation: As with Kahoot, Quizizz also has an app where it is possible to create and edit quizzes. However, I it is still slightly easier to find everything on the website (the screen is larger), and you will likely be hosting your quizzes from the computer. So it is a good idea to familiarize yourself with the website first.

Step 1: Sign up / in

  1. Go to quizizz.com and click “Sign up”
  2. Sign up with your Google account (or email)***
  3. Select your role (Teacher)
  4. Select how you are using it (At a School)
  5. Welcome to the Dashboard

*** Important note about “Sign up”

In the Sign Up screen, you have TWO options:

  1. Sign up with Google
  2. Sign up with email

Whichever option you choose to sign up with MUST be used to sign in later (and they do not overlap each other). For example:

  • if you sign up with Google, you CANNOT use Email / Password to sign in later
  • if you sign up with Google, you MUST use Google to sign in later

Why “Google” and “Email / password” are not the same

The reason for this is because of the authentication (sign in) method used by the website.

  1. Google Sign In log you in with an authentication TOKEN
    • (A separate window opens where you log in to your Google account separately. Once you authenticate (login) with Google, your email service sends a unique authentication TOKEN to Quizizz in order to confirm your identity. So, in this case, Quizizz does NOT store your password at all, but rather relies on the TOKEN provided by Google to log you in.)
  2. Email / password will remember both your email AND your password
    • (The password is actually passed through a hashing algorithm in order to scramble it so it can’t be intercepted by another user. The scrambled password is matched with the scrambled password stored in the database for your user ID, and if the two scrambled passwords match, your identity is confirmed and you are logged in. So, in this case, Quizizz stores BOTH your email AND scrambled password in their database.)

That is why the two sign in methods are not compatible (interchangeable).

  1. Email / password = uses your email / password (and remembers both)
  2. Google = uses a TOKEN (and remembers only your email)

Step 2: Search for / Create a Quiz

  1. “Search” for quizzes to use
    1. You’ll be shown a list of relevant search results
    2. Select one to view (you can also Like or Save them to a Collection). From here you can Play Live, Assign HW, or Practice
  2. “Create” a new Quizizz of your own
    1. Write your own question at first to familiarize yourself with the Question Types
    2. There are FIVE Question Types shown above:
      1. Multiple choice (one correct answer)
      2. Checkboxes (more than one correct answer)
      3. Fill in the blank (correct answers + alternatives)
      4. Open-ended (no correct answers, opinion based)
      5. Poll (multiple choice – or checkboxes – opinion based)
    3. After you finish creating questions, you’ll still be able to Edit them
    4. Click “Done” in the upper-right to finish the Quiz (you must choose a grade level, and can also add additional details)
    5. The Quiz will then appear in “My Library”
    6. If you click on your finished Quiz, you can Play, Assign HW, or click “Edit” in the Quiz details box to edit it further

Step 3: Play / Assign a Quiz

To Play or Assign a Quiz as Homework, first select the Quiz you want either from Search or from “My Library.”

  1. From Single Quiz View
    1. Assign HW – brings up options for date, time, and class (linked to Google Classroom)
    2. Play – gives a few options like Team, Classic, and Test (choose Classic)
  2. The Teacher’s View shows the Quiz ID students need to enter to join the quiz
  3. Students navigation their Internet browsers to joinmyquiz.com and enter the ID
    1. Students may choose a Nickname (and other options)
    2. Then, select a Theme
  4. From the Teacher’s View, once the students have all joined, they may now “Start” the Quiz
  5. Students are show a question
    1. And may click their answer – they are awarded points and bonuses depending on their answers and time elapsed
  6. Teachers can watch student progress through the quiz
    1. And at the end of the quiz, they are shown a report with statistics from the quiz results
  7. Students also can review their own performance after the quiz

Step 4: Quiz Reports + Google Classroom

As mentioned above, at the end of a quiz:

  1. Teachers can immediately view the quiz results
  2. Students also have their own quiz results review page
  3. Additional Reports can be found in the “Reports” link in the left sidebar
    1. A single report view shows the full list of students who took the quiz as well as all their answers, and statistics about the quiz. It’s well worth investigating.
  4. Finally, Google Classroom can also be linked to Quizizz from the “Classes” link in the left sidebar

I hope that gives you a good overview of using Quizizz in your classrooms. There is much to explore, so just take some time to familiarize yourself with the program. Again:

  1. I recommend getting familiar with the website FIRST
  2. And then going back in to the app to learn it

Once you know what is available in Quizizz through the website, it’ll be a lot easier to find it in the app.

Good luck!~

Using Kahoot in the Classroom

Kahoot is an interesting app and website that allows one user to create a series of questions to ask a group of people who compete to answer them correctly and speedily. Scores are determined according to whoever answers correctly first (points are allocated in decreasing amounts to second place, third place, and so on).

Uses for the Classroom

  • Competitive Quizzes / Games
  • Informal skills / knowledge tests & assessments (Reports)

Recommendation: Although the Kahoot App also makes it possible to create and edit Kahoots, I remember doing MOST tasks on the computer because it is slightly easier to find everything (the screen is larger), and you will likely be hosting your Kahoots from the computer. So it is a good idea to familiarize yourself with the website first.

Step 1: Sign up / in

  1. Visit kahoot.com
  2. Click “Sign up” in the upper-right hand corner
  3. Select your Account type (Teacher)
  4. Select your Workplace (School)
  5. Create account ***
  6. Select your Edition (Free)
  7. Provide additional info (optional)
  8. Explore the Dashboard (Get Started)
    1. See how it works
    2. Create kahoot
    3. Host kahoot

*** Important note about “Create account”

In the Create Account screen, you have THREE options:

  1. Email / password
  2. Sign up with Google
  3. Sign up with Microsoft

Whichever option you choose to sign up with MUST be used to sign in later (and they do not overlap each other). For example:

  • if you sign up with Google, you CANNOT use Email / Password to sign in later
  • if you sign up with Google, you MUST use Google to sign in later

Why “Google” and “Email / password” are not the same

The reason for this is because of the authentication (sign in) method used by the website.

  1. Email / password will remember both your email AND your password
    • (The password is actually passed through a hashing algorithm in order to scramble it so it can’t be intercepted by another user. The scrambled password is matched with the scrambled password stored in the database for your user ID, and if the two scrambled passwords match, your identity is confirmed and you are logged in. So, in this case, Kahoot stores BOTH your email AND scrambled password in their database.)
  2. Google and Microsoft Sign In log you in with an authentication TOKEN
    • (A separate window opens where you log in to your Google or Microsoft account separately. Once you authenticate (login) with Google or Microsoft, your email service sends a unique authentication TOKEN to Kahoot in order to confirm your identity. So, in this case, Kahoot does NOT store your password at all, but rather relies on the TOKEN provided by Google or Microsoft to log you in.)

That is why the two sign in methods are not compatible (interchangeable).

  1. Email / password = uses your email / password (and remembers both)
  2. Google / Microsoft = uses a TOKEN (and remembers only your email)

Step 2: Create / find a Kahoot

You may wish to investigate Kahoots that have already been created first to get an idea for the kinds of things that are possible. Click “Discover” in the top menu to do so. Later, you may wish to “Create” your own (top-left button).

  1. “Discover” Kahoots (top menu button)
    1. Search for a Kahoot that looks interesting
    2. Select it to view the questions
    3. Some Kahoots you may be able to Edit, or add to your own Library. Others you may only be able to Favorite and Play with your class
  2. “Create” your own Kahoot (top-right button)
    1. Create a New Kahoot or use a Template
    2. You can modify an existing Template
    3. Or, if you are creating a New Kahoot, type your own questions and answers
    4. Question Types:
      1. Quiz (4 choices)
      2. True / False (2 choices)
      3. Typing (premium)
      4. Puzzle (premium)
      5. Poll (premium)
      6. Slide (premium)
  3. After creating a Kahoot (or using a Template), find it in your Library of Kahoots under the “Kahoots” button in the top menu

Step 3: Host your Kahoot

To host / play your Kahoot:

  1. View your Kahoots Library
  2. Click “Play” on the Kahoot you want to host
  3. Click “Teach” to play it in class
  4. Select “Classic” in Game options (you may also want to change or disable the Lobby music toward the bottom of the screen)
  5. When you Start the game
    1. The screen on the right will appear on your projector / computer
    2. Students should go to kahoot.it to enter the Game PIN on their devices
    3. Students can choose a Nickname (caution: some students may try to choose joking or rude nicknames)
    4. Once all students have entered the Game PIN and a nickname, Start the Game
  6. Questions will be shown on screen with a timer
  7. Students select the correct answer from the group of symbols on their device
  8. After all students have answered (or time is up) the correct answer will be shown on screen
  9. Finally, a leaderboard will be shown and tally up each player’s points

Step 4: Kahoot Reports

You will also be able to see a detailed analysis of the results of a played Kahoot in the “Reports” tab.

  1. Click “Reports” in the top menu
  2. Select the Kahoot you want to view reports for
  3. Detailed analysis includes:
    • Correct %
    • Difficult questions
    • Students who need help
    • Students who didn’t finish

I hope that gives you a good overview of using Kahoot in your classrooms. There is much to explore, so just take some time to familiarize yourself with the program.

  1. I recommend getting familiar with the website FIRST
  2. And then going back in to the app to learn it

Once you know what is available in Kahoot through the website, it’ll be a lot easier to find it in the app.

Good luck!~

Learn JavaScript by Building a Shopping App in CodePen

Learn by doing! The best way to learn JavaScript is with projects, so we’ll be building a shopping app in CodePen.

In this tutorial, we’ll learn how JavaScript can manipulate data and the DOM to create a multi-screen, dynamic web app, right inside CodePen. We will walk through the app-building process together: from creating app screens in HTML & CSS, to adding basic JavaScript functionality with button presses, to adding basic data processing. This tutorial is aimed at beginner developers.

Lesson Outline

The following is a tutorial that was presented at JS Conf Korea 2019 on September 3, 2019. It is a 4-part tutorial. The first part (Introduction & Overview) is presented here, but the other three parts are part of an online course I’m creating.

  1. Introduction <this part>
  2. Building the Shopping List Screen
  3. Building the Store Screen
  4. Building the Cart Screen

Material required

Introduction

As you may have noticed in my bio, my name is Aaron Snowberger, and I’m a frontend designer/developer who likes to dabble in backend and mobile technologies. My current passions include React, React Native, Node, and the WP REST API. I’m also a Google Certified Trainer who has taught computer science and graphic design in high school since 2013. I’m passionate about helping new learners discover the joys of JavaScript.

The web project this tutorial introduces is for a project that I built with my high school students in the Spring 2019 semester.

My class began the project with a review of HTML structure and CSS styles in order to create the overall look and feel of the web app. But the project’s main focus was to introduce my students to the beauty of JavaScript, and that is what the bulk of the tutorial will cover.

Why JavaScript

There are many reasons why JavaScript is a particularly useful programming language for new learners. Here are just a handful of them:

  1. JS is the third leg of the code-tripod that builds websites. Whereas HTML & CSS are not really programming languages per se (they are markup languages concerned with presentation, not function), JS is actually a functional programming language that can create interactive applications – and not just online brochures.
  2. JS is everywhere. The majority of the world’s websites utilize JavaScript somewhere – it provides much of the interactivity on a site – and it can also be used to build mobile applications (React Native, NativeScript). As such, the majority of the world’s population with access to the Internet is in contact with JavaScript on a daily basis.
  3. JS is noob-friendly and (relatively) easy to learn. Compared with many other true programming languages, JavaScript’s syntax and key concepts are rather straightforward and relatively easy to learn. So much so that middle school and high school students can pick it up, and there are even some block-building languages (like Blockly and Scratch) which are based on JavaScript and taught to even younger students. JavaScript is also one of the easier languages to debug.
  4. JS is also quite powerful. Some of the top websites in the world like Facebook, Instagram, AirBnB, and Netflix utilize JavaScript in their webpages and mobile apps. JavaScript can be used to power either the frontend or the backend of websites, and there are hundreds of very powerful frameworks and libraries of code available to work with.
  5. JS is undoubtedly fun to work with. By its very nature, powering websites and providing their functionality, JavaScript is highly interactive and visual, giving you the ability to build animations, powerful UIs, games, and apps. Plus, it’s even more fun when you realize you can build something that millions of people around the world can enjoy together.
  6. Learning JS can lead to a bright future. The JavaScript ecosystem is rapidly evolving and has seen much growth and change in recent years. As such, JavaScript skills are in high demand and salaries for skilled JavaScript developers are also high. Additionally, by learning the fundamental concepts all programming languages share (loops, conditionals, functions, classes, and so on), students can more easily pick up skills in additional – or more difficult languages as well.

About the Shopping App Project

AKA “How we’ll build this…”

JavaScript is primarily used to access and modify elements within a website. Therefore, we need to learn JavaScript by coding a project that has multiple moving parts, buttons, and interactive elements. A shopping app provides just such an opportunity.

Project Considerations

Each of the three “screens” in this app will be discussed in more detail below, but here is a quick overview of what we want each screen to do and how.

  1. Shopping List Screen
    • Performs like a To-Do List
    • We click a button to “add” or “remove” an items from the list
    • Type in the input field to “create” a new item (task)
    • Drag an item to the side to “delete” it (animate this)
    • Include Reset buttons to restore the original list to its defaults
    • Also include additional visual feedback (CSS animations) so the user can see what effect their interactions are having on the app
  2. Store Screen
    • This needs to include a collection of data – say at least 20 different items we can Search through and Add to our cart
    • We want to be able to change the View Type (from list to grid and vice versa – CSS Grid is a perfect tool for this)
    • We want to include filters such as Category, Price, and so on
    • We also want the Store to be searchable
    • We need to include some functionality to “Add” items to our cart so that when we click over to the Cart Screen, those items are there
    • We also need some kind of animation or visual feedback for the user (this can be handled with pop-up “Toast” notifications)
  3. Cart Screen
    • The cart will contain “cloned child nodes” from the Store Screen when the user clicked “Add to cart”
    • It needs to be able to dynamically update quantities and prices
    • And we also want to include some kind of nifty Checkout progression or modal and possibly a nice “shipped out” animation

First, some notes on HTML & CSS

  • HTML Structure
    • Use semantic markup (<nav> or <aside> rather than always <div>) & descriptive class names (like "shopping-list-item")
    • This helps you to think in a more modern, modular style when you build the structure (like components) first
  • CSS Style
    • Some useful visual indicators and design tools include:
      • My personal favorite design touch is using a dark bottom-border and light top-border on each list item – to give the appearance of three-dimensions and shadows
      • Transitions for everything are useful
      • Animations & keyframes also allow us to give visual clues to the user by doing things like jiggling the Cart icon when an item is added or removed
      • Additionally, transforms, opacity, and positioning can help us a lot
    • CSS Grid & Flexbox are also particularly useful tools (especially since React Native utilizes flexbox, so it’s good practice here if we want to work with React Native later)

1: Shopping List

Originally, this shopping app was designed to behave primarily like a To-Do list. So, it was more like a shopping list app that incorporated the following:

  1. A pre-built list of items
  2. To which new items can be added (input field)
  3. Items can be clicked on and marked as completed (purchased) with a strikethrough
  4. Or items can be removed from the list altogether (by dragging it off the screen)

After these initial functions were built, it seemed like a good idea to allow users to also do them in bulk, so the following buttons were added:

  1. Empty Cart – systematically goes through the list of items and removes the strikethrough, also returns the cart number to zero
  2. Delete List – systematically (and programmatically) removes each item from the list by “dragging” it off the screen in order
  3. Reset All – systematically resets the list to its original defaults by adding all the items back in

In addition to the functionality listed above, in order to provide adequate visual feedback to the user, CSS transitions, animations, and pseudo-elements were added to make the app appear as though every button click or input was having a (non-simultaneous) effect.

This meant that all the functionality of the app was given a 300-1200ms transition, for adding, deleting and so on. “Purchased” items appear to float up “into” the shopping cart, and bulk actions don’t happen all at once, but sequentially with a short delay between each item.

Shopping List Toolbox

The following is a list of necessary JavaScript knowledge to add to our mental toolbox in order to build the Shopping List screen:

Let’s build the Shopping List Screen!

Checkout the finished product in the CodePen below. Investigate the JS code in the editor to learn how it all works.

Completed Shopping List Screen.

2: Changing Screens

Technically, this is not another screen that we need to code, but rather the ability to seamlessly transition between screens. Therefore, it deserves its own subsection in which to discuss WHAT we want to do and HOW we want to do it.

  • Considerations:
    • Let’s make the screens appear to shift from left to right as we click between them. This means we need to make the width of our app <div> at least as wide as three screens, and then we want to absolutely position it where it needs to be for each visible screen.
    • Additionally, we need to change how the input field works:
      • On the Shopping List Screen, it adds items to our list
      • On the Store Screen, it should search the store
      • On the Cart Screen, it should search the cart
    • And of course, we want to add some Toast notifications (pop-ups) to indicate to the user what is going on

Changing Screens Toolbox

The following is a list of necessary JavaScript knowledge to add to our mental toolbox in order to build the Change Screens transitions and functionality:

  • JavaScript
  • CodePen
    • Additionally useful is being able to Add External CodePens into your next working model with CSS or JS code pre-built. This can help you to separate out different features and keep you CodePen code a little simpler.
    • For example, after building the Shopping List Screen in the previous section, I load its CSS and JS into every other CodePen I create (all the other Screens) to carry over its styles and functions.

Let’s build the Change Screens functionality!

Checkout the finished product in the CodePen below. Investigate the JS code in the editor to learn how it all works.

Completed Change Screens transitions.

3. Store

This is Screen #2 that we will build, the Store. You can see from the screenshot that this screen adds our collection of data (stored in a JavaScript array), a few interactive buttons on the store itself and on each item, and changes the input field to search for items in the store. Let’s run over our considerations for the Store Screen once again:

  • Considerations
    • Collection of data – say at least 20 different items (stored in a JS array)
    • Buttons to change the View Type (from list to grid and vice versa – the grid icon at the upper-right corner of the store is what we’ll use)
    • Filters: Relevance – Lowest Price – Highest Price
    • Search bar: although not instantaneous search, when ENTER is pressed, it returns (and displays) an array of the relevant items as well as a notification for the results it found (and an “x” button to clear the search) – see below
    • When “Add to Cart” is pressed, we need to clone the DOM node and add it to the array of items that are present in our Cart screen (so that when we click over there it will already be in the Cart)

Store Screen Toolbox

The following is a list of necessary JavaScript knowledge to add to our mental toolbox in order to build the Store screen:

Let’s build the Store Screen!

Checkout the finished product in the CodePen below. Investigate the JS code in the editor to learn how it all works.

Completed Store Screen.

4. Cart + Checkout

The third and final Screen we need to code for our app is the Cart Screen which will include a Checkout modal. Each item that we “Added to Cart” in the Store screen appears in our list here (as cloned DOM nodes).

Beneath the Cart list (not pictured) is a “Checkout (3)” button – with the quantity of items to purchase, and a “Total: $” field, both of which are dynamically updated as we add (or remove) items in the Cart.

Above the Cart list, is the Checkout modal progression: REVIEW – PAYMENT – COMPLETE. When we click the “Checkout (3)” button, this should take us through the full payment process to a “shipped out” animation at the end.

  • Considerations
    • Cloned child nodes are absolutely necessary to make the app function seamlessly between Store and Cart screens. This is because we are not actually loading different screens and passing data between them, but instead we continuously remain on the SAME page, and just push a different area into our iPhone screen based on the section of the app we want to load. Therefore, when we “Add to Cart” we actually need to create an identical copy of the DOM node that contains the item and add it to the Cart section.
    • Dynamic updates (in price or quantity) are controlled and managed with JavaScript’s MutationObserver that detects changes in the DOM and can respond accordingly, as well as custom HTML data attributes to retrieve the relevant information we need.
    • The Checkout Modal is a straightforward implementation that requires no special implementation methods.

Cart Screen Toolbox

The following is a list of necessary JavaScript knowledge to add to our mental toolbox in order to build the Cart screen:

  • JavaScript
    • Useful functions
      • .cloneNode() – to copy the DOM node containing our desired item
      • .appendChild() – to add the cloned node to the Cart
      • MutationObserver – to listen for changes in the DOM
        • This JavaScript feature in particular was the most important thing that I discovered while building the app. There is no other way to listen for changes in the DOM and respond to them without reloading the page.
      • parseFloat() – to deal with updating our prices
      • .toFixed(2) – also for updating prices (limit the decimal to 2 places)
      • .forEach() – to perform the same action on all DOM nodes in an array
  • HTML data attributes – we are using data-item-price

Let’s build the Cart Screen!

Checkout the finished product in the CodePen below. Investigate the JS code in the editor to learn how it all works.

Completed Shopping List Screen.

Just Keep Learning

I hope you found this tutorial session informative and interesting! And I encourage you to always “Just Keep Learning” and experimenting, building new projects, and trying things out. Below is a list of helpful resources you might find useful in your journey.

Resources

View the FULL CodePen Collection (including Start and End points for every screen) here:

Full Circle: (W)holistic Life Management

With this presentation, I wanted to start a discussion about how to “be better” in your own life, how to exceed your own expectations, how to push beyond your own limits. I was inspired by numerous references that are mentioned.

To begin, I thought it might be beneficial to give you an overview of who I am and what I do.

So, you could say I keep myself pretty busy.

Full Circle: (W)holistic Life Management

It’s my goal that this presentation will spur up a deep discussion about how we can better put our lives in order to live as the kind of people we most deeply desire to become. The presentation will be broken down into three parts: the WHAT – WHY – HOW of (W)holisitc Life Management.

WHAT is (W)holistic Life Management?

Actually, the correct spelling of (w)holistic does not include the “w.” But I’ve chosen to include the “w” to emphasize the key point: that (w)holistic is the idea that the (w)hole is more than merely the sum of its parts.

holistic

(Oxford Language dictionary)

  • PHILOSOPHY: characterized by comprehension of the parts of something as intimately interconnected and explicable only by reference to the whole
  • MEDICINE: characterized by the treatment of the whole person, taking into account mental and social factors, rather than just the symptoms of a disease

WHY (W)holistic Life Management?

In other words, in order to fully understand your life, and your experiences, you cannot merely view each piece of your life as an individual part, unrelated to the others or the whole. Put succinctly:

  1. Your Body affects
  2. Your Mind, which affects
  3. Your Spirit, which makes up
  4. Your Self.

Each of these pieces of you is intimately interconnected to the others, so a change in one will affect them all.

For example, if you get injured in a car accident (body) and have to stay in the hospital for a while, you may begin to get depressed (spirit), and begin thinking negatively (mind) about your recovery time, or about the people who visit you or come to help you.

Or, someone close to you dies suddenly and causes you great grief and sadness (spirit). This leads you to withdraw from other people for emotional support (mind), and you may spend all your time at home in front of the TV stress eating (body).

But these three: SPIRIT – MIND – BODY are by no means ALL the parts of you that are intimately interconnected and may have an effect on the other parts. The following illustration is a better representation of some of the additional pieces within you and surrounding you that may affect your life.

From the illustration: What is Holistic Health?
  1. Spiritual: Expands our sense of purpose and meaning in life
  2. Intellectual: Recognizes creative abilities and finds ways to expand knowledge and skills
  3. Emotional: Copes effectively with life and creates satisfying relationships
  4. Physical: Recognizes the need for physical activity, diet, sleep, and nutrition
  5. Socio-cultural: Develops a sense of connection, belonging, and a well-developed support system
  6. Financial: Satisfaction with current and future financial situations
  7. Environmental: Good health by occupying pleasant, stimulating environments that support well-being
  8. Occupational: Personal satisfaction and enrichment derived from one’s work

All of the above factors influence your overall Life Wellness. And a dramatic positive or negative change in any of them can equally dramatically change your entire life situation.

In fact, it is a good idea to semi-regularly (once quarterly, or once yearly), consider for yourself where you stand in regard to each of these on a scale of 1 to 10. Because you cannot significantly increase your overall Life Wellness and Life Satisfaction if one or more of these factors remains low.

Instead, in order to raise your overall Life Wellness / Satisfaction level, you may need to increase the level of each of these factors. By doing so, and specifically by concentrating on the factors that need the most improvement, you will raise every level at once (and therefore your overall Life Wellness as well) due to their intimately interconnected nature.

HOW to perform (W)holistic Life Management.

Now we get into the real “meat & potatoes” of this presentation.

For myself, I like to perform a THREE-step process that can be thought about in a similar way to how a doctor would see a patient.

  1. Life Check-up (a regular review)
  2. Self Diagnosis (thinking time)
  3. Self Prescription (atomic habits)

#1: Life Check-up

As mentioned above, I often like to set aside time to review and reflect on my personal life satisfaction and progress. This helps me to review what went right and what went wrong in the previous period in life, and better set my direction for where I want to go in the next period in life. Because without a clear direction in mind, I would just end up going anywhere, and doing anything.

Everyone ends up somewhere in life, few people end up there on purpose.

Craig Groeschel

Practically speaking, for my Life Check-up, I usually do the following:

  1. Once per Quarter (or per semester)
  2. Set aside at least a half-day (on purpose)
  3. To go to a favorite (quiet) coffee shop
  4. And indulge in my favorite (rarely purchased) coffee / snacks
  5. With my favorite music (or a motivational message)
  6. To get myself into the right head space
  7. And rate my life from 1 to 10 in each of the (w)holistic factors
  8. And write down all the good and bad from the previous Quarter

A good (long) example of my process can be seen in my 2016 Year in Review.

#2: Self Diagnosis

The Life Check-up / Review leads quite naturally into a Self Diagnosis. The reason I like to set aside at least a half-day for this process is because DEEP thinking about your life and your future direction takes time.

The Road Less Stupid, by Keith J. Cunningham
Start with Why, by Simon Sinek

One of the best books I’ve read recently includes a section at the end of every chapter called “Thinking Time” where the author presents a series of questions based on the chapter and asks readers to go and spend some serious time just thinking. (The Road Less Stupid, by Keith J. Cunningham)

Another good book that really gets to the heart of the issue is called Start with Why, by Simon Sinek. In this book, the author presents the idea that:

  • “Followers start with WHAT” but
  • “Leaders start with WHY”

WHY is the heart of the matter. WHY did this or that go wrong? WHY do I still not do this thing I want to do? WHY am I not fully satisfied in this part of my life? WHY is the best place to start because WHY helps us to see the underlying causes and motivations for whatever worked or didn’t work in our lives.

Then, from WHY, we can build up to HOW we want to change – in what (w)holistic areas we need to make adjustments. And from there, we can determine particular steps to take, or WHAT to do, to see things through to a better future.

Too many times we try to start with WHAT we want to change first, without considering the true, underlying conditions that are causing things to be out of whack in the first place. Starting with WHY is a much better tool for Self Diagnosis.

#3: Self Prescription

Once you’ve gone DEEP enough in your Thinking Time, you’ve rated yourself (w)holistically, and have discovered the deeper underlying causes or motivations (your WHY) for your previous successes and failures, then you’re finally ready to start working on your HOW to change and WHAT to change for the next period in your life. For that, I have two main recommendations:

1. Learn to Bullet Journal

The concept behind the Bullet Journal is simple: ONE, centralized, consistent (analog) location for ALL your “Thinking Time,” plans, and reviews.

The reason an analog (pen and paper) solution is preferable to a digital solution is because of the ease and versatility of getting things out of your head and on paper quickly whether through text or drawings. Digital tools may be powerful, but we often find ourselves spending more times switching between editing tools than actually writing, drawing, and truly thinking.

Buy a nice moleskin notebook, and use it regularly to keep track of everything that is going on in your life and your plans for the future. You can use it during your Prescription period to help you determine what new habits to form and what new direction to take. And then you can look back on it in a few months when you do another Life Check-up / Review to see how everything went.

The inventor of the Bullet Journal, Ryder Carroll, also has a great book out on the subject (available in 28 languages) that will teach you all about how to use this kind of journal to your greatest advantage in planning and living your life.

2. Develop Atomic Habits

I’ve previously presented on Habits in various settings and contexts, but one of the best books on the subject of Habits in recent years is James Clear’s Atomic Habits (highly recommended).

The basic idea is this: the majority of your life (over 50% of every waking day) is dictated by your daily habits. Change your habits, change your life. And Mr. Clear does an excellent job of laying out all kinds of principles regarding your habits including:

  1. How to Break a Bad Habit (chapter 10)
  2. How to Build Good Habits (chapter 3)
  3. Your Environment matters more than your Motivation (chapter 6)
  4. The Secret to Self-control (chapter 7)
  5. How to Stop Procrastinating (chapter 13)

You can also take a look at my previous presentation on the topic for more information.

But for a quick overview of how I’ve used these principles to create my own “Atomic Habits,” let’s take a look at my current daily schedule.

My Daily Habits

  • 4:40am – wake up, do computer work when my brain is fresh
  • 6:00am – go to the gym, keeping my body strong and fit is important to keep my mind and spirit strong and fit
  • 7:00am – bike to work, cardiovascular fitness is at least as important as muscular strength to keeping me (w)holistically healthy
    • I also do stretching to improve my flexibility
    • Some reading, to increase my knowledge and spend some time thinking
    • And Wim Hof deep breathing exercises as a kind of meditative / prayer practice for my spiritual health, to center myself and prepare for work
  • 8:40am – I begin my work, teaching English at a Korean university
  • Lunch – Eat, have a cup of coffee, and take a rest to recover my physical and mental energy for the afternoon work period
  • Before 6:00pm – bike home, this biking also helps me mentally separate my work life from my home life so that I can be fully present with my family
    • I often do some additional bodyweight exercises like pull ups, push ups and sit ups on the way home
    • I take a cold shower to refresh my body and mind
    • I have dinner with my family
    • Then do the dishes with an audiobook to continue learning and thinking
    • Then, I play with my kids or read to them before bed
  • 8:30pm – get ready for bed, we start to help the kids wind down, shower, brush their teeth, pick out clothes for the next morning, and so on
  • 9:30pm – lights out (for kids), during this time I like to read a paperback book or write in my Bullet Journal at night
  • 10:30pm – sleep, I try to get a minimum of 7 hours of sleep per night

So, the habits I’ve laid out above are some that I’ve worked on through many iterations of my (W)holistic Life Management plan and have found they work the best for me (for now). But, in due time, I’m sure some things will change.

For example, I’m striving for fluency in Korean, but don’t (yet) have a good place for Korean study in my daily habits. This is something to put to myself to solve in my next (W)holistic Life planning session.

Thanks for your attention to my presentation!~ I hope you found beneficial. And be sure to check out the books below (affiliate links) for more.

Resources

(affiliate links below and throughout the blog post)

Personalize VS Code

I’ve really been enjoying VS Code for development these days. Here are some of the things I’ve done to customize my new favorite code editor.

While I’ve used (and enjoyed) a number of different coding environments and IDEs in the past (NetBeans, Atom, Brackets, Notepad++), these days, I’m really enjoying VS Code. The following is a list of what I’ve done to customize my WordPress development environment.

1. Customizing Visual Studio Code

Extensions (CTRL + SHIFT + X)

  1. Beautify
  2. Debugger for Chrome
  3. EditorConfig
  4. ES6 String HTML
  5. ESLint
  6. Express
  7. GitLens
  8. HTML CSS Support
  9. IntelliSense for CSS
  10. Live Server
  11. Markdown All in One
  12. PHP Debug
  13. PHP DocBlocker
  14. PHP IntelliSense
  15. PHP Server
  16. PHP Code Sniffer
  17. Prettier – Code formatter
  18. REST Client
  19. Sass
  20. Settings Sync (special note: Use this Extension to sync your Settings across multiple machines once you’ve got things the way you like)
  21. SVN
  22. Terminal

Snippets

  1. HTML Snippets
  2. JavaScript (ES6) code snippets
  3. jQuery code snippets
  4. React-Native/React/Redux snippets for ES6/ES7 Standard

Themes

  1. Atom One Dark Theme
  2. Fresh Material
  3. Material Icon Theme
  4. Material Theme
  5. Palenight Theme
  6. One Dark Pro
  7. One Monokai Theme
  8. VS Code Icons

Settings (CTRL + Comma)

Most of these Settings can be found and edited within the Settings interface of VS Code. But to do workbench.colorCustomizations, you’ll need to edit the JSON of your settings. So, it’s easiest to simply Search for that in the search bar, then copy-paste the following into the JSON Settings.

{ 
"editor.fontFamily": "'Noto Mono', 'Fira Code', Hack",
"editor.fontSize": 16,
"editor.fontLigatures": true,
"editor.formatOnPaste": true,
"editor.tabSize": 2,
"workbench.iconTheme": "material-icon-theme",
"files.autoSave": "onWindowChange",
"workbench.colorTheme": "Palenight Italic",
"workbench.colorCustomizations": {
"terminal.background": "#1F2330",
"activityBar.background": "#7e57c2"
},
}

Fonts

My preferred Settings above require some additional fonts. Here they are:

  1. Fira Code
  2. Noto Mono
  3. Hack

Resources

For more tips on using VS Code, check out the following video lessons.

  1. VS Code Power User by Ahmad Awais
  2. Learning Visual Studio Code by Reynald Adolphe on LinkedIn
  3. Visual Studio Code for Web Developers by Joe Marini on LinkedIn

A Comprehensive Annual Review Process

Every year, I try to reflect on the previous year’s successes, failures, biggest risks taken, and biggest lessons learned. My annual review process has become quite extensive and is presented here in its entirety.

Every year, I try to reflect on the previous year’s successes, failures, biggest risks taken, and biggest lessons learned. My annual review process has become quite extensive, but the major questions I try to address are:

  1. Past: How did my previous year go?
  2. Present: How is my overall life satisfaction now?
  3. Future: Where do I want to go in the next year?

This Annual Review process is quite comprehensive and is broken into 5 days and 13 sections. It is best to not attempt to cram all of this into a single review session, but space it out over a number of days (as outlined) or multiple 1-2 hour sessions with a break in between.

A template to create your own annual review will be made available here later. And a more detailed description of much of this list can be found at my Korean language learning blog.

Day 1

1. Start with WHY
  1. WHY do you do what you do?
  2. WHY do you want what you want?
  3. WHY do you set the goals you set?
2. Overview your previous Year
  1. 10 Great things that happened last year
  2. 5 Lessons learned (or repeated themes)
  3. Any regrets? (something you wish you did, or did more of)

(Optional) Review your statistics

  1. List all books you read – and length
  2. List any courses you studied – and length
  3. List any new projects completed (and skills / things you learned)
  4. List any exercise you can track
  5. List any money you can track
  6. List any contributions you made (money, code, service, etc)
3. Detail your previous Year
  1. Smartest decision last year
  2. Most loving service
  3. Most happy with finishing
  4. 3 people who impacted my life the most
  5. Biggest risk taken
  6. Most improved important relationship
  7. Compliment (or opportunity) I wish to have received
  8. Gratitude list: What are you most thankful for in your life now?
  9. ONE word summary of the year

Day 2

4. Rate your Life Satisfaction NOW

Give yourself a rating 1-10 for your satisfaction with each of the following. Then, write down at least one goal for each.

  1. Physical life / health
  2. Mental life / personal development / learning / growth
  3. Spiritual life
  4. Lifestyle
  5. Career / job
  6. Financial satisfaction / health
  7. Family
  8. Social (friend) relationships
5. Look Forward
  1. What 3 things must STOP in the next year?
  2. What 3 things must START?
  3. Where are 3 places you must STAY (though hard)?
  4. Where are 3 places you must LEAVE (though hard)?
  5. Where are 3 places you must SERVE (though hard)?
  6. How are 3 ways you need to CONNECT with others more?
  7. How are 3 ways you need to TRUST others more?
6. Look far Forward (beyond next Year)

Consider your ultimate destination(s) in life – beyond next year.

  1. Where do you want to be in life in 2 years?
  2. In 5 years?
  3. In 10 years?
  4. In 20 years?
  5. Before the end?
  6. Create a BHAG (Big, Hairy, Audacious Goal) that seems out of reach now, but could be accomplished with enough focused effort.

Day 3

7. Define Success

Define your Level 50. What does Success or Greatness look like for you?

  1. What are all the things you want to HAVE in life?
  2. What are all the things you want to DO in life?
  3. What are all the things you want to BE in life?
8. Design your next Year (Set Goals)
  1. From your list of goals in Part 5, reduce that to only 3 Major Goals to focus on for the next year (or quarter).
  2. Decide upon 3 Action Steps for each Major Goal to take immediately to make progress toward that goal
  3. Decide upon a Deadline for (at least Phase One of) each goal
  4. Consider if anyone can keep you accountable and write that person’s name next to your Major Goal
  5. For each Major Goal, create a Habit (see Part 9) to help get there
9. Become the Change you Seek

What kind of person can achieve what you’ve written down? Brainstorm for a while and write a short paragraph for each.

  1. What kind of person would achieve my Physical goals?
  2. What kind of person would achieve my Mental goals?
  3. What kind of person would achieve my Spiritual goals?
  4. What kind of person would achieve my Lifestyle goals?
  5. What kind of person would achieve my Career goals?
  6. What kind of person would achieve my Financial goals?
  7. What kind of person would achieve my Family goals?
  8. What kind of person would achieve my Social goals?

Can you find any recurring patterns or themes? Write these out as a series of Affirmations to repeat for the next year.


Day 4

10. Schedule it

Start with the Big rocks on your calendar.

  1. The Year: What major events or commitments for the next Year can you immediately mark on the calendar?
  2. The next Quarter: More specifically, is there anything coming up in the next 3 months you need to make a note of?
  3. This month: What specifically would you like to accomplish this month – particularly as it relates to Major Goals and Action Steps?
  4. Ideal week: In a Spreadsheet or paper grid, block off your weekly commitments and anywhere you’d like to include your new Habits.

When blocking out your Ideal schedule, also consider the following Time Blocks:

  1. Buffer Block (30 min x 2 / day) : to take care of unplanned interruptions
  2. Strategic Block (3 hrs / week) : focused time, where you make progress toward your goals
  3. Breakout Block (3 hrs / month) : to get out and rejuvenate yourself physically, mentally, and emotionally
11. Create the Habits to get you there

For (at least) each of your Major Goals in Part 8, determine how you can create a Habit for it. (You may also consider making or breaking Habits for some of the things you listed in Part 5.)

Make a Good Habit

  1. Cue: Make it obvious
  2. Craving: Make it attractive
  3. Routine: Make it easy
  4. Reward: Make it satisfying

Break a Bad Habit

  1. Cue: Make it invisible
  2. Craving: Make it ugly
  3. Routine: Make it difficult
  4. Reward: Make it empty
12. Track your progress

That which gets measured gets accomplished.

Proverb

Determine how you will Track your progress daily, weekly, or monthly. There are apps that can help you by keeping track of certain things automatically. For other things, use paper.

  1. How will I track Physical progress / goals?
  2. How will I track Mental progress / goals?
  3. How will I track Spiritual progress / goals?
  4. How will I track Lifestyle progress / goals?
  5. How will I track Career progress / goals?
  6. How will I track Financial progress / goals?
  7. How will I track Family progress / goals?
  8. How will I track Social progress / goals?
  9. At what time of day will I sit down to track one or more of these?
  10. Which day of the week will I track and review my weekly progress and preview or prepare myself for the week to come.
  11. After how many weeks or months will I sit down to do a comprehensive review of my progress and redirect my steps toward the next span of time. (Personally, I prefer Quarters – about four times per year, with three months between each.)

Day 5

13. Prepare yourself

At the end of a long week of reflection and planning, the final step is to prepare for the next burst of energy. You want to make everything as streamlined and smooth as possible so that you can hit the ground running with your new Habits and Goals.

  1. What NEW things do you need? (Tracking apps, new clothes, etc)
  2. What OLD things need to be thrown away? (Distractions, etc)
  3. What MILESTONES do you need to prepare for along the way?

Well, there you have it. A very intense and comprehensive Annual Review process to help you prepare for the next step in life. For me, the times I’ve taken to be alone and reflect and plan like this have been literally life-changing. It is a long process, but if you do it well and stick to your plan, it’ll make a big difference in the upcoming weeks and months.

Plan your work. But don’t forget to work your plan.

Proverb

Resources

Some books I’ve read that helped me learn and incorporate some of these principles into my Annual Review are as follows (affiliate links).

  1. The Compound Effect by Darren Hardy
  2. Design your Best Year Ever by Darren Hardy
  3. Your Best Year Ever by Michael Hyatt
  4. The 12-Week Year by Brian P. Moran and Michael Lennington
  5. The 12-Week Year Field Guide by Brian P. Moran and Michael Lennington
  6. Atomic Habits by James Clear

Git & WP-CLI on Windows

This short tutorial will help you get ready for WordPress development by setting up a localhost development environment with git and wp-cli on Windows.

The following tutorial / notes are for setting up a new localhost development environment in Windows.

1. Setup your Localhost Environment

  1. Download the Bitnami WordPress installer
  2. Follow onscreen instructions and Install!

That’s it~

I put my development environment in the D:/ drive

D:/Bitnami/WordPress

2. Prepare for git with VS Code

Gitbash (git for Windows) wants a default text editor – and while you could choose Nano or VIM or Notepad++, why not go with the (NEW!) option and get yourself a really great code editor while you’re at it~

  1. Download the Visual Studio Code installer
  2. Follow onscreen instructions and Install!

Learn about customizing Visual Studio Code for WordPress development.

3. Setup git with Gitbash

  1. Download the Gitbash installer
  2. Follow onscreen instructions and Install!
    1. Note: In the “Adjusting your PATH environment” screen, click “Use Git from the Windows Command Prompt”

4. Setup WP-CLI in Windows

Take a look at this walkthrough. I followed the steps outlined within it and made a few notes about the process for my particular setup.

  1. Download the wp-cli.phar file (right-click and “Save As…”)
  2. Create a new folder within your Windows user’s folder to hold all our executable files
    1. Create C:\Users\user\bin (where “user” is your Windows username)
    2. This is the ~\bin folder where ~\ indicates the user’s home directory
  3. In Visual Studio Code, create a wp.bat file with the following content:
@ECHO OFF
SET BIN_TARGET=%~dp0/./wp-cli.phar
php "%BIN_TARGET%" %*

This will execute the wp-cli.phar command from your command line (after doing a little more setup work).

  1. But, if you’re using Gitbash, Windows won’t recognize .bat files and their commands, so we need to create a separate file called wp (no file extension).
  2. In Visual Studio Code, you may get an error if you try to create and save a file with no extension, so just call it wp.sh for now.
  3. Later, in Windows Explorer you can remove the .sh.
  4. Paste in the following lines:
#!/usr/bin/env sh

dir=$(d=${0%[/\\]*}; cd "$d"; pwd)

# See if we are running in Cygwin by checking for cygpath program
if command -v 'cygpath' >/dev/null 2>&1; then
# Cygwin paths start with /cygdrive/ which will break windows PHP,
# so we need to translate the dir path to windows format. However
# we could be using cygwin PHP which does not require this, so we
# test if the path to PHP starts with /cygdrive/ rather than /usr/bin
if [[ $(which php) == /cygdrive/* ]]; then
dir=$(cygpath -m $dir);
fi
fi

dir=$(echo $dir | sed 's/ /\ /g')
"${dir}/wp-cli.phar" "$@"

So the previous step (wp.bat) makes wp-cli available from the Windows Command Line, and this step (wp.sh) makes wp-cli available from Gitbash.

5. Add php and wp-cli to the PATH

Now, we have to make sure Windows adds both php and wp-cli to the PATH so we can use them.

  1. Open up the Windows Control Panel → System (or right-click “My Computer” on the Desktop and click “Properties”)
  2. Click “Advanced system settings” in the left sidebar
  3. Click “Environment Variables…” in the popup
  4. Click “PATH” from the list and then “Edit…”
  5. Now add the full path to your executable files. In my case:
    1. PHP: D:\Bitnami\WordPress\php
    2. WP-CLI: C:\Users\user\bin
  6. Now, “Sign Out” of your Windows account and Log back in to be sure Windows loads the new PATH variables
  7. You can confirm both php and wp-cli are working by trying out a few different commands in Gitbash or the Command Prompt:
    1. php -i
    2. which php
    3. php -V
    4. wp
    5. wp plugin install hello-dolly (from inside your Bitnami/WordPress/htdocs/wp-content/plugins folder)

Great! Now you can use git and wp from the command line in Windows! Happy coding!~

Downloads

  1. Bitnami WordPress installer
  2. VS Code
  3. Gitbash
  4. wp-cli.phar file

WordPress Multisite with Wildcard DNS and/or SSL on Dreamhost

Although Dreamhost supports Wildcard DNS, they don’t support Wildcard SSL (except on DreamCompute), so WordPress Multisite with wildcard subdomains may not be the best choice.

TL;DR

  1. Dreamhost & Wildcard DNS
  2. Setting up WordPress Multisite
  3. I suggest not using Wildcard DNS with Multisite subdomains – and show how to get SSL on Multisite by registering each subdomain first

Years ago, I had Dreamhost set up Wildcard DNS for me, but it frustrated me that I could never get secure HTTPS connections for the subdomains.

Turns out many people have also had issues with this. And although I still don’t have a Wildcard SSL certificate solution that works, I have found a work-around that will suit my present situation. 

Note

This work-around basically nullifies my Wildcard DNS because I have to register each subdomain individually from the Dreamhost Panel.

In any case, this is the setup I currently have and Dreamhost’s position on each:

  1. Wildcard DNS on Dreamhost
  2. WordPress Multisite (read this Before creating a Network)
  3. SSL on those Multisite subdomains
    • Not supported by Dreamhost unless using DreamCompute (requires additional configuration)

#1 Setup Wildcard DNS

Two simple steps:

  1. Upgrade your hosting plan to VPS or a Dedicated server
  2. Contact Dreamhost Support to set up Wildcard DNS for you

#2 Setup WordPress Multisite

First, ask yourself if you REALLY need a Multisite installation, and if so, how many subdomains you expect to need. In fact, it’s actually an easier option to opt for subfolders rather than subdomains for your extra sites as this would make your SSL and Wildcard DNS problems virtually disappear.

With subfolders

  • SSL would load from the root domain
  • You wouldn’t need to create additional subdomains at all

Second, ask yourself if you REALLY need Wildcard DNS. As noted above and below, Dreamhost doesn’t support Wildcard SSL certificates.

If you really need Wildcard DNS and Wildcard SSL 

  1. Consider moving to DreamCompute – which does support this (with additional configuration on your part)
  2. Plan to get your hands dirty doing this all on your own
  3. Consider moving to a hosting provider that supports this configuration
  4. Reconsider Wildcard SSL altogether and just accept that you’ll be registering subdomains through the Panel and getting Let’s Encrypt certificates for each one (as outlined below)

Articles to Read for Setting up Multisite

#3 Get SSL on your subdomains

Non-Wildcard SSL

The simplest way to get SSL on a subdomain is not to use wildcard subdomains in the first place. 

One of the most compelling reasons to use Multisite with Wildcard DNS is if you want to allow the creation of multiple subdomains without registering them through your Panel first. This would enable you to, for example, allow users on your website to create their own subdomain blogs within your larger site when they register or subscribe to your site’s membership plan. (This is the reason I’d originally wanted Wildcard DNS.)

But, the problem with hosting such a site on Dreamhost is that they don’t support Wildcard SSL certificates, so every site created through WordPress Multisite will say it’s “insecure” even if you load it over HTTPS (and Google Chrome will also put up a blocker alerting you of the fact).

Main idea

Don’t employ Multisite to (initially) create subdomains.

I tried the following methods to get SSL on my subdomains and each failed:

  1. Create a new subdomain (v2012.site.com) via Multisite
    • The subdomain does not use the main site’s SSL
  2. Register that same Multisite-created subdomain through the Dreamhost panel and “mirror” the site to the root site. Then get an SSL certificate for the “mirrored” domain (v2012.site.com)
    • “Mirroring” basically says “set up the exact same site at both locations and use the same SSL” – so again, only the main site’s SSL will work
  3. Change the “mirrored” site to “redirect”
    • This bypasses the subdomain altogether and maps all traffic from the subdomain directly to the main site (site.com)

Finally, after much trial-and-error, I stumbled upon Ian Dunn’s article that provides the solution.

Solution

Setup your subdomains as “Fully hosted”, but set the web root (Web Directory) to the same directory as the root domain. (And re-save SSL settings if applicable.)

Be sure to also now get yourself a FREE Let’s Encrypt SSL certificate before you save these Settings (click HTTPS under the Web Options section).

(Re)create the Site through WP Multisite

The problem with doing things this way is that now you’re no longer really taking advantage of your Wildcard DNS. And actually, just creating a subdomain through the Dreamhost Panel won’t set up WordPress Multisite to run on the subdomain.

So, the next step is to go back into your Multisite installation at the root of your domain and create (or delete and recreate) your subdomain Site.

Re-saving SSL settings

Now, if the (new) site still isn’t loading HTTPS securely, there are two possibilities for this:

  1. You didn’t wait long enough for the Let’s Encrypt certificate to take effect (in that case, refresh the page in 5-10 minutes and check again)
  2. You may need to re-save your SSL settings (as Ian Dunn outlines)

To re-save your SSL settings, click the https On link in the center of your Domain Registration listing table under the Manage Domains menu item.

On the next screen, check the box marked Copy non-secure settings and Save it.

Force HTTPS

There’s one more thing to be sure of – that HTTPS is always loaded regardless or whether or not an HTTP or HTTPS URL is accessed. You can do this with the following code inserted into the top of your .htaccess file in the root of your Multisite installation directory:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>

Create a WordPress Staging Site on Dreamhost Shared Hosting

These are some of my notes from setting up a WordPress staging site through Dreamhost using the Duplicator plugin.

I recently tried to access a website I’d created for a South Korean start-up over 2 years ago only to find that the entire contents of the web directory had been deleted. Within a day or two of this realization, the CEO contacted me and asked me to “fix” it.

Luckily for me, Dreamhost had updated the site in the last year and had created a complete archive of the site at /sitename.com.old. But, I didn’t want to run into this situation again in the future without a backup, so I decided to create a staging site for it. This was to accomplish 3 things:

  1. To maintain a FULL copy of the functioning website (as it is now)
  2. To teach me how to create a staging site so I can repeat the process with my personal sites
  3. To allow me to make changes to my websites that are not “live” – to test and debug them before implementing the changes on my “live” sites

Thankfully, Dreamhost and the Duplicator plugin make this process pretty painless. Here are the steps I took:

#1 Dreamhost

1. Create a .dreamhosters.com subdomain

Dreamhost provides FREE subdomains on the .dreamhosters.com domain to its customers. This is a recommended location to create a staging site. The following article outlines this process:

Creating a Staging WordPress site – Dreamhost Help

When you create the .dreamhosters.com subdomain, be sure to assign the same user to it as you are using for the original site. This will make the next step much easier.


Assign the same user to the subdomain as you are using for the original site.

2. Copy ALL files to the new subdomain

Personally, I’ve found it much much faster and easier to ssh into my site and copy all the files using the command line (rather than via FTP). For this to work, you’ll need to keep a few things in mind:

  1. Your FTP user needs Shell access (Enabling Dreamhost Shell Access).
  2. The same user needs access to BOTH the original site and the new subdomain so that when you ssh in, you can run the Linux copy command from the root folder.
  3. Now, in a Terminal window, ssh into the site, and run the following command to copy all site contents to the new subdomain.
[server]$ cp -a originalsite.com/. staging.dreamhosters.com

We’re copying the files over NOW because Dreamhost Shared hosting won’t allow us to create and download large archives with the Duplicator plugin. So it’s better to do the Two-Part Install instead of relying on Duplicator for the entire process.

#2 Duplicator

1. Install & run Duplicator on the original site

Dreamhost has a helpful article that lays out this process.

Migrating WordPress to DreamHost using the Duplicator plugin

But, rather than downloading the FULL SITE archive, we need to run the Two-Part Install – downloading only the database archive and installer file.

2. Create a new Database on Dreamhost

Complete step #8 from the previous article to create a new MySQL database on Dreamhost:

Creating a MySQL database – Dreamhost Help

3. Upload & run installer.php on the staging site

Continue the Migration tutorial from step #9. Upload BOTH the archive.zip and the installer.php files from Duplicator to your staging site via FTP. Then, navigate to the installer on your staging site:

http://stagingsite.dreamhosters.com/installer.php

When it asks for your database details, be sure to “Test Database” to make sure you can connect. Then run through the rest of the steps in the installer.

Also remember to “Remove installer files” after logging into your new /wp-admin area (there will be a link).

Review & Resources

Overall, the process of setting up a WordPress Staging Site with Dreamhost and Duplicator was much easier than I’d originally anticipated. Here is a condensed list of the steps and resources covered in the tutorial above.

Tools

  1. Dreamhost hosting
  2. Duplicator plugin

Steps

  1. Create a .dreamhosters.com subdomain (with the same user)
  2. Copy over ALL original site files (via ssh and the command line)
  3. Install Duplicator and run it to archive “Database Only”
  4. Upload the archive.zip and installer.php to your subdomain
  5. Create a new MySQL database in Dreamhost (same user)
  6. Navigate to subdomain.dreamhosters.com/installer.php
  7. Run through the remainder of the steps in the tutorial

Tutorials

  1. Dreamhost’s Migration tutorial
  2. Duplicator’s Two-step Install tutorial
  3. See also: Staging a DreamPress overview for tips on best practices:
    1. Password protecting your staging site
    2. Add an SSL certificate (with Let’s Encrypt)
    3. Transferring changes to your live site

Bonus: Get $50 off Dreamhost’s Unlimited shared hosting plan by clicking this link, or any of the other Dreamhost links above!

Disclaimer: (I will make a small commission if you decide to sign up for a Dreamhost plan using one of these links)

Move WordPress media uploads to a subdomain

I recently decided to move my WordPress media uploads to a subdomain to improve site speed and help keep things organized for better backups. These are the things I did and issues I ran into along the way.

I recently updated my personal homepage, and decided to collect all my writing about code from three other sites that I’d worked on over the years. So, I exported the Posts from each of those sites, and imported the .xml files to my new site in order to shift the Posts to my new homepage. Along the way, I decided to move my new site’s media uploads folder to a subdomain, and I ran into a few problems along the way.

Why move media to a subdomain

There are a couple of reasons for this:

  1. To speed up my site by allowing simultaneous downloads from multiple sources at once (almost acting like a mock CDN)
  2. To keep things organized and make taking site backups easier (by backing up the database and files separately)
  3. To do a “dry run” on a small site before attempting the same thing on a large site I run (400+ Posts)

How to move media to a subdomain

  1. Create the subdomain on your host files.sitename.com for example
  2. Download ALL the old media files from your WordPress /wp-content/uploads folder via FTP
  3. Upload ALL the media files to your new subdomain
  4. Change your Upload folder to the subdomain in your WordPress settings

You may need to type /wp-admin/options.php in the URL bar and scroll down to upload_path and upload_url_path as this menu option is not visible in the WordPress menu.

  • upload_path : directory root for subdomain
    • set it to /home/server_root/sitename/folder
    • Echo the following from an index.php file at the site root to find your directory root path: <?php echo $_SERVER["DOCUMENT_ROOT"]; ?>
    • Mine is /home/server_root/sitename/media
  • upload_url_path : actual URL path for the subdomain
    • Mine is https://files.sitename.com/media

After changing those options, you should see them appear now in the WordPress Settings → Media menu.

  1. Change your Live Image URLs with a database Search & Replace plugin (this is easier than phpMyAdmin). Two good options are:
    1. Search & Replace by Inpsyde GmbH
    2. Better Search Replace by Delicious Brains

(I actually prefer the first one because it seems to run faster (there is no loading bar at the bottom of the screen) and also includes the option to download an SQL backup of your database from the first screen in the plugin – and then import it again if your search/replace fails or causes problems.)

  • Search: http://www.oldsitename.com/uploads
  • Replace: http://subdomain.sitename.com/media

Double check everything is working by trying to upload a new image, and checking your old Posts that had loaded the older images (open a different page or empty the page cache first).

  1. Redirect images that are already indexed by search engines. Do this by adding the following to your .htaccessfile:
RedirectMatch 301 ^/wp-content/uploads/(.*)$ http://img.yoursite.com/$1
  1. Finally, it might be a good idea to create a homepage for the subdomain that directs visitors back to your main site or allows them to search it (otherwise they’ll be met with either a blank page or a 403 Access Forbidden error). Here’s a good article that provides more details, and an example.

Problems I ran into

  1. I have a number of Galleries on my old WordPress Posts, but the way the gallery references images is not with an image URL, but with the gallery shortcode. It looks like this:
[ gallery type="rectangular" link="none" size="medium" ids="31183,31184" ]

So, actually, even when I imported my old Posts to the new site, I didn’t get any of the old galleries showing up because the media IDs which are referenced in the gallery shortcode seem to not be the same on the new site – even if I click “Download and import file attachments.”

  1. When I checked the image code on the old site, it also looked like some of what the site was serving up were some kind of “responsive images.”

One of the themes I wrote before did add support for responsive images, so it seems like those are being served up a bit differently than “normal” images. For example, the URL of some of those images included https://io.wp or something similar – as if being loaded through a default WordPress CDN.

  1. Even after updating and changing everything, the images on my subdomain did not show up inside my Media Library.

Resources