Roblox Scripting Lesson 0

This blog post is brought to you by the developer of BitBudget. BitBudget is an automated budgeting app for Android and iOS which syncs with your bank account and helps you avoid overspending. If you’d like to quit living paycheck-to-paycheck and get a better handle on your finances, download it today! https://bitbudget.io

Quick little blog post here on how to get started with scripting in Roblox Studio. These two example scripts should be added under the ServerScriptService and the variable names should match the baseplate and part added to your blank starter project =>

local basePlate = game.Workspace.Baseplate
while true do
basePlate.BrickColor = BrickColor.new(1.0, 0.08, 0.58) --hot pink
wait(0.25)
basePlate.BrickColor = BrickColor.new(0.0, 1.0, 0.0) --lime green
wait(0.25)
basePlate.BrickColor = BrickColor.new(0.0, 1.0, 1.0) --aqua
wait(0.25)
basePlate.BrickColor = BrickColor.new(0.0, 1.0, 1.0) --purple
wait(0.25)
basePlate.BrickColor = BrickColor.new(1.0, 1.0, 0.0) --yellow
end
local practicePart = game.Workspace.PracticePart
while true do
practicePart.BrickColor = BrickColor.new(1.0, 0.08, 0.58) --hot pink
wait(0.25)
practicePart.BrickColor = BrickColor.new(0.0, 1.0, 0.0) --lime green
wait(0.25)
practicePart.BrickColor = BrickColor.new(0.0, 1.0, 1.0) --aqua
wait(0.25)
practicePart.BrickColor = BrickColor.new(0.0, 1.0, 1.0) --purple
wait(0.25)
practicePart.BrickColor = BrickColor.new(1.0, 1.0, 0.0) --yellow
end
 

Hello, World Tutorial with Turbolinks by topherPedersen & jaxatax

Really simple two page tutorial on adding Turbolinks magic to your traditional webapp in order to achieve a SPA (singe page application) feel without having to learn a complicated framework like React, Angular or Vue. Simply import Turbolinks, then call Turbolinks.visit() to load your pages in the background with Turbolinks & AJAX =>

<!DOCTYPE html>
<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/turbolinks/5.2.0/turbolinks.js"></script>
<style>
body {
background-color: blue;
}
a {
color: white;
}
</style>
</head>
<body>
<button onclick="Turbolinks.visit('mylink.html');">click me</button>
</body>
</html>
view raw index.html hosted with ❤ by GitHub
view raw mylink.html hosted with ❤ by GitHub
 

Adobe PhoneGap Hello, World APK

This blog post is brought to you by the developer of BitBudget. BitBudget is an automated budgeting app for Android and iOS which syncs with your bank account and helps you avoid overspending. If you’d like to quit living paycheck-to-paycheck and get a better handle on your finances, download it today! https://bitbudget.io

I’ve been experimenting at work with Apache-Cordova/Adobe-PhoneGap and am trying to find an easy way to distribute APKS generated using Adobe’s build service. Setting up development machines is probably too much work for the kids I teach, so just wanted to see if I can post an APK easily on my WordPress blog. So without futher ado… My Adobe PhoneGap Build Service Hello World APK =>

Download AdobePhoneGapHelloWorld

 

Wrapping up my Multiplayer PhaserJS/Socket.io Project, and Moving on to Photon

This blog post is brought to you by the developer of BitBudget. BitBudget is an automated budgeting app for Android and iOS which syncs with your bank account and helps you avoid overspending. If you’d like to quit living paycheck-to-paycheck and get a better handle on your finances, download it today! https://bitbudget.io

Just finished up with the multiplayer PhaserJS/Socket.io tutorial that I’ve been following along with and using in one of my classes that I teach. If you want to check out the finished project it’s hosted here => http://multiplayerdemo.xyz

I personally was really excited about playing around with NodeJS & Express & Socket.io, but my student happens to be really good at Unity3D and has happened to find a serverless platform-as-a-service style option for multiplayer called Photon that he really likes so… looks like it’s time to learn Photon!

I still don’t know exactly what all of our options are as far as multiplayer client-server options go, but apparently people have a lot of good things to say about Photon Unity 3D Networking (PUN).

 

12 Tutorials on How to Deploy an ExpressJS App to Production Using NGINX

This blog post is brought to you by the developer of BitBudget. BitBudget is an automated budgeting app for Android and iOS which syncs with your bank account and helps you avoid overspending. If you’d like to quit living paycheck-to-paycheck and get a better handle on your finances, download it today! https://bitbudget.io

  1. Configure Nginx as a web server and reverse proxy for Nodejs application on AWS Ubuntu 16.04 server
  2. Deploying Express.js website to VPS with Nginx, PM2 and Ubuntu 18.04
  3. Setting up Express with nginx and pm2
  4. How to run node.js server with Nginx
  5. How To Set Up a Node.js Application for Production on Ubuntu 16.04
  6. Production best practices: performance and reliability
  7. Deploying NodeJS using Express with NginX and Let’s Encrypt
  8. Installing Express/Nginx app with SSL using Certbot on Ubuntu 18.04
  9. Node.js Express Nginx

