Skip to content

Instantly share code, notes, and snippets.

View tlhunter's full-sized avatar
📸
photographing

Thomas Hunter II tlhunter

📸
photographing
View GitHub Profile
@tlhunter
tlhunter / maybe-observer.js
Created November 5, 2015 06:39
Observing and interfering with player-world interaction
'use strict';
/**
* Represents a single player
*/
let Player = function(x, y, health) {
this.events = {
encroach: [],
enter: [],
exit: []

Computing Needs

  • Ability to build and sign iOS Apps
  • Ability to play games in Steam library
  • Ability to develop applications on the go

Solutions

Keep Existing System ($0)

'use strict';
/**
* Experimenting with building a better grid based entity management system
* Uses more efficient Map/Set calls, requiring modern browsers / Node.js
*/
const SPAWNS = [
{x: 1, y: 1},
{x: 1, y: 2},
@tlhunter
tlhunter / average-geolocation.js
Created May 17, 2017 18:00
Calculate the center/average of multiple GeoLocation coordinates
/**
* Calculate the center/average of multiple GeoLocation coordinates
* Expects an array of objects with .latitude and .longitude properties
*
* @url http://stackoverflow.com/a/14231286/538646
*/
function averageGeolocation(coords) {
if (coords.length === 1) {
return coords[0];
}
@tlhunter
tlhunter / distance-geolocation.js
Created May 18, 2017 00:07
Get the distance between two points in meters
function getDistance(p1, p2) {
var radlat1 = Math.PI * p1.lat/180;
var radlat2 = Math.PI * p2.lat/180;
var theta = p1.lng - p2.lng;
var radtheta = Math.PI * theta/180;
var dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);
dist = Math.acos(dist);
dist = dist * 180 / Math.PI;
dist = dist * 60 * 1.1515 * 1.609344 * 1000;
return dist;
/**
* Proposing a new rule for no-unused-vars.args
* See http://eslint.org/docs/rules/no-unused-vars#args
* It would behave similar to after-used, except arguments with `error` sounding names should cause errors if ignored
* Configuring this manually with an array would be great
*/
/*eslint no-unused-vars: ["error", { "args": "after-used-and-errors", "errors": ["e", "err", "error"] }]*/
asyncWork((err, data) => { // e.g. args: all
@tlhunter
tlhunter / simple-cache.js
Last active October 6, 2017 19:58
In-Memory Namespaced Key Expiration Cache
/**
* In-Memory Namespaced Key Expiration Cache
*
* Assumptions: There's a finite amount of namespaces
* Data is frequently read
* Expirations don't happen frequently
* Self-cleaning, doesn't use setTimeout / setImmediate
*/
class SimpleCache {
constructor() {
# Setup Realm's PackageCloud repository
curl -s https://packagecloud.io/install/repositories/realm/realm/script.deb.sh | sudo bash
# Update the repositories
sudo apt-get update
# Install the Realm Object Server
sudo apt-get install realm-object-server-developer
# Enable and start the service
@tlhunter
tlhunter / challenge.eml
Last active November 30, 2017 16:39
Resignation Email Engineering Challenge
I included the following block of text, disguised to resemble a PGP sig, at
the end of my goodbye work email. It also included information about which
internal chat room to post the solution in. The first engineer to reply won
the recognition of our coworkers. Can you come up with the answer?
-----BEGIN SUPER FUN ENGINEERING CHALLENGE-----
IyBTdXBlciBGdW4gRW5naW5lZXJpbmcgQ2hhbGxlbmdlCgpDb25jYXRlbmF0ZSB0aGUgc29sdXRp
b24gdG8gZWFjaCBwcm9ibGVtIChzaW1wbGUgQVNDSUkpIGZvciB0aGUgZmluYWwgYW5zd2VyLgpF
YWNoIGFuc3dlciB3aWxsIGNvbnNpc3Qgb2YgbnVtYmVycyBhbmQgY2FwaXRhbCBsZXR0ZXJzLgpZ
b3Ugd2lsbCBrbm93IGlmIHlvdSBoYXZlIHRoZSBjb3JyZWN0IHN0cmluZyBpZiB0aGUgU0hBMSBz
// parent.js
const fork = require('child_process').fork;
const CHILDREN = require('os').cpus().length;
const pool = [];
const OPTS = {
stdio: [0, 1, 2, 'ipc']
};