Working with the most advanced student at our school tomorrow and need to post a few references for our lesson, deploying an expressjs app to production. While the above 9 tutorials are pretty good, it looks like this 10th and 11th tutorials from DigitalOcean is probably the best:

And one last tutorial you’ll need to get NGINX setup and configured properly:

 

How to turn your Python Script into a Windows Executable (.exe)

Quick little tutorial on how to turn your python script into a real program:

  1. Install PyInstaller using pip
  2. Navigate to the directory containing your python script.
  3. Run PyInstaller
  4. Double click your newly created .exe file located in the dist subdirectory and enjoy!
$ pip install pyinstaller
# make cool python program
$ cd Desktop/PythonPlayground
$ pyinstaller --onefile cool_python_program.py
# double click cool_python_program.py in Desktop/PythonPlayground/dist directory
 

Simple Leaderboard Tutorial in PHP & JS

This blog post is brought to you by the developer of BitBudget. BitBudget is an automated budgeting app for Android and iOS which syncs with your bank account and helps you avoid overspending. If you’d like to quit living paycheck-to-paycheck and get a better handle on your finances, download it today! https://bitbudget.io

Quick little tutorial on creating a leaderboard for a PhaserJS game with PHP and a little JS =>

// Guys, we need to write a little javascript here
// to add the user's score to our database
var playerName = "nUb";
var score = points;
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
// document.getElementById("demo").innerHTML = this.responseText;
alert(this.responseText);
}
};
xhttp.open("POST", "add_score_to_leaderboard.php", true);
var myFormData = new FormData();
myFormData.append("playerName", playerName);
myFormData.append("score", score);
xhttp.send(myFormData);
<?php
$playerName = $_POST['playerName'];
$score = $_POST["score"];
$servername = "localhost";
$username = "shranos_admin";
$password = "letsgo";
$dbname = "shranos_db";
// Create connection
$conn = new mysqli($servername,$username,$password,$dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: ".$conn->connect_error);
}
// $sql = "INSERT INTO leaderboard_table (username_column, highscore_column) VALUES ('aNub', 0)";
$sql = "INSERT INTO leaderboard_table (username_column, highscore_column) VALUES ('" . $playerName . "', " . $score . ")";
if ($conn->query($sql)===TRUE) {
// echo "New record created successfully";
echo "your moms score added to leaderboard, thx noob";
} else {
// echo "Error: ".$sql."<br>".$conn_error;
echo "ERROR: PC LOAD LETTER";
}
$conn->close();
?>
 

Introduction to Game Development Lesson 0: Pong

Simple Pong by Peter Kwak (Edited by Topher Pedersen)

On my way back to Dallas from Austin on Labor Day I happened to hear about this really awesome course on game development from Harvard University taught by David Malan (of CS50) and Colton Ogden. I immediately enrolled in the course via edX.org on my phone, and jumped right into lesson 0 after I arrived back in Dallas.

One of the things that I really liked about the course is that they kick things off with one of the original video games, Pong. When I first started teaching at theCoderSchool this was one of the first games I built myself to make sure I knew what I was doing when it game to programming simple 2D games in Python with my students. That first summer of teaching we actually used an extremely slimmed down ~100 line version of the game one of my coworkers Peter Kwak wrote for our summer camp.

Fast forward a few hours though, and I’ve quickly fallen out of love with Malan & Ogden’s course. While the Lua programming language and Love2D game engine seem really promising, their code examples haven’t been updated in two years, and include bugs that prevent them from running. While I was able to find a bug fix that someone posted in the YouTube comments for the course lecture, I realized that the 100 line program that Peter wrote is actually a lot better for teaching purposes than the one used in the Harvard CS50 Game Development Course on edX. So…

I busted out Peter Kwak’s old code, and modified it a little bit so I can run it using real Python instead of the trinket.io web based stuff we were using at camp. I imagine I will probably need to make a lot of tweaks to this code, however, I’m tossing two of my 10 year old students into the deep end of the pool tomorrow with Lesson 0: Pong =>

# Copyright (c) 2018 Peter Kwak (Edited by Chris Pedersen)
# This is free and unencumbered software released into the public domain.
# For more information, please refer to <http://unlicense.org/>
import turtle
# Create Game Window
screen = turtle.Screen()
# screen.setup(500, 400)
screen.screensize(500, 500, "black")
screen.bgcolor("black")
# screen.addshape("Paddle.jpg")
# Create Ping Pong Ball
ball = turtle.Turtle()
ball.penup()
ball.speed(0)
ball.shape("circle")
ball.color("white")
# Create Left Ping Pong Paddle
paddle1 = turtle.Turtle()
paddle1.penup()
paddle1.speed(0)
paddle1.setx(-200)
paddle1.shape("square")
paddle1.shapesize(4.5, 1, 0)
paddle1.fillcolor("white")
# Create Right Ping Pong Paddle
paddle2 = turtle.Turtle()
paddle2.penup()
paddle2.speed(0)
paddle2.setx(200)
paddle2.shape("square")
paddle2.shapesize(4.5, 1, 0)
paddle2.fillcolor("white")
# Create Scoreboard
scoreWriter = turtle.Turtle()
scoreWriter.penup()
scoreWriter.speed(0)
scoreWriter.hideturtle()
scoreWriter.color("white")
# Set Ball Trajectory
rise = 3
run = 3
# Set Score
score1 = 0
score2 = 0
# Create Function Which Will Move Player 1's Paddle Up
def up1():
paddle1.sety(paddle1.ycor() + 50)
# Create Function Which Will Move Player 1's Paddle Down
def down1():
paddle1.sety(paddle1.ycor() - 50)
# Create Function Which Will Move Player 2's Paddle Up
def up2():
paddle2.sety(paddle2.ycor() + 50)
# Create Function Which Will Move Player 2's Paddle Down
def down2():
paddle2.sety(paddle2.ycor() - 50)
# Create Function To Update Scoreboard
def updateScoreboard():
global scoreWriter
global score1
global score2
global ball
scoreWriter.clear()
myFont = ("Arial", 40, "bold")
scoreWriter.goto(-100, 150)
scoreWriter.write(score1, font=myFont)
scoreWriter.goto(100, 150)
scoreWriter.write(score2, font=myFont)
ball.goto(0, 0)
# Set Event Listeners
# These event listeners will listen for button presses (up, down, etc.)
screen.onkey(up1, "w")
screen.onkey(down1, "s")
screen.onkey(up2, "Up")
screen.onkey(down2, "Down")
screen.listen()
# Create Main Game Loop (Simulates Time, Keeps Game Running)
while True:
# Move Ball
ball.goto(ball.xcor() + run, ball.ycor() + rise)
# Detect Top or Bottom Boundary Strike
# (Reverses the Ball's Direction of Travel)
if ball.ycor() > 200 or ball.ycor() < -200:
rise = -rise
# Detect Paddle Strike (Player 1)
# (Also Reverses the Ball's Direction of Travel)
if abs(paddle1.xcor() - ball.xcor()) < 15:
if abs(paddle1.ycor() - ball.ycor()) < 50:
run = -run
# Detect Paddle Strike (Player 2)
# (Also Reverses the Ball's Direction of Travel)
if abs(paddle2.xcor() - ball.xcor()) < 15:
if abs(paddle2.ycor() - ball.ycor()) < 50:
run = -run
# Detect When A Player Scores a Point
if ball.xcor() > 250:
# Increment player1's score by 1 point when his ball
# travels past the paddle of his opponent, player 2.
score1 = score1 + 1
updateScoreboard()
ball.goto(0, 0)
elif ball.xcor() < -250:
# Increment player2's score by 1 point when his ball
# travels past the paddle of his opponent, player 1.
score2 = score2 + 1
updateScoreboard()
ball.goto(0, 0)
# Christine, My Super Sweet AI Goes HERE...
if ball.ycor() > paddle2.ycor() + 25:
paddle2.sety(paddle2.ycor() + 15)
elif ball.ycor() < paddle2.ycor() - 25:
paddle2.sety(paddle2.ycor() - 15)
view raw pong.py hosted with ❤ by GitHub
 

MoneyPhone, the First Official Sponsor of BudgetMealPlanner.com

This blog post is brought to you by the developer of BitBudget. BitBudget is an automated budgeting app for Android and iOS which syncs with your bank account and helps you avoid overspending. If you’d like to quit living paycheck-to-paycheck and get a better handle on your finances, download it today! https://bitbudget.io

A few weeks ago I decided to give Gabriel Weinberg’s book, Traction, a second read. Long story short: Weinberg suggests trying many many different marketing channels when launching a startup. Shortly after picking the book back up I heard about a blog that I was particularly interested in sponsoring on the Indie Hackers Podcast called BudgetMealPlanner.com.

If you haven’t heard of it, BudgetMealPlanner.com is a blog with recipes or meal plans for eating on $5 a day! Pretty neat right? Personally I try to stay under $6 per meal, but BudgetMealPlanner is all about $5 for the whole day, which I think is really incredible and definitely falls into the same sort of category as my app, Frugal Living, Minimalism, Etc.

So without further ado, my first email marketing campaign =>