The Beginning of the End
12/07/15
So, longest bout of silence yet there, Stephan.
I kinda went to the dark place I go sometimes. I mean, as far as dark places go, it's pretty great. I wasn't sad or anything.
I just didn't care.
Apathy is so insidious. Fighting it takes the initiative that apathy explicitly destroys. The best idea that comes when its around is to embrace it and let it run its course.
But it never runs its course.
It just becomes the default mode of behaviour.
Only once I recognize that I'm deep into habits and patterns I don't want to be perpetuating to have gain the motivation to fight back. And by then it's a long, grueling, uphill battle.
And the whole time I feel like I don't care.
I'd rather read Cucumber Quest.
But even consumption of entertainment I find legitmately amazing and high-quality becomes a hollow endeavour.
The only thing that makes me feel better is doing work. Something significant, but I just didn't feel like I could legitimately make that choice.
It's like a choice in an RPG that isn't really a choice.
Okay, I want to do something productive.... My choices are reddit or the Super Smash Bros. subreddit....
Ugh.
I went a whole month without reddit, or webcomics, or any of the things I decided were vices that I should avoid for now. And then I binged on all of them for way too long.
It's times like these I'm greatful that my addictions are just a horrible waste of my time and nothing properly destructive.
Welp, time to try again.
And by try again I mean start over.
And before I start over, I need things to end.
And by "things", I mean this site.
I was going to start over in January, but might as well start things early.
The basic plan is to pick this whole site up and stuff it somewhere like ksionda.me/2015, or something.
And then I'll go through the site-making process I started oh-so-long ago again, but this time with some amount of experience.
And perhaps more explicit goals of what I plan to do with it.
The Fire Has Died
11/25/15
There was a fire here....
It grew slowly, but confidantly.
Before long it cackled maniacally as it consumed everything it was fed.
There was no stopping it.
A fire that would warm the world.
But it has died.
I know not why.
Its warmth lingers.
A fading promise.
Mocking me.
I feel hollow.
Game Jam Caffeinated: My Game
11/23/15
So, this past weekend I was kinda silent on this blog. For semi-good reasons, Stephan! Well, no, not really, I should have been live-blogging what I was doing.
In any case, there was a game jam, and I made a game. Usually, I try and make the game fit in the post, but.... Eh, I can change it so it fits in this post. It might be a bit... crowded, but that's fine for now.
Forcing Crafty Through TypeScript
11/18/15
So, as I've said, I'm playing with TypeScript while interfacing with Crafty.
This has already been quite interesting, and hopefully will provide dividends down the line with some deeper Crafty API understanding.
And already I'm finding myself doing... questionable things with TypeScript, and I'm not sure if it's TypeScript's typeness, or Crafty's craftiness.
Let me show you what I got so far.
The definition file:
// Type definitions for craftyjs
// Project: http://craftyjs.com/
// Definitions by: Gregory "Rory" Ksionda <https://github.com/ksiondag>
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
declare module CraftyJS {
interface Static {
(selector: string): AnyEntity;
(id: number): AnyEntity;
init(width: number, height: number, divId: string): void;
e(...components: string[]): AnyEntity;
c(name: string, definition: Component): void;
}
interface Component {
// Stuff Crafty itself checks for
init?(): void;
required?: string;
// Components are user-defined objects that plug into entities
// Very flexible creation
[index: string]: any;
}
/*
All entities have these properties
*/
interface Core<T> {
addComponent(...components: string[]): void;
requires(components: string): void;
// Setting values
attr(property: string, value: any, silent?: boolean, recursive?: boolean): T;
attr(map: Object, silent?: boolean, recursive?: boolean): T;
// Getting values
attr(property: string): any;
}
interface TextComponent<T> extends Core<T> {
text(value: string): T;
textFont(value: TextFont): T;
}
/*
Entities could have any number of defined functions depending on their
components
*/
interface AnyEntity extends TextComponent<AnyEntity>, Core<AnyEntity> {
}
interface TextFont {
size?: string
}
}
declare var Crafty: CraftyJS.Static;
My typescript_experiment.ts file:
/// <reference path="../../../Crafty/crafty.d.ts" />
module CraftyJS {
export interface Static {
e(component: 'Player'): PlayerEntity;
}
export interface PlayerComponent<T> extends TextComponent<T>, Core<T> {
}
export interface PlayerEntity extends PlayerComponent<PlayerEntity> {
}
export interface AnyEntity extends PlayerComponent<AnyEntity> {
}
}
(function () {
var player: CraftyJS.PlayerEntity;
Crafty.init(600, 900, 'game');
Crafty.c('Player', {
init: function () {
var self: CraftyJS.PlayerEntity = this;
self.addComponent('DOM', '2D', 'Text');
}
});
player = Crafty.e('Player')
.attr({
x: 0,
y: 0,
h: 900,
w: 600
})
.text('Made with TypeScript')
.textFont({
size: '40px'
});
})();
Now, this code has already gone through quite a few iterations since inception. All of which compiled to basically the same JavaScript code without errors.
This structure is the structure I like best so far, but it still has problems.
But let's talk about the stuff I like first.
interface Static {
(selector: string): AnyEntity;
(id: number): AnyEntity;
init(width: number, height: number, divId: string): void;
e(...components: string[]): AnyEntity;
c(name: string, definition: Component): void;
}
...
declare var Crafty: CraftyJS.Static;
This is a subset straight from the
API documentation,
and it works quite nicely. All the calls to the functions in
typescript_experiment.ts
compile as they should.
Now, then, the stuff I struggled with:
/*
All entities have these properties
*/
interface Core<T> {
addComponent(...components: string[]): void;
requires(components: string): void;
// Setting values
attr(property: string, value: any, silent?: boolean, recursive?: boolean): T;
attr(map: Object, silent?: boolean, recursive?: boolean): T;
// Getting values
attr(property: string): any;
}
interface TextComponent<T> extends Core<T> {
text(value: string): T;
textFont(value: TextFont): T;
}
/*
Entities could have any number of defined functions depending on their
components
*/
interface AnyEntity extends TextComponent<AnyEntity>, Core<AnyEntity> {
}
I'm having a lot of trouble translating Crafty's component-based system into an intelligent and DRY type setup.
This is the closest I've gotten so far. An entity extends the components it's made up of (along with the core that all entities have).
Components are defined with Generics. This was the only way I could set it up so that chaining retains the entity's set type.
Hopefully soon
there'll be a
this
type
I can use that'll fix the main problem.
But I think I would also like some means of telling TypeScript that calling a function extends a type. Something like:
interface Core<T> {
addComponent(component: 'Player'): T extends PlayerComponent<T>;
}
Being able to do more than one extend with a splat definition would be cool, too.
interface Static {
e(...components: string[], 'Player', ...components: string[]): extends PlayerComponent<T>;
e(...components: string[], 'Text', ...components: string[]): extends TextComponent<T>;
e(...components: string[]): Entity;
}
Where extends in this context would specify that the base return type of the function is extended by each match of the other function definitions.
But perhaps that's kinda a weird thing to want out of the static typing. I'm not familiar enough with JavaScript idioms and TypeScript's ideal considerations of JavaScript.
If I want to gain a better understanding, though, it's probably worth
it to bring it up as an issue like that
this
link above.
Anyways, I'm still quite enjoying TypeScript, though I'm letting myself get too sucked into semantics, as fun as I find it.
The next post should be something that can be properly be played with.
Bad Day
11/17/15
There's nothing about today that makes it a bad day.
It was just a bad day.
The best thing about today is that the worst thing about today is that there's no reason today should've been a bad day.
It was just a bad day.
TypeScript: Quick Try
11/16/15
I made a thing with Crafty, but in TypeScript this time.
Can you say "best game yet?".
....
No?
Well, it should be the last filler game, I swear. I need to buckle down and prepare for the Game Jam this weekend.
Anyways, I've started messing with TypeScript. Verdict so far? I like it a lot actually.
It's kind of interesting, there's this period of time where programmers seem to tire of telling the computer everything it should expect, and that's why dynamic languages are around (kinda). And then there's this period of time where I wish the computer will tell me everything it can to warn me if I'm doing something stupid that the computer is better at noticing than me.
TypeScript has this perfect sort of balance. It'll warn me about the red flags it's noticed, and then go right along compiling the javascript as it'll run.
Like, if the ts file is just javascript, it'll warn me about how nothing is typed, and then give me a js file with that exact same javascript.
Meaning I can take advantage of the dynamic nature of javascript when I feel like it, and have a helpful system help me clean it up when I want things more rigourously defined/designed.
Another cool thing is that I can take any regular javascript library I want to use, and make a type definitions file for it so the typescript code I wrote doesn't throw any warnings about interfacing with that library.
If I wait until the compiler warns me about my misunderstood connection to whatever javascript library (currently craftyjs), then I can know exactly what bits of a library I want to properly understand and avoid the tendency to jump into wasting a bunch of time researching a library before trying to use it for anything.
I think I'll continue messing with this language for a bit.
Building my Own Craft(y)
11/15/15
So, of the various, admittedly-few JavaScript game-libraries I've tried, I quite like Crafty. I'm thinking I might want to make my own at some point, and to me that means I should dig into Crafty's construction and get an idea of how it ticks. From there, I may have some ideas on the game library I want to make.
So, I've forked the main Crafty repository so that I had my own, and from there started digging around.
For some reason, I thought that Crafty was made in CoffeeScript, but it turns out only a few files are in the language. I guess I'll figure out what that's all about at some point.
In any case, I figured if there's some coffee in there anyways, I
might as well make that rather ugly
Gruntfile.js
a not-so-ugly
Gruntfile.coffee.
So this:
require("coffee-script");
var fs = require('fs');
var open = require("open");
module.exports = function (grunt) {
var pkg = grunt.file.readJSON('package.json');
var version = pkg.version;
var banner = '/**\n' +
' * <%= pkg.name %> <%= pkg.version %>\n' +
' * <%= pkg.author.url %>\n *\n' +
' * Copyright <%= grunt.template.today("yyyy") %>, <%= pkg.author.name %>\n' +
' * Dual licensed under the MIT or GPL licenses.\n' +
' */\n\n';
var docGen = function() {
var outputFile = "./build/api.json";
var sourceParser = require("./build/parseSourceDocs");
var apiGenerator = require("./build/parseNodes");
var sourceFiles = grunt.file.expand('src/**/*.js');
var blocks = sourceParser.parse(sourceFiles);
var jsonObject = apiGenerator.structureBlocks(blocks);
var apiJSON = JSON.stringify(jsonObject, null, 4);
grunt.file.write(outputFile, apiJSON);
grunt.log.writeln("Wrote api data to " + outputFile);
};
var apiServer = require("./build/api-gen/dynamic-server.js");
function runApiServer() {
var done = this.async();
apiServer(grunt, "./build/api.json");
setTimeout(function(){
open("http://localhost:8080");
}, 100);
}
// Project configuration.
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
usebanner: {
dist: {
options: {
position: 'top',
banner: banner
},
files: {
src: ['crafty.js']
}
}
},
browserify: {
dist: {
files: {
'crafty.js': ['src/crafty.js']
},
options: {
transform: ['brfs']
}
},
debug: {
files: {
'crafty.js': ['src/crafty.js']
},
options: {
debug: true,
transform: ['brfs']
}
}
},
watch: {
files: ['src/*.js'],
tasks: ['build:dev']
},
uglify: {
options: {
banner: banner
},
build: {
src: 'crafty.js',
dest: 'crafty-min.js'
}
},
jshint: {
files: ['Gruntfile.js', 'src/**/*.js', 'tests/**/*.js'],
options: {
trailing: true,
ignores: ['tests/lib/*.js'],
globals: {
}
}
},
qunit: {
all: ['tests/index.html']
},
'node-qunit': {
all: {
deps: 'tests/lib/helperFunctions.js',
code: 'tests/index_headless.js',
tests: [
'tests/common.js',
'tests/core.js',
'tests/2d.js',
'tests/logging.js',
'tests/controls.js',
'tests/events.js',
//TODO add these once isometric adapted:
//'tests/isometric.js',
'tests/math.js',
'tests/model.js',
'tests/storage.js',
'tests/systems.js',
'tests/time.js',
'tests/tween.js',
'tests/issue746/mbr.js',
'tests/issue746/pos.js',
'tests/2D/collision/collision.js',
'tests/2D/collision/sat.js'
],
setup: {
log: {
errors: true,
//tests: true,
globalSummary: true
}
},
done: function(err, res) {
if (!err)
grunt.log.ok("NODE TESTS SUCCESSFUL");
else
grunt.log.error("NODE TESTS FAILED");
}
}
},
jsvalidate: {
files: ['crafty.js', 'tests/**/*.js']
},
connect: {
server: {
options: {
keepalive: true
}
}
},
open: {
api : {
path: 'http://localhost:8080/',
},
}
});
// Load the plugin that provides the "uglify" task.
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-contrib-qunit');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-contrib-connect');
grunt.loadNpmTasks('grunt-jsvalidate');
grunt.loadNpmTasks('grunt-browserify');
grunt.loadNpmTasks('grunt-banner');
grunt.loadNpmTasks('grunt-node-qunit');
grunt.registerTask('version', 'Takes the version into src/version.js', function() {
fs.writeFileSync('src/version.js', 'module.exports = "' + version + '";');
});
// Build development
grunt.registerTask('build:dev', ['browserify:debug', 'usebanner']);
// Build release
grunt.registerTask('build:release', ['browserify:dist', 'usebanner']);
// Building the documentation
grunt.registerTask('api', "Generate api documentation", docGen);
// Default task.
grunt.registerTask('default', ['build:dev', 'jsvalidate']);
// Run the test suite
grunt.registerTask('check', ['build:dev', 'jsvalidate', 'qunit', 'node-qunit', 'jshint']);
// Make crafty.js ready for release - minified version
grunt.registerTask('release', ['version', 'build:release', 'uglify', 'api']);
// Run only tests
grunt.registerTask('validate', ['qunit', 'node-qunit']);
grunt.registerTask('api-server', "View dynamically generated docs", runApiServer);
grunt.registerTask('view-api', ['api', 'api-server'] );
};
Became this:
require "coffee-script"
fs = require "fs"
open = require "open"
module.exports = (grunt) ->
pkg = grunt.file.readJSON "package.json"
version = pkg.version
banner = """
/**
* <%= pkg.name %> <%= pkg.version %>
* <%= pkg.author.url %> *
* Copyright <%= grunt.template.today("yyyy") %>, <%= pkg.author.name %>
* Dual licensed under the MIT or GPL licenses.
*/
"""
docGen = ->
outputFile = "./build/api.json"
sourceParser = require "./build/parseSourceDocs"
apiGenerator = require "./build/parseNodes"
sourceFiles = grunt.file.expand "src/**/*.js"
blocks = sourceParser.parse sourceFiles
jsonObject = apiGenerator.structureBlocks blocks
apiJSON = JSON.stringify jsonObject, null, 4
grunt.file.write outputFile, apiJSON
grunt.log.writeln "Wrote api data to #{outputFile}"
apiServer = require "./build/api-gen/dynamic-server"
runApiServer = ->
done = @async()
apiServer grunt, "./build/api.json"
setTimeout (-> open "http://localhost:8080"), 100
grunt.initConfig
pkg: pkg
usebanner:
dist:
options:
position: "top"
banner: banner
files:
src: ["crafty.js"]
browserify:
dist:
files:
"crafty.js": ["src/crafty.js"]
options:
transform: ["brfs"]
debug:
files:
"crafty.js": ["src/crafty.js"]
options:
debug: true
transform: ["brfs"]
watch:
files: ["src/*.js"]
tasks: ["build:dev"]
uglify:
options:
banner: banner
build:
src: "crafty.js"
dest: "crafty-min.js"
jshint:
files: ["Gruntfile.js", "src/**/*.js", "tests/**/*.js"]
options:
trailing: true
ignores: ["tests/lib/*.js"]
qunit:
all: ["tests/index.html"]
"node-qunit":
all:
deps: "tests/lib/helperFunctions.js"
code: "tests/index_headless.js"
tests: [
"tests/common.js"
"tests/core.js"
"tests/2d.js"
"tests/logging.js"
"tests/controls.js"
"tests/events.js"
#TODO add these once isometric adapted:
#"tests/isometric.js"
"tests/math.js"
"tests/model.js"
"tests/storage.js"
"tests/systems.js"
"tests/time.js"
"tests/tween.js"
"tests/issue746/mbr.js"
"tests/issue746/pos.js"
"tests/2D/collision/collision.js"
"tests/2D/collision/sat.js"
]
setup:
log:
errors: true
#tests: true
globalSummary: true
done: (err, res) ->
if not err
grunt.log.ok "NODE TESTS SUCCESSFUL"
else
grunt.log.error "NODE TESTS FAILED"
jsvalidate:
files: ["crafty.js", "tests/**/*.js"]
connect:
server:
options:
keepalive: true
open:
api :
path: "http://localhost:8080/"
# Load the plugin that provides the "uglify" task.
grunt.loadNpmTasks "grunt-contrib-uglify"
grunt.loadNpmTasks "grunt-contrib-jshint"
grunt.loadNpmTasks "grunt-contrib-qunit"
grunt.loadNpmTasks "grunt-contrib-watch"
grunt.loadNpmTasks "grunt-contrib-connect"
grunt.loadNpmTasks "grunt-jsvalidate"
grunt.loadNpmTasks "grunt-browserify"
grunt.loadNpmTasks "grunt-banner"
grunt.loadNpmTasks "grunt-node-qunit"
grunt.registerTask "version", "Takes the version into src/version.js", ->
fs.writeFileSync "src/version.js", "module.exports = \"#{version}\";"
# Build development
grunt.registerTask "build:dev", ["browserify:debug", "usebanner"]
# Build release
grunt.registerTask "build:release", ["browserify:dist", "usebanner"]
# Building the documentation
grunt.registerTask "api", "Generate api documentation", docGen
# Default task.
grunt.registerTask "default", ["build:dev", "jsvalidate"]
# Run the test suite
grunt.registerTask "check", ["build:dev", "jsvalidate", "qunit", "node-qunit", "jshint"]
# Make crafty.js ready for release - minified version
grunt.registerTask "release", ["version", "build:release", "uglify", "api"]
# Run only tests
grunt.registerTask "validate", ["qunit", "node-qunit"]
grunt.registerTask "api-server", "View dynamically generated docs", runApiServer
grunt.registerTask "view-api", ["api", "api-server"]
I think it looks better and is quite a bit more readable. I think, even if I don't stick with CoffeeScript (more on those thoughts in a later post), I'd probably keep it around for Gruntfile configs, as it just looks more like a config should, I think.
A Quick Tangent on Arrow Functions
I also found out that there's a difference between "=>" and "->" in CoffeeScript. Best shown with a quick example of the compile differences:
# CoffeeScript
x = ->
return this
y = =>
return this
// JavaScript
(function() {
var x, y;
x = function() {
return this;
};
y = (function(_this) {
return function() {
return _this;
};
})(this);
}).call(this);
The skinny arrow (actual CoffeeScript terminology) actually returns whatever "this" the function in JavaScript gets fed (there are various ways for a function to have a proper this, and various ways for it to have an improper or undefined one).
The fat-arrow function definition creates a function that has a clear clojure reference to the this of the area where the function is created.
Interestingly enough, this is similar to ES6's implementation of the arrow function vs the original function functionality.
Here I've made a file called
es6.js:
var thing = {
foo: 'bar'
};
this.bar = 'foo';
var this_thing = function () {
console.log(this);
};
this_thing.call(thing);
var not_this_thing = () => {
console.log(this);
};
not_this_thing.call(thing);
$ node es6.js
{ foo: 'bar' }
{ bar: 'foo' }
Using "function" to create the function made it possible to feed in a this with the call command. Trying the same thing with "=>" did nothing, as this was the same this was a clojure of the this the function was made in.
Back to Crafty
So, once I realized that Crafty wasn't in CoffeeScript, I wondered, "Why the Gruntfile?"
Well, as it turns out, Crafty isn't one large JavaScript file, it's a smartly laid out bunch of files that are consolidated into a single file using browserify, and then from there, if you want, you can minimize it using uglify.
There's also tests! Written in a unit-test framework called QUnit. Another testing framework to add to the pile.
There's also stuff in the Gruntfile to generate the API documentation, and start a localhost server to look at it. Which is decently neat!
Generating my Own Crafty
So, I have a copy of crafty.js from a download a while ago. Now, this can be the crafty.js that I build, and because I'll have the regular crafty.js when I need it, I can serve the minified one instead (for the sake of it).
And I'll also make sure it's built properly when I push to my server repo by updating my site update script:
git pull origin master
git submodule update --init --recursive
npm install
node scripts/htmlGenerate.js
node scripts/rssGenerate.js
node scripts/indexGenerate.js
cd Crafty
npm install
grunt version build:release uglify
And now I symbolically link my site's copy of crafty.js to point to my build of crafty.js, and I managed to not break anything.
Woo!
But... Why Do This At All?
....
Because I can?
Well, there are other reasons, but I'll share those in another post.
Site Setup Refactor
11/15/15
Nothing should look different, but I am now no longer saving generated files to the site repository I carry around with me.
It used to be that I wrote directly in the html files that I served, and then copy-pasted the blog content into the main blog index area. From there, I would hopefully remember to update my RSS file by hand, and oftentimes make a mistake in the item.
Now, I have a views area where I keep each post's title, date published, blog content, and RSS content saved in their file. The various shared code between posts is now saved in a template file, and I have a script that publishes the posts in proper HTML form to my public area, and properly generates the RSS file of interest.
So, finally, I have a system that doesn't repeat itself too much, and has decoupled what I serve to what I create in. But I was still saving the generated content that I served.
So, I wanted to remove the generated files from the repo. The
problem? I don't generate files when I push them from my local setup
to the server that is
ksionda.me.
The solution? Create a script that does do that thing, and call that
script in my current
site_push.bash
script.
So, my push script originally looked like:
#!/bin/bash
git push origin master
git push upstream master
ssh rory@ksionda.me "cd nodeSite && git pull origin master"
This would push my local repo to the server's bare git repo, and then ssh to the server's instance of the repo, and pull from the repo that the local repo just pushed to, thus updating all the HTML I had pushed.
Now, the script looks like this:
#!/bin/bash
git push origin master
git push upstream master
ssh rory@ksionda.me "cd nodeSite && ./site_update.bash"
This is itself a script saved in the repo:
git pull origin master
git submodule update --init --recursive
npm install
node scripts/htmlGenerate.js
node scripts/rssGenerate.js
node scripts/indexGenerate.js
It does the original functionality of pulling from the main bare repo. It then also updates all subrepos in the repository as necessary. It also generated the node_modules (which used to also be saved in the repo).
And then my scripts that generate all the served content are run, so there's no noticable difference that those files are no longer saved in the repo.
Things are really cleaning up nicely now that I'm getting near the end of this site. Hopefully, it means I'll have good reference material for when I start over.
Home System: First Focus on Tracking
11/15/15
Okay, so I want a home system for productivity like I have a work system for productivity. I know from experience simply copying the work system won't be effective.
I need to go through the process that made my work system to make my home system. And I think, really, the first step to any system is tracking what I'm currently doing. Like, really getting good data, and from there mutating away the things I don't like about my current, naturally-occurring system.
So, I'm just going to try to track what I'm doing to about a half-hour resolution, and work on getting consistent at that. Once I feel consistent at that, I'll try my hand at formalizing the system I've naturally invoked, and updating it bit-by-bit.
SSBM Tournaments
11/15/15
So yesterday and the day before I went to two different Super Smash Bros. Melee tournaments. One was just a weekly, and I was exhausted before it started, and left before I was eliminated from it, but the other was a massive tournament called Rewired, and I actually made it out of pools into the pro bracket.
Only to get completely stomped as soon as the pro bracket started. What's great is I have video of it, so I have something I can hopefully study to get a bit better.
Boy, is watching that going to be painful though. So, so painful.
Actually, not too bad. I got some work to do, but it isn't insurmountable. Part of it was nerves, I think, as I was doing a lot of things I don't normally do.
Game Dev Meeting: Love2D
11/12/15
Announcements
Game night this Friday.
Come to IEEE (ECE 105) and play some games.
Game jam next Friday.
Come to IEEE and make a game!
Ryan, from RedBull, is hosting a Destiny tournament this Saturday happening at Amazing Discoveries. Going to compete in a fire team. Win and go to the RedBull studios in Santa Montica.
First gaming tournament by the U of A RedBull team. Just show up.
Free redbull for everyone!
Love2D
What is LOVE? (Insert obvious joke)
- Free
- Simple
- Cross-platform
- Lua-Based
- 2D
...game engine!
I've got it good, what do I need with LOVE?
LOVE is a great...
- First game engine
- Prototyping tool
- Engine for game jams (hint, hint)
- Friend for those lonely winter nights
What's the catch?
Well, LOVE also...
- Has no user interface, just code
- Can't export to web or mobile
- Requires plugins for a lot of functionality
- Cannot be hugged
-
Doesn't provide a lot natively
- No default animation library
How do I get started?
You will need...
- The engine itself (from love2d.org)
- A text editor (recommends Sublime with their LOVE setup)
Time for a Live Demo!
Note: I tried to follow along, but I haven't validated the code I copied along the way. I'm sorry if some of it doesn't work.
Some technical difficulties.
Empty folder start.
Save new file in that folder ("main.lua").
You now have a LOVE project.
From there drag the main file onto the LOVE executable to start it. Right now, it's a blank game.
function love.load()
end
This is how a function is defined. love.load is the first "callback" function called.
function love.load()
love.graphics.setBackgroundColor(255, 0, 0)
end
This makes the background red.
function love.draw()
love.graphics.circle('fill', 400, 300, 20)
end
Where rendering is done. This draws a white circle in the middle of the screen.
function love.draw()
love.graphics.setColor(0, 255, 0)
love.graphics.circle('fill', 400, 300, 20)
end
Now the circle is green.
function love.draw()
love.graphics.setColor(0, 255, 0, 0)
love.graphics.circle('fill', 400, 300, 20)
end
Now, the circle is invisible.
What if we want an image?
function love.load()
player = love.graphics.newImage('blob.png')
end
function love.draw()
love.graphics.draw(player, 0, 0)
end
Player image is drawn at top-left corner.
function love.load()
player = love.graphics.newImage('blob.png')
end
function love.draw()
love.graphics.draw(player, love.graphics.getWidth()/2, love.graphics.getHeight()/2)
end
This draws the player image in the center of the screen.
Another function!
function love.update()
end
This is where game math takes place. Let's do some game stuffs!
function love.draw()
love.graphics.draw(player, x, love.graphics.getHeight()/2)
end
function love.update()
x = x + 20*dt
end
Now the player is slowly moving to the right at a rate of 20 pixels per second.
function love.load()
player = love.graphics.newImage('blob.png')
bg = love.graphics.newImage('bg.png')
end
function love.draw()
love.graphics.draw(bg, 0, 0);
love.graphics.draw(player, love.graphics.getWidth()/2, love.graphics.getHeight()/2)
end
Draw draws ontop of what has already been drawn. This puts a background that the player renders on top of.
function love.update()
if love.keyboard.isDown('left') then
x = x + 500*dt
elseif love.keyboard.isDown('left') then
x = x - 500*dt
end
end
The player can control the blob now!
Other events to listen for for player input!
function love.keypressed(key)
end
function love.mousepressed(x, y, button)
end
Let's add jump functionality.
function love.load()
player = love.graphics.newImage('blob.png')
bg = love.graphics.newImage('bg.png')
x = 0
y = 500
dy = 0
end
function love.draw()
love.graphics.draw(bg, 0, 0);
love.graphics.draw(player, x, y)
end
function love.update()
if love.keyboard.isDown('left') then
x = x + 500*dt
elseif love.keyboard.isDown('left') then
x = x - 500*dt
end
y = y + dy*dt
dy = dy + 400*dt
if y > 300 then
y = 300
dy = 0
end
end
function love.keypressed()
if key == ' ' and dy == 0 then
dy = -300
end
end
Now jumping can happen!
Let's organize the code a bit.
function love.load()
bg = love.graphics.newImage('bg.png')
player = {}
player.sprite = love.graphics.newImage('blob.png')
player.x = 0
player.y = 500
player.dy = 0
end
function love.draw()
love.graphics.draw(bg, 0, 0);
love.graphics.draw(player.sprite, player.x, player.y)
end
function love.update()
if love.keyboard.isDown('left') then
player.x = player.x + 500*dt
elseif love.keyboard.isDown('left') then
player.x = player.x - 500*dt
end
player.y = player.y + player.dy*dt
player.dy = player.dy + 400*dt
if player.y > 300 then
player.y = 300
player.dy = 0
end
end
function love.keypressed()
if key == ' ' and player.dy == 0 then
player.dy = -300
end
end
Let's make an enemy!
function love.load()
bg = love.graphics.newImage('bg.png')
player = {}
player.sprite = love.graphics.newImage('blob.png')
player.x = 0
player.y = 500
player.dy = 0
enemy = {}
enemy.x = 0
enemn.y = 0
enemn.dy = 0
enemn.dy = 0
end
function love.draw()
love.graphics.setColor(255, 255, 255)
love.graphics.draw(bg, 0, 0);
love.graphics.draw(player.sprite, player.x, player.y)
love.graphics.setColor(255, 255, 255)
love.graphics.rectangle('fill', enemy.x, enemy.y, 20, 20)
love.graphics.setColor(255, 0, 0)
if exploded then
love.graphics.print('EXPLODED', 0, 200, 0, 10, 10)
end
end
function love.update()
if enemy.x < player.x + 169 and enemy.x > player.x and enemy.y < player.y + 180 and enemy.y > player. y then
exploded = true
end
end
Okay, the game is ready for Steam!
Demos of Previous Prototypes
- Missle Command
- Random Dungeon Generator
- 2D Rubix Cube
- Trail Prototype
- RPS overhead action game
Post about this on Facebook.
Put code on GitHub! Please!
Node and Cyclic Dependencies
11/11/15
I feel like I've come into a rite of passage in JavaScript. I have hit the classical circular dependencies problem.
What I have is a script called
publish,
it requires
htmlGenerate,
template,
and
database.
All also scripts I have made.
htmlGenerate
translates my bare-bones blog files into published posts,
template
is a basic script I made to fill in template html files I have (will
soon be replaced by a proper library made by someone else),
and
database
is my wrapper for interacting with my textfile lists that say what
posts are published to index and in what order (hopefully eventually
it'll refer to a proper database).
The order I mentioned these requirements are important, because requirements are loaded in order, so....
In
htmlGenerate,
rssGenerate
is required, and in there
database
is required, and in there
rssGenerate
is required.
And there's the circular dependency.
rssGenerate
to
database
and then back to
rssGenerate.
So, why does this matter? Because, as it turns out, when JavaScript A requires JavaScript B, and B also requires A, then B will only get A loaded up to the point where B is required.
Let me show you:
Let's make an A.js
// A.js
B = require('./B')
exports.afterB = true;
console.log('B after A:', B.afterA);
Now a B.js.
// B.js
A = require('./A')
exports.afterA = true;
console.log('A after B:', A.afterB);
And now a main.
// main.js
A = require('./A')
B = require('./B')
console.log('A after B:', A.afterB);
console.log('B after A:', B.afterA);
What happens when I run this code?
A after B: undefined
B after A: true
A after B: true
B after A: true
That "A after B" that gets logged in
B.js
is undefined. Why? A has required B, but B required A. A needs B to
be finished loaded before it can finish loading, so B gets an
incomplete copy of A and anything it does while initializing it does
with only what A had already load up until A required B.
And I hit this bug naturally with my code. Which tells me two things, 1) I'm getting more familiar with JavaScript, because I was able to cause this, and 2) I'm writing bad JavaScript, because I allowed this to happen.
That's okay, I'm working on it, and it's kinda fun that I found such an infuriating feature of node's require module.
Further Reading
Node's module documentation about cycles, complete with better example.
How I Avoid Old Habits: Physical, Mental, Sleep
11/10/15
So, I have gone quite a while without serious indulgence in any of my bad habits. I have not gone to reddit save for when google has brought me there, and only stayed there for a bit to gain the information I needed. I have not read any webcomics, read any webcomics, or watched any YouTube videos. I have watched some TV, but only with someone else as an actual social event. I drank a bit of soda once, but again it was more of a social thing.
I have felt no desire to binge on any of these things.
A large part of it has been the enforcement of the rules that I have been following since about a month ago (wow, time flies). But that was the motivation to do it, it was not an actual strategy to avoid all the time sinks that I had had so much trouble quitting before.
Something I've noticed myself doing is placing things into three distinct categories: physical, mental, and sleep. Nothing more. If I want to watch a video, that means I want to do something mentally stimulating, and so I should do something like write a blog post or code, or something of that nature.
If I don't feel like doing anything mentally stimulating, then I decide that I don't actually want to watch a video. It will just further mentally drain me, causing me to feel like watching more videos, and cause a negative-feedback loop that will ruin my day. This was a thing that happened all the time before I quit using media as a break from work. Media can be stimulating, and it can be draining, and for the longest time I had trouble deciding what it would do to me.
Now, I know that if regular productive work is something I can choose to do, then media will be stimulating, but in that case I should just choose to do the work. I currently gain little value from consumption of media.
When mentally engaging things don't sound appetizing and I feel the urge to go to reddit, then instead I do some exercises or stretch. This usually clears my head in an absolutely amazing way and I can happily get back to the mentally stimulating tasks that I was avoiding before.
If physical activity is also something I am unable to choose to do, it simply means I should sleep. This is a choice I often didn't consider, but now it's the only choice if I can't focus on mental tasks and haven't the energy for physical ones.
What's interesting about this attitude is lately I'm sleeping less than I used to. It's like I know when to sleep now, and thus sleep better.
Speaking of which... it's almost 2000 (8 p.m.). Time for bed.
Test-Driven Memorization
11/10/15
So, now that I'm finally setting up a testing system at home, I am reminded of an idea I had to memorize various things.
A long, long time ago, I was introduced to the idea of spaced repetition. The idea is that the best way to remember something long-term is to remind yourself of it right before you forget about it, and then also to focus on the stuff you keep forgetting instead of looking at it at about the same frequency as all the other stuff you already got down.
It has occurred to me that this could be a good way to memorize certain ways to solve problems. Like, I could have various use-cases for a certain data structure. They could all be use-cases that take a small amount of time to setup, sort of like the Quixey Challenge.
This could take spaced-repetition beyond memorization of static facts and into the territory of learning to implement code using various constructs quickly.
It's something I've wanted to do for a while, and I think soon I might be able to make my first proper prototype of it.
Trying Test-Driven Development
11/09/15
So, you may have noticed I mentioned a lot of JavaScript test frameworks in yesterday's post, Stephan.
Last week at work was one of the best weeks at work I have had. There's a lot of unpacking to do to really discern why it was the best, but one of the reasons was trying out making tests before implementing functionality.
This.
Felt.
Amazing.
So amazing that I want to replicate it at home.
The problem?
I have written literally zero tests at home, and zero tests in JavaScript ever.
And that was a problem I was addressing last weekend. And I'll cover that in another post.
But I want to talk about why I like test-driven development so much.
I have always had trouble feeling productive in the working environment. It just feels I move slowly, and I don't make up for it with quality. Years ago, when communicating this with my friend, he made an excellent observation. The way I play games is that I tackle the given, well-defined and well-designed problem, and try to rush through it until I'm good enough at the game such that I can survive until the next proper check point.
I like to improv speedrun games.
"So, why don't you just speedrun work?" he asked me.
This question has stuck with me for a long time, and I've tried various things to achieve exactly this. One such thing was AgileGame. That was getting close, but something was missing. It was missing a proper immediate, external feedback system.
Test-driven development allows me to speedrun work. Each test is a level I must beat, and it posits no qualifications on the quality of that initial solution. When there is no test, I have the clear goal of a test that properly checks for whatever I'm trying to implement, and with the test, I have the clear goal of passing the test.
After both test and implementation are there, I then have the more ambiguious but personally enjoyable goal of cleaning up the code. This is like exploring a level I beat for neat secrets and tricks. The level still needs to be beaten, but I have creative control now that I have already proven that I can beat the level.
Test-driven development meshes with my brain in just the right way to allow me to work effectively.
So, with my limited experience working this way, I'm diving in and seeing how far the philosophy can take me.
Weekend Update
11/08/15
I am still waking up around 0330 in the morning! Feels pretty awesome.
Saturday morning was mostly wasted, productivity-wise. I didn't break any of my rules or anything, I just didn't use or work on my productivity system, and let myself wander quite a lot.
I believe the main trap I fall into is research. For instance, all the stuff I looked into today and yesterday:
And there was plenty of stuff inbetween all of that. Was a lot of it useful? Yes. Did I use much of it? No. Is a lot of the stuff I didn't use maybe worth exploring again later? Yeah. But I could have made note of random interesting things tangential to what I needed to look into in some sort of Spark File and moved on properly.
As it stood, I only started working on constructing something this morning, about 4 hours into waking up. Leaving me significantly less time to get anything done.
A much more effective strategy, I've found, is to work towards doing something, get stuck, plan a research time-block explicitly to solve my problem, and if I solve my problem early, only use the remaining time to explore the interesting tangents. After the time-block has ended, cease.
This way, I don't get caught up on tools and thoughts and ideas I'm not in any way ready to put to use, and thus more likely to only read ideas I'll use, and hopefully have a higher likelihood of retention.
I'll be taking a similar tact with my approach to TopPerformer
Research is an insidious thing. It feels productive, but easily distracts from really doing things. It's a necessary thing, but is only a few connections away from purely entertaining endeavours.
I must learn to use this tool carefully.
Waking Up Early Again
11/06/15
A couple of days ago, at work, I decided I didn't like my wake up just-in-time for my morning meeting system that I had subconsciously accepted and just went with. I wanted to start waking up early again.
As if by magic, I woke up a good 2.5 hours earlier the following day (yesterday). I went from 0800 to 0530. This morning, I woke up at 0330.
I love waking up at 0330. It's pretty wonderful. The only real downside is that it's starting to get cold here in Tucson ("cold") and that temperature shift is really quite powerful in the middle of the night. The middle of the day is quite nice in the 60-70 range, but the middle of the night is currently the 40-50 range.
I will gladly deal with the "cold", though, if it means waking up early again. I'm blogging first thing today! I'll be getting to work before most everyone else, even after doing home chores before going.
I think this sleep schedule will also play a helpful part in fixing my home system. At the very least, waking up earlier means I have firmer control over the scheduling of the day. I don't have to wake up and quickly go to work. I can try out other things.
But today, I think it's time to get ready and go to work.
My First CoffeeScript
11/05/15
So, after a bit of complete confusion on how to do anything, I wrote this little bit of code (which will hopefully transform into something more significant soon).
argParser = () ->
argparse = require 'argparse'
parser = new argparse.ArgumentParser(
version: '0.0.1'
addHelp: true
description: 'Initialize post for editing'
)
parser.addArgument(
['title'],
help: 'Title of post to initialize'
)
return parser
parseArgs = (rawArgs) ->
parser = argParser()
return parser.parseArgs()
console.log parseArgs process.argv[2..]
Right now, all it does is print out the parsed arguments object that the argparse parser returns.
The idea is to have an "initPost" script that will generate the files I write blog posts in. I'll just feed in the title of my post, and the resulting filename will be named how I want it to be named. Right now, I copy a template file into filename-esque version of the title I have in mind, and that's how I get the file I edit for blogging purposes.
Eventually, I hope to have most of my site stuff hidden under scripts, so I can more easily transition from static filenames to a smarter database.
If I do it fast enough, I can get everything set up all nice right before I start from scratch! Which actually is pretty perfect, will give me a clean slate to work in and experience doing what I want to do.
Home System Needs Development
11/04/15
So, things have been in flux a lot. And it's been the good kind of flux. Things are totally mutating in all kinds of good and DRY directions.
But I still have a long, long way to go.
My work-system is in a similar stat of flux. But it feels like it's so many steps ahead of this system. Which feels ironic considering that system was inspired from me doing this here blog.
Though, it does make sense, considering how I do well above four posts on average per work day. I get more practice in with that system. Ideas come and go in higher frequency and stronger form.
What I need to do is work towards some explict design of my system, as I've recently discovered at work. How should things be set up and why.
At home this is also a harder problem, as I need to track more than just work on a computer. The blog is but a single aspect of my day, and isn't meant to track everything. I momentarily attempted a diary to solve this problem, but it never quite got off the ground.
I think the diary was too close in form to my work system. And that's the work system of old, too, which still greatly needed ironing out. I think even the work-system now would be misplaced, though it would be better than the nothing-system I have in place now.
I need to be aware of the problems I'm trying to solve, and aware of the options I have to solve them. It's quite likely I should make use of several tools across various technologies to address all those problems.
So... what are those problems?
I should probably define the problems I want to address, right, Stephan?
I want to track, improve, and eradicate things in my life.
Tracking
The things I want to track include:
- Spending
- Timing
- Diet
- Goals
- Progress
- Research
- Projects
- Distractions
- Compulsions/Addictions
Improve and Eradicate
I feel that tracking will naturally lead to these things. I want to improve upon my game development abilities, and that should show in goals, progress, research, and projects.
I want to stop watching videos, and that'll appear in progress, distractions, and compulsions/addictions.
So, really, I want to build the skills necessary to track things without it actually degrading my life. I think in reality, if I were to track these things with some effort, the time-cost would be made up for by the value extracted from the data gathering. And that'd be before I got good at the system and automated what could be automated.
So, then, what I need do is design the system and iterate on it until I use it as I desire.
Making Links to Blogposts Obvious
11/03/15
It has come to my attention that it isn't particularly clear that one can simply click on the titles of individual blogposts to go directly to that post's hyperlink, Stephan.
When I first made the first post with its own link, I mentioned that the header is a link. But that post was over a year ago, and there's nothing fancy going on at my site to really suggest that the title of every post is a link to that post's individual page. I also, save for one post, don't have any posts where going to the post's page is required to finish the post. So, individual posts are not a thing that's immediately obvious.
So, screw it, clear blue indication of title being links.
You're welcome.
Game Dev Club Meeting: ROBLOX
11/02/15
What is ROBLOX? - Greyson Olson
- Game Creation Platform
- Gaming Platform
- Computer, Tablet, Phone, Xbox One
- Launched in 2006
- San Mateo, CA
- 4.4 [million] monthly active users
Tie It to Your Interests
- Build 3D Models
- Script in Lua
- Program Nifty Gadgets
- Make a Game and Gain an Audience
- Manage a Development Team
- Trade on a Virtual Stock Market
- Play Creative Games Only Seen on ROBLOX
- IT'S FREE!*
*Lots of pay-for content. Pay nothing to get started, though.
ROBLOX as a Game Engine
- Multiplyaer
- Cross-platform
- PHysics Engine and Distributed PHysics
- Free models
- ROBLOX Wiki
Build 3D Models
Illustrations shown.
Building Titantic model with guy in Nevada. Make connections with ROBLOX!
Can you upload your own textures, models? Yes, there is a way (has to go through moderation process to filter out inappropriate content).
Not limited to square shapes in ROBLOX. All kinds of shapes and surfaces you can do.
Script in Lua
Example given in messing with rendered textures.
You can import a greyscale decal and color it with whatever palette you want? Yes. (This is how red and blue colors are setup on Team Fortress 2.)
Should've shown the hierarchy in the editor.
Comments on Lua: scripting language similar to python. Lots of game stuff uses it. Turtles uses Lua.
Program Nifty Gadgets (Videos)
Talking about "Cube Simulator", the speaker's game. The game was really popular in paid access, but failed in F2P (a lesson learned).
Good games can make a lot of money.
Lots of screen shots from various popular games including an FPS and a boat build/battle game.
Lots of illustrations of assets. From a local Tucson artist. Invite him! Greyson has friends in ROBLOX.
More self-promotion of the Titantic sinking game. Welded physics and stuff. It's cool.
Huge Opportunity
$50000 earnings in a month has happened. It was a murder-mystery mafia-inspired game. Games are run one-at-a-time per server.
ROBLOX's Business Model
- ROBLOX is free to play
- Pay for Robux and/or subscription
- Developers sell things in their games
- Players spend Robux in games
- Game developers cash out Robux for $
Trade on a Virtual Stock Market
There's a stock-market that you can mess with. There's only a limited quantity for ROBLOX-made things. Those are the only things you can buy/sell.
The Free to Play Model
- Most prevalent game monetization model in ROBLOX
- Common to sell virtual currency
-
Good
- In-game radios
- Special room access
- Pets
-
Character customization
- Hats
- Gear
- Clothing
-
Neutral
- Perks
- Power-ups
-
Bad
- Pay-to-win
- Things that ruin muliplayer experience
Up to 100 people can be playing in one game.
Games that Tend to Do Well
-
Roleplaying
- City
- "Work at a Pizza Place"
- FPS
- Survival
- Round-based mini-games (ball games)
- Tycoons
- Obstacle Courses (Platformers)
Half-Life 2 and Counterstrike mod clone in ROBLOX called Death Run.
Games that Tend to Not Do Well
- Solo-games
- One Person Per Server
- Story-games Without Multiplayer Aspect
ROBLOX is social gaming.
ROBLOX's popular algorithm is based on how many people are on there at a time. Lots of incentives to play multiplayer stuff and such.
Earning ROBUX (R$)
- Develop a game
- Sell game passes
- Sell in-game currency
- Other transactions
- Accumulate Robux
- Acquire currency
Learn ROBLOX!
- Low barrier to entry
- Put your interests and passions into your games
- You can make money relatively easy compared to app/play store, steam
Use ROBLOX at the Game Jam!
Workshop this Saturday for design and development for ROBLOX games.
Questions
Min specs required? No idea.
Linux-support? No.
Why subscribe? Can only have one active game at a time, and 90% of in-game income is taxed. With subscription, only 30% tax (normal platform fee). Subscription is monthly or yearly. Subscribe as soon as income will come in. Highest cost is $20 per month.
From Last Game Jam
Introducing "Close Encounters of the Herd Kind".
Taking Freelancing Seriously
11/01/15
So, now that I've cut out so many time-sinks, I figure I need to fill that time with something. I'm quite content to continue messing with game stuff and I'll be doing some stuff with Ann Twirls (though I should mostly be behind-the-scenes there), but I've been meaning to try out freelancing and see no reason not to fill in some of my time figuring that strange beast out.
As luck would have it, I think it fits quite nicely with Cal Newport's and Scott Young's online (and now closed to new entrants) course, Top Performer.
I mean, it's literally a course about how to be successful in a field of work, and the content so far has been quite adament about the importance of lifestyle and exploring various paths in a given field (with explicit mentions of freelancing here and there). I think taking the freelancing path seriously whilst excuting this course could result in some good groundwork on knowing how to freelance, and really seeing if I enjoy that kind of additional work.
Interestingly enough, some advice in Top Performer led me to finding the blog Code My Own Road, a blog explicitly about freelance coding, if the few posts I've read are any indication (the first one I found was "The Fastest Way for a Programmer to Make Money Online").
In any case, I'm still in the reseach phase as far as freelancing goes. I'll post updates on anything of note I manage to accomplish.
Playing with Tiles
11/01/15
Haven't quite made another game, but I'm going to count it towards another 5 hours of playing games (enough to cover a week of Super Smash Bros. Melee lunch breaks with my work friend).
I'm thinking I might mutate this setup further to have "the game of life" system executing every second.
The Code
var Crafty;
(function () {
var row,
col;
Crafty.init(600, 900, 'game');
Crafty.pixelart(true);
Crafty.sprite('assets/plant_center.png', {Plant: [0, 0, 16, 16]});
for (row=0; row<9; row += 1) {
for (col=0; col<6; col += 1) {
Crafty.e('DOM,Plant,Tween,Mouse')
.attr({
x:col * 100,
y:row * 100,
w:100,
h:100,
alpha: 0
});
}
}
Crafty('Plant')
.bind('MouseOver', function (e) {
if (this.alpha !== 1) {
this.alpha = 0.5;
}
})
.bind('MouseOut', function (e) {
if (this.alpha !== 1) {
this.alpha = 0;
}
})
.bind('MouseDown', function (e) {
this.alpha = 1;
});
}());
This kinda ended up being an incredibly basic tile editor. It makes me think I could make a tile editor with not too much effort. The limited experience I have with tile editors makes me feel like I want to make my own, anyways.
But that's tangential to the topic at hand. Let's do a block-by-block disucssion of the code.
Crafty.init(600, 900, 'game');
Crafty.pixelart(true);
Crafty.sprite('assets/plant_center.png', {Plant: [0, 0, 16, 16]});
This inits Crafty to a 600 by 900 pixel area residing within the div with an id of "game".
Setting
pixelart
to true tells Crafty not to do any blurring or upscaling of the image
that browsers do for you if you zoom in on a pixelated image. If
you're curious what the tiles look like without this setting, go to
the proper
Playing with Tiles
page, open the browser's JavaScript console (in Chrome or Firefox,
simply press Ctrl+Shift+J or Cmd+Shift+J on Mac, else
see here),
and enter:
Crafty.pixelart(false);
Or, alternatively, check out the sprite's png and zoom in on it in the browser (not as fun as the original instructions, IMHO).
The third line is creating a "Plant" component that I can attach to
entities. The "Plant" component is a sprite defined by the path to
the image given, and then an object with the form
{ComponentName: [TopLeftXCoordinate, TopLeftYCoordinate, PixelWidth, PixelHeight]}
As the png is just the plant image, it starts at (0, 0) and is simply
16 by 16 pixels.
for (row=0; row<9; row += 1) {
for (col=0; col<6; col += 1) {
Crafty.e('DOM,Plant,Tween,Mouse')
.attr({
x:col * 100,
y:row * 100,
w:100,
h:100,
alpha: 0
});
}
}
This just makes a setup that fills the Crafty space with invisible plant entities (alpha being 0 makes the plant sprite invisible).
Crafty('Plant')
.bind('MouseOver', function (e) {
if (this.alpha !== 1) {
this.alpha = 0.5;
}
})
.bind('MouseOut', function (e) {
if (this.alpha !== 1) {
this.alpha = 0;
}
})
.bind('MouseDown', function (e) {
this.alpha = 1;
});
Here I bind events to all the entities with the "Plant" component to change the visibility of the plant sprite based on mouse actions.
Overall, this is a good prototype to get familiar with the sprite aspects of the Crafty API, and is somewhat good inspiration for a tile editor (which I might play around with).
New RSS Link Starting After This Post
10/31/15
So, I have a better system in place for RSS updates, and as such I don't like updating an RSS file called basic.rss. So, new RSS thing, mostly the same as the old one, but with a different name ( blog.rss) and description, and this file gets updated via the same script that publishes a post.
Hopefully, I'll have a post about all the javascripting I've done with regards to my blog stuffs.
Back to Mint
10/31/15
Back in May, I left Mint. In August, I started collecting all my receipts and filling out a JSON file by hand. This worked mostly fine, though I lost a lot of spending that didn't have a physical receipt.
This month, however, I have all of October's receipts in that box I keep unprocessed receipts. I have also decided to stop entering each individual item in each receipt and just use the totals. Each item of the receipt is simply far more resolution than I currently plan on using.
Because of my huge backlog, and my lowering of necessary spending resolution, it occurs to me that I can make use of small subset of what Mint offers.
Specifically, I only care about:
- Allocating all spending into one place
- Spending categories
- Downloading transcation history to spreadsheet
The problems I had encountered before with Mint was me not liking their budgetting system, not liking their lack of API, not liking their clunky "split receipt" setup for spending from stores with multiple spending categories, and in general not liking being their product, regardless of how sincere they appear about providing a good experience for me above selling me to their affliates.
There's nothing I can do about that last thing. Really, I mostly just feel that that last thing is what has resulted in the lack of an API and some of the other things I don't like about Mint.
The "splitting receipts" problem has been solved by me splitting purchases up into their separate spending types. I just need tell Mint what each receipt is now. And for a large amount of receipts, Mint will already know.
Not liking their budgetting system is solved by me using my own. Though, really, what I care about is the visualization of my tracked spending. I want good data on my spending so I can properly tweak it as I desire. If a budget ends up being that strategy, so be it, but really I found the frequency of my spending on certain types of spending seems to be the positive change in my spending habits (aka, shopping everyday).
The lack of API is "solved" by me just grabbing the data I care about via the "export to CSV" feature on their site. I will use Mint for what I like about it, gather that into something properly computer-readable, and then build the stuff I want around it.
The long-term goal will be to erase Mint's usefulness, but for now, it solves problems I don't feel like thinking about. I don't devote much time to my personal finance tool, I should work on it as efficiently as possible.
The goal from here will be to read Mint spreadsheet stuff into the format I want to work with. I'll need personal systems and digital systems to formalize to make sure I grab all the data regularly, and process it how I want it processed.
Quitting Everything
10/30/15
So, a while ago I threw a bit of a temper-tantrum during a particularly frustrating bit of non-productivity wherein I decided I wanted to quit everything.
I calmed down shortly after that post and continued right on doing the stuff I do for fun that doesn't "really make me any happier than not doing them".
And now here I am, 2.5 months later proposing the same thing. Or rather, realizing how close I am to it anyways. For a couple weeks now, I have been reddit-free. I have also been webcomic-free and all-but-one-blog-free. I quit soda and candy. All with the help of my wonderful girlfriend, Rosse, whom I have to pay hard-earned cash if I partake in any of these free things (soda and candy are free via work).
I allowed videos until today, and today I grew tired of them invading my options and occupying my mind.
This isn't a permanent abstinence from such things. I know I have gained very valuable experiences from webcomics, videos, and blogs. The problem is the lack of moderation, of balance. Too long have I overtly consumed these things and done nothing of value with my "very valuable experiences".
Discipline must be crafted, and if I must err, I should err on the side of overtly lacking consumption, as I often err on the side of too much.
I believe rules need to be made similar to that of my game-making rule.
And speaking of that rule, I'm officially out of gaming hours. I need to earn some more this weekend.
I wonder what game I'll make.
Sixty-Three Days Remaining
10/29/15
I disappeared for a bit there.
I was sick again.
I've decided I don't like using that as an excuse. I've noticed that I regress a lot while I'm sick. I go to habits I long thought dead. It seems like an incredible weakness. It could well be the place where bad habits retake their root.
Stopping the bad habits I have is hard. Harder than I care to admit. It's a struggle that shows me how weak I really am. I'd rather not also have to face a relapse if I can build the infrastructure necessary to avoid it.
But that's not really the point of this post, Stephan.
The end of this year of "blogging everyday" is coming to an end. And I'm wondering how far behind I am on having an average of one blog post per day.
A quick hack to my html generation script should provide the answer I seek (though maybe I should probably make a better script for such statistics).
286, if I count this post.
How many days are we into the year?
302, counting today.
So, out of a goal so far of 302, I've managed 286 posts.
That's a solid A if I permit a regression to academic scoring (a regression I'll allow this once).
It's also not impossible to catch up at this point, by any means. In fact, if I simply required 2 extra posts per weekend (completely doable), I would catch-up by the end of the year.
And then, after those sixty-three days....
I'm not sure anymore.
I was going to do a year of drawing/visual art, but now I'm not so sure.
Don't get me wrong, Stephan, this year has been super valuable. And gaining that value even while "failing" to live up to a day's standard somedays has been quite... empowering. I'm not afraid of breaking the chain.
A post everyday led to a proper scope. Things weren't complete, per se, but things are never complete. There was a finality there. A self-containment. Sure, many posts assumed past reading. Few posts assumed future reading (though such posts did exist).
Posts this year approached a good unit of completion. Short enough in duration to adapt as necessary without too much lost work, but long enough to actually do things. More of such productivity will surely be my goal going into 2016, but I think a year's devotion to some arbitrary goal is not a necessary part of my growth.
Of all the things I'm thinking of doing in the coming year, the thing I feel most comfortable committing to is abandoning this site. Or rather, this site's infrastructure. I've learned a lot here, but I've also growth complacent with some things that should've been redone so long ago now.
I've heard that Louis C.K. and George Carlin got good by throwing away the old content (the person who told me that told me he got it from here, Stephan).
I like it. I'll build... something throughout the year, and then I'll abandon it at the end of the year as well.
We'll see what I think as the year comes up.
Learning Japanese Via Memorizing Songs
10/25/15
So, I've been exploring the idea of studying Japanese again. I've decided that I want to accomplish something in the process, so I have something to show for my effort even if I never can hold a conversation in Japanese.
In some of my explorations, I ran across this interesting blog about learning languages efficiently. Some of its interesting arguments:
- Focus on input before focusing on output
- Make all voluntary/entertainment-based input the language you want to learn
- Memorize the language with whole sentences acquired from native sources
- Don't use subtitles
Now, I found this from an idea I had had. I was curious how many words I'd need to learn before I could understand a good chunk of the words being said. Searching for the answer to this question led to this post on the same blog. Turns out, 50% of the written content in any language are the top 100 words of that language. To get to 85% requires a mere 3000 words.
When I first read this, I decided to try to find some free content online to read/watch and transcribe the content into flashcards I can memorize with spaced-repetition.
Shortly after that conviction, it occurred to me that I am willing to listen to the same song on endless repeat for weeks or months (maybe longer, I only ever really decide to change songs when a new song finds its way to my ear). I realized memorizing Japanese songs, transcribing their content to flashcards, could be really awesome. I could sing songs in another language, and I could learn a bit of the language while I was at it. I would also really have to work on pronunciation to sing it well.
So, that's my goal for now. The song I'm listening to on endless repeat first?
I unironically love this song. I came across it from the anime that uses this song as its ending theme. I can't actually sit through the anime, it's just too painfully awkward for me. I mean, when I do force myself through it, I love it, but it's legit painful for me.
Still love the song. Somehow it just feels right as the first Japanese song to memorize.
Saving Date at Publish Time
10/22/15
With RSS stuff in order, I'm trying to make publishing a bit nicer, too. The description part that goes into the RSS file is nice enough. If I don't want to rewrite anything defined anywhere else in my view file, I can just put {{thing}} there and it'll be filled in.
Though, it occurs to me that order matters in that case.... Which is something that'll fix itself when I switch to an actual templating system and not something I cobbled together.
Anyways, I digress. Something I've wanted for a while is a thing that timestamps my post the moment I publish it. The day has come and I can save an unambiguous time in the views file that is convereted into the simple date string that makes it to the html file.
Meaning I can save the time of publishment in seconds from the epoch.
Woo!
The code that faciliates this possibility will definitely need cleanup, but for now it works, and that means I'm capturing that much more information for free starting with this post.
Woo!
Fixing RSS Typos
10/21/15
The new blog RSS file is coming along nicely. I have fixed the surprisingly many instances of having the title spelt wrong in the description (e.g. 'New post on blog! "How Do I Learn How Stuff?" wherein I finally do some initial research on learning home improvement.') This is a mistake repeated twice in the original RSS file).
Because title is filled in dynamically for the new RSS file, some repeated mistakes became only description mistakes. And so I made it so that any description that had the post's title in it had that title represented as {{title}} (thanks be to the ASCII to HTML chare for making it simple to represent my replace string without it actually being replaced when running this post through my scripts).
This fixed the problem, and revealed lots of other problems that were harder to fix programmatically. Some of them are typos in the posts themselves, which I am now propagating faithfully. I will allow those to stay. Some of them were me forgetting to update the links in the RSS file correctly, thus linking to a previous post instead of the new post.
This meant that I missed some RSS descriptions in the conversion of my system to include a views area where each post had exactly as much information as necessary.
This problem was basically best solved by hand. And solved by hand it was.
The new RSS file is almost ready for deployment. I've also fixed a bunch of stuff in the old RSS file, so I apologize for messing up your RSS feed, Stephan.
RSS Generation Script Functional
10/20/15
The code I've been writing to generate an RSS file out of the
descriptions present in most but not all of my
views/blog
posts is functional.
It is so functional, that comparing the new RSS file to my old RSS file reveals typos and/or improper blogpost title transcribing in the old RSS file than errors in the new one. Funnily enough, the title typos repeat themselves in most item descriptions because of how I would insert items in the RSS by hand. This means that, for now, the new RSS file has typos in the item description but not in the item title.
This will be one of the things I fix.
So I'm not done.
Meaning the code post-mortem is still not quite happening. Though, when it does happen, it'll be a massive review of plenty of files.
Look forward to it, Stephan.
Oh, also, I'll continue updating the old RSS, and link to it in my browse bar as the RSS file for now. Once this refactoring stage of my script stuff is properly finalized, I'll make the switch proper, and I'll make sure there's a proper post about switching there (which will be the last post the old RSS file points to).
Hopefully that's not too much trouble.
Blog Scripts: So Close
10/19/15
scripts/publish.js
now takes in a
views
style file (a
DRY
post), moves it to the relevant published area
(for blog posts,
views/blog),
generates the html for that file into the mirrored area of
public/blog,
updates the "database" with the newly published file,
and generates the new
index.html.
For the last hour or so I was rushing to get RSS population into that list of things done, but I had a choice between hacking something together really quick, and trying to make it somewhat well-designed. Making it well-designed led to the creation of more modules, and refactoring the already-made modules.
Meaning that completetion of this final piece of publishing automation will have to wait until another day.
I'm excited to see how it turns out.
Game: Tic Tac Toe
10/18/15
The game:
It's kinda cheating that I made a game I've made before, and that it's just Tic Tac Toe, but it's been a while and I want to get into the groove of it. To be fair, I made it completely differently this time.
In fact, I believe last time I didn't even know how arrays and for-loops properly worked in JavaScript. It might be good to compare.
Not now, though.
Good to compare eventually.
Post-Mortem
I'll probably want to do post-mortems in the future, so I might as well start now.
User-Side
The main thing here is there is no mouse-movement feedback. The only way to know if you can click on a thing is to click on it and see what happens.
There's also just this one page and that's it. I mean, it's Tic Tac Toe, so simple is reasonable, but there could be transitions and stuff still.
Construction-Side
Might as well lay out the code:
(function () {
var row,
col,
grid,
X = ' X',
O = ' O',
turn = X,
checkWinPossibility,
checkStalemate,
checkWin,
end;
end = function(winner) {
Crafty('End').text('Winner: ' + winner);
};
checkWinPossibility = function (squares) {
var check;
check = squares.filter(function (square) {
return square.text();
});
if (check.length !== 3) {
return;
}
check = squares.filter(function (square) {
return square.text() === X;
});
if (check.length === 0 || check.length === 3) {
end(squares[0].text());
}
};
checkStalemate = function (grid) {
var check;
check = grid.filter(function (row) {
var check;
check = row.filter(function (entity) {
return entity.text();
});
return check.length === 3;
});
if (check.length === 3) {
end('stalemate');
}
};
checkEnd = function (grid) {
var col;
checkStalemate(grid);
// Check each row for a win
grid.forEach(function (row) {
checkWinPossibility(row);
});
// Check each column for a win
for (col = 0; col < 3; col += 1) {
checkWinPossibility(
grid.map(function (row) {
return row[col];
})
);
}
// Check down-right diagonal
checkWinPossibility(
grid.map(function (row, index) {
return row[index];
})
);
// Check up-right diagonal
checkWinPossibility(
grid.map(function (row, index) {
return row[2 - index];
})
);
};
Crafty.init(600, 900, 'game');
Crafty.e('2D,DOM,Color')
.attr({
x: 0,
y: 50,
w: 600,
h: 600
})
.color('black');
Crafty.e('2D,DOM,Text,End')
.attr({
x: 0,
y: 650,
w: 600,
h: 200
})
.textFont('size', '100px');
Crafty.e('2D,DOM,Text,Mouse,Restart')
.attr({
x: 90,
y: 0,
w: 500,
h: 50
})
.text('Click Here to Restart')
.textFont('size', '50px')
.bind('Click', function () {
turn = X;
Crafty('End').text('');
Crafty('Square').each(function () {
this.text('');
});
});
grid = [];
for (row = 0; row < 3; row++) {
grid[row] = [];
for (col = 0; col < 3; col++) {
grid[row][col] = Crafty.e('2D,DOM,Color,Text,Mouse,Square')
.attr({
x: 202 * col,
y: 50 + 202 * row,
w: 196,
h: 196
})
.color('White')
.textFont('size', '150px')
.bind('Click', function () {
if (!Crafty('End').text() && !this.text()) {
this.text(turn);
checkEnd(grid);
turn = turn !== X ? X : O;
}
});
}
}
}());
I like how I make an array of each possible win-condition and send that array to a generic win-checker.
I don't know if I like the use of globals at all for a game as simple as this. I should probably just have everything know about everything it needs to know about.
Also, I don't really have to check all the win conditions, just the ones that touch the given updated square. Though, really, it's good that I just do that. Making something like that smarter is something I should do only after profiling and deciding I need to speed up the code. Something that will never be necessary for Tic Tac Toe.
Starting over should probably be done with scene transitions.
Overall
It occurs to me that there's a lot of development things I need to learn to do that could be well served by applying it to making this game better. Full-screen options, sound-effects, music, responsive of game objects. Stuff that other games would need, but stuff that isn't enough to know how to make those other games.
It may just well become a running gag that I keep making Tic Tac Toe every once in a while to explore some specific thing I want to implement.
JavaScript: HTML Generate Refactoring
10/17/15
My
htmlGenerate.js
script has gotten the same treatment as my
publish.js
script.
'use strict';
/*jslint node: true */
// Required modules
var fs = require('fs'),
path = require('path');
// Private functions
var saveFile = function (filename, data) {
fs.writeFile(filename, data, 'utf-8', function (err) {
if (err) {
throw err;
}
});
};
// Module functions
var htmlGenerate = exports;
htmlGenerate.populate = function (template, data) {
var cheerio = require('cheerio'),
{{post}}#xA0;= cheerio.load(data),
post;
post = (template
.replace(/\{\{content\}\}/g, $('#content,#temp').attr('id'))
.replace(/\{\{title\}\}/g, $('.title').text().trim())
.replace(/\{\{date\}\}/g, $('.date').text().trim())
.replace(/\{\{post\}\}/g, $('.blogpost').html().trim())
);
return post;
};
htmlGenerate.translateFile = function (filename, htmlname) {
fs.readFile('templates/post.html', 'utf-8', function (err, template) {
if (err) {
console.log(err);
return;
}
fs.readFile(filename, 'utf-8', function (err, data) {
var translatedData;
if (err) {
console.log(filename);
console.log(err);
return;
}
// Grab title, date, and blogpost
translatedData = htmlGenerate.populate(template, data);
saveFile(htmlname, translatedData);
});
});
};
htmlGenerate.translateDirectory = function (area, htmlArea) {
fs.readdir(area, function (err, files) {
if (err) {
console.log('%s\n%s', area, err);
return;
}
files.forEach(function (file) {
var relpath,
htmlpath;
relpath = path.join(area, file);
htmlpath = path.join(htmlArea, file);
htmlGenerate.translateFile(relpath, htmlpath);
});
});
};
htmlGenerate.main = function () {
// Get all the files in views/blog area
htmlGenerate.translateDirectory('views/blog', 'test/blog');
};
if (require.main === module) {
htmlGenerate.main();
}
It is now something I can properly
require
in the
publish.js
script. Which means soon I should be able to point
publish.js
at a view draft I want to publish, and it'll generate the proper html
file for me and put both the written file and the generated file in
their published-post areas (the
views
directory and the
public
directory, respectively).
After I get that working, I'll give
indexGenerate.js
the same treatment, and then generate the index file from
publish.js,
as well.
After that, I'd like to improve the draft system I have in place, such that the date, and some repeats of the title of the post, are done programmatically and not by hand.
Finally, I'll want to clean everything up. Good documentation, better naming convention, etc.
I guess I might also want to learn how to go about testing these scripts.
We'll see. I'll take it one step at a time.
Weekend Rules
10/16/15
So, I have a tendency to waste my weekends. I like to justify it as a necessary recovery, but that almost sounds like addict talk. I have decided that the weekend needs some structure to help motivate doing certain chores and errands.
I will attempt no Internet, video-watching, gaming, or reading between 1000 and 1600. Or whatever time I am most likely to waste my valuable energy for the day doing things I could do with no energy.
I'll refine this idea as I attempt it. So, hopefully I'll have a more developed idea by the end of the weekend.
JavaScript: New Publish Script
10/15/15
I gots me a newly made
publish.js
script. This new one can be required in other node scripts.
It doesn't, however, check for TODOs and such and refuse to publish a post if it sees something wrong with it.
One step forward, and two steps back, as they say.
In any case, here's the script:
/*jslint node: true */
'use strict';
// Modules used in this file
var argparse = require('argparse'),
fs = require('fs'),
path = require('path');
var updateDatabase = function (area, posts) {
var databaseAppend,
database = path.join('database', area + '.txt');
databaseAppend = posts.map(function (filename) {
return path.basename(filename);
}).join('\n') + '\n';
fs.appendFile(database, databaseAppend, 'utf-8', function (err) {
if (err) {
throw err;
}
});
};
/*jslint unparam: true */
var moveToArea = function (area, callback) {
var newDirectory = path.join('public', area),
count = 0;
return function (filename, index, files) {
var basename = path.basename(filename),
newPath = path.join(newDirectory, basename);
fs.rename(filename, newPath, function (err) {
if (err) {
throw err;
}
count += 1;
if (count === files.length) {
callback(area, files);
}
});
};
};
/*jslint unparam: false */
var publishArea = function (posts, area) {
// Move filenames to published area, append database with basenames
posts.forEach(moveToArea(area, updateDatabase));
};
var publish = exports;
publish.blog = function (posts) {
// TODO: Add description item to RSS
// TODO: Need to actually generate html instead of just moving html files
publishArea(posts, 'blog');
};
publish.diary = function (posts) {
// Append basenames to "database" blog list
// Move filenames to published area
// If anything goes wrong, none of these files should change
publishArea(posts, 'diary');
};
publish.main = function (rawArgs) {
var args,
diaryPosts,
blogPosts;
args = (function () {
var parser;
parser = new argparse.ArgumentParser({
version: '0.0.1',
addHelp: true,
description: 'Publish file into blog or diary area',
epilog: 'Area to publish in is deduced from the input path'
+ '(defaults to "blog")'
});
parser.addArgument(
['file'],
{
nargs: '+',
help: 'File to publish'
}
);
if (rawArgs) {
return parser.parseArgs(rawArgs);
}
return parser.parseArgs();
}());
// Separate the input filenames into the blog and diary posts
blogPosts = args.file.filter(function (filename) {
return path.dirname(filename).search('diary') === -1;
});
publish.blog(blogPosts);
diaryPosts = args.file.filter(function (filename) {
return path.dirname(filename).search('diary') !== -1;
});
publish.diary(diaryPosts);
};
if (require.main === module) {
publish.main();
}
Gone is the anonymous function closure that made sure the script didn't pollute the global namespace. I've decided that for node scripts, this is unnecessary, as the require module does that for me. For scripts loaded in a browser, I will continue the habit. Though, I might also look up using require browser-side. Last time I looked into it, the library was capable of generating un-require'd (that's a pun) javascript during the minify process.
Best to live in the require'd world and let the computer make it un-require'd.
In any case, the publish script should play nicely with other scripts
now. Time to do the same for the other scripts. From there, I can
start amassing a proper blog script library, have running
publish.js
generate the html from the view files, and then generate the index
file, and I can stop running the various scripts manually from the
terminal, and just run one script.
JavaScript: Time to Modularize
10/14/15
All right, first time writing a post in my
views
area.
It's kinda a little weird. Like, there's not all this filler content filling up my screen with excess color. There's a lot more black background than I'm used to.
My publishing scripts haven't quite caught up to my new area, though, so I'll be pulling some hackery here and there still.
Which really is related to the main topic of today's post: modularizing.
I have all this useful code across various javascript files, and no way to use them between the files because I didn't actually write the files as require-able node modules. They all expect to be run as main.
That means I need to
publish.js
a new post before I
indexGenerate.js.
Well, it used to mean that. Now, I need to move my file into the
proper
views/blog
area,
htmlGenerate.js
it,
publish.js
the generated
public/blog
file,
and then
indexGenerate.js.
This should be one command, but the code should still be across the various files. And there's no reason not to make it possible to be one node command (and not, say, a bash script that calls all these things in sequence).
This is my goal for right now. It'll probably mean rewriting a lot of my current files, which is good, I'm quite enjoying redoing functionality from scratch lately. It's also great for javascript mastery.
Long-term, this will also be good, as I'll be developing a proper javascript library for my site. Again, I plan to abandon it when the year ends, but all the more reason to go crazy now, so I can learn what I need to learn before I have another go at it.
In any case, blog-scripting is finally happening again, and happening in full-force, and I'm excited to see what comes of it.
Scripts: There and Back Again
10/13/15
I am at a significant point in my blog scripting, Stephan. I have a script to transform the area I currently create posts in (raw html files basically ready for publishing) to the minimal form (an html-like file with divs containing the necessary file information of "title", "date", "post", and "description"), and I have a script to retranslate that minimal post into the publishable html file.
Meaning I'm really close to just creating content with the minimal files, and thus only generating the files that the user sees. Which could very easily lead to doing more transformations on how I create the content and then generate it. Though, I believe I'm ultimately limited with what I can do based on the pattern I've set in my posts so far. I still think that starting over in 2016 will be incredibly valuable. I also think that working with what I got until then, and twisting it to my will, will also be incredibly valuable.
I still got a few more things to tweak before I actually transition to using the new setup, so I'll hold off showing the guts of this monster until then.
This is more just a progress report.
Updating Scripts
10/12/15
The first thing I should do is update my new area to mirror my current area, as I'm not yet publishing with the new files or anything.
node scripts/fixPosts.js
Okay, what do I need to do?
-
Grab each post in the
views/blogarea and create a proper html translation inpublic/blog
Actually, let's focus on that for now.
/*jslint node: true */
(function () {
'use strict';
var args,
fs = require('fs'),
path = require('path'),
translateDirectory,
translateFile,
populateTemplate;
args = (function () {
var ArgumentParser = require('argparse').ArgumentParser,
parser;
parser = new ArgumentParser({
version: '0.0.1',
addHelp: true,
description: 'Generate html for serving'
});
return parser.parseArgs();
}());
populateTemplate = function (template, data) {
var cheerio = require('cheerio'),
{{post}}#xA0;= cheerio.load(data),
post;
post = (template
.replace(/\{\{title\}\}/g, $('.title').text().trim())
.replace(/\{\{date\}\}/g, $('.date').text().trim())
.replace(/\{\{content\}\}/g, $('.blogpost').html().trim())
);
return post;
};
translateFile = function (filename) {
fs.readFile('templates/post.html', 'utf-8', function (err, template) {
if (err) {
console.log(err);
return;
}
fs.readFile(filename, 'utf-8', function (err, data) {
var translatedData;
if (err) {
console.log(filename);
console.log(err);
return;
}
// Grab title, date, and blogpost
translatedData = populateTemplate(template, data);
throw translatedData;
});
});
};
translateDirectory = function (area) {
fs.readdir(area, function (err, files) {
if (err) {
console.log(area);
console.log(err);
return;
}
files.forEach(function (file) {
var relpath;
relpath = path.join(area, file);
translateFile(relpath);
});
});
};
// Get all the files in views/blog area
translateDirectory('views/blog');
}());
That's what I got so far, it prints out a formatted blogpost from each of my barebones posts that only contain the title, date, post content, and RSS item descriptions within them.
Next step is actually saving them to an area. At first I'll save them
to a test area, and once I verify posts are generated as I want them
to be, I'll actually let it overwrite the actual
public/blog
area.
The Rules
10/11/15
I've spoken a bit about injecting some more direct consequences to various bad habits I have been having trouble quitting before.
Since then, I have developed some more formalized rules, though mind you it's still quite the work in progress.
The Rules
- Monetary consequences is lost money, doesn't go to savings
- All junk-food costs are 4x the store-value
-
All visits to personally-banned websites cost $10
- Each additional minute on the site is $1
-
Starting up a video game costs $10
- Each additional minute costs $1
Unlocking Exceptions
Now, there needs to be alternative means of accessing that content without monetary damage, because I believe that in proper doses those things are good experiences that contribute to my growth in various areas.
Junk-food, however, will always have a monetary damage. Even if breaking the rule was good for me, it should be rare enough that I can afford taking the damage. Though, a technical way around it is to bake my own sweets. Though, I find it hard to call self-baked goods junk food.
As for personal websites, I will assign myself one thing to read at a time (right now it's Mr. Money Mustache), and I'll need to properly formalize the rules for switching to new reading material. I think an enforcement of focus here will be valuable.
For games... well, I want to make games. I also want to force myself to control scope and make a bunch of tiny games that build my abilities. So, I get 10 hours of play for every 1 game I make. These rules too will need to be properly formulized and updated, but for now, as long as it's a game as defined in the Art of Game Design (a definition I need to reread), that satisfies this condition for now.
I haven't quite started diving into productive work, but I have reeled back significantly on all the time-wasting activities I used to partake in. Right now, I've filled a lot of that in with watching videos I have been wanting to watch but been putting off.
I don't think I'll need to make rules for videos though. I can only handle watching so much video for so long. I fill up on it fairly quickly. We'll see soon if I'm correct about this, but I feel I've already burnt out on video.
If I can stay aware from the various content that eats up all my time and energy, I think that the resulting free-time will lead to daydreaming, boredom, and then finally projects.
The daydreams have been strong. Boredom should set in soon.
Free Will
10/10/15
I've talked about free will before a long time ago. So long ago that that post's (tab) title is a javascript function declaration because the script I made to make it a link didn't print out the result of the function but the function itself. I have since done no real reading on free-will, but I do continue to think about it from time to time.
I decided to look around a bit and there's this decent page on the subject. It's neat and I'll read it properly eventually maybe.
But in any case, my personal ponderings on the perception of participation led me down a personal philosophy of identity. The old, old question of who-am-I and what-have-you, Stephan.
It is at this point that I feel compelled to say that words are fun to string together. But that's a quick aside.
Back to identity.
Free-will and identity kind of go hand-in-hand. Without identity, what exactly is free-will? Right?
Anyways, what is identity? I mean, beyond the perception of self, what do I identify as myself? My incredibly limited understanding of Taoism has it strip away everything, and there's nothing there. But, you know, in that deep "what is the sound of one hand clapping" sort of way (which is mixing philosophies but whatever).
My thinking on the matter is best explained by using another incredibly limited understanding. This one being quantum mechanics and the many-worlds interpretation of it.
Now I want to stress that this is more an explaination of my thinking, and does not in any way rely on the many-worlds interpretation being true for it to still be how I see things. Though, I do believe the many-worlds interpretation. But that's also an aside.
Let's say that there's a possibility space. Everything that could happen is in this space. What does happen is a collapse of that space into our reality. Each person, then, has a possibility space of anything they could possibly do. It collapses into what they actually do, a subset of all the things they could do. This collapse, this filter, of all posible actions into a subset of actual actions, is what defines a person. It is who they are.
All the things I did, and by implication all the things I didn't do, that's who I am. And yeah, I didn't have complete control over those things. I made mistakes. I was pulled this way and that by family, friends, and enemies. By interpretations of reality I no longer consider, and visions of a future I no longer desire.
Those things are me, too.
It is as thought there is a tether tying all those things to me, but really I am that tether tying all these things together.
And every moment I'm different. The past becomes a little more incomplete as the future becomes more certain. Memories become faulty as plans become concrete. The only thing I'm certain of on May 7th, 2014 is that I created this blog. And on May 7th, 2016, I can only guess that I'll celebrate this blog's 2nd anniversary in some way.
On both days I have no idea what else I did or will do. It could've been a great number of things, and great deal less other things.
I am that little bit of certainty between the possibility space of the past and the possibility space of the future. A connection tethered to reality by so many things.
The more I think about it, the more the identity feels nonexistent. It's like a word that gets said too often and loses meaning.
Identity.
Identity.
Identity.
Identity.
Hyperfocus
10/08/15
It hasn't been that long from my last stint of hyperfocus, and today I entered the state again. My previous assertion that it's not something I caused may have been partially incorrect. Yes, people are cyclical, but also habits I'm forming may trigger certain possible states more often. Or whatever.
But in any case, not only do I find I can I encourage this state of mind into being, but I find I need to learn to use it like I learn to use any tool. Getting stuck on little details is a serious concern. I do it even as I realize I'm doing it. Just noting that I'm doing it is not itself enough to stop myself from wasting a powerful and currently rare resource.
I mean, this state is awesome, but I just spent the last hour messing
with my
.vim/
setup.
I'm still doing it. Right now. Even though I feel like focusing on finishing this blog first should be my priority, and even though I am pointing out my vim distraction right now.
It's kinda bizarre.
I fixed a long-standing problem I'd been having in vim, though. Maybe worth a post in itself?
Yes, but I've already stayed up late enough.
Indie Game Group
10/07/15
There's an indie game group that meets here in Tucson. Unaffliated with the UA Game Dev Club, and it meets once a week as well. It meets Thursdays at 1900 at the CoLab Workspace.
I think I'll try to go tomorrow. Apparently, only the last Thursday of each month is an actual event. Otherwise, it's a place for like-minded people to come together and get things done.
Which seems exactly like the sort of place I should go to.
On Ceilings and Floors
10/06/15
So, today was a bad day. But it was a better bad day than usual.
I have been continuing my attempts to quit various time-wasting habits I can't afford, and a current mutation shows promise.
Basically, I have a bad-habit jar. Every time I do something I have decided I don't want to do, I incur a monetary fee. This fee is in place for visiting websites I want to eradicate from my information diet, and junk I want eradicated from my diet diet.
Since starting this system a bit over a week ago, I had one bad day.
Today.
And the amount of junk I consumed, both dietarily and information...ally... was a lot more limited than most other days.
And this has led me to a line of thought I found quite useful lately, in my consistently inconsistent productivity, discipline, and resolve.
A high floor is as important, if not more important, than a high ceiling. And bad days like today are my chance to raise the floor. I've been having high ceilings lately. Bouts of productivity that are close to my best way back in Febuary 2014.
But something I forget is that my floor was way, way raised back then. I had successfully purged the vast majority of my Internet consumption then, for many, many months. I believe it was from Febuary to June that I read no blogs, webcomics, or reddit. It was a boon.
My destructive behavior (as benign as it was even at its worst) was brought to a minimum. My struggle to return to that place has been quite real, but that was perhaps due to my focus on self-improvement made during motivational highs, which itself was due to rewards from such behavior, both intrinsic and extrinsic.
But at a low, I find that I am indifferent to reward. Apathetic. But punishment or risk avoidance is still very much in play.
In this example, monetary punishment is something I am very much trying to avoid, what with my interest in early retirement and just the various virtues of spending less. And the threat of this punishment, self-inflicted, very much limited the depths of my actions today. And thus the floor was raised.
So, perhaps I need to inject more risk or consequence into my days, especially when a funk falls over me.
Learning to Like Talking as an Introvert
10/05/15
Or, why I lost my composure during the Game Dev meeting today.
So, usually today I have some notes from the meeting. Not today. I went to the IEEE early today as planned. I worked it out with work to leave early on Mondays and make that up throughout the week.
I went from my relatively secluded office to a room full of people I didn't know. I realized as I got there that I had forgotten my headphones, and thus had no means to block these people out and pretend I was alone for key periods of time between 1400 and 1730.
I ended up getting distracted by and talking with several interesting people, including one person with incredibly horrifying views.
I talked, I argued, I kinda regressed a bit while arguing with the horrible person (maybe more on that in another post, but I'd rather not relive it here).
And then, around the time the Game Dev club meeting started, my brain broke. I couldn't focus, I realized how many people there were, I had some trouble breathing. I completely and utterly ran out of energy. I have built up quite the endurance for being social since high school, but apparently then and there I appeared physically ill.
I recovered reasonably quickly, but I did not have the composure to take notes during the meeting. Luckily, the person next to me took fine notes that I'm sure will be posted elsewhere.
It was an excellent talk by a wonderful person about composing music. It was lots of fun that I didn't get to be in on 100%. But still, good times.
Next week I won't forget my headphones.
Pixel Workshop and Aseprite
10/04/15
So, I had a pretty positive experience at the pixel art workshop yesterday. I don't really have anything to show for it, as I burned out pretty quickly messing around with the new tool.
The Content of the Workshop
The workshop started with the talker, William, saying that anyone can be good at art. Art is something that you get good at through repetition and study. A lot of it is the repetition.
Then he went on to talk about how art is done in layers. Eventually, he interupted himself to say, "Let's just make some pixel art." And he created a chest-opening animation as the group attempted to keep up.
From there, he showed us how to create a walking animation.
I was a bit lost through the process, as I didn't notice him switching between frames while making the animations, so instead of making mulitple frames, I mutilated the single one I was working on.
Oops.
The Tool
The tool we used is called Aseprite. It's got a pay version, a free-demo (where you can't save), and a dev version. The dev version is gotten by clone the repository and compiling the source code (its open source). The dev version has all the functionality of the $10 pay-for version, I think.
Me being me, I went ahead and got the dev version running on my Chromebook. I even made a special crouton partition just for it (I called it "art"). I'll probably also install it here on my desktop.
In fact, I'll do just that right now.
Two hours later....
Compiling stuff on Windows is confusing and gross. Confusing and gross I say!
I'll figure it out eventually. Whatever.
Aseprite is cool and I think I'll use it as some part of my daily art goal when 2016 comes around. I'll also try and do something with it weekly until 2016, maybe.
I'm not really sure yet how I'll go about this whole learning to art thing. I just know that it'll be a big part of 2016 for me.
Weekend Results
10/04/15
- Talked to landscaper neighbor friend about helping weeding my yard
- Went to pixel art workshop (post incoming)
- Did not do weekly review (probably skipping)
- Did not do monthly review (probably skipping)
- Did update tickler
- Did clear out inbox
- Did not make any progress on blog scripts (maybe will still get to)
So, I did about half the stuff I planned to do. Asking for the neighbor's help was always part of the weeding plan, and he was busy, so I could half a point for that.
That's not bad for my first goal-based weekend. That pixel workshop took a lot more of my energy than I thought it would. Though, I'm thinking that'll be enough content for a post on its own. It should have been yesterday's post, but as I said, it was tiring.
Weekend Goals
10/02/15
It's been a while since I had a weekend with a working brain and no prior engagements. This weekend, I have my brain, and... prior engagements. There's a particularly exciting Pixel Art workshop in the IEEE room hosted by the UA Game Dev club. I'm going to make some pixel art! Yeah!
I'd also like to get various other things done. At work I've been trying out goals of various time-frames. Daily, weekly, monthly. How successful this piece of my system is is still up for debate, but it's not too much work to do, so let's try it out.
Goals for the Weekend
- Weed the yards
- Go to Pixel Art workshop
- Weekly Review
- Monthly Review
- Clean the house
- Update tickler
- Clear out inbox
- Make significant progress on blog scripts
With time I'll be better about specificity and scope of my goals.
Savings Goal
10/01/15
Since it's a new month, and I just talked about spending, I figure I might as well set a savings goal for this month. There's some temporary spending going on this month that'll last about three months that'll make saving more than 50% of my income pretty difficult.
Anyways, I want to predict my spending for this coming month based on definite expenses and trends from the previous month.
| Category | Spending |
|---|---|
| Mortgage | 1089 |
| Health | 600 |
| Utilities | 530 |
| Grocery | 350 |
| Maintenance | 200 |
| Pets | 100 |
| Entertainment | 65 |
| Transportation | 20 |
| Total | 2954 |
Income for the month will be about $4200 after taxes, so my savings for this month will be around $1200. So, saving about 29% of my income for the month. The main items of spending are my mortgage, which I'm slowly working towards addressing; my utilities, A/C during the summer in a house that isn't the best insulated; and the health costs, vision therapy which probably isn't covered by insurance (still got to explore that).
I'm hoping to sell the house sometime early next year, but I need to actually get the ball rolling there. That could drop monthly costs a good $600 or so, I think. Though, rent from roommate would also drop somewhat proportionally.
Health expenses will stay pretty high if not covered by insurance for a minimum of about three months or so, maybe, but after that will drop back down to less than $100 a month.
Utilities should drop drastically this month and not rise again until late spring, which hopefully will be after I have absconded to a smaller house where utilities will also cost less.
Groceries and maintenance are somewhat decently low. Groceries could be done more efficiently, but it's still a work in progress, and is way better than it was. Maintenance is only so high this month because I need to buy some tools to actually do some chores around the house (notably, I need a weed eater and a vacuum cleaner). I may find ways to avoid spending so much on either, but their current level isn't too alarming.
The rest of the stuff on the list is accpetable for now, and not particularly valuable to reduce further.
Predicting and tracking my spending is going to be a necessary part of spending way, way less.
Spending Status
09/30/15
It's the end of the month, which means a monthly review will be in order soon. I managed to do one of those for August at work, and now I'm hoping to do one for September both at work and at home. I'll try for the review this weekend. I'll even try for a weekly review. Daily reviews are simply unlikely given my current control over my time spending.
Though maybe that will change soon.
In any case, I still have a backlog of receipts to enter into my system, and also a bunch of digital charges to go through as well, but here's a somewhat decent rundown of my expenses (except for some major expenses that I'm still getting around to putting in my system).
BULK: 82.76
COFFEE: 20.91
FUN: 0
GAS: 0
GROCERY: 292.71000000000004
HEALTH: 122
MAINTENANCE: 134.28
PETS: 428.81
ROSSE: 32.44
ROSSE CRAFT: 4.89
TRANSPORTATION: 21.5
VACATION: 0
PETS is a bit more expensive than usual as I needed to take the dog to the vet. HEALTH will only be more expensive in the coming months for some eye therapy. MAINTENANCE is actually higher for the month, but I just haven't added in the receipts for fixing the add-on to my house (labor, materials, a new water-heater, etc.).
I'm thinking this plus mortgage and utitlities will put my spending for the month at something like $3400. So, savings for this month will be about $500. So, even with $400 of unexpected pet bills and about $1100 of one-time house fixing expenses, I managed to save money.
That's pretty awesome. Not that long ago, I would've hurt my savings for sure.
On months without unusual expenses, I should be able to save about 50% of my income.
Sometime in 2016, I should cut living expenses by a further $600 or so via moving to a smaller house. That should put my savings rate at around 70%. I could also be much more efficient at saving money, I think. The long-term goal will be $1000 per month. Hopefully that'll be my spending throughout 2017.
That's a dream right now. Got to make it a reality with some proper planning and training.
Scripts So Close... Time to Start Over?
09/29/15
Things are coming into form, script-wise.
And now I hate looking at the code. It's just... not structured in a way that feels right. It's just hard to further mold into place.
Probably best to exercise my craft and start over.
Game Dev: Meeting Notes
09/28/15
Background
William graduated Art Institute of Tucson in 2012. Sought out this club to find like-minded people. In the beginning, only he and Cindy did art.
What is Pixel Art?
The art of video games. The old limitations of what art in games could be that is now a style unto itself.
Why Use Pixel Art?
It's pretty.
It's computationally cheap and efficient (small image).
Can be made with most anything (any raster image is pixel art, basically).
Re-using assets that you have is a part of the pixel art craft. Can use art tools to palette swap sprites.
What's Pallette Swapping?
Color gradient that can be mapped over images. It's how Mega Man's various colors work.
Today's Agenda
Pixel Art: what it is, what it isn't.
How it's done.
The tools to use.
The workshop on Saturday will be line art, then animate a bouncing ball, and then make that ball have a tail (call it a squirel) and have it bounce it around.
Photoshop, or anything that can make a raster and be exported as a gif:
- Gimp
- Pencil2D (a program)
When Workshop
There's a doodle poll for where and when. Figuring it out.
Color-Swapping Technique Called Hue-Shifting
Something that will be gone over in the workshop. Pick a base color and then shift to warmer/cooler colors to get the palette for the art.
This technique is used to create palettes for basically anything. Pallettes are really important. Using too many colors looks gross.
Character Animations
Will teach how to do a base animation, idle animation and other stuff. And also put it into an engine. In the workshop next week.
3D Art with Pixel Textures
Makes 3D images with pixel textures. This is also efficient.
Cut a Slab Out of the Color Wheel and Only Use That
"By cutting shapes out of the color wheel palette I can get nice color schemes that are well-balanced. This is also nice because it gives me a general idea of how much of each color to use."
Link to zipfile of all images will be available soon.
Opening Photoshop
Who has used photoshop or a grid or pencil digital tool before? Bunch of people.
Failing to Show Youtube Video: PixelArt TileSets
IEEE wifi troubleshooting.
And now it is running.
The nine-tile grid is super powerful.
We stopped at the "make a tileset" part of the video (around 8 minutes in). We'll be doing that at the workshop on Saturday.
Funny thing to say about Shovel Knight in a minute: went from NES palette to a few more colors, and then made things simpler to make them more detailed. Will link articles on Facebook.
Side Note: Voxel-Art: Actual 3D Pixel Art
Not much known about it by William.
For the Workshop
Bring a computer. Bring a mouse.
Will bring a program on a usb drive for drawing that you can install at the workshop. Pixel. This one?
Other ones that are good:
- A-Sprite
- GraphicsGale
It will be in IEEE room. Sign up on the doodle poll and see what time it is.
Come if you can!
Fixing Lost Post
09/27/15
Work on node.js scripts for the sake of various blog improvements/iterations has revealed various things already. Most of them are not worthy of note. However, one thing that is worthy of note is that I didn't realize at the time that QuakeCon Approaches had overwritten QuakeCon Approaches. I figured this would happen eventually, me naming a previous post and overwritting. I did not figure that I would have already have done this over two months ago.
Thankfully, I started versioning this blog much ealier than July of this year. All I needed to do was go back in time to when the post was its older self, and then rename it to something more unique.
Checkout repo commit that does not contain new post that overwrote old one:
git checkout `git rev-list -n 1 --begin="2015-07-01" master`
Copy old version of file:
cp public/blog/quakecon_approaches.html public/blog/quakecon_approaches_140715.html
Return to head:
git checkout master
For completeness, let's rename the newer version of the file to something unique so this doesn't happen next year.
git mv public/blog/quakecon_approaches.html public/blog/quakecon_approaches_150719.html
And now the lost post has returned.
Yay.
Tired
09/26/15
I slept sixteen hours between last evening and this morning. I was tired. I do not know exactly why. Though, it was a tiring and exhausting week. My energy ran away from me. And so did my motivation.
Not enough sleep? Not enough water? Too much sleep? Soda? Diet in general? Still acclimating to the biking I do now? Extra biking the last few days? Poor sleeping capability the last few days? Things on the mind?
Perhaps it's just a regular thing.
Melancholy
09/24/15
Melancholy is a funny word. It's word that I first encountered reading. I read it many times, somehow, in my junior year of high school. I never looked it up, but it's meaning bled through and I understood. Eventually, a context in my high-school setting screamed for the word to be used and I said it.
For the life of me, I do not remember what was being talked about. Only that it involved two students and two teachers talking about something not particularly related to school. I remember only how I said the word.
Meh lanch o lee
There was a look on the teachers' faces. A look that conveyed they knew what word I was using immediately, but that they needed a moment to process my incredible error.
And immediately upon seeing their faces I had understood an error had been made. That I must've managled the word. I braced myself and they laughed and laughed at my mistake.
This trivial little moment was something rather amazing to me. Upon making a silly error and being corrected in a slightly embarassing way, I was not upset. Remembering now, that may have been the first time. I had been correctly in embarassing situations many times, and that will surely continue, but this was the first time it did not upset me.
Now, don't get me wrong, I was a bit defensive and quick to explain my hilarious error, but for context this was the same me that threw a temper-tantrum literally kicking and screaming on the floor over a stale-mate occuring during a chess match. There was maybe a year's difference between these two moments.
Even more amazing is that I didn't reflect on that moment at the time. Or at all until now, almost a decade later. It was just a silly memory that came to say hello from time to time. And unlike other silly memories I don't cring at this one's presence. I give a little laugh, or perhaps a slight smirk.
I think about the word from time to time. To me, it is an alien feeling. Something that does not resonate with my experience. At the very least, it does not come to me without my wanting it. I might want to feel melancholy, and so it happens. But even then, it isn't sadness. It's more a deep thought in a shallow meandering. An apparition of apathy.
Of which I find myself now. There are things I should be doing, things I would enjoy doing, and I simply find myself unable to choose to do them. It's something I can do all the time in the right context, but right now it simply is not available to me. It's like, here's this button that does the thing, but now I push it and it just makes this obnoxious tone and nothing else.
So I think.
I think about why I can't do something I should be perfectly able to do. I think about thinking. I find music, and video, and reading to inspire more thinking. Eventually there's all this noise in my head that it just cancels out.
And then there's silence.
The Budding Plan for 2016
09/23/15
Every once in a while, I think about the "plan" for 2016. The plan is to transtion from blogging everyday to drawing everyday. Today, I thought about this a bit, and what I want to do is transtion to higher-quality, lesser frequency blog posts whilst I dive into low-quality, high-frequency drawing.
And really, the thought has occurred to me that my goal isn't to blog everyday, it's to end the year with 365 or more blog posts. Quality completely unimportant. And so, next year, I want to write 52 blog posts, all of which are somewhat in-depth and something I specifically want to talk about. To have any hope of making that number by the end of the year, I need to do about 1 a week.
Though, really, continuing the blog in any serious manner is a secondary goal. The main goal will still be 365 drawings in the year.
I'll also want to devote some time to learning music. Nothing major, just some minor shallow dips here and there to prepare for some sort of daily musical thing in 2017.
I'm also still heavily considering putting this site into some sort of old area and starting from scratch. I might not even use this site as reference. I'm not sure.
I have plenty of time to decide.
Excited
09/22/15
I'm doing things again. Working on stuff. And the thing I'm working on right now, is focusing on this blog, which is the medium by which I now formulize my thinking and just get stuff done. Improvements to my work blog have been a boon for my work productivity.
If this here blog can keep my attention for long enough, it may well become quite the tool for fulfilling personal projects.
Game Dev: Meeting Notes
09/21/15
Brie is giving some announcements. Pixel art talk postponed for now, doing GDC talk instead.
Secretary talks today.
Tucson Indiedev Group doing a Unity workshop at CoLab workspace this Thursday at 7 p.m. Details about where/when coming soon.
Jeremy announcement. Thanks everyone for coming to game night. It was awesome. Secretary elections not happening now, but speech happening. Tonight sending out form to fill out secretary positions.
I gave speech: Already taking notes. Student should get role though, because I graduated about three years ago. *thumbs up*
There was applause. I appreciated it.
Plug for UA Video Game Developer's Club (join it!).
Patric hooking up his computer into TV for GDC talk. Pixel talk will be this Monday. Pixel art workshop will be next weekend (not this weekend).
Patric starting talk for GDC.
What is GDC?
Game developers conference. Great place to meet game dev folks. Can meet a lot of big names in game development. There's a lot of good talks on game design, art, and coding. There's also good hands-on demos. Lots of good SWAG.
GDC 2016: We're Going
Anyone in the club can go. You're in the club if you're on the listserv. We'll be going via car. 16-hour drive to San Fransico about. Will split it into two days.
GDC is happening during spring break, so no worries about missing school. Will be there for GDC Monday-Friday. Leave Friday night. Get back in Tucson on Saturday.
Hotel/Travel Costs
Travel costs estimated to be about $450 per person. That's parking, hotel, gas, rental, emergencies.
Pass cost list shown.
Indie Games Summit Pass ($325). Pass to all indie-game talks.
Summits, Tutorials & Bootcamps Pass ($795). Lots of good in-depth tutorials and introductions to stuff.
Main Conference Pass ($995). Gets into talks that are a part of the main conference. This includes a lot of things. One year Ken Levine gave a talk on game narrative.
All Access Pass ($1495). Everything.
There are other passes but they are not recommended.
These costs will probably be cut by 10% as we'll buy group passes for the club.
How pay?
We will have financial aid for people unable to afford passes.
Last year we could fund 5 people. We might do better this year.
You can get a free All-Access Pass if you can successfully volunteer to be a Conference Associate! Customer-support role. Apply as a customer service person, not a game dev person.
Questions so far?
Fundraising? Yes, we have plans for at least 3 different fund-raisers. Hoping to knock off a lot of costs.
$450 for travel plus pass costs? Yes, but we're working on funding.
Who here has been to GDC? Who has a good experience? One person met Warren Spectre! Got to thank him for making Deus Ex. IGF awards were really cool. Could go to an alley where the indie developers and their games were setup, and could ask them just general questions.
Lucas Pope once just kept winning awards for Papers, Please.
List of talks and stuff brought up from GDC/IGF sites. GDC Vault. There's a pay wall for some content (got to get the super expensive pass), but there's a bunch of free videos.
Talks were really cool. Guild Wars 2 talk on AI was really interesting.
General advice on passes. Main conference pass is recommended. The days where there's no talks to go to there's plenty of things to do on the Expo floor.
There's no enforcement of traveling with the group. Trains, planes, and automobiles. Whatever floats your boat.
Don't get student pass. Worthless. Cool stuff has really long lines.
Side-note: if you haven't tried modern VR, you need to experience it.
Google-cardboards get thrown at you at GDC.
Question on what the Oculus Rift is. Headset for VR that hooks into computer/console.
Someone came in late and got a quick summary of the whole talk. Good summary.
GDC also has a career-fair and stuff. There's also a lot of partying going on around the event. It's a great place to network and possibly get a job/internship.
Anymore questions?
Email Patric with anymore questions (written on board).
Secretary Speech 2
Miranda: Hoping to become secretary during this club. Take notes and keep the club updated. Miranda really, really likes this club. This is a club where she really feels she belongs. Wanted to get involved last semester, but everyone else was more qualified.
Rory: Vote for Miranda, Rory is not a student.
End of meeting.
Final note: next week is pixel art. GDC is a great opportunity to bond with others in the club.
Minimist.js
09/20/15
So, now that I'm getting back into node.js script tinkering, I am looking into argument-parsing libraries for node. The one I'll be playing with for now is minimist, which looks... functional. In a minimalist sort of way.
What I would like is something pretty similar to python's argparse, but I don't believe there's anything of....
Here is a "full port" of argparse from python into javascript. There might be value in using it, if it works well enough. Python is the language I use at work, and argparse is something I could be more familiar with.
Hmmm....
In any case, what I'll be using it for is a smarter post/index generator. Right now it takes all the old posts and generates them into the current blog index page. This isn't as fast as I'd like. It also redoes a lot of work everytime that it very rarely needs to do, namely regrabbing all the posts that have already been added to the index page. The idea will be to have the script see what posts need to be added, and only add those. In the rare case I edit a past post and update it (like I will do for various early posts soon), I'll feed in a flag that regenerates the entire index page from scratch.
In any case, my view area is now holding copies of all my published posts, containing only the RSS description (for those that have RSS items), title, publish-date, and the blog content.
Hopefully, I can now regenerate the html files, blog index page, and the RSS file from these posts. That'll be the next step. From there, I need to setup my inprogress area to write posts in the minimal setup, and have it automatically add the date and such. Updating the publishing script shouldn't be too difficult, though.
Blog Refactor Progress
09/19/15
I now have a copy of each published post on this blog in its own area where only the title, content, and RSS description in each file. Just writing that, I realize I should also put the published date in the file as well.
Anyways, the script itself is becoming quite the piece of bloat, but as it stands, it'll be something I throw away once it's done.
Speaking of throwing stuff away, I wonder if you ever noticed that the tab title of all my posts pre-"Post have individual Links Now!", Stephan. I certainly didn't until now. It seems the old script that generated those posts was not properly written. As can be seen by the titles as they are now (javascript function definitions). That will be fixed soon enough.
Eventually, I'll want some file in place for good updating to my system from the old system. It may be of use to explore how the Django framework manages such intelligent transitions. Though, such digging may only be useful once I start putting these posts into a proper database.
In any case, here's the script in all its glory:
/*jslint node: true */
(function () {
"use strict";
var cheerio = require('cheerio'),
fs = require('fs'),
path = require('path'),
postsInit;
postsInit = function (callback) {
var database;
database = path.join('database', 'blog.txt');
fs.readFile(database, 'utf-8', function (err, data) {
var filenames,
count;
if (err) {
throw err;
}
filenames = data.split('\n').filter(function (filename) {
return filename !== '';
});
count = 0;
filenames.forEach(function (filename, index) {
var postpath = 'public/blog/' + filename;
fs.readFile(postpath, 'utf-8', function (err, data) {
var post,
viewpath,
viewtext;
if (err) {
throw err;
}
post = cheerio.load(data);
viewtext = (
' title '
+ '\n'
+ ' ' + post('h1').text().trim()
+ '\n'
+ ' /title '
+ '\n'
+ ' div id="content" '
+ post('#content,#temp').html()
+ ' /div '
);
viewpath = postpath.replace('public', 'views')
fs.writeFile(viewpath, viewtext, function (err) {
if (err) {
throw err;
}
console.log(filename)
count += 1;
if (count === filenames.length) {
callback();
}
});
});
});
});
};
postsInit(function () {
fs.readFile('public/basic.rss', 'utf-8', function (err, data) {
var rss;
if (err) {
return console.trace(err);
}
rss = cheerio.load(data, {xmlMode: true});
// TODO: sync up every RSS item with its post
rss('item').each(function (index) {
var postpath,
itemtext;
postpath = rss(this).find('guid').text().trim()
.replace('http://www.ksionda.me', 'public');
itemtext = (
' description '
+ rss('description', this).text()
+ ' /description '
);
fs.readFile(postpath, 'utf-8', function (err, data) {
var post,
viewpath,
viewtext;
if (err) {
return console.trace(err);
}
post = cheerio.load(data);
viewtext = (
' title '
+ '\n'
+ ' ' + post('h1').text().trim()
+ '\n'
+ ' /title '
+ '\n'
+ ' div id="content" '
+ post('#content,#temp').html()
+ ' /div '
+ '\n'
+ itemtext
);
viewpath = postpath.replace('public', 'views')
fs.writeFile(viewpath, viewtext, function (err) {
if (err) {
throw err;
}
});
});
});
});
});
// TODO: Generate a file with an RSS section and blog post section
// TODO: create copy of indexGenerate that updates the blog index file
// and each blog post url that doesn't currently exist and updates the
// rss file
}());
I got a ways to go with my javascript craft.
The Game Against Laziness
09/18/15
I've had this post title in my inprogress area for a while. I don't quite remember why I wanted to make this post. Something to do with the ever-changing battle.
I'm getting pretty good tracking my state-of-mind at work, and doing so is really helping me strategize what work I'll be able to do, and what kind of breaks would best facilitate me actually staying productive throughout the day.
Reading myself will prove the most valuable in consistently doing anything of value. Tracking various aspects of my state-of-mind and how well I do things under those various states will give me the data necessary to know my enemy, so to speak.
I think doing this outside of work requires starting from scratch. Trying to emulate my system at work, which has undergone plenty of brewing in its environment, will just end up not working as well in the different context.
I'll start small, and just do what I can and document the small things that work, and see how I can piece them into bigger things.
Hyperfocus?
09/17/15
At work lately, I've really been able to just submerse myself into the tasks I set out to do. Overall, this has been awesome. Though, in some cases, I can get really hung up on getting little details right, or doing things the way I want them done. Which actually might be good right now at work, because what I'm working on is new, and I need to learn the in's and out's.
In any case, now seems like a good time to get into side-projects at home. Who knows how long this mentality will last? Right now, I've been working on infrastructure. I've been working on the stuff that allows me to do work. Updating this site will be a powerful step towards that. Making it so I can do work on any computer I have access to will also be a powerful step.
Hmmm.... I wonder if I could do work on my phone in any meaningful way. Something to consider.
In any case, I think this state-of-mind is quite cyclical. It's not a result of my consistent attempts at being better, it's just the season of my brain. Even so, learning how to take the best advantage of this state is in my best interests. It will probably be when I get the most work done. If I can get the most important work done during this phase, hopefully I can glide to the next time my brain is like this.
VirtualBox on Windows Machine
09/16/15
So, sometimes I feel like being on my desktop computer, and also doing productive stuff, linux-style. The problem? My desktop is usually booted to my Windows side, and switching to my Ubuntu side is just annoying enough that I'd rather pick up my chromebook than deal with that.
I have messed around with various work-arounds to this problem. What I tried just yesterday was ssh'ing to this here server via a Chrome extension called Secure Shell.
That worked... okay. For some reason I kept losing connection to my server via ssh, and Secure Shell throws a bit of a hissy fit when I do that.
However, I use Secure Shell on my chromebook, which never complains in that way, and I figured it was because I was shelling into my local OS. And so I decided to install a virtual Ubuntu 14.04 onto my external harddrive, and boot it on my Windows OS via VirtualBox.
I then setup port forwarding so I could ssh to my newly created ubuntu server from my Windows Secure Shell tab in Chrome. From there, I setup ssh-keys to not need to enter my password everytime, and then setup ssh-keys between my virtual server and this server.
I then git cloned this here site repo that I have saved on my server, and now I'm writing this post from my Windows desktop, but it just feels like I'm writing it on my chromebook but with an extra-large screen.
It kinda feels like I wanted to downgrade my Windows machine to a chromebook so I could feel comfortable working on it. Oh, well, this is how my brain works, and I enjoy the setup. It was also kinda a learning experience getting this all setup. Perhaps a future post will explain the process in better detail.
RSS Description in Post File Plans
09/15/15
I have finally decided to get around to messing with blog scripts again. Part of it is due to me having made a bunch of helper scripts at work and getting a lot out of it. Part of it is that I am still doing the RSS updating by hand everyday, and it's finally getting on my nerves again.
I mean, I first mentioned wanting to make the RSS thing smarter back in April. And it kinda trailed off shortly after that. Where does the time go? If I was better at documenting my stuff, I could answer that question, Stephan.
Anyways, right now I'm in the process of cooking a script that will first fix all the files I currently have, and I can then think further from there. Right now, it looks like:
/*jslint node: true */
(function () {
"use strict";
var cheerio = require('cheerio'),
fs = require('fs');
fs.readFile('public/basic.rss', 'utf-8', function (err, data) {
var rss;
if (err) {
return console.trace(err);
}
rss = cheerio.load(data, {xmlMode: true});
// TODO: sync up every RSS item with its post
rss('item').each(function (index, element) {
var htmlname;
htmlname = rss(element).find('guid').text().trim()
.replace('http://www.ksionda.me', 'public');
//console.log(rss(element).html());
//console.log(htmlname);
fs.readFile(htmlname, 'utf-8', function (err, data) {
var post,
viewname,
viewtext;
if (err) {
return console.trace(err);
}
post = cheerio.load(data);
viewtext = (
' <div id="content">'
+ post('#content,#temp').html()
+ '</div>'
);
if (index === 0) {
console.log(viewtext);
}
viewname = htmlname.replace('public', 'views');
});
});
});
// TODO: Generate a file with an RSS section and blog post section
// TODO: create copy of indexGenerate that updates the blog index file
// and each blog post url that doesn't currently exist and updates the
// rss file
}());
Right now this just grabs the blog content of each post in the RSS file, and prints that content if the RSS item index is 0. Soon, I'll have a bunch of files in views/blog that contain a content div and a description div, and from there I'll generate the rendered htmlpages and also the RSS file. I'll have to have a special case for posts that do not have RSS items.
I'm glad I'm finally getting around to this properly.
Feeling Better
09/14/15
A weekend of sleep and binge-watching Kill La Kill seems to have been just what I needed.
I ended up skipping going to the Game Dev Club meeting today. Oh, well, there's always next week.
I want to start working on various site stuff, but I really need to deal with house stuff. The weeds in my front and back yard are super out of control. I have a neighbor willing to give me some advice and lend me some tools there.
I got a contractor coming over soon to fix the addon area. He's willing to let me watch/help/learn how to do what he does. He'll also show me how to replace some windows and fix some carpetting stuff. I could always learn this stuff via YouTube, but I think some hands-on time with someone who knows what they're doing can give me a much needed first dive into this stuff.
After I've got house stuff dealed with, I'm going to want to dive back into web stuff. Improve this site, make some games again, etc. Now, I don't have to wait until house stuff is done, but I should at least make sure I'm waiting on most all house stuff I need to get to and have no actions I can execute myself before I work on other stuff.
That, or I should make sure I'm using working on web stuff as a break from working on house stuff.
Overwhelmed
09/13/15
I think I'll just go full-on Facebook status as blog post here: I believe I'm overwhelmed. Seems like I'm dealing with a lot of stuff, though really it isn't too much, I guess. Part of it is my slight dip into sickness whilst everything around me needs seeing to.
- Dog is ill
- Both yards are covered in weeds
- Dishes need doing
- Need to work on projects to make me better at various crafts
- Need to start counting calories again
- Need to break in spending tracking habit
The list goes on. I'm doing a lot of good stuff, too, but it all just seems so insignificant when compared to the stuff I need to do. I just got to celebrate the little vicctories and accept the ongoing battles and outright losses as they are, without letting them damage me too much. No permanant damage has been done.
My personal growth is a chaotic scribble of a line, but if I zoom out enough it's certainly a trend upwards. And the noise, as powerful as it is now, is growing ever smaller as well. Sometimes the fight is one I lose, but there's always tomorrow.
As cliche as that is.
Sleeping All Day
09/12/15
So, I'm either fighting off a latent sickness, or I'm recovering from poor sleep this past week. Maybe both? I've had trouble sleeping the past week due to dog problems, and also both the people I live with got sick this past week.
In either case, I just spent about 19 hours sleeping. I got this rather annoying headache. I'm hoping this is about as sick as I'll get.
Costco Trailer Run
09/11/15
So, after yesterday's successful bike trailer test drive, I decided to do a bike ride to Costco and get some bulk items. A mere 1.5 miles from my work, though a considerable 6.1 miles home.
Did you know Costco has bike lockers, Stephan? Well, you do now. Unfortunately, they expect locker locks, not bike locks. At first, it seems like you can use a bike lock too, but some finagling with the door after "locking" it showed that I could twist the lock around to open the door.
I took a risk and left my bike there and went shopping with the bike trailer. I had already discovered at Target that I could neatly fold my trailer and fit it comfortably under the cart. This strategy also works with Costco carts.
I got cheese, milk, oats, and both dish and clothes detergent. There's a surprising amount of weight in those few items. I also realize now that I forgot to buy Tabasco. Crap. Oh well, next time.
In any case, a heavy load taken 6.1 miles is not quite as tiring as one would expect. I just took it slow and didn't try to go super fast. I took it down a busy road, and that was pretty scary. I'll probably want to find a better route home next time I do a Costco run.
I didn't realize how tiring it was until I got home. It was a good bit of exercise and hopefully a good means of saving money in the long run. A promising first run for what may be a habitual thing.
Bike Trailer Test Drive
09/10/15
Today was the first day I took the bike trailer out for a proper errand. It was a short trip and an easy test, getting a big bag of dog food, and some pizza.
Worked perfectly. The bike trailer even fits comfortably in the bike lane on the busy streets.
I'm thinking a run to Costco should work just fine. I believe I can take it with me to work and fold it up to fit it in the bike locker.
Let's see how this goes.
Fiction Idea: How People Have Died
09/09/15
This is one that will take me a long while to get to properly, I think, simply because my experience and/or knowledge of death as a proper real thing is fortunately lacking. So, a quick sentence description for this idea:
Full Day No Charging Android Phone Update
09/08/15
So, around 0700 this morning I unplugged my phone. I brought it with me to work, did not connect to wifi at work, and went about my day. If I had done this before fixing it, it would have been dead about 8 hours into my 9.5 hour day at work today.
Right now, according to the phone, it's got 88% of its battery life left.
I am so glad I fixed my phone.
Quick and Dirty Review
09/07/15
It's been a long, long time since I did a weekly review. So long, that I can't really call this one of those. So, instead, this is a "get things in proper order so I can get organized to do weekly reviews again starting next week and stuff". Or, as the title puts it, a quick and dirty review.
I have, after way too long, finally cleaned out my inbox. I've organized my tickler up until today, and hopefully will start using them daily again starting tomorrow. Which really means that I need to employ my morning routine again.
Which means I should update it now with a reasonable list of things. All right, I got a good draft in place. I'll update as I see fit while using it every morning from now on, hopefully.
I also got a long-outdated activity inventory that I should deal with. That's something to do with an actual weekly review next week. This week's goal will be to do proper daily logging/planning and work towards something I can eventually scale up with goals and stuff.
Hopefully, this is a step in the right direction.
Fixing My Samsung Galaxy S III
09/06/15
This is a post about changing the firmware (often called a ROM) of an android phone from an outdated, vendor-provided ROM to an open-sourced one called CyanogenMod (CM).
I did all the computer-sided work with an ASUS C200 chromebook on a crouton chroot. I'm not covering how I setup Ubuntu 14.04 on crouton (though I guess I should at some point in the future), so this will detail how to flash CM onto an Android phone via the Ubuntu terminal command-line prompt. Specifically, I flashed CM11 onto a T-Mobile Samsung Galaxy S III. It's pretty likely anyone who wants to use this post to flash their own phone need only find the different files they need to download, which will probably be available on the same sites I used.
Switching to CyanogenMod (CM)
From their main page, I picked the devices link, and filtered down to T-Mobile device from a Samsung vendor and picked the Galaxy S III option. From there I just went to the installation instructions. Any device that can have CM installed on it can probably be found at the devices link.
My installation experience happened in three steps:
- Installing the ClockWorkMod ROM and Recovery Manager
- Flashing CM11 onto my Phone
- Fixing my Acess Point Network Connection
Installing the ClockWorkMod ROM and Recovery Manager
This step is more-or-less perfectly covered by the CM Wiki installation instructions.
I downloaded the relevant img from ClockWorkMod. I was a bit confused at the difference between touch and regular recovery. Touch just makes it so you can actually use the touch screen in recovery mode. Otherwise, controls use the phone buttons (Volume, Power, Home). Touch is preferable, as it has both touch and button controls, so you can pick whatever feels more intuitive.
To flash the recovery img onto my phone, I used heimdall which I believe is for Samsung devices only. To get hemidall, I ran:
> sudo apt-get install heimdall-flash
With heimdall installed, I booted up my phone into "Download Mode" by first shutting it off, and then holding Home, Volume Down, and Power. Once my phone told me it was download-ready, I plugged my phone into my computer and ran:
> sudo heimdall flash --RECOVERY recovery-clockwork-touch-6.0.4.5-d2tmo.img --no-reboot
sudo here may or may not be necessary. Apparently, it might also be
--recovery (lower-case) or some other such thing.
Depends on phone? I'm not sure, this command was the first command
given to me to run, and it worked.
Now, here I got a little confused, because the instructions talked about a blue transfer bar appearing on "the device". Either my phone was special, or "the device" meant my computer, and the instructions were expecting me to use the GUI version of heimdall, not the command-line tool. In any case, if the command ran without printing out explicit errors, you're probably good to go.
It's time to flash the CM ROM onto the phone.
Flashing CM onto my Phone
This step is also more-or-less perfectly covered by the installation instructions. For various reasons covered below, I went with CM version 11 (CM11). Which meant going to the d2lte link. The only difference in the instructions for installation that I found was the download page here.
At this point, we need to boot the phone into recovery mode. Turn off the phone if it's on. Then, boot it up by holding Volume Up, Home, and Power.
Various stuff tripped me up here, so here's some pointers. When you see the start-up splash screen, let go of the buttons. Do not let go when the phone vibrates, that's too soon and the phone will boot normally. Do not press down the buttons too long, as holding Power will eventually shut the phone back down. The timing is fairly lenient, but I erred in both directions the various times I went into recovery mode. The initial splash screen should have recovery mode displayed somewhere. It's also easiest to boot into it when the phone is off and unconnected.
Once in recovery mode, reconnect the phone to the compter if necessary. From there, the first thing to do is back things up as they are now. The instructions say that backing up the phone is optional, but I legit had the experience of wanting to restore my old setup before doing this whole process over again for various reasons, and was glad that the backup is there. So back up your phone, it isn't optional.
Then, go ahead and wipe things to your heart's content:
[wipe cache partition]
[mounts and storage] -> [format /system]
[advanced] -> [wipe dalvik cache]
Everything after the factory reset above isn't strictly necessary, but I ran into some problems where it was recommended to do those things. It didn't end up helping my particular problem, but it didn't hurt anything, so just do it.
From here, we're going to want to get the CyanogenMod package on the
phone. For me, the right package was
the d2lte package
which had a filename of
cm-11-20150831-SNAPSHOT-XNG3CAO3FN-d2lte.zip. For
simplicity's sake, I'll refer to it as cm.zip.
From here, that file needs to get from the computer to the phone. To do that, we'll be using adb (Android Debug). To get adb:
> sudo apt-get install android-tools-adb
And now, we need to make sure we're connected to the phone, that adb can connect to the phone, and that the place we'll be storing the file is properly mounted so adb can successfully push the file to the desired area.
To connect adb to the phone, just run:
> sudo adb usb
This should print out something like:
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
restarting in USB mode
It may just print out that last line. As long as it doesn't print out an error, it should be good. Now's a good time to decide where to put the package files on the phone. I recommend going through the install process and see what directory looks good.
Doing this will also properly mount /sdcard, making it possible to push things to that area. This is another confusing thing, because the command to move files to the phone doesn't report any errors when it doesn't actually push the file.
Anyways, one of the directories available was called "files", which seemed perfectly fine for me, so that's what I used. At first, I tried to just push it to /sdcard itself, but that didn't work, so actually pick a directory within to use.
And now we need to copy the file on the computer into that directory:
> sudo adb push cm.zip /sdcard/files
Note: another thing that tripped me up here. Don't put
/sdcard/files/. That trailing slash will
resulting in an unhelpful error stating:
Cannot push to /sdcard/files/, is a directory.
And now, on the phone, we can load up the subdirectory we pushed the file to and install it.
You might still be in the [choose zip from /sdcard], so just pick files and then whatever you named the cm package.
Again, this is optional, but unless you want to install exclusively
outside of Google's app store (why?), might as well install it for
simplicity's sake. A list of link's to the appropriate Google Apps
package is
here,
and CM11 specifically is
here.
I saved the download as gapps.zip.
> sudo adb push gapps.zip /sdcard/files
Again, you might be in the install area already, the above is instructions from the main menu area. You might just need to [Go Back] and then come back into the directory to see the newly added file.
After that's installed, it's time to reboot the system, and set up the phone per its instructions.
The instructions on the phone should suffice here: picking language, logging onto local WiFi, logging onto the Google account, etc. I won't cover this stuff, but I will cover the problem I had getting phone reception.
Fixing my Acess Point Network Connection
So, once I had set up my phone, I had a problem with my reception. Where it should say the phone provider, it said, "Emergency Calls Only". Interestingly enough, I could receive both texts and calls, I just couldn't send them out.
I thought that I would just have to setup the Ting network APN on my phone, and so I followed the Ting instructions for my phone's sim card. However, once I tried to save the setup... there was nothing in the network list. It didn't save anything, and there wasn't anything there to begin with.
After a lot of searching for solutions to this problem, I discovered that I probably needed to update my phone's baseband/radio/modem firmware. I then looked up my phone's model number:
Now, my phone said "SGH-T999", so I promptly searched "updating modem t999". The first result was this developer's forum with a list of download options for T999, T999L, T999N, and T999V phones. I'm pretty sure any searching of "updating modem <model number>" will lead to a similar post on the same website.
So, my model number said "SGH-T999", so I thought that meant my model was the T999 and not any of the others. This is not the case. Luckily, the "About phone" area also had a "Baseband version", which said "T999L[...]" which gave me the major clue that I needed the most recent T999L modem which was available here. Another major clue was installing the most-recent T999 modem and it not working. Luckily, that did no damage, and installing the right T999L modem afterwards worked just fine.
The file I downloaded was called
TMOGalaxyS3LTE_UVUBNC1_Modem.zip,
but I'll refer to it as modem.zip.
Reboot the phone to recovery mode, and make sure the install directory being used is mounted and can be pushed to. Then:
> sudo adb usb
> sudo adb push modem.zip /sdcard/files
Then reboot and see if reception is working. For me, it now said "T-Mobile" instead of "Emergency Calls Only". I needed to change that to Ting, so I went to:
I thought I would have to actually add Ting as an access point name, but it turns out that the modem package came with it setup for me. Thanks, open-source community!
Several Steps Backwards
So, the above mentions the overall process of switching ROMs, and fixes a specific problem I encountered. Edited out a bit were all the hilarious mishaps and detours I encountered along the way. If you're interested in that process for whatever reason, you may want to continue reading, but the tutorial-esque nature of the post ends here. If you haven't found what you were looking for yet, it probably won't be found further below.
CM12!
So, when I first started this process, I grabbed the most recent version of CM: version 12. Everything installed fine, but I ran into that APN problem.
No, Wait, CM11!
Some of the first sources I found suggested it was the ROM I chose. CM12 is newer, and buggier, and maybe in beta and using the newer Android version which might also be buggy. I decided to downgrade to the more stable CM11.
No, No, CM12 is Good!
Once I got CM11 working, I shortly encountered the same APN problem. I tried various updates and stuff, and even "updated" my phone's CM recovery img, thus having a different recovery firmware.
Having the same problem, and noticing that CM11 just didn't feel quite as slick as CM12, I decided to go into recovery and reflash to that. But first, I needed some sort of strategy to fix my APN setup.
T-Mobile ROM Recovery Shenanigans
One, I wanted to make sure I didn't somehow break my phone, so I restored the backup I smartly made for my default T-Mobile setup. It restored just fine to the state before I first reset it, and it connected just fine with my Ting setup. Phone hardware was fine.
From here, I installed APN Backup and Restore, in the hopes that saving the current setup would fix the later ROM setup. It was able to save my APN setup just fine, but notified me that restoring an APN setup was impossible on Android 4 devices. I wasn't sure what version of Android CM12 was (it's 5), but I figured it was worth a try regardless.
d2tmo Recovery?
At this point, I had realized that I didn't like the recovery that my phone had updated to earlier. It wasn't quite as... slick? Yeah, slick's a good word. The menu was smaller, which was unnecessary, because even before it didn't take up the whole screen. Touch was fonky now as well.
I then noticed, while going to redownload the CM12 package, that there was a Samsung Galaxy S III (T-Mobile) recovery image available right below the CM12 package download on the build download page.
Curious, I promptly loaded up the bootloader on my phone and flashed that recovery. At first, it looked pretty great. Responsive and easy on the eyes. But... the menu was completely different. I couldn't even figure out how to install anything with it.
So, I flashed the original recovery that I had gotten back on the phone.
CM12 is not Good, CM11 it is
I reinstalled CM12 and ran into various really annoying problems. I don't really remember the specifics here, but one of the main problems was that I couldn't connect via adb while the phone was in its normal state. Usually, there's an option to turn on usb debugging in the settings menu, but I couldn't find it anywhere (and this version of CM had search functionality in its settings menu).
And really, the final nail was that APN Backup and Restore didn't work, so CM11 being Android 4 wasn't really a deal breaker, as the app solution didn't fix my phone.
The extra slickness just wasn't worth this nonsense, especially since I realized that I'd probably use adb as my main method of getting things (music, videos, random files, etc) from my computer to my phone in the future.
And so, finally, I got to the place where I had the recovery I wanted, the ROM I wanted, and I had found out that APN Restore wouldn't work and that I probably needed to install new modem firmware.
Some Background
I've had a T-Mobile Samsung Galaxy S III phone for about three years or so. Surprisingly, I'm one of those people who uses their phone as a phone. Well, a phone/text machine. I don't use it as a computer, even though that's what phones are nowadays, and even though I explicitly have a pretty awesome computer-phone.
So, you may be wondering why I did this, Stephan. It seems like a lot of work for a person who uses a phone as, well, a phone, yeah?
About three months ago, I switched from T-Mobile to Ting (if you end up using the link sign up for Ting, I'll get credit to my Ting account). Overall, it's been an excellent decision. My bill went from $60 a month to less than $20 a month. My next bill will be for $12 plus taxes. I may get that number to less than $10 (more on that in a later post, I think).
The problem? My battery suddenly started draining at a seriously unreasonable rate. From lasting 24-48 hours to lasting less than some 6 hours. The reason? Android phones in general come with bloatware from the phone service provider. Bloatware that can not be deleted and will reenable themselves (usually under reboot). Now that I didn't have a T-Mobile account and it couldn't connect to T-Mobile, it was constantly trying and failing to use apps I couldn't properly destroy.
And so, finally, after three months I finally got fed up with that nonsense. I looked into deleting the bloatware and decided that installing completely different firmware was the best course of action. I went with installing CyanogenMod.
What's interesting is now I'm actually interested in using my phone as the computer that it is. Ideas are floating around in my head as to how I can use it to legitmately improve my life. Such ideas may deserve future blog posts.
End of Day Review
09/04/15
Been a while since I did one of these. Once I get back into the habit, it'll be a diary thing, but right now it's enough of a novelty to deserve to be its own blog post.
Eventually I'm going to want to have some sort of template that I fill out like I do at work. But for now I'll just do a simple overview of the day, make some preliminary plans for tomorrow, and that's be that.
Review of the Day
I guess weekdays can be broken down into mornings, work, breaks at work, cooking, and evenings? I'll work it out as I go along.
Morning
More-or-less got up and went to work.
Work
Started off slow, but got into the working groove by the end of the working day, managed to do a weekly review today, which I think is really good for keeping momentum and stuff.
Breaks at Work
Mostly read Mr. Money Mustache
Cooking
Cooked some gluten-free penne and made some cheese sauce. Pretty delicious.
Evening
Watched Kingsmen. Good flick. I had already read Film Crit Hulk's excellent review of the movie, and that certainly affected my perception of the film while watching. But in a good way, I think.
Then I got into setting up my chromebook. I had purged the old crouton setup yesterday, whilst I modded my phone, and needed to reget all the site stuff off the server and set things up how I like them. I mostly managed to backup most of what I cared about. Unfortunately, I missed the .vim and .vimrc stuffs. Some stuff has been lost and needs to be remade. But that's okay, redoing stuff is often really valuable and good for personal growth.
Plan for Tomorrow
I got a contractor guy coming over to go over what I want to fix on the house and give me some quotes and stuff. He's coming around 1000.
I'd like to do a morning routine when I get up, and also 4 pomodoros towards any given thing, as long as it's something. I need to plan the next week, food-wise, and I'll need to cook at the end of the day. Meaning I'll need to go grocery shopping at some point during the day as well.
It might be worthwhile to hook up my bike-trailer and head on over to Costco and get a few bulk items. Though, there might not be a good time for that, considering contractor stuff and such.
Might just make do with what we have and what I can scrap together from the groceries available at the local Target.
Final Thoughts
Wow, this is way more primitive than the setup I got at work. I mean, it's still just html at work, but I've really refined the process. It hadn't occurred to me how much the structure and the small amount of automation I had in place was doing for me. Yet another good reason to be starting this at home.
Lights Going Out Memories
09/03/15
Every time it rained when I was a kid, I hoped the lights would go out. The lights going out meant candles. It meant board games. It meant singing, and flashlights, and hide and seek. It meant that initial shock and scream of total darkness. The senses felt sharper. The drum of rain on the roof so much more present. The hard-to-place scent of humidity.
It was simply magical.
Site Server Slate Scrub?
09/02/15
So, I've had this server for about 1.5 years or so now. This site has existed about a year and four months or so. Along the way, there has been a great mutation on how things are excuted. And I still have a ways to go.
But maybe I should just start over? Chuck all this content into some hidden or archaic part of my site and just rethink the very means by which I tackle every aspect of this now-important part of my day-to-day life?
Maybe I should at least play with a blank slate more often? There's a person out there who built 180 sites in 180 days and, you know, I'm a pretty big fan of personal growth through repetition. Maybe I should make a new site more often.
So, I guess really that leads to a simple question: what sites do I want to make? To iterate on? To replace?
- Memorization tool
- Coding craft improvement tool
-
Games
- Jump click game
- Rollercoaster cat game
- Tend
-
Just get good at prototyping ideas really fast
- Prototyping tool?
- A blog (like, properly designed and stuff)
Let's start making all these fragments of my site their own little sites. That can be my means of transitioning to a completely new site that isn't this one.
Game Dev Club: Meeting Notes
08/31/15
General introductions.
Officer introductions.
We need a secretary. Talk to Helen after meeting.
GDC! What is it? Game developers conference that happens in spring. This time it conincides with spring break! It's all about making games. Testing, programming, art, design, and networking.
Lots of post-mortems. Pipelines. Show off a lot of new tech. Occulus rift last year.
Whether or not you go, there's plenty of talks online for free.
Game Dev Club is going in 2016! Driving. Will get funding for passes from U of A, but individuals will be expected to spend about $450 for travel expenses and stuff. Need to figure out fund-raising.
Weekly tournaments for Smash?
Lots of different passes. Different costs. Lots of variety in what you can go to.
How to pay for GDC? We will help various people pay for the trip.
CA is a volunteer thing you can win to go for free (but you have to work). Write essay on customer service skills. Talk to any of the people who went to GDC last year.
Partnership We're Excited About
Lance Tipton really excited about a partnership. He was looking for game development groups. He created his own group. Last meeting was last Thursday. About 20-30 people showed up. There'll be game jams, talks, and various other things. A studio called Night Owl wants to give a talk. Tucson game dev networking opportunity.
Planning on turning the game group into a non-profit. Want active members to get a lot out of the community.
Any questions?
Middle-school principal wants to talk to Lance afterwards. There'll be classes on unity, C#, C++, etc.
Every last Thursday of the month will have a meeting with this game dev group. All other Thursdays will be workshops for game development to meet and work on whatever.
Make a game now! With note cards and stuff.
Physically Exhausted
08/30/15
It seems I'm not quite acclimated to biking everywhere again. This weekend had me take two long midday naps. Today's "nap" was a good four hours, and my whole body felt sore during the nap.
I guess I didn't realize how weak taking the bus was making me?
Well, we'll see how strong I feel once I'm acclimated.
Overheard on the Bus
08/29/15
I was going to slowly build this as I overheard things on the bus each day, but it seems I started shortly before I stopped. Here's the little I got. I missed a lot of gems the year I took the bus, it's too bad I didn't start sooner.
"I was going to steal some bananas and some blueberries and make you some pancakes."
Later (someone else).
"I have this shirt, this Wildcats shirt, and I got it on the day I met my girlfriend. So that's kinda cool, you know, I have this shirt to comemorate the meeting of my girlfriend."
"Does she live far from here?"
"Yeah, yeah, she lives near Miracle Mile."
"That is pretty far."
"We're supposed to meetup downtown right here. Like, we'll meet where the buses meet, and then she'll come back home with me. But I don't know if she'll wake up this early." Laughs.
Personal Pomodoros Retry
08/28/15
A while ago now, I set up my diary area, and tried my hand at a system I had started using at work, to great success. I still use the system at work, to varying degrees of success, and I think maybe I should try to fit it into my personal system again. I'm not sure if I care to put it in a diary area explicitly this time. As I've noted several times, this blog is basically my diary for now, at least until I actually think of an audience and purpose beyond my own growth, Stephan.
So, I'd like to start doing start-of-day and end-of-day pomodoros, at the very least, with start-of-day thinking and end-of-day thinking. I won't count them as legit blog posts if I just publish them in my blog.... Maybe I should just put them in the diary area.
In any case, there is almost certainly a lot of value in thinking about my day, both at the beginning and at the end, so I should at least start doing that at home, and since I've gained some experience doing it at work, I might as well emulate the way I do it at work.
Let's see how this goes.
Bike Trailer Get
08/27/15
Today I got a bike trailer. The person selling it came to me. He was a super nice guy. Showed me how to set it up and everything. Cost me an even $100, which feels like a decent deal (though my roommate said he got a trailer for $40, so I guess I could've done better).
I believe bike expenses should be done for a while. Which is good, because this month saw me spending some $400 on bike stuff (including buying Rosse a bike). I believe from now on it should be well under $20 a month. Some month's should be as low as $0.
In any case, I look forward to using that trailer to buy bulky and/or large amounts of items. Aka, I look forward to doing a Costco run with it soon. Maybe even tomorrow?
Craigslist Bike Adventures
08/26/15
I have now bought two items off of craigslist, and both times I rode my bike to get the item.
The Pannier
The first adventure involved me biking 6.1 miles in 110F heat to get a pannier bag for my bike. It cost a mere $20 and it's an amazing piece of equipment. It holds more content than my backpack does, properly straps itself into my bike rack. It's also an Iron Duck brand bag, and I can't find its counterpart online. It may not be something that is still for sale. The cheapest bag of theirs I found on their site is $180. So, I think I got quite the deal out of the purchase. There's some well-worn holes in it, but nothing that can't be patched and nothing that makes it less usable by any means.
Even better is, I got to see how well I handle biking some 12.2 miles in the horrible heat. More or less, I felt like I was dying. I had to stop by work again on the way home to get more water and cool down a bit.
Totally worth it, though. I've had it for a little over a week now and have used it everyday. And today, I used it to go and get....
The Stand Mixer
So, last weekend I noticed some stand mixers were on clearance at Target for $180 or so (down from $270 or so). Curious, I checked on craigslist to see how cheap they were there. $80. For what seemed like an equivalent piece of hardware. Awesome. I even managed to strap the thing into my bike and haul it back home, no problem. And it looks like it works just fine.
It's pretty exciting. Not only do I get pretty nice equipment for pretty freaking cheap, but I get some fun stories to go along with them. Like, when I was strapping the stand mixer to my bike, the person I bought it from was all, "You sure you don't need help getting it home?" I got to wave goodbye to them while I started my bike ride home.
The Future
Pretty soon, I'm thinking I'll be getting a bike trailer off the site. It'll help me haul ever bigger items, like Costco bulk items, and other craigslist items. Already I've spent merely $100 on items that could've cost me half a thousand.
I also have plenty of junk lying around my house. I should probably sell some of it. I could net gain money out of this.
Remembering Tenchu
08/25/15
The previous weekend had me playing old games I hadn't played in a long, long time. One such game was Tenchu, an old PS1 game. I may have not played it since New Year's Eve 1999. That's my last memory of playing it. Though, that may have been Tenchu 2. In any case, it's likely I hadn't played it since the last century.
The game has not aged well. At all. Bad voice-acting and a penetrating darkness trying to hide an incredibly short draw-distance. Also, the controls use the d-pad, as this game was before analog controls (even before the Playstation controller had analog sticks). Basically, controlling the character is like controlling a tank.
And yet, it was so unlike anything I play. I want to play it more. It was clunky and awkward, but getting the perfect kill felt properly ninja-esque. Like, a ninja would only be strong against a trained samurai in that specific circumstance.
Maybe I'll play more soon.
Forcing Routine into the Flux
08/24/15
So, my blogging has been a bit spotty lately. That's mostly because the majority of my posts were during bus rides, and those rides are no longer a part of my day-to-day. I am developing a new routine, and right now everything is in flux. When I wake up, when I go to bed, when I eat. The only consistent thing is when I get to work, and that's because I have to make a meeting at 0800 or bad things may happen.
Also, I got to cook dinner after I get home from work because I'm not about to waste money going out to eat anymore. Food spending may be as low as $340 this month, and maybe as low as $300 the next month. The long-term goal would be around $200 a month (about $3.50 per person per day), I think.
But that's besides the point. Things are in flux right now, and really that means now is the time to cultivate the habits I want to stay in my life, and to weed out the ones I want out. I want to keep the house clean, and keep the yards tended. I want to work on productive, even money-making side projects, and I want to have good eating habits. I want to quit reddit, and most other forms of daily consumptions of entertainment.
I can binge on content from time-to-time and be happier for it, and otherwise try to facilitate a diverse set of productive things to do. With high enough diversity, I can hope to not burn out on any one given thing.
So, while I'm letting things fall in place, I'm going to try to note things I don't want to become habit, and try to replace them with things I do. From there, I'll try to mutate things into a sleep-schedule that I find the most rewarding.
The things I want to be a part of my routine are:
- Work (of course)
- Sleep (also of course)
- Exercise (covered mostly in transportation)
- Cooking
- Coding (as part of work, but also as extracurricular)
- Competition (I'm a competitive guy, I should embrace it)
- Cleaning
- Maintenance
- Building (I've always wanted to make real, physical things)
- Writing (mostly covered by this blog)
- Drawing (starting beginning of next year at the latest)
- Music (starting beginning of 2017 at the latest)
I got a lot of stuff I want to fill my time with, I really need to get rid of the old habits that pollute what little time I have.
Hand-Made Scripts Coming Along Slowly
08/22/15
Today I made some final little edits to my hidden receipt_breakdown.js script. It reads all the "TOTAL" items in my receipts.json file and spits out the count from each top-level label. The most-recent spit out being (with various fields omitted for privacy reasons):
BULK: 49.26
COFFEE: 20
FUN: 0
GAS: 0
GROCERY: 200.95
HEALTH: 10
MAINTENANCE: 129.74
PETS: 37.09
TRANSPORTATION: 195.83999999999997
Where I've currently hard-coded the script to ignore all purchases before August 1st. Not too shabby, I believe this month will the be first we've successfully managed to spend less than $11 per day on food on average (bulk plus grocery equals food spending, more or less).
I've more-or-less been copying each receipt I've gotten by hand into this receipts.json file since May 2015. There's some missing money transcations in there (like the stuff that's done purely online), but partial tracking is better than no tracking. Also, I'll slowly fix those things. I'm also trying to get into the habit of noting how much I've bought of a thing when that thing is a consumable. Buying 110 servings of quaker oats at $8.99 is much better than buying 30 servings at $5.99, for example. Capturing that may be useful, though seeing it being bought much less frequently could be equally powerful.
Just the act of keeping my receipts, and making the whole process a bit more manual has been a powerful contributor to better spending habits. I'm really realizing how much money is going where. Further, making my own scripts is so much more satisfying than Mint, even though it's certainly worse by any real metric right now.
I think this thing can really grow into something really special. I just got to improve it little-by-little as I see fit.
Changing Hosts?
08/21/15
So, I was pointed at bluehost by Mr. Money Mustache, and it occurred to me, am I spending to much on hosting?
Short answer: yes.
When I was first looking for hosting, I tried out... some hosting site that didn't give me ssh access. I eventually asked a friend, and he pointed me to Linode, which I currently use. I have liked Linode just fine for about a year and a half now. When I joined Linode, their cheapest offer was $20 a month. Something I found quite cheap at the time, but now I don't agree that I can afford it, as I am not yet financially independent.
It was at this point that I found out that Linode has a cheaper plan at $10 per month. Which I have already switched to. However, I may explore even cheaper options. bluehost and Dream Host appear to have $5 per month plans (but it's like a special deal that may expire or something, I don't know).
$5 per month isn't huge savings, but putting in an hour of work towards it or so would be savings I earned back in under a year, if it doesn't really hurt me at all to go to a worse service at a cheaper price. And most of these places have a money-back guarantee. So, I can try out a few hosting options and just pick what I like. I seriously doubt traffic is something I need to worry about right now.
Let's do some experimentation.
P.S. Changing to a different payment setup is why my site was down for a bit. I forgot to restart it properly after I restarted the server.
Ending the Sleep Experiment
08/19/15
So, I woke up again this morning after six hours of sleep (2130-0330). Things felt okay-ish, but after two hours I tried out laying down. It was glorious. Felt just amazing and I took a two-hour nap.
I think that if I'm still tired and wanting rest two hours after waking up, I definitely didn't get enough sleep. I will go back to 7.5 hours per night. Including weekends.
I'll try to go to sleep around 2030 or 2000 so I can still wake up between 0330 and 0400. I'm hoping to start doing things I find valuable each day of the week, as well as making sure I get my downtime. Gotta keep it all healthy.
Sleeping Experiment Working?!?
08/18/15
So, the last two days, I went to sleep at 2200 and work up before 0400. I'm a bit out of it today, but work turned out unexpectedly productive (started and finished a task in one day, within the allotted time slated for the task).
I woke up without the use of an alarm. It just naturally occurred.
Even more impressive, I spent about 2 hours in the blistering heat yesterday, hauling my bike across Tucson to get a wicked-sweeth bike pannier (more on that in a future blog post). Today I woke up sore and tired with every excuse to go back to sleep, but instead I just decided to stay awake, because I figured a couple more hours wouldn't make me feel better.
Whether or not that's correct thinking is irrelevant. I managed to stay awake the whole day (though I did nod off a bit during some of today's meetings), and though today was by no means a perfect bit of productivity, it really feels like a step in the right direction.
We'll see if it keeps going.
Mold in Da House
08/17/15
Mold! In my house, Stephan. And actually it was kinda signficant, though contained in an area I rarely go into. Though, it was a place where a friend/room mate/tenant sleeps. So, you know, a serious problem. Though, lately it's been really hot, and that room doesn't handle bright, hot summers too well, so he was already sleeping in the main area of the house.
....
Basically, this all happened at a time where no one got hurt or ill and also it turned out to not be that bad and also a little fun.
I got to stab the walls of my house until there were holes you could see through. Yeah! I mean, I need to fix that, but one step at a time.
I took no pictures.... Well, except for the ones I sent to the warrenty people about the secondary water heater.
You see, I have two water heaters. A main, gas one, and a secondary, electric one. The secondary one was setup in an add-on to the house. Basically, most everything I find out about this add-on makes me think it was poorly done for anything non-visible.
Water piping was done over the house instead of around the house making the pipe more susceptible to freeze-bursting (which it did last winter). Also, the waste plumbing isn't properly steep and it has a strong likelihood of backing up.
And then this water heat melts from the inside... which might actually just be the fault of a faulty water heater. Which just happens. Though, what wasn't the water heater's fault was its placement on basic concrete. It says right on the container for it to be placed somewhere where leakage won't do damage. So when it ended up melting from the inside and leaking everywhere, it seaped into the wall and caused mold.
Black mold.
Which is gone now. Because I cut it out and bleached to death what little remained.
And now I want even more to learn proper house stuff. Especially since I have a pair of walls with giant holes in them. It'll be fixed by the first week of September, when at the latest a contractor will come and fix it. I've demanded to help so I can learn something.
It's nice to at least know a little bit about killing mold and doing it safely. Which I guess I should talk about.
Future post, maybe?
I'm Back
08/17/15
So, after my sorta temper tantrum, I kinda went dark a bit. As in quiet, not emotionally, though I did have a rant to give to one or two people that day as well (it was controlled and properly focused and led to good things, I think).
Unlike last time, I wasn't put out of comission via being sick. I was overcome with the strong urge to finally do stuff I should have done a long time ago. And also to catch up on maintenance stuff that I just let build up (cleaning, tickler, planning, etc.).
I'm also riding my bike to work now, and the time I used to spend blogging is spent riding a bike, and I just don't know if I can multitask well enough to blog during biking.
So I got to learn a new routine. Which is good, because the old routine was starting to rot and needed to be replaced anyways.
Like the moldy drywall in my house.
Oh, yeah, that's what started all this. I'll go more in-depth on that in a future post, maybe.
Cold Turkey Everything
08/13/15
It has occurred to me that a lot of the stuff I do "for fun" don't really make me any happier than not doing them. And I'm just tired of wasting my time on such things.
Also, I'm a little angry at myself for just not doing what I should be doing. For flaking on responsibilities until the consequences become serious problems.
So, I think I'm going to try to quit anything that doesn't both improve my capabilities and either make me money or save me money in the long run.
So, no more video games (unless I twitch and/or focus on presentation). No more studying Japanese unless I work towards that making me money in some way. No more reddit. I keep saying that but eventually it's going to stick. No more candy or soda or junk food. No more webcomics unless I'm drawing my own and am trying to network in some way (that isn't being a spammer of some sort).
No more.
I'm tired of it.
Lights Went Out
08/11/15
Today was one of those rare, classy Tucson thunderstorms, and every once in a while that means power outages. I took advantage of such a power outage to get some extra hours at work, where there was still power.
That is all.
Fiction Idea: The Never-Ending Dream
08/10/15
That dream before, it inspired more than further explorations of that mansion and those groups of people. It was my first dream within a dream experience. Back in high-school I had captured as much as I could for a writing assignment. It ended with me waking up. My teacher told me that the ending of just waking up kinda ruined it.
So, why not just have an ongoing story where the dream just never ends?
The dreamer could even interact every once and a while with the other group. For some reason, they call her "the immortal".
Fiction Idea: Learn to Dream
08/09/15
A long time ago. I had a never-ending dream. I like to think that maybe I'm still in it.
I am unsure of how much this dream has evolved in my memories, and how much transpired in the actual dream, but one place for sure I visited in that dream. How much my visit has evolved in my memories is too unknowable, however.
I briefly referenced this place so long ago now. It was a strange, dilapidated mansion. Overgrown with weeds. Vines coiling up the crumbling collumns. My arrival there was sudden, I had escaped a yellow world full of yellow demons by waking into this place. It floated amongst a white void, its edges cracking into the solid white.
"He's back," someone had said. And a group of people were upon me, welcoming me. And suddenly we were around a camp fire, chatting.
"People visit from time to time. Many who have lost their way. They rarely find their way back again. When they do, all memory of the previous visit is gone. They know not why they come, so why should they remember?"
"And why do you come here?"
"Where else can I see my friends?" Everyone laughs. "We don't remember when we wake. Only the dream knows why we're here, but the main connection is that we're here, together."
And then it was me and her. At a table. Eating rather delicious sausage. This, too, I am certain happened. And she was gone, and I was in a maze.
"You know, it can be much more challenging this," another said, walking alongside me. "One of those crazy labrithns where a door here leads to you walking alongside the roof, upside down." I ignored this person. I was here for one thing. I followed the right-hand wall of this ridiculously easy maze to gain my treasure.
And there it was. Stabbing deep into the cobbled floor. Hilt shining despite the lack of light. I always was a lover of swords. Though, really, I know so little about them. I love them fantasy. And so I went and pulled the blade, to gain my own Excalibur or Master Sword or whatever other easy legend to know of.
All it did was explode in a scattering of smoke. And I was back outside the mansion. Sitting along a mostly empty, incredibly dirty pool. Another guest was skateboarding inside of it.
"The last time you came was a special event, you know?" she flew out of the pool and hovered beside me. "A rare event."
"I am pretty awesome."
She laughed. "That you've come again is a special event, I will admit, and that your first time here was when the immortal visited...." She landed and sat next to me, feet dangling in the empty pool. "Do you remember her at all?"
"All I remember is falling asleep and being unable to wake," I said. I did not even remember where I fell asleep. It was a source of much trickery in this infinitely layered dream.
"Last time you did not even realize you were dreaming, so that is progress. Progress is fleeting here, though." She echoed, and I was inside the mansion, sitting on the second floor, my feet dangling over the balcony.
And then it... it collapsed before me and was gone, and I was in another dream.
Of the countless dreams I escaped that night, that place was but a visit with friends I had forgotten. The first dream I realized was a dream where I did not attempt to will myself awake. Only recently have I regularly decided to stay within a dream.
I wish to visit it again. I don't know if I can, however. I can pretend, at least, and document my way. I'd like to draw it. To make a comic of it, to make it a metaphor for learning to draw.
Fiction Idea: The NanoMachine AI
08/08/15
I got various ideas floating around in my head for settings or stories in whatever medium I so choose. I figured I might as well jot them down in a really raw and unpolished form. I was going to do a quick outline or give each a few words, but the first one I went to write down came as a scene.
I was thinking this could work as a text adventure game.
The NanoMachine AI
A woman wakes up. Sees a void of blackness with a single blinking light, illuminating nothing. A square of light. Blinking.
The light moves steadily to the right, leaving behind a series of letters in its place.
"Hello?"
it said.
"Hello!" she said back.
The "Hello?" disappeared before her. The cursor stood there for a while, blinking, before finally moving to the right again. "Response detected. Not understood. Initalizing communications testing." The words disappeared again. The blinking cursor remained.
"Please remain silent and speak only when following the instructions if you are capable." These words remained a while. The cursor blinked below them. A number incremented alongside it, starting at zero.
When it reached one hundred, the words all disappeared again.
"Please say, 'Yes.'"
"Yes?" she said. The words disappeared as soon as she finished speaking.
"Please say, 'No.'"
"No," she said, more confidently.
"Do you understand these attempts at communication?"
"Yes!" she said.
"Do you know where you are?"
"No."
"Does it appear that you are in a pitch-black area with only white words representing my communication?"
"Yes."
"You are currently within a facility owned by NanoIntelligence, a nanomachine scientific corporation specifilizing in nanomachine neural networks and specialized AI.
"I am a nanomachine medical prototype. TODO: at some point there will be a clever acronym here. Something with NURSE, maybe? 'Nano-machine... u-word robotics system environment.... I am a surgical replacement tool with specialization in brain repair and bodily replacement.
"TODO: at some point we'll explain what the patient's background is. This unit is far from real-world use. Fill this in later. There will need to be some sort of input that will give full context. Currently, there is limited understanding capability of the AI with anything not purely diagnostic. Basically, it can describe the health of the patient, but not the cause of any particular anomalies.
"Upon my application, you were missing an arm, an eye, and had received unquantified brain-damage. Your arm as well as your eye have been reconstructed with a fully functional machine replacement. I am currently in the process of repairing your brain. Full repair may be impossible. Currently, I have bodily control. Any control I can give to you will be given when possible.
"Do you understand?"
SunTran is on Strike
08/07/15
... but it's okay, I got a bike.
I wish them the best of luck and I hope they get paid a good wage for the valuable service they provide. I don't particularly plan to use much of their service anymore, but it was a fun year of using them for various reasons.
Now, I will need to make time for reading and blogging and various other things more explicitly. Which I think I should be capable of.
I Got a Bike
08/06/15
Yesterday, I finally got around to grabbing my dirty, flat-tired bike and getting it ride-ready.
The bottom parts of the tires had a nice coat of dried mud on them, and there were spider-webs and various debris all over the bike itself. I took the bike over to my hose and rinsed it off. I then took each tire off and rinsed those off.
I then took the tires off, and rinsed out the insides. I believe an ant colony may have been living in the back-tire.
I also managed to find a thorn embedded in the back-tire, which led to the fateful flat that led me to switch to busing almost a year ago.
I lined the wheels with "never-flat" bike-tire protectors, grabbed a replacement tube, and started reconstructing the wheel. I put the reconstructed wheel on the bike, and went through the same process with the other one.
I then inflated the tires. First the front, then the back. While inflating the back tire, I heard a very loud pop, as if someone had exploded a balloon right at my left eardrum. My left ear throbbed for a good minute. Just thinking about it now makes that ear hurt.
At first I didn't understand what happened. The tire still had air pressure. After careful inspection of the tire, I had found that I did not careful enclose the tube within the tire, and the bit that was outside the tire had exploded violently, but the pressure from within the tire had sealed that giant hole, allowing pressure to remain in the tire.
I had momentarily considered still riding it, for various reasons, but had decided that I could spend a bit of today grabbing a new tube and not risk my back tire suddenly losing air pressure, or worse.
Overall, however, the bike looks like its in decent shape. I can't wait to start riding it. What's great is switching back to a bike will save me about $42 a month. As long as personal bike maintenance is below that, this will be a profitable as well as healthy transportation switch. And I believe maintenance costs will be much lower than that.
I just bought some chain lube, a chain wear measurement device, and some degreaser for less than the cost of a monthly bus pass, and I won't have to buy more of any of those things for a good long while.
Though, I will have to slowly build my bike maintenance tools, so I won't be seeing 100% of that $42 savings per month. Still, though, the stuff I buy will lead to the building of some new skill, however minor, whereas a bus pass just gave me a buffet of bus rides per month. Definitely a worthwhile trade on my part.
Stream of Consciousness
08/05/15
I'm having trouble coming up with stuff to write about for the blog. Lots of stuff floating around in my head, but it feels like a bunch of tweets, not a bunch of blog posts.
The bus people are going on strike tonight at midnight, maybe. It gives me more incentive to fix my bike, which I will do tonight.
This should be the first month of no special expenses in a while. It'll also be the first ever month of less pay than usual due to two days of unpaid leave last pay period.
Even so, I anticipate pretty large savings this month.
Oh, yeah, and next month is a three-paycheck month. That's pretty awesome, though that extra paycheck is going straight to student loans. Time to take paying off the loans seriously. That'll pay off a good 10% of Rosse's loans. Other extra savings will go to my soon-to-be created betterment account.
I should also check out my 401K setup and make it a bit smarter. I'm learning a tiny, tiny amount thanks to Mr. Money Mustache, but I got a ways to go.
Fixing My Bike
08/04/15
This morning, I went into my backyard, grabbed my bike, and carried it into my house. Both tires are flat. The chain is probably rusted, and the back-wheel seems to be out of alignment or the back-brake is messed up in some way.
I haven't riden my bike in about a year.
I think it's time to try it out again. I've much liked my bus-riding in the past year, but I think I can more seriously make time for the productivity I manage on the bus than I can make time for exercise. So, it might be good to make my transportation exercise instead of productive.
I'm not quite sure how I should go about fixing my bike.
On one hand, fixing it myself could prove to be the budding of a useful skill. It could also prove frustrating or daunting enough that I keep putting it off.... Which itself is a thing I need to learn to overcome.
Screw having a free maintenance thing for my bike! Let's fix her up!
The New Schedule
08/03/15
Okay, with new plans and life goals sometimes comes a new time-schedule, sometimes. It's pretty normal for me when I want to change my social habits.
Which is usually why I change my sleeping habits, and thus overall schedule. If I need to see people more, I wake up later to increase overlap between social events and my waking time. When I don't need to see people very much, I prefer to wake up super early and enjoy the morning isolation.
So, lately I've been considering the value of communication with others. I started getting pretty productive when going to meetups and stuff and just engaging with what others were creating with the tools I wanted to be proficient in. I then wanted to carve out more time to do things... and ended up doing less with that time.
So, I've decided to recreate the productive energy of before and start going to meetups and stuff again. As such, I've changed my sleeping and work strategy.
Weekdays
Sleep: 2200 thru 0400 (6 hours per weekday)
Work: 0500-1130, 1330-1500 (8 hours per weekday)
Weekend
Sleep: 2200 thru 0900 (11 hours per weekend day)
Work: None. Or on an as-needed basis.
Thinking
I've already tried putting in extra hours at work for extra vacation and extra pay. I think I burned out. It may have been something else, but I want to cover the various possibilities and so to avoid burnout I'm going to just doing standard hours, with extra work only done when necessary.
I have no planned vacations coming up, so I can just let my PPTO accumulate and hope to only need that for vacation for the future.
Sleep-wise, I've tried a constant sleep schedule, and sometimes it works and sometimes it doesn't. I've heard that the average person needs about 7.5 hours of sleep per day to be properly-rested. Like calorie intake, I believe weekly numbers are probably more important than daily numbers as far as consistency is concerned. So, I'm going to try a slight undershoot of 6 hours of sleep per weekday, and make up for the deficit with 11 hours per weekend day, leading to 52 hours of sleep per week (half an hour short of 7.5*7=52.5).
A long time ago, I experimented with 6 hours of sleep per day and had surprisingly good results. I think it isn't sustainable long-term for me, however, so I'll try to make up for it with sleep-in weekends.
Back when I was losing weight via lots of exercise and calorie-counting, I got a lot out of cheat days. On these days, I ate what I felt like and I more-or-less did nothing. I'm willing to try that same idea but with sleep and general productive hobbies.
Let's see how it works out.
Lazy Sunday
08/03/15
Yesterday, I had the first proper lazy day I've had in a long time, I feel. Lazy just for the sake of it, not because I was sick or otherwise feeling unwell. And now, the following day, I feel pretty amazing. The morning just felt really good, and in the first time since I basically made the thing, I went through my morning routine, and that felt pretty rad for some reason.
Though, that routine is pretty out of date, I'll probably need to update it.
In any case, the apparent value of the day is troubling for me. I can't really tell the difference between a lazy day that'll make me feel worse the next day, and a lazy day that is properly reenergizing....
I guess I'll need to figure that out.
The Ever-Changing Battle
08/01/15
Writing about my new plan to think about how I can't afford it has made me think of the ever-changing landscape surrounding my battle against lazy and unhealthy me. I've come to realize that there's no winning strategy. This is a game that I've got to get better and better at, as lazy me finds new strategies to subvert my well-intentioned systems.
Life is a dynamic thing. I can't just memorize the right thing to do for the various states I encounter, I have to get a good grasp of the underlying mechanics and just get really good at the game.
And I realize that maybe I should formally do that. Actually write out what this game I'm playing is and document the ever-evolving meta-game. I realize that I don't even know where to start, which just further shows how valuable an exercise this idea would be.
I Can't Afford It
07/31/15
So, as I've mentioned several times, I've been reading Mr. Money Mustache, and overall the blog really speaks to me.
One very powerful idea I like quite a bit is his definition of affordability: if you aren't retired, you can't afford it. Any superflous act of life that is net-losing you money is delaying you from having enough money to live on for forever.
I have had decent experience applying this logic to purchasing decisions. I have avoided spending even "trivial" amounts of money using this thinking.
In a post I recently read, Understand the Marginal Utility of Booze and Drugs, he expands this idea of affordance also to other life-goals you might have. Are you as fit as you want to be? Then you can't afford that beer.
Now, this seems really powerful. I could apply this to my rather bad candy and soda habit. I can also apply this to my reddit habit. I have so many things I could be reading instead that would help towards achieving my goals. I could work on other things instead. I could write higher quality blog posts. At my current output of quality stuff, I can't afford reddit.
Let's see how well this thinking convinces lazy me to not peruse reddit and other equally expensive sites.
Getting Back Into the Groove
07/30/15
Okay, so now that vacation is over and I'm over my one-day illness (well, still a little ill, maybe, but feeling pretty good overall), it's time to get back into the groove of fulfilling side work and also valuable work at work.
One thing I finally did this morning was go through my massive inbox. Nothing important was in there, but I'm glad I've mostly sorted through it. Next I need to organize my email. And log my receipts. Organization and proper logging should probably be the main priority.
But I've learned from past experience that trying to focus exclusively on organization is a recipe for doing nothing. So, when I feel like working on my timer or anything else, I'll just go ahead and do that for a bit.
I'll be revising my general weekly schedule. Waking up at 0300 is nice, but I think it's time to start going to the various programming meetups again, which are usually held well past my bedtime. I will be switching to going to sleep at whenever time I get home from the latest of these events (probably 2200), and try to wake up about 7.5 hours later (so 0530 or so).
I find that I'm more likely to work on projects when surrounded by people working on similiar projects. If I want to work on javascript stuff, I should start going to the TucsonJS meetups again. If I want to work on simulating better bus strategies, I may want to go to the Code for Tucson meetups. In fact, I have RSVP'd for the meetup occuring on Tuesday, August 4th. Let's do this.
It's also time to seriously get to work on fixing up my house, and just getting ready to sell it in general. I'm going to want to start building some expertise in basic house stuffs. I'll see what timing I can figure out with my roommate's contractor friend, and also figure out volunteering for Habitat for Humanity. I gots to make sure I make time for this explicitly. Enough to learn outside of my house, and enough to apply my learnings to my house.
Switching to a smaller house ASAP is going to save me a lot of money down the road. Living in a more strategic area will also save me time and open up high-value, low-cost possibilities.
I also shouldn't rush things, but I should make sure progress is being made. I have a lot of work to do, and I can't let that fact numb my actions and lead me to doing nothing.
I'm getting my energy back, and I want that energy to be used towards real value.
Updates to Timer While Sick
07/29/15
So, I'm sick once again. And along with sleeping for some 16 or 17 hours or whatever, I also got tired of my sickly daze of browsing reddit.
So, I have once-again quit reddit and also decided it was time to mess with my productivity timer again. I had wanted to make it possible to arbitrarily assign any youtube video to play when the timer expires.
And now it is possible.
Yay.
Reorganizing
07/28/15
Pretty soon I'll be back to doing normal work hours and I really want to organize my home life. Things have gotten a little out of control and I really need to ruminate and how to get them back in place.
But for right now, I think I'll just coast a bit and let things settle.
QuakeCon 2015: The Ride Home
07/27/15
We woke up at 0400 Dallas-time (0200 Tucson-time) and were on the road before 0415. I dozed a bit for the first 7 hours or so as my roommate drove. I drove the last 7 hours. For food, we had trail mix, cheese, Krispy Kreme, and pizza. To drink, there was water, lemonade, and Bawls energy drinks.
The majority of my drive was spent listening to A Game of Thrones via Audible. Audible's pretty cool but I don't think I'll continue spending $15 a month on it. I wonder if libraries offer audiobooks....
Something to look into, for sure.
In fact, let's do that now.
....
Is OverDrive exactly what I'm looking for? They have stuff for audiobooks and stuff. Hmmmm.... Also, a good library resource....
This is definitely something to dig into deeper.
We got to Tucson about 10 minutes sooner than the GPS thought we would at 1550. I unpacked the car, and promptly slept for 16 hours.
Good times.
QuakeCon 2015: Full Retrospective
07/27/15
I think the main takeaway I have for QuakeCon 2015 is: it was fun, but I could have done it better, and I'm not sure I want to go again next year.
I definitely want to go again, eventually. But going has a time and money expense associated with it that I may want to avoid until early retirement. I'm really starting to buy into that idea. Like, I like to work, but I want to know that I am choosing to work because I like the work, not because I need a paycheck. I believe that can only lead to me doing higher-quality work.
Now, if I do go again next year, I might not do the BYOC. There's a lot of stuff to do there that isn't the BYOC, and I figure I could get the most out of all the non-BYOC stuff by not having a computer to spend any of my time on.
That would also give me an idea of what's worth my time and what isn't for every year after that, and then I can juggle between the BYOC and the events that are happening.
Of particular interest to me are the computer case mod events that show you how to really make your computer yours. There were classes on water-cooling, wiring, and a bunch of other interesting stuff. It's something I would ironically make time for if I didn't actually bring my computer to QuakeCon.
Overall, the cost of me going to QuakeCon will be around $450, I think. I split the rental car costs such that it will only cost me and Rosse $200 of the $500 total, and I spent no hotel fees. The BYOC cost $55, and I paid the painful $18 parking fee only once. I spent more on food than I would have normally, but I think I managed to spend less than $100. That, plus the alcohol, probably rounds up to about $450, I think.
I'll have proper numbers once I go through the receipts.
I suppose that's actually a very cheap vacation. Before I decide to go next year, I should plan some vacations that are even cheaper and compare. Maybe I should try a volunteer vacation or something. Gain a skill in some random thing, whilst paying no more money than the cost of living at home, but also doing something I never do otherwise.
Maybe I could do a Habitat for Humanity vacation as my next vacation.
Hell, maybe I could do a freelance vacation and make money on my vacation. Though, it really needs to be something I don't normally do, otherwise it kinda defeats the purpose of a vacation.
In any case, I need to do some explorations before I make up my mind for the next QuakeCon.
Still, a good experience that I got a lot from.
QuakeCon 2015 Day 3: Exhausted
07/27/15
I slept-in late on this day. Got up around 1200. I had stayed up pretty late the night before for Master Pancake and drunken adventures.
We went to a nearby barbecue place. It was really delicious. I never actually paid attention to the name of the place, though. The burger place I went to last year, which was across the street, seems to have since closed down.
I played some Super Smash Bros. Melee and Binding of Isaac: Rebirth. I went and hung out in the nicely lit lobby with Rosse as we sipped on some coffee.
I talked about future plans with her a bit. Figuring out how we should go about learning to do freelance work (she wants to do it, and I've always wanted to try it out). We talked about getting the house ready to sell, and about saving much more income.
I talked about how next time I might want to try buying a used car and then reselling it afterwards, and see how that goes. Though, I'm not entirely sure I will come next year. It really depends on a lot of variables.
We went to a place called Pluckers and got some wings for lunch. I got their hottest sauce with my wings. It was delicious. They had a wall of flame challenge, but I decided against it, knowing that it would certainly affect my car ride home the next day.
Afterwards, we stopped by a nearby Krispy Kreme and got a delicious dozen.
From there, we met up with my room-mate and took the rental car back for the purposes of packing up that night so we could leave dark and early the next day.
We got back to the Hilton in time to catch the end of a Quake 1v1 tournament between a guy named Rapha and another named Evil. Quake looks very much like the kind of game I could get into. Lots of fun-looking running and gunning.
After that, we went and got the dollies, went to the BYOC area, and packed our things up. The wheels weren't properly screwed onto one of the dollies and that could have been bad, but thankfully nothing broke.
We packed up the rental, and I headed down to my roommate's brother's house to crash for a few hours before we all rode back home to Tucson.
QuakeCon 2015 Day 2: Inebriated
07/25/15
So, like last year, Master Pancake performed as Friday night's entertainment. Also like last year, I got super drunk. This marks my eighth time getting drunk by my count.
In any case, the day started off with a cold shower and a quick trip to the BYOC area. There, I had a breakfast of Krispy Kreme and bagels.
I went wandering and ended up volunteering at the Red Cross to give blood. Which means in about eight weeks or so I'll get my blood type in the mail, and also find out if I was wrong about not having any particular blood diseases (hopefully I'm right).
After that, I made my way back to the BYOC area and played some Dark Souls and Dark Souls II. I'm playing with the idea of doing a pacifist run in the original Dark Souls, wherein I beat the game only killing the bosses I have to kill.
I'll probably start over again and twitch stream it when I get around to it.
Afterwards, my cousin, Rosse, and I went on a trip to get food, only to find the restaurants we were going to closed at 1500, and it was 1530. We ended up getting food truck food (some pretty yummy pizza).
Then, I played some Melee.
Then I made my way to my friend's hotel room with my friend to get some iced vodka. I filled up an empty water bottle halfway and chugged it. Delicious. I then filled it up halfway again to have some to drink slowly as the day progressed.
My friend saw me chug it and told me I made a mistake. He was more or less right. The inebriation came in waves, and I got more and more intoxicated over the next half-hour. I ended up playing more Melee drunk, which is a fun experience, as it turns out.
We lined up for Master Pancake a half-hour before the show at 2030, which was way too late to have a good position in the line. We still ended up getting decent seats, though.
The movie this year was Jurassic Park. The drinking game was whenever Jeff Goldblum made a witty one-liner and whenever you saw rippling water. When these things happened, the rule was to shout, "Hold onto your butts!" and drink. I was basically already out of drink at this point, though, so I just did the shouting.
A fist fight erupted in the row right in front of me during the show. It was pretty crazy. It ended up leading to two half-empty rows in front of us.
After Master Pancake we all headed back to the BYOC. Sam (using fake names) ordered some pizza and elicted my help in getting it. We played Melee, ate pizza, played Counter-Strike and then I went back to the hotel to crash.
End of the second day.
QuakeCon 2015 Day 1: Escapedes
07/24/15
I guess I'll be doing my blog post of eachi QuakeCon day the day after it occurred, actually.
Yesterday was a ton of fun. Woke up, ate breakfast, and drove 30 minutes to the Hilton. On the way Rosse and I got some donuts. Got there around 1100. Went to my place in the BYOC area and started hooking up my computer.
I left Rosse to play Dark Souls II for a bit as I wandered around the hotel area. There's a booth area in QuakeCon that I got to explore. There are lots of cool vendors setup, and lots of places where a person can stop a play some random game that's setup. I got a free pretzel at some point and just explored that area.
After that, I headed back to the BYOC. My cousin was still on his way, and so the area next to me was empty. One of my friends was still waiting in line to get in.
Rosse and I decided to go explore for a bit, and then we decided to walk to the nearest Starbucks to get a coffee. It wasn't too far a walk.
There was a line to try out the new DOOM (4) multiplayer. I was uninterested, but my friends went and waited in line.
I ended up playing some Binding of Isaac: Rebirth.
I switched to playing Counter Strike with one of my friends.
My cousin alerted me that he had arrived, and I went to help him get all his stuff into the BYOC.
He had some troubles setting up. His graphics card fell out a bit during transit to QuakeCon or something. But it worked itself out after a bit of panic.
Around 1900, I decided it was time to do some car juggling, and in the process get some earplugs, dinner, and booze. So, off me and Rosse went. First to Goody Goody Liquore, then to Walgreens, then to an Italian restaurant called Emily's, and finally to our original lodging that morning to pickup my room-mate.
Hmmm... maybe I should start picking fake names for people. Eh, whatever.
Anyways, it turns out that the air conditioner had broken that day, and so not only would my room-mate drop Rosse and I back off at the hotel, but my room-mate's brother would come along as they went and switched houses.
We grabbed all of our belongings out of the house, packed up the car, decided to go to Krispy Creme, and then drove down to the Hilton. I temporarily stored our stuff in a friend's room and went back to the BYOC to play Super Smash Bros. Melee for the rest of the day.
Then, Rosse and I moved our stuff to our cousin's car, and headed over to his hotel room down the street at the Day's Inn.
A fun day. Perhaps today I'll try making note of the key things in order so I can have a more detailed blog post tomorrow.
QuakeCon 2015 Day 0: Expectations
07/22/15
As mentioned, I am in a car heading towards Dallas right now. Probably about two-thirds of the way there.
We should be getting there around 2000, Dallas-time (1800 Tucson-time). We'll be stashing computers in some hotel room until we can go ahead and check-in our computers during the non-crazy-line time.
There's no setting up computers in the BYOC area today. Just putting my computer stuffs in the designated area so I can just walk in the next day and get my QuakeCon-ing on.
Tomorrow: a proper recap of today after perhaps a planning of what I'll do tomorrow.
On Rental Cars
07/22/15
So, I'm in a fairly spacious Kia Cenrento packed to the brim with computers, monitors, luggage, and food and more than half-way towards my Dallas destination.
I've recently noticed a stratch on the rear right door that was certainly there when I rented it, and I'm hoping I don't get blamed for it somehow as I didn't notice it in the dimly lit garage where I got the car.
Ah, well. it's not something I have to deal with now, if I even ever have to deal with it (I probably don't).
Anyways, just the act of renting this car will cost a little more $250. Though, that'll be split some five ways, so not too damaging. Gas will cost about the same, perhaps, but that's the cost of driving a not too fuel-efficient vehicle.
But something has occurred to me while going through this process, while at the same time reading Mr. Money Mustache.
You see, he has a post about the intelligent way to buy a car, and I realized that it seems, if done correctly, I could buy a perfectly nice used car, get some insurance, use it for a month or two for my vehicle-based vacations, then cancel the insurance and sell the car for the same price, more-or-less, that I bought it for. Effectively renting a car for cost of insuring it.
There are almost certainly other hidden costs there, but those probably could be minimized with experience and gaining a better knowledge of cars.
I think I'll delay my next road-trip vacation until I can try this experiment out. Though, I'd like to delay vacations that cost me money as much as possible until I retire.
We'll see how that works out.
Drawing Everyday
07/20/15
Since that first sketch I did, I have done a little sketch everyday so far. It doesn't appear to be too big an extra commitment just yet, so I might as well start doing the drawing everyday thing now. If it's anything like blogging, I'll need the headstart anyways to get a feel for building the habit to consistently draw everyday.
I'm also not taking great pains to draw "properly". Right now I'm drawing in a pen and simply allowing the mistakes I make to exist. And there are quite a few, but really it's just helping me notice what I need to work on, and also what I don't know how to do. Sometimes, also, I think I make a mistake but keep drawing and find it wasn't one, my eyes were just lying to me.
I may make an area just for them soon.
QuakeCon Approaches
07/19/15
This right here is the week of QuakeCon. Come Wednesday, I'll be driving to Dallas, dragging my computer along.
Lots of fun will be had.
Hopefully I'll actually blog during it instead of doing a retrospective like last time.
I Did a Sketch
07/18/15
During a break at work the other day I did a sketch, Stephan.
Not too shabby! Though, perhabs a bit shaggy?
This reminds me of how next year I'm thinking I'll want to do a drawing everyday. Doing this sketch makes me feel it's both a reasonable goal and something I will very much get a lot out of. I had done several other sketches leading up to this one that were not even close to as good, but had their charm and were done with much less time commitment.
Meaning, like my blogposts, I can manage something everyday by allowing short doodles to count. Yeah, that may mean low quality submissions, but the journey is what matters right now, not the results. Any good results are simply happy little accidents that I will cherish for showing up along my journey.
And now I'm inspired to do another sketch!
House Selling Prep Strats
07/17/15
Starting sometime August, I will be making solid steps towards selling my house and moving to a cheaper one. It's not that I can't afford the current one, it's that it's bigger than I need and I believe I stand to gain from down-sizing.
Though, much like how I had no idea how to go about buying a house (and have gained little experience there, quite frankly), I have no idea how to go about selling a house. I also still have no idea how to properly maintain or improve a house. Meaning I don't know how to go about fixing the damage I have done to the house thus-far, or fixing what I found to be wrong with it in the two years and so many months that I've lived in it.
But, that's okay, I got time and I have no qualms about asking for help, and I think I have plenty of potential sources for help:
-
Dayna Thacker
- The realtor who helped me find and buy the property
- Would probably appreciate the positive press of me mentioning her by name (I have no idea who actively reads my blog, though)
- Friendly, knowledgeable, patient
- Emailed me a list of contacts that may be useful
-
Contractor friend of room mate
- Already did free work on my house
- I'm totally willing to pay for him to do work on my house
- I would love to help him do work on my house and/or other houses for the learning experience alone
- Habitat for Humanity volunteering and networking
-
Mr. Money Mustache
- He helps random people all the time
- Why not?
So, I have a lot of options to explore. Most all of them can be explored in parallel and I can eliminate certain considerations as more information becomes available to me.
I stand to gain by doing something, so it's time to do something.
Rethinking How I Write Blog Posts
07/16/15
I have a methodology to publishing posts that really is in sore need of updating. It goes like this.
- Log onto computer
- Open crosh shell
-
shell -
sudo enter-chroot - Input password
-
cd Projects/doing/nodeSite/ -
pushd public/blog/inprogress -
cp templates/post.html <post_title>.html -
vim <post_title>.html - Write title of post in empty title tag
- Write title of post in empty h1 class="title" tag
- Fill in date
- Write post
- Fill in links
- Remove any superfluous '""' strings.
-
pushd -
node scripts/publish.js blog public/blog/inprogress/<post_title>.html -
vim public/basic.rss - Copy last RSS item, edit to discuss new blog post
-
git add . -
git commit -m 'Publishing blog post "<Post Title>"' -
./site_push.bash
And after all of that a new post is pushed to the server that everyone can see.
There's a lot of manual stuff in there that doesn't need to be manual. Some of it is unavoidable, like logging onto my computer. However, copying the template post, entering the title in manually twice and the date in once, and writing a lot of the RSS stuff are all things that could be more automated.
I think of particular interest is fixing the RSS setup. It's something that I can forget to do, and it's just tedious and error-prone in various ways.
How I want to fix it involves fixing some other blog post problems, too. I want to have the RSS blurb be written in the same file I write the blog post. When I finally publish it, I want that blurb to not be apart of the blog post itself.
I now have a small amount of experience with ejs. Not enough to know what ejs is or what it stands for, but enough to serve it and have some parts of it be served dynamically.
Part of me thinks that I may also just want to start over. Move all of this site into some sort of "old" area, have the last blog post point to the new area.
It's definitely something for me to consider.
Though, for now, I'll do bitwise changes until I know I want to start over.
Brain Refuses to Quiet
07/15/15
Since my post about emptying the brain, and my unpublished post that I called "Quieting the Brain", my brain has increased its cacophony of thoughts. And through this I discovered something. Writing a post with a specific purpose actually helps quiet the brain.
Again and again, I find my instincts to be wrong and my brain to be lying to me about what I should do. What I think I want to do will not increase my happiness and what I think I should do will not lead me to doing work.
It's still quite frustrating. But I suppose the answer is clearer: pick a thing to think about and start writing. Any action ideas that come along can be executed.
Let's try it out.
Game Jam Haunted: Postmortem and Continuation Strategy
07/14/15
So, there was a 30-hour game jam last Sunday that I wrote a few posts on.
The "game" will be here eventually. I didn't get very far.
I'm going to keep working on it though, I like the idea. Basically, it's just going for the fun of the Donkey Kong Country cart levels (like this one, for example). Though, I believe this game will have one-button controls when it is done (which I suppose will lend it well to a mobile experience).
To fit with the theme of "haunted", it'll be a haunted roller-coaster ride.
Though, I wouldn't mind expanding it further if I end up getting that far, I think.
Anyways, let's dive into specifics.
Post-Mortem of the Jame Itself
I made several key mistakes, and also just didn't have much energy during the main day of the jam. The first major mistake was looking for a new engine to try out as the game-jam started. I was curious as to what HTML5 game-engines had server-side node.js support built in. Looking explicitly for that led to the Isogenic Game Engine (IGE).
The engine is actually pretty cool looking. Playing around with it the little bit that I did made me think it would have some interesting design philosophies to introduce me to.
The problem was that my reasons for looking into it had literally nothing to do with the kind of game I was making. I did not, in any way, need a game-engine with server-side support, and so node.js support was completely unnecessary.
What I needed was something that would lend itself well to a game with a lot of left/right/up/down velocity with a good feel of momentum and a good feeling jump. That's what I should've looked for if I wanted to try out a new game engine. Some sort of action-based engine with some decent momentum physics.
I couldn't even figure out a quick, easy way to implement jumping. Something that's really trivial in Crafty, and so I switched to Crafty.
Too little, too late.
This is a valuable lesson. The lesson I took away from it until just now was that I should just stick to crafty unless I have a specific reason to look elsewhere. The new lesson, after having written out my mistake, is that I should look for a tool that helps me do what I want to do and not look for a tool that I think might be useful to know in the future but has nothing to do with what I want to do right now.
I think trying out different tools and stuff is totally a valid thing to do, even during short game jams where such exploration has no negative consequences (a game jam that doesn't produce a game is at worst a little demoralizing, but often it provides good context for what not to do in a more serious situation). But, again, searching for something that solves my immediate problems will probably be more productive overall, and let me start with examples and/or tutorials more directly correlated with what I want to accomplish.
Going Forward
I'm going to get as far as I can with crafty, and then I'm going to look for a tool that's good for html5 physics-based games, maybe.
I'm thinking I may end up waiting until QuakeCon before I do any more work, though.
Not really much of a plan going forward....
I'll work on that.
Emptying the Brain
07/13/15
My brain right now is full of stuff and I don't want it there. Here's the junk in the trunk of my mind.
This is horrifying. Awful advice from a horrifying situation. Ugh.
I should update my vimrc setup on my server. I should probably update the git repo I setup for my .vim area on my chromebook and save it here.
I need to move my encrypted file of personal passwords off my Ubuntu desktop and think of a good setup such that it isn't too vulnerable. Perhaps a separate partition of crouton on my chromebook devoted only to storing my passwords. That way, an attacker has to get past the (weak) chromebook defenses, and past the (hopefully stronger) crouton encryption and then, finally, the gpgkey password.
Cyanide and Happiness is hilarious and depressing and I love it.
I need to stretch my wrists. I need to build the habit of stretching.
I'm going to start tracking when I do the following:
- Soda
- Candy
- Reading webcomics
- Reading blog posts
- Reading Facebook (using it for chat/events only)
- Reading reddit
The goal is to more-or-less stop doing all of these things, or specifically only, say, read a webcomic after it's updated so many times or something. I want to change my habits for the better.
The Melancholy of Haruhi Suzumiya is a cool show. And the ending theme dance is also neat.
You know what's also cool? So many things:
- Attack on Titan
- The Devil is a Part-Timer!
- Louie
- Wilfred
- Cyanide and Happiness
- Mega Man
- Mighty No. 9 (the idea, not so much the result)
- This list
- Your Eyes are Stupid
I should make some sort of Rory's Big List of Awesome Things
Ooh, ooh... is that a real link? Maybe? I have no idea.
I need to put up my incomplete gamejam game on this here server.
Grocery shopping almost everyday is going really well.
This link should have the date at the end because I might make posts like this regularly.
High-school reminizing.
Looking up the spelling of reminiscing.
Thinking about fiction ideas in my head.
-
Vigilante story where anyone can die
- Think Game of Thrones meets Batman
- Where results are literally a matter of chance
- Basic income startup revolution
-
man with nanomachine, mosaic, shape-shfiting arm
- Shape-shifting kinda looks like how schools of fish moving looks like
- Learning to Dream metaphor for learnign to draw (webcomic idea)
There's too much, Stephan! The brain just gets noisier....
It's like I've eaten way more than I should've and now have to deal with the conseqences of being super, super full. I think limiting the sources of consumption of ideas for a while will be ideal.
Game Jam Haunted: Hacking Something Together
07/12/15
All right, so I want to mutate the IGE keyboard control physics example into something with:
- Gravity
- Jumping
- Platforms
- Automatic left/right movement
The game will live here.
Deleting the Unnecessary
I do not need any server stuff, as I won't be running a node server for this game. It'll be completely client-sided.
Initing the gamejam_haunted Repo
Okay, so we'll start off as a straight-up copy of this example, and hopefully mutate it beyond recognition.
Let the Mutations Begin!
Gravity
Gravity is easy, I think. Right there in client.js is:
// Add physics and setup physics world
ige.addComponent(IgeBox2dComponent)
.box2d.sleep(true)
.box2d.gravity(0, 0)
.box2d.createWorld()
.box2d.start();
Let's see what changing those inputs to gravity does.
That's strange, it does nothing....
I suppose that might not be the right thing to adfix gravity to.
Ah, it's because the game automatically sets the characters linear velocity to some value, which ignores gravity.
So, I need to fix this:
default:
this._box2dBody.SetLinearVelocity(new IgePoint(0, 0, 0));
this.animation.stop();
break;
I'll just comment out the SetLinearVelocity command for now.
And it works! Sorta. It's stable and does some interesting stuff that hints at how certain things work (note to self: get good gif maker for chromebook).
A good incredibly tiny commit.
Jumping
Now it's time to look for more examples.
I can't find any.
And I'm super tired....
Screw it, switching to Crafty
Game Jam Haunted: Learning By Example
07/12/15
Last post, I got the IGE example blank game "running" (hooray for endless loading screens).
Now, let's start with keyboard control. We may only need a jump button for this game, but this should also give much-needed movement setup information as well.
Okay, so, first keyboard example can be ran here. Doesn't look like it'll be as useful as I originally thought. The physics example looks like it might be a bit more useful.
Let's take a look at this code.
All right, there's a lot of structural stuff I believe I can just copy, more-or-less, for my purposes, and that the majority of functionality is in client.js and the gameClasses folder and maybe the maps/home folder.
I think the best thing to do is mess with values and see what happens. So, let's make a copy of all this stuff for my purposes in my gamejam_haunted area area (link may not work yet), and just add what I want a bit at a time.
Game Jam Haunted: Blank Game
07/12/15
Okay, for the hour from 0930-1030, I want to make a blank game in the Isogenic Game Engine (IGE) Prototype. It might only take a half-hour, but I may have trouble setting up the IGE server.
So, we'll see.
Installing the Server
Rethinking Engine Usage
This library hasn't been updated in about a year and a half.... Looking at this list, and sorting by last release. I find various libraries that look like they're updated more frequently and have more-active communities.
I may be getting too distracted by this. Screw it, let's go with the highest-rated, recently updated library: pixi.js (which actually has commits as recent as two weeks ago).
No, no, no. Let's go with the original planned library. This is about learning to use a tool, it isn't about learning a tool I know I want to learn. I don't know what I want to learn, so who cares what library I pick as long as it's neat and works?
I'll switch if I can't figure it out.
Installing the Server
Well, I just forked their github repo and set it up so I could run their blank game example. It looks like an endless loading screen, which confused me at first, because I wasn't sure if the demo was working.
I don't need to actually run the server unless I want to do multiplayer components or something (not interested in that right now).
The next thing to do, I think, will be looking at the given examples and trying to find examples that will help me make an MVP of an on-rails platformer.
Keyboard control and its derivatives may be of interest.
Game Jam Haunted
07/12/15
So, the UA Game Dev Club is doing a summer game jam, and I'm participating. It started yesterday (Saturday, July 11th) around 1800, and will be going until 2400 tonight.
Once again, my plan is to make an HTML5 game, but unlike the last game jam game, this one will not be using Crafty. I think exploring and expanding my options is pretty important at my current level of web development and game development. So, this time, I think I'll go with the Isogenic Engine.
It looks pretty cool:
- Built-in node support
- Built-in multiplayer support (won't use, but cool)
- Lots of documentation
-
Free-to-use for hobbyist/educational pursuits
- Have-to-buy for profit pursuits
I think that last one is either a good sign or a bad sign. If it's as great as they say, definitely a good sign, but it seems like I can't access the complete library without buying? That may be a bad sign.
In any case, it probably doesn't matter, I won't use most of the features of the engine for it to matter that I'm using the "prototype" version. I also don't have to buy it unless I want to, so it's in their best interest to convince me to want to buy it.
In any case, I think I'll blog my development process throughout the day.
Vim Session
07/11/15
So, I've been vaguely aware of vim sessions for a while, but only recently actually looked into what they are. And, well, they're sessions.
So, right now I could save this post environment I'm writing in by doing a simple:
:mksession ~/.vim/vim_session_blogpost.vim
And that would create a vim sourcefile in my vim settings directory. Next time I start up vim, I can just:
:source ~/.vim/vim_session_blogpost.vim
And my environment will be just as I left it including buffers, tabs, splits, etc.
I think this could end up being quite valuable when I need to switch tasks. Save the session with some sort of meaningful name, but maybe make some notes about what I was doing first, and then switch tasks. This might be a good complement to my current (work-only, but hopefully I'll start doing it for personal projects again) habit of blogging through each modular piece of a task. I could even note where I'm saving sessions in those posts, maybe.
In any case, sessions are an interesting tool to add to my vim toolbelt, and I expect interesting things to come of this addition.
Being Sick Sucks
07/10/15
Back in the public schooling days, getting sick in the middle of the week was actually kind of a treat. I'd get the day off and there were no expectations of work on my end. Now, I still have very basic chores I have to do, and the inability to maintain focus without pain and extreme exhaustion becomes incredibly annoying. And that time lost at work is time I have to make up for, both in the actual doing of proper work and in the clocking of hours.
And I really do not enjoy my hazy brain right now. I'm mostly recovered and it's still significant. It's most-certainly affecting my writing in a bad way.
The only good thing that comes of it is my brain's lack of noise really helps me complete varioius simple, high-level-esque tasks. Still, definitely no real positives to being sick anymore. Well, I got some small amount of gaming in, but I could've done that anyways with better time-management.
Meh.
Site Updates Plan Again
07/09/15
So, now that this here site is actually running on node on my server, I should think about the addtions I've been wanting to make.
I guess the first steps would be making the site restart properly:
- Restart node program when code changes
- Start up node code when server starts up
I suppose I could use cron to startup the program on reboot. I haven't really done much cron stuff, Stephan.
After I get that stuff running, I should work towards some of the various site nicities:
- Next post, prev post links on each individual post
- Comments functionality
I also kinda just abandoned that whole CSS reset thing. I guess the problem is that I don't really know what I want my site to look like. I guess I could look at other sites for inspiration there.
Site on Node
07/08/15
So, having implemented Japanese Tool made me realize I really didn't need to do much to actually have my main site, which what holds these blog posts and stuff, actually running on node instead of just nginx.
I am the worst kind of sick right now. Any kind of effort drains me completely very quickly. And I've slept so much, but want to sleep more but can't. I can at least have ksionda.me run on node stuff. I need to update it further, make it so the node code restarts properly when the server restarts or when applicable code changes.
Unfortunately, I just don't have the energy right now to do more than the minimum I've done just now.
Ramble: the Importance and Impossibility of Truth
07/07/15
I'm going to start off with a ramble, see if there's a point, and then title this afterwards.
Truth is hard.
Like, knowing it is hard, maintaining it is hard, illustrating it is hard.
There are people with vested interests against the truth. They obfuscate. And then there are people who are just wrong, but think they're right. They obfuscate.
And sometimes, the truth is just gone. Or simply impossible to know for certain, which is just as good as it being gone.
And sometimes finding it is just expensive, time and resource-wise. Maybe even destructive.
Thinking about it makes me think of an example. I have this magic coin. If I flip heads, you must duck or you will die. If I flip tails, you must jump or you will die. I flip the coin. I see the result. I am incapable of telling you the result, and have already started a new flip. There is no way for you to know the result, but knowning it is still of vital importance.
I feel like that's the world we live in. Every decision requires the trust of others knowledge and allegiance to the truth, and the decisions add up to being super important, but really how would I know if I am no better serviced by making the decisions baded off the flip of the coin?
Whatever. I'm tired, I'm sick, and I have a headache. Ramble over.
Exercise Alarms
07/06/15
Again and again, I have the realization that I need tempoarary
infrastructure in place to build the habits I want. So, I employ a
site-blocker
site-delayer,
to remind me of the sites I want to visit less as I visit them, and
at work I have a five-minute countdown timer going continuously to
remind me to stay on track and to note anything worth noting.
I have mentioned the importance of running before. And for things like running, that's just something I need to fit into my schedule explicitly. I won't "forget" to run. But I may forget to do pushups or leg-lifts or stretch or what-have-you. Those may also be equally important.These are separate exercises I can spread throughout the day. A regular reminder to do at least one these things could properly build that habit.
It may also prove to be just the thing I need to return my focus to worthwhile endeavors if I wander off the desired path.
KanjiVG Explorations
07/05/15
So, my Japanese Study Tool is taking a more coherent shape. It's pretty exciting, Stephan. And now I really want to expand on the whole system.
Well, I want to expand upon the kanji setup of the tool a lot, overall. I want the vocabulary and the kanji learning themselves to be properly separated. So, I need to learn the words, and learn the spelling, and learn the kanji.
The step to learning the kanji is having a good system for the learning the proper stroke order. As I have mentioned before, jisho.org has good resources on this.
Specifically, there's KanjiVG, an SVG setup describing the shape, direction, and radical (sub-kanji) composition of each kanji. I think this, mixed with the graphical library D3, which has svg-related tools that should make generation of stroke-order diagrams quite possible.
I think this will be the next thing I play with for this tool. I'm finding myself consistently wanting to see the stroke-order for kanji I have not mastered.
Spark Without Fire
07/04/15
Spark, no fire.
Darkness.
Spark, no fire.
Again.
Try again.
Spark.
A flash in the dark. A bit of intense heat quickly that quickly fades.
And then it is cold again.
Cold and dark.
No fire.
Again.
Try again.
It'll burn this time. A brilliant fire that will warm the world.
Spark.
Formalizing the Figure of my Funk
07/03/15
Right before my vacation last week, my ability to be productive fell apart. Up until about two hours ago, I was still in a funk, lacking all motivation and self-control. One hour ago I feel like I realized why.
I do not have well-defined tasks that I can simply churn through. I have to think about what I'm doing and why. This epiphany led me back to David Allen's Natural Planning Method from Getting Things Done.
- Purpose and principals
- Outcome vision
- Brainstorming
- Organization
- Identifying next actions
I realize now, I think, that on the onset of the creation of using this blog as my main medium for productivity, that I laid a lot of groundwork such that I just had a long list of identifying next actions that I could then do. As that well dried up, however, I needed to refresh it by doing the work needed further up the list.
Having not done that, and not having a system to identy the need to do that nor how to do it, I ran out of the work I had developed a system to do. Leading to this... apathy and lack of wanting to do anything, really.
Though, it's possible that I just go through stages of apathy, and I'll just have to learn how to deal with them. I think this is a good way to deal with it, though, feels like I'm doing something, at least.
I'll go down the "it's just apathy" path if this train of thought doesn't work.
The Importance of a Defined Plan
07/02/15
I lie to myself a lot. I mean, not on purpose, or not consciously. But my brain takes a lot of shortcuts in thought that are simply invisibile until I attempt a proper communication of those thoughts. Once I try to detail my thoughts, in words or pictures or gestures, I find that those thoughts aren't nearly as complete or indeed coherent as they seemed in my brain.
And so, I realize every time a new thought occurs to me for a project or for an idea, I have to at the very least write it down until it is as detailed as I feel it is in my brain before I do anything else with the idea.
Case in point: my Japanese Study Tool (actually running here, though signup is temporarily disabled). Now that I have a thing that sort of works, I started having ideas and where to go from there:
- Importing flashcards from other users
-
kanji stroke order illustration
- Maybe with animation
- Converting the view .ejs files to ReactJS files
And there's other stuff in my head I'm having trouble calling forth. In any case, I got carried away thinking about that first item that I put off actually putting the japanese tool on my server. It's there now, and the one person who wasn't me that wanted to play with it has an account.
I'm sure that anyone else who wants an account for any reason can contact me somehow and I'll set them up with one right away.
And once again I have uncovered the value of actually implementing something incomplete instead of working towards addressing all the edge cases and "wanted" features right away. In this case, it was simply running the tool's repository at ksionda.me/japanese. Having it run in a place that is not the root of the actual domain has led to the obvious problem that the '/' link leads to ksionda.me instead of the home page of the japanese app. I think this problem is actually quite solvable, programmatically. The ejs files (and later, ReactJS files) are quite capable of more dynamically generating "root" links and redirects where the root is either "/" or "/whatever/".
In any case, working towards feedback instead of trying to think ahead is a habit I'm still having trouble forming. I'll get there, though. And I think just saying my thoughts and plans out loud will help reveal the better iterative path more easily.
Rules for Automating
07/01/15
So, I'm slowly working on three tools to improve my self-improvement capabilities:
All of these tools started as mostly a manual setup, and I am now attempting to automate more and more aspects of all of them. But I need to be careful about this. In the past, I had avoided doing real work by trying to automate that work (and failing to do so). This time, I need to simply make the automation piecemeal by making bits and pieces that actually work and actually decrease my manual workload.
But this means I can use doing things by hand as an excuse to not do the hard-thinking necessary to actually automate things. So, I think I should make a ratio-rule when it comes to tasks I find valuable-to-do, tedious, and I believe they are automatable. Some limit must be placed on my natural inclination such that when that limit is reached, I do some minimal amount of the other thing.
So, for example, I log my receipts by-hand. I think this in-of-itself is actually valuable, as it forces me to pay closer attention to my spending, but I also believe that using OCR to better log my receipts could be quite powerful. I could more easily capture the long ID numbers that accompany the things I buy, and thus store more consistent and valuable information like amount of material bought and stuff like that.
Though, saying that aloud, it may be just as valuable to simnply store a database of these numbers and their related item, and make an interface that makes inputting receipts from all the stores I regularly shop at easier.
Hmmmm....
In any case, it's good to at least devote some time thinking about how to make my manual, tedious tasks more efficient, more fun, or more valuable, and also good to make sure I'm actually getting things done instead of working on code that doesn't work and maybe never will.
Tracking Diet Strats
06/30/15
Quite a while ago, when I was 40 pounds heavier, I started counting calories to speed along my weight loss progress. This worked wonders. I now had a number to minimize, and for a while I managed to eat very little whilst doing a significant amount of exercise.
I'm thinking it's time to start counting calories again, but now I'm going to want to do much more than just counting calories. I might as well track as much as I can, creating a database that converts a measurement of consumption into all the stats about spending therein.
I mean, weight can be converted into calories, into sugars, into proteins and vitamins. I could turn a game into minimizing a number into min/maxing various numbers.
I do not want to fall into the trap of waiting until I have the tool before I start tracking my diet again. A pen and a notebook were good enough before, they're good enough to start. I can digitize my notes somewhere and convert them to all the statistics I want later, if so desired.
Just like with my Japanese Study Tool and with my bucket budgetting I will start with a system that is implemented by hand and slowly automate it more and more to my liking.
Experimenting with Image Recognition
06/30/15
So, as I've mentioned, I was on vacation the past week. About the only thing I didn't take a break from was collecting my receipts. I did, however, neglect to put them into my JSON file, and now I have quite the pile to log by hand.
I believe now is the time for Enlightened Laziness. Though, I'll have to also do it by hand while I implement such laziness.
In any case, I'd like to see how easily I could go about translating one of my receipts into parseable text. Ideally, I could do this with my phone, and send that text elsewhere when my phone is connected to the Internet.
I'm going to want to figure out the best way to capture a receipt with my phone. It may be possible to make a multipage pdf with some sort of video-to-image thing, or using that panorama algorithm. That should be something that is already available, I hope.
Anyways, what I'll try for now is to do 10 minutes of image recognition research for every ten minutes of inputting the receipt by hand. Let's see how fast I can automate my tedious work.
Building Programming Toolkit
06/29/15
So, it occurs to me that once I get my Japanese Study Tool where I like it, I should probably work to generalize how I set up the flashcard system so I can more-or-less make cards about anything. I'll work towards such generality.
Specifically, I want to set up flashcards to build and maintain a good foundation in various programming languages, as this article recommends. But having flashcards about basically anything may be quite valuable. All I have to do is make sure I regularly use the system and I may well be able to eventually memorize the vast majority of things I want memorized.
I already starting doing these when I had physical flashcards, and I have quite a few HTML, CSS, and JavaScript related flashcards still sitting in that unused system.
Memorizing the means to doing various things in various programming languages and how to use the various libraries will most-certainly be a significant means of growing my craft.
Back and Reenergized
06/28/15
So, I went on vacation a little over a week ago, and much to my surprise, I took a vacation even from this here blog. I'm not sure how comfortable I am with that, but at the same time, a significant reduction in laptop and/or computer time is probably quite valuable, even if it conflicts with daily habits and/or goals.
So, as a sort of compromise, I will work to catch up on the seven blog posts I missed throughout the next month, and just not beat myself up on having a well-earned vacation. I will aim to prove it was worth the "lost" productivity.
Family Reunion 2015
06/23/15
I'm having a fun vacation with my family. There was a huge family reunion two days ago and now I'm spending quality time with my brother and his family and my aunt, uncle, and cousin.
Lots of games, cooking, and food, Stephan. It's amazing and delcious and I'm letting too many days slip past without a blog post.
I hope I can get some productivity in still.
Birthday Plane Ride
06/20/15
Vacation has begun, Stephan! And it's my birthday! Renting a car is no longer ridiculously expensive. Which is good, because I don't own a car any longer and find that even more reasonable now that I can rent a vehicle based on my needs when those needs call for a vehicle.
I mention all that, because I am on a plane right now heading towards Chicago, and once I land I will rent a car to get around and travel to my aunt's house and hang out with family in anticipation of tomorrow's family reunion. And, also, I suppose, Father's Day (which I have no real plans to celebrate).
It's a pretty awesome beginning to a week-long vacation, if I say so myself. I also quite hope to get around to doing a lot of stuff to this site and to the tools I consider worthwhile right now during this week, but I know I have a tendency to not work on such things on vacation.
Whatever happens, I'll try to make sure I enjoy my vacation.
Japaense Study Tool: Users Are Go!
06/19/15
So, I forgot to write a post yesterday. As Rosse says, I'm already in vacation-mode (vacation starts tomorrow). It's all right, I'll write some catch-up posts throughout the week. That was a really long streak though. Maybe I should count it?
Eh. That's not the point of this post.
This post is about how my Japanese Study Tool is now in a state that allows users. Awesome. I still have some basic sanity checks to implement before I could "safely" allow just any random person create a login, so I'll just make it so I create one for myself and one for Rosse on the server setup. I'm also going to want to hack together a quick thing that lets me run on my chromebook locally (when I don't have Internet), but syncs up with the main server when I do have online capabilities.
In any case, making users work required a Frankensteinien merge of two Scotch.io tutorials:
I had forked both of these tutorial's code, and after getting familiar I copied and altered the relevant code to my new repository: japaneseStudyTool.
There's still a long ways to go before an "open-beta", or even a closed one, for that matter. But it's a tool I'm going to use and I have lots of ideas and motivation for improvement.
Liking Work Flexibility
06/17/15
So, I've missed work today (sick), and two things are in play for that to not hurt too badly. One, I'm in transtion between projects and so don't have to worry too much about deadlines and stuff, and two, the working schedule I've been attempting has built up extra hours (aka, comp time).
Ever since I first heard about comp time I wanted to take advantage of it, but until very recently I never felt I did enough work to justify working extra hours to get extra vacation (or extra pay at the end of the year). Now, finally, I feel I'm regularly accomplishing it. Yesterday was the first unambiguously bad work-day in over a month, I feel. Until yesterday, productivity had been getting consistently better for like three months.
Today I am sick and I feel like yesterday makes more sense? I don't know, we'll see how tomorrow works (eh? eh? it's funny because I'm talking about work [I'm tired and sick, be nice]), Stephan.
In any case, my current schedule is me planning to work about 12 hours extra per week. However, I let life shenanigans interrupt work without guilt now. If I get into work a bit later than planned or have errands I need to run during work or feel sick or unproductive and feel like leaving early, I let those lost clocked-hours go. I leave at the same time everyday regardless of life's unexpected moments.
My hope this will maximize my work productivity, and result in extra hours I can use towards vacation and/or pay. So far, I think it'll work just fine. Though, we'll have to see how consistent I can be once I get back from my vacation after next week.
Fiction: Time Travel Device
06/16/15
"I have an unfortunate reality to bestow upon you, good sir or madam. All of your mistakes, the big and insignificant, the regret and the forgotten, all of them so far cannot be undone. They are hard reality, set in stone.
"But, I have with me a machine unlike any other. With it and a bit of practice, you may overcome any future mistake with but a few simple, seemingly misspelled words. Now, I must be honest with you, with this magnificient device comes new complexities and the chance of mistakes in an area your brain may not yet comprehend.
"Where now there is a linear line of time, there will live a tree, rooted at your first instruction to this machine. This tree can be made a line again through further instruction to this machine. But such bending of reality could lead to certain... stretches and rips in the fabric of reality. I spaek of ambiguous history. Of paradoxes.
"This, too, can be mended with careful instruction to this machine. Fear not, as well as fixing all mistakes you could make without it, it can fix mistakes you make with it.
"I tell you this because I am aware you about to embark upon a journey. The details of which I know naught. But I do know that without this machine you will be but a puppet with little control over your own destiny. That you will be given challenges that are simply impossible. With it, though, you will truly understand the choices you make, and for the first time ever, perhaps, you will be capable of choosing multiple, contradictory choices and force them into reality.
"And so, I implore you, write the words I have written before you and take control."
You read the words the woman has scribbled down.
git init
You feel as though you have been given the first incomprehensible glimpse into infinity.
Full Japanese Study Tool Fantasy
06/15/15
Currently, I have a tool that let's me save Japanese flash cards, and these cards are shown to me based off of a spaced-reptition schedule where every time I get a card right, the amount of time until I next see it is doubled.
I think this alone will be incredibly valuable, but I want something that's absolutely spectacular, and to more people than just me.
Functional Additions
To make this valuable to someone other than me, I need to make it useable for someone other than me. This, as I have mentioned is my next goal. There needs to be users and flashcard sets unique to users.
Next, I'd like input that only requires the kanji, hiragana, or english as input, and then the others are extrapolated from there. This would probably require use of one or more of Jisho.org's open-source links.
The kanji part of each flashcard should present stroke order. Ideally, that stroke order should be animated. Further, the user should be able to draw the kanji herself and there should be a comparison animation shown to the user (what the official stroke order is vs. what the user did). The animated strokes should be synced. There should be color-coding for anything the program notices looks wrong.
There should be a collection of Japanese content that the user can select as wanting to consume and/or translate eventually. The program will slowly recommend all words and/or phrases found in the selected content as additional flashcards, and when the user shows good memorization in some percentage of those words, the program will recommend the content to her.
Aesthetically Pleasing Elements
A stats area and a general information area would be cool. Something that listed things like:
- Number of kanji learned
- Number of words learned
- Number of sentences translated/constructed
- Estimation of when high-school reading level will be reached (~2000 kanji, and other stuff I don't actually have data for)
Also just some stylistic stuff that I can't even put into words because I just don't know.
I think that's all I got in my brain for now, let's work on users!
Kanji Flashcard Progress
06/14/15
I have a working setup! Working well enough that I translated all my physical flashcards to this system.
Currently, I only have it running on my local chromebook setup.
Now, ideally I'll want this running on my server proper, with an offline capability for studying without Internet. And also a whole bunch of other features I'll get around to thinking about proper.
Next step will be setting up users with separate flashcard setups and proper authentication so users only have control over their flashcards. Which will be necessary, because Rosse has already expressed interest in using my setup even in its raw state.
Good thing Scotch.io has at least two good tutorials (here and here with Github code (my forks here and here).
I'm really enjoying just stealing the code and trying to hack it towards a prototype for my purposes as fast as possible. I get a lot more out of it then actually following the article and working at understanding it.
Last Week of Being Twenty-Four
06/13/15
It occurs to me, as I sit here on the bus thinking about what I want to write that could be written during a bus ride, that today marks the last week of me being twenty-four. One week from today, I will be twenty-five.
Which makes me think that year 24 was a good year. Started getting into javascript. Worked on this site, worked on my abilities and capability to be productive. Started making goals, making deadlines, and started getting better at approximately making them (still not anywhere close to consistent).
There's still things I do that I don't like, but I'm getting better, and I'm making progress.
And I'm really excited for year 25.
WAG Challenge
06/12/15
So, there's a Write a Game Challenge going on right now, and I think it may be worthwhile to go ahead and try my "ghost in the machine" interactive blog idea. Basically, it'll be a series of posts that change content around based on user input.
This weekend I'd like to make an MVP to properly communicate the main mechanic idea. It'll just be one or two pages, where a link or two is presented on the main page, and then when the link is followed, something happens in an unexpected way to show that the relationship is more than writer and reader.
I've been having trouble capturing my thoughts on this idea, and writing this much down makes me realize why: I don't really know how to communicate my ideas or what my ideas would really look like in reality. Working towards a simple prototype could really help here.
Making Japanese Study Tool
06/11/15
Today, I have finally made concrete steps towards making a Japanese study-tool. All I have done is forked Scotch.io's RESTful API tutorial GitHub repository and modified it to save kanji instead of bears (my fork is here).
This doesn't really give me a means to review content in any meaningful way, but thanks to the POSTMAN Chrome extension that the tutorial offers, I have a means of building a database of words and kanji that have been giving me trouble with very little craftsmanship on my end.
I made a good list of words during my half-hour study-session today using this API and this simple extension. It's not too useful in its current form, but it's better than what I had before, and it's easily something I can iterate and mutate into something better one small-but-significant step at a time.
It's also led to an amazing realization, Stephan. The site where I look up a lot of content, and whose capabilities I was going to leech off of (if I got their permission, mind-you), links to all the tools they use to build their search-results. They have kanji stroke-order, example sentences... most of the stuff I would want to build my Japanese-learning tool. All open-source projects.
Those jisho guys are classy folks, and I'm super excited.
First step, though, just have some flashcards that switch between kanji and hiragana. We can evolve it further from there.
Receipts Thinking
06/10/15
I've been manually digitizing my receipts in a json file since I started my whole bucket budgetting thing. In a separate json file, I update my bucket spending independently of the receipts file.
Ideally, I would scan my receipts and the itemized spending would be read automagically, and the receipts database updated for me. From there, the spending would be sorted into the buckets, with me being notified of any unrecognized spending. So, there'd be a third database of what items show up as on receipts.
Further, I'd want to sanity check logged receipts against credit card and bank statements, to make sure things have logged correctly and that I have accounted for all spending.
So, what I want is:
- Image recognition for receipt reading
- Saved receipts in JSON form
- Calculated bucket spending from receipts and bucket-filling timers
-
Sanity-checking
- Receipt items add up to subtotal
- All logged spending matches union of all bank and credit-card statements
- Good visualizations of spending via bucket budgeting
I have a long ways to go, but I just got to implement some things at a time.
Rainy Days
06/09/15
Rainy days are pretty awesome, Stephan. Mainly because I love to use them as excuses to take the day off. Today, I just used the rain as an excuse to delay my travel to work. That time was spent trying out this vegan gluten-free pancake recipe.
Except I replaced the soy-milk with milk and the 2 bananas with a cup of buttermilk. So, it's a gluten-free, egg-free recipe. It was really good! Way, way too much food for one person, but I'll just half the recipe next time.
I really like the way I setup my work schedule. Planning extra hours everyday means little distractions like this doesn't actually hurt me. I'll still be getting extra hours today, even. The "loss" of planned comp-time does hurt a little, but it shouldn't affect anything as far as I can see.
I think I'm finally forming habits that enrich my life, and the poor habits are finally being properly ignored. What's more, I've been doing this for like a month, so hopefully that means I'll keep this up.
Cool Dream
06/08/15
I had a cool dream today, on June 7th, 2015. It featured me watching a movie I think I made up entirely in my head.
There were four characters, two male and two female. Props to my brian for making it possible that the movie passes the Bechdel Test.
It's set slightly in the past I think, and this group of four are all syblings, maybe? Something said later in the dream makes me think so. So, also cool, no romantic hookups for no reason.
So, these four people are on a ship looking for some secret their father had found and lost decades ago. They end up crashing on some incredibly shallow water encircling a mysterious island not too far away. There's a humerous moment where two of the characters are riding a cow in this shallow water trying desperately to do... something, and the cow shakes them off and ends up running off into the edge of the shallow water and disappears into the deep water.
I guess that ends kinda dark.
Well, anyways, they end up making it onto the land of this weird island. It's kinda squareish, but it's split into five parts (separated by deep, deep water). Four corner islands and a circular middle island.
What ends up transpiring is a montage of finding treasure (with chests and camera-angles right out of 3D Zelda) to a musical number. Also, it's revealed that the characters have gliders, somehow and for some reason.
Eventually, they glide to the middle island and one of the female characters accidentally dives into a narrow hole. In that hole there ends up being a secret (magical?) spring containing all of the artifacts of all the people who previously found that very srping (not necessarily the island). They all are revealed as being great figures in the history of their world.
Then the characters start talking about if only their father had found this place, his artifacts would be here or something.
Then I woke up.
It's somewhat interesting while looking back on it, but dream-me actually had lots of criticisms while "watching" this movie (like the musical number and the sudden introduction of gliders).
Seems I'm a critic of my own work even in my dreams, Stephan.
Personal System Upgrade Needed
06/07/15
My work system is just better enough than my home system to annoy me. I really need to do some catch-up with my home system.
Things I have at work that I don't have at home:
-
A script that initializes posts
-
Special setup for certain diary posts
- End of Day Reviews
- Weekly Reviews
- Morning Routine
- End of Day Routine
-
Special setup for certain diary posts
- Vim integration with the script that initializes posts
- Vim integration with the script that publishes posts
These few things have been incredibly valuable at work, and may have helped facilitate why I feel so much more productive at work now. I believe it is time to update my home system to reflect this.
It should actually be easier to update my home system than my work system, because I had to build some stuff in python at work, but I have access to plenty of good node libraries at home.
Let's just do it, Stephan.
Freelancing?
06/06/15
I regularly get these emails from a site called Truelancer, a freelancing site, saying to "Start Freelancing and Increase Your Earnings". Now, this is spam, I think, though I suppose it's possible that I signed up for mail from such a place. Just as likely they're spamming me through my GitHub account.
But in any case, freelancing, like home improvement, is something I want to try out at least, but just don't really know how to do. I have been given advice to look for local projects (yes, even when programming) on Craigslist.
In any case, I might give Neha a chance after doing some research on whether or not their site is worth my time. I really don't want to give business to spammers, but again it's possible I signed up a while back when I first thought about exploring freelance work, so I shouldn't punish them for something I may have asked for.
The idea of freelancing seems pretty good to me. Find interesting work I am capable of doing and get paid to do it. The reality probably isn't so simple or ideal, but that's why I should actually try it out.
How Do I Learn House Stuff?
06/05/15
I've owned a house (though the bank owns most of it, I guess) for a little over 2 years now, and I've done very little to maintain or improve it. It's not that I don't want to, it's that I don't know how, and the initial steps for anything always takes me forever to even attempt, let alone internalize.
But I figure it's time to give back to the house that's actually given me quite a lot, even if it was at a cost I'm not sure I'm comfortable with.
So, where do I start?
Ooh, this article on how to learn house stuff by volunteering for Habitat for Humanity just screams right to me. I get to learn a skill and improve the lives of others by providing a valuable service. That's exactly the kind of system I want to work towards building myself.
So, yeah, I should carve time out of my schedule to volunteer for exactly this. I'll go to my local organization, learn the fundamentals, and then really learn how to do a wide variety of house stuff. The skills and discipline learned there can then be applied to the house(s?) I own.
Deadline to start doing this: August.
Buying in Bulk
06/04/15
Up until recently, I bought various things in bulk. I'm not so sure I should be doing that at my current level of saving-capability. Yeah, buying in bulk can definitely save in the long-run, when done correctly, but when it comes to food it just as often leads to me eating more of the expensive food items per day, destroying any savings buying in bulk could have netted me.
The key is to treat the stuff I have plenty of like a rare resource, so I don't waste it faster just because I have lots of it. With some items, like paper towels and toilet paper, I've gotten good enough at this to justify buying it in bulk. With most any other item, however, I have not.
And so, for right now, I'm not buying in bulk. I am building infrastructure to more carefully track my consumption habits. When I get sufficient data, I will consider what to buy in bulk, and will ensure my consumption of anything bought in bulk is as slow as before, so that I actually save money.
Now, if you excuse me, I'm going to go work on that infrastructure (aka, improve my bucket system).
Recipes, Recipes
06/03/15
For the past three weeks or so, I've been cooking everyday I didn't have leftovers. This combined with my $11-a-day grocery shopping has led to me exploring a lot more recipes. Several people in my life are gluten-free, as well, so I explore a lot of gluten-free recipes. Most any pre-made gluten-free product is either expensive or a poor imitation of some gluten product. Usually, it's both. So baking from scratch has become a regular thing for me.
Thanks to the Internet, this is actually really easy, and leads to a lot of quite delicious gluten-free, egg-free, and various other free recipes to try out. I have become quite curious with allergen-free or vegan-style recipes, both for the challenge and also for the surprising tastiness.
Because cooking so regularly and relatively cheaply has become a thing, I both cook the same thing a lot and try new things a lot. One of the things I have been experimenting with is gluten-free pizza.
It was tasty, it was unique (parmasen cheese as a main ingredient in the crust!), and it wasn't particularly expensive. I thought for sure it'd be a new regular recipe.
But, Rosse found another recipe to try:
- 1 cup white rice flour
- 1 cup brown rice flour
- 1 cup tapioca flour
- 3 tablespoons sugar
- 1 teaspoon salt
- 1/2 teaspoon baking powder
- 1 tablespoon yeast
- 1 and 1/4 cups water
- 1 tablespoon oil
This crust is so good. Quite possibly the best pizza I've ever had. I've cooked it only twice but I've memorized the recipe. I've since lost the other recipe.
Cooking everyday has been a huge boon. The variety and quality of my diet has increased dramatically, and the cost of it has decrased by more than a hundred dollars a month (probably considerably more). There is this trap I fell into with cooking before, where I told myself the time-cost made it more expensive than it seemed.
This is false.
It's false for a lot of reasons, but one of them is that even the fastest food has considerable time-cost. Especially if you need to leave the house to get to it, and even if it's delivered (at extra cost), there's waiting time that isn't often used towards any real value. Might as well cook whilst watching some fun, non-attention-heavy show.
I think my cooking setup is sustainable, and I'm really excited for the future meals to come out of it.
Christian Apologetics: the Kalam Cosmological Argument
06/02/15
The argument from the video goes:
- Everything that had a beginning had a cause
- The universe had a beginning
- Therefore, the universe had a cause
The video may also have tacked on something about God being the cause as part of the argument, but sometimes that's just assumed and I'm working from memory here.
Now, even if this argument were sound (which is isn't), it wouldn't be an argument for any kind of deity. It is really only arguing that something existed "when" the universe did not. And even that's cheating, because there is no "when" outside of the universe, not as far as time is currently understood, anyways.
What that something is would be completely unknown. It could be what the universe is currently made up of, and whilst the universe exists.
So, again, even if it were sound, it is incredibly poor evidence for a deity.
But is isn't even sound. It's an inductive argument for which its premises, everything that has a beginning has a cause, and the universe had a beginning, are not adequately justified. Yes, inituitively, both of those things make sense, but when speaking on the cosmic scale, you can't trust intuitions to make sense.
Physicist Sean Carrol would tell you that 1) we aren't sure that the universe had a beginning, and 2) if it did have a beginning, the universe could still be self-contained, or uncaused. Which to me makes as much sense as it being caused, because again, timey-whimeyness (time didn't start until the universe started).
So, this is an argument that, if it were sound, wouldn't suggest a God, but it's not necessarily sound, so it's kinda just... pointless.
Christian Apologetics
06/01/15
For the first 15 years of my life or so, I was a Christian. My reasons for leaving the faith were more-or-less the same as my reasons for entering. As I had a conversion moment, so too did I have a deconversion moment. Somewhere in my childhood I felt the reality of God, and somewhere in my 16th year I felt that lack of reality.
Over the course of another 10 years or so, I came to a realization, both my reasons for becoming a Christian and my reasons for becoming an atheist were poor. They were based on personal senses leading to personal interpretations of reality, and the exact same feelings led to polar-opposite conclusions at different points in my life.
It is for this reason, I think, that I dug so deeply into apologetics as I became an atheist. Perhaps some part of me knew that I was leaving for poor reasons. Though, if that's true, it didn't seem to bother me that I was Christian for poor reasons as well.
Anyways, as I dug into the philosophical arguments for Christianity, I found them all flawed. Eventually, not too long ago, I stopped considering it something worth arguing over. I was finally comfortable in my atheism. Around the same time, I stopped being an anti-theist, and I stopped considering religion to be the cause of various evils.
Every once in a while, though, I find myself retuning to debates and arguments over the existence of God. I'm not sure why, though it feels very similar to watching an old television series that I've seen before many times. I suppose it's nostalgic.
It occurred to me on my most-recent explorations that documenting my little relapse here may be quite enlightening, and also serve as a better place to document my thoughts than reddit.
So, coming soon, me rambling about why I don't various arguments for God convincing.
Weekend Planning on the Bus?
05/31/15
So, it occurs to me that one of the advantages of going to work for a short time on the weekends is the productive bus time I have available to me. Mostly I use this time for writing these posts (as I'm doing right now), but on the weekend I should have ample time to set aside for blogging in some other setting, and perhaps the best thing to do with my bus time is plan the weekend and the week with timeblocks and all.
I tried planning last week during the weekend, and that more or less was a plan that didn't come to fruition. This does not dissuade me, however, as it took many, many attempts at planning at work before I finally found a setup that worked reliably and somewhat consistently.
And so I will keep trying, and this will be yet another mutation on my attempts to plan, and along this next week I will attempt some variation of what I have attempted before to properly document my adherence to the plan I have made.
Of course, this won't work for this weekend, as I've already spent my bustime, but it's definitely something to try next weekend.
On Enforcing Feelings
05/30/15
Early in my life, there were many times I was told to say I was sorry when I didn't feel sorry. I wasn't allowed to not apologize, regardless of how I felt. Other times I was compelled to forgive someone whom I had not really forgiven. To not do so would mean being punished.
It's something I remember whenever I'm around child drama, because now I find myself being the enforcer. And I realize that I don't think I'm okay with that. Being told how to feel and what to say was infuriating as a child, and not a useful experience now that I'm older and must explore my emotions and my actions with a significant lack of experience.
I do all right for myself here, but I still notice bad habits taking over in the worst possible ways and moments.
It seems to me perhaps we should treat children more like adults. Basically, if you wouldn't treat an adult in such a way, it's likely a child shouldn't be treated in such a way. Hitting an adult is very rarely acceptable, and so the same should be applied to a child. Dismissing or otherwise manipulating an adult's emotions in a dishonest way is probably emotional abuse, and so too would doing that to a child.
Yes, children are not adults, but that doesn't mean their agency should be allowed to be violated. Yes, they can more easily be a danger to themselves or others, or may be exploring territory very much familiar to adults. But, you know, udnerstanding the capabilities of adults and reacting accordingly is important, and so really the same thought applies. Context matters.
It's kinda weird, in many cases I'm forgetting what it feels like to be past me, but in others I remember it so clearly. How infuriating it was to not be listened to about anything. I would eventually scream that it was my turn to talk.
And I guess it was just something I was reminded of recently. I'll try harder not to repeat the actions I was on the other end of as a child.
Budget System Moving Slowly
05/29/15
So, I've written a little thing in javascript to add up my spending that I'm logging into a JSON file. Right now, I'm updating two JSON files by hand: spending.json and receipts.json. Hopefully, once my system is smart enough, it'll only be a receipt database of all my expenditures and the rest can be calculated from there. And in a really ideal scenario, this system would automatically read from and update the spreadsheet we're also keeping to track budget stuff, but that's a really far away goal.
But for right now it's a command line tool that tells me how much groceries and maintenance I've spent since I've begun, tells me how much I have allocated to those buckets by now, and how much is left in each bucket.
I have a ways to go, but starting makes it real, at least. Much better than the nothing I had before.
Let's hope I can keep making it better.
Time to Update My Resume
05/28/15
I haven't written a resume for over a year now. It's something I plan on keeping up to date, but often just untended. It's kinda like my yard, but I don't have to worry about it being covered in weeds when I get back to it.
I really think it's smart to rewrite my resume probably every couple of months or so. Epsecially since ideally I'd have new things to put up there every couple months or so. Because I want to achieve non-abstract things, you see.
The last time I made a resume, I made it in LaTex. This time, it kinda makes more sense to make it in HTML5.
So, my goal by the end of this weekend is to make a resume section of my site. And then also I should add updating it to my tickler, I suppose.
Giving Up Smash?
05/27/15
So, for a long while now I've been playing Super Smash Bros. Melee for about an hour everyday. This week I'm taking a break from it, and it occurs to me that I may just want to stop altogether.
I mean, it's fun, and I think the game is pretty great, but what I'm doing is learning to play an instrument that's playable in incredibly few contexts. I'm developing all this muscle-memory for incredibly subtle thumb-movements.
Is it really worth it, Stephan? Would not my time be better spent towards learning one of the instruments I've always wanted to learn but never prioritized time for? Like, seriously, I have never taken a lesson in the violin, but I always think about being able to play it.
Imagine that hour per day spent on something like that.
It's worth trying, at least. This week won't be violin, but I will be testing the waters of practicing a craft I want to prioritize more than Smash.
On Questioning Expenses
05/26/15
So, two or three sources have pointed me to Mr. Money Moustache at various points in the past, and so I've finally started to sit down and read them.
Before even reading them, though, the basic idea of saving 50% to 75% of my income is an enticing one. The idea of one year of work equating to one-to-three years of retirement is a very powerful way to look at things.
Frugality is also something I found appealing. Lifestyle inflation is certainly something I want to avoid. And I really do understand that a less expensive life can be just as satisfying as an expensive one.
Removing expenses from my life has already been a significant goal. And I've been quite successful. I'm living without a car and loving it. And that also saves me a couple hundred a month, at least. I pay about $40 on a bus pass, and I could be biking instead, but I do stuff like write this blog on the bus, so I consider it probably worth it. It is, however, something I'm considering messing with to see if I can juggle my actions and get more-or-less the same output at a lower cost.
For example, I could make biking my main means of exercise, and instead of taking a half-hour break to run during my work-day, I could take the same time to blog. Quite possibly very worth trying, and there's a time-period between when my bus pass expires and when I go on vacation where I think getting a bus pass would be a waste (won't be using it for a week), so maybe I could try the bike idea.
I just need to fix up my bike. Or use up my bike card to get it fixed up proper by a bike technician (should more-or-less be free).
Now, $42 isn't much, but according to Mr. Money Mustache, that racks up to 42*173=$7266 over ten years. Now, again, now too painful, but if I can make that much without it measurably hurting me, why wouldn't I?
But that's one of my more minor, more easily testable without much repurcussions (financial or otherwise). What really got my attention as I considered expenses was my largest one.
My mortgage.
My mortgage currently takes up about 25% of my income (after taxes). Now, ideally I would like to live on about 25% of my income, and for that to be possible I need to make more money, or decrease my mortgage.
Up until recently, I kinda took my mortgage for granted. Well, as long as I lived in Tucson, and I had no plans to leave. But I don't have to keep the house I'm currently paying off. I can sell it. Very minor research even suggests it has increased in value. I could perhaps switch to paying off a house that's as little as half the price of my current home.
Don't get me wrong, I love my house, but it's bigger than I need and my most major single expense. If I switched to something two-thirds the price, my mortgage would be halved. Half the price? Less than the third the monthly cost.
Again, with minor research, there are plenty of nice houses that are in that price range. I would also need to do neighborhood research, but it seems if I'm patient I could easily find something worthwhile.
That would put my mortgage to around 10% my income, and be about tied with food food for biggest expense per month. Mortgage, food, and bills may fit neatly into that 25%, and I could work towards having interest on my savings pay for the fun I want to have, or something.
This is definitely worth more than minor research.
Weekends Still Iffy
05/25/15
Weekend planning and home productive work hasn't quite clicked like work has yet. It's definitely improving, though, and I'm spending less time on energy-draining timesinks and more time on motivating actions. Saturday I got carried away with Mr. Money Mustache reading and then couldn't stop thinking about ways I could improve my spending (to the point that it took me two hours of trying to fall asleep).
I think it's just going to be something I need to work at. I think things will click eventually, and I'll be able to plan the work I do and do in the time I planned it, and focus on what I plan to focus on. I just gotta experiment with my environment and my mindset and see what works and what doesn't.
I'm not going to beat myself up about it, that's for sure.
Bucket Budgetting
05/24/15
So, with my abandonment of Mint, it's time to work up a system. Right now, I'm using a simple Google Docs spreadsheet wherein I'll put my expenses in by-hand everyday. Starting today. I got about a week's of purchases to catch up on, and then I'll work towards putting in spending everyday. I'll keep using Mint at first to make sure I don't miss anything it sees (it does look at all my accounts for me, after all).
Using Mint to do some of the stuff I don't feel like doing or automating right now is probably smart.
The way it does budgetting, however, is definitely not something I'm interested in. I'm interested in paying myself a specific amount every time period towards some budget. For example, I'm interested in putting $11 into my food budget or "account" everyday. The idea is to not overwithdraw from any account, ever.
My actual income, and when it arrives, and my spending need not be coupled. At a higher level I can look at the two and make sure my spending is much lower than my income.
And so, paying or filling each account or bucket at regular intervals (as determined by how regularly I need to purchase goods with that bucket's contents).
Each bucket that is filled would be expected to be emptied by some goal or deadline. So, time-interval buckets would expect their contents to be emptied by the next filling of the bucket. Leftovers need to be redirected to goal-oriented buckets (money towards something specific). Maybe also event-oriented buckets (overspending does happen from time to time).
For example, I have a time-interval bucket for grocery shopping that refills everyday to $11. I rarely pay the total $11 and even rarer (though still happening) I go over. When I underspend, the leftovers should go to a small buffer (with max amount) to cover overspending. I think an additional $11 for buffer would be good (I should never spend twice as much). Then, there should be grocery-related items that are more expensive than $11 that should fill up overtime so they can be purchased on the $11 budget but are also explicitly planned for.
So, I guess I'm thinking groceries should look something like this:
- Daily $11 bucket that overflows at $11 into grocery buffer
-
Grocery buffer overflows at $11 into list of things to buy
- Spices ($10 max?)
- Honey ($15 max)
- Special occasions (??? max)
If all buckets are full, additional money can be further diverted to savings.
I like this idea, Stephan. I'm going to try to make a web interface for it.
Is Quality Quantity and Feedback?
05/23/15
Something I've been thinking about lately is the nature of quality material and its relation to quantity. There's a classic cliche that comes with the two words:
Quality over quantity.
Which I used to be a big fan of, but now I'm starting to think that quality is simply some fractional output of quantity, and skilled creators either have a greater ratio of quality to quantity, or are really good at making a lot of quantity and pick and choose the quality therein.
People get better by doing over and over, so to me it makes sense that people have good work by having lots of work. But there are clearly those that do a lot of work and never get better.
Which is where feedback comes into play. You gotta improve on what specifically needs improvement. Deliberate practice and all that stuff, Stephan.
And so, I make a lot of blog posts. Some of them I like, too. But I realize that I don't even devote much time to self-feedback, which means my self-improvement along the blogging trajectory doesn't look too good.
What I'm saying, I think, is that I really should start doing a weekly review in my diary area again.
And now that we're past the year-old mark, maybe I should reread the post from a year ago (whenever applicable). I don't have much catching up to do if I start from the beginning now.
Look for both later today.
How Do I Avoid Burnout?
05/22/15
Something has clicked at work, and I think it will soon transition to my free-time, as well. I have gained serious discipline in choosing what to focus my energy on, and have unlocked serious productivity because of it.
But this has happened before. And then I thought it would last forever, just because it felt so good and that feedback was having me pour more energy into my productivity. Just like now.
But then I lost it.
And I still don't really know why.
Was it...
- soda?
- diet?
- shifting from running to gym?
- stopping gym?
- stopping running?
- my vacation last June where I stopped doing all of this?
- my lack of tracking capability?
- something else entirely?
Did I burn out? Is that what burning out is? What caused it and how can I avoid it happening again?
I know not to trust myself, but that's an insidious thing. It's like me being too drunk to know I'm functionally impaired, but still trusting me to know better.
Again, perhaps I need to seek proper outside help. Though now it's as a defense from back-sliding, instead of frustrating failure.
One thing's for sure, proper research with hard data is in order. And to clarify, I mean research done by others, though I guess doing such research myself could prove interesting. The point is outside help, though, and reading the research of others is a close approximation if not the real thing.
If Instincts are Wrong, Don't Trust Them
05/21/15
I've started to come upon repeatable patterns where my initial thoughts and decisions, rooted mostly in habit and instinct, are often the wrong thoughts and decisions.
I think the most-relatable of these patterns is the junk food one. There's free candy at work, and thus I always have access to candy. Not too long ago, I decided that hunger justified candy, and from there proceeded to eat way too much candy. I felt ill for a good portion of the day, and was unable to run between various travel points like I like to.
This happens all the time. A state of being causes me to believe an action otherwise poor or at best neutral to be valuable, but execution reveals it to have made things worse. I suppose this is but one of many causes of vicious cycles.
Another thing that happens quite often for me is that I get mentally fatigued from... whatever, really, and I reason that I should take a break. My "break" then consists of my brain doing whatever it feels like. This is often the consumption of content that drains me even more and in no way gets me back in the mood to work.
A break, as it were, should be a task designed specifically for me to get my energy back and make me more productive in the end than if I did not take a break. It is not a "do what I feel like" event. But it seems like a reasonable thing for a break to be, and so countless times I fell into that trap of being tired, doing what I felt like, getting even more tired, and feeling even more that I should do what I feel like.
And so I'm learning that I honestly can not trust myself to feel out what I should do given certain situations. I have to tread carefully and consider the complex consequences of my simple decisions.
I'm not sure if I can ever really trust myself, either. I've gone through all of this before, slightly differently, last year. Eventually I let things go on autopilot and things slid back into their old ways. Perhaps it's like having braces. Once the braces come off, the teeth start sliding back into their old positions, and so a retainer is necessary.
Maybe right now I have braces, and I need to figure out what I can do to retain my good behavior once the braces have done their job.
Design Explorations
05/20/15
There are various systems I think could be created or improved upon to help society and the groups and individuals that exist therein. So far, all I've ever really managed is to think about such ideas and maybe consume the research of others.
I think it's time to move beyond that. The very least I could do is mine my thinking into words. Though, ideally, I would also polish my thoughts, and even find means to test them, both via the work of others and with some of my own work.
Actually getting work done is kind of the end goal, though. The next step is simply writing down some ideas and/or hypotheses, and perhaps coming up with some means of testing my hypotheses with my current level of resources.
The actual execution of the tests could come later.
I Love to Run
05/19/15
It seems when I'm not running, I forget how much I enjoy it, and so when eventually I lose the habit of running 5 days a week, I don't realize what I'm missing.
Running really is a meditative experience for me. I really get a chance to think about what I'm thinking about, and am capable of not wasting emotional energy on it (because my energy is currently focused on running).
Further, after only having been running a week, I find myself more inclined to run the trip to the bus stop in the mornings (which is good, because lately I'm running late to that bus stop), and also run a bit of the trip home from the bus stop (my legs are usually pretty tired by the end of the day, though).
It's saving me a slight amount of time on travel, and I don't feel I'm losing anything by speeding up those trips. Though, thinking on it, the run takes me 20 minutes, so if I cut 20 minutes elsewhere because of it, then really I broke even.
No downside.
Also, I know when I've eaten too much junk because running hurts in a way that it shouldn't. Really helps convince me to eat better.
Grocery Shopping Everyday
05/18/15
So, having looked at my spending from time to time, food is actually one of the largest types of spending I do. Not as much as the mortgage, but possibly more than all my tradional bills combined. I think the reason for this is simple, food is a bunch of little costs that I think are fine adding up to something more expensive than I think it should be.
I've tried monthy budgets, and I've tried weekly budgets, and now, I'm going down to daily budgets. The place where I do most of my grocery shopping is on the bus ride home from work. Now that I plan to be at work for some amount of time everyday, and now that my schedule is so consistent, I can quite easily stop by the grocery store everyday and get the necessary food stuffs for the day.
Getting food spending under control will be a major source of saving.
Leaving Mint
05/17/15
So, I don't really care much for Mint, after having tried it out for a while now. It's better than what I was doing, but various aspects of its designs are things I do not enjoy.
I guess I want my budgeting to be a game, but on Mint I just feel I have slightly better tools to track my finances. It also keeps trying to have me use various other tools, which is how they make their money. One of the things it wants me to do is open an account under one of their sponsors to track my savings towards some goal.
I mean, it's a good idea, but I don't feel right being the product of the system I'm using instead of the primary customer. It makes me think they'll avoid making useful systems for me if they can instead sell me to a customer that only kinda works the way I want it to.
Anyways, I think I should keep using it, but go back to making my own tools for this stuff again. If for nothing else, Mint is useful in that all my transactions across various accounts are tracked in that one spot. And I can even save the transactions as a spreadsheet.
Making a script to get that one spreadsheet or even manually getting it will be a lot less annoying than doing it for all my accounts.
Planning Weeks
05/16/15
So, this magical thing has happened this week, in which my schedule seems to be incredibly consistent except for some small variance in the morning. This has the incredible value of being able to plan for actions in specific chunks of time without too much worry.
The schedule is basically thus:
Weekday:
- Misc (0300?-0310) (could start [hours] earlier)
- Take dogs for walk (0310-0330)
- Morning chores (0330-0410)
- Travel to work (0410-0430)
- Work (0430-0730)
- Exercise (0730-0800)
- Work (0800-1130)
- Super Smash Bros. Melee break (1130-1230)
- Work (1230-1530)
- Travel home (1530-1600)
- Cooking (1600-1700?) (ending time varies)
- Misc (1700?-1900) (starting time varies)
- Sleep (1900-0300?) (could end [hours] earlier)
Weekends (assumed pattern not yet observed)
- Misc (0300?-0310) (could start [hours] earlier)
- Take dogs for walk (0310-0330)
- Morning chores (0330-0430)
- Misc (0430-0520)
- Travel to work (0520-0550)
- Work (0550-0820)
- Travel home (0820-0850)
- Misc (0850-1600?) (ending time varies)
- Cooking (1600?-1700?) (starting, ending time varies)
- Misc (1700-1900) (starting time varies)
- Sleep (1900-0300?) (could end [hours] earlier)
You may be thinking, "That's a lot of hours to be working." And you're right, Stephan, but I'm okay putting these hours in for a variety of reasons. In all honesty, the weekend work wasn't originally a part of the plan, but I've come to find that going to work kickstarts my creative juices. It really is a part of my productive morning routine, and maybe if I want productive weekends, I should.
I don't think I have to actually clock in at work, but if I'm going I might as well put in a bit of time while I'm in the vicinity.
Anyways, that's tangential to the point at hand. See all those misc timeslots? Those could be anything.
Anything.
Also, I can do stuff during travel time, and that's really why I'm going to work during weekends. There's something about the bus ride productivity that really engages my mind for the day. Well, most days.
I think.
It's probably an integral part of my morning routine, at any rate.
But anyways, at work I've been using mornings to block out the work day with things I plan to do. I've made the incredibly valuable decision that if I distract myself with something, then a certain time-blocked task will have to be replanned another day (aka, I have to move on to whatever task is planned for the current time-block).
I believe it triggers the deadline motivation somewhere in the procrastinator part of my brain. My productivity is much more consistent.
Time-blocking my non-work time every morning, however, I tried and failed at. I believe I don't prioritize enough time to personal stuff on regular work days to devote a chunk of that small bit to planning the day.
On weekends, however, I have plenty of time to do just that. It is an interesting opposite, as I don't have the time to justify planning my work day (and as such I plan the weekends the Friday before). Basically, I think I should apply my weekday work strategy to my weekend personal time, and my weekend work strategy to my weekday personal time.
I think that this idea will work out pretty well. I think I have about one or two hours worth of personal productive time per weekday, and probably closer to 10 hours worth on weekends. For work, I have about 10 hours worth of time on weekdays, and am giving myself 2 hours worth on weekends. The mirror strategy is appropriate because of mirror time-commitments.
And as I plan my work weekends the Friday before, I shall plan my personal weekdays during the weekend.
Let's give this a try, Stephan!
Drawing Breaks?
05/15/15
Yesterday's post brought back memories of me trying to go through Drawing on the Right Side of the Brain while following the instructions explicitly. Which, if you don't know, has things that tell the reader stop reading and finish the exercise before moving on.
I believe I did this for three or four exercises before assigning the book a lesser priority and almost abandoning the book entirely. It took me about half a year before I went back to pick it up purely to read it, and save the exercises for another time.
Has that time come? My realizations about doing different work to better execute tasks makes me think that drawing would be well-suited to help me avoid burnout on the various coding tasks I'm attempting.
And I've always wanted to be capable of drawing.
The Value of Focus and of Switching Tasks
05/14/15
I have long since come to appreciate the value of focusing on one thing at a time (though I often fail to adhere to this understanding), but recently I have rediscovered that sometimes you just need to step aside and work on other things.
Human beings are not proper machines. More time put into a task does not ensure any kind of increased produtivity on task being worked on. In some cases, it can result in negative work, or burn out that makes further work impossible without a much longer break.
But I'm not just talking about simple breaks from tasks. I'm talking about switching to a different task for a while. Several times at work lately, I realized something I could be doing on a task I wasn't working on.
It reminded me of a time when I was going through the exercises of Drawing on the Right Side of the Brain. I often did the exercises during breaks at work, and found myself more capable of thinking of solutions to the problems I was working on whilst I did my drawing break.
Basically, I think I'm properly realizing now that there's value in taking breaks from productive work with other, appropriately different productive work. And I would like to try to apply that to my extra-curricular productive work.
How exactly I go about that is still something I'm working out, Stephan.
Revising the Plan
05/13/15
Okay, by now I should've been working on some sort of contribution to io.js for about 13 days now. Instead, I haven't really done much of anything, save for writing a blog post daily (I write them daily, it's just sometimes I forget to actually publish them to the site, even though I just have to run a script to do that).
So, what do I want to focus on, right now? I mean, I would like to get my productivity tools in place to facilitate more efficient use of my free-time and also tracking my general productivity, but that's actually a large project, and waiting for it to be "done" is ironically keeping me from doing real accomplishment-based work.
So, let's just go ahead and focus on trying to contribute to the io.js community, as was originally planned for this month.
Though, today it has also occurred to me that sticking to "priorities" over planning diversity has considerable weaknesses.... With my amount of free-time per day, only working on the priority thing seems intelligent, but it might be better to make a plan day-to-day, and stick to it, and simply make note of where my brain wanders so I can keep it in mind for the next day's plan.
One thing's for sure, what I was doing isn't good enough, and I need to experiment with how to maximize my personal productivity.
Developing Better Instincts
05/12/15
Today was a bad day, and on bad days I've noticed I fall into vicious cycles. I justify eating and drinking junk for "comfort", even though I know it doesn't make me feel better, and even though I used to have the habit of exercise or water or carrots (which I even brought to work) to fight the onslaught of things not going my way, and somewhere I lost that.
One good thing, though, is that I'm fighting hard to maintain my current sleep schedule (sleeping the hours of 1900 through 0300), and I'm making more and more conscious note of my making bad decisions in the moment. I simply haven't learned to consistently make alternative choices that properly curb the cycle of energy loss.
It may be time to develop certain record-keeping for this aspect of my life, to better convince myself of appropriate actions to take.
Weekend Productivity
05/11/15
So, it appears that both my new sleep schedule and my regained productive capacity do not yet apply to weekends. I woke up three hours later both days and had little motivation to be any form of productive.
Interestingly enough, however, I maintained the ability to go to sleep at 1900 each day (or at least lay in bed until I fell asleep) and also woke up only a little late this morning (at 0340).
There are multiple possibilities as to why I had trouble being productive this past weekend:
- I needed to recover from a 61.5 hour work-week the week before (spread across six days)
- I have ingrained a habit of weekend laziness that I have to undo
- This was the first weekend without plans in a long, long time
I'm inclined to believe it's a bit of all of them. The long work week shouldn't happen again, or at least not until I get sick again, which hopefully won't happen for a long, long time. The second is more difficult, but like at work, it may just be a matter of starting to do work when I don't feel like it to activate my energy.
The third thing may be the biggest contributor. Last weekend I was recovering from being sick and only had one day. The weekend before I went to Phoenix, and got sick, and the weekend before... something happened? I don't remember. This is why I should be better at populating my diary.
I just need to keep busy/free weekends in mind for energy tracking purposes, I think.
CSS BEM
05/08/15
So, as I said somewhere before, I've subscribed to a CSS newsletter. Just recently, I decided to skim through some of those emails, and one of them linked to this article on BEM.
What's BEM? It stands for "Block, Element, Modifier", and is a CSS style-guide with the purpose of avoiding specifity creep. It actually didn't take me long to encounter this problem on my site, but that's cause I kinda don't know what I'm doing and just crammed things willy-nilly into CSS files.
As I work on rewriting my CSS from scratch, consideration of this concept may well be useful in my endeavors.
Altruistic Systems
05/09/15
I've been thinking lately that we have pretty good evidence that how morally people act in society depends largely on the feedback systems in place. Look no further than the state of the police in the United States to see this in action. There are various systems in place that incentivize immoral behavior for the sake of passing the metrics that measure how good a job is being done, and also for the sake of actually funding the police.
Which makes me think: how could we better design systems such that people are not incentivized to act immorally?
I think first I should consider how important morality really is to most people, even me. Even trying to consider this question deeply, I find my thoughts wandering, "I should probably start cooking as soon as I get home." Morality is something that has intrinsic value, and I believe both short and long term emergent value, but how it helps the world is kinda invisible.
It's only something to notice when it's broken, or when in comparison to where it is broken.
But right now, things are broken, so I think morality can reveal a lot of value. I think the key is to make intelligently designed systems that incentivize morality, or at least no longer incentivize evil.
But how? Well, there are a few questions to ask there:
-
Does the source of income rely on
- abusing the system?
- moving in the opposite direction of the goal?
-
Are employees
- encouraged to abuse the system?
- encouraged to fix the system?
- free to offer feedback on job difficulties?
-
Are users
- frustrated with the system?
- expecting the system to do something it isn't?
- in disagreement that the system should exist at all?
- not being considered by the system?
I think long strides to morality can be made by making sure a system is aligned with its purpose and that that purpose is made transparent to all members affected by that system. Any piece of the system that is at conflicts with its transparent goal need to be assessed and mitigated.
But even necessary and good goals often have negative consequences. Automation is set to make many jobs obsolete, and none of the systems working towards putting automation in place has any kind of safety net setup for the displaced.
Systems that consider even this aspect and work to mitigate or erase their negative side-effects would then be altruistic systems. I suppose I could take it a step further and say that systems that try to handle problems outside of their specific goal and source of income, but meets its skillset and solves a real need, would also be altruistic systems, but there are lots of outliers there to consider.
I believe I have more thinking to do on this.
Game Weekend Coming Up?
05/08/15
So, a while ago, I decided that I'd set aside a weekend a month to do my own personal game jam with a team of as many people interested in joining me. I have yet to do a single one. Now, I have excuses, but I'm not interested in excuses, I'm interested in making games. So, this weekend, I'm going to make a Japanese-study game.
Why an educational game? Because I'm more interested in making games that help me improve myself right now than I am in games that are simply intrinsically interesting, though I do really want to explore varrious game concepts that are intrinsically interesting as well.
Right now, though, if I make a game that I use everyday, or convince others to devote a lot of time to, I'd like it to very directly correlate with the gaining of some valuable ability.
Let's see how this goes.
Hannah says hi, Stephan!
The First-Year Milestone
05/07/15
A year ago today, I ssh'd to my server, did some finagling with sudo, apache, and config files, and edited an index.html. I wrote something called The First Stone. There was no CSS to speak of, and originally no date. The words started on the left-most side of the browser page and stretched to the end.
There's a bit of advice I've heard that I liked, "A year from now, you'll wish you started now." And now, a year later, I'm glad I started then. I'm not as far as I originally expected, but this past year has been more powerful than any year, more self-motivated, more mediative, more mine. I was the driver of my destiny more than I have ever been, and in many ways, big and small, this little blog here has helped achieve that end.
True, there's so much more I need to do, but that will always be true, it's a wonderful, horrifying nature of reality. There will always be more to do, and better ways to do it. And there will never be enough time to do all of it. There may very-well be things I think about doing that I never act on for all my life, but at least now I'm acting on some of those thoughts.
And there's so much more to come.
Learning to Use the Debugger
05/06/15
There's this slightly embarassing fact that becomes more embarassing the longer I'm a computer engineer.
I barely know how to use debuggers. Like, I'm aware of them and have used them, but they have never become my go-to tool. I still mostly resort to print lines if I don't understand the problem well enough to fix it after seeing it in action.
My excuse had been that I'd been working in a multi-process (which I found out I erronously called mutli-threaded) environment, but I recently was told that gdb can work quite well in either multi-process or multi-threaded envrionments. In fact, it's pretty powerful in those environments, which is all the more reason to learn to use the tool.
So I guess the best way to start is to make it my main debugging tool from now on. When easily appliable, at least, I still need to figure out how to do it for some work setups, and so I'll use my old methods whilst I learn the new ones.
It's also an excuse to properly learn the javascript debugger.
Planning Breaks
05/05/15
So, my recent mostly out-of-commission state made me realize, I probably need to plan for or be aware of the necessity of breaks from personal side-projects. I'm thinking being sick earlier made me realize I was a bit burnt out. For a few days after getting sick, I couldn't bring myself to be productive and instead played many, many hours of FTL (love that game).
Now, if I hadn't gotten re-addicted to FTL over the course of being sick, I would have spent my burn-out time on something far less revitalizing, like reading reddit or something like that. I need to be aware of when I need to just blow off some steam, and when I can find productive endeavors worthwhile and fun, and pick the best action from there.
And I don't mean short, minutes or hours breaks. I mean vacation-esque days off. Definitely need to make the most out of them. That doesn't mean some grand adventure. Being an introvert, I quite like quiet alone time to recharge. I simply need to make whatever I choose as high-quality as possible.
First Bus to Work
05/04/15
Today's title implies the wrong thing, but I still think it's a good title. I've been busing to work for almost a year now. Well, I guess pretty close to 8 months. I quite enjoy it. I don't have to worry about traffic, and being tired doesn't affect the quality, speed, or safety of my transportation.
Today, however, may be the first day I have caught the very first scheduled bus to work. I have at least planned to catch it before, but I don't remember ever being successful.
The 0430 bus travels at a much faster rate than the buses I usually take. If taking this bus becomes a habit, I may need to make up for lost productive time.
Yooka-Laylee Looks Awesome
05/03/15
The creators of Banjo-Kazooie and Donkey Kong Country have a Kickstarter setup for a game called Yooka-Layle.
As may be obvious from the name alone, it's a spirtual successor to Banjo-Kazooie. Basically, every aspect about the game considered from this standpoint looks pretty well executed. The cameleon-bat combo is considerably different than a bear-bird combo, but allows for a lot of similar mechanics. Also, as they say in their video, there's a lot that can be done with a chameleon/bat combo using explicitly chameleon or bat metaphors. Moreso, I think, than the original bear/bird combo.
I'm saying it's got some additional affordances from this combo.
Overall, it feels like a well-thought-out spirtual successor concept, and they look to have a good prototype already before the kickstarter. The game is already successful, and I've already felt burned on a previous game I kickstarted, so I'll just wait for this game to release.
But I digress, what really inspired this post is my realization that they got the same musical people (behind the same games) working on the music for this game. Some of the sample stuff is great.
Right now, I can't stop listening to "Jungle Challenge (working title)" on repeat. Actually really good for focusing on the bus, I think.
Two Tokens: Game Channel Coming Soon
05/02/15
So, I'll be doing some Let's Plays with Ann Twirls soon.
The first game we'll be playing is Star Wars Jedi Knight: Jedi Academy. The excited thing about this will be the arbitrary rules we'll be adding to our playthroughs. Though, how forcefully we'll apply those rules will depend, I suppose. Something I'll be trying for Jedi Knight is killing as few enemies as possible. First level I went in with this rule, I managed to kill as few as 50 enemies.
Does the next level go better?
I suppose you'll find out, Stephan.
Favorite Sleep Schedule
05/01/15
You have definitely noticed by now, Stephan, that blog updates are delayed a bit (almost a day later than usual), and also the consistency of publish time is way off now. For example, it's technically May 2nd as I write this, but my rules on what constitutes the date of the post is a bit lax and more-or-less connected to my sleep schedule.
As I noted earlier this week, I was sick. It last some four days, I think. It was not enjoyable, and I ended up sleeping all day a couple times.
And so my sleep schedule is completely out of whack right now. For instance, I woke up about 4 hours ago as of writing this, and decided to shelve the fiction post I was writing to instead discuss my current sleeping schedule.
I woke up at 2300 on May 1st (it is now 0300 on May 2nd). Under any way of looking at it, I did not wake up in the morning. Now, the plan was to wake up at 0100, but my body didn't want to sleep anymore and so I didn't force it.
I love waking up in this time frame. It's amazing. I get all this time to myself. If I wake up and end up not doing anything for the first half of my waking day, I don't feel like I lost the whole day doing nothing. By the halfway point, people are only just waking up, and starting productivity then is perfectly acceptable and normal-looking from any outside perspective.
And if I'm feeling productive? I can get a whole day of productivity in and not feel worn out. Something about the rising sun and the rest of the city starting their day halfway through my day just seems to reset me so perfectly.
Perhaps it's the introvert in me that makes waking up at this time so ideal. Well, the introvert in me and the fact that the lifestyle I have leads to lots of quite enjoyable but incredibly draining social time. Starting the day with no one around, in an unbroken and long calm that I properly control, it lets me charge my batteries in the best possible way.
In any case, being sick has unlocked my favorite sleep schedule.
Priorities
04/30/15
I haven't done proper thinking about my priorities in a long while. I mean, I've talked about stuff I want to work on and stuff, but even that wasn't an all-encompassing look at my priorities.
So, what are the first things that come to mind here?
- Social Connections
- Work
- Accomplishments
- Learning
- Play
- Reading
That I first thought of social connections (well, the first thought was family, but the word family implies the blood relations beyond other relations, which I consider just as important. Further, "Social Connections" more deeply describes what I want out of family, and it's easier to describe the value. Other people provide me with perspectives, experience, and insight I simply do not have, and they do it in an incredibly efficient manner.
So, like, chatting on the node.js (or now io.js, I suppose) IRC would fall under "Social Connections". The meetups I am starting to attend more regularly would also fall under this label.
And, of course, quality time with friends and family would also fall under this label.
I think this gets the least amount of quality application over all my other priorities (except maybe accomplishments). Part of that may be my introvert core, as social stuff is super draining for me, but it might also be because I just haven't given proper thought to scheduling it properly.
Really, scheduling in general is falling apart and I may need to spend some quality time coming up with strats there. Perhaps development on my productivity extension may help there.
Work is an obvious priority. It provides the fuel that I burn towards other priorities, and I also want to provide value in return. I want to do a good job.
Accomplishments are really important to me. I want to talk about what I've done, not what I want to do or what I think I could do. It really provides evidence of what I could do in the future, too. It would really help ground my reality and my potential.
Better accomplishment definition and tracking would be of great use to me, I think.
Play is something that I seem to either do a lot of, or nothing at all. Finding a happy middle-ground is hard, and I think in the long run that either extreme or switching between extremes are not sustainable alternatives.
Again, it seems like a scheduling issue. If I made a schedule and stuck to it, it seems likely I would get considerably more out of the experience.
I guess what this is boiling down to is... I should devote some time to a good time budget planning session.
Productivity Extension: Design
04/29/15
So, yesterday's leaking frustrations led me to consider what my system is missing and what I could implement to be more consistent. Which means I'm already not following my advice and am solving the system internally instead of seeking external help.
But that's okay. I can do both. Attempting one does not prevent me from doing the other. And seeking external help will be time-consuming anyways, Stephan. Though, if I had comments available on this blog, I may well have gotten external feedback already.
Eh, I'll get to that eventually.
Anyways, my main conclusion is that I need to finally get around to making my own redirection extension. Block site isn't cutting it at home, and LeechBlock, whilst faring better at work, still is not good enough.
There are certain factors that ensure some level of productivity at work, and better home habits will reinforce good work habits, so I'm going to start with making a chrome extension for better chromebook productivity.
Why I Need to Do This
The problem with Block site, and even LeechBlock, is that they don't consider why I want to block, and lack context beyond blocking after a time-limit or within a specific time-block. These things don't know what I think I should be doing, nor do they know what alternative actions I find acceptable or am willing to do.
As such, in certain circumstances I'm more motivated to circumvent or disable the site blocking extensions instead of using them for the reason I have hired them.
Knowing Alternative Actions
I have various large lists of things I want to do. Many of these things lists are already digital. A system capable of catching me doing something I don't want to do should offer up actions I have already agreed are worth doing.
These digital lists live in:
- Bookmarks
- Text files
- HTML files
- Calendar
Further, having a good digital tool could lend itself well to digitizing various physical notes floating through paper systems:
- Tickler
- Space Repetition
I'm at the point where what I gain from automating will probably quickly make up the time investment of automation. Both because a lot of my system consists of rules enforced by my brain, and because I've gained some experience making somewhat-useful things in HTML5.
Automatically Recording Metrics
An intelligently designed extension would allow me to tag the browsing I engage in:
- Off-time
- Short break
- Long break
- Research
- Work
- Maintenance
- Etc.
When ending whatever action I'm engaged in, I could have ready-made questions to ask about how effective whatever I did was towards whatever purpose it has.
For example, for breaks I could:
- Track how long the break was
- Track what the break was
- Track the url of the break
- Ask if the break reinvigorated or further drained
- Ask if the break was satifying
This could build up to gather good data on which sites are good for breaks, and which are not, and from there I could improve my site-blocking setup to change how these sites are dealt with.
Understanding Context
In the morning, I have this bad habit of circumventing Block site (via muscle memory at this point), and wasting valuable morning time on the SmashBros subreddit.
Now, I think small doses of reddit is mostly harmless now, especially if I stick with specific subreddits of interest, but the morning is definitely not the time for it, especially since small doses in the morning just doesn't happen.
I also got a good checklist of things to do in the morning and the evening, and really need to start developing the habit of falling asleep at the same time every night, so having this system demand I check off these routine items before unblocking certain sites may be of considerable value.
First Steps
I think it shouldn't be too difficult to have an approximation of Block site made pretty quickly. I mean, I wouldn't have an actual interface to insert blocked sites, but I could just hard-code sites at first. The main purpose would be to get redirection for specific sites working.
From there I can add new features by ease or value of implementation.
Why Don't I Keep Using My System?
04/28/15
It's a frustrating thing, to have a system that I've had great success with, but to find myself using it less and less consistently instead of constant iteration. I don't understand myself, I really don't. Clearly, I need to learn.
It may be best to look into proper outside help, here. If the problem is me, solving it myself may be pretty inefficient. The best strats are out there.
Melee: 20XX is Engaging
04/27/15
So, I've had the 20XX mod on my home system for about a week now, and now I'm actually practicing Super Smash Bros. Melee almost everyday.
I think a next step will be to setup my Windows system with Dolphin and make it so I can play Melee with the awesome Netplay mod.
It might also be valuable to have a means of recording my efforts, both to actually see my progress in my abilities to play Melee, and also to provide documentation for others to use for their own purposes, and hopefully provide me with excellent feedback on how to be better.
I'm really glad I finally got around to this. If I were to actually start a pomodoro before each practice session, they would be exactly as I planned them in my old plan documents, and in my current weekend plan template.
I also have all the necessary equipment to mod my Gamecube such that I have 20XX on it, giving me a good practice system at work (where I was doing most of my play sessions until very recently).
Basically, I'm putting an amazing amount of resources and effort into becoming better at a game I really enjoy. I do not know how I feel about that, actually. Whatever, the skills I'm learning here may well be applicable to becoming a master of most anything else.
Sick
04/26/15
What I thought was a sinus infection turned out to be a general illness. Maybe a cold. I don't know. I do know I got someone sick to find this out.... Sorry about that!
I was being pretty hard on myself for being unproductive, but now it makes a lot more sense. If I'm contagious, though, it might be intelligent to stay home if I'm still feeling ill tomorrow.
I've missed a lot of Game Dev Club meetings, it's making me pretty sad. The semester is almost over, too.
Oh, well.
I Will Contribute to io.js
04/25/15
So, this month's TucsonJS Meetup was about io.js, what it is, and why it exists. My diary post about it can be found here.
Of particular interest was how the speaker, Omer, talked about how easy it was to contribute to io.js. Significant contributions to it would take writting C++/C as well as JavaScript, and also probably require a growing understanding of V8, Chrome's JavaScript compiler, and libuv, an asynchronous file I/O made by Microsoft to more easily make node compatible with Windows (I think). Both libraries update at a fast rate, and io.js defintely has work for people interested in contributing there.
Though, apparently contributing along most any axis is encouraged on the io.js setup. Overall, I think it'd be a great learning experience, and will probably be a good focus for May.
Rewatching Korra: Thoughts
04/24/15
I have now seen every book of Korra twice, though the last time I rewatched the first book was over two years ago. In any case, I really love the Legend of Korra series. I like it better than its predecessor, even.
What's really great is that each book has observable impact on the world, and its impact can be seen in the next book. Even book 1, which felt like it undid a lot of its impact at the end, set up a Republic City where a non-bender was elected President and also followed a storyline where Asami is trying to rebuild her company's reputation, which was destroyed with her father being an Equalist.
Book 2 also had obvious effects that were capitalized in Book 3, and the same goes from Book 3 to Book 4. And yet, I think they all work pretty well as stand-alone stories. Overall, I consider it all really well done. Now, it's not perfect, and there's stuff I dislike, but it's the kinda stuff that I care less about as time goes on, as opposed to flaws that make me like a story less and less as time goes on.
So, even the flaws feel like they were executed pretty well.
A great series, and I am once again sad that it is over.
Where was I?
04/23/15
Vacation is over, and so now I would like to get back to productivie, extra-curricular work. If I remember correctly, I'll plan to give site iterating until Monday, and then I'll focus on other things for a bit.
So, the stuff I want to do by Monday is:
- Automated RSS Updates
- CSS Reset
- Server Running on Node
I think it's probably good to focus on the server actually running on node for now, as I'll probably implement it incorrectly and need to fix some things, and those things will hopefully come to light during the implementation of the other things.
And then, after site stuff, I think it's about time to do some open-source contributions of some sort. Probably node/V8 C++ stuff. Though, I wouldn't be against some hardware-related skill-building (I've had a Raspberry Pi just sitting around for a pretty long time now).
Eh, whatever, I can think about that come Monday. Right now, site stuff.
Argument Obsession
04/22/15
I used to care more about winning arguments than being right. I've talked about it before, and also briefly mentioned it. I believe that that part of me is mostly gone, and so when people bring up the past to tell me I love to argue now, it angers me a bit.
But worse than that is the argumentative habit. When someone brings up something I disagree with, and I feel the need to correct them, even when I know the discussion will be draining and fruitless, and not really much of a discussion. Today I was triggered into it, and I successfully managed to bind my fingers, but I couldn't stop thinking about what was said.
At first, it felt like I wasn't affect by what was said. It was like an injection of slow-acting poison: the inital poke felt like nothing, but the delivered toxin spread to vital areas and maintained an attack that affected me deeply..
Last time this happened, I eventually sent a response, but I got back exactly what I expected, and see no reason why it won't happen again. This time, I have to channel that defensive energy to something I can profit from, spirtiually if not financially.
And so, I'm writing this post, and I'm trying to derail my thoughts whenever they come upon this topic, and instead think about things I want to accomplish and how. I am not sure if training myself to derail or distract from something is good, though.
Perhaps I should see a therapist about such things. Seek guidance in knowing myself. It would in no way hurt me financially to do so.
I'll probably seriously look into it soon.
Melee: 20XX
04/21/15
I have finally gotten around to downloading 20XX for my Wii Melee setup at home. I also have the chip so that my Gamecube setup can also have it.
I have a lot to learn to maximize my practice efficiency, but now I actually got a good tool for practicing certain skills in the game.
Note: Today's should be the last late, short post. Vacation ends tonight.
Mini-Vacation
04/20/15
So, if it wasn't obvious with the recent, short, non-productive-focused posts, I'm on a vacation. Still want to blog everyday, but more-or-less taking a break from everything else. My cousin's here to visit, and together we're watching the Legend of Korra and playing lots of Smash.
Vacation ends tomorrow, though, so I'll probably jump back into more productive stuff shortly. Though, all this Melee playing may finally motivate me to setup my training station.
Melee: Sandstorm
04/19/15
I went to a Smash tournament in Tempe, AZ (aka Phoenix)!
Still there, but I didn't make it past pools.
Some other Tucson people noted that my Young Link is getting much better.
Yay!
Rewatching Korra
04/18/15
I am rewatching the Legend of Korra with my cousin, whom I had watched the entire series of Avatar: the Last Airbender during the week leading up to its finale.
It seemed fitting to do the same again with Korra. So here he is, and now we have watched Book 2. Book 1 he already watched, and we have a tight schedule to fit the series into, so Book 1 is something I'll rewatch at a later date.
Book 2 I thought I would like less, having watched the whole series and having liked the following seasons so much more, but I actually like it even more on rewatching. I don't know if it's the added context, or the proper expectation of what I knew I didn't like and the reintroduction of things that are just... quite special.
Watching it again is like reuniting with an old friend on a special occasion. It's bittersweet in a way, because the meeting is fleeting, and we'll both continue on our separate paths after the ocassion is over.
....
What a wonderful experience it is, none-the-less.
Learning About Typography
04/17/15
So, I fell down an unexpectedly interesting rabbit-hloe the other day. It started with a link to Pollen: the book is a program, which I realize now has a link to my final destination right there, but I followed some other links for a while.
I was reading Pollen up until the end of 3 Backstory wherein I encountered Why Racket? Why Lisp?. I almost always enjoy any reading I do on Lisp, I really should do some playing with it.
It was at this point that I realized I was in a book about Typography, and when I got to websites that I realized, "Hey, this would be a pretty smart thing to know about when I start rewriting the CSS for my site."
And so I'm learning about typography, and in the process I'm getting to read all sorts of interesting opinions and thoughts like how to pay for the book and the infinite-pixel screen.
Delicious food-for-thought that keeps linking to other delciious food-for-thought, and best-of-all, it may soon be applicable for me.
I am a Wizard
04/16/15
It has repeatedly occurred to me how good magic is as a metaphor for programming, but recently I have come to a much stronger conclusion: programming is literally magic. And I am literally a wizard. Programming is as close to real magic as we have come, and it matches the myth pretty closely.
Would you like to learn an arcande language such that, if words are executed correctly, it does your bidding? That's a wizard, and that's possible with programming.
"Ah, but wait," I hear someone object, "programming is only applicable in limited settings." And that's true.
For now.
And that's usually true of magic in its various mythological forms, anyways. Though it is quite fair that programming as literal magic isn't quite there yet.
But it's close.
Most everyone nowadays has a phone, and interacts with globally connected devices on a daily basis. The emergence of general-use robotics is also on the cusp, and they will very much be within applicable effect of the emerging magic.
I think really there's only a few things to make the metaphor literal:
- More everyday presence of robots
- Perfection of listening software
- Latin as a programming language
That last one is super important.
Site Thinking
04/15/15
So, as is probably obvious by now, I've been focusing a lot on tools for my site. Cleaning up my site has been a lot like actual cleaning in that I put it off for a really long time and once I start I can't stop. It's a little bit addicting, and it's also easy to get hung up on insignificant things that don't matter near as much as the obvious hard things.
Keeping this in mind, I figured it'd be good to make a high-level list of things I want to do with my site before I do other things for a while:
- Server running site on node
- Fix all broken or unimplemented links
- Automatic RSS updating
- CSS Reset
-
Auto-generating and additional dynamic formatting of served html
content including, but not limited to
- Serving index areas dynamically
- Formating code tags (with colored syntax)
And that'll be good for a while. There's a lot more stuff I want to do with how I do things regarding my site, but this'll at least shallowing touch mostly all the things I care about. Going further would be iterating upon the little bit I've done here: using real databases for site content, real templating, et cetera. And these are all valuable things to do, but I think I need to make some time for game development practice and open-source contributions, so I need to wrap this up for now.
I think I'll give myself two weeks to finish up site stuff for now. After that, I'll assess what most I want to do and work on that for a bit.
Publishing Script
04/14/15
Last time, I made a means of generating my index areas for my diary and blog. This is a considerable step towards DRYing up my blog, and now the ability to add what gets published to my index area is a clear next step in my javascripting enterprise.
Whenever I update how I generate or serve my index areas, I'll need to update how I save the posts I write, I think. Right now, it's pretty simple, I just need to move the post to the right directory, and add the filename to the correct "database" textfile list of posts.
Code Review
Without further ado, my publish.js:
/*jslint node: true */
(function () {
'use strict';
var args,
usage,
errorCount,
publishCount,
publishPosts;
errorCount = 0;
usage = function (err) {
if (errorCount === 0) {
console.log('USAGE: publish <area> <file> [<file>] [...]');
console.log(' area: diary or blog');
console.log(' file: html file containing post to publish');
console.log();
}
if (err) {
console.log('Error: ' + err);
}
errorCount += 1;
return false;
};
args = (function () {
var processArgs,
area,
validAreas,
files;
processArgs = process.argv.slice(2);
if (processArgs.length < 2) {
return usage();
}
area = processArgs[0];
validAreas = ['diary', 'blog', 'test'];
if (validAreas.indexOf(area) === -1) {
return usage('area must be diary or blog');
}
files = processArgs.slice(1);
return {
area: area,
files: files
};
}());
if (!args) {
return;
}
publishPosts = function (area, filenames) {
var path,
database,
fs,
publishedPosts;
path = require('path');
database = path.join('database', area + '.txt');
fs = require('fs');
// Move posts to published area
filenames.forEach(function (filename) {
var publishedPath;
publishedPath = path.join(
'public',
area,
path.basename(filename)
);
fs.rename(filename, publishedPath, function (err) {
if (err) {
console.log(
'Error moving ' + filename + ' to ' + area
);
}
});
});
publishedPosts = '\n'
+ filenames.map(function (filename) {
return path.basename(filename);
}).join('\n');
// Add to the database of published posts
fs.appendFile(database, publishedPosts, 'utf-8', function (err) {
if (err) {
return console.log('Failed to publish to ' + area);
}
});
};
publishCount = 0;
args.files.forEach(function (filename) {
var fs;
fs = require('fs');
fs.readFile(filename, 'utf-8', function (err, data) {
if (err) {
return usage('could not open ' + filename);
}
// Verify no empty strings in file to be published
if (data.indexOf('""') !== -1) {
return usage('Empty string "" in ' + filename);
}
// TODO: Verify there's actually a post to publish
publishCount += 1;
if (publishCount === args.files.length) {
publishPosts(args.area, args.files);
}
});
});
}());
Oh, look, actually taking command-line arguments. When was the last time I did that? Let's break down what this code does.
args = (function () {
var processArgs,
area,
validAreas,
files;
processArgs = process.argv.slice(2);
if (processArgs.length < 2) {
return usage();
}
area = processArgs[0];
validAreas = ['diary', 'blog', 'test'];
if (validAreas.indexOf(area) === -1) {
return usage('area must be diary or blog');
}
files = processArgs.slice(1);
return {
area: area,
files: files
};
}());
if (!args) {
return;
}
Argument handling is still something I'm experimenting with in node javascript. I'm sure there's a good node library out there, but it doesn't seem like there's a definitive one, so I'll play with the built-in stuff for a bit until I know what I'm looking for.
Here I grab the arguments fed into the script (process.argv's first two values is "node" and the script being called).
Now for this script I want at least two arguments: the area I'm publishing to, and any number of filepaths leading to a file that I will be publishing to that area.
Now, there's a few things I can check the validity of right away, like whether or not the area the script is trying to publish to is valid. I check that and return a usage if it is not correct.
Then I split the args further into specific, well-named variables and return an object containing said named variables.
errorCount = 0;
usage = function (err) {
if (errorCount === 0) {
console.log('USAGE: publish <area> <file> [<file>] [...]');
console.log(' area: diary or blog');
console.log(' file: html file containing post to publish');
console.log();
}
if (err) {
console.log('Error: ' + err);
}
errorCount += 1;
return false;
};
Here is my usage printout. I use a closure to track how many times the function has been called. Really, it's just so I only print out the usage string once, and then I can also print out any errors I come across by calling this usage, and not reprint the usage over and over.
I return false with this function because I figure if I'm going to return usage elsewhere, I shouldn't let it just be an undefined.
publishCount = 0;
args.files.forEach(function (filename) {
var fs;
fs = require('fs');
fs.readFile(filename, 'utf-8', function (err, data) {
if (err) {
return usage('could not open ' + filename);
}
// Verify no empty strings in file to be published
if (data.indexOf('""') !== -1) {
return usage('Empty string "" in ' + filename);
}
// TODO: Verify there's actually a post to publish
publishCount += 1;
if (publishCount === args.files.length) {
publishPosts(args.area, args.files);
}
});
});
I now do an asynchronous iteration over the filenames input, read each file, and if the file passes all of my (admittedly a work-in-progress) tests, I increment the closure publishCount and if all input files have been verified, I execute the process to publish the input files.
publishPosts = function (area, filenames) {
var path,
database,
fs,
publishedPosts;
path = require('path');
database = path.join('database', area + '.txt');
fs = require('fs');
// Move posts to published area
filenames.forEach(function (filename) {
var publishedPath;
publishedPath = path.join(
'public',
area,
path.basename(filename)
);
fs.rename(filename, publishedPath, function (err) {
if (err) {
console.log(
'Error moving ' + filename + ' to ' + area
);
}
});
});
publishedPosts = '\n'
+ filenames.map(function (filename) {
return path.basename(filename);
}).join('\n');
// Add to the database of published posts
fs.appendFile(database, publishedPosts, 'utf-8', function (err) {
if (err) {
return console.log('Failed to publish to ' + area);
}
});
};
This code is the longest bit, and does the actual work, but I feel it's pretty straightforward what it does. It moves each file to the directory where published posts live, and adds each base filename to the relevant area's "database" (appends the basename of the file to the end of the file).
Overall, it's a simple bit of code that I tried to build good feedback of bad input or something wrong going on with filesystem interactions. I also believe that it should be pretty straightforward to iterate on this script to better check for silly things wrong with my posts, maybe even add better additional mark-up to my code things (color-coding would be pretty cool), and upgrade the whole thing to use a proper database.
It's getting to be about time to actually go to my server, and setup things so content is actually being served through node, and that it restarts when the system restarts, and also when new server code is pushed.
I believe I've read a tutorial devoted to just such a thing. Or maybe it's the simple guide predecessor I'm thinking of. Either way, I should probably start setting up that system locally, get it working, set it up on my server, and make the transition.
It might also be prudent to explore my options further. I mean, I've used nodemon, is using grunt over that... ideal? Does grunt use that and other stuff?
I suppose I'll get back to you on that.
NPM Version Standard
04/13/15
So, making a node executable with npm made me realize that I do not know what the numbers mean for versions on npm packages.
As it turns out, it follows the semver standard (I'm guessing it's a standard, still new to this). Semver stands for "Semantic Versioning". Maybe it stands for "Semantic Versioning 2.0.0"? That's what the site says at the top of the page, anyways.
From that site:
Given a version number MAJOR.MINOR.PATCH, increment the:
- MAJOR version when you make incompatible API changes,
- MINOR version when you add functionality in a backwards-compatible manner, and
- PATCH version when you make backwards-compatible bug fixes.
Additional labels for pre-release and build metadata are available as extensions to the MAJOR.MINOR.PATCH format.
I see. I think this is the same versioning scheme that python uses? Let me check. No, I don't think it's the same, actually. PEP-0440 looks considerably different.
Anyways, this seems familiar, I've encountered it before. I believe I understand the basic concept. Code relies on code, and code evolves. So, updating along these three increments makes sense, such that other code depending on it can know whether or not there will be compatibility issues and such.
What's a good version to start on? 0.1.0? Ah, that's the first question of the FAQ, and 0.1.0 is right.
I guess it might be a good habit to think of version numbers for the stuff I make. I mean, someone might find it useful, and knowledge of this stuff may somehow help when I get around to working on contributing to some open-source projects (would like to do that before the end of April).
Maybe soon my site stuff I'm making will get a proper release version.
Generating Index
04/12/15
So, I have been copying each post I write, for both my diary and my blog, into the index.html files contained in their respective areas. This was relatively painless, as I have a vim maccro that does this for me.
However, quite often I would find little errors after posting, and that meant fixing it in two places.
No more! Now I generate index.html for both my blog and my diary, and what gets published to it is based off a diary.txt file or a blogpost.txt file. To publish a new item, I just append the new file's name to the end of the list, and put that file into the correct area.
I've discussed the process while I implemented it in my diary area, and instead of retreading that in a more polished form, I'm going to discuss the current script, what I like, what I don't, and where I plan on going from here.
/*jslint node: true */
(function () {
'use strict';
var blogpostRead,
readBlogFile,
indexGenerate,
$ = require('cheerio'),
path = require('path'),
fs = require('fs');
indexGenerate = function (template, blogDIV, indexPath) {
fs.readFile(template, 'utf-8', function (err, data) {
var indexHTML;
if (err) {
return console.trace(err);
}
indexHTML = $(data);
$('#content', indexHTML).html(blogDIV);
fs.writeFile(indexPath, indexHTML, 'utf-8', function (err) {
if (err) {
console.trace(err);
}
});
});
};
readBlogFile = function (fullpath, callback) {
fs.readFile(fullpath, 'utf-8', function (err, data) {
var blogHTML,
title,
idRemove;
if (err) {
return console.trace(err);
}
blogHTML = $(data);
title = blogHTML.find('h1').text().trim();
blogHTML.find('h1').html(
'\n <a href="' + path.basename(fullpath) + '">\n'
+ ' ' + title + '</a>\n'
+ ' '
);
idRemove = function () {
if ($(this).attr('id')) {
$(this).removeAttr('id');
}
$(this).children().each(idRemove);
};
blogHTML.find('.blogpost').each(idRemove);
callback(blogHTML.find('#content,#temp').html());
});
};
blogpostRead = function (area) {
var database;
database = path.join('database', area + '.txt');
fs.readFile(database, 'utf-8', function (err, data) {
var filenames,
blogs,
count;
if (err) {
return console.trace(err);
}
filenames = data.split('\n').filter(function (filename) {
return filename !== '';
});
blogs = [];
count = 0;
filenames.forEach(function (filename, index) {
var fullpath,
template,
indexPath;
fullpath = path.join('public', area, filename);
readBlogFile(fullpath, function (blogHTML) {
blogs[filenames.length - index - 1] = blogHTML;
count += 1;
if (count === filenames.length) {
template = path.join('templates', area + '.html');
indexPath = path.join('public', area, 'index.html');
indexGenerate(template, blogs.join(''), indexPath);
}
});
});
});
};
blogpostRead('blog');
blogpostRead('diary');
}());
Okay, so the main, anonymous function defines some functions and calls blogpostRead for "blog" and "diary".
blogpostRead = function (area) {
var database;
database = path.join('database', area + '.txt');
fs.readFile(database, 'utf-8', function (err, data) {
var filenames,
blogs,
count;
if (err) {
return console.trace(err);
}
filenames = data.split('\n').filter(function (filename) {
return filename !== '';
});
blogs = [];
count = 0;
filenames.forEach(function (filename, index) {
var fullpath,
template,
indexPath;
fullpath = path.join('public', area, filename);
readBlogFile(fullpath, function (blogHTML) {
blogs[filenames.length - index - 1] = blogHTML;
count += 1;
if (count === filenames.length) {
template = path.join('templates', area + '.html');
indexPath = path.join('public', area, 'index.html');
indexGenerate(template, blogs.join(''), indexPath);
}
});
});
});
};
Blogpost read should maybe be called "postsRead", as it could be either a blog post, or a diary post, and it's grabbing all published posts.
This function reads the database file of interest, makes an array of filenames from it (the database file is a list of filenames in published chronological order). From there the array forEach function is used to iterate through the array aynchronously knowing the filename and index value. It is here where readBlogFile is called with the fullpath, and a callback function fed in.
The callback function is fed the file's blog html (the div with the "blogpost" class), and that html is placed at the opposite index location of the blogs array as its filename index.
....
That's a mistake. It's much better to construct the array in the same order as the filenames array, and reverse it later and when the reverse order is desired.
Anyways, this callback counts how many times it has been called, and if it has been called for every file in the filenames array, the blogs array is complete and the indexGenerator function is called.
It actually might be better to feed the indexGenerator function as input to this function, but I'm still mulling that thought over.
Overall, I feel what the function is doing is pretty clear, and I feel I executed the callback setup into readBlogFile—which should be renamed readPostFile— pretty well. It reads well, and I think I'm getting the hang of knowing when to use anonymous functions.
readPostFile:
readPostFile = function (fullpath, callback) {
fs.readFile(fullpath, 'utf-8', function (err, data) {
var postHTML,
title,
idRemove;
if (err) {
return console.trace(err);
}
postHTML = $(data);
title = postHTML.find('h1').text().trim();
postHTML.find('h1').html(
'\n <a href="' + path.basename(fullpath) + '">\n'
+ ' ' + title + '</a>\n'
+ ' '
);
idRemove = function () {
if ($(this).attr('id')) {
$(this).removeAttr('id');
}
$(this).children().each(idRemove);
};
postHTML.find('.blogpost').each(idRemove);
callback(postHTML.find('#content,#temp').html());
});
};
Here is the code that grabs the post div html from the file. The post has a class "blogpost", which is always a div contained inside the div with an id attribute of "content". Grabbing the content html ended up being an easier, but less readable, means of getting all the html I wanted to transfer to the index file I was generating.
Further, I want each title (always the h1 tagged data) to be a link to the post file being copied, and so I reset the h1 html to be href'd to the post of interest. The whitespace is just so that it's nicely formatted, because I still think I may end up looking at the index.html files regularly.
The rest of the stuff this function does is to handle the special case that is Impress.js: The Beginning Draft. I do a lot of special things to make that a slide-show, and those special things need to be accounted for. 1) The blogpost is contained within a "temp" div, not a "content" one. 2) Each bit of text within the blog post is encased in an id'd div. IDs are troubling because they're supposed to be unique in each file, and the id's in that file were not very likely to stay unique across a large index.html. This code removes all id attributes within every "blogpost" div, to be extra careful.
I think this action is smart overall, as again, id's that I pick aren't necessarily likely to be unique. I can come up with a smarter solution later if necessary. This function ends by calling the fed-in callback with the expected post html.
This all eventually leads to indexGenerate being called:
indexGenerate = function (template, blogs, indexPath) {
fs.readFile(template, 'utf-8', function (err, data) {
var indexHTML;
if (err) {
return console.trace(err);
}
indexHTML = $(data);
$('#content', indexHTML).html(blogs.reverse().join(''));
fs.writeFile(indexPath, indexHTML, 'utf-8', function (err) {
if (err) {
console.trace(err);
}
});
});
};
This function takes a template html filename and a blogs array (should be renamed posts) to generate the appropriate index html to save to indexPath. The posts are reversed and joined by an empty string, and inserted into the "content" div of the template.
The template itself is just any given post with the content div empty. The only different between the diary and the blog template is that one says "Rory's Blog" and the other says "Rory's Diary".
Overall, I really like how this code turned out. It's fairly well-factored, and feels like fluent javascript. Though, I'm still far from a programmer who thinks in javascript.
Next, I want to have a publish script that will publish a file I feed to it based off the area I feed to it. Should be an easy addition. Then I'm going to need to work on making this all happen dynamically as a server feeding content to a browser, which shoudl probably start with making it so my site actually runs on node (it still runs in static nginx). I mean, locally it runs on node, but I'll need the changes I push from my chromebook to the site everybody sees to actually work on the site I push to. Meaning I'll need to do some proper setup stuff on my server.
It's been a while since I actually ssh'd there and did some stuff.
I really like how this post turned out. It's kinda a rubber-duck code reading and review. One really notable thing is that it's helping me reconsider my choice of variable names.
And if you're wondering what the script looks after this post's review:
/*jslint node: true */
(function () {
'use strict';
var postsRead,
readPostFile,
indexGenerate,
$ = require('cheerio'),
path = require('path'),
fs = require('fs');
indexGenerate = function (template, posts, indexPath) {
fs.readFile(template, 'utf-8', function (err, data) {
var indexHTML;
if (err) {
return console.trace(err);
}
indexHTML = $(data);
$('#content', indexHTML).html(posts.reverse().join(''));
fs.writeFile(indexPath, indexHTML, 'utf-8', function (err) {
if (err) {
console.trace(err);
}
});
});
};
readPostFile = function (fullpath, callback) {
fs.readFile(fullpath, 'utf-8', function (err, data) {
var postHTML,
title,
idRemove;
if (err) {
return console.trace(err);
}
postHTML = $(data);
title = postHTML.find('h1').text().trim();
postHTML.find('h1').html(
'\n <a href="' + path.basename(fullpath) + '">\n'
+ ' ' + title + '</a>\n'
+ ' '
);
idRemove = function () {
if ($(this).attr('id')) {
$(this).removeAttr('id');
}
$(this).children().each(idRemove);
};
postHTML.find('.blogpost').each(idRemove);
callback(postHTML.find('#content,#temp').html());
});
};
postsRead = function (area) {
var database;
database = path.join('database', area + '.txt');
fs.readFile(database, 'utf-8', function (err, data) {
var filenames,
posts,
count;
if (err) {
return console.trace(err);
}
filenames = data.split('\n').filter(function (filename) {
return filename !== '';
});
posts = [];
count = 0;
filenames.forEach(function (filename, index) {
var fullpath,
template,
indexPath;
fullpath = path.join('public', area, filename);
readPostFile(fullpath, function (postHTML) {
posts[index] = postHTML;
count += 1;
if (count === filenames.length) {
template = path.join('templates', area + '.html');
indexPath = path.join('public', area, 'index.html');
indexGenerate(template, posts, indexPath);
}
});
});
});
};
postsRead('blog');
postsRead('diary');
}());
I like the script, I like this post, I have a direction to go from here, and I like the general direction and speed of my iterations on this site.
Let's hope I can keep this momentum up.
Making Relative Links
04/11/15
So, I almost forgot that I still have references to local links as absolute paths (aka http://www.ksionda.me/blog/ instead of /blog/).
I got a findReplace script (though I could also just use sed for this, I'm trying to keep site modifications pure HTML5), so let's make unnecessary absolute path links relative..
First off, let's find all the posts that have such a link. I'm going to break my HTML5 focus and just use grep. Let's just count the total occurances.
$ grep -R '"http://ksionda.me\|"http://www.ksionda.me' public/
360
So, that's about 180 occurances, and 180 copies into the index.html files. Let's break this down by section. First, let's clean up the inprogress areas.
$ grep -R '"http://ksionda.me/blog\|"http://www.ksionda.me/blog' public/blog/inprogress/ | wc -l
0
All right, so nothing in my blog inprogress area is trying to point at anything in my blog area. Let's go ahead and findReplace all occurances of '"http://www.ksionda.me' and '"http://ksionda.me' to ''.
$ findReplace '"http://www.ksionda.me' '' public/blog/inprogress
$ findReplace '"http://ksionda.me' '' public/blog/inprogress
Oh, wait, that's wrong, should still have a '"' in there. This is why I committed before starting these changes.
$ git revert public/blog/inprogress
$ findReplace '"http://www.ksionda.me' '"' public/blog/inprogress
$ findReplace '"http://ksionda.me' '"' public/blog/inprogress
All right, absolute paths made relative in my blog inprogress area. Now, then, let's fix the blog area:
$ findReplace '"http://www.ksionda.me/blog/' '"' public/blog
$ findReplace '"http://ksionda.me/blog/' '"' public/blog
This makes each absolute link to a blog link from the blog area a basic relative link to that file instead.
$ findReplace '"http://www.ksionda.me' '"' public/blog
$ findReplace '"http://ksionda.me' '"' public/blog
This makes all other absolute links relative from the root of the server area (aka, from the public directory). This covers links to other parts of my site from the blog area.
There were lots of files changed with those last two commands.
Okay, where else do I reference ksionda.me explicitly?
$ grep -lR '"http://ksionda.me\|"http://www.ksionda.me' public/
public/diary/end_of_day_review_20150304.html
public/diary/inprogress/making_relative_links_150411.html
public/diary/end_of_day_log_20150306.html
public/diary/planning_20150305.html
public/diary/building_plan_20150307.html
public/diary/end_of_day_review_20150306.html
public/diary/end_of_day_review_20150223.html
public/diary/end_of_day_log_20150305.html
public/diary/building_planning_20150222.html
public/diary/planning_20150307.html
public/diary/end_of_day_log_20150223.html
public/diary/end_of_day_routine_20150304.html
public/diary/end_of_day_review_20150222.html
public/diary/implementing_pomodoro_with_my_blog.html
public/diary/blogging_brainstorming_20150223.html
public/diary/planning_20150306.html
public/diary/morning_plan_document_20150223.html
public/diary/log_20150222.html
public/diary/building_plan_20150306.html
public/diary/fiction_a_ramble_and_a_proposition.html
public/diary/end_of_day_routine_20150306.html
public/diary/end_of_day_review_20150303.html
public/diary/end_of_day_routine_20150305.html
public/diary/end_of_day_review_20150305.html
public/diary/building_pomodoro_plan_20150305.html
public/diary/review_20150307.html
public/diary/end_of_day_routine_20150307.html
public/diary/site_browsebar_modification_script_iterate.html
public/diary/planning_20150222.html
public/distracted/atwork.html
public/distracted/athome.html
Oh, look, this file gets flagged by that grep. That's only because I have the exact string it greps for... for obviouse reasons. The rest of the flagged files seem to all have the same cause of being flagged:
<link rel="stylesheet" href="http://www.ksionda.me/style.css">
Should be easily fixed by:
$ findReplace '"http://www.ksionda.me' '"' public/distracted public/diary/*.html
All right, I think I've properly fixed all the links! Hopefully I didn't break anything. Hooray for cleaning up my site! Woo!
Every Post Gets a Link
04/10/15
So, when I first started this blog, I was just adding on top of an index.html file. So, a lot of my first posts are only contained in there, not their own file.
I figure that fixing this with cheerio might actually be pretty easy. First, I need to find all the posts that don't have a link.
Let's start from scratch. It's a good learning experience. First, let's count all my blogposts again.
/*jslint node: true */
(function () {
"use strict";
var fs = require('fs'),
$ = require('cheerio');
fs.readFile('public/blog/index.html', 'utf-8', function (err, data) {
if (err) {
console.log(err);
}
console.log($('.blogpost', data).length);
});
}());
Output is:
$ node scripts/createLinks.js
247
From here, let's count all posts that don't have an tile link.
/*jslint node: true */
(function () {
"use strict";
var fs = require('fs'),
$ = require('cheerio');
fs.readFile('public/blog/index.html', 'utf-8', function (err, data) {
var noLinks;
if (err) {
console.log(err);
}
noLinks = $('.blogpost', data).not(function () {
if ($(this).find('h1 a').html()) {
return true;
}
return false;
});
console.log(noLinks.length);
});
}());
This gives me an output of:
$ node scripts/createLinks.js
21
I'm actually surprised it took more than 21 posts to start making individual links (I've manually made some links to some of the posts before when I started linking things).
From here, I need to create some files where I can save the html to make each post its own page. Let's make it in a test directory while I'm figuring stuff out (don't want to pollute the blog area with poorly constructed filenames or anything).
noLinks.each(function () {
var blogpost = $(this),
titleToFilename,
title,
filename;
titleToFilename = function (title) {
return 'test/'
+ title
.replace(/\ /g, '_')
.replace(/[()?:\.]/g, '')
.toLowerCase()
+ '.html';
};
title = blogpost.children('h1').text().trim();
console.log(title);
filename = titleToFilename(title);
console.log(filename);
console.log();
fs.writeFile(filename, '', 'utf-8', function (err) {
if (err) {
return console.log(err);
}
});
});
This code outputs:
$ node scripts/createLinks.js
Goal for Today: RSS Feed
test/goal_for_today_rss_feed.html
Things Looking Much Less Horrible
test/things_looking_much_less_horrible.html
Project of Focus: Making This Blog Look Better
test/project_of_focus_making_this_blog_look_better.html
What is Consciousness?
test/what_is_consciousness.html
Sick
test/sick.html
The Free Will Debate
test/the_free_will_debate.html
First Try At a Never-Ending Github Streak
test/first_try_at_a_never-ending_github_streak.html
Things Looking a Bit Better Around Here
test/things_looking_a_bit_better_around_here.html
Some More Specific Goals for This Blog
test/some_more_specific_goals_for_this_blog.html
Let's Try Making Things Prettier
test/let's_try_making_things_prettier.html
What is Your Job?
test/what_is_your_job.html
Parallel Growth
test/parallel_growth.html
Random Fiction: Which is the Dream?
test/random_fiction_which_is_the_dream.html
Site Change: Adding Dates (Manually)
test/site_change_adding_dates_manually.html
Sick Day
test/sick_day.html
The Walking Dead
test/the_walking_dead.html
Disruption
test/disruption.html
Everyday
test/everyday.html
Exercise PID Control
test/exercise_pid_control.html
Eventually....
test/eventually.html
The First Stone
test/the_first_stone.html
And if I check the test directory:
$ ls test/
disruption.html
eventually.html
everyday.html
exercise_pid_control.html
first_try_at_a_never-ending_github_streak.html
goal_for_today_rss_feed.html
let's_try_making_things_prettier.html
parallel_growth.html
project_of_focus_making_this_blog_look_better.html
random_fiction_which_is_the_dream.html
sick_day.html
sick.html
site_change_adding_dates_manually.html
some_more_specific_goals_for_this_blog.html
the_first_stone.html
the_free_will_debate.html
the_walking_dead.html
things_looking_a_bit_better_around_here.html
things_looking_much_less_horrible.html
what_is_consciousness.html
what_is_your_job.html
Yay! We'd be done now if those files weren't empty and if they were in the blog area and the index.html file html was updated to link to those files..
Let's make it so those files aren't empty and are in the blog area and that index.html links to those files.
Non-empty:
noLinks.each(function () {
var blogpost = $(this),
titleToFilename,
title,
filename,
blogData;
titleToFilename = function (title) {
return 'test/'
+ title
.replace(/\ /g, '_')
.replace(/[()?:\.]/g, '')
.toLowerCase()
+ '.html';
};
title = blogpost.children('h1').text().trim();
filename = titleToFilename(title);
blogData = '<html>\n'
+ ' <head>\n'
+ ' <title>\n'
+ ' ' + title + '\n'
+ ' </title>\n'
+ ' <link rel="stylesheet" href="/style.css">\n'
+ ' <link rel="stylesheet" href="style.css">\n'
+ ' </head>\n'
+ ' <body>\n'
+ ' <div id="browse_bar">'
+ browseBar.html()
+ '</div>\n'
+ ' <div id="content">\n'
+ ' <div class="blogpost">'
+ blogpost.html()
+ '</div>\n'
+ ' </div>\n'
+ ' </body>\n';
fs.writeFile(filename, blogData, 'utf-8', function (err) {
if (err) {
return console.log(err);
}
});
});
The files come out reading mostly like I wrote it by hand (except for the characters that are escaped for me that I didn't realize needed to be escaped). I had no idea that ' was a thing.
Updating the index file.... Actually, I realize while trying to do this that I need to restructure my code a bit to make it ridiculously easy to do this. And from there it's just a little change to make it so it's all saved to my blog area proper.
The final code:
/*jslint node: true */
(function () {
"use strict";
var fs = require('fs'),
cheerio = require('cheerio'),
indexPath = 'public/blog/index.html';
fs.readFile(indexPath, 'utf-8', function (err, data) {
var noLinks,
browseBar,
title,
filename,
$ = cheerio.load(data);
if (err) {
console.log(err);
}
title = function (blogpost) {
return blogpost.children('h1').text().trim();
};
filename = function (blogpost) {
return title(blogpost)
.replace(/\ /g, '_')
.replace(/[()?:\.]/g, '')
.toLowerCase()
+ '.html';
};
browseBar = $('#browse_bar');
noLinks = $('.blogpost').not(function () {
var blogpost = $(this);
if (blogpost.find('h1 a').html()) {
return true;
}
return false;
});
noLinks.each(function () {
var blogpost = $(this),
blogData,
path = require('path'),
blogpath;
blogData = '<html>\n'
+ ' <head>\n'
+ ' <title>\n'
+ ' ' + title + '\n'
+ ' </title>\n'
+ ' <link rel="stylesheet" href="/style.css">\n'
+ ' <link rel="stylesheet" href="style.css">\n'
+ ' </head>\n'
+ ' <body>\n'
+ ' <div id="browse_bar">'
+ browseBar.html()
+ '</div>\n'
+ ' <div id="content">\n'
+ ' <div class="blogpost">'
+ blogpost.html()
+ '</div>\n'
+ ' </div>\n'
+ ' </body>\n';
blogpost.children('h1').html(
'\n <a href="' + filename(blogpost) + '">\n'
+ ' ' + title(blogpost) + '</a>\n'
+ ' '
);
blogpath = path.join('public/blog', filename(blogpost));
fs.writeFile(blogpath, blogData, 'utf-8', function (e) {
if (e) {
return console.log(err);
}
});
});
fs.writeFile(indexPath, $.html(), 'utf-8', function (err) {
if (err) {
return console.log(err);
}
});
});
}());
So, after I've constructed the single blogpost html into blogData, I alter the html loaded into $ such that there's a link pointing to the file I'm about to create as the title of the post within the loaded index html. After all blogpost files are created, the index.html path is rewritten with the modified html. This rewrite also has the additional niceties of correcting any incorrect html I wrote the best cheerio knows how.
And just like that I've managed to make a script that makes working links to all the blogposts I had originally written within my blog's index.html.
Awesome.
Next time: save the order of my blog and diary posts into some sort of json file? From there, I can construct index.html from the files I have and said json file. Yeah, I think that sounds like a plan.
Also, I think this diary post is good enough to be a proper blogpost.
Reading and Reviews Delayed
04/09/15
So, after some deliberation, I've decided to keep working on site stuff while it still engages me. I am using it to guide my productivity, so work I do on it now may well unlock the efficiency to do more with the time I have.
This decision has the unfortunate side-effect of losing pace with my planned reading-rate for this year, and also means that any reviews I do write will be pushed back even farther. I think it's the right decision for me to make right now, though.
Every distinct accomplishment will get its own blog post, but work-in-progress stuff can be read will only slight delay from my diary area. I like this system, it more concretely sets up stuff as less polished and not-blog-posts, and gives me content to make a proper blog post later, which is also a review of what I've done and why.
Hopefully soon I'll have my sleep schedule under control and can put reading and review writing back into my schedule. It'll happen eventually, I just have to keep working at it.
Bus Productivity
04/08/15
These days, most of my freetime productivity is done on the bus. It makes sense, the only real distraction is paying attention to when I get off, and otherwise it's a long chunk of uninterrupted time that I can devote to what I desire. Further, there's no access to the Internet to distract me, so I must focus only on what I have available to me on my laptop, in my backpack, or in my brain.
What's available is still a large amount of stuff, but it isn't the limitless content that the Internet can provide. Further, when I get stuck, I'm more willing to find a temporary workaround, as I can't google my problem. I don't end up falling down a rabbit-hole of potential solutions. This usually ends up being for the best, as I learn a lot more from my temporary solutions than the solutions I find online.
I really like what bus travel has become for me. Its dual purpose makes it so I don't really mind when I have to wait for the bus for any given reason. The longer my travel time, the more time I have to work on things I normally can't give priority.
The only real downsides to working on the bus is that it cuts into what used to be my reading time. Which is actually a pretty big downside, as I quite value the reading I've managed to do this past year thanks in no small part to my bus-time reading. It is, however, a worthwhile sacrifice to replace reading with actual doing. It will become completely worth it when I've gained what I feel are actual accomplishments.
So, basically, starting to ride the bus has been a great decision. It's cheaper than a car, it's about as expensive as a bike, but because I'm not driving, my transportation time can be spent doing stuff I wanted to make time for anyways. It's a system that multitasks for me, and improves my time-efficiency overall.
I should develop more of such systems.
Personal System Iterate: Weekly Review Init
04/07/15
So, over the past week, in my diary area, I have been working on a script that interacts with my blogpost writings and... generates formatted html that will link to all of my posts since my last weekly review.
It's not a huge, amazing thing, but it is the building blocks to various powerful things, and it is also composed of smaller building blocks that helped me arrive there. It was also a successful breakdown of a project that would take me more than a few bus-rides such that I knew I was making progress each bus ride. Almost all development of this script was done during bus-rides. In fact, this post is right now being written on the bus. Basically, the bus is great for productivity, but that's maybe a post for later.
So, the idea was that I would write about what I was doing while I was doing it. This was valuable for several reasons:
- Rubber-duck debugging
- Detailing what I wanted to make
- Detailing what I was currently making
- Connecting the two together
It is now also valuable in the sense that as it turns out I like the posts that came out of this documentation-process, and now I have content that I can condense into a proper post on some javascript node scripting that I have accomplished.
Background
This site that you're reading is currently a bunch of strung-together html files. There's nothing much there beyond that. Being a programmer by trade, that feel kinda unacceptable to me. It's fine as a beginning sort of prototype, but I can do better, and I think it being better would allow me to do better stuff here and elsewhere.
I tried to fix this before, back when I was playing with python server tools, but I made the mistake of trying to do it all at once, getting lost and/or stuck, and giving up.
I've come to realize that breaking things down wasn't something I was ever particularly great at. That's something that school does for you a lot of the time, and being great at school thus meant I wasn't necessarily great at that. I'm getting there, however. It actually isn't that hard, I realize. It's a matter of looking at the big-picture, identifying a necessary piece, prototyping that piece in a hard-coded environment, verifying the validity and value of the piece, and iterating again from the beginning from there.
So, here, the big picture is that I want my site running on node, and for it to be as DRY as possible. Now, to a certain extent, I'm doing that for its own sake, because I think I can do better, but I believe learning to do this will open up pathways to ever-more-interesting adventures, and so I'm on this quest for the sake of emergent future quests, as well.
Which, as an aside, is totally something that people do in RPGs, so maybe I'm also gamifying my self-growth.
Anyways, as far as DRYness goes, I've made a findReplace script for the sake of grabbing all the places I have a browseBar (that thing that links to various bits of my site or things relating to me), and editing them to all more-or-less be uniform.
And now, for this post, I will elaborate on the development of a script that reads through my diary and my blog, and grabs all the posts since my last diary post titled "Weekly Review" (more info on what that is here).
Now, how exactly does this do either of my big-picture things? Well, it gets me more familiar with node, interacting with html server-side, manipulating it, and generating other html. I mean, the only thing really missing is actually serving the code to a browser. Also, manipulating the html is a step itself towards DRYness, as I can manipulate it into a DRY form at some point, and make sure that interactions all still work as I desire.
All right, without further ado, the development process and the code.
The Process
Going in, I had no idea how to even really start. I mean, at work I went line-by-line through my stuff in python, and just hacked something together based on various html properties, and how I organized it there-of.
This was obviously not sutiable, and I knew there'd be a better tools available to me via the wide-open Internet and the fact that node is made for this kinda stuff, so there best be tools for such interaction.
Finding the Tools and Testing the Waters
I didn't know how to go about what I wanted to do, but I had heard of an html parsing library called cheerio at the TucsonJS meetup. It has a jQuery API, and I figured this would be a great tool for my exact goals.
My first bit of code was basically a copy of readme example:
/*jslint node: true */
var cheerio = require('cheerio'),
$ = cheerio.load('<h2 class="title">Hello world</h2>');
And thus began my growing familiarity with cheerio.
Loading in an HTML File
This was an obvious next-step. I needed to actually interact with my files, so I needed to feed it into cheerio somehow.
/*jslint node: true */
(function () {
"use strict";
var args = process.argv.slice(2),
fs = require('fs'),
cheerio = require('cheerio'),
$,
usage;
usage = function () {
console.log("Need a single input HTML file to read.");
};
if (args.length !== 1) {
return usage();
}
fs.readFile(args[0], "utf-8", function (err, data) {
if (err) {
return usage();
}
$ = cheerio.load(data);
console.log($.html());
});
}());
I made it so I could feed in any file as a command-line argument, and basically just print the file out. But that I got that from a $.html() implies I can get anything that $ is willing to give me.
For instance:
fs.readFile(args[0], "utf-8", function (err, data) {
if (err) {
return usage();
}
$ = cheerio.load(data);
console.log($('.blogpost').length);
});
This grabs all my blogposts (marked by the class="blogpost" on all of my blogpost divs), and prints out their length. When I first made this, the ouput was:
$ node blogpost.js public/blog/index.html
239
This was verified correct at the time, and already showed me that I could get a variety of value out of using this cheerio library.
Working Towards Use
All right, it was around here I had some trouble and really needed to read the documentation. All I wanted to do was printout the title and the date of each blogpost since my last weekly review, but I was unsure of how to only grab the h1 and h2 text within each blogpost div (h1 contains the title and h2 the date).
I also didn't know how to remove whitespace. I ended up hacking things together.
$ = cheerio.load(data, {
normalizeWhitespace: true
});
blogposts = [];
$('.blogpost').each(function (index) {
var that = this,
validPost = function () {
if (date && $(that).children("h2").text().search(date) === -1) {
return false;
}
if (!date) {
if ($(that).children("h1").text().replace(/\ /g,'') === "WeeklyReview") {
date = $(that).children("h2").text();
}
}
return true;
};
if (validPost()) {
return blogposts[index] = $(this).children("h1,h2").text();
}
return false;
});
console.log(blogposts.join('\n'));
At the time the code output:
$ node blogpost.js ../public/diary/index.html
Plan Document 04/01/15
Log 04/01/15
Personal System Iterate: Weekly Review Init 04/01/15
Plan Document 04/01/15
Log 03/31/15
End of Day Review 03/31/15
End of Day Routine 03/31/15
Personal System Iterate: Weekly Review Init 03/31/15
Plan Document 03/31/15
Plan Document 03/30/15
End of Day Review 03/30/15
Weekly Review 03/30/15
UA Game Dev Club Meeting 03/30/15
Plan Document 03/30/15
Again, at the time this was the correct answer. But it was a struggle to get this together, and now that I had it, some organization was necessary.
Clean Up
Hacking something that works was good, trying to go any further without cleaning up after myself would have been a mistake, and I successfully avoided that very mistake. And so I cleaned up a bit:
$('.blogpost').each(function (index) {
var blogpost = this,
whitespace = /\ /g,
valid,
date,
title;
title = function (blogpost) {
return $(blogpost).children('h1').text();
};
date = function (blogpost) {
return $(blogpost).children('h2').text();
};
valid = function () {
if (earliestDate && date(blogpost).search(earliestDate) === -1) {
return false;
}
if (!earliestDate) {
if (title(blogpost).replace(whitespace, '') === 'WeeklyReview') {
earliestDate = date(blogpost);
}
}
return true;
};
if (valid()) {
blogposts[index] = $(blogpost).children('h1,h2').text();
return;
}
return false;
});
And the code feels more readable now, no? Still hacking away the whitespace with a regex statement, but I don't know better yet. But seeing the code made me think of how I may go about also grabbing the link to each blogpost, a necessary part of linking to each blog post since the last weekly review.
After a few false starts, I found what I was looking for and modified the necessary bits of code:
if (valid()) {
blogposts[index] = (
$(blogpost).children('h1,h2').text()
+ $(blogpost).find('a').attr('href')
);
return;
}
Which spits out:
$ node blogpost.js ../public/diary/index.html
Plan Document 03/30/15 plan_document_150330.html
UA Game Dev Club Meeting 03/30/15 gamedevclub_150330.html
Weekly Review 03/30/15 weekly_review_150330.html
End of Day Review 03/30/15 end_of_day_review_150330.html
Plan Document 03/30/15 log_150330.html
Plan Document 03/31/15 plan_document_150331.html
Personal System Iterate: Weekly Review Init 03/31/15 personal_system_iterate_weekly_review_init_150331.html
End of Day Routine 03/31/15 end_of_day_routine_150331.html
End of Day Review 03/31/15 end_of_day_review_150331.html
Log 03/31/15 log_150331.html
Plan Document 04/01/15 plan_document_150401.html
Personal System Iterate: Weekly Review Init 04/01/15 personal_system_iterate_weekly_review_init_150401.html
Log 04/01/15 log_150401.html
Plan Document 04/02/15 plan_document_150402.html
Personal System Iterate: Weekly Review Init 04/02/15 personal_system_iterate_weekly_review_init_150402.html
Log 04/01/15 log_150402.html
Plan Document 04/03/15 plan_document_150403.html
And at this point I figured I knew everything I needed to really make what I wanted. Which meant one thing.
Starting Over
I had made my prototype to prove I could do what I wanted. It was built out of exploration and that structure was not necessarily ideal, just emergent. Starting over lets me rethink the structure of my code from a design focus, not an exploratory one.
/*jslint node: true */
(function () {
'use strict';
var fs = require('fs'),
$ = require('cheerio'),
before,
linkText,
last,
date,
title;
date = function (blogpost) {
return blogpost.children('h2').text().trim();
};
title = function (blogpost) {
return blogpost.children('h1').text().trim();
};
linkText = function (postList) {
return function () {
var link,
blogpost = $(this);
link = function (blogpost) {
var ahref = blogpost.find('h1 a').attr('href');
if (ahref) {
return ahref.trim();
}
return '';
};
postList.push(
'<h3>\n <a href="'
+ link(blogpost)
+ '">\n '
+ title(blogpost)
+ '('
+ date(blogpost)
+ ')'
+ '</a>\n</h3>'
);
};
};
before = function (givenDate) {
var compareDates,
givenMonthDayYear;
givenMonthDayYear = givenDate.split('/');
compareDates = function (date) {
var monthDayYear = date.split('/');
if (monthDayYear[2] !== givenMonthDayYear[2]) {
// Compare years
return monthDayYear[2] < givenMonthDayYear[2];
}
if (monthDayYear[0] !== givenMonthDayYear[0]) {
// Compare months
return monthDayYear[0] < givenMonthDayYear[0];
}
if (monthDayYear[1] !== givenMonthDayYear[1]) {
// Compare days
return monthDayYear[1] < givenMonthDayYear[1];
}
// Default compare strings
return date < givenDate;
};
return function () {
var blogpost = $(this);
return compareDates(date(blogpost));
};
};
last = function (blogposts) {
return date($(blogposts.get(0)));
};
fs.readFile('public/diary/index.html', 'utf-8', function (err, data) {
var diaryPost = [],
weeklyReviews;
if (err) {
return;
}
weeklyReviews = $('.blogpost', data)
.filter(function () {
var blogpost = $(this);
return title(blogpost) === 'Weekly Review';
});
// Just this once, I want the weekly review before last
// This is a quick hack that filters out the most-recent weekly review
weeklyReviews = $(weeklyReviews).slice(1);
$('.blogpost', data)
.not(before(last(weeklyReviews)))
.each(linkText(diaryPost));
fs.readFile('public/blog/index.html', 'utf-8', function (err, data) {
if (err) {
return;
}
$('.blogpost', data)
.not(before(last(weeklyReviews)))
.each(linkText(diaryPost));
console.log(diaryPost.reverse().join('\n'));
});
});
}());
And here is the code I currently use. Not really complete, but it has the major functionality that I desire. I finally discovered the trim function, the built-in whitespace remover for javascript. I actually really like how a lot of the code reads. In particular:
$('.blogpost', data)
.not(before(last(weeklyReviews)))
.each(linkText(diaryPost));
Writes exactly what it does.
Now, looking at it again, I don't like a lot either, but they're all contained in stand-alone functions that I can clean-up without having to touch other code. For example, the before function is a little convoluted and could be executed better. How I call the code, however, I like plenty, and it makes those pieces more-or-less properly self-documenting.
Looking Towards the Future
I like the script I got out of this experience, and I feel I've learned a lot that will help in the development of future scripts that will slowly transform my site to my liking.
I think the next thing I'll do is make a script that finds all those blogposts that didn't get their own links early on, and generate the html necessary such that they have a link, and that link leads to the proper post.
I think with my current understanding and capabilities, I should be able to pump out that script quickly.
We'll see.
Diary Reposts
04/06/15
So, my diary has been capturing some interesting stuff with cheerio and general site manipulation stuff. I find it pretty exciting. I also think it's pretty likely that I'll mine my diary from time-to-time for blog posts. I'm thinking I'll clean the posts up a bit, and merge various posts together, but once I accomplish something, it'll probably be good to actually blog about it.
I probably have a ways to go before my site iteration stuff is done. Especially since I'm beginning to feel that "done" is when the site is running on node, the posts are in a database, and the blog and diary home areas are constructed dynamically. Though, I'll probably switch tasks after my weekly review init'er is built and usable for my purposes. I have reviews to write, and just other stuff I want to invest some of my time into.
Maybe I should consider publish a proper blogpost of my progress at significant milestones. The next milestone being that weekly review init'er.
Still, really liking having a public area where I basically keep rough notes of what I'm trying to accomplish and why. I feel, if anything, stuff like that may be useful to people who, like me, want to build the capability to be self-motivated. I find that even with a short bus ride to work or the short bus ride home, I'm still able to make baby-steps towards my extra-curricular goals.
Vim: Tags
04/05/15
I have been using vim tags at work for a while now, and so I'm kinda surprised I haven't written a post about it yet.
Frankly, vim tags are awesome and so is cscope. I'm sure there are tools that set it up for any given language, but right now I've only used them in C/C++.
Wondering where a variable or function you're reading is defined?
Highlight the vim cursor on it and press
crtl-]
and vim will provide a list of places it thinks it's defined.
Personally, I don't like the default interface for the list that shows up. From what I've read, it's possible to change it, but I haven't dug into that yet. Maybe I'll get to it another post.
Anyways, vim will take you to the place it thinks it's defined, and
you can read/modify code there to your liking. When finishing, just
press
crtl-t
and you'll be back in the previous file where you left off.
This is really useful for debugging and also adding code to a hierachy structure of some sort.
Next time, I'll talk about how I use vim tags in conjunction with cscope, and maybe I'll finally do some thinking about making using cscope and vim tags a little bit less painful.
CSS Digging Deeper
04/04/15
One of the things that excites me about impress.js is that it's styled with CSS. I mean, look around, my CSS is greatly lacking. I felt the need to address it for a while, but felt generally ignorant about how to go about even starting. Googling about learning to style wasn't particularly helpful. Now, hoever, I have slowly amassed some resources that I feel will help me on my journey.
First, reading through the impress.js source gave some insight into certain practices and linked to some good stuff like resetting and HTML5 slides.
Next, I subscribed to a weekly CSS newsletter, which should provide plenty of good content. That newsletter had some recommended people to follow on Twitter, so I went ahead and did that. This is actually a pretty valuable step, following a bunch of javascript-related accounts eventually linked me to some articles and tutorials that led to some node code that I actually use. I feel the same will happen with CSS.
So, now it's a matter of thinking about what I want to do that requires CSS, what subset of that is something I can do now, with my current knowledge, and keeping an eye out for good resources that unlock more capability a bit at a time.
What I want to do is make my website look better. Or, at least to make it look different again and again until I find out how I want to make it look. Something I can do now is make a stylesheet from scratch for this site. Maybe start by going to some sites I like to go to, seeing how they place things, and trying to copy what they do.
It's a good thing I have this site under version control now. It'll be interesting to look back on it in a year. I have a feeling lots is going to be different.
Javascript: Cheerio and the Return of jQuery
04/03/15
So, I'm working on tools to improve my organizational system, which is my website. I really like that I made this decision, because it means I'm making tools for my website. The one I'm currently working on is parsing through my blogposts so I can pull out a set of them for any reason. The current reason is to grab all posts since the day of my last weekly review, and automatically set up a list of headers that link to each post for commentary purposes.
So, I could hack something together that does this (like I did at work with python), or I could use a javascript library that reads html documents. Enter Cheerio, a node library that gives the user a jQuery-like API to interact with input html. This is the best-supported of such a node library that I know of, so I suppose it is time to readopt jQuery into my toolkit. I mean, I could still go pure javascript on the browser-side, but that would mean I interacted with the html differently on different sides of the browser. I don't have to worry about jQuery being slower or using more bandwidth or whatever, as those problems don't affect me, yet. Might as well use the same syntax on both sides of the Internet.
And so returns jQuery, something I abandoned because I felt I used it for no reason. Which, I mean, maybe was a flimsy reason to abandon it, but now I have a reason, and have been using javascript for a while and may better appreciate the things that jQuery does.
Let's see where this goes.
Cheerio.
Training Everyday Plan
04/02/15
This blog is me writing everyday. Not being a professional writer, and having little experience, that's actually good training. Writing everyday itself is going to teach me a lot about how to execute various writing techniques:
- Knowing what I want to say
- Communicating it effectively
- Communicating it in an engaging manner
Now, writing everyday won't improve my writing forever. It's sort've like running everyday. Yeah, at first, running everyday was a great way to get faster at running, but then I need to focus on correct breathing technique, recovery/hard run alternating, and building the right muscles. After the initial "just run everyday" training, I eventually plateaued and needed to train differently. Now, I wonder if doing all of those above things earlier, while just running everyday was useful, would have been better. I don't think it would've been. Part of it is I wouldn't have seen the value of it without the initial training, and the other part is that the running itself would tire me out enough.
And so the same goes for this blog. I am not yet at the level I wish to be with writing or self-discipline, and I still think I gain a lot out of writing everyday, but it is about time to start adding different writing exercises to my routine.
Further, I have decided that I will maintain the "blog everyday" until the end of the year. After that, I believe I'll want to train a different skill everyday in the hopes of it being of value to me. I think there's a lot of value and feedback in the everyday, don't-break-the-chain sort of strategy, but I think that that value only lasts through a certain level of inexperience, and then one's strategies need to evolve to further get better.
Iterating My System
04/01/15
Oh, yeah, today's the April Fool's post.... Should I do a prank. I'm not really prepared to do a prank. The only things I can think of are possibly mean and probably not funny. Maybe next year. It's something I'll think about.
Anyways, as fro the post I planned: iterating my system. I've decided to devote the week towards my productivity system and trying to address certain things that keep me from working on what I want to work on or what I plan to work on.
One priority is making my weekly review faster to do, while still getting the most out of it. I think a nice step in this direction would be a script that grabs all my blogposts based on some criteria. At first, I'd use the criteria of "since last weekly review", as I want to review all posts since then. But I may also want to start slowly reading my blog from its inception, and so being able to grab ten posts at a time would be useful.
This script would also be a good next step to making it so the main Blog and Diary areas don't just load all posts from their inception, but instead load a bit at a time.
Getting through parts of my weekly review faster means doing more of my weekly review each week. I have yet to transfer my long-term projects, action items, or someday/maybes from my old system. Part of that is that my new system doesn't have a good place for any of that.
That's going to be another priority of this week, making a place for all the things I've noticed needing but didn't make priority to make:
- Actions List
- Long-term Projects
- Someday/Maybe
- Waiting
- Proper guidelines/reminders in place to check these things
Further, I need to make it so that if I can't fit it all in one day, that I should make time for certain pieces throughout the week. This week will be good practice for that, because I didn't finish even the usual stuff last weekly review, for either work or home.
Maintenance may be expensive but my limited experience with it thus far has taught me its worth the investment. It makes my productive time that much more productive and me that much more confident that I'm prioritizing the right things.
I'm hoping a better designed system will be faster to execute, but I'd also be happy if it captured more thinking and kept my brain emptier and better able to focus on what I want to get done.
FindReplace.js is Back
03/31/15
So, the findReplace node.js script I had made and lost has been remade. It is now much better than it was before, because I think I'm coding a bit more functionally. Anyways, I have used it to make it so every single post on this here site that has that browse bar in it uses the exact same browse bar. I will probably also make all internal links server agnositc (take away the "" part of the link).
I think the ability to change every browse-bar setup with the use of this script is a good step towards DRYing up my site. A next step would be to have this setup running on node again. After that, I need to figure out how to use templates, or if that's not the right word, putting a single line of html that would be replaced with the browse bar setup that's defined in only one area.
Again, I'm actually kinda glad I lost my first setup. Building on top of what I've already made is a good skill to have, for sure, but I got to learn to build with something better than sand before I can really have any chance of that happening.
Prototyping and starting over is something I need to be more comfortable with. I'm glad I got over my avoidance "doing it wrong", though, as doing something is better than overthinking how to do it right. Which is totally what I used to do.
I'm also okay about the other stuff I lost, my TODO list copy of an online tutorial (which I wanted to turn into a "Getting Things Done" app, and the beginnings of a kanji flashcard system that was a copy of a different online tutorial. I can do a better job starting with something I use instead of thinking of how I can make it generally usable to a wide audience. I'll do that like I do this blog, with things as static and hard-coded as necessary to make getting to the valuable stuff easy. Once scaling is valuable, then I'll work on that.
Modular Development Environment
03/30/15
I don't really like IDEs. Xcode, Eclipse, Spyder, Light-Table....
These are a few of the IDEs I have tried. There are aspects of them I really appreciate, but something always annoys me about them and I end up abandoning the whole thing. A big part of it is that I want to control the screen setup somewhat finely, and most of the time what I need is some indivual aspect to be full-screen and then have access to the other stuff very quickly when desired.
Light-Table approximates this pretty closely, but I feel what it provides isn't a signficant leap from using vim and various command-line tools. And at this point, the ability to plug-in any miscellaneous command-line tool into my development work-flow is approaching triviality. IDEs do so much for the user that a simple hack to do any arbitrary thing usually is non-trivial.
In vim, I can capture a hacky way to do something while I'm doing it. I can save those keystrokes as a string just by pasting the register I assigned it to, and I can think of whether or not I want it to be prettier or better-thought-out once it has proved its usefulness.
Anything vim can't do, I have the whole of linux's available shell commands to use. It is also trivial to call these things from vim. Anything these scripts don't explicitly do for me, I can impolement myself fairly easily in most any language I choose and plug that into vim like any other script.
And so I have this modular development environment that can be hacked together to fit my needs, and refined to something better designed when such improvement is necessary. This is not an IDE, though, it's what I like to think of as an MDE, "Modular Development Environment".
I would like something that was explicitly an MDE. I googled it, though, and nothing particularly interesting showed up. Now, I'm not particularly interested in abandoning my setup, but the reason I like my set up makes trying IDEs painful for me, and as such my interaction with the wider variety of tools is sorely lacking. Which, to me, means that my perspective is probably quite limited.
I should probably work with some IDEs to develop an idea of the things that's missing in my development environment, and more what I would want out of an MDE as I contrast my system to the tradional IDEs.
Impress.js: The Beginning Draft
03/29/15
UA Game Jam!
03/28/15
By the time of this post, UA Game Jam will have started! The theme? Farm. It's a good theme. In the gaming world it has multiple meanings. Good job, Helen and Dylan for coming up with a good theme for this semester's Game Jam.
Having known the theme in advance, I can not compete in this semester's game jam like last semester. But that's okay, I will still work on game stuff, and the best way to do that is to make a game prototype.
What am I thinking of right now? I really want to try to make a game about making games. Like, for real games. Basically, make an IDE for making games that is itself designed like a game. I'm thinking for a beginning prototype it can be an impress.js presentation with potential for high interactivity but really only showing off specific prototypes and tech demos I make throughout game jam.
In the long run, I'd like the presentation to have a large variety of HTML5 library options, with lots of real problems being attempted to be solved in each one and one of the user's choosing. But right now? Crafty. And maybe also impress.js, considering it'll be running on that.
A means of interactively documentation my game creation would be incredibly valuable, though. I could define my knowledge-space and explore that definition to expand it. I'm not exactly sure the best way to go about that, but an interactive slide seems like a good start.
If I could really get a prototype going for this, I think it will truly lead to something magnificient. A real, expandable game-making game is a self-seeing lens that could improve itself. Add some layer of multiplayer to it, and one could gamify the collaboration of making games. Aka, of doing work. The games could be about anything: real work, real problems, plain entertainment....
Gamification is still in its infancy. A lot of what I see is adding skinner-boxes to currently enmeshed systems. I'm interested in a system where players create real value that is a well-designed game.
I know isolated examples exist already, but I think a game about making such systems could result in an exponential explosion of well-defined systems that do their job well. Constantly iterated, evaluated, poked, prodded, exploited, and patched.
I need to start with something.
Functional Javascript?
03/27/15
So, I went to a TucsonJS meetup last week, and the talk was titled Functional Javascript.
Programming functionally isn't something I'm particularly familiar with, but I did read Learn You a Haskell For Great Good and it introduced those concepts fairly well. I think. I can't really be sure because I didn't start using those concepts after learning them.
Anyways, I bring this up now because I recently started working on making a find/replace script in node javascript. I had a "working" script before but I accidentally destroyed it and a lot of other scripts when I fed it the wrong arguments.
While rewriting it something clicked in my head. I didn't need to check the state of variables, I could just attempt to use a variable one way and if it failed, use it some default way. Last time I wrote this script, I would check if the file input was a directory, and if it was, I would iterate through each item in the directory and check for file or directory status, and then go through each file and find/replace the input find/replace strings, and so on and so forth. This time, I just fed the paths into fs.readdir and fs.readFile and just return if an error occurred.
recursiveDirectory = function (fullpath) {
fs.readdir(fullpath, function (err, dirlist) {
if (err) {
return;
}
dirlist.forEach(function (base) {
var path = require("path"),
newPath = path.join(fullpath, base);
recursiveDirectory(newPath);
});
});
fs.readFile(fullpath, "utf-8", function (err, data) {
if (err) {
return;
}
console.log(fullpath);
console.log(data);
});
};
Basically, I let a type error happen without there actually being types, and then would just pretend the function wasn't called. Which kinda feels like a javascript way of doing a haskell-like thing, but my javascript is still in its infancy and my haskell hasn't even been born yet.
Anyways, this ended up being much cleaner and easier to debug code. I always thought verifying variables was better than letting errors happen, but I suppose it's true that sometimes "it's easier to ask for forgiveness than for permission". And in this case, as it should be, the easy thing is right.
I hope.
Vim: Functions
03/26/15
So, last time I talked about vi in the command-line. This time let's talk about vimscript functions. Well, let's talk about my limited understanding of vimscript functions, as there's still a lot for me to figure out.
A vimscript function is easy enough to define, here's an empty function:
:function Noop()
:endfunction
And if you're some crazy person who wants their function to do something:
:function Hello()
: echom "Hello!"
:endfunction
And with this function defined I can
:call Hello()
And sure enough, I'll get a little hello at the bottom of my vim screen.
Anyways, there were two functions that I wanted:
- A function to resource my vimrcs
- A function to open the ftplugin vimrc for the current filetype I was editing
This was pretty easy, actually!
:function SourceFtpluginFiletype()
: let sourceFile = '/home/silentk/.vim/ftplugin/' . &filetype . '.vim'
: if filereadable(sourceFile)
: execute 'source ' . sourceFile
: endif
:endfunction
:function SplitFtpluginFiletype()
: let sourceFile = '/home/silentk/.vim/ftplugin/' . &filetype . '.vim'
: execute 'sp ' . sourceFile
:endfunction
Now, this isn't perfectly setup just yet, as I couldn't figure out how to have vim expand '~' to /home/$USER so that I didn't have to hardcode the user (my username changes quite a bit, you see, whereas my vim setup is as close to static as I can get it). But right now, this works on my chrome setup quite nicely, and I can use what I've learned about macros and what I know about nmap to make these function calls easier.
nmap <C-j> <C-w>j:call SourceFtpluginFiletype()<CR>
nmap <C-k> <C-w>k:call SourceFtpluginFiletype()<CR>
nmap <C-h> <C-w>h:call SourceFtpluginFiletype()<CR>
nmap <C-l> <C-w>l:call SourceFtpluginFiletype()<CR>
The above makes it so when I jump between files in vimsplit, my ftplugin for the filetype I'm switching to is loaded. This actually isn't done automatically for switching between files in vimsplit, though it is done when opening a new file for vimsplit.
let @n = ":call SplitFtpluginFiletype()\<CR>\<C-w>"
And this makes it so I call my Split function with a simple '@n'.
Adding functions to my vim toolkit is really going to add a lot of power to my editing speed and capabilities. It's also revealing a lot of my ignorance on vimscript and how to do things that come quite naturally to me in other languages.
Next post? Unravelling some confusions I have about various things.
Frozen Shouldn't Have a Bad Guy
03/25/15
So, I like the movie Frozen quite a bit. It's a good Disney movie that subverts a lot of the old Disney tropes to good effect. Unfortunately, it seems to have gotten that way due to rewrites, and those rewrites decided to make the traditional hero of these stories a villain.
Now, don't get me wrong, it's a perfectly valid twist on an old, old Disney trope, but literally nothing set up this twist. He was, by all accounts, a perfectly awesome person up until he refused to kiss Anna. Seriously, he did only things a respectable person would do, even when he was more-or-less alone, up until he revealed himself to be selfish and looking to get his own kingdom.
To me, it would've been much better if they had attempted the kiss, nothing happened, because they weren't truly in love, and then he came to the conclusion that only killing Elsa would save her. Because, you know, they aren't romantically in love, but Anna may just be his first friend. They have a lot in common, afterall. They'd probably be perfectly legitimate friends. They're just not in love, and not knowing the difference confused them.
It wouldn't have to be spelt out like that, it could have just been a subtle nod in that direction. I mean, there really isn't enough of male and female characters that are more-or-less main characters, that decide they're friends. I feel it would have been a much better twist on the traditional hero than making him the villain.
But, you know, I'm weird. I've told others this and their response was, "It's also good to show that a person who seems completely likable is actually dishonest and selfish." And to be fair, that's a good point.
At least he didn't suddenly become ugly after his evil side was revealed.
Magical Mundane
03/24/15
There have so far been two really interesting, really fun pieces of entertainment I have consumed that start off with something magical being applied to a mundane thing.
The first is an anime called, "The Devil is a Part-Timer", in which Satan is transported from a medieval world where he is real to the real world of Tokyo, and becomes an part-time employee at a MgRonald's fast-food restaurant.
The second is a Korean webcomic called, "The Gamer" where a high-school student finds that his life has gained RPG-esque properties:
- A GUI
- Experience and Levels
- Stats
- Quests (chores, homework)
- Notifications
Both concepts are so interesting to me. Both stories ended up going in more magical directions than I was hoping. The Devil is a Part-Timer ended up having epic fights and situations where the devil could transform from his now-human self into his old, powerful self.
The first few episodes had the devil living a normal life as a broke person living in Japan... and it was hilarious. He took his new, dead-end, part-time job super seriously and worked hard to get promoted. He clearly loved his new, unglamourous life, but still had the attitude of a charismatic and tough, "evil" overlord.
And then other supernatural entities found their way to the normal world, and there was super-powered battles and such. Now, don't get me wrong, it was super entertaining and still pretty neat, and well executed, but it lacked that subtlety and that perspective it had of a once-magical being now in a completely ordinary setting. The mundane became a side-show to the main attraction of supernatural forces colliding.
With "The Gamer", a strange magical thing applied itself to a normal person with a normal life. It did not really have any direct change on his life, though, and was not noticed by other people, expect for his changing actions.
But this magic addition was quickly explained and accompanied by the introduction of a huge magical world, and instead of a story of a normal person gaining a game-interface to the real world, it became the story of a normal person gaining a game-interface to a very game-like world.
Again, it's still an interesting, hilarious, fun-filled, and action-packed adventure with an interesting gimmick for the main character, but now all these other magical aspects of this fictional world are coming into play and interacting with his interesting ability, making his condition seem less strange or amazing or otherwise interesting. He is a person with a physics-defying ability in a world full of people with physics-defying abilities.
And so I wonder how different these series would be if that had their beginning concepts, but added nothing else magical or otherwise unordinary. Just this limited magic coming into contact with a very real world. Could such limited fantasy in fact be much more magical? What might we realize about the real world from such magical perspectives?
I want to find out.
Death Note Fanfic Outline
03/23/15
Spoilers for Death Note will follow.
Do fan rewrites or adaptations count as fanfic? Because that's what I want to make when it comes to Death Note.
Death Note is a really interesting manga. The anime adaptation is also really good. Usually, I can't stand the slowness of anime adaptations compared to manga, but it really fits the tone of Death Note, it really adds to the tension.
But that's not the point of this post. Although I really enjoy Death Note, I feel it has considerable weaknesses that I would like to attempt to correct. Being an inexperienced storyteller, chances of success are low, but trying is how I gain experience, I think.
Anyways, the problems with Death Note are:
- Really boring amnesia arc
- Poorly executed final encouters
- Some poor scenes post-L
The amnesia arc is the worst offender. It pulls all sorts of cheating so that Light can once again look like he isn't Kira. Now, the arc has some redeemable qualities, like showing Light's honest personality pre-Death Note, but really that's making up for a lack of showing the transition from pre-Death Note to post-Death Note when that transition was happening.
Also, being the kind of person I am, I freaking love three-way battles, which adding the business-person Kira helped to achieve. Unfortunately, he was a weak third player, and Light and L teaming up to catch him just made it so completely one-sided, it was ridiculous.
So, one of the more important things I would do in my adaptation of Death Note is make business-person Kira a separate Kira not created by Light, whom exists much earlier on. In fact, she (could be a she this time, the character will be completely different) would be the deciding factor in the Light vs. L battle.
This is a part of showing Light's transition from pre- to post-Death Note. Part of the problem is the time-skip that is fairly necessary, but it just shows him being all "I'll be God of the new world." I mean, I think that it's fine for him to have this attitude, I just think the transition could be a bit slower.
So, the scene where L broadcasts his intentions to capture Kira for the first time, I would execute it slightly differently. It shouldn't be cockiness that drives Light to try to kill L in this instance. It should be an implusive fear. This is the world's greatest detective, and Light has shown incredibly normal responses to extraoridinary things happening to him up until this point.
And so he should fearfully write L's name without thinking. He will maybe have some misgivings about this in the five minutes it takes for L to die (five minutes instead of 60 seconds, because 60 seconds is honestly just way too short). Except it doesn't take five minutes. It takes slightly less. And Light notices.
And in the time it takes for the real L to appear and announce that the on-screen L wasn't the real L, Light will have realized there is another Death Note user out there. One that doesn't want to be found.
At this point, Light, still not quite completely arrogant, may have chosen to hide. But hiding is irresponsible now. There's another Death Note user out there who isn't on the side of justice. Further, if that user is found, who knows whether or not there'd be enough information to catch Light.
Thus, a three-way battle ensues. Light must avoid detection while finding the other Death Note user and L. He must do what he can to keep them from finding each other, as well.
Most of the beginning story up until amnesia will be the same. I mean, I'd still change lots of important plot details (including the characteristics of the gods of death), but the plot would go much in the same direction: Light getting closer to L by drawing L closer to him. Light killing the various people investigating him, and Light exploring properties of the Death Note.
There would also be Light trying to find the other Death Note user, but more-or-less getting nowhere. Things will really change once Misa gets caught. Induced amnesia will not be an option. The death god Rem killing L will not happen. Light will not confess the possibility of being Kira, but will agree to being locked up for some similar reason.
His plan at this point will be a desparate gamble. With Kira killings having stopped, the unknown Death Note user will take over. Light would anticipate this because it basically happened with the killing of fake L in the beginning. And then Light can go through the process of actually trying to catch the unknown killer without amnesia, and still work on convincing L he's not Kira.
Thus continuing a 3-way battle.
That's the most major change I'd make.
Other, minor changes to come later, I think. I need to figure out how to communicate my ideas better.
Vim: In the Shell
03/22/15
So, I said my next vim post would be about functions, but I rediscovered something since then:
set -o vi
This gives me vi-esque control on the bash shell commmandline. Meaning, I can exit insert mode and edit as I would in Vi.
Note that I'm saying Vi, not Vim. This isn't "Vi iMproved", it's just vi and it's missing some of the stuff I use regularly. But, this is okay, it has lots of stuff that will make me faster than the emacs key-bindings that are default on the shell
Now, I knew about this before, which is why I said I "rediscovered" it. Once upon a time I wanted to learn emacs key-bindings, too, for various reasons (the vim commandline being related), but I've decided that, for now, that is not a priority so I'm going to get used to using vi key-bindings in the shell.
There is a slight annoyance, however, already in using this shell, and that is when I press ctrl-l in insert mode, I get an annoying ^L. Not acceptable. Ctrl-l works as anticipated when in cursor mode, but I want it to always work as anticipated.
Luckily, this is an easy fix:
bind -m vi-insert 'Control-l: clear-screen'
This makes ctrl-l do exactly what I want it to do. Hooray!
It's nice to have vim with me in the terminal wherever I go. Maybe I'm becoming too dependent on it.... I'll carefully consider that and think of strats when I believe it's true.
Vim: Macros
03/21/15
So, with my last vim post, I talked about the usefulness of vim registers. As it turns out, vim macros both further show how useful registers are and completely replace how I was using them before.
Whereas before I would copy something into a register with
"<key>y
now I record something into that register with
q<key><actions I want to repeat>q
And then I save my keystrokes into that register, and
@<register key>
repeats those keystrokes.
This is much more powerful than a simple copy-paste board where I can copy to various different keys. Now, any regular action that can be properly defined as some series of keystrokes can be saved into a register.
So, not only does this mean that I can insert an html paragraph at the right indentation now with '@p' instead of '"pp', I can also save how I "publish" my blog and diary posts into a register as well. As you can imagine, Stephan, this saves a lot of time.
Another cool thing, though, is that because I'm literally using the same registers, I can literally paste the register's recorded keyboard input using
"<register>p
So, what does register p look like now?
o<enter><p><enter></p><escape>
Which translates as "Enter insert mode in a new line below current cursor, then press enter to make another new line, then insert "<p>" and press enter to go to the next line and insert "</p>", and then exit insert mode.
Now let's go over my save register, register s (the following is all one line):
gg/blogpost<enter>V/^ <\/div><enter>y:sp ../index.html<enter>gg/blogpost<enter>P jo<tab><a href="<escape>"#pa"><escape>j>>A</a><escape>
Anyways, that macro above goes to the top of the file I'm in, searches for the string "blogpost", enters VISUAL LINE mode, searches for the matching closing div tag, yanks the highlighted text to the default register, opens up ../index.html, goes to the top of the file, searches for the first instance of the string "blogpost", pastes the yanked text above that first instance, goes to the title of the post, and adds a hyperlink to the blogpost file itself.
I can't believe I used to do that by hand for every single post. Painful. Also, I can't believe I still do the static HTML file thing. I really need to redo the lost work I did on my node setup.
So, anyways, that's vim macros—crap, I overwrote a hard-to-make macro.
Saving Macros in the Vimrc
It's surprisingly easy to accidentally overwrite one's macro, and that's assuming you want them saved between sessions in the first place (some don't, I totally do). Accidentally pressing q and not realizing it, to go on to press any other key is pretty easy (the easiest being q, g, j, k... any of the many move the cursor keys).
Luckily, there's a way to set macros in one's vimrc.
let @<register key>='<keystrokes for macro>'
Mix this with my ability to paste the recorded keyboard input above, and I can record some keyboard input to a macro, test it out, and if I like it save it to my vimrc.
Different Strokes for Different Folks Filetypes
So, you know, there's only so many registers, I don't know how many are good for macro placement, but it is limited. And stuff I want to do in an html file doesn't translate well to stuff I want to do in css, javascript, or any other kind of file.
Luckily, I already figured out how to have different vim setting for different filetypes. So I can save my html macros in my html.vim, and I can make macros for javascript and save them in my javascript.vim, and so on and so forth (this is exactly what I will do).
Going Further?
Hmmm... saving my registers to some sort of vim config automatically might be nice. Maybe that's something vim functions could do? Maybe, I don't know, I know nothing about vim functions.
....
Which is exactly why my next vim post will be about vim functions, Stephan.
PS: I have discovered that there's an HTML code tag. What does it do? Use the default monospaced browser font, of course. I'll start using it from now on instead of my code class (though, I'll have to figure out how I want to style it).
Maze Runner as a Game
03/20/15
So, back when it was in theatres, I saw the Maze Runner, which was pretty good except for the ending, and teenage drama nonsense that I've come to expect in movies like these. It occurred to me while watching, though, that while it was an okay movie, the setting would make an excellent video game.
The start is perfect, the player is placed mysteriously into the center of this maze. In the center there is shelter, food, and just general safety. There is one place to exit, and that exit is a huge maze. There is a day/night cycle. At night, the only safe place is the center, and the entrance to the maze seals when night arrives.
The maze holds many secrets, and changes every night. During the day, its static. At night it is changing and also filled with things that hunt the player. Living through the night is possible, but difficult without the right resources.
The goal of the game would be to escape the maze, of course, and along the way various tools and resources would come together to make that possible.
I wonder how hard an mvp of this would be. I guess I would start with a maze generator and a means to traverse that maze. I actually have access to maze generator code via old micromouse stuff.
Maybe I'll explore this idea via an actual game soon.
Game Idea: Chinese Elements
03/19/15
The Chinese Elements are really cool:
- Water
- Wood/Tree
- Metal
- Earth
- Fire
Not only is there one extra element than in the boring elements people are normally aware of, but there are two really interesting cycles, which I don't remember the proper names of, but they are basically the cycle of creation and the cycle of destruction.
Cycle of Creation
- Fire comes from Wood
- Wood comes from Water
- Water comes from Metal
- Metal comes from Earth
- Earth comes from Fire
Cycle of Destruction
- Fire melts Metal
- Metal cuts Wood
- Wood/Trees grow from and conquer Earth
- Earth absorbs Water
- Water douses Fire
I think somewhere in this awesome concept there has to be a good game, but I'm having trouble making one. I was thinking of some sort of versus card game, but maybe it can be an area game. Like, given an area to cultivate, make a stable equilibrium or cycle of elements. So, every turn each element on the board creates its element in empty ajacent tiles, and destroys any element it can in ajacent tiles.
I don't know, it's something I'm still thinking about. I need to make some prototypes, I think.
Implementing Deadlines
03/18/15
So, I'm starting to do some amount of work regularly everyday, but the problem is I don't really feel like I'm accomplishing anything, and maybe that's just how I feel, or maybe it's because my pomodoros are of the wandering nature.
I figure attaching some accomplishments I want to accomplish with some deadlines may help me move my productive work in a valuable direction. I already have deadlines for my reviews, and I feel more confident I'll get them done, and that they'll be higher quality because of it.
This should also help me juggle between the many things I want to do, and actually decide on whether or not I'm doing some things. The things I want to do include:
- Run this site on node
- Click-platformer game development
- Raspberry Pi playing
- Taking apart my broken Macbook computers
- Making a micromouse
- Developing and executing a Smash practice routine
Of which I've only really done anything towards site stuff (which has regressed a bit since I destroyed my node scripts), and click-platformer game stuff. If I want to do more, I think it stands to reason to break my goals up into short milestones, make deadlines for those milestones, and switch to different tasks after each completed milestone.
This way, I'll get the power of focus and the diversity of breadth of work. Further, I'll get good practice at setting and achieving deadlines (which may even help me at work).
So, I've already added deadlines to my system a little bit (see my diary for more info), but I have a feeling I'm going ot have to experiment with my execution a bunch before I find a way of implementing deadlines that works for me.
I think this is an important step to actually accomplishing things outside of work. Because I can work on any little thing forever if I don't give myself a time-limit and consider my priorities regularly. I really believe this'll be a valuable addition to my system.
Vim Tips Twitter
03/17/15
There used to be a vim tips account that posted vim tips to twitter regularly. They last posted March 2013. There are other vim tip accounts, all of them seem to be dead. The most recent one was April of last year. @VimLinks seems pretty up to date, but... actually, it's just good.
I think regular vim tips would be a pretty great thing, and I see no ownership being taken on doing such a thing. I might as well make such an account.
It would also play nicely into my recently renewed goal of improving my vimfu for better development productivity.
Though, I guess I could just use my twitter account to publish vim tips. Yeah, I see no reason why I should make a vim-specific account.
This could be fun. Maybe I'll get retweeted by VimLinks.
Developing a Process for Good Reviews
03/16/15
I recently finished Hire With Your Head, and now the rest of this month's reading time will be reserved for reviewing the books I've read so far this year. And now, as I started to write my review for Hire With Your Head, I realized... I haven't documented how I want to write a "proper" review.
I mean, I've thought about it, but I realize now it was that abstract thinking that I do, where I didn't really have well-thought-out thing in my head, but I felt like I did. My brain was taking shortcuts without telling me, Stephan. She likes to do that a lot.
And yes, I have now established my brain is female, somehow. Screw it, I'm going with it.
Anyways, I want to write good reviews. Like, I mean, reviews that I shout over my public feeds that I've written. And so I probably need to think about what a good review is to me.
The Beginning
The beginning needs to give my general opinion and recommendations very quickly. If someone is going to be trying to get a general idea of what people, not just me, thought of the book, I'd like to give a short one-or-two paragraphs to give that person a gist to add to their considerations and then let them move on. In fact, I will make a "The Gist" section and do just that.
Description of the Book and Its Purpose
The gist would be for people finding the post by perhaps googling for reviews (though, do people go much farther than Amazon reviews? Or the place where they buy the book? I honestly don't know). People who read my blog might want some context. So, I'll describe the book, its purpose, and maybe dig into its history (when it was published, about the person who published it, etc.).
This might be unnecessary stuff for the people who found my post specifically looking for an opinion on the book, but if they go farther than the gist, they are probably okay with a little bloat of content. They might also see the section for what it is and skim past it.
Other People's Opinions
By this point, I've shared the gist of my opinion, and I've given context for what the book is. Personally, I enjoy reading a diverse range of finely crafted opinions on content I'm considering, and even content I've already consumed (see my review of the Visual Display of Quantitative Infomration).
Finding these opinions can be work, however, so providing them to readers could be a real treat. I don't have to worry about the inferred context-expectations of the author of these reviews, either, because I would have already provided proper context for what the book is.
The Personal Experience Essay
After my gist, some context, and the gists of other people, it'll come down to me reliving and reflecting on my personal experience with the book via my idea index entries.
I'm still iterating and thinking on how I'm implementing my idea index, but right now it's like this: I make an entry for standalone ideas I really like, quotes I like in and out of context, and ideas from the text's content interacting with my personal experience and generating something that excites me. I'm still working out how to mark each entry as its specific idea-type in the index itself, but I think that's something that might reveal itself to me in the writing of these reviews.
Note that when I say essay, I mean essay. My idea index for Hire With Your Head, which to be fair is the largest index so far by far, is about 80 entries long, and I believe I want to give each item careful consideration or cross them off the index as faulty first impressions.
And "careful consideration" means "writing about the idea in-depth" in my review. If I can't find an idea worth writing about, crossed off; if I don't like the content that comes from writing about the idea, crossed off. There's probably other things that will lead me to cross off the items as I actually execute this plan.
This, I think, will lead to really interesting reviews. If I reviewed entertainment-based content, it would probably be full of spoilers, but the structure would still work because the setup would properly save the spoilers for last.
So, maybe I'm considering reviewing other content, Stephan.
Should There Be a Conclusion
I don't know how I feel about conclusions. I mean, if there were a central point driving what I was talking about, the conclusion would solidify that point and wrap everything up nicely. If, however, I'm going on an adventure, how should I come to a conclusion?
I suppose I could review the landscape of reading material, both consumed and plan to be consumed, and how it fits with the ideas developed by reading the book. This could help build my future reading, and solidify my personal context that defines the book in my eyes. It may also influence other people's reading decisions.
Because the best way to end an adventure is to hint at future adventures.
Ruined Chromebook Site Setup
03/15/15
Yesterday, I ruined my chromebook site setup copy. I even managed to destory the .git directory. My find/replace node script got fed instructions in the wrong order, and I fed in a ".." as a directory instead of as a string to replace. It was a pretty stupid move and it's something I'll design smarter next time.
I lost surprisingly little thanks to the fact that I sync with my server most nights. I forgot to sync my diary, but not all files were lost in this mishap, and all inprogress files were unaffected, so unrecoverable blog posts or diary posts are kept to a minimum.
Lesson also learned, keep multiple repositories that I keep updated. This wouldn't have happened if I pushed my local git repo to a bare git area on this chromebook, and then also, when I have Internet connection, push to a bare git repo on my server, and then update my main site from that repo as well.
So, that'll be something I focus on for the next few pomodoros I have for such productive work. Got to make sure I don't lose work unless I choose to delete it, not because of silly accidents.
Awesome! I still have my local diary open on the browser! No blog content lost, just some scripts that I can easily rewrite. Woot!
Using Vim Registers
03/14/15
So, I've finally started adding new vim tricks into my habitual process. A recent addition has been using vim registers. Registers are like individual clipboards you can copy to and paste from. Using a specific register will keep its contents until that specific register is copied to again.
This is really useful, as most anything that deletes content in vim puts it in the default paste register, which makes paste-replacing lots of different content with one specific bit of content a bit difficult.
But now all I need to do is:
To yank content into a key register of my choice and then to past it all I have to do is:
And, thanks to how vim saves session-state between sessions, I still have those registers saved when I next open vim. I find it quite useful, considering I write still write these blog posts in pure HTML. Now, I have registers for creating a new paragraph, unordered list, ordered list, etc. And I can make them as complicated as I want and it won't increase the complexities of writing.
There's definitely a better way to do this, though, and I may find my current use of registers to be a misuse of a perfectly useful tool. Why do I think there's a better way to do this? Because spacing isn't automatically adjusted based on context, and I think if I were to make, say, macros (the next thing I should learn proper) to insert these tags automatically, it would both save me a keystroke and probably take advantage of spacing context.
Still, I've added registers to my vim knowledge, and whenever I may find it useful I can reach for it without the resistance of ignorance or inexperience.
Book Reading Plans
03/13/15
So, as I near the end of Hire With Your Head (seriously on the last two pages), I'm thinking over my New Year's Resolutions when it comes to reading books. The plan was to read a book monthly and to write a review monthly. As of finishing this book, I'm about three weeks ahead of schedule as far as book reading goes. However, I've yet to write any reviews this year.
The main reason for that is that I haven't yet planned to write a review in a specific time-block, or for a set of pomodoros for the day. That ends today. For the rest of the month, the pomodoro reserved for reading will be reserved for writing reviews for the books I've read so far this year.
I have not yet decided if I will be reviewing along the chronological order that I read the books or in reverse. I'm think in reverse because I might just start writing reviews today, and I have the book I'm finishing today because, well, I still need to finish it. So, I'll have the necessary reference material.
In the future, my goal will be to finish the book for the month with at least a week to spare to write a good review. Ideally, I think I would like to read a book in one week, and write the review the following week, and read two books per month, but I may be a long ways from such a schedule.
I guess I'll take it one book at a time. Also, I got to make sure I make the time to read my IEEE and ACM magazines as well. I might even want to make pomodoro-time for reviewing some articles in those magazines as well. I know there's some I wanted to review already.
One bit of reading at a time.
Chaotic Progress
03/12/15
Yesterday, I woke up at 5 a.m., only to go back to sleep at 5:40 and not wake up again until 8:30. Yesterday, I woke up at 4 a.m. and basically stayed up until 21:00 (9 p.m.). My goal is to eventually fall asleep at 20:30 and wake up at 04:00 everyday. It seems I'm making a sort've chaotic progress towards that goal.
Perhaps I'm making progress towards that goal in a PID-control fashion. I guess I'll know if I wake up well before 4 a.m. tomorrow. Which actually feels likely, as I seem to have caught up on sleep and will now sleep much less if I overslept the day before.
I think fighting this pattern would be a waste of effort. It's better to influence this pattern towards my ideal sleep behavior. I've had too many arguments with myself early in the morning over waking up early. It's time to avoid those arguments all together, and simply accept the fact I will sleep in if I don't setup my sleeping according to some arcane art I've yet to properly grok.
On a positive note, my pomodoro progress is growing in a more linear fashion, with lots of review and reflection on the system itself. Check out my diary if you're interested, Stephan.
Learning to Highlight
03/11/15
When I was first told about highlighting, I didn't really understand the purpose of it. I didn't get it. I was told to highlight the important bits, but I found way too much too be important, so most of the book ended up highlighted. Eventually, not having trouble retaining read information, and not understanding the point, I felt highlighting wasn't for me and gave up the practice.
Writing in books I felt basically the same about. It also ruined the rereadability of the text, I thought. But now that I've implemented the creation of an idea index into my book-reading habits, I feel like writing on the page, and highlighting even, could actually server me a purpose.
My idea index entries are become a lot more frequent. So much so, that sometimes there are entries for every page of small chunks of the book. Often, the idea is just a certain sentence or something a certain sentence triggered. It would be quite ideal to mark that segment of the text in this case, so when using the idea index to review the book (as I plan on doing with every book I read this year), I can pick out the exact bits relevant to the idea index entry.
Though, this is speculation on my part, and I don't have entries every page that often, and realkly I may have just been overzealous with my recent read. I may just end up crossing out many of my entries upon review.
In any case, I think I've found a reason to learn to highlight properly.
Of People and Systems
03/10/15
I find myself thinking about systems a lot. They're everywhere, and they're fascinating. Some exist on purpose, some seem to be an emergent property. Some are actively maintained, and some just go about existing and mutating without anyone's purposeful intervention.
How systems affect people, for good or for ill, is the part that interests me. It tells you a lot about a person, but it also tells you a lot about human nature—perhaps better put as human statistics.
Something I find myself thinking about now is how people act within a system considering their opinion about said system. As I think about it, there are many ways a person can think about a system:
- Unaware
- Indifferent
- Denial
- Agreement
- Sabotage
- Refusal
- Disobediance
- Acceptance
- Dependence
- Independence
Now, these aren't all mutally exclusive. I think patterns probably arise, regardless of the system in place, when people have aligning opinions about a system.
A person unaware of system is slave to that system. At least, any contact with the system she has no control over. It will do what it does, and she will be manipulated by it in whatever way she is. She may even be unaware of its presence while this happens.
A person indifferent to a system only really thinks about the system when she notices it. She could be most any other state about the system when she notices, just not really feel too strongly about it. It isn't something that defines her.
A person in denial about a system doesn't believe that system exists. It'll interact with her regardless, but maybe if she notices it she will rationalize it as something other than the system.
A person in agreement with a system is actively working to improve the system, or at least keep it running/working. I guess a stronger version of this would be a zealot or evangelical for the system, someone who tries to convince others to adopt it.
A person sabotaging a system is a person using the system with the intent to break it via dishonest means. I guess a person doing this without realizing it would be a parasite. Lots of slight variations of relationships to systems, I guess.
A person refusing a system is a person who actively avoids participating in a system. This probably overlaps with disagreement, which somehow I failed to list above.
A disobendiant person works in a system but actively breaks its rules. She is in disagreement, but can't refuse to be a participant.
A person who accepts a system agrees that the system is in place and that it has influence. She doesn't necessarily have any feelings further than that.
A person in dependence on a system is reliant on that system for some measure of personal gain that would make her nonfunctional without it.
A person independent of a system could work outside of that system if she so chose.
So, what's the point I'm getting at here. I'm not entirely sure, Stephan. I'm just doing some beginning explorations of systems and my personal hypotheses therein. People interact with systems, that much is obvious, but how much behavior can we derive from those interactions in general terms? Without knowing anything about the person or the system, just their relationship or attitude or opinions on the system.
It seems that being aware of the users of a system in this way could help in the design of such a system.
Though, perhaps, right now I'm being too abstract. I should pick a real-world system, do some research, and see what I find.
To be continued?
Free to Play: Customer Product Employee
03/10/15
There's a truism I've read a couple times: "if you're not the customer, you're the product". And it's something I've been thinking about whenever I think about Free-to-Play. Though, I think free-to-play, FTP, or freemium as some call it, doesn't fall into this dichtomy too often. The players are the customers, freemium just catches a lot of flak for trying to trick their players into playing through what may be considered underhanded trickery.
But the "customer or product" dictomy does still exist in many ways, I suppose. I do believe a lot of games out there have ads that can be turned off by paying, for example.
But really, I wonder, could there be a third option? Could free to play games use their players as employees? One man's tedium is another man's passtime, and add gamification and it could be considered good fun. Never mind the various creative endeavors that people engage with in games. How implausible is it to make a game that has players create a sellable value, and actually translate that to how funding is derived for the game?
Could such games exist that actually pay the players to play?
I know there are such games that provide real value. One such example that I read of repeatedly is the protein folding game. This is an important, hard-to-compute problem that is being massively solved in parallel by human beings.
Personally, I think it would be quite possible to make learning to code be a "pays-to-play" game. There's lots of coding out there that needs to get done, at all skill levels. Even entry-level coders could probably solve some real-world, albeit small and low-priority, problems as their improved their craft.
I think there's a lot of things that could pay to play. I think, perhaps, it could be a future of employment. I mean, I see "gamification" rising in employment, but the problem is that the gamification seems really shallow, from what I see of it. It reminds me of the "cowification" explansion to Cow Clickers that made fun of just that. Gamification needs to go beyond mere Skinner-Box methodologies. It needs to get at the heart of what needs to be done, it needs to be interactive such that it can place the player in positions that are challenging but not impossible, and it needs to adequately teach the player through play.
These are the types of games I'm interested in trying to make, but I still have a lot to learn before I can really implement any such thing. First thing I should do is gamify my own game-making routine. Try to design an engaging workload that really identifies what I can do and where I can stretch myself and create problems from there that address my growth needs.
I need to gain experience at game-making. But even more, I need to gain experience at efficient experience and accomplishment cultivation.
Playing With Pronouns
03/09/15
So, reading Hire With Your Head has introduced me to an idea I never really considered. In it, whenever the author is referring to a person who is—for all intents and purposes—ungendered, he seems to pick a gender at random.
I like this. In fact, it's much better than resorting to using "them" as a non-gendered means of referring to an ungendered individual. I mean, that's what's happening to the language, as far as I know, but I don't have to follow that mutation of English if I've found something I prefer. In fact, I might just play with just using female pronouns for ungendered persons. You know, to cancel out all those overused male pronouns.
I guess there's a lot of people who would do that in a facetious sense, but I find no problem with doing it in an honest and earnest fashion. I'm sure any reader of this site wouldn't mind me calling her a she. I mean, if I refer to a reader at all, I'll already be putting words into her mouth, I see no harm in implying a gender. Not like saying "he" wouldn't be doing that. If "he" can be gender-neutral, so can "she".
Though, it occurs to me, Stephan, that I don't refer to readers very often in this blog. I wonder why that is.
The Return of Site-Blocking Apps
03/08/15
So, as I continue my fight to regain what I once had over a year ago now, I was reminded of my using of Site-Blocker and LeechBlock and various other site-blocking apps I found online. When I abandoned them not too long ago, it was because I was using them for an inappropriate job, and thus they did not work the way I desired. But I think at one time I used them, quite accidentally, to great effect via an appropriate job.
That job was to remind me to consider better things I wanted/needed to do with my time. It was with this attitude and this tool that I was able to overcome my poor habits and replace them with strong ones.
And it is time, once again, to do the same thing, but this time with understanding of what purpose I will use these tools for. They need not completely stop me from accessing content. They need only delay access to content as a reminder that I may wish to do something else. If I don't wish to do something else, the reminder won't be annoying enough on its own to turn off, and so I'll keep it on. If I do want to do something else, it will be doing its job exactly.
This is something that my previous system lacked: personal buy-in. I had to agree with what the tool was doing for it to effectively stop me. Otherwise, I would simply overcome it, being the true master, and the tool would be all-the-more weaker at being of any help to me.
It is with this line of thinking that I once again employ a tool that has helped, hurt, annoyed, and amused me in the past. Welcome back, site-blocking.
Site: Milestone Brainstorming
03/07/15
So, the time has come where I feel comfortable enough with node to start migrating my site over to it, and then start making changes to make my site more dynamic in nature. The first step I'm taking towards that, however, is making node scripts that modify all my static html pages.
You see that browse bar on the left there, Stephan? I mean, I might move it, so maybe it's somewhere else by now. Playing with my CSS setup is also something I plan on doing. Anyways, that think that links to various me-related things somewhere on this page. I still, after a pretty significant chunk of time owning this site and having that setup, implement that across multiple pages via copy-paste. So, something I'm working on now is a script that changes all instances of the browse bar html to whatever I currently want it to be set up as.
It's crude right now, but I think it'll get better. I want to make sure any links that can be relative are relative and not absolute. Makes running a copy of my site on my chromebook much easier.
Which is something I'm realizing right now is something that still needs work. As the homepage's css is something I link with an absolute address (http://www.ksionda.me/style.css). That's something I'll fix.
Anyways, dynamically generating the html of files server-side such that I can dynamically piece this stuff together could really help DRY out my website. I can just keep chunks of html in actual files, or maybe I can keep it all in a database (though I should think carefully of the ramifications of that, Stephan).
Anyways, a good next milestone is to take my browse-bar modifier and iterate on it and make it better. While working on that I can consider further the direction and magnitude I want to mutate this site.
Fixing Sleep Schedule
03/06/15
So, something I really need to do is fix my sleep schedule again. Once upon a time, I was waking up at 3 a.m. and going to sleep at 8:30 p.m. Various things happened that broke that cycle, but I would greatly prefer to return to something similar. Maybe sleep at 9 p.m. and wake up around 4:30 a.m.
I think that would work best for the productivity schedule I'm trying to make for myself. I'd like an hour and a half of productivity in the morning, plus 30 minutes for walking the dogs and 30 minutes for various other things. Then I can head to work around 7 a.m. and get there by 7:30 a.m. Which would allow four hours of work, then an hour break for Super Smash Bros. Melee, and then another four hours of work. I could head home around 4:30 and get home around 5. Then I could do an end-of-day review and then spend the rest of the day doing non-productive stuff.
I still don't know how I developed the habit and discipline to wake up and sleep at regular times that I found ideal. It seems the thing that worked the most was having morning me agree to all the plans and thoughts that evening me came up with. But I don't know how I did that.
Something that seemed to work was learning that melatonin lingers in your system after you wake up, and so you feel tired when you aren't. I would wake up thinking about that and it would help me wake up.
So maybe I need to think of stuff like that. Stuff that will convince me I'm not really tired when I wake up in the morning and feel tired. Thus, I can't argue that I need more sleep, and morning me can consider his priorities.
I also need to make sure I'm sleeping well. I feel like I'm sleeping pretty well, but there's a lot of variables I should verify if I want to have a consistent sleep schedule. And I do want that. I think a productive morning habit is the key to consistently productive weekends and will just make me happier overall.
Back to Pomodoro
03/05/15
After a week devoted to saying goodbye to my babuska, I am going back to work, and back to extracurricular activities. That means going back to pomodoro, as I neglected to use that system at all the past week. Considering I was doing it for less than a week, that's kinda a shame.
But no worries. Right now I am executing my bus pomodoro of blog post writting (and this is the second post of the session), and I feel I can get right back into the not-yet-internalized habit.
More scattered thinking on my budding pomodoro habits will probably accumulate in diary area.
Considerations of Intent
03/04/15
This past week, I got to see a lot of family. And, as it always happens with me and my family, I got into and witnessed one or two fights.
I've gotten a lot better at walking away in the heat of the moment. I have not gotten very good at doing that tactfully such that the person I am fighting with calms down. No, they usually get angrier. I have also not learned the best means of stopping an argument when walking away is impossible (e.g. when driving down a highway). Though, when it happened this time I managed to avoid getting out of the van in the middle of nowhere (though, this time I wasn't a part of the argument that much).
Anyways, having walked away from the argument I was able to, I was able to reflect on it in an emotional state usually reserved for escalating verbal violence. It was in this state that I found myself projecting a lot of intent onto the person I had argued with. Futher, I found myself projecting an understanding of my own intent onto her. Neither were fair assumptions.
Realizing this, I calmed down, and I thought of two things: what were her intentions and understandings of that argument, and how could I communicate my intentions and understandings of the argument. This, I suppose, is the entire purpose of honest tact. I must speak with precision and finesse to communicate effectively without causing unintentional damage. It's a kind of verbal surgury, I suppose.
I have read before that "intent is not magic", and I feel I am gaining an appreciation of what that means. Not only should I expect others to understand and consider my honest intentions, not only should I consider the consequences of my actions regardless of my intentions, but I should perhaps consider and even ask the intentions of others, so that I might faciliate better communication and peaceful resolutions.
Site: Beginning Node Transitioning
03/03/15
So, I believe the time has finally come to transtion my site to running on node. And the first thing I have done to that end is... make all links on this site that are local links relative pathways instead of full url links.
Why? So I can have a copy of this site and make changes to it on my chromebook without it affecting my main site. I can then transition whenever a change is ready.
It was also decent node script practice, as I made the changes via implementing a javascript script and executing it with node.
I have a few more minor things to do to make it run locally more correctly, but having node serve the static files on my site might come pretty soon. Then, I have some ideas on how to save blog posts in a database, and I'll consider things from there.
Fevers Come Back?
03/02/15
So, I woke up this yesterday morning afternoon and felt
a bit better. I took my temparature and it was normal.
Much later in the day, I noticed that I was still feeling pretty crappy, and took my temparature again.
It was back up to a 100 degrees.
I haven't paid attention to the nature of illnesses and fevers much my life, but I thought that once a fever went away, that part of the illness was ending.
It's just making me realize I really don't know much about the nature of being sick.
Back Home and Sick
03/01/15
Today's post was going to be about me working on my argumentation habits even more, but instead, after 12 hours of travel and feeling iller by the minute, I am going to use having a fever of 100 degrees to go to bed.
Goodnight, Stephan.
Memories of Babuska
02/28/15
The person who talked at the memorial for my babuska kept talking about things unrelated to my babuska. Instead of dwelling on that, I decided to just think about memories I could muster up for her.
There's the general ones, you know. How every time we finally arrived at her house she would greet us with a hug that belonged to only her. She'd come up close and squeeze me tight, and then just rock me back and forth with great energy. For most of my youth, it always took me by surprise. By the time I was expecting it, I was bigger than her, and she would tell me I shook her with too much. She became small and fragile so quickly, it seems.
Babuska would always make us breakfast when we visited. Cereal and eggs. The cereal was cream of wheat, and the eggs were soft-boiled. She would always provide the cream of wheat with an ice cube on top. She would tell me to stir it until the ice cube completely disappeared.
Thinking of Babuska mostly makes me think of the house. Makes me think of the short walk to the grocery store down the block. We always took the back way there. We would cross a bridge and feed the ducks. We'd go to the candy isle and I would eat out of the self-bagged candy selection.
For the last two years or so, I tried to call her once a week. I wasn't perfect, but I did call quite regularly. Every time I called her, I asked her how she was doing. "I'm still here," she would say. She would always ask about the aspects of my life I told her about.
"How do you like work? How is your dog and your cat?"
And then I saw her one last time in Canada. She didn't really open her eyes except for once. When she did, she asked, "Am I dead?" and my aunt said, "No, you're still here." My babuska smiled and laughed, because that's what she always said.
She talked about how she loved everyone, and she was glad I was there.
All my memories. Seem so few now. So abstract. So general. I wonder, how much of my memories are really accurate.
I guess it doesn't matter. The feelings they inspire are real and accurate.
Funeral Today
02/27/15
Things are feeling pretty chaotic.
It's amazing how fast one can be on the opposite side of the country. I didn't even do it the fastest way.
Staying with family.
Good to see family again.
Considerations of Tone
02/26/15
So, there's something on the Internet considered the "tone" argument, I think. It happens when a person tells someone they're wrong, but does it in a particularly rude manner. People don't always react very positively to this, and some people go so far as to say that people who act so rudely don't deserve any really attention.
I'm not sure how I feel about this line of thought. I mean, people get emotional, and unfortunately emotional people might not communicate in particularly effective or even clear or intelligible manners. I think dismissing someone purely on their tone can be a poor reason. Refusing to continue a conversation or debate on that basis might be reasonable. Conversations require consent of all parties. But if you're going to continue the conversation, I find any attention on tone that isn't a sincere request for a less confrontational conversation about whatever subject is being discussed is in fact a derailing of the conversation at hand.
Also, unless executed correctly, taking issue with someone else's tone is a self-defeating argument, in a way. Unless considerations are taken towards how the emotional person will react to being told they are acting emotional, it's kinda being hypocrital to bring it up.
Personally, I want to work towards effective communication. I'm not the kind of person to be that emotionally involved in anything. Even super serious stuff that I should get upset or angry about. So, I'll try to respond to anyone's criticisms expecting the best of intentions from them and just try to let them understand my position. Now, this isn't always going to end well, and I may give up on communication, but I've been liking my personal growth with this perspective.
Further, if someone is upset and angry, I'm going to respect that. Sometimes, that's appropriate. I don't need to identify it unless it's actually upsetting me. I can just continue the communication the best I can without being disrespectful. I will no longer consider it inappropriate or rude for someone I disagree with to be emotional.
Being emotional is sometimes the logical and reasonable thing to be. And perhaps working towards understanding what a person is saying would prove more effective than calming them down. I think keeping one's ability to communicate effectively while being emotional could be incredibly powerful, as well.
Letting Yourself Feel Tired
02/25/15
These past couple weeks have been incredibly taxing. Last Monday, I was told I could have this week off, basically. And at that moment I realized how tired I was.
I travelled home, and lost my wallet along the way. I dealt with the consequences of that, and today... today I should've gotten a new ID, but instead I just slept all day.
I also did no pomodoros. This almost seems more like a diary post than a blog post, but I guess I should really ask myself what I need more often.
Because clearly, I needed rest.
Well, no.
Clearly, I need rest.
Not Enough Data
02/24/15
One thing that's been bothering me is how stubbornly people will stick to certain ideas without pointing to real-world examples or good data to show their stance is true. Now, I myself stubbornly believe in some ideas that have incredibly little data to show for it, but those are ideas I want to try, and when I can finally try them, if ever, I will be able to get data on whether or not those ideas are valid, and iterate from there.
Actually, I guess my beef is with people who nitpick at the problems of existing things without really putting forth better solutions. Nothing is better to them, but nothing isn't actionable on. Nothing means you're letting whatever system exists without explicit intent run rampant.
This shouldn't ever be tolerable. Something costs too much? Work towards a system that better serves its purpose that is more cost effective. Nothing is not a solution. Nothing means its possible no one is willing to take responsibility for whatever purpose something serves, meaning something with real need is being underserved.
I'm being overtly vague. Basically, I want to work towards being some sort of Universal Basic Income activist, I guess, and I want to think a bit more meta about typical tactics against social safety nets.
Responsibility of Poverty
02/23/15
I think about those in poverty pretty regularly. I myself have never really been in poverty, but have been in the unique situation of having weathly grand parents and poor parents. The sort of thing where I had every current generation gaming system, but where my bed was a couch and/or bed right outside the kitchen for a good chunk of time.
Right now, I'm most-certainly middle-class territory, which coming from my background isn't that weird. I had plenty of resources available to me to succeed. Smart people, good mentors, never having to worry about a meal, never needing to support others during my younger years, being taken seriously on needing to learn my own way, being given both need and merit scholarships even though perhaps I didn't really deserve either.
I'm saying I had plenty of help. A lot of people have told me I worked hard and I earned it, but I really don't feel that way. Yeah, I did what was asked of me, and did it well a lot of the time, but I was always in a situation where I could do what I was told or I was given good resources to figure it out.
Only one time in my life did I feel lost for a long period of time. It was during a period of time at work, and I didn't struggle my way out successfully. Mind you, I tried, but I was trapped in a place and the only way out was to get help. Luckily, I was in a place where help would be offered when asked, and I got it, and things have improved strongly since then.
And so I take issue with a sentiment I see or hear or infer often. That the poor need to work hard and pull themselves out of poverty. It comes across to me as if you were telling people locked in a cage it was their job to figure a way out, when people outside the cage have the keys and are much better equiped to free those encaged.
Those in poverty do not have the time, the money, or the training necessary to no longer be in poverty. They literally do not have the resources necessary to escape. They are trapped: mind, body, and soul. They are told it is their fault and almost always it is not. But even if it were, why should it still be their responsibility to escape a prison so cleverly designed to be unescapable without outside intervention?
And make no mistake, those that do or did have the resources to escape had help, and they are either not in poverty or well on their way to no longer being in poverty. They are held up as proof that it's possible. I contend they are the exception that prove the rule. If you can escape, you have. Why wouldn't you?
Implementing Pomodoro with my Blog
02/22/15
So, yesterday, at work... actually, wait, things started going into motion a bit earlier than that.
So, a little over a year ago, along with being recommended Getting Things Done and Code Complete I was also given a copy of a document detailing the Pomodoro Technique. I read it, I liked the ideas therein, I attempted it, I didn't like some things about it, I abandoned it on my quest to find my own way of doing things.
Two days ago, at work, I decided to write a work blog post on the private work network detailing what I was doing while I was doing it. It went really well, and made me really excited to do it again yesterday.
So, yesterday, at work I was off to a slow start. At some point, I pulled out my tickler items, and one of the items I had set aside for that Saturday was to reread the Pomodoro technique. In all honesty, this had been a weekend tickler item for a while, I would just keep sending it a week into the future and go about my day.
Yesterday, I decided, "Okay, let's do this." And so I read it. Again, I liked the ideas therein. Some stuff really spoke to me that I think before I didn't appreciate so much. A year of attempting to be better at time management really improves one's perspective.
Reading the document, and having that experience of a half-hour blog post of productivity the day before, something clicked in my brain: Why don't I track my pomodoros via blog posts?
It actually makes a lot of sense. I've been doing daily posts pretty regularly, with few slip ups, for a long while now. It is the way I document my life right now. I've gotten pretty decent at it, and fallen into a good rhythm. Also, doing this helps me push me further to developing good web design and development habits, and will help me build presentable, if informal, documentation habits of important work I do.
Mixing my habit of blogging with a productivity and time-management strategy also just makes sense. I can force my wandering, many-voice thoughts into clear, coherent instructions, follow those instructions, and also know when it's okay to stop, take a break, and resume my admittedly enjoyable wandering-mind state.
Yesterday felt like a great start. I quickly hashed up HTML pomodoro log documents, cleared through a lot of built-up notes, and managed to put a good half-hour towards proper work goals.
I'm really excited about this setup. Everything really feels powerful. Which is why I'm copying the setup the best I can at home bascially immediately. This is a significant and powerful strategy, and this is the first diary post towards executing it regularly.
But, flooding my blog with diary posts about incredibly random things feels... off. Like, I come to this blog with the intent of writing about something, usually for the sake of writing about that thing. Using it to do work, while powerful and something I want to do, seems like a significant alteration to the feel of this blog.
So, I'm making a kinda-hidden diary area. That link right there will be my only direct link to it for now. Though, as I evolve my site I might change my mind on many things. Some diary items will be worthy as blog posts, I think, this post being one of them. I'll probably decide during whether or not it should also be a blog post, and also probably add content as I did here.
I'm pretty excited about this, Stephan. I hope it isn't just a temporary spike in productivity.
Define Jobs, Not People
02/21/15
There's this annoying tendency I see to define a product not by its utility but by the people who employ, use, or own the product. And by product, I mean basically everything: jobs, services, food, tools, games, movies, books, even advertizing itself.
The idea seems to be:
- Collect data on the kind of people who want X or can do X
- Try and get the attention of those people
- Assess of the value of those people based on their habits
- Match the product with the available people
And I just don't understand this mentality. It's describing patterns as they exist now, and then trying to take advantage of those patterns without attempting to understand why those patterns exist and how they opperate.
Several books I've read have also voiced their disagreement with this mentality. Currently, I'm reading Hire With Your Head, and I've recently read through a section where it describes the tendency for job ads to describe the skills and requirements of the person they think they're looking for, but not what the job actually does.
This is faulty on two levels:
- Do you know what the job is when you just define the person?
- Are you defining the right person if the job isn't defined?
It comes across as a purposeless wandering that sticks dogmatically to any measured thing that somehow correlated with success.
And it's not just jobs and people. A while back, I read The Innovator's Dilemma and in it the author Clayton Christensen talks about asking what purpose a product serves. What is its job? Not who does it sell to, but why those people are buying.
He gives a specific example of a fast-food restaurant trying to increase the sales of their smoothies. I believe they identified that the smoothie did well with two demographics of people, business-type morning people in a rush, and children. I believe they attempted some stereotypical "this demographic likes our smoothies, they are also known to like X, let's combine the two" that flopped pretty terribly (I may be adding details to this story, it has been many years since I read this book, it might even be from Blue Ocean Strategy).
Anyways, they decided to find out why their smoothies were doing so well with these two demographics. With the busy morning group, it was a quick breakfast they could eat on their drive to work. With the kids, it was a nice, cheap treat that their parents could get for them that the kids appreciated.
To improve the quality of the product, they made it both more filling and more nutrious. They may have also split the product in two, to better cater to the different reasons for buying the product. Sales improved.
And I hope that maybe I'm only ever hearing the popular opinion, the conventional wisdom, of advertizing and general salesmanship. I hope that it is tradition, and a lack of considering the premises, that have caused this failing to consider actual jobs, the purpose, the very why of why something exists and why others might want it. I hope that the scholarly view knows better, and that it has simply been ignored by all the majority of advertizing for some baseless reason.
Perhaps the scholarly view has been turned into a buzzword that the mainstream parrot but do not understand. It happened to disruption, it apparently happened to scrum (though, I still need to learn real scrum to really know). Maybe advertizing only ever worked on being good at being spam.
I certainly hope that there's not good science to suggest shotgun spam at some described audience is time or cost or quality effective. And based on my loose reading into various business books and concepts, it is constantly derided as not being so, so maybe I'm right in my observations.
Javascript: Digital Tickler
02/20/15
I use a tickler to remind me to do things on a day-to-day basis. I have inserted folders into this tickler for spaced repetition to memorize things I want to memorize. I really like the physical setup, it allows me to put various physical reminders in my folder, and easily carry around today's reminders on my person without being attached to the Internet or any kind of electric device. This is very useful for my circumstances.
There are situations where I would like a digital, online version of my tickler, however. Many items that need to get done need to get done online. It would be immensely useful to have a digital tickler for such items, that provide me with the link necessary to do the thing.
And so, this will be yet another thing I'll be working on. I'm going to start with the scotch.io tutorial Creating a Single Page Todo App with Node and Angular. A tickler is kinda a more sophisticated todo app, so I figure this is a good place to start.
Polishing Ideas from Reading New Ideas
02/19/15
So, I've been reading Hire With Your Head. I've been greatly enjoying the read, as I do with most of the books I choose to read. I've also been reading it much slower than previous books, as the time I had reserved for reading is also used for blogging and coding now. It might be a system I need to revise.
Anyways, for a long time I've played with a wish in my head which involves more-or-less raising the poor out of poverty. There are a lot of systems in place that keep the poor in poverty, and very few put in place designed to lift them out. The few there are are designed poorly, I think.
Now, I want to make a system that could slowly evolve into Universal Basic Income (UBI), but I understand that with my low resources and influence, doing anything that actually resembles UBI is basically impossible.
But, a little while back I got to thinking. Can I generate value out of the process of teaching others to learn marketable skills? Duolingo suggests that yes, yes I can. Which makes me think that all the MOOCs out there are doing it wrong. A massively colaborated class could probably generate a ton of value while each individual learns. Now, I'm sure there'll be cases where no, the taught content of the class can not be made into some sort of value, but even then it would be useful to make realistic-looking problems that can be solved via learning the material. I bet many of the classes not valuable to teach were valuable at some point in the past, too, so there's probably real-world problems to use, just ones that have been rigourously solved.
Anyways, that was the basic concept floating around in my head as I started reading Hire With Your Head. Right now, I'm in a section explaining the concept of the Performance Profile. The well-defined description of jobs that need to be done could be an incredibly useful lens for content to teach in MOOCs. It could also allow for real work to be done via students learning while doing actual jobs (though, there would be plenty of fake jobs as well, to prep readiness of a student).
The student and the teacher could then both be conpenstated for work done. A student getting paid to learn is much more likely to find the time necessary to learn in a day that's probably already packed too full of work and not enough play. Make the learning engaging and fun and it may even feel like play.
Funeral Next Friday
02/18/15
The funeral will be on Friday, the 27th. It will be in Newark, New Jersey.
I'm definitely going to go, but that probably means working ten hour days between now and next Thursday.
Meaning, the higher-quality blogs I work on on the side that I haven't published yet will get even less attention. I'll have a tweet-worthy post eventually, Stephan.
So Glad I Saw Her
02/17/15
I saw her. I talked with her a bit. She knew I was there. I said goodbye.
I saw the house I've visited so many times. I took some things to bring home. I said goodbye.
I'm at the bus stop, looking forward to a long trip home. I'll need to catch up on work and chores and various other things. I'll need to catch up on savings via some budgeting.
No regrets. I was able to do this and it didn't destroy me to do it. I made the right choice in doing it.
Learning MEAN
02/16/15
So, I want to make that Japanese study-tool, but a lot of the milestones I have identified requires a client-server relationship that I have no experience developing.
Luckily, I follow various Javascript-related Twitter accounts, and one linked to an interesting JSON Web Token , and that article linked to a tutorial of how to build a restful api using node and express which should be very useful for building a kanji database system for my tool.
Anyways, all this stuff introduced me to the concept of the MEAN stack. MEAN stands for MongoDB, Node.js, Express, and AngularJS. It's a framework for an easy starting point with these tools and libraries. I've already messed with Node.js and Express a bit, and I've heard enough about MongoDB and AngularJS that I've planned on messing with them eventually.
So, learning this may be what I focus on for a bit, until I get a better idea on how I want to tackle the Japanese study-tool problem.
Blogging on the Bus... in Canada
02/15/15
So, I'm on my way to see my Babuska, and I had a choice between an adventure that would take around 16 hours and cost me less than $1000 and flying from Tucson to North Bay for around $2000, with various other options between the two.
I decided to go with the cheapest and longest adventure. And now I'm at the tail end of it, on a bus that will take me from Toronto to North Bay (in the span of about five hours). I woke up at 2 a.m. this morning to do the last bit of prep necessary to start my travels to North Bay. Clothes packed, food prepared, last-minute chores done. A good shower for good measure.
At 3 a.m. Tucson time I headed to the Tucson-Phoenix shuttle location. At 4 a.m. we left Tucson and did the two-hour drive to Phoenix. I got in a two-hour cat nap out of the two-hour trip to Phoenix. I checked in for my 8:05 a.m. flight at 6:30 a.m. I ate a Kind bar (dark chocolate and peanut butter) for a snack. I got on the flight at around 7:45 a.m. and promptly slept through it.
Being able to sleep most anywhere I can sit down is pretty awesome and hugely valuable. I do not, in any way, feel exhausted right now as I ride the bus to North Bay. My first thought when I got on the bus was, "Oh, hey, WiFi! I can still publish a blog post today."
Anyways, I had a layover at MSP airport... which I think is somewhere in Misouri. I'm not really sure. It was supposed to only be an hour layover, and I took the time reading my IEEE Spectrum magazine and eating packed gyro meat, mac and cheese, and chicken.
My flight to Toronto was delayed almost a full hour. This made me incredibly worried I was going to miss the bus to North Bay (I had already purchased a ticket, because I was unsure how far in advance a purchase was necessary).
I slept on the flight to Toronto. I woke up to eat some black berries and then I slept some more. I was given customs paperwork to fill out.
I realized the pen I had on me was finally dying (I really liked that pen). I need to start carrying backups. My pens die too frequently.
I ran the distance from the gate exit to customs. I breezed through customs quickly, grabbed some Canadian cash, and paced to the closest taxi.
The taxi trip cost almost as much as the bus ticket. Maybe I'll figure out public transportation from the bus station to the airport on the way back.
I got on the bus with ten minutes to spare at 5:50 p.m. Toronto time. I finished the rest of the mac and cheese I had moments after entering the bus.
It is now 6:30 p.m. It has been 12.5 hours since I woke up this morning. Crazy how far a person can go in half a day. I'll be at North Bay around 11 p.m. Cananda time, or 9 p.m. Tucson time. Roughly 16 hours since I left my home in Tucson, I'll have arrived at my destination super-freaking far away.
And tomorrow I'll see my babuska.
I am lucky and grateful to have such priviledge and opportunity to do something like this.
Make the Easy Thing Right
02/13/15
"Don't you mean make the right thing easy?"
"No, that implies there's an easier thing that's wrong. Things should be constructed such that the easy thing is right."
Was a conversation I listened to intently at my first or second time attending the Tucson Functional Programmer's Meetup. It was an incredibly powerful thought for a design principal. Something I agreed with immediately. It's not as though that's an easy thing to accomplish, mind you, but I still believe it is a good mindset for design.
And recently I realized it's a powerful mindset for a user. If I, using some tool, have an idea of what the "right" way to do something is but do not find it to be the easy way to do it, I should start developing the skills and knowledge necessary such that that is the easiest way for me to accomplish my goals.
I've been finding putting programming tips, both language-specific and general ideas, in my spaced-repetition is helping me achieve such an ability.
Zelda Is-Ought
02/12/15
I'm not a fan of Zelda in its current form. Though, I haven't played the most recent Zelda, for the 3DS, which I hear does lots of things I wish Zelda would do.
My favorite Zelda is the first one. It wasn't always my favorite. My favorite, like many others, used to be Ocarina of Time, and for a short time I really appreciated Wind Waker. But when I went back and played the original, there was something really quite amazing about it.
From the very beginning, you are free to try what you will. Almost the entire game world is available to you, there are very few walls in place that only crumble when you've done something specific. Specifically, one dungeon requires an item from a previous dungeon (the raft), and the final dungeon requires all pieces of the triforce. Other than that, almost anything can be tackled or found in any order. It is only the player's ignorance and lack of skill that will hold them back.
This is the only Zelda game that does this. With every sequel, less and less freedom was so openly trusted to the player. Only recently, with A Link Between Worlds, am I aware of the Zelda Team even purposefully making the dungeons playable out of order.
Until recently, this was my argument that Zelda games ought to be more like the first one. I would also argue that sales-wise, the only game that sold better than the first Zelda was Ocarina of Time, and that's incredible considering the first Zelda was an unknown entity and sequels got the free marketing of being a Zelda game.
But recently I watched an episode of Game/Show that mentioned the Is-Ought problem. The Is-Ought problem was a thing I was aware of, but I didn't really understand what the problem was until this episode of Game/Show.
Basically, you can't take what something is and derive from it what it ought to be. And that's exactly what I was doing with Zelda. Which, now I understand isn't fair. Lots of people prefer Zelda as it is now. Maybe more would like the Zelda I prefer, but the evidence for that is flimsy at best.
And if I'm so confident a Zelda following the old philosophy would do well, maybe I should make my own.
Babuska Dying. What Should I Do?
02/11/15
This morning, I woke up to a call from my mother. She was informing me that my father's mother, my babuska, would probably not survive the week.
And now I've just talked to her, while I wait for the bus. I've tried to talk to her at least once a week for about two years now, but quite often I've missed a week or two. I haven't seen her for about a year and seven months. I wanted to visit her during Christmas last year, but I couldn't accomplish it.
While walking to the bus stop, it occurred to me, I could perhaps throw caution to the wind and fly up to her ASAP. That idea, however, contains many complications. My babuska lives in Canada, and there are certain things I need to do to travel accross the border. I also would need to let work know, which is its own complicated mess.
And what if I go, but she's gone by the time I get there?
Which regret would be worse? That I didn't see her one last time, or that the consequences of seeing her were more costly than I can afford? Could I even handle the slim possibility of both regrets?
All these thoughts, these if's and but's. I don't know. Maybe either choice is right and either choice is wrong.
I need to make a decision and make it quickly.
Entertainment Consumption Control
02/10/15
So, not too long ago, I considered the differences between present me and the me from Feburary of last year. I forgot one major thing: I was not reading reddit, perusing webcomics, frequenting blogs, nor watching much Youtube. At all.
I am currently doing all of those things. Perhaps overdoing it. So, let's try stopping again. Like, completely. Exactly how I am currently not drinking any soda or eating any candy (chocolate chips don't count, they're cooking ingridients... yes, even when I'm eating them from the bag).
Now, don't get me wrong, I think all of those things have their value, personal-growth-wise. I just think that where I am right now, and what's best for me right now, would be to stop doing those things for a while. Time to tend to the flames instead of gathering more wood to burn, so to speak.
....
Huh.
I think that's actually a really good metaphor for this, Stephan. Like, maybe the reason I stopped being so productive last year, after about three or four really good months, is because I burnt out. And I burnt out because I ran out of the fuel provided by exploring the various entertainment media that I had rejected. Also, you know, rejecting something that gives me legitimate joy and avenues of self-reflection that I find nowhere for so long has its own consequences, I'm sure.
Properly controlled rejection can be very powerful, I think, and I have a huge backlog of Internet action items tucked away in my browser bookmarks, anyhow. So I even have a plan for weaning myself off the dependency.
So, I'm quitting like I quit soda and candy. Unlike soda and candy, however, I have every intention of returning, and hopefully I'll figure out a more controlled consumption of these media when the time comes around, and a mindset that helps maintain that control. With my no-tolerance approach to soda and candy, I find pretending I'm physically intolerant of such things quite useful. That probably won't work when I allow partial consumption with mental consumption goods.
But the attitude should serve me well whilst I abstain for a while.
Javascript: Japanese MVP Milestones
02/09/15
All right, so minimal steps to making a kanji study tool (which can maybe eventually become an encompassing Japanese learning tool).
Step Zero: This Plan
Before I do any real work, I'm doing this blog post. This time, it's even in my git repo proper.
Step One: Blank Screen
So, like with my click jump MVP, the first step is the blank screen. Which consists of empty javascript, html, and css files. Then some skeleton html and javascript files setup for basic addition of features.
Step Two: Display a Word in Hiragana
This should be easy. Unfortunately, typing in Japanese characters isn't currently a feature of the shell application I use on my chromebook. So, I'll need to put the individual characters in via their Hiragana Syllable Entity Codes. This is fine. It's a minor annoyance for one word, but the process will be automated when I'm building vocabulary flashcards more dynamically.
Step Three: Transform Hiragana Word into Kanji Version
All right, here's where some actual Javascript will come into form. I need a function that will take in a word written in hiragana and return that word in kanji. The final version of this function will need to be more complicated/different, because a hiragana word could have multiple different kanji/meanings, and a kanji word may have multiple different pronunciations/meanings.
For now, though, let's add in some stub functionality so we can move on from here.
Step Four: Link to Further Resources on Word
This is what I would like the reveal to look like:
- Link to Japanese-to-English translation
- Link to Japanese kanji stroke-order
- Link to Japanese dictionary definition (pure Japanese)
- Input asking the user if they were correct
Step Five: Hard-coded "Database" of Kanji Vocabulary
The idea from here is to have list of vocabulary words for the user to iterate through. Again, this is a thing that would at some point be dynamically created and maintained, but for now I need a hard-coded element I can work with to understand how I will want the data-structure to work.
Step Six: Iteration Run of "Today's" Kanji Words
So, each kanji will have a time-limit associated with it before it's necessary to test the user on it again. A kanji is tested when all words the user could know that use that kanji (aka all words with that kanji that contain only kanji the user currently knows). Once all kanji words are tested, if the user got all words correctly, the wait-time will be doubled, otherwise it'll be readded to the current pile of words to draw from.
So, to start off with, let's have a setup where all words previously hard-coded need to be tested. Every failed input will be repeated to the user eventually, whereas all successful inputs will be put into the "tomorrow" pile (eventually no new flashcards will be shown to user).
Step Seven: Users
This is going to be useful only if each user has their own flashcard set. And anybody having access to my setup could allow for a lot of lost work on my end. So, it's time to learn how to have users with their own login information and settings. Actual node.js usage, here I come.
Step Eight: Actual Kanji Database Per User
The user is going to want to grow their Japanese vocabulary, both spoken and written, and the first step to that is going to need to be saved somewhere server-side. So, doing that without a user interface is a good first step to doing it with a user interface.
Step Nine: Kanji and Vocabulary Building Via User Input
So, there needs to be a user-directed way of building the kanji the user wants to keep in their brain. Ideally, there would only need to be either hiragana input or kanji input and then a dynamic search would bring back the maybe multiple results and the user picks the one they're intrested in. For now, it'll be the user putting both the hiragana and the kanji, and the flashcard will be constructed from there.
MVP Should Be "Done" at This Point
By this point, if I get through all the steps I've outlined above, I should hope to have a MVP Japanese learning helper tool.
It won't be pretty.
It won't recommend kanji for me, it won't pay attention to the list of commonly used kanji, it won't take sources that the user wants to be able to read eventually and start adding words found in those sources to the user's flashcard setup. It won't find example sentences with and without helpful translations.
But it will be more functional than the processes and systems I currently use to develop my Japanese vocabulary, and hopefully adding such kinds of functionality will be very possible.
Javascript: Kanji MVP
02/08/15
So, I really like how the click-jumper MVP went. I want to iterate on it, but I would rather focus on the Japanese study tool I mentioned a while back. But I might as well work towards it as fast as possible like my click-jump minimal viable prototype. I'll iterate on the click platformer before the next game night, though.
So, minimal viable Japanese study tool. I want to replicate my spaced-repetition setup first. So, kanji vocabulary that builds each day, which tests the user regularly based on regular correct answers with any given kanji or word.
To start off, I might not even actually have them be kanji words, just hard-coded romanji (Japanese using the roman alphabet). I'll do a step-by-step milestone post tomorrow, where I think this through a bit more throughly.
Unproductive Again
02/07/15
As soon as I titled this post I knew I would preface it with this: being "unproductive" now is way more productive than before. And today actually wasn't too bad, as far as getting things done goes. I didn't get nothing done, but I did still fall into bad patterns of doing nothing. And it's that insiduous nothing that further drains any capability of action with every passing second.
A missing piece of the productivity equation from a year ago is the daily running I used to do. My diet is pretty clean right now and I am approximately going to be at the same time each night (though that needs work still, too). But I need new shoes, and I have not made the priority to go get new ones at the wicked-sweet store about a mile down the street from work.
So, screw it, going to get another pair on Amazon as per usual and make time next month for a pair of shoes more specifically chosen for my feet at this wicked-sweet store.
My home productivity is also much better than my work productivity. So, there's definitely some stuff missing at work, or stuff I haven't properly ingrained into habit. Spaced-repetition? Morning checklist? General organization of the things I want/need to get done?
I probably need to spend a good chunk of time just exploring through my possibility space and really give my subconscious all the information and structure it needs to do a kick-ass job. Both at work and at home, but I should do work first, because home is more stable right now and there's no guarantee that any changes I incorporate in my home system will migrate to my work system (and vice versa). Or that consciously attempting such a migration is an easy task (setting up spaced-repetition at work has been difficult but I think it'll be incredibly valuable to me once it is in place there).
On the bright side, I'm reading a new book again (I wonder how this will affect my blogging throughput). Back on the negative side: I really need to write the reviews for the past few books I've read.
Urgh. Maybe blogging at home again will help motivate me there.
Javascript: MVP Late and Needs Polish
02/06/15
Here it is, Stephan, in all its glory.
I didn't finish it before game night, and so no one gave me feed back there, but a good friend was awake on chat, and he's playing with it, and giving lots of good feedback. Thanks, friend!
There's a lot more to work towards, but I like the area I have to play with. The jump mechanics clearly need the most work, but already I like the novelty of it. Clicks in all directions relative to the player redtangle need to feel right, and right now only clicks above the redtangle are even registered.
This is the best little thing I've made for this idea ever, and I've had this idea for like almost a decade now. The idea was too complicated, I didn't know how to break it down, I got carried away with code too often, I didn't know what I was doing at all. Lots of things made approaching this hard, but I'm finally breaking free of all those things.
I'm a bit better now, and I got a foothold. Time to take it a step at a time.
I can do this.
Javascript: MVP Step by Step
02/05/15
Step One: The Blank Screen
So, the very first step to any web-based thing is the empty web-page. Which in this case is going to be an empty index.html in the directory where the game will live.
Step Two: Defining the Game Space
At this point I have some library decisions to make. I could use Crafty, maybe even Construct (though that may be more for 3D games?), or I could just go pure javascript (the MVP may be simple enough that this is the easiest way to go for now). This isn't about long-term capability, this is about reaching the MVP and then I can see where I need to go from there. In all likelihood, this is a throwaway prototype.
I think I'll collect a list of plausible libraries that can help me meet my goal quickly, and then rotate through them everytime I get stuck along a certain path. Maybe define "getting stuck" as taking longer than an allotted time to do some task (which should maybe help me get better at assessing time-cost of implementation).
With my library, I need to define an area that contains the game (aka make a div that contains the game elements). This is really just the blank screen with some javascript hiding underneath.
Step Three: Static Game Elements
Populate the div with elements that don't do anything. Just put in some colored squares and rectangles.
Step Four: Generated Game Elements
Randomly generate more game elements.
Step Five: Dynamic Game Elements
Make it so some game elements move. I'm thinking falling pink squares. And keep the player-element static. The player element will be a tall, red rectangle. What is it you called a red rectangle, Stephan? Ah, that's right, a redtangle. The player will be a redtangle.
Step Six: Player Input
Make it so where the player clicks is where the redtangle's position will be.
Step Seven: Velocity
Make it so where the player clicks is where the redtangle will move towards at a constant velocity.
Step Eight: Gravity
Make the redtangle fall towards the bottom of the screen, but not fall past it.
Step Nine: Intelligent Jump Arc
Make it so the point the player clicks on the game div will be a point along the arc that the redtangle jumps.
Minimal Viable Product Done
At this point we have:
- Randomly generated falling pink squares
- Player-controlled redtangle
- Point-and-click jumping mechanics
This should be everything necessary to find the fun in this game idea, and also work on getting the jump mechanics just right.
Time to get to work.
Javascript: Point and Click Platformer MVP
02/04/15
So, I was remaking my timer in Crafty for a bit, but I don't like that idea anymore. At some point, I might like to refactor my current timer such that I could use its functionality more easily in Crafty, but for now I think its perfectly valuable to focus on the best means of getting to the next iteration of the timer.
But I do want to work on game stuff in preparation for the eventual UA Game Dev Club Game Jam (the one planned for late last month or early this month has been cancelled, but there will still be one in March). I would also like to start trying to bring a game to each UA Game Dev Club/UA IEEE joint game night.
The first game night is this Friday. I would like to have a prototype toy for my point and click platformer idea by then (aka the Untitled Wuxia Game Project).
The prototype will be as such
- A rectangle representing the player
- Tiny, randomly falling squares
- The ability to jump along an arc dictated by where the player clicks
That's it. No personal requirements for what to use and how other than it being a web-based game. So, maybe I'll use Crafty, maybe I won't.
The idea will be to get the jump mechanics feeling good, and have a dynamic environment such that the player can try to intersect with the falling squares with their jumping.
Nothing more will be done for this. No space optimizations (I'll probably just keep adding new falling squares until the game slows to a stop), no additional platforms (only platform is the ground). No super complicated physics beyond the simple jump mechanics.
I think this is something I can get done in a couple days. Which is good, Stephan, because that's all I have.
Though, I may be willing to work on this idea at the Game Night. Still, two days is all I have.
Building a Buffer
02/03/15
So, blogging on the bus has led to me publishing an extra blogpost twice so far. Which is good, because I missed two days this year. Meaning I am once again at an average of a blog post per day for this year, which is the main goal for the year (I have many other goals for the year, but this one is the one I've given the most focus).
I'm thinking now that any extra blog post I write will go into a buffer, and on days when I want to focus on something else, I'll just publish from the buffer. I'd like to get it to a minimum of seven posts, that way I can decide to lend serious focus to a week-long project (that I would hopefully write a blog post about in parallel).
I think a buffer would really help me transition from a quantity to quality philosophy for this blog. I think quantity is really good for now, mind you, because my writing is rusty, undisciplined, and just needs constant repetition of the basics before serious work can be approached. Whether or not I am really working on the basics is probably something I should write in another post (and maybe also I should peruse some books on solid writing).
But with a buffer, I can maintain my daily posting and also start working on posts that take more than a day to write. And I have plenty of post-ideas saved that would take more than a day to write. Some would take research, and some would take me writing them out, realizing I don't believe what I'm writing, rewriting, and repeat until I know what I believe.
Some of these posts are already partially written, but the problem with them is that it doesn't feel like I'm working fast enough writing them, because of my conflicting goal of writing a post a day, regardless of the quality or lenght of those posts. With a buffer, I feel the pleasure of posting whilst still writing longer posts.
And if, somehow, I build a buffer that lasts the rest of the year at some point, maybe I'll devote full focus to some of my other goals for the year (that I haven't really been adhering to at all yet). Though, I think I'm just going to have to figure out how to work on those goals too, Stephan. That, or accept they might have to wait until they can be a priority, which may not be this year at all.
Space Repetition Ideas
02/02/15
So, I am finally developing a good, daily spaced-repetition habit, and I'm liking it a lot. It's mostly composed of Japanese-based flash cards (and those are basically only kanji cards), but there are also random programming-based ones in there that I have already found useful. And, as with any system I play with, I am thinking how to gamify the setup and also how to create a web app that improves upon the physical system.
There's lots of variation on the spaced-repetition wish (a goal without a plan is a wish): both of a generally applicable tool and of a Japanese-specific tool. Just recently, the Japanese specific tool has begun to take a more solid shape in my mind. I think a good way to discuss this idea is to talk about Duolingo.
I want to preface this by saying I like Duolingo a lot. If they had Japanese, I would be using Duolingo everyday for at least some small amount of time. When I eventually return back to studying Spanish, I will probably use Duolingo.
But....
Duolingo is just missing something. Maybe something fundamental. Yeah, I'm getting words, and I'm getting sentences to learn how to string those words together, and so I start to internalize both these things a little. There isn't this layered unlocking of capability. I feel like, going down the path of Duolingo, I'd have to grok it all before a real drive to go read literature or attempt conversation would reveal itself. Something like that.
It plays like the tuorial of a game that never ends, where I never get to the actual game. The tutorial is the game, but it is clearly a tutorial.
Part of the problem, I think, is its tall hierarchy of unlockable lessons. That seems like it should be much shorter, much flatter. The vocabulary I'm interested may not be particular varieties of food right now. I see no reason why my vocabulary can't grow out of a necessity of use while playing a game (which Duolingo is) that revolves around me learning to use a language.
And so I wish. I wish I had a tool that somehow tracked how well I was grokking vocabulary and grammatical concepts and tested me on these things at increasingly distant times. I wish, once I grokked some necessary subset of the language, that it would link me to content I might find interesting and that I might now be just capable of understanding. I wish it would encourage me to create in the language well before I knew how to do anything in that language. I wish that it would link me to resources where native languagers would be able to correct my attempts.
And I wish that this tool existed for Japanese. That it included stroke-order kanji teaching, as well as the beginner hiragana and katakana alphabets.
And you know what, Stephan, maybe I should start working towards this wish.
Self Policing
02/01/15
I am regularly reminded of the concept of self-policing. It's something that is touted as a solution to various systematic problems, but often doesn't work because of... well, systematic problems.
But I suppose it's also a cultural problem. Correcting or criticizing others is often seen as offensive, especially when done in a public place, and when done between allies in a given cause, is seen as divisive or in-fighting. I don't really think such ingrained attitudes are healthy for any person or group who wants to grow.
Criticism between allies is where the most growing can be done, I think. And public criticism being acceptable allows others to see that criticism is acceptable in general towards everyone. Healthy disagreement on finer points is good, and maybe should even be celebrated.
And disagreement on big or ethical grounds is where self-policing comes into play. I think without widely spread encouragement of disagreement and criticism and discussion at the smaller level, policing at the bigger level will fail. At the smaller level nothing is at stake, expect some bruised egos or already-fragile friendships. At the big level, we're talking long-term, best-friend level relationships that could crumble, and maybe even the need for people to go to jail.
Jail-time for big-name allies is a huge morale sink for communities. It can also really de-legitimize a movement. It doesn't help that when a big-namer falls, many members of the community deny wrongdoing or justify the perpretrators actions. It can really divide the whole community, and make them all the easier to conquer.
Criticism at the small level would help prevent this, as well as prepare a community for it. At the small level, problematic members can be identified much sooner, and their actions corrected before it becomes a real problem, or their influence minimized so they don't become a real problem. And small levels of participation in self-policing by a large amount of the community could allow some amount of people within that community to be really good at it. They could gain positions as official officers within the community, they could handle big problems in a more professional manner.
I guess what I'm saying is, if you want self-policing to work, you got to cultivate a good immune system. And a good immune system needs practice to become good, and it needs a means or protecting itself as well. And also, lots of other things that I'm unaware of because I'm just thinking aloud here.
What say you, Stephan? Cricitisms?
Acceptable Youtube URLs and How to Redirect with Nginx
01/31/15
Imagine, for some reason, you want to link to your Facebook or Twitter or Instagram from within one of your Youtube videos, Stephan. As it turns out, you can't just link to it all willy-nilly. Youtube doesn't like that for some reason.
Youtube is, however, quite willing to let you link to domains you can prove some sort of ownership over one way or another. So, say you own ramblingsofselfimprovement.ksionda.me, and want to prove to Youtube you control content on that site.
They'll give you something like ramblingsofselfimprovement.ksionda.me/google5849c08b6cdcf85d.html, you'll hit a verify button somewhere, and now you can link to areas within that domain within your Youtube videos.
"What's this got to do with Twitter or Instagram or Facebook?" I hear you ask. "Furthermore, the title of this post is 'How to Redirect with&emdash;ooooh," I hear you figure out.
So, now what we want to do is make various kinds of links at our domain that redirect to each of these social media areas.
Enter our NginX config file: ramblingsofselfimprovement. For twitter, let's add the following location block of code within our server block.
return 301 $scheme://www.twitter.com/anntwirls;
}
And we can rinse and repeat for any other social media links we find we may need.
I legitimately hope someone out there finds this useful.
Today I Gave Away An Umbrella
01/30/15
As I walked to the bus stop today, after work, a man stopped me and asked for directions to the nearest Walmart. It looked as though he planned to walk, and he already looked soaked in inadequate clothing for the then-pouring rain.
He was much farther from Walmart than he thought he was. He probably thought he was about half a mile away. He was, in fact, two miles away. I explained he needed to walk two lights in one direction, and two lights in another. He thanked me for the information and started again on his path.
"Hey," I said, holding my umbrella out to him, letting the rain fall on my waterproof jacket and sweatpants.
He took a moment to process what I was doing. "Thank you." He took the umbrella and started walking in the opposite direction.
It's a strange series of events in my mind, this story. I don't mind getting wet. I often contain various items that very much mind getting wet, but me myself quite like the rain falling on me. This perspective is one of the first things I learned not to project onto other people.
And so, I give away umbrellas. This isn't the first time I've done so. I mean, I don't find myself in rain very often, and I don't find others in need of an umbrella every time I do, but I think when the rare circumstance happens that I have an umbrella that someone else may need, I give that someone else my umbrella.
And unlike many other debatably-related things, it's not even something I think too deeply about.
But anyways, long story short, I need a new umbrella.
Javascript: Prototype No Understand
01/30/15
So, yesterday, I tried to implement the state pattern in javascript, and at first I tried to have the object modify itself, and so I was trying to mess around with javascript prototypes.
It was at this point I realized I have no idea how javascript prototypes work or how to actually implement their use. I've read about them plenty, and remember seeing examples, but right now I can't imitate any of those examples because I don't really remember the exact wording or purpose of the examples.
So, I implemented a pseudo-state setup with a state variable that changes to a value representing what state it is in, and functions that act differently based on that state. This will be what I use for my timer initially. Thinking about it gives me some ideas on how to do things without prototypes and messing with the internal object that much.
In any case, some exploration of prototypes will be in order, once I implement some more functionality with my timer with what I can do right now with states and stuff.
Can't get too distracted learning new things without doing anything, and can't get too far into a depth-search on how to do something exactly how I want it without making compromises first and getting something functional quickly.
Javascript: State Machine
01/29/15
As I've been thinking about how to modularize my timer, I've come to realize that I probably want to learn how to implement the State Pattern in javascript. I'm sure there's already good tutorials online for doing just that, but I'm going to take a whack at it for the length of the bus ride home before I look up how to do it properly.
What I want is to alter the object when a state-change function that it owns is called. I wonder if there's a simple way to overload an object's members with a prototype object or something like that. That's something I'll be willing to look up while trying this out (though, I'll probably explore javascript stuff via node for a bit first, as I won't have Internet connection on the bus anyways).
Now, you may be wondering, why do I need a state machine? Because a paused timer and a running timer functionally quite different, I feel, and coupling the two things together as one thing maybe isn't necessary. The running timer needs to know when it expires and when to notify the user of certain distances to the expired time. The paused timer just needs to know how much time is remaining. In switching states, the paused timer will convert the remaining time to a specific expired time, and the active timer will convert the expired time to a remaining time value. Notification stuff will need to be saved in some way, as well.
So, basically, the timer will have the same interface regardless of state, but how it's running will be different based on the state it is in. And I'm wondering how much I can separate the two functionalities.
Though, perhaps at first it would be better to pseudo-state it. Meaning, I will save a variable called "state", and just save that variable as a string that switches between "PAUSED" and "ACTIVE", and make actions different in each significant function using a simple switch block.
I should learn a more complicated and modular means of doing that, but it can come later. I should focus on functionality and learning to do just enough good design to make improvements to code without having to start over. But for right now, starting over is probably what I'll do, and I think I'll infer better design practices each time I consider it valuable enough to start over.
Laptop Everywhere?
01/28/15
So, for a long time now I've been bringing a large lab journal with me everywhere. It's where I like to record my more bloated thinking. Unfortunately, I rarely make a habit of going back to it. It's disorganized and messy and any thoughts I have in it I would rather rethink from scratch than go looking for it in my writing.
I like the idea of having a journal, but I don't think it's a place I should keep my writing. I write faster and in a more organized manner on my computer, and I now have a place where the content I write gets read more frequently (this blog, and it's still not frequently enough, but it's a start). The journal would be a good place to draw, or do more visual or informal and sporadic thinking (something I am most certainly not good at on the computer).
And so, yesterday with my good blogging on the bus experience, I've decided I quite like having a proper computer with which to write and store my thoughts whenever I'm thinking, and I find myself getting lost in thought most everywhere.
In fact, bringing it with me today I've written two blog posts on my bus ride to work alone.
Maybe future blog posts won't be so directly related to my actual bus ride to work.
Walking Podcast?
01/28/15
So, yestereday, after blogging on the bus, I needed to finish up the post while walking home. Typing while holding a keyboard is cumbersome, Stephan. But, I did quite like that my thoughts while walking were being focused and recorded. I quite like the thinking I do while walking. Unfortunately, it seems to be the thoughts I have while walking stay within the walking protions of my life. I don't find myself revisiting many of the thoughts I have during my walks.
Several times, while walking, I have even thought of this problem, and thought maybe I should record myself while walking. I could save this recording for future reference or even have the raw recording available for download/streaming somewhere in the Internet ether.
These thoughts more-or-less did not repeat themselves outside of my walk, so I never ended up doing it. But that little bit of awkward writing I did on the walk home yesterday may have just broken that cycle.
The plan:
- Download a recording app on my phone
- Start habit of recording myself on any long, isolated walks
Short plans for new, unexplored territory are probably the best in this case.
Blogging on the Bus
01/27/15
Or, more accurately, blogging whil waiting for the bus. So, "Blogging at the Bus Stop"? Well, maybe both, I'll let you know when I get on the bus, Stephan.
Anyways, why the new environment? Well, usually I read in this environment, but I've managed to read two books this month, and also finish my ACM and IEEE literature. I'm not burnt out, mind you. In fact, my goal is to eventually read a book a week. But I know what book I want to read next, I don't own that book, and I've overspent this month.
And so, today, and for the rest of this week, I am lugging my chromebook around with me during my travels, to do various computer-related stuffs sans Internet. This morning, that consisted of javascript writing exploration. The timer ideas I had were clearly... incomplete, to say the least. But it's good to understand that quickly instead of just thinking about it endlessly.
I think maybe I do too much thinking. Like, purely in the head thinking. It seems like it's in the form of properly constructed language, but I know from experience that when I try to write it down, I find that it's mostly abstract sentence fragments loosely connected together.
I don't think there's anything wrong with this in small doses. It's when I let it cascade out of control, which happens all the time, that it's problematic. Thoughts trapped inside my brain are caught in an echo-chamber. The idiomatic kind in that my thoughts can only really reinforce themselves, and the metaphorical kind, in that (I have just now entered the bus, Stephan, and had a wonderful conversation with a person named Andy) my thoughts reverberate in my skull causing a haze of repeated thoughts over new thoughts, like the cacophony of the background chatter in a party.
The bus stop nears....
What I'm trying to say is I need to try to enter a dialog when the brain becomes too loud. A dialog with the keyboard at least demands a clarification and distallation of wandering thought. It gives me a concrete thing to look at and say, "Ah, so that's what I'm getting at."
Javascript: Minimal Timer Interface
01/26/15
So, I've been thinking about what a good, minimal javascript timer would be for general use. Someone started talking to me about it today, Stephan, and now I can't stop thinking about it.
So, what would a minimal alarm timer be?
- Store alarm (multiple?)
- Check if the alarm is triggered
- Execute something when the alarm triggers
- Pause the alarm(s?)
The alarm doesn't need to pay close attention to the time. Something else would be in charge of timely checks to the alarm timer. This simple interface could then be wrapped in various javascript tools for whatever use. The first thing I'll wrap it in is Crafty, as a timer component, and then I'll continue to remake my countdown timer app using Crafty.
First Month Failures
01/25/15
So, as far as goals for the year goes, not really off to a great start, Stephan. To be fair, I planned a lot of stuff and made no real plan to execute those things.
....
That doesn't sound like a good excuse when I write it down. It's as my brother says, "A goal without a plan is a wish." Seems like I was doing more wishing than planning. I guess working towards an actual plan might be a good step.
The Meta Plan
Okay, so I need to build habits that lazy me agrees to. I need to build personal rituals that get me into a right mindset. I mention last Feburary a lot, and now another Feburary is coming up. It's time to shotgun everything I can think that I did last year to get into that amazingly productive period of my life, but now with more knowledge, experience, and know-how.
So, what was I doing?
- Going to sleep at the same time everyday
- Counting calories
- Running about 2.2 miles per weekday
- Extra-curricular work before actual work each day
- Consistent diet patterns
- Consistent cleaning habits
What wasn't I doing?
- Drinking soda
- Eating candy
What did my environment contain?
- ....
What was not in my environment?
- Cats
- Dogs
- Weed-infested yard
- An unmainted, dirty area
Some differences (aka, the lack of cats and dogs) are impossible to reverse, but I can reset a lot of these variables back to their status a year ago. Not much to sacrifice, and maybe a lot to gain.
I might as well try it. Maximizing my personal state-of-mind should give me the resources necessary to work towards an actual plan for the myriad goals I have for the days, weeks, and months of this year.
Javascript: Crafty Timer
01/24/15
I have the beginnings of my timer remade using the Crafty javascript game framework. I'm on my second commit, and I have setting the timer, starting the timer, pausing the timer, and such working.
It was at this point that I was momentarily stuck. It may have been related to me being sick and just hacking away at code, but I wasn't really sure of an elegant means of adding more functionality. It already seemed too tightly knit. Which, in all honesty, is probably a quality that my currently used timer has. I am only so able to manipulate it as I am because it is 1) not that big yet, and 2) I interacted with its code on an almost daily basis until changing my focus back to using Crafty.
Which really just reminds me, I should start over more often. And I mean, start over without even referring to my previous attempts. Using Crafty makes me think I should shoehorn some library in and try to integrate it. Really get a feel for what's useful where and why.
But also, starting over is just really valuable. I find myself embracing ideas I've recently read, and various bad coding habits and craft patterns reveal themselves to me in the process of recreating. They reveal themselves in that I notice that they cause problems and give me trouble during the recreation.
It is incredibly useful.
I may just abandon development on the timer I currently use, and just cycle through recreated timers and general productivity tools. I'll switch to using the new one as it outperforms the previous one.
I'll do this until I become good enough to build and use proper modular libraries that can withstand more and more developement being thrown onto it.
And then I'll start working on proper development focus.
Older Me Can't Handle the Sick
01/23/15
So, I've been sick the past few days. The first day I just forgot to blog. Today, I almost forgot. Technically it's tomorrow, but whatever, it's not tomorrow until I go to sleep and wake up, Stephan.
I am not used to being sick for periods of time longer than a day. I mean, I used to get sick for more than a day every once in a while, but I feel like it used to only be bad for one day, and then I'd get back into business.
I'm on the third day of this cold... thingy, and maybe I'm worse? Egh, it's all really annoying. I slept 14 hours and I just want to go back to bed.
On the bright side, I've found some time and energy to remake my timer using Crafty. No sound, yet, but input, start, and pause all sorta work. It's a way to work on my timer while also practicing for the upcoming Game Jam (previous blog post was wrong, it's not this weekend, it's next weekend).
Sparkfile
01/22/15
So, I've been saving small ideas as rough drafts for future blog posts lately, and I've realized that doing this more consistently is basically making my blog a sparkfile. Which I've mentioned before.
I like this aspect of my blog quite a bit. I've been wanting to have a sparkfile, and have a few floating around, but I'm not consistent with them. I am, however, pretty consistent with this blog. I've only missed two posts this month so far, and both times were just plain forgetting due to more-or-less uncontrollable circumstances (being sick yesterday and being busy all day earlier this month).
The next step for this sparkfile blog of mine is to actually reread its content semi-regularly. That way I'll more frequently be reminded of ideas and content I want to revisit, iterate, and improve upon.
Another step in making this blog a public-facing tool for my personal improvement.
What News is to Me
01/20/15
I personally don't like the "the news should be X, not Y" argument. In this day and age, there's limitless platforms available for any kind of news setup. My only requirement for news to actually be news is to cover some perspective within this reality about any given thing. Good news simply covers that perspective well (aka, a pretty complete perspective giving some sort of insight or understanding to those whom are alien to that perspective).
It doesn't have to be objective, it doesn't have to be fair, it doesn't have to be non-partisan. Perspectives aren't any of those things. Now-a-days, it's easy to immediately get the opposite perspective almost immediately. And, in reality, I don't think the news was ever non-partisan, they only pretended to be, and such dishonesty only ever hurt it.
Though, I am not against non-partisan data. It's just, that's serious work, and needs to be taken seriously. Random samples, peer review, double-blind setups, serious analysis, serious considerations on how to present data without implying things the data doesn't imply. Real science.
That stuff should happen, and I think a news platform that takes that seriously would provide excellent and actually scientific insights, but all news being that way? Information would lag behind the events for way too long. A myriad of quick perspectives could perhaps approximate such proper science, and anything that needs it could get the proper scientific treatment.
At least, those are my thoughts for now, but my opinion here is changing as I constantly get new information and resources. Already, I may be changing my opinion as I read and internalize the Society of Professional Journalists Code of Ethics.
Javascript: Back to Games
01/19/15
So, I've been focusing on my timer, which has been good. It's getting to the point where I need to add proper mouse controls and make it clearer how to use for any visitor and/or potential user. It could also be much prettier.
But I haven't been making HTML5 games for a while, and the semester is starting, and the UA Game Dev Club is starting up again. This semester they're planning on hosting two game jams: one at the beginning and one near the end. The first game jam will be from January 23rd to the 25th. That's next weekend.
So, unlike last game jam, I'd like to show up a bit more prepared, warmed-up, and with some vague notion of a plan. I think the best means of approaching that is to work towards a game everyday again.
Time to pull out some Crafty-ness.
GamerGate: the Unowned Word with Multiple Meanings
01/18/15
So, I've done a lot of reading into GamerGate, and I'm tired of it. I would call it a waste of time, but it helped me develop a lot of personal philosophy: the purpose of journalism, what constitutes good journalism, what defines a group, and the nature of making excuses. And I'll get to that someday, but for now, I want to talk about the word.
I understand the frustration from people in GamerGate whom actually want to focus on journalism in video games, but the problem is you are using a made-up word which no one owns to label your actions. Because no one owns it, anyone is allowed to use it to label any given action, and they aren't wrong. So the harassers using the term make it about harassment. Unfortunately, they're the most visible, and debatably they started this whole "movement", so that's what it looks like to everyone on the outside looking in.
Well, that, and now the general harassment prevalent in gaming (and the Internet, because gaming has a large presence on the Internet) since who knows when has a name: GamerGate. So named because after seeing most of the hate coming their way with the tag "GamerGate", people being harassed call it that, regardless of whether or not it comes with the tag now. And again, they're not wrong, because the word isn't owned by anyone. It can mean whatever people infer it to mean. There is no official representative on the word that can say what is and is not approved as GamerGate.
And I really don't see how people who want it to be about games journalism think they can derail the harassment conversation by saying, "It isn't about harassment, it's about ethics in games journalism." It's not about ethics in games journalism to the people being harassed. All that looks like is an attempt to distract away from the issue they are focusing on. Which is ironic, as this is one of many things that the "ethics in games journalism" accused those harassed of doing.
Also, I just want to say that it's great that the general Internet and gaming hate has a short, succient name now. Names are powerful, it really helps anthropomorphize the problem, and makes it much easier to clarify and distill a culture that gets muddied by being embedded in hazy human nature. Whereas before pinning this down seemed difficult by the victims of this harassment, now it's much simpler.
Maybe next time we don't have to let these people name themselves and hide behind hopefully well-meaning people.
Building Spaced Repetition Flash Cards
01/17/15
So, I've wanted to get into the habit of spaced repetition for pure knowledge information, and by "pure knowledge", I mean knowledge that isn't particularly tied to a set of tasks or processes. Vocabulary, array initialization, system argument access, alphabets, syntax, etc. The things that if you don't use them regularly they just quietly sneak out of your brain, and you have to go find them when you need them.
Spaced repetition is supposedly a means to keep that stuff quickly assessible in the brain. I've known about the concept since college, but I never properly tried it out. I think I have all the infrastructure that adding some folders and flashcards shouldn't be a significant increase in the day-to-day.
So, I will add the following folders to my ' tickler:
- daily flashcards
- every other day flashcards
- weekly flashcards
- monthly flashcards
- bimonthly flashcards
- half-yearly flashcards
- yearly flashcards
And I'll probably keep an hourly flashcards folder in my backpack or in my notebook or on my person somehow. Of course, no plans survive contact with the enemy, so I'll make the folders only as I need to use them, delete folders as they are no longer useful, and add folders as necessary.
Once I get a feeling for the paper version, I will work towards a simple online tool for similar usage, I think.
Retrying Old Sleeping Strats
01/16/15
For about a month or so around Feburary 2014, I had complete control of my sleep schedule. My discipline was high enough that I went to sleep at the same time everyday and woke up less than 7.5 hours later each day (if I woke up too soon, I punished myself by waking up for the day).
I'm not currently in that level of control, and I'm still not sure how exactly I managed it. Diet? Consistency of habit? Learning to convince lazy me of things while productive me is in control?
I'm going to try various things again and see if I can regain that control.
One thing that really seemed to help me was reading that melatonin lingers in your system for up to around 30 minutes after waking up. So, when I woke up, I convinced myself I should try getting up even when I really felt I could or should keep sleeping.
So, reminder lazy future self, you don't really need more sleep, it's just the lingering melatonin.
Convincing People to Leave
01/15/15
So, today I went to a Smash Bros. tournament. It's at a place that holds them weekly, and a good friend of mine was a major contributor to organizing such events.
This is the fourth time or so I've gone to this weekly tournament, but I haven't been there for a while. There were a lot of people there this week. The scene has been growing nicely.
I was really enjoying my time there, even though I was being beaten down hard. And then someone started being obnoxiously loud. It was slightly sporadic at first, but then it was a constant stream. It hurt my ears.
At some point I told him to shut up. He was being insulting anyways, so I'm not sure if he acknowledged me or not, but there was definitely not any attempt to quiet down. Now, I didn't really go any further, and maybe he would have quieted down if I properly asked him, but I was already tired and annoyed, so I quit my game, and prematurely left the tournament, and just went home.
I think it's important to think of the purpose something has, and what actions help contribute to that purpose and what may be a detriment. Now, I understand cheering and yelling in the heat of the moment, but at some point you may just be convincing people that the scene isn't for them. And these could be people who really enjoy the actions being done, but something unrelated is driving them away.
I am seriously considering quitting the whole Melee thing. That's how bad that short experience within a pretty cool, fun time was for me.
Using Twitter
01/14/15
So, I have been wondering whether or not I should link to each of my daily posts on Twitter.
On one hand, Twitter is all about quantity over quality, but on the other hand, I would like to only point out stuff I've put serious effort into. And I am slowly working on things I'm putting effort into.
Most of these posts are either the first sparks of an idea, or just a straight up personal diary thing that I have no problem making public for anyone interested in seeing. I don't really think it's proper to shout them out to the world. If others find it so interesting to do so somehow, they can do so on my behalf, but the posts that I do put serious effort into, stuff that's actually a dialog with a wider audience, those I'll shout to the world.
Otherwise, I'm quite content to just lurk on twitter and gain quick, shallow glimpses at a large variety of perspectives.
Governments Need a Chaos Monkey
01/13/15
So, I was thinking earlier today about governments as a system, and it occurred to me that it should be built into the governence to break itself in strange and unpredictable ways to more quickly find abusable and perhaps dangerous policies before they are abused or cause damage. Governments need a Chaos Monkey.
Distraction Habits
01/12/15
I find myself wasting a lot of my time on unproductive sites and subreddits again. It's mostly during the morning, a time I used to reserve for my daily goals, of which I've moved to the evening.
Part of the problem is that I don't like any of the Chrome alternatives to LeechBlock, and LeechBlock itself is not available on Chrome.
It's to the point that I am considering working on making my own Chrome extension.
The steps:
- Make Kitty-Klicker, the kitty picture Chrome extension
- ???
- Fully functional personal productivity Chrome extension
Who knew it was so easy, Stephan?
Javascript: Back to the Timer
01/11/15
So, I haven't worked on the timer for about a week now. The last thing I managed to commit was a youtube video popping up when the timer expires.
It's not something I've pulled into this website's timer yet, though, because I want better youtube functionality before I switch from the perfectly functional public-domain song playing setup.
As far as youtube functionality goes:
-
Need an input box that takes a Youtube url
- Let user set alarm they desire
-
Use the official,
flash-requiredYoutube API- Finding the link just now alerted me to the no-flash-required iframe Youtube API
- Maybe minor Youtube search functionality in the timer itself?
Some things to do to improve the code of the timer app:
-
Improve timer expiration naming convention for code readability
- Right now, it is named after the song that plays
- Run the code through JSLint and iterate
I think I'll focus on improving the code before continuing development on the youtube setup.
Blogging While Tired and Distracted
01/10/15
The past week or so marks the return to work after a long, two-week, glorious vacation. I may or may not be sick, too, so all the free time and energy I had over vacation has suddenly disappeared.
It used to be that I would make time in the morning, before work, to do extracurricular work. In many ways, that would be ideal, because I have the most energy and it starts the day off right, and if I don't work that day, I still have the habit of doing something right in the morning, which is the recipe for a productive day.
For a variety of reasons, though, mornings don't work for me right now, so I'm trying to be productive after work. I was getting into the groove of it before vacation, but I've found I have to relearn those habits after vacation. I've found I have even regressed a bit with work habits.
This is the longest vacation I've had in a long time, and regression is something I'm no stranger to, so I really should have been more prepared for it and had a plan for it, I think. Even so, I'm recovering pretty quickly at work, and hopefully extracurricular work isn't far behind.
Anyways, the only daily thing I've managed the past week has been blogging, and that has been while extremely tired and also watching TV at the same time. Today, not that tired, but there is a TV in front of me, playing something I'm slightly paying attention to.
I don't know if I'm okay rebuilding this habit of continual distraction going on in the background. On one hand, I've had great success doing this throughout a great chunk of my life, but on the other hand, I have experienced incredible value learning to set aside time and focus on only one thing in a distraction-free environment.
But the world is a chaotic, non-distraction-free place. Rebuilding a habit of getting work done in a variety of settings and distraction-levels seems really valuable, too. It also helps lend to an intrinsic understanding that I can do work in any setting, and with my AgileGame training, any arbitrary amount of time.
The quality of my posts this past week are really below my already low standard, though, I think. But I'm glad I still wrote them. I think nothing is a far lesser standard for where I am in writing. Having not practiced Javascript, or played AgileGame outside of work, or studied Japanese, or not done any of the other things I haven't made time for this past week is a bigger sin.
I'm glad I've written those posts. I'm glad to have done something I'm unsatisfied with as opposed to a nothing I can ignore. I want to do that with a greater variety of things than just blog posts, and I think I need to properly ingrain in myself that nothing is the worst kind of failure for anything I actually want to achieve or work towards.
And as far as an outside observer is concerned, just thinking about it is the same as nothing.
C++ Learning Via Friend's Game
01/09/15
So, I've been focusing on learning Javascript, but I still also want to get good at C++. I'm getting some experience with it at work, but I'd like to approach it and learn it via other codebases and environments.
I've felt this way for a while, but between focusing on Javascript and not having an idea of what to work on for C++ experience, I just let the thought float in the back of my brain. However, recently my friend posted a link to a github repository of the game he's working on in C++.
I promptly forked his repository. I hope to make some time this weekend messing around with the code, and gleaning some good C++ practices and understanding out of how he went about building the game. Maybe I could help him with the process somehow. Though, according to the readme, it's a remake of one of his earliest games, so I don't know how interested he is in collaboration. It's probably purely a learning exercise.
Either way, definitely something I want to poke around with, if not take as a serious side-project.
I Don't Know What to Write About
01/08/15
I have lots of things that I want to writ about, but I'm freaking tired. I was considering not writing anything, but I'm just going to see what writing about not knowing what to write about goes.
Lately, I've been thinking a lot about systems that govern my life.
Nevermind about that, let's talk about Universal Basic Income. I am pro UBI.
Nope, not feeling it. I'm gaining an appreciation of the everyday habit. It's unfortunate that so far I'm only properly consistent with my blog. I was getting consistent with coding and Japanese studying, but after Christmas I kept forgetting about Japanese, and after returning to work, I haven't made time for more daily javascript practice.
At least I've been reading Javascript: the Good Parts daily. Which I'm getting it a lot out of.
Today, I thought about how much work I'm doing when I feel like I'm moving slowly. The times when I have to sit down and grok what I'm doing, why I'm doing it, and how it fits into the system I'm working in. And the system itself needs more poking and prodding to understand.
This is what I spend a lot of my productive time on. Thinking. Figuring out things through rumination. It's something I'm still not great at, I think. I let my brain hold too much stuff at once. I think I try to understand too much in my head, mentally running code instead of figuring out how to actuall run the sub-sections I need to understand.
I'm slowly building better habits.
Enjoying Christmas Presents
01/07/15
I have recently started proper enjoyment of my Christmas gifts. Specifically, I received two books:
I was a part of a secret Santa setup, and just linked everyone participating my Amazon book wishlist. The person who got me... got me these two books.
I'm really excited about the first book. It's what I'm reading first, and I'm already a good chunk in. I can tell it's going to be very valuable to the development of my Javascript craft. Already it has explained aspects of Javascript that I have encountered but did not understand.
Currently, I'm on the chapter discussing inheritence. It contains some very interesting insights into object construction: why classical inheritence should be avoided, how to make properly private data, and giving all instances of something greater functionality (including instances that already exist).
It's all super cool and opening my mind to programming paradigms that I am unfamiliar with.
Philosophy Post Attempts
01/06/15
I would like to try to post my personal philosophy more often. But I'm not sure how I feel about making such thoughts public. I have strong, uninformed opinions on a lot of things, which defintely would be more easily fixed with public-facing content that people could correct me pretty easily. But also, having opinions, having strong opinions, easily accessible via public ports, that's like asking to burn bridges before they even have a chance to form.
I could realize I burned bridges on opinions I don't have anymore. This seems maybe a petty thing to worry about, but I understand that this world is full of lots and lots of people, and I think people deserve the right to disassociate with whomever they choose for whatever reason. So, it's my responsibility to think carefully about how I present myself such that people don't want to disassociate with me, I think.
But, I need to share my thoughts on things. I need feedback, I need to practice communicating ideas I find very important. Ideas I feel define me more than most anything else. I can't keep that personal.
I may need to just let the random bridges burn, especially since I can't know I've burned bridges until I have. I may also build bridges by sharing my more personal philosophical thoughts. So, yeah, gotta be okay with the publicness idea, I think.
The Day After Vacation
01/05/15
Sometimes I think the least productive day is the day right after a vacation ends. Which maybe makes it a good thing that a pipe above my house burst and I had to stay home from work to wait for the plumbers to arrive to fix it.
I had this big pile of things to do today, and I only managed to do most of them because I didn't end up at work, and even then I still have a lot of reminder items scattered around my desk right now.
- Clean washing machine
- Daily drawing
- Daily Japanese practice
- Renew ACM membership
- Personal AgileGame session
But today I'm just tired and I'm hoping the little organizing and prepping I've done today will help along the transition from vacation to working schedule again. The best thing I did was not go back to sleep today. Hopefully, my sleep schedule is back to normal after today.
Forgot to Blog: Noooo!
01/04/15
Yesterday was a busy, final full day at my brother's house, and I forgot to write my daily post. So, just short of two full months of daily posts.
It sucks, but the streak isn't as important as the attempt, or the approximate achievement of a blog post per day. The goal is still an average of a blog post per day, and also to get as long a proper streak as possible.
I haven't even managed to do any of the other daily things, but I plan on getting to that proper when I come home from vacation. Cal Newport argues that the daily attempt doesn't work, but I think it's more an argument of making it an all-or-nothing goal. It's an on-going process, where daily success or failure are small slivers of the final grade.
So, oh well, I missed a day. Time to start counting the streak again, I guess, but ratio wise I'm at 0.75 post per day for the year, which is okay. I'll make sure that's much closer to 1.00 by the end of the year.
Super Mario 3D World Impressions
01/02/15
A Ramble on Nintendo
Nintendo upsets me. Like, if they just made games I didn't like I wouldn't care. But they make games that are so close to games I would love, but have all these features that make me hate them instead. And what's really crazy is they used to make games that didn't have those infuriating qualities. I love those games.
- Super Mario Bros.
- Super Mario Bros. 3
- Legend of Zelda
- Metroid
- Starfox 64
- Super Smash Bros. Melee
- Wii Sports
That's just a few, I really love a lot of Nintendo games. As time went on, though, I found myself dealing with more and more nonsense to get to the content I wanted to actually play. I also found the rules of the game less engaging leading to less replay value, and worse risk/reward setup for playing.
A Ramble on Lives
Death in games... or failure, really, isn't as thought-out as it was. I mean all games, but with Nintendo you can see it happening to one company. The infuriating thing about this is that people notice death isn't well-implemented in games, but instead of looking at how older games did it better, they talk about lives and such being an outdated mechanic that should die.
Argh!
Lives are a great mechanic. Sometimes they aren't necessary, and the game would be better without them. Sometimes they're implemented poorly. But sometimes they can greatly improve the game.
Lives are next to pointless in the new Mario game. Just like every Mario game since Super Mario World. What purpose is there for lives if every level you've beaten both stays beaten and stays playable after you beat them?
I wonder if the problem is that they're called lives. If they were called fortitude, barricades, or some sort of resources. Something that implies that losing in a level is allowing the enemy to beat you back and gain their ground back. The game can look like it's winning instead of just slowly losing.
But, you know, this is a problem that lots of games have, and I'm rambling a bit about something that angers me so much about so many games, and something I've even blogged about before. Though, I definitely should blog about it again, but right now, let's talk about Super Mario 3D World.
Super Mario 3D World
This game, like all Nintendo games, starts me off so happy. Nintendo games just have that polish. Everything is as it should be. The controls are crisp, the game looks great. Things are imaginative and engaging.
Then I start to notice things and the magic fades. The good just isn't enough for me to ignore the bad. The bad exists in such a way that I just can't ignore it. In fact, this is the first Mario game where I'm literally not allowed to ignore it to beat the game.
The Collectibles
Collectibles are a thing I've grown to hate in games. Like lives, though, I'm sure they're just done in an especially annoying way. I believe I still like how Banjo-Kazooie and its sequel did it, but I find myself liking Super Mario 64 less and less as time goes on, and that's the best of the Mario collect-a-thons.
3D World pretends to be a 2D Mario game, but with 3D levels. However, it maintains its collect-a-thon 3D heritage in an incredibly obnoxious way. Each level has three hidden green stars to find. This isn't new; New Super Mario Bros. started it, I believe. But in those games, you can ignore these collectibles and still play most of the game. Past me's obessive complusiveness didn't let me do that, but current me ignored it this time.
No dice. Turns out, you need a certain amount of green stars to enter the boss levels for each world. So, I'm forced to replay levels for no adequately explained reason.
I greatly wish to write down certain vulgarities here.
No seriously, this isn't explained or justified anywhere. Now, cool things don't need explanation, but tedious nonsense requires it. There better be some cool narative explaining why these stars both 1) exist in the levels I'm playing through, and 2) are necessary items for my quest.
This seriously pisses me off.
Like, if this flaw wasn't present, I'd overcome the other flaws, which I will cover more below. I'd love this game. I mean, it wouldn't be a favorite, but I would recommend it to others. I'd consider it a powerful incentive to get a Wii U.
More Rambling: The Wii U
I didn't expect to like the Wii U at all. That the system had to update for over an hour during its first boot-up did not help my opinion.
But after those updates, I started to fall in love with the little machine. The handheld controller is light and surprisingly comfortable. Also, it brought me back to the days where I had two TVs setup in the living room so I could play games while others used the main TV.
Nintendo is basically the only gaming company still properly interested in local multiplayer, and all the games my nephew started with is a testament to that.
- Nintendoland
- Super Mario 3D World
- Just Dance
- Super Smash Bros. for Wii U (uninspired name is uninspired)
The problem is, however, that these local multiplayer games aren't better than the local multiplayer games that Nintendo has provided in the past. They aren't new, either, they are rehashes of those games. Now, Nintendo takes its rehashes seriously, so much so that many consider them remakes or sequels. But that doesn't change the fact that their new games aren't new, and they aren't really better.
So, why bother spending premium prices on such content? I feel the same about the PS4 and the Xbox One. The games aren't better and they aren't new. The better tech has worse operating systems, debatably worse software, and controllers that are more or less the same. What's the point?
Back to Mario
Why is it that every Mario game follows the same themes over and over again? Eight worlds, same worlds in the same order. Grassy or plains world, desert world, ice world, poison/giant world, rocky world, sky world, lava world. More or less.
- Super Mario Bros. 3
- New Super Mario Bros.
- New Super Mario Bros. Wii
- New Super Mario Bros. 2
- New Super Mario Bros. Wii U
- Super Mario 3D World
Those are the games I'm sure follow this formula. Why? This wasn't how Mario sequels used to work. The first four 2D Mario platformers all were considerably different from each other. Different powerups, animation, art, worlds, and even mechanics.
Now, I understand that Super Mario Bros. 2 is not really a Mario game. Well, more accurately, it was not originally released as a Mario game. Reskinning Doki Doki Panic as a Mario game, however, works perfectly and was brilliant. It might have also shown Nintendo that exploring Mario more deeply was a more profitable path than their failed rehash that was Super Mario Bros. 2 in Japan.
And up until Super Mario World, every game was different, and yet distinctly Mario somehow. And then 2D Mario was abandonned in favor of 3D Mario, which itself had each game be a collect-a-thon for stars.
Disappointing.
Why is 3D Mario Pretending to Be 2D?
Seriously, why does this need to exist. 2D Mario is more popular than 3D Mario! Just make it actually 2D and be as clever as you're being, but in 2D! You can still mess with the user with 3D tricks, because the game is rendered in 3D. The tricks could be even cooler with forced 2D playing, I think.
Seriously, the clever 3D is only sometimes novel, and then the rest of the time when I notice it, it's annoying and getting in the way.
And why is this game, pretending to be 2D, getting way more cool stuff than 2D Mario games are getting? Peach as a playable character? The characters play like they did in Super Mario Bros. 2? A wicked-sweet cat powerup?
Does Nintendo just hate real 2D Mario?
This Game is Not Worth It
The good in this game does not outweigh its bad. The bad just annoys me. Maybe even angers me a bit. I'm a little bitter about it, even. I want Nintendo polish without the Nintendo nonsense. Those are my favorite games. Why do I have to dig through the indy gaming scene to find new Nintendo-style games, Nintendo?
New Year's Stuff
01/01/15
So, it's a new year, eh?
That means resolutions and stuff, right? I don't remember doing resolutions very often. I mean, I usually decide to do something sometime during the year and just try to start then.
Thinking about it, I only recall one resolution I have done: taking the stairs over the elevator. This was two years ago, I believe. I had noticed during Feburary that I hadn't taken an elevator yet, and decided to make that my post-hoc resolution. I believe I ended up taking an elevator quite a few times, but I'm not one to believe in all or nothing resolutions. I probably took the stairs over 90% of the time where I had a choice.
That's a clean A right there.
So, anyways, on this New Year's day, I will list some goals I have built up over the last year, and maybe by the end of this year, I can grade myself on how well I approached those goals.
Okay, lessee 'ere:
- Daily
- Blog post
- Drawing
- Japanese studying (pick one)
- Kanji
- Vocabulary
- Syntax
- Lang-8 blog post
- Exercise
- Dog Walking
- Personal AgileGame Session
- Weekly
- Weekly Review
- Single Feature Project
- Monthly
- Book reading
- ACM magazine reading
- IEEE Spectrum reading
- Book review
- In-depth article grok
- Multi-feature project
- Monthly Review
- Article post (post for broader audience)
- Yearly
- One polished game
- One polished web app
- One serious drawing
- Yearly Review
- Specific Stuff
- AgileGame iterate until it is an idle and/or unfolding game
- Start with polished timer app
- Vim unfolding game
- Website backend transfer from nginx to node
- AgileGame iterate until it is an idle and/or unfolding game
Lots of stuff I want to do, but a year is a long time, and those daily, weekly, and monthly things are stuff I can practice at.
New Year's Eve Stuff
12/31/14
So, here it is, my last blog post of the first calendar year of this blog. This blog, my first blog I have ever kept going. So much has happened this year. Not nearly as much as I planned or wanted, but so much more than the usual amount per year.
Review of This Blog, Specifically
By now, for this blog, I really would have liked to have it be more than static html files. I still go through the cycle of writing a post, copy-pasting the content to the main blog page, and then updating my still basic RSS manually with a new entry for the new blog post.
By now, I've come to accept that making that change isn't something I'm exprienced enough to do quickly, and something I don't give enough priority to to make the time necessary to do it. So, the answer is to keep producing stuff I care about until I can trivially mutate my site into something where updates take fewer steps, and stuff.
As far as blog content goes, I've done some thinking about what this blog means to me, and I will continue using it as a public diary. I like what this blog does for me, and if anyone else gets anything out of it, that's icing on the cake. But, I like icing on my cake, Stephan, so I will work towards regularly making content that's for more than just me. I'm thinking I'll work on having periodic blog reviews/rereads, wherein I point out blog posts that are probably worth other people's time, and also highlight blog posts that are close to worthwhile, but need some work. Put them in a "blog better" list or something.
Oh, now's probably a good time to look at stats for my blog.
150
~/site/blog$ wc -w index.html
49886 index.html
So, 150 blogposts and 49886 words in... when did I start again? Ah, yes, May 7th. So, that's 238 days, then. That's a ratio of more than 1 post every other day, which is pretty close to a ratio of a blog post everyday. Like, it's not close-close, but it's about as close as it gets, when rounding days per post or whatever.
Also, my current streak is my best streak yet! Starting November 9th, I have done at least one blog post everyday. Freaking woo!
Work Stuffs
This is probably the best year for work. It's kinda not saying much, though, as I've been performing well under my standards since basically the beginning. The first full-time year, though, was a really addicting problem to solve, so I managed to be really productive. My current task, however, isn't so naturally addicting to me, but I'm approaching addictive levels of productivity.
Really excited for the next year.
Personal Productivity
Far and away, this has been my best year, ever, for doing personal projects I want to work on. These projects served purposes beyond mere entertainment.
I've managed to:
- Make two games during UA Game Dev Club Game Jams
- Make a personal website
- Make a personal blog
- Make a paper-prototype productivity game: AgileGame
- Make a timer to use for the paper-prototype
- Learn a decent amount about javascript
- Read about 9 books (I'll do proper counting later)
- Write about 5 book reviews (I'll do proper counting later)
Wow, when I was first trying to think about what I had managed to do, I felt like it wasn't that impressive, but compared to previous years, it's actually pretty great. Definitely the best year for doing things for fun. I am greatly anticipating the next year.
The Worst and the Best
The worst of this year was pretty close to the best of the last year. Last year was bad for me, though, but still, best of last year was still pretty good.
The best days of this year were the best days of my life. No question. I mean that literally. They were normal days. Days I went to work, but for a long string starting Feburary, everyday was the best day of my life. Things fell together, and I thought it would last forever. It didn't, but who I was afterwards was a significant improvement on my previous self.
Now, I find myself meticulously improving my system again, this time with proper control over my own productivity, and even with a game focusing on executing goals efficiently. I wouldn't be surprised if I achieved maximum productivity again before this coming Feburary.
Next Year's Goals
Coming next year, Stephan.
Happy New Year's Eve.
Steam Skinner-Box FTP
12/30/14
A thought occurred to me as I laid in bed this morning: Steam is one of those skinner-box free-to-play games. It's entire design is around getting you to collect a large amount of in-game currency and/or objects of no real-money value via real-money purchases.
That is all.
Review: Visual Display of Quantitative Information
12/29/14
I bought this book about three years ago, I believe. A good friend of mine told me that one of my favorite professors considered this book to contain incredibly important concepts. After reading the book, I think I agree. I finished this book about three weeks ago. This book, like the one I read before it, started with a plan and ended with me just enjoying the read.
The Original Plan
I want to get good at graphing data using d3.js, and this is a book about presenting data clearly and accurately to an audience you respect. So, I thought it would be useful to ingrain my reading of Visual Display by implementing its principles with d3.js exercises.
I didn't do this. At all. I have still done very little with the d3.js library. I will make time for it eventually.
Enjoyable Reading
I was hooked on this book from the beginning, basically. It begins with a history of charts, which really is just fascinating. Like, I mean, I understand that it may not seem interesting to most people, but just think about it: how much do you know about the history of how anything came about? How much do you even think about it?
I had never really thought about the history of charts until reading this book. It's suprisingly short (charts are a new thing), and a few simple mutations from a basic map. In fact, maps are literally what the first charts were. Maps are much older than any other type of chart.
I don't remember the exact ordering of types of charts that grew from the idea of maps, but time-series were among the first types of abstract charts. It made seeing trends against time much easy to see than bare numbers.
Really, the whole book is devoted to how raw numbers could be converted to more digestible forms to strengthen our ability to understand what the numbers really mean. Sometimes, the book argues that the raw numbers themselves are the clearest means of showing the data, but othertimes even presenting raw numbers could be misleading and lead to incorrect conclusions.
The purpose of data graphics is to have the data tell as complete a story as can be told from the data, and let the people interpret that the best they can. Do not spice up the graphics, do not dumb it down, do not tell them what to think. Do not assume your audience is stupid. Respect them and give them the information necessary to form their own informed opinions.
The second section of the book is full of examples precisely showing what lying with graphics looks like. It points out what the data actually are, and why the graphics are painting an inaccurate representation of that data. The author spoke of two kinds of lying:
- Lies of direction
- Lies in magnitude
Most examples in the book were lies of magnitude, but a few were lies in direction. I found this typing of lies to be incredibly useful. Lies in direction are obvious, they are simply the opposite of true. They are much easier to recognize and point out how they are wrong. Lies in magnitude, however, are much more nefarious. They aren't the opposite of true, but they still aren't correct. They often hyperbolize or sensationalize the story, and people are often quick to defend exaggerations. "They aren't completely dishonest," is the usual argument.
The rest of the book was about making use out of every bit of ink used in the generation of graphics to better represent the data. It was here that I should've tried to make d3 graphs that implement the book's ideas, but, you know, I can always do that later. No big deal.
Recommended Reading
Now, at this point, I would normally wholly recommend reading this book, even if you don't like or aren't really interested in charts. I wasn't that interested when I started, but I still enjoyed reading this book and grew a greater appreciation of charts during my reading. It also points out common chart manipulations of data, which could very well protect you from others attempting to lie with data.
But, if you are actually interested in charts, and making better charts that tell a clear and accurate story, I'm going to recommend a book I haven't read yet (but will soon).
After reading this book, I looked at its one-star reviews, and found this one to potentially be a good criticism of the book, and it recommended instead The Elements of Graphing Data.
That book's first review starts with:
So, without even reading the other book, I'll say this:
Want a good read on charts? Their history, their use, how lies are made with them, and how they could be more efficient and clear? Read The Visual Display of Quantitative Information.
Want to learn how to make good graphics? Read The Elements of Graphing Data. That's what I plan on doing sometime next year.
Web Game Developer's Cookbook Review
12/28/14
This review is a long time coming. I finished this book well over a month ago. I enjoyed it immensely.
The Original Plan
The original plan was made when I first got the book for my birthday earlier this year (June 20th). It was exactly something I mentioned to my friend as something I feel would be useful for learning game development and/or programming: content full of code examples to make various genres.
My plan was to devote time to each recipe to actually implement them as I read through them. I would then think of some simple change to make to the recipe to make it my own, and to show an understanding of what was being taught.
I did not do this at all.
What Actually Happened
The majority of my reading is done on the bus now-a-days, and doing anything other than reading is a hassle I haven't yet taught myself to deal with.
So, I read this book on the bus, and that was that. I also really enjoyed reading it, and slowing myself down in reading to make time to implement it was something I wasn't interested in doing.
However, nearing the end of the book, there was a UA Game Developers Club Game Jam. I brought this book to use as introductory inspiration and reference to begin the jam. I put the example games repo on my site.
We didn't explore too much before we decided to focus on Crafty, and we didn't use the book for much reference there, because, having not read that chapter yet, I didn't understand how to get the game working (it uses node.js magic).
I've settled a fairly long way from all the concepts and ideas introduced in this book....
Why I Enjoyed It
The book was exactly what I wanted as a introductiong to both actually doing some game programming, and to actually doing javascript programming. It gave me real, working, samples of code that I could run myself and edit as I desired.
It also introduced me to a wide variety of javascript libraries, only some of which I have heard of before. Quite a few of them were things I was interested in finding and exploring:
- impress.js: powerpoint presentations made in javascript
- node.js: server-side javascript (I've been trying to focus on this)
- crafty.js: HTML5 component-based game-engine
- game.js: GameJS is a javascript port of pygame, which I used to make games in python
- HTML5 Audio Site/Blog: a place to keep up-to-date on audio standards on HTML5
And that's just the stuff I can remember (the book's at home and I'm at my brother's in Wisconsin). All of this stuff came with examples, and warnings of the frustrations you can expect. I think it has helped me build a better-than-nothing debug intuition with javascript and the libraries I'm using. This intuition isn't great, but it's a good start.
TL;DR Conclusion
Want a good introduction to game programming in javascript? Or just programming in javascript? Try out The Web Game Developer's Cookbook.
Timer Update
12/27/14
So, I've still been working on my timer (repo here). No aesthetic changes, yet, though. Mostly, I've been working towards making it so timer information is saved server-side, so that I can make it work switching computers and stuff. I'd like to slowly incorporate higher-level planning into the app, as well. But right now, just making it incorporate server-side programming should unlock some valuable functionality out of my timer.
I have a working change (unpushed) that tracks when the timer expires instead of decrementing a local second value. That way, the timer still accurately ticks even while my computer is asleep. It'd be useful for the timer to tick even when the browser tab is closed. I could make it text, email, or page me when the timer ends. Would allow me to track events that separate me from the browser.
Changes have been slow-going, though, because I am super enjoying my winter vacation at my brother's place in Wisconsin, Stephan. I am not going to feel bad about that. That I've done any productive work at all makes me incredibly happy. Between the blog posts, javascript playing, and Japanese posts on lang-8, I feel pretty good about this vacation.
On Ability and Responsibility
12/26/14
If a person believes themself capable of doing something, and they feel it should be done, is it their responsibility to do it? To try, at least?
There's so much I think needs to be done, and there's so much I want to do, and there's both limited overlap and limited time for action. How selfish am I being for not doing my best towards doing what should be done? How selfish for doing nothing? Is thinking about it this way a productive way to go about convincing myself to execute better actions and habits?
I mean, I know that the route to efficient execution of action is not straightforward. There's a good hierarchy of steps that lead me from inaction to serious action, I feel.
I feel at least some further thinking on this would be good at some point.
Seventh Drunken Adventure: Not Really
12/25/14
It was uneventful.
Didn't even do any bargramming.
Merry Christmas, Stephan!
Seventh Drunken Adventure
12/24/14
If you're wonder where the first six drunken adventures are, Stephan, I never really wrote them down (though part six is detailed in one of my Quakecon posts.
I have gotten intoxicated few enough times that I have kept count so far. I would like to continue that. It's also clear that I will drink few enough times that I should be able to anticipate it and document it before, during, and/or after.
This one, hopefully, will be all three. I'll be drinking with my brother on Christmas Eve at his house. There will hopefully be some board game fun.
To be continued.
Victim Blaming
12/24/14
So, victim blaming is a term I read a lot. I've been internalising the term for a while, and perhaps using it to describe too many things.
Victim blaming basically seems to grow out of an attidude that if something bad happened to someone, then they must have deserved it in some way. I wonder how much of that comes from a personal experience of deserving bad things that happen, or a personal experience of nothing bad happening coupled with a personal feeling of doing no wrong.
Either way, there are a lot of nonsense ways to make it so something that happens is the victim's fault:
- Drew too much attention
- Didn't draw enough attention
- Provoked a fight
- Fought back
- Didn't fight back
- Committed an unrelated crime
- Attacked someone
- Ran away from someone
- Is a convicted criminal
- Is a prisoner
- Is not a perfect human being in some way
I think trying to discern intent or cause and effect from results is a useful and necessary human ability. But, at some point, we need to just define unacceptable behavior. No and's, if's, or but's. Tit-for-tat isn't often a good justification.
Korra Finale: Brain Won't Shut Up Want Sleep
12/23/14
My brain won't shut up.
I guess it's only to be expected. Avatar has been a part of my life since the show started almost ten years ago. It's been with me since before I learned how to program, since before I met my significant other, before so many things.
And now it's gone.
I mean, it's been gone before, and I was pretty sad. Like saying goodbye to a pretty good friend. But now... now it's like saying goodbye to one of my best friends. "The Legend of Korra" is leaving me as my favorite show. And, of course, I can't help but keep thinking of it and things related to it.
Normally, at this point, I would go to the Avatar subreddit or find some Avatar fan-site, and just consume other people's thoughts (some really good, but most really bad) until my brain finally shut-up, but recently decided I didn't like how such habits affected me.
So, instead, I shall write this post, wherein I will wander aimlessly inside a Korra-related area of my brain.
Right now, I'm thinking about how one should go about making a good video game in the Avatar universe.
Now, there are already "Avatar: the Last Airbender" games, and even "Legend of Korra" games, but I don't find any of them to be particularly good. I have heard promising things about Platinum Games' Korra game, but what I've seen of it does not look interesting to me.
To me, the first Avatar games should really focus on something small to mechanically get right. The mechanics of the game are really going to shape the feel of the universe, and if you don't get the feel right, it just won't really be an Avatar game.
And in an Avatar game, you're going to need to feel like a bender. But bending is complicated! It's based on real martial arts and that stuff is carefully crafted.
A non-traditional fighting game might be a good place to start, for a variety of reasons. One: earth and, to a smaller extent, water-bending need to have a semi-permanent effect on the environment they're used in. A fighting game can more easily get away with this, as it's in a limited space, and that space is expected to reset between sessions. Not too much has to be remembered, and it doesn't have to be remembered for very long.
A fighting game, though, still seems pretty big in scope, requiring a diversity of characters to setup, and settings for those characters to fight in. And those settings couldn't just be scenery, either, because the environment needs to be an important part of bending, for both water and earth benders especially.
I also don't like a focus on violence as a first game entry to the Avatar universe. Action was a key part of both shows, to be sure, but a pure fighting game would kinda hurt the pacifism themes very much present in both Airbender and Korra.
So, I've been thinking, as both a limitation to scope and to better feel like a snapshot of the Avatar universe, why not a game featuring the in-universe game that Aang plays with Sokka in Book 1: Episode 3, "The Southern Air Temple".
I recently rewatched this epsiode, because of course I have started rewatching the whole series, and in this episode, to distract Aang from the emptiness of the Southern Air Temple, Sokka convinces Aang to show him how to play a game of "Airball".
Airball would be a perfect game to focus on getting mechanically right. It could be set in a time to really give us a deeper look at airbender culture (something still greatly missing).
Futher, the actual game itself doesn't look too complicated, so budget could really focus only on getting airbending right in its specific setting. Mechanics would be the same for all characters involved, as well. Scope could foreseeably be properly small.
It could maybe even have young Aang as a character so it's, you know, still an "Avatar" game, though this one isn't really necessary.
After this game gets a handle airbending, there could be an Agni Kai game to get firebending right. Then a waterbending and earthbending cultural traditional "game" of some sort.
And this cycle could continue a few times until all bending was really conquered mechanically. Then, maybe "Pro Bending" could be made into a game. Maybe even a version of it where airbending is also present. This would allow a limited space to start learning to balance the four elements. Then maybe a larger scope game where the bending elements are all present. Finally, there could be a proper "play as the Avatar" game.
I really need to focus on getting good at game design, and general programming development, so maybe I can learn enough to work on at least that first game idea.
Korra Finale: More Thoughts
12/22/14
Update (12/22/14): Both creators of the show have talked about the ending. Bryan Konietzko's post is here. Michael Dante DiMartino's post is here. I really like what they have to say, too. Some of it mirrors my own feelings. Some of it is distinctly different. I'm glad I wrote my thoughts down first, and so I'm glad they deliberately waited to let people think.
Three days later, and I'm still get those pangs of sadness over it being over. The more I think about the finale, the more I like it.
Before I go further, there's going to be ending spoilers so....
Pros and Cons of Communities
12/21/14
Recent actions have convinced me to stop perusing fan communities. It basically only ruins my enjoyment of the various films, TV, and games I consume.
Don't get me wrong, Stephan, I think there's a lot of value in communities. I continue to plan to interact with the node.js community, and other craft-based communities. Fan-based communities, however, I'm going to work on avoiding. I've come to find that I lose more than I gain with fan communities. Fan communities over-hype the content they anticipate, and pick apart every little detail. Basically, they hype content to be better than it actually is, and also ruin it with amatuer analysis.
Now, I like analysis, and feel it can actually really improve enjoyment of content, even if that content is bad. Analysis is like watching additional episodes of a TV show. Good analysis empowers the other episodes and also stands alone on its own as entertainment. Bad analysis implants itself in your brain like a nightmare, and will come back to mind whenever you try to enjoy the show it analyzed. Fan content is much the same.
Unregulated fan communities are full of such scarring fan content. And most commnity sites aren't properly regulated. I think as far as focused communities go, I'll stick with craft communities that focus on making things. I get a lot more out of those communities.
Which really gives me good guidelines for sites like Reddit: focus on craft-based subreddits, and avoid the fan subreddits.
I will continue to consume fan content of entertainment, but I will do so through people-based streams, like blogs or twitter. People produce content in a consistent matter, and keeping track of people also leads to other interests that because of overlapping interests usually leads to finding even more content I'll enjoy.
On fan communities, I don't pay attention to the usernames or people posting content, and so the fan content I end up perusing there is inconsistent and unpredictable.
I really like this plan of community interaction. I hope I am able to execute it as planned, and that it works out as I think it will.
Korra Finale: Quick Feels
12/20/14
So, last night, after all my packing, I watched the Korra finale.
I have a lot to verbalize, but right now, I just gotta share these all-too-familiar feels. I feel hollow. It's like that slow realization that I'll never see a friend again. I feel bad for how I ended it, being vocally cynical about how the show would end before it ended. I ruined the ending a bit for myself and the person I was watching it with.
Which is really too bad, because I really liked the ending.
And now I'm thinking more about how it makes me feel, and the journey I've been on while I followed Aang's journey and then Korra's. I've been thinking about what watching this show makes me want to do, about the changes I want to influence in myself and the changes I want to influence in others.
The people behind this show really constructed a wonderful world and some wonderful characters. I hope they can continue Korra in some way, like they managed to continue the Last Airbender in comic form.
Vacation Checklist
12/19/14
So, for the first time ever, I actually made a checklist for my vacation packing and preparation planning. It's always something I plan to do, but never actually do.
I made a generic "Vacation" git repo on my chromebook, and then cloned a "Winter_Vacation_2014" repo out of it. It went from a simple checklist to a complicated, multi-file system pretty quickly.
The filenames are:
- actions.txt
- checklist.txt
- little_suitcase.txt
- big_suitcase.txt
- backpack.txt
- pockets.txt
"actions.txt" contains the actions I need to complete, "checklist.txt" contains the items I still need to pack, "little_suitcase.txt" contains the items already packed in my little, carry-on suitcase, "big_suitcase.txt" contains the items packed in my check-in, big suitcase, "backpack.txt" contains the stuff packed in my carry-on backpack, and "pockets.txt" are the stuff I need to bring that're in my pockets.
I like this system, it keeps track of where things are and what things still need to be done, and I'm building a master list of actions and things to pack for the main Vacation repo. Well, if I remember to keep the master repo up to date with all the changes I make to the winter vacation one. I am not being perfect about that. For instance, I'm deleting actions as I do them, but some of them were new ones I didn't have in the main repo yet.
Still though, this system is clearly better than what I had before, which was precisely nothing.
The Importance of Breaks
12/18/14
So, AgileGame at work continues to be a great success. I'm falling into a rhythm that I'm really enjoying.
- AgileGame session
- AgileGame session
- Overview of sessions
- Break
I do this for two hours, and then take a half-hour break.
Breaks are something I've taken seriously for a while, but finding a good rhythm for work really helped reinforce how useful and necessary breaks are.
Several times I found myself stuck with a problem, and the solution would come to me during whatever random activity I was engaged in on my break.
When I was first told about the importance of breaks, and attempted to make them part of my working schedule, I felt guilty about taking the breaks. But now, I have embraced how useful they are. Without the breaks, I would literally be less productive and do a worse job.
The People I Visit
12/17/14
Growing up, I developed a list of people I visted at least once a year.
- My grandparents
- My cousins
- My good friend in Vancouver, Washington
In the last few years, there's been a transitioning of priorities. People I used to see everyday live on the other side of the country. People I used to see everyday I have to make time to see. Maybe I can see them twice a year. But now, making time to see those people displaces and/or destorys the time I have to see the old once-or-twice-a-year people.
It's a strange thing. This expansion of time-intervals between visits of the people I love. It's like an expanding universe. Everything's getting further away. And I have new people I see everyday, but how many of them will drift away into rare visits? How many of them will become a short chat message? How many of them will be lost forever?
There's this story that plays in my head over and over. About a man who discovers he has the power to travel through time. But this discovery is immediately a tragedy, as he has no control over this travel. His first trip is his discovery.
He travels back to when he was a child, but his past self isn't there. Before he could wrap his mind over what's going on, he jumps back to the present.
But it's not the same. His home is not his home. He goes to see his parents, but they don't recognize him. When he tells them who he is, they don't believe him. He had vanished off the face of the Earth over a decade ago.
The very act of time travel had destroyed his history. The only one left who knew it was him. The journey he had taken was now only his.
And again he jumps. To before even his parents were alive. And then, they never lived. His travel had destroyed them, as well.
This is a story I enjoy thinking about. For a long time, I thought it was the story of a man becoming a god, and in the process lost all humanity. But maybe it's a story about how time will change things no matter what direction you travel, no matter how much control you pertain to have. And those changes will often be irreversible. They will hurt. But they'll also be amazing, and lead to great new things.
Javascript: Timer Iteration
12/16/14
So, I have made a timer that's functional enough that it's what I use instead of the available options I found via Google searches.
And now there's a whole bunch of things I want to do to improve the bit of functionality I have created.
In no particular order:
-
Audio countdown alerts
- Chooseable intervals (5 minutes, 10 seconds, etc.)
- Cross-browser compatibility
-
Insert embedded youtube video that autoplays on timer completion
- User can input youtube video of choice
-
Little animation that shows that timer input is achieved via
keyboard number input
- Could be run during the initial timer setting (5 minutes)
- Working, clickable keyboard to allow setting of timer via mouse input (I wouldn't use this, but others might prefer it)
- Nicer presentation in general (with labels and stuff)
- Timer input taken as "countdown from when last timer finished"
- Timer input taken as "this time, rounded up to next minute"
-
Timer based on time elapsed since timer started
- Currently, timer just decrements via setInterval function
-
Timer input saved server-side (saved even if tab is exited)
- Text, email, or pager alarm when timer finishes
- Login would be required for this sort of thing
Even though I want to do a lot with this simple countdown timer I've made, I really, really like it as it is now, as well. It works for my purposes... at work. At home, on this here chromebook, I don't even see tab-titles because I work in full-screen mode to maximize usable screen real-estate, so the audio cues would be very useful.
But, seriously, I got a lot of use over this simple timer at work. It takes up very little space, and is unintrusive to reset the timer to the time I desire.
Hooray for making my own tools!
Javascript: Basic Clock Stuff
12/15/14
Okay, so, over the weekend I wanted to make a sort've timer app for AgileGame session purposes. That was too vague a goal. I need to break it down further into smaller goals.
- Mess with javascript clock stuff
- JQuery stuffs
- Start running code on document load
- Grab an element by its id
- Change element dynamically
- Change element based on timer stuff
- Keyboard input to set timer
- Keyboard input to reset timer
- Sound notification of timer ending
I might see how much of it I can make in crafty.js, as well. Though, I figure a working knowledge of jQuery would also be quite useful.
Update: 12/15/14
Timer completed! No crafty.js in there, though. Got carried away just messing with it.... For way too long and not by playing AgileGame proper.
Oops.
Devoting More Weekend Time to Projects
12/14/14
So, I aimed for a small goal this weekend: make my own timer site to use for AgileGame sessions. A small step to making it an actual game to play online, I guess. Interacting with the clock in javascript is going to be important, too, I'm sure.
Anyways, enough rambling: small goal failed.
It seems like my weekend efforts often come to be wasted. Maybe I'm picking goals that only seem small. I mean, the timer itself is a number of little things I don't really know how to do. And not dividing those little things into their own AgileGame sessions might be a mistake in of itself. Especially since I'm now going for 10-minute sessions.
Though, this is all implying I set aside a considerable amount of time to AgileGame sessions. I did not. I got in like three legitimate sessions.
I spent much too much time sitting in front of my chromebook vaguely attacking the timer project. The few sessions I attempted were the only properly productive times, but I still allowed myself to get stuck in things I know are time sinks.
It's strange, falling into habits I know don't work.
I think my weekend strategy should just be multiple iterations of my daily strategy: short sessions with well-defined goals. Aka, AgileGame. Some part of me thinks I can do a more complicated task over the weekend, and tackle it using different tactics than the explicitly planned means of getting things done that I've been carefully crafting and practicing.
I suppose this is how I tried to tackle weekends before I attempted to make tools or strategies to be more effective. Old habits die hard?
I'll focus on smarter weekend time-management in the future. I'm doing weekdays better. Strong weekends, however, would be incredibly powerful.
Yourdon DeMarco Waterfall Design
12/13/14
So, not too long ago, I came across a resume that spoke of experience in Yourdon DeMarco waterfall design. Specifically the NSAM 81-3 and 2187 standards. I tried to dig deeper via some basic Google-fu, but there doesn't seem to be much interest in the specific standards of waterfall. All I really found were the standard "don't do waterfall design" sorts of articles. Also, Yourdon DeMarco did a lot more stuff that passed the passage of time, which makes searching for their waterfall design standards all the more difficult.
Waterfall design is an interesting sort of thing. There's only ever talk about how it shouldn't be done, and also a lot of talk about how it's done anyways by people and companies who should know better. For example, I've read about scrum-fall, which is more or less accused as being waterfall disguised as scrum.
It almost seems a little unfair to waterfall design. I mean, yes, I understand that it as a design philosophy has been displaced by methods that have been shown to be more productive. But, still, there should be some effort of illustrating waterfall at its best. Especially if, in reality, too many groups end up doing waterfall instead of the better methods.
AgileGame: At Work
12/12/14
So, today was the first day I gave a solid try at doing a work version of AgileGame.
Great success.
I'm kinda doing a Pomodoro Technique sort've thing in tandem with it.
Today, shortly into my day, I made a directory, initialized a git repository, added a submodule of AgileGame, and symbolically linked to the main repository of what I was working on (too big to just make a submodule of it like I would like). I set a twenty-five minute timer, made a goal, and got to work.
At the end of the timer, I made a red mark on my whiteboard. I failed to meet the goal as I defined it. But I was still happy with the progress I made. I still learned a lot in those 25 minutes. I literally deleted the code I wrote.
And I started again. With an updated, harder goal.
I made another red mark. I was really close to the updated goal, though. I also got noticeably better at making Google Tests since the previous session.
I played a couple more times, and got my work to a point where I needed to converse with others to figure out my next steps. In the end, there were two green marks and two red. If I were properly strict, however, it'd have been three red marks and one green mark.
The next pomodoro will be better. Maybe all this practice will improve my node.js practice (which I'm still being really bad about). For sure, I'm reducing the hour work to something even shorter. I might even try for an even shorter time span for the game.
In fact, on this here chromebook that I'm attempting to develop productive habits on (like writing this blog post), I have installed a chrome extension called Screencastify. The free version can only do ten-minute recordings at a time. That could be quite valuable. Incredibly quick prototype creations, and speedruns of basic programs that should force me to develop a deep understanding of the languages, libraries, algorithms, etc. that I am dealing with.
I'm pretty excited about further iterations of this game.
Current Rituals
12/11/14
So, I've been developing rituals and patterns working towards better general productivity. My day-to-day schedule has changed a lot since I last talked about daily things. I still focus on daily blog posts, but I gave up on the planning each week's worth.
Something I've been working on is using Google Calendars to track a sort of higher-level time-block. I'm not yet particularly great at following the plans I set up, but I'm getting fairly good at updating it during or after the fact. I find myself changing it multiple times per day. Today, I realized that I can schedule things in finer than half-hour chunks. I don't think I'll take advantage of that too often, but it'll be useful when I need it.
The calendar has been exceptionally helpful for me to explicitly set aside time for things I want to do. Specifically, I have to make time for blogging, node.js practice, and Japanese practice everyday. Seeing the open times around sleeping, cooking, travel, and work really helps me see how much time I have. I also realized early on, when I wasn't making time explicitly for specific productive tasks, that I wasted those precious blocks of time doing nothing.
I was not okay with that. I'm not okay with my current level of time-wasting. A tool that reminds me what I want to be doing now, and that I won't have time to do it later unless I sacrifice something else I want to do.
Another tool I find very helpful for motivation is another tool reminding me how much (or little) time I have. A simple countdown timer. Up until the start of this blogging session, I was using the Google Timer. The countdown timer I'm using now I prefer, because the timer gives its information in the tab title. Very useful. I'm still exploring options for sure, though.
So, what do I do everyday now?
- Walk the dog (~30 minutes)
- Blog post (~30 minutes)
- Node.js practice (~1 hour) (I've been slipping on this a bit)
- Japanese practice (~1 hour) (Not as consistent as I like)
- Cooking/Cleaning (~1 hour)
Things I no longer do everyday:
- Duolingo (German and Spanish)
- Weeding
I'd like to start adding things I do weekly, even monthly. The calendar system could totally accommodate that.
Weekly things include:
- Drawing
- Writing fiction
- In-depth article diving (a more serious blog-post)
- Some sort of themed goal
Monthly things include:
- Read a book
- Larger scale goal
Still lots of work to do on my system, for sure, but I'm running out of time. I'll make sure to have more blog posts on this in the future.
Hacker Horror
12/10/14
So, an idea that's been floating around my head, since I decided to get into HTML5 gaming, was a sort of "hacker horror".
The idea would be that it looked like an innocent website or blog or whatever. But something would be off. Links wouldn't be consistent, content would change on the screen, but I would attempt to guess where the reader's eyes were and change it on the edge of the peripheral vision.
It could even be an edutainment sort of thing. A white-hat sort of hacker learning thing.
The fantasy was I wouldn't talk about it and just some posts would exhibit behavior that would eventually reach. But I need to think about it aloud properly, though. And I think aloud in my blog nowadays.
So, I need to learn about guessing where a reader's eyes are, I think. Some sort of cue or something that would cause a predictive behavior that could measure certain reading patterns, perhaps.
Also, I really want to learn various hacking disciplines. Total white-hat stuff, of course. A curiousity.
Lots of ruminating and research to do be done here, I think.
Big Data?
12/09/14
So, "Big Data" is a phrase that kind of sets off red flags for me. It's kind of a woo-y phrase, it seems. A buzz word. Much like disruption. Disruption, however, is an incredibly powerful business term. It became a buzz word for a good reason. "Big Data" being a buzzword is all the more reason I should gain a proper understanding of the phrase, I feel. It's clearly an important concept.
Is the IEEE Big Data area a good place to start?
To connect with my recent interests, I also found a Node Summit video about Big Data. One of the speakers even talked about "Big Data" being a buzz word. I appreciate that.
So, what I got out of that video: big data is a means of scaling data horizontally. Aka, a parallelism for data. I think. It's still really fuzzy. I'm defintely going to check out the IEEE resources on it. And look more into node.js libraries for it.
I got to be careful with this, though. Can't use my explorations here as an excuse to not do real programming. Sessions of AgileGame start again tomorrow.
Blogging with Purpose
12/08/14
So, I asked for feedback on my blog from one of my friends.
I'm not sure if I should name him. Hmmm.... On one hand, I don't think he'd care, but on the other hand, I haven't asked him. Also, I don't know how I feel talking to or about any reader not named Stephan, Stephan. If he reads this and wants to be named, I'll name him.
Anyways, he pointed out that whether or not my blog is good is based on its purpose. Am I going for readers? Is it a diary? Is it to get me doing things I wouldn't be doing otherwise?
This was a really good point. I didn't really think about it's purpose too heavily. Yeah, I have a post here and there alluding at least to a purpose. But one isn't clearly defined by any means.
So, what do I want out of this blog? I don't care too much about how many people read it. Not yet, at least. I like knowing at least one other person reads it. So, it affects me a bit. (Don't stop reading, Stephan. [Seriously.])
It is definitely a bit of diary blog. I care about improving documentation, and I feel the most important part of improving that skill is to do it regularly. As documentation, I care about tracking the sources that helped me achieve whatever I was trying to accomplish. As a diary, this blog is also something I want to use to explore what I want to do and how I want to do it. It's a brainstorming tool. It's also a log of the books I read and what I think about what I read. It's a slow-capture spark file, capturing ideas that echo inside my head a fair amount of times.
I would like to attempt more serious writing here, though. A good tutorial or process on how to do the things I'm doing. I'd like to write some fiction. Polishing and refining my ideas would be ideal. A lot of blogs I read will end up repeating their ideas again and again. They get really good at saying what they care about saying this way, I think.
So, I'm not going to avoid repeating myself. If I find myself returning to a topic I've written about before, I'm just going to go with it, even if it's mostly the same content.
Blog posts will still stay pretty casual overall. I think any non-casual posts I write may go into a different area of my site, even. A proper articles area, or something. A place for more serious, more sporadic content. Whereas this will be right off my brain, but there'll be new content everyday. Have a place for "Quality, not quantity" and "quantity, not quality".
I like this blog. A lot. It helps me explore what I want to do, and I see myself getting results, and I'm getting a log history of what I'm doing and who I am everyday.
Also, I think today marks the first month straight I've managed to blog everday.
Awesome.
Blogpost from Chromebook
12/07/14
Testing out my new chromebook, Stephan.
The small screen will take some getting used to, but for what I plan using this for, it will do quite nicely.
Necessary Niceties
So, in my incredibly, super humble opinion—Like, I am the most humble person in all of existence, Stephan. The humblest.
....
What was I even talking about again?
Oh, yeah, chromebook stuff.
So, chromebook as it arrives is unusuable. You know what I do when I start up a computer? Crtl-Alt-T. Now, if I'm on Windows, that does nothing and I go, "Oh, yeah, I wanted to play games." Otherwise, I see a terminal come up and I do whatever it is I wanted to do.
Ctrl-Alt-T has a terminal come up, but I could not do what I wanted to do. Seriously, there were like, five commands, none of which were things I wanted to do. It was some pretend shell called crosh. Didn't even have ssh on it.
Unacceptable.
So, I did some searching, and it seemed like there should be a bin shell I can access via:
Now, I tried that, and I got an error saying it didn't exist.
....
Unacceptable.
Further searching revealed the need to put my chromebook into a mode called "Developer Mode".
I used this page to put it into such a mode.
Now I have bash and a whole slew of commands I expect to have back at my portable fingertips.
Anyways, there's a lot further to go on this:
(Note: I just found those through quick google searches on the chromebook, I am not sure how good the advice or methods are. Still exploring.)
For now, I'm pretty satisfied writing this blog post.
Reding: Shallow and Deep
12/06/14
So, I'm getting better at reading.
Last year, I read maybe two or three books, but this year....
Lessee...
- Art of Game Design (I haven't reviewed this?)
- Code Complete (Review)
- A Pattern Language (Review))
- Learn You a Haskell for Great Good (This one doesn't have a review either...)
- Getting Things Done (Review)
- Game Programming Patterns (Really? I haven't even mentioned this one yet, even...)
- The Web Game Developer's Cookbook (Okay, okay, I new about this not having one, that's coming)
- The Visual Display of Quantatative Information (I just finished this one, Stephan, be patient)
Which is certainly an improvement over last year (and that year's book-reading only really fell at the tail-end of the year anyways). And I'm not even counting the various articles proper I've read over the year.
The problem, however, is it seems I can only manage a shallow reading of the things I read. Now, I mean, I focus on maintaining a decent level of understanding while I read, but I want my reading to be a lot more involved.
All of the books I've read have sparked ideas for doing something, but rarely have I acted on any of those sparks. Now, thanks to Getting Things Done, I've captured a lot of those ideas, but a lot of the time, the book would be an excellent reference to use when attempting that idea.
Now, I've tried doing productive things directly connected to my reading while reading before. Specifically, with Drawing on the Right Side of the Brain. I got about halfway through that book. Unfortunately, what happened is I stopped reading when I stopped prioritizing time for drawing. I still remind myself to continue the book every week, but I don't.
Is this a problem I need to overcome? Or do I need to allow these ideas to build into a proper motivation to action? Should I just read through the rest of my drawing book and set aside the drawing exercises as something to do eventually?
I feel like that's better than choosing not to read the book, as I ended up doing. There's an innate worry I have where I'll just consume ideas but never act on them, but that's not really as true an issue as it was before. I'm managing to do quite a bit, and actively engaging in strategies to do more.
I guess what I'm exploring here in this post is what ratio of knowledge to action is optimal? I can consume more information than I could ever act on quite easily, but I need access to significantly more information than I can act on to give myself adequate options and even ability to do things I want to try to do. There's also more information out there than I could ever really consume.
There needs to be a balance, Stephan.
I think.
I'm going to continue reading on a read-only level, I think. I would love to read as much as a book per week, as I'm aware some others do. I will keep track of books that have a deeper reading in them, either explicitly in exercises, or implicitly in ideas that the books inspire in me, and every once in a while I'll come back to those books to either reread deeply, or simply attempt those exercises with the book as a reference.
As such, I will simply read through the rest of my drawing book, now. And, hopefully, shortly after finishing it I'll make priority for doing the rest of the exercises I neglected to do. Drawing is one of those things I really wanted to learn to do for a while, so I'll focus on implementing a plan I will execute during the next year.
Same goes for articles I read. I've already saved a few for a deeper reading with some work to do to really grok their technical content. Two of them feature javascript in some way. So that'll be fun, to see that come to fruition some time next year.
I like this, reading and action feel like they should be properly separate. A simple reading as first exploration into content feels right. Deeper exercises involving that reading should come later, after digestion and contemplation.
As long as my system captures the deeper stuff I'm interested in, I should be reminded of it often enough to do it when the time is right and I'm ready. And as long as I keep pushing myself, a time will come when the time is right.
I Don't Know Agile
12/05/14
For a person working on a game called AgileGame, I don't know much about the agile development methodology, Stephan.
In fact, until today, I didn't realize it was significantly different from the Spiral development model. Like, they probably share a common ancestor, but other than that....
It's funny, I thought the game I was making was closer to spiral, or rather more generically spiral.
It's not. Much closer to Agile, actually. Specifically, the game as it exists now is focused on making code that works within a short time frame. Which is a focus of agile.
Sweet. Maybe subconsciously I knew more about agile than I consciously did....
Yeah, no, I just named it AgileGame because I wanted to make a game version of "Flash Fiction", but FlashGame implied I was making the games in flash, and I have no plans on that.
It totally all worked out though. I'm totally up for:
- Learning more about agile
- Making the game more explicitly about agile development
I'm pretty happy about all these coincidences.
I will continue to iterate on AgileGame.
Tornado: Website Postmortem
12/04/14
So... I failed to make a website with python. I mean, I didn't hear about making one in javascript and decide to do that.
Well, I did do that, but I didn't stop the Tornado website transition because of that. I quit working on it long before any of that happened. Now that I have officially abandoned it, I should probably do one of those post-mortem-thingies.
And here we are, Stephan.
Mistakes were Made
This is pretty obvious. I mean, I don't have a functioning Tornado website. The closest I got was a carbon-copy of my home page up and running.
I think my main problem is trying to change my site right now too much from what it is now. If I'm going to transition this site over to some other kind of backend other than nginx (and I still plan to and will), then I need to have my site as it currently exists running off that new backend.
Meaning, take the static html files, feed them through whatever backend my site is using, and have that serve content to users. That's my next step. That's a proper first mutation to many other changes I really want to get around to.
Other than that, I got too caught up in research and didn't do enough doing. Which, hopefully, I'll learn to address better and better with my AgileGame
Good Memories
I got to play around with python a bit, and that's always fun. I'm pretty sure I learned some new aspect of python, but at this point I don't remember what it was.
It was also a reminder of the existence of javascript. Something I did not think much about since I took a web development class. With me, it takes quite a few reminders or repeats before I start digging into anything. Something doesn't get my serious attention until it comes from about three different sources or something (I guess that would be my version of the rule of three).
I was really excited about getting into proper web development stuff, at the time. I find that excitement coming again here with node.js, and I think thanks to my failure with Tornado, I have a better idea of what to do this time, as I try again.
Going Forward
Javascript is getting my full attention... outside of work, and learning Japanese.... "Full attention" means javascript is getting about an hour of attention every day. With more on weekends (though, I need to explicitly plan that out—blog post reminder made).
I'm hoping that very soon I will have my site running on node.js, and that instead of figuring that out, I'll be figuring out the fun ways I can mutate my site further.
Node.js: AgileGame Revival
12/03/14
So, I've been making an hour everyday for node.js. It kinda mutated away from me playing AgileGame at all.
That was partly because AgileGame was thought up as a game-making game, and partly because I didn't know anything about node.js to do anything.
The first is easily fixable. AgileGame is now a game centered on achieving agile development in quick, one-hour sessions. The rules are more-or-less going to be the same. I will revise them during my ten-minute intro to my session today, I think.
The second has basically been fixed. I know enough about node.js to do various basic things. The time has come to pick small steps I feel I can do without too much research, do them to gain confidence, and continue on.
At the stage I'm at, it's better to try and do something with what I got, make note of my limitations, and move on. So that's what I'm going to do. And I can also build a node cheatsheet while I'm doing this.
Let's get back to gamifying my learning experience.
Node.js: Real Work Begins
12/02/14
I have finished going through learnyounode. It is done.
Time to work on redoing this site.
The Plan
I kinda already did a plan, but that wasn't really a thought-out plan.
More of a brainstorming session.
So, step-by-step rough draft real plan for today's session
-
Five minutes research websites/blogs made in node.js
- Search node.js mailing list, site, etc.
- Five-minute assessment of resources, tools, and libraries to use to convert this site to running on node.js
- Five minutes of asking #nodejs irc channel of best direction towards implementing site in node.js (show some thought already put in)
- Five minutes reassess plan based on feedback
- Twenty-five minutes implement homepage in node.js
I am almost certainly underestimating the time it'll take to do things. Oh, well, here goes, Stephan....
Doctor Visit
12/01/14
Had doctor's appointment this morning. Went through a procedure to check if I have celiac. I have celiac.
Time to go gluten-free.
Also, recovering from procedure.
Using that to justify short post, Stephan.
And also spend whole day arguing on Internet (specifically: reddit, twitter, and facebook).
Wee!
Personal Rules of the Internet
11/30/14
So, I've been practicing a philosophy on the Internet for a while now, but I hadn't really codified it very recently.
I'm not going to go into specifics on what caused me to codify it, because honestly that detracts from the main point of this post, and it'll be something I talk about in a later post (probably).
Anyways, my basic rules:
- State opinions loudly to be corrected
- When corrected, seek understanding
- There's no winning an argument
This has a foundation in an variety of Internet-based advice. It's also very much related to the dream check strategy I have mentioned before.
I have spent many wasted... days? weeks?—
....
Lots of my time has been wasted arguing with people on the Internet. Over a great variety of mostly inane things. The only person that I convinced of anything is me.
That's it.
Now, in reality, the people I argued with taught me something, but I was too stubborn to admit it until much later. So stubborn, in fact, and so slow to change, that I might not have even noticed my evolving opinion.
At some point during that evolution, my motives changed. It wasn't about winning anymore. People disagreed with me and I didn't understand why. I was curious. It became about learning.
This shift in perspective has been incredibly valuable. I'm slower to frustration, I waste much less time in inane arguments (though, that number is by no means zero), and I participate in much more personally interesting discussions.
I'm much less afraid of saying a wrong opinion. If I'm wrong, I'll be corrected, and all the better. People are often pleasantly surprised when I react so positively to criticism, even incredibly insulting and vacuous criticism (though, I'm not always so nice), and arguments often quickly dissolve into discussions.
Just overall pleasantness. And when I find myself in a discussion I don't care about, I just exit the conversation. When it becomes apparent I have nothing to learn or I have no interest, I attempt to graciously exit or end the argument (again, this doesn't always go as smoothly as I would like).
This transition has had its difficulties. It was quite damaging at first to concede. It was admiting defeat according to my old self, after all. It is also very tiring to work at understanding others. I spent so much of my youth building an endurance for arguing, my endurance for understanding isn't anywhere near that level.
What's great is that the system of focusing on learning has defenses against dishonesty and trolling almost built in. If someone is arguing against me in bad faith, it looks almost exactly like someone whom is impossible to understand. When this happens, I become uninterested very quickly and leave the conversation. The argument dies to nothing very quickly instead of exploding into a flame war.
This is good for various reasons. If I can't understand someone, they aren't necessarily being dishonset or trolling, but there's no talking to each other. It's probably better for everyone involved to just leave each other alone for the time being. Try again later, when maybe we've both grown enough to understand each other.
I end up getting much more out of outright arguments online, because it isn't about convincing the person I disagree with, and in fact I assume that's impossible. And even though it's still an argument, I usually end up on better terms with whomever I disagree with. I also get to learn more about myself, which really reminds me how little I know even myself.
....
This whole post kinda turned into a ramble, didn't it, Stephan? Oh, well, I hope you enjoyed reading it as much I did writing it.
Node.js: One learnyounode Exercise Remains
11/29/14
So, over the past four days or so I've gone through 10 of the 11 learnyounode exercises. It's been really refreshing doing what amounts to introductory programming homework problems again. Further, it's been giving me a means to practice some basic Code Complete advice: psuedo-code design and proto-type code and the like.
After this last problem, I think I'll take another stab at implementing my blog in a more dynamic way. This time using node.js instead of Tornado.
My site also really needs a redesign. It's not completely horrible, but it could be much better. For example, I don't think the browse-bar really needs to be on the side, or always present.
I'm going to keep going with the hour per day thing. It's really valuable, and it really keeps me focused on what steps I can reasonably take in an hour. Now, don't get me wrong, I don't always think a step needs to take less than an hour, but right now, at my current level of ability, I think steps that do take an hour or more are steps I can't take. That's some endurance I need to train for.
The Plan
First things first, I'm going to finish learnyounode. Then, I'm going to reimplement my AgileGame: 10 minutes of research, 30-60 minutes of coding with 5 minutes total allotted for extra research.
Things I'll look into researching:
- Blogs made in node.js
- node packages (install with npm)
- Making node packages
- Issues I could maybe work on on open-source node packages
- node.js C++ issues I could maybe start working on
- More node.js tutorials
Website stuff brainstorming:
- Home page refactor
- Blog refactor
- Blog database setup
- Blog vs. "Article" differentiation
- Saving history
- A link to the first setup of the site (the first blogpost)
- A link to this setup of the site
- A means of saving setups to the site from there (versioning?)
- CSS prettifying
-
Extra site functions
(
Getting Things Done
setup?)
- Actions
- Someday/Maybe
- Calendar
- Tickler
I got a lot of work. Hopefully it'll be a good learning experience. I'll make sure to ask for help when I get stuck, which will probably be a lot. I'll definitely search the node.js mailing list for similar questions before I ask my own.
Node.js: IRC Talk Notes
11/28/14
Saying hello accomplished. I chatted exactly what I wrote in the post planning it. Some notes for reference purposes.
- "node.js proper is a very small binding to the IO library -- so it's a C++ codebase more than anything."
-
"Want to contribute [in javascript]?"
- "Find node.js projects outside the core to contribute to"
- "[C]reate your own."
- "Publish modules."
- "Use, file bugs on, and fix other[ modules]."
- "There's projects used by many like express[.io(?)] or engine.io"
- "If you can document things, you can be a total hero."
Mostly quoted by user @Aria. Thanks, you're awesome.
The second-last thing I ended up chatting is my general plan going forward, "I'll do some poking around and think a bit. Digging into core C++ also sounds interesting. I'm thinking I'll do the rest of learnyounode and just play from there. Keep contributing in mind while I do that."
The last thing I said, after being welcomed kindly by @Aria: "Yeah! I haven't actually tried talking to people when learning since I did a small contribution to sympy like four years ago.... I learned so much and then didn't keep doing it. I will avoid making the same mistake this time. Thanks again for being so welcoming (I'm always afraid I'm being rude or something)."
I'm going to enjoy being a part of the node.js community, I think.
This is Classic Me
11/28/14
So, I'm about to connect the #node.js channel on irc.freenode.net, and....
I was deciding between sticking with pidgin (with which I am somewhat familiar) for now or diving back into messing with terminal irc chat program irssi which looks like it'd be my cup of tea, after I get past what will surely be a wicked, vim-like learning curve....
But! I already know enough irssi to make a simple hello post. Oh, but I'll read some of the introductory documentation just to make sure....
Oh, hey, they recommend keeping an irssi session going with a screen. I'll just set that up on my desktop....
Well, I turn off my desktop regularly, might as well set it up on my server....
Oh, I don't have it installed on my server.
04:49 -!- Irssi: This is just a reminder that you really should go read
04:49 -!- Irssi: startup-HOWTO if you haven't already. You can find it
04:49 -!- Irssi: and more irssi beginner info at http://www.irssi.org
04:49 -!- Irssi:
04:49 -!- Irssi: For the truly impatient people who don't like any automatic
04:49 -!- Irssi: window creation or closing, just type: /MANUAL-WINDOWS
04:49 -!- Irssi:
04:49 -!- Irssi: For Ubuntu specific help type "/connect irc.ubuntu.com"
04:49 -!- Irssi: and "/join #ubuntu" (without the quotes) and ask your
04:49 -!- Irssi: question.
....
You know what? That's probably actually a pretty good idea. I should read the documentation and stuff....
No.
No, no, no.
I am introducing myself on the #node.js channel first and foremost. No more non-necessary distractions,Stephan. It can come later.
Node.js: Saying Hi
11/28/14
So, I don't like how much of my spare-time "work" is done in isolation. Video-recording myself has been really useful. It really enforces a talking to an imaginary audience, which itself helps me hear my own thoughts and more easily correct myself.
It really isn't enough, though.
I need to talk to real people. Smarter people. People with more experience. People with different experience. Other people.
And right now, it seems I'm going to be focusing on node.js for a bit. Try and get more comfortable. Maybe work towards making this site run on it.
And really, I didn't think too much about how I'm using provided tutorials and documentation to go about learning in isolation. Now, I don't think there's anything wrong with using such resources, but if I'm going to use advice from other people anyways, maybe I should also work towards getting their advice in a more real-time manner. And, you know, maybe providing some sort of value myself.
What reminded me to get involved in the community was this post by a friend of mine. It's some really good advice (I think) of improving self-taught skills, and also a dislike of the implications of calling it "self-taught". You should read it, Stephan.
Anyways, I feel like I've been making some good progress along all of his points, except one: working with real people (his "On Coaching" section).
I told him as such on twitter. And followed up with some of my thinking on how to say hello to the Node.js community.
This set off a chain-reaction of... stuff. I got retweeted by some peoples, I got followed by some guy, and I decided to write this post. Then, when I got around to linking to Node.js when mentioning it for the first time in this post, I decided to click on their community page.
I've joined the Node.js mailing list, started following @NodeJsCommunity, @nodejs, and a whole bunch of HTML5-related twitter accounts, and am now working on some sort of plan to stay logged onto the #node.js channel on irc.freenode.net.
To make sure I'm not avoiding actually being social with stuff that's related to being social, I'll make sure to actually say some version of "Hi" on the irc channel.
I'm thinking of saying something along the lines of, "Hello! I'm just getting into node.js and have only been playing with javascript for a short time. I was looking for advice on best methods towards becoming a contributing member of the community. Currently, I'm going through the learnyounode exercises. Should I focus on that? I was also considering attempting an 'easy' issue on the node.js github."
Time to be involved beyond playing with tools in isolation. Got to learn to work with a group of people even in my spare time. I don't know if I'll record myself communicating with others. Seems... sketchy, somehow. Like, they might not think they're being recorded and stuff. I don't know. I'll think about it.
Anyways, I'll probably post an update on how things went at some point, Stephan.
Learning Node
11/27/14
So, I've installed Node.js on this here server and have been going through learnyounode from NodeSchool.
The new goal will be to rebuild this site such that it is running on node. Right now, I'm just wrapping my mind around node.js infrastructure (lots of asynchronous stuff).
I have been posting my efforts on my Youtube channel, but I haven't been focused on keeping the video content engaging. Today's video I barely talked at all.
I think that'll be something I work on as I make more videos.
Editing, too, eventually.
#Ferguson #BlackLivesMatter
11/26/14
I really don't have anything to add or significant to say on the matter. I just want to say that I'm not ignoring it. I'm not okay with it.
I don't know what to say other than that. I can't even remember the various links I read up on this. And I can't really show you the tweets. Googling Ferguson led me to click on the ad for once.
Tornado: Blog Transition
11/25/14
Hey! So, I have abandoned doing this. I made notes while I was doing stuff, expecting to blog about it when I was done.
I'm not going to be done now for the foreseeable future, so here are my blind ramblings.
My Unfinished Attempt at Tornado Blog Implementation
The time has come! My blog content needs to be restructured more intelligently, and not be a bunch of files in a "blog" directory. It also makes sense to work towards making blog posts easier, perhaps using a different markup language that can be compiled into HTML....
Maybe.
Anyways, I suppose where I need to start is by thinking about what the Tornado setup will be. Perhaps a decent place to start is Tornado's blog example on Github.
Reading....
Reading....
Hmmm.... That's a lot of stuff I don't need. This is for, like, a multiple-user blog system, which I'm not particularly interested in creating just yet.
What does my Tornado repo currently have in it, again? Some basic template stuff and a reimplemenation of the home page.
Hmmm.... What's the next step here? Okay, so general pool of blog posts screams database. I could start there. I don't need anything heavy-duty right now, might as well use SQLite. So, what are the columns for a blogpost table?
- The blog post (aka the html body, or the "blogpost div within the body in this case)
- Date published (valuable piece of blog info to reader and also how we'll order blog posts)
- The blog's title (used for header title value and as the headline of the blog)
- ...
Hmmm... (I'm humming in thought a lot during the writing of this post, Stephan). You know, there's other stuff I might want.
- HTML header stuff specific to this blog post (in case I want to do anything special for any specific post, styling or javascript-wise)
- Blog post in a series value (for instance, this post is a part of a series of posts wherein I work my way through transitioning my site to Tornado)
- Content tags (I write about a lot of random things)
Though, I suppose I can make changes when I see fit. For now, let's stick with the basics: the blog post div, the published date, and the blog's title. Let's make a simple SQLite setup!
....
Ooh, a quickstart guide to SQLite.
Reading....
The program 'sqlite3' is currently not installed. You can install it by typing:
sudo apt-get install sqlite3
Fair enough.
All right, it's installed, but running the above command brings me to a sqlite shell. I think I would rather python make the databse if it didn't already exist. So, let's make a python script that does just that.
....
Ooh, official sqlite3 module documentation. This will probably be useful.
Re—Oh, that was fast. Let's try the examples that look useful right away.
conn = sqlite3.connect('databases/blog.db')
c = conn.cursor()
If I do this without an actual database at that path, what happens?
It does! Cool.
Now, let's create a table "posts" with date, title, and content.
"CREATE TABLE posts (date text, title text, content text)"
)
Did it... did it work?
$ python sqlite3_test.py
Traceback (most recent call last):
File "sqlite3_test.py", line 5, in
c.execute(
"CREATE TABLE posts (date text, title text, content text)"
)
sqlite3.OperationalError: table posts already exists
Yes! Success! (Note to self: better way of checking)
(For now, I'll just wrap that create table statement in a try/except statement.)
Okay, I got a table....
Now what?
Well, I'm definitely going to need to make a script that transforms all my current blog posts into database entries. I might want to start with a proof of concept blog post in the database.
Yeah. Yeah, I like that.
import time
date = int( time.time() )
post = '''
<p>
Testity test test test.
</p>
'''
And now there's a test blog post that I should be able to setup. Time to make some Tornado code that:
- Lists all blog content by date order to general blog page
- Gives individual blog posts their own link based on title
So, the general webpage. Right now I got a simple setup that looks identical to my current homepage. I'd link to where the Tornado setup lives, but I've been noticing a lot of bots trying to hack their way into my server using various scripts that connect via the IP address.
No, thank you. I'll need to setup accessing of my tornado setup via some less bot-accessible means. Right now, I have the static html file setup with the server name:
I think it'll be fine for me to give my tornado setup one of those names for a bit.
server_name www.ksionda.me;
# Static html file setup
server_name www.ksionda.me;
Dream Check
11/24/14
Dreams....
Dreams are fascinating. All kinds of interesting realities become explorable.
The most fascinating thing to me, though, is the complete buy-in we have to them. So rare is it to stop and think of even the most complete absurdities. A working fridge and freezer that doesn't have doors? Completely normal. Raining indoors? I buy it. A world entirely of shades of yellow? I might stop to admire the scenery, but I won't wonder at it.
And then, on the flip side, completely normal things have made me realize I was dreaming. Towels I put in the dirty laundry before going to sleep back on the towel rack? Wow, wow, wow, I must be dreaming. It's such a strange and amazing amount of clear-headedness in a world running on preconceived assumptions.
Not too long ago, I started practicing habits to learn to check if I am dreaming. These are your classic dream checks:
- Check your watch. Check it again. Is it the same time?
- Read something. Read it again. Was it the same content?
- Ask yourself if you are dreaming regularly. Are you dreaming?
Amazingly, I started doing these dream checks shortly into practicing them. Hilariously, I didn't do them seriously and decided I wasn't dreaming in the dream. I checked my watch twice but didn't actually pay attention to the time. I wouldn't pay attention to the content I was reading. I'd ask myself the dreaming question, and would say, "Of course I'm not dreaming."
But I was dreaming. And in retrospect it was so obvious.
And even when I finally did have a lucid dream (which I really should blog about, I have it written down in my journal and everything...), I was still easily duped and convinced by nonsensical things.
"You should clean up the mess you just made."
"But I'm dreaming, it's not even real"
"You should still clean it up."
"Fair enough."
That conversation actually happened in a dream. It prevented me from having a walk in what I was expecting to be an amazing and strange dream world. I woke up before I could go on that walk....
Clearly, I had to take these questions seriously in the waking world to have any hope of taking anything seriously in the dream world.
Something to consider for anyone else out there interested in practicing lucid dreaming.
....
Oh, yeah, that's not the end of the post.
Not long after that failed dream check inside a dream, it ocurred to me, I do the same thing in the waking world. I run on preconceived notions that could, in fact, be utterly ridiculous. They simply live unnoticed in my skull. Even when I stop to consider if I'm wrong, I don't take those considerations seriously. Problems that bubble to the surface just get reburied under my assumptions and incorrect models.
So, enter the metaphorical dream check:
- Am I dreaming? Am I assuming things not demonstrated?
- Do I understand the people who I disagree with?
- Am I in a bubble reinforcing my beliefs?
- Have I heard what the people I disagree with believe from them?
My applications of this have been incredibly useful, and I noticed that I accidentally did these dream checks in the past when I changed my mind on seriously held beliefs. Even when dream checking reveals I'm not dreaming, I feel I find deeper insight into the human condition.
That's a big thing I've been learning when applying this technique. The people I disagree with are people. They aren't monsters. Most of them aren't malicious. They see different things than me. They interpret evidence differently. They hold different philosophies.
They're trying. Just like I'm trying. Who am I to say I've done a better job?
No one. I have to argue my case. My side. And hope it stands to the scrutiny of criticism. And I've found the most thorough way to do that is to speak my case openly and take all criticism seriously.
Dream check all of it.
And I've found that that is super exhausting. Super time intensive. I can't do it for everything. No one can. So I develop a network of trusted sources. People to trust on various issues (and in some cases, only trustworthy on specific types of issues).
This, too, is also useful. But it can fail the bubble dream check. And so, from time to time, I pick something I see some source talk about, and I seriously dive into it. I reassess my network of sources. I dream check, and I try to prepare for the reassessment of my entire model of reality in case it becomes necessary.
Thankfully, so far, only little edits all over the place have been necessary.
Or am I dreaming?
AgileGame: Tic Tac Toe Postmortem
11/23/14
So, first session was a success, as far as "finishing" goes.
I spend the first ten minutes explaining myself and then an hour to make the game.
Interestingly, I have now done a bit of that thing I decided not to do: make an already defined game. I'll probably do it quite a bit if I continue to try to develop using AgileGame. Which I think I will, it went well and it forced me to identify ignorances and weaknesses.
I don't know how I feel about my no reference rule. Maybe predefined reference material? I didn't remember how to do array stuff and for loops in javascript (turns out, you can do the basic c-style for loop in javascript). I do like slowly building a cheat sheet, so having some sort of penalty or defined rule to not leave the repository helps to build that.
I really liked my introduction. Gives the whole thing a good purpose. I wonder, however, if the intro could make a good video on its own?
I'll probably use introductions for every run of AgileGame. Which is good for another reason, in that I forgot to explain why I named it AgileGame.
As for the actual development of the game, I'm really surprised it almost took me the whole hour to make a very unpolished Tic Tac Toe. I don't even remember how to give elements text, so I went with colored squares instead of text.
Which really shows the advantage of what I did. I forced myself to do what I could before breaking down and doing any research. Any problem led me to thinking of a faster way to do things instead of looking things up. There will be cases where doing this is actually slower than proper research, but I think that's not as common as I think it is. Experience doing things, and learning proper ways on the side, will probably be the fastest way to create and to learn.
Not to say people shouldn't care or focus on research and/or doing things properly. With me, however, I already overthink that, and it's good to put me in a situation where if I don't already know how to do it right, to at least have something working before doing any optimizations. Also, the point is to gain experience doing. Thinking and research are for other designated times, and can be a distraction here.
I really like this as a rapid-prototype tool. Both prototype as in an actual game, or prototype as in a tech demo demonstrating some sort of functionality. Learn by doing and all that.
I think I should somehow incorporate asking for help and/or feedback into the game. Maybe as part of penalty for some breaking of the rules or failure to finish? Though, I don't want to associate asking for help with failure....
I definitely don't participate enough in enthusiast communities (like the crafty community or the python community). That'll most certainly be an incredibly fast way to learn and to network. And make really cool friends.
That maybe kinda unrelated to this. Though being a part of the community seems to be advice that's ingrained in being better at any craft, and I'm not quite in any community. And really, this game is an attempt to hack at the things I haven't really been improving upon....
I'll think about it.
So, what I like:
- The focus
- The time-limit forces me to think make quick actions
- Recording it probably also keeps me focused
- The building of a cheat sheet
- The building of a "things to learn" list
- Comfortably making throw-away code
- As a rule, game code must not be copied or referenced
What needs work:
- Community interaction
- Research necessity handling
- Basic syntax and such needs to be looked up sometimes
- Complicated ideas should not be researched during sessions
- Iteration on rules in general
- Better defined rules
- Unlocking deeper game making sessions?
Hmmm.... That's probably enough thinking now, let's get to doing.
AgileGame: Setting Up the First Session
11/22/14
All right, I'm about to start the first (real) session of AgileGame, Stephan.
I've probably done more thinking about it than I really should've allowed, but again, rules are still coming into shape, so whatevs.
This being the first ever attempt at this, and because I feel like this might be something worth properly documenting. I'm going to record this, I think.
Except, I haven't really done a good Ubuntu recording yet.... Let's try some things really quickly. I'm not going to try live streaming this just yet, anyways.
Going with a—*ahem*—simple SimpleScreenRecorder setup. Just record my speech, no speaker sounds, won't be necessary for this first game for sure.
Yeah, that should fit our purposes.
All right, now to setup the workspace. I'll keep all my work to one screen for now. I don't have a good setup to record both screens right now, and I would like to experiment with a single screen anyways, for the sake of thinking carefully on how to make this AgileGame an actual web game, which most people would want running on a single screen, I think.
Half the screen will be a terminal, for coding and stuff, and the other half a browser with a single tab, at the url of the game in question.
Wait, wait! Two browser windows, the other one will just use a Google countdown timer.
All right, now, the allowed setup before the timer starts....
You know what? I think I'll go ahead and make an AgileGame repository. It'll also be a submodule in the hour game repository.
I think it's set up to the point where starting with a video is fine.
*Deep breath* Let's do this.
A Game to Make Games?
11/21/14
Yesterday, I let my most recent Github streak die. I was falling into the same pattern as with the last streak. Too many of the days was submitting a simple issue to the github project.
I liked the issues I posted, but it isn't actually work. Especially when all I'm really doing is remembering or finding a note somewhere else and just putting it in the issues area.
So, no Github streak fixations for me. I want to focus on doing actual work in some way.
So, I'd like to introduce my simple game idea:
AgileGame: The Roguelike Gamemaking Game!
Gamejam was a really good learning experience for me. Could I fit that experience into something as small as one hour? Per day?
I'd like to try, Stephan!
So, starting tomorrow, I'm going to try and make a game in one hour according to the rules of AgileGame.
"So, what're the rules?"
....
Let's find out!
- AgileGame's game starts with a repository
- The repository has a game_engine submodule
- Otherwise, the repository starts empty
- I randomly come up with a theme or goal
- I have one hour to make a game, once over:
- I must revert to the most recent github push
- All progress since then is lost
"So, what makes this a roguelike?"
....
- Code from previous games can not be used
- Unless that code was saved within game_engine
game_engine will be the only thing that gets saved from AgileGame session to session. During a play session of AgileGame, nothing outside of the game repository can be used as reference.
I get caught in lookup webs too often, I don't have time during a session of AgileGame to both research stuff and get things done. For example, Stephan, I just thought "Hey, could I literally make this a game? Like, a real web game? ... Could I make it so switching tabs or focus warns the player that the current session will automatically end?" Ten minutes later, I got back on track to writing this post. (The answer: I don't know, I decided to focus on this post. Probably yes.)
As stated yesterday, I want to properly separate the research from the thinking and doing. And also separate the thinking and doing a bit, but that's a whole nother can of worms.
"So, why aren't you starting today? Like, after this blog post?"
....
Maybe I should take away your talking privledges on this blog, Stephan.
Originally, I was going to start right after this post, but one, it's getting late, two, I want to play some games today, and three, I need to setup the bare bones game_engine and stuff to make playing AgileGame tomorrow need as little setup as possible.
Actually, wait, no, I take that back. I did sorta kinda do one. It's this blog post itself. I kinda didn't follow the rules, exactly, but those rules were made during this session, so whatevs.
Also, there's no real reason this has to be only about making games, it could just be a general development or prototype creation game. I'm focusing on games for right now, though, so let's make it game-specific.
Rules and functionality and even the name will change at my whims as I mess with this.
Learning About Myself
11/20/14
About a year into college, I learned I didn't know myself very well. It was a humbling experience. All these things I thought I could do with ease were actually hard. I wasn't getting in shape like I planned. I wasn't building cool stuff in my spare time.
Now, I've slowly started to figure things out. I'm in much better shape, and I do work on things in my spare time, though I have yet to learn the skill of finishing. I've probably said this before, but it's incredibly frustrating that personal change and progress isn't instantenous.
It's work, and negative process is all too possible. All these tools and strategies to be more productive help, but there's no getting around there being this giant wall in front of me that I have to grind to dust. And it isn't some normal wall, either. No, it's made of nano-machines or something, Stephan. It regenerates itself, even when it looks completely destroyed. It adapts. Tools and strategies of the past become insufficient.
It's hard to remember the progress I've made, sometimes. I'm not 272 pounds anymore, I'm just above 200. Though, I was for a bit below 190. That's the stuff I see. It feels like I lost ground. I don't think about how far I've come in the grand scheme. I don't think about how far the wall has moved, has obeyed my pokes and prods and demands for progress, I think about how there's still a stupid wall in my way.
It just serves to remind me how much I don't know about myself. Even when I'm aware of my weaknesses and my strengths, I still lack adequate knowledge to take advantage of my strengths and minimize my weaknesses.
Such tactics are really what inspired this post. Yesterday, I was banging my head against the door over a lack of understanding I had at work. I spent a lot of time thinking.
My thinking isn't focused. It's random and scattered. I'll be thinking about the task at hand one second and be thinking about a sci-fi concept where collaborative research has made teleportation possible, and a group of people are secretly making a colony on Mars with this technology.
But, I'm kinda digressing here.
Where was I?
Learning about myself... tactics....
Yes, yes. There seems to be three states of productiveness I can be in.
- Doing things
- Thinking about how to do things
- Research about how to do things
The top thing feels like I'm actually doing things. I can point at something and say, "That's what I did." Unfortunately, doing things requires thinking about doing things, and all too often will slide to that even when it's not necessary. And that will lead to a myriad of tangential distractions that I do not know how to do. So, now I'm doing research into how to do those things.
It used to feel productive to go down this rabit hole, but now I recognize that I'm doing it and instead get frustrated. I can always dig deeper and learn more, but that doesn't mean I'll use that knowledge or ever find it useful.
Of course, I can't just get in the habit of only doing things. I won't always know what I'm doing. I have to think. And thinking won't always be sufficient, sometimes I have to gain new information I do not have available in my brain.
But I believe these are all actually very separate things. Switching between them willy-nilly will incur time and energy costs that I have to be more aware of. Proper research is a grokking process that is incredibly taxing, wherein a fuzziness I can't describe becomes concrete and detailed. Thinking is a seemingly randomized connection of all the concrete and fuzzy things I'm aware of, and understanding what collection of those things get me to that goal.
Once research and thinking have been done, doing really should be a quick implementation. A concrete "next action" that I don't have to think about. It's the easy ride down a steep hill after the grind riding up it. It feels like that's where I'm making the most progress, but only the buildup to that made any progress possible.
I don't really know where I'm going here, Stephan. I just thinking aloud at this point. Maybe thinking ablog?
Whatever.
Anyways, I want to try something to be more efficient and hopefully faster about this whole process.
- Properly define what I need to be doing currently
-
Compile a list of known knowns, known unknowns, and unknown
unknowns
- Things needed to be done that I know how to do
- Things needed to be done that I have to think about
- Things needed to be done that I need to research
- Verify list contains only necessary things
- Do what can be done
- Do necessary thinking and do what can be done, one at a time
- Do necessary research, thinking, and what can be done, one at a time
- Back to step one
I'll try to keep the doing, thinking, and research properly separate, and keep things modular. When one thing starts contaminating other things, I'll try to capture whatever contamination it is and set it aside for later.
Time to Learn Node?
11/19/14
So, I've been noticing a personal habit of mine. If I see something mention something enough times, I feel the need to check it out. Several sources mentioned Christopher Alexander and/or a Pattern Language and so I read that book.
I much enjoyed that.
Node.js is something I've seen mentioned quite a few times. Node.js is basically the ability to use javascript on the server instead of just on the client (though, reading their about page, it's more complicated than that. I most recently saw node.js in The Web Game Developer's Cookbook. In that book he makes what I feel is a particularly strong argument for node.js:
JavaScript in some form is the language of the browser, and there is no escaping that fact. Despite having a choice of any number of server-side languages, and even if you prefer them to JavaScript, using the same language on the server-side as the client-side language makes sense for two reasons.
First, during development, it reduces the amount of time to change your brain to think in one language versus the other. The result of using two languages is typically that people spend more time with the server-side language. They end up caring for that code more in every way, and the front end languishes as an auxiliary nice-to-have or poorly implemented guessed-at code. The user experience suffers terribly. Using the same server-side language forces developers to at least know how to care for the front-end code just as much. Secondly, using the same language in both contexts means that code can more easily be shifted between the client side and the server side, or even shared between them. Libraries can even come with complementary code to support both contexts[...].
Now, I feel the above quote is especially true as a programmer getting comfortable with javascript. I feel fairly comfortable coding in python (which I would use as my server-side language), and in fact I feel a strong numbness when working on my Tornado setup of this blog when connecting the python and the javascript together.
So, screw it, let's go all javascript.
Expect more node.js blog posts as I start working with it.
Gamejam: Post Mortem
11/18/14
So, between 6 p.m. Friday, November 7th and noon Sunday, November 9th, I and two other people made a game called Shapes in Wonderland
The Other People
Of the people I was working with, I knew Carlos personally. He's a good friend I have had through the majority of college. The other person, Andy, I did not know much at all, excpet I played an HTML5 game he had been working on previously. He joined because he, too, explicitly wanted to make an HTML5 game.
The whole weekend, Andy was doing a lot of cool things. Cool things that I had trouble integrating back into the main game, because Andy didn't know how to use git. Which, you know, not his fault. It really was unfortunate. Our original game was going to have circles instead of squares, but I had trouble implementing it, and when Andy got it working, he got it working in really old code that didn't really look anything like our current baseline.
He ended up implementing the slow shrinkage and growth of the squares in the final game.
Carlos, in comparison, was a lot easier to work with. In fact, I had worked with him on a project before for a class. We discussed organizational strategies and worked on making parallel development more git merge friendly. We also both took this as more of an opportunity to get familiar with the crafty.js library. Lots of experimental code figuring out how stuff worked. Also, lots of complaining about the crappy documentation.
During development and in retrospect, it kinda feels we didn't try to include Andy in our process enough, which really wasn't fair, and probably hurt the end game, because again, Andy was doing really cool things.
Picking Crafty, Fighting with It
The game got off to a rough start. We had no idea what we were doing, and were hunting down libraries. We ended up picking crafty because I had heard good things from multiple sources about it. I wasted the whole first day fighting with crafty instead of trying to learn it.
We wanted to render shapes. I thought that'd be easy. It was not. We found a hack someone had posted online for rendering circles. It had its problems, because it didn't take advantage of Crafty's built-in entity movement functionality. My attempts to fix this only revealed my own ignorance about how Crafty functioned.
Eventually, I conceded that I was taking too much time fighting Crafty over what shape I wanted rendered and retreated back to simple, built-in square renderings. Things got much better.
Goals and Laziness
Saturday went much better than Friday, and I became much more comfortable with Crafty by the middle of the afternoon. The code was slowly approaching "can be called a game" status. All I really wanted out of game jam was to be considerable more comfortable with a game engine in HTML5. I achieved that. I got a little lax and lazy. I ended up helping someone working on C homework for five hours of the day.
Maybe it was a good break, but probably it hurt the project overall. After that, I went and got some coffee and food with Carlos, and we planned to make sure we had "counts as a game" status before I went to sleep.
Counts as a Game
Saturday night, the repository went from having rectangles bouncing off each other to a movable blue rectangle that could eat smaller rectangles to get bigger and could be eaten by bigger rectangles. There was a basic, ugly main menu and a win condition and a lose condition with two levels.
At the end of this, it was 5 a.m. Sunday morning. I went to sleep. I slept for four hours.
Further Polish
Carlos continued working those four hours. He made the menus much prettier and made a total of eight levels, with endless levels after that that increased the number of bigger squares each level. He added music and sound effects. He polished the game good.
Andy came back around 10 a.m. Sunday. He saw what we had, downloaded a zip-file copy of it off the github repo. He made it so eating was gradual and had an actual shrinking and growing effect. It was super cool. I helped Andy move his changes into an actual repository, and push those changes.
With that, time was up and our game was "done".
The Good
I really enjoyed this game jam, and I got exactly what I wanted out of it. The game we made ended up being pretty neat, and it's really easy to point anybody at it whenever I feel like, which is a decent improvement over the last game jam. I'll definitely stick with HTML5 for game development for a while. It'll also just be good experience to apply elsewhere (cough this blog cough).
I'm really glad I picked crafty.js as the game engine to use. The HTML5 game dev book really recommends it (review coming soon), and it was something I failed to learn when trying in isolation over a year ago (I was trying to make a game for a Game Dev Halloween competition). I feel comfortable enough to work on a game with it on my own now.
The Bad Lessons Learned
Things aren't simple. They are never simple. If you haven't done it before in the environment you're in now, you don't know how long it will take. What I'm trying to say, Stephan, is that I hate circles.
Squares for life.
Though, seriously, I believe that I should come up with a good "things to build in parallel" routine:
- Define current vision of game
- List all things that need to be done to achieve vision
- Specify next actions for all those things
- Separate next actions that don't depend on one another
- Delegate unrelated tasks among team
- Order tasks by easiest (least time) to hardest (most time)
- Estimate the time it takes to do tasks
- Once task time is surpassed
- Revert to most stable recent build
- Move on to next task
- Revise vision for final game
- Restart at step two
If I had followed something like the above, I would not have wasted so much time on circles, and I would have made a lot more progress towards everything else. Also, tasks would have been delegated amongst the team in a more modular manner. Maybe.
Something to try next time.
Also, hard and fast rules for versioning and merging among the whole team, with a focus on getting team members unfamiliar with such concepts up to speed early on, would have been a huge boon as well.
Something to try next time.
Conclusion
I had a lot of fun, I got what I wanted out of the game jam, I could have gotten more out of it, versioning is important, crafty is cool, Carlos and Andy are smart, cool people, and HTML5 is a good environment to work on games. I can always do better. I'll do this all again January. But better.
Peace out.
Wuxia Game: Digging Into Crafty
11/17/14
So, lazy-weekend me had a pretty good idea, actually. Using built-in Crafty stuff at first is smart. The thing I'm going for may not use the keyboard at all (an actual goal), but starting with crafty stuff made me realize that I can, in fact, go digging into the crafty source code.
A copy of it is even in my repository.
And the movement code of interest involves Twoway (platformer-esque controls) and Gravity.
Twoway has constant velocity left/right and a jump key. Gravity, well, it makes things fall, Stephan. Also, you can tell it what things will make it stop falling.
These are both things that I will need to implement in the Wuxia game, just with a mouse-click instead of with keyboard controls.
I made the mistake during Game Jam of trying to make my own stuff outside of Crafty built-in components, but still using crafty. It didn't really work. An understanding of crafty and a habit of using stuff like how crafty uses stuff will probably work out much better.
Wuxia Game: Standard Controls
11/16/14
Now I got a really basic playground (I call the Crafty scene "Playground", more on scenes some other blog post). For right now it's all really basic, a platform on the bottom of the screen, and a controlable green rectangle that you can move around with the WASD or arrow keys.
The previous blog post's iframe will update.
I think I need to rethink how I do this so I don't break previous blog posts with changes to the code.
Lazy weekend are nice, Stephan.
Wuxia Game: Blank Screen Init
11/15/14
Okay, first step to any game... I have been telling myself, is a blank screen. This will also double as my minimal Github progress for the day.
So, I've already done this for the gamejam game. So, I'll just copy that.
Personal goal: explain code in-depth. But I'm out of it today, so you get a blank screen, Stephan.
Trying Out Mint
11/14/14
So, I've been slowly working on some sort of personal financial tool, but in the back of my head I was thinking to myself that I was probably creating something someone else has done a good enough job at creating.
So, I searched around a bit, and then I asked some friends, and I was told about Mint. Now, some friends in the past had told me about this online financial app, but I perhaps prematurely decided against it. I didn't want one online tool having access to all my financial accounts.
But, I changed my mind recently when it occured to me that it isn't that big of a leap from having all my financial information online spread across multiple sites, and having one site connect all those sites together.
So, starting yesterday, I have a Mint account.
So far, I'm not too impressed, but it does look like it'll mostly approximate what I wanted to eventually achieve with my tool, so whatever. The interface is also pretty slick and easy to grok. The extra things I want are now things I can focus on with my tool, while I also finish fine-tuning my setup on Mint.
Onward, to better financial control and literacy!
Making Already Defined Games
11/13/14
I have been thinking about making games that have already been well-defined and/or established for the purposes of practicing game programming separate from practicing design.
I've already decided not to do this.
I've decided based on my positive experiences with Game Jam.
Though, the idea behind it I appreciate and will attempt to execute in a different way. Which is to actually separate game programming and design in the making of any game or just coding project I work on.
For example: I have been toying with a wuxia-inspired game for a pretty long time. I made a toy in python working towards it, and have played with C++ working towards it.
I have never gotten very far.
I think this time, with HTML5 and crafty.js, and my experiences fresh out of game jam, I can work towards the idea here on my website.
The General Plan
I am going to write out what I want to accomplish in the game before I attempt to touch any javascript putting it into action. Only after breaking down my thinking into individual bits of functionality will I begin to code proper. Coding will consist of prototyping towards functionality, and refactoring towards it playing nice with all other code.
Any individual functionality with get a "test", by which I mean a tech demo illustrating some functionality and which points at the same code that will be used by the game. This is actually something I thought up when I noticed my Game Jam tech demo broke.
Idea thought up while elaborating on test construction in paragraph above: regression testing via tech demos that show two functionalities working in tandem. It's good to know when individual functionality changes when new code is added. This change won't always be apparent in individual tech demo tests, because sometimes it'll only show up when new code is actually used. It'll be good to see old functionality change when attempting to run it alongside new functionality. Doing this with every combination seems like overkill, though, so it'll only happen when things noticeably break and the bug is tracked down. The regression test/tech demo will verify that bug doesn't return.
What I Have So Far
Very little.
Yesterday, I wrote down in-depth what I want my start menu to look like. Why? Because I think the controls for this game will be unlike most any other game, which means people won't have any experience on how to play the game at all going in. Personally, I dislike text or tutorials that tell a player how to play in words, and greatly like a game that tricks the player into learning the mechanics. A start menu is where the player first gets control in a game. I must take advantage of things they will try to do naturally to teach them a bare-minimum to get started.
I'll talk about that, and more, in a later post.
I need to get some work done.
Github Streak Renewal?
11/12/14
All right, so just like the first game jam I went to, my second game jam has ended with me having a Github streak going. Having a streak that's already multiple days in makes me want to continue it. However, last time I had a Github streak going, it devolved into me creating issues on github repos everyday instead of doing actual work.
Basically, it was too easy to cheat.
On the other hand, I actually have coding projects, which I host on Github, that I want to work on consistently. A streak done properly would almost certainly help that along.
So, I've decided to attempt Github streaking again.
....
"Github streaking" sounds dirty, Stephan.
Anyways, I stopped working on the Game Jam game last Sunday. So, you may be wondering, Stephan, what have I been working on since then?
A simple budgetting tool. Right now, I used it to track my spending. Between cash, credit cards, and direct debits from my account, I spend from all sorts of sources. So for right now, I'm trying to explicitly keep receipts, or when I can't get a receipt, right down my spending, and then input it into this terminal-based tool to save the dates, types, and totals of my day-to-day spending.
I tried this before, but all I made was a tool that read the logs I wrote by hand. Now I have a tool that takes input to make the logs as well, meaning I can iterate both on analysis code and input code. Hopefully, that will mean I avoid using this much less.
I have looked at already available budget tools, especially open-source ones, but I find I don't know enough about finances to really know what tool I need. I'm working on that knowledge though, by reading tutorials on Investopedia, so maybe this tool will be short-lived, and I'll retire it after I know enough to pick a tool someone else makes. Or maybe I'll like having a tool I made myself. Who knows.
Anyways, it almost looks like I'm already falling back into the trap of pushing issues to repos on Github instead of actually working on them. Monday and Tuesday were both issue-only days. The difference is, however, that I'm actually trying to use issues as a design tool this time. I'm even regularly posting comments (which doesn't count towards the Github streak) to each issue, linking to good resources, and thinking about how to go about implementing or fixing the issue.
And this morning I closed an issue. Now log files are generated in order by date, then expense-type, and then the spending in each expense-type. Making actually reading my expenses through this tool's log files a little bit easier.
So, I'm trying Github streaks again. Hopefully, it works out for the best.
11/11/2014 Planning
11/11/14
So, I haven't exactly followed plans from before, but they've been good inspiration for posts and stuff, so let's keep doing it.
Posts I've planned but still haven't done:
- My opinions on GamerGate
- Blog transition finish
- Web Game Development
- Game Jam: Post-Mortem
- Exercise, Diet, and Productivity
- My Current Organizational Infrastructure
Some stuff that's been on my mind:
- White Hat Hacking
- Making already defined games
- A horror blog or website
- Github streak goal renewal?
I think I'll refer to this post for future posts for a bit.
Gamejam: Demo Broken
11/10/14
That demo you see two posts below? That's broken.
The retangles should also be bouncing off each other.
I had it pointing to the same code that the main game used, with minor additions in the script itself. Near the end of the game jam, some hacks were necessary for functionality purposes.
Maybe later I'll fix it and also talk about the issues I was having.
Some content for the upcoming post-mortem, I think.
Gamejam: The Final Moments
11/09/14
It's not actually over, but with the time remaining, and the things I'm interested in trying to do, and what's been achieved so far, I'm comfortable stopping now.
The Final Game (warning: sound).
Actually, now it is over.
Post-mortem coming soon.
Gamejam: Quick Recap
11/09/14
It's not over, yet, but I totes neglected to blog each day of the Game Jam.
11 hours remain.
A tech demo I had working early this morning can be found here, Stephan.
Wait, would an iframe work fine here?
Awesome.
And that right there is why I wanted to do an HTML5 game, Stephan. Though, apparently emscripten would let me do something similar with C. And I bet there's some python equivalent, too. But who asked you, Stephan?
But anyways, I very quickly skimmed through options via the Web Developer's Cookbook and its companion Github repository. My fork of it (no changes) can be found here. And you can even browse the repo and play the games on this website at this link.
Browsing options and setting up my site was a good chunk of the beginning of the first day after we received the theme of the game jam.
Oh, yeah: "we". Also: "theme".
I'm jumping a bit ahead, aren't I?
I arrived basically right on time to the game jam at o'seventeen hundred hours, Friday the 7th of November. It was uncharacteristically warm for the week, but still cooler than is normal on a....
Trying to narrate an actual story with descriptions and stuff is time consuming. I arrived at 5 p.m. I setup my computer.
Teams were made. I teamed up with an old friend and a completely new guy. The new guy really wanted to make an HTML5 game, so a person I teamed up with last time switched groups with him.
It all seemed to work out. We were told the theme.
Wonderland
We quickly devised a game composed of shapes that ate each other to grow bigger. I was inspired by the "Eat Me" food in Alice in Wonderland that made her change sizes. New Guy was inspired by the early stages of Spore. Later it transformed more into a clone of Osmos.
Then Me, My Friend, and New Guy started exploring HTML5 options.
After sometime playing with the recipes we decided on crafty.js. The rest of the day was pretty painful. Crafty is confusing. In fact, Stephan, you might just say that Crafty is crafty.
Rendering any given shape via mathematical methods isn't trivial in Crafty. I wasted a lot of the first day struggling with circles. New Guy didn't give up, and kept working with them. I gave up, and stuck with squares (as you see above).
Those hours spent struggling with circles were not wasted, however. It mangled my brain and blew my mind, but I came out with an appreciation for how Crafty is constructed.
That's not to say there aren't some serious problems with Crafty, however. Some weird, inconsistent behavior abound (to be fair, that's how all javascript libraries are now, it's a wild west and standards aren't established). For example, "Click" is not a functional event for right-clicks, but is for left-clicks. "MouseDown" is functional for all kinds.
Lots of stuff like that, and if you peruse the Crafty site, the documentation is sparse (again, like lots of javascript libraries).
Anyways, the current setup (consistently updating) can be found here. The repo is here.
10 hours remain.
We'll talk more about this later.
I have work to do.
Budgeting, Finance, and... Gamification?
11/07/14
I'm financially illiterate.
I'm pretty sure. At the very least, I'm still unsure at what being financially literate really means.
I need to be better about my finances. I need to start following a budget again. I need to make a better tool for budgeting.
That tool might as well be built up into a game.
Now, I've already started making a budgeting tool. Currently, it's just a single python script that takes spending info from a user via terminal and appends it to a single log file.
Got a ways to go, but it's a good start.
Currently, the plan for the tool is to adapt it to my personal needs as far as basic budget tracking goes. At the same time, I'd like to slowly inject lessons I learn while reading the tutorials over at Investopedia.
Further, I'd like to "gamify" the whole thing. Which is to say, adequately introduce challenges as the player is ready to tackle them. I'm not sure how much I care about the "reward" aspect of gamification, but I'll explore that as I go along. I'll also need a good system for measuring failure, and reintroducing old, easier challenges to train user for harder challenges, and also curb any possible frustration.
It's all really vague right now because I don't really know what I'm doing.
Which reminds me, a big part of why I'm making so little progress on game dev stuff so far might be because I'm trying to learn so much at once. It'll probably be a good idea to set aside some time to make already defined games, for actual game programming purposes.
But that's a blog post for another day.
Anyways, speaking of budgeting, I need to log my spending for the past few days.
Game Jam: Preparation
11/06/14
So, I have been reading a new book.
And this weekend the UA Game Dev Club is hosting a Game Jam. I went last semester and made a game about rabits vs. flowers . It was a super motivating experience, and led to a Github streak that lasted almost two months.
So, I'm totally going to go again, and this time I plan on making an HTML5 game, because, hey, I'm reading a book about making HTML5 games.
Originally, this post was going to be about me prepping my computer and just planning for all sorts of things ahead of time, but I changed my mind. I'm going to go in basically blind and unprepared and see what happens.
It'll probably be fine. If not, I'll plan better next time.
I do, however, still plan on blogging each day of the event.
Plan for the Week of November 1st to the 7th
11/01/14
The last plan didn't, uh, go according to plan, but I like the idea of planning, so....
Let's try again.
With a slight difference, actually. I want to do an average of one blog post per day. So, instead of planning which posts for which days, I'll just plan at least a week's worth of posts ahead. When I run out, or decide to change my plan, I'll make a new plan post.
This week's plan:
- Blog planning post (this post).
- Preparing for next weekend's UA Game Dev Club's Game Jam!
- Budgetting, Finance, and... Gamification?
- Exercise, Diet, and Productivity
- My Current Organizational Infrastructure
- Game Jam Preliminary Plan
- Game Jam End of Day One
- Game Jam End of Day Two
- Game Jam Conclusion and Post Mortem
I Have a Twitter
10/24/14
I have only used it to post my first tweet.
More to come?
I guess this is short enough to be in a tweet....
Duolingo Progress
10/24/14
I have been doing Duolingo pretty close to everyday. I have started recording it (almost every time I do it). Rosse (aka rossetoph) and I (Silent K, I'll explain it later... specifically [deadline: next week]).
So, I don't really know how I feel about it. I'm learning some vocab, some sentences; I'm clearly understanding bit by bit. Or am I? Though, any criticism can probably be boiled down to "I'm trying to learning two different languages in twenty minute segments per day." Progress is going to be slow and barely noticeable, that's just fact.
I guess I can just link to my youtube account.
Japanese Study Habits
10/21/14
Two weeks ago, I started studying Japanese with Rosse. We've both studied it before, Rosse for three years, and me for two. I even went to Japan for a few weeks once. It was a positive experience.
I had been wanting to get back into studying it for a long time now, but have never made the time. But two weeks ago, we decided that every morning Rosse and I would walk down to the local Starbucks, pull out our old Japanese textbooks, and review our Japanese.
In two weeks we have gotten to the second chapter of the second textbook (though, I probably skimmed the first a bit too much).
We've also joined Lang-8. We've done very little there so far, but we have a rough draft of a post in our notebook, and have been working on a translation of our introductory post thanks to some help from a user named Michelle.
One hour or so of Japanese, out of the house, each morning has been pretty wonderful. It gives me energy for work on weekdays, and gets me out of my want to be lazy on weekends. I'm really enjoying it, and am glad Rosse and I agreed to try this out.
Making progress on my Japanese almost seems like a nice secondary effect of the whole thing.
Monday Planning
10/20/14
All right, so I want to do some weekly planning. I'm going to mess with how I do it a bunch, but for now, I think part of the weekly planning will be a plan on daily blog content for the week. Every Monday, I'll post blog plans for the rest of the week, and also go back and attempt to properly document captured deadlines in previous blog posts.
So, my previous post mentioned two deadlines:
- Simulating transportation patterns (end of year)
- Tweeting/blogging through each pattern (2016)
I will capture these in my tickler, and Someday/Maybe areas.
....
Speaking of Someday/Maybe.... I should incorporate checking that, and my general actions list into this weekly endeavor, I suppose.
Maybe there'll be two blog posts per week devoted to planning. I'll do a "weekly review" on Friday or Saturday I think.
The planned posts:
Some interesting troubles formatting that above list there....
Calls for a meta post at some time (11/2).
Review: A Pattern Language
10/19/14
I have finished yet another book.
I super enjoyed reading this book. It starts at the very high level of towns and cities and works its way into individual rooms of all sorts of buildings, all of which I found really interesting, but I feel in retrospect I'm going to need to put my skeptic hat on. It ends with technical construction advice, which it says outright is not yet tested (and that they'll cover it more in-depth in the next book).
Why did I decide to read this book?
This book first popped up on my radar during my read through of The Art of Game Design, wherein author Jesse Schell described his difficulty on how to structure the world of Toontown:
Quoted from "Chapter Nineteen: Worlds Contain Spaces" under the section "Christopher Alexander is a Genuis". A Pattern Language, as well as Christopher Alexander's other texts, all got pretty high praise, and an understanding on how to craft worlds seemed incredibly valuable to me. I made a note of the book.
But high praise from one source did not push me into reading the book. A Pattern Language is a book that's inspired several other classic texts, notably (in the field of programming) Design Patterns: Elements of Reusable Object-Oriented Software.
It seemed to me that this was the kind of book that changed the way you saw the world, and that's exactly the kind of books I want to read.
The Journey Reading
I expected a book giving some basic insights into architecture and the thought process going into it.
And I got that.
But I didn't anticipate an incredibly engaging philosophy to come along with it.
A Pattern Language is comprised of 253 patterns, and a short introduction on the order and purpose of such patterns. It starts very high-level, at regions of society, and works its way meticulously to the placement of furniture. Each pattern is smaller piece of the pattern before it and composed of the patterns following it. The patterns intricately weave a fabric to serve a society.
I was going to post opinions on each pattern as I read through them, but with 253 of them within a 1200 page book, there wasn't much more than five pages per pattern. And once I started reading, I wasn't about to stop after a mere five pages. I was that engrossed.
Some particularly thought-provoking themes that I observed while reading:
Cities: Separate but Connected
Patterns of note:
- City Country Fingers
- Mosaic of Subcultures
- Scattered Work
- Identifiable Neighborhood
- Four-Story Limit
- Old People Everywhere
- University as a Marketplace
Basically, the beginning of this book feels like a pretty significant condemnation of the city as it is currently constructed. The city should be formed such that subcultures grow and are cultivated, and are not forced to conflict with each other's differences with shared space.
The individual should have human access to the governing system. Getting access to a person responsible for your part of town shouldn't be more than a friend of a friend away.
Work need not be far from home. It should be a short trip away. Ideally, such that coming home for lunch isn't out of the question.
People go crazy living too high up (there's citations for this). It separates people too much from the city, and provides too strong a motivation to isolate yourself (hypothesis of book with citations provided implying it's at least a possibility). Avoid buildings larger than 4-stories, especially buildings meant to be lived in.
The old have a lot to provide to society. Not all are equally dependant on help. A proper distribution of the old allows them to share their wisdom to anyone who is willing to hear, and also distributes professional help according to need. It need not be more expensive than nursing homes.
Everyone should partake in learning and teaching their whole life. The University should facilatate this philosophy, and be well distributed throughout the town.
More Effective Transportation
Patterns of note:
- Web of Public Transportation
- Ring Roads
- Mini-Buses
- Nine Per Cent Parking
- Parallel Roads
All forms of public transportation should be in sync with each other. Drop-off locations, timing, everything. This synergy would only convince more people to use public transportation.
Our grid road system is arachaic and inefficient. Transportation could be both faster and use less fuel even with a slight increase in travel distance.
Buses as they exist right now fall way short of what they could be. Imagine a hybrid bus-taxi system. One need only walk to the closest bus stop (and hopefully there is one every 600 feet along major roads), call in your destination using the bus stop's phone (this book was written in the '70s), and the bus station's home computer will calculate the best route change for all buses such that you reach that destination with fewest detours among all passengers (only one bus ride).
Parking shouldn't take over the land. No more than nine per cent parking in any area. No cheating by putting all the parking for one area in another one. With proper public transportation and road design, this need not be inconvenient for the population.
The Plan to Return
The book makes some big statements that I don't see being put into effect much anywhere. I am curious if their philosophy, though nice in theory, isn't actually applicable. Their transportation theories, in particular, feel easy to test via simulation, and that's something I'd like to do in the near future (deadline: end of the year).
The mini-buses idea seems particularly interesting to me. Especially if, as they believe, one could save time, money, gas, and maintenance (basically all the things) with the system.
I would also like to actually blog/tweet through each pattern in the book at some point, too. That's a long project, and not something I plan to do for a while (deadline: 2016).
The actual construction section of this text went a little over my head. Which is unfortunate, because I am a home owner, and DIY home projects seem very interesting to me. And the actual content of the section was very interesting. For example, concrete with qualities very similar to wood? Yeah, they talk about such a concrete, and how useful it can be in construction. I was unaware of such a concrete.
They also outright state that the construction section was a work in progress, and plan to release another volume in their work on construction. Perhaps I'll check that book out.
Conclusion
A really fun book to read that changes the way you look at how the systems that run the society you live in are affected by the structural foundation.
I think everyone should read this book. I think everyone should try to apply the idea of patterns to what they do or love doing. I think we should do as this book suggests and build upon the patterns they present.
GDC CA Application
10/18/14
First things first.
What's "GDC"
That's the Game Developers Conference held in San Francisco, CA every year. I went one year, a junior in college, with nary any game experience or any idea what to expect. I showed up on a Wednesday (starts on a Monday and ends on a Friday), and I was incredibly inefficient.
I had a blast.
I want do go again, but tickers are expensive.
Enter the CA
The "CA" is a Conference Associate. It's a volunteer position for GDC. For a mere 25 hours of work, you get an "All Access" pass, which is about $1000 value.
Hell yes.
It's also extremely competitive, with limited positions and many applicants. I falied to get in last year.
If at first you don't suceed, yada yada yada....
The application stuff starts here. I'm going to save what I write, but I'm not going to make it public. I think that might be frowned upon or whatever.
Maybe I'll post more if I learn otherwise.
Resume Update
10/17/14
I have put off updating my resume for too long.
I have finally gotten around to writing a new one. In LaTeX.
Yay.
I ended up not blogging about it while doing it though....
Quick recap:
- Found good LaTeX resume examples
- Picked one I liked (PDF)
- Made some edits for my purposes
- Copied compiled PDF to main site area (PDF)
I put this off for a long while, and then finally made a deadline of today, and I did it! Well, originally I set a deadline of yesterday, but yesterday's blogpost changed it to today, so it's okay, Stephan.
Though, it does make me think about planning in general. Maybe the shorter term the plan the more it should be composed of actions. Whereas longer term plans should be composed of purpose or vision.
Hmmmm.... It makes sense considering the GTD hierarchy.
Something to ruminate on.
Also, though, it really is good to have parallel things to do, and to force myself to change to other things when something is taking me longer than I anticipated. Blog transition stuff is still something I will work on, but trying to focus on only that just wasn't a viable strategy.
I'd still like to finish the transition this weekend though.
We'll see.
Back to Everyday Post
10/16/14
The "working on blog stuff everyday" instead of "posting everyday" plan isn't working. I'm not doing it. I'm using my plan of transitioning over to Tornado stuff as an excuse to basically not do anything else productive.
Except for language-learning stuff, but that's something to talk about in another blog post (I'm really excited about how stuff's going, though).
But, using something as an excuse to not do something else, and then proceeding to waste my time doing stuff I won't remember or value having done is a broken mechanic. I'm removing it.
I'm still working on the Tornado transition, but I'll still post everyday. The scripts I end up developing that'll move all the blog posts into a database will work on the additional posts just as well as the previous ones.
Coming soon:
- Updating my Resume and LinkedIn Stuff
- Conference Associate Application
- Review of "A Pattern Language"
- My Opinions on GamerGate
- My Opinions on GMOs
Those last two are inspired by Facebook discussions/arguments I've gotten into. The first one is something I've been meaning to do but putting off.
The New Experiement: Setting Deadlines
I think I'll try out setting deadlines. Blogging about them even. I think deadlines, in many cases, work better than time-blocking for me, considering how some things I do at work are run and wait for completion. Though, the two aren't mutally exclusive, so I'll try a bit of both, I think.
- Updating my Resume and LinkedIn Stuff (10/17)
- Conference Associate Application (10/18)
- Review of "A Pattern Language" (10/19)
- My Opinions on GamerGate (10/25)
- My Opinions on GMOs (11/01)
I think things will go much better here.
Also! Also, I started running again. Last time it took a while for things to start clicking, and things are instantenously better, but I feel them slowly coming together.
Letting You Know
10/08/14
Getting the Tornado setup of my blog working. "Blogging everyday" is going to become a "work on blog everyday" now. The goal will be to get content to the site everyday, but sometimes I'll prioritize a project I'm working on, and write one long post about that while I work on the project (I find it really helps me figure out what I'm doing to write the blog in real time).
I haven't fallen off the wagon again, Stephan (though, you already knew that, so I'm being unfair of accusing you of believing that, but whatever). I hope to have the Tornado blog stuff working by Saturday night. So expect more regular content starting Sunday.
I'll try and warn you of when the next blog post will be more than a day away in the future.
Blogging About Everything
10/03/14
There's a lot of things I do that I think maybe I should blog about. Like, in particular, things I do that I want to stop doing, but also things I think about, things I plan to do, and things I "plan" to do.
There's a few dreams I have had that maybe I should blog about. Including a lucid dream.
My yard is way outta control, and I took pictures when it was at its worst (and its not much better than that state). I have had strategies to get it in control and keep it there, but like most of my strategies, it seems they weren't sustainable.
Oh, yeah, wasn't I going to blog more through A Pattern Language? I was, Stephan, I was. Now I'm almost done reading the book. Took about two months. Actually pretty good for a book that's about 1200 pages. It's really interesting, defintely gonna blog a "review" and talk about my plans for returning to it in the future.
I had a Facebook argument recently about GMOs. It's actually still going on, but at this point the Facebook interface for discussion is not cutting it. I plan on both continuing the argument here and giving a background on it.
That's going to require some tact. Actually, a lot of stuff I want to release to the general public is going to require tact and I'm going to need to be smart about what I don't say. I got some stuff up in my brain I'm not ready to share with the public, and I'm sure the public won't appreciate a considerable amount of stuff I would be willing to share.
Important to know what to keep to myself.
I definitely want to continue blogging my way through various projects. The ones I do in real time provide a lot of learning for me, and hopefully it helps someone out, and hopefully I get better at making 'em engaging and useful.
Right now I'm working on putting my blog in a SQLite database and having it all run on tornado. I'm quite a ways into the post, actually been working on it for a while. If you can guess the filename and path, you can actually find the work-in-progress. Though, you seem the patient type, Stephan.
I'm not good at asking for help. Defintely going to blog about working on that.
I want to be a better activist, too. I'm starting to solidify my identity and stuff, and figuring out what I think is worth fighting for, so to speak. Definitely pro-feminism. I'm atheist, but not anti-theist (anymore, I should talk about that process, too). Defintely recognize that racism and the like is still really rampant, and there needs to be something done about it.
Also, fiction. I got lots of ideas in my head there that I need to do a bad job of writing down so that eventually I can do a good job. I'm talking vigilantism fantasies, hacking horror (another blog-post in progress), and there's more I swear but as I try to summon them all at once I'm drawing a blank.
I've done a few game idea posts, but there should definitely be more of those.
Also, stream of consciousness. I do a lot of it, and this blog post exemplifies it. I don't really need to blog about that, I just did, but I can't think of a better ending to this post.
Feeling So Much Better
10/02/14
If I'm not back for realz this time, my body is straight up trolling me.
Yesterday, I started writing a post titled "Sick and Tired of Being Sick and Tired". I didn't have the energy to get past:
But that was early in that day.
Well, actually it was like 2 p.m., but my sleep schedule is really screwed up right now, Stephan. I mean, you must've noticed, we haven't been at work at the same time, but I'm sure we both noticed stuff mysteriously changing in the office.
But, I digress. Being sick sucks. Sinus infections really suck. Sleeping 12+ hours everyday was only ever really fun in college. (Yes, I slept that much in college. It was glorious, and I like to think it's one of many things I didn't do on purpose that led to me doing so well in college.)
Here's hoping things start going well again now.
The return of blogging everyday?
What Ails Me
09/25/14
Saw a doctor again about my illness. Diagnoised with sinus infection. Not contagious, and I have medication that should make me better now.
Yay!
Hopefully I'm back proper this time.
CLRS: First Exercises
09/23/14
So, I've made a tiny, tiny amount of time to read some CLRS. I got to the first, very simple exercises and haven't opened it since then.
I want to do all the exercises in CLRS.
All of them.
Now, it would be much faster to just read through CLRS, and I'd probably get a lot out of it, and either way I'm not using the book as it's expected to be used.
CLRS is not meant to be read cover-to-cover. It's reference material. Pick a chapter of specific interest, and read that chapter start-to-end, maybe.
Though, after reading up to the first exercises, I think maybe I shouldn't read it cover-to-cover.... I think I should skip to the exercises and refer to the text only when necessary.
Yeah!
Anyways, the problems:
1.1-1: Give a real-world example that requires sorting or a real-world example that requires computing a convex hull.
Real-world sorting:
- library-books
- person line-up (by alphabetical order)
- timing of (historical) events
- Order of operations
- Representations of data (plots and graphs)
Real-world... convex hull? Wassat again?
Rereading.... Hmmm... they might not have defined it yet. Checking index.... Oh, yep, there it is, defined in an example problem given.
The convex hull is the smallest convex polygon containing n points in a plane.
Real-world convex hull:
- ....
You know, I have no idea.
Another good link on real-world uses.
Some ones I found particularly interesting:
- Ideal mixing of two liquids based on various reasons
- Collision-detection
- GIS data
1.1-2: Other than speed, what other measures of efficiency might one use in a real-world setting?
- Memory
- Power
- Correctness
1.1-3: Select a dataset you've seen previously, and discuss its strengths and limitations.
Binary search trees. I suppose they're kinda like a jack of all trades, if you think about it. They don't do anything in constant time as far as I know, but they do most everything in in log(n) time, which is pretty close until n gets really large.
Answering this question is making me think I don't think about this as much as I should.
1.1-4: How are the shortest-path and traveling-salesman problem [...] similar? How are they different?
Both problems are trying to minimize distance-travelled while still reaching their goals. The shortest route problem has multiple potential paths to one goal, while the travelling salesmen problem has multiple goals that can be visiting in various orders.
1.1-5: Come up with a real-world problem in which only the best solution will do. Then come up with one in which a solution that is "approximately" the best is good enough.
This is taking me a lot longer than I think it should....
Approximity good enough: stock-market portfolio.
Best solution necesary.... This is a "you're right or you're wrong" sort of problem. Hmmmm.... Phone number look up?
Let's go with phone number look up. (I'm must be trying too hard, this can't be very difficult to come up with answers to....).
First set of problems done! Actually had me thinking, which I feel shouldn't be happening so soon.... Oh, well, hopefully it means I'm learning.
Quitting is Hard
09/22/14
I made it one day without reddit, webcomics, and blogs....
It's quite frustrating.
To be fair, yesterday was a bad day, and it took most of the day for me to break down and waste precious time on low-value time sinks. Today is going pretty well (excepting a short slipup this morning).
It's still frustrating though. Back in Febuary I thought I had this habit kicked. I thought I had soda consumption under complete control. Side-projects were getting more time. It was bliss. I had even thought at the time that I had finally done it, I had control over my life and wouldn't lose it.
I lost it. I mean, I haven't fallen back to square one by any means, but my standards are higher now so that's basically how I feel. And there's so much I'm not doing now that I was doing and wanted to keep doing....- I'm not drawing or learning to draw
- I'm not working on a game (to any consistency, anyways)
- I'm not properly reworking my organizational infrastructure
- I'm not eating properly
- I'm not running
I'm not running....
Hmmm....
That's kinda where things started coming together: when I started running as a break in the middle of my day. It evolved into gym breaks 3 days of the week and run breaks 2 days of the week. That worked really well at first, but as I got better at the gym, it was less effective as a middle of the day break, and I went from needing less sleep to needing more sleep again.
Then gym and running died off altogether. I had knee pains, breaks in the middle of work weren't working out as well. I have a dog now that I take for long walks in the morning. I stopped.
Things kept going mostly smoothly, though. But maybe it's like my increased metabolism. It isn't going to snap back.
I think it's time to make time for running again. Running proper. Running to the bus stop doesn't count.
And I'm Back
09/20/14
I got sick again. I'm still a little sick. A little over two months since last time, this time. It seems it's a really bad cold. The longest I've been put out of comission by a cold, I feel.
I had very little motivation to do anything. I slept well over 50% of the time. I managed some Duolingo and some Dark Souls (all of which was live-streamed to Twitch and recorded to personal hard drive. Expect some youtube uploads eventually. Mostly I just spent my awake time browsing sites I keep telling myself to avoid (reddit, webcomics, blogs).
Being sick gave me so much time to peruse these sites that I think I can finally convince myself to stop. They're draining fluff that not only don't inspire me to do cool things, but actively distract me from doing cool things.
I have a lot of low-energy things I have put aside to do eventually. They're listed in areas easily accessed during low-energy states. I just need to build the habit of checking those areas first.
It's definitely time to stop doing low-energy fluff that kills what little energy I have, and build the habit of doing low-energy tasks that are valuable and hopefully increase the energy I have.
Gamification
09/12/14
With the return of Game Dev Club meetings, a game night tonight, and hopefully the return of me working on game stuff, I've been thinking about games quite a bit. With my use of Duolingo, I've also been thinking about gamification.
I think gamification is the future in a lot of ways. Well, really, it's now and always has been. Life is but a game, layered with complicated and tedious mechanics, ambiguous goals, and poorly developed pathways to success.
Good and deliberate gamification is the future. Duolingo definitely has the right idea going (though, it has its critics, and probably has a ways to go before its really, really good): take existing problems where solutions can be sold, and set them up in such a way that teaching people how to solve those kinds problems actually creates sellable solutions.
In the case of Duolingo, it sells collaborative user translations of learning language content into their native language (for example, at some point I'll translate Spanish and/or German into English). The site itself presents the learning in a simple game format, and provides a good challenge curve of more and more language content and concepts to tackle. So far, I have neither had the experience of doing busy work nor of having a challenge I was in no way prepared for. I feel the curve is pretty similiar to the one given in Art of Game Design.
People, learning for free and without ads, because how they're learning provides more value than the cost of teaching. That's powerful, powerful stuff. That's basically the goal of education, but the cost of learning is usually pushed onto the student, because payoff is usually much farther away.
But this way is just better. It weakens a common conflict of interest that often arise in business where the business could make more money by doing a worse job. This is a depressingly common exploit in free-market systems, I feel. But in this case, the better you teach users in whatever capability they are trying the gain, the higher quality output they provide, which allows for greater revenue streams (hopefully).
Of course, this is a simplistic, idealized model based off of one example that I do not know that much about. I'm sure it can be gamed and exploited as well. But I still really like the whole idea.
I especially like the idea applied to code and/or gamification itself. Think of a system like Duolingo that taught users how to make games that teach (which may or may not require the teaching of coding). They could be handed problems that some customers would actually pay for solutions to. But also, this tool could be pointed at open-source content. It could be pointed at most anything, once it got good enough.
It could be pointed at itself. Users developing capability with a tool could improve that tool with their new-gained abilities. The tool would get better at making users better who would then make the tool beter again. A virtuous cycle. Perhaps a tool-generating singularity, if I want to get really hyberbolic.
And maybe we could take the monetary model further. Free isn't good enough; users should be paid for their work. Especially if they're the main maintainers of the tool itself. Perhaps it could be enough pay to sustain them.
A nice dream. A good goal. It's something I want to try to make.
Game: Hiding GameObject Privates
09/11/14
All right, game dev stuff!
Yeah!
Today, I properly hid private functionality for the GameObject class code.
....
"That's not really very game dev-y."
Right you are, Stephan. This whole game dev setup is also an excuse to learn and develop C++ coding practices. I'm not saying the current setup is necessarily good, but it was something recommended in Code Complete and this seems like a good time to get a feel for it.
The header class definition for GameObject looked like this:
public:
GameObject( int, int, std::string );
~GameObject();
int getX( ) const { return x_; }
int getY( ) const { return y_; }
void setX( int x ) { x_ = x; }
void setY( int y ) { y_ = y; }
int getVx( ) const { return vx_; }
int getVy( ) const { return vy_; }
void setVx( int vx ) { vx_ = vx; }
void setVy( int vy ) { vy_ = vy; }
void handle( const SDL_Event & );
void update( double dt );
void render( SDL_Surface * );
private:
// TODO: private class defined in file (keep private stuff hidden)
int x_, y_, vx_, vy_;
SDL_Surface *sprite_;
void jump_( int, int );
};
Now it looks like this:
public:
GameObject( int, int, std::string );
~GameObject();
int left( ) const;
int centerX( ) const;
int right( ) const;
int bottom( ) const;
int centerY( ) const;
int top( ) const;
void setX( int x );
void setY( int y );
int getVx( ) const;
int getVy( ) const;
void setVx( int vx );
void setVy( int vy );
void handle( const SDL_Event & );
void update( double dt );
void render( SDL_Surface * );
private:
GameObject_ *gameobject_;
};
I feel like it might make more sense to make the private gameobject_ object a reference instead of a pointer. But reading into it and everything is revealing to me that I'm trying to learn the metagame to a game I don't even know how to play. It's overloading my brain without much payoff. I'll try to stick with basics and fundamentals, adding new concepts piecemeal, and play with things accordingly.
Anyways, I'm doing this because I'm hoping to have things setup such that I can limit the amount of files I'm poking at once. When last I was making a game (gamejam_flowers), I got up to looking at 8 files at once. There was a lot of coupling between most of the files containing the python code.
I'd like to think that this game will end up much more complicated than a game made in a short weekend. I'm not sure how low I can keep my number of open files to be productive, but I figure if I can design such that less files will be open, I'll be more productive overall. So, I'm making it that when I'm altering how GameObject behaves, but not how other code interacts with it, the only code I change is in gameobject.cpp. Even gameobject.h can be a file I ignore.
I'm trying to build design skills such that I only need to understand and/or alter a tiny amount of code to get changes I desire. Lots of the coding books I read drill in the importance of it. Accomplishing it allows for easier reading, maleability, maintenance, and improvement of code in general.
I'm not good at it, but I've only been specifically working on this skill for a very short time. I'm a long way from the 10,000 hours mastery.
Site: Tornado Browse Bar
09/10/14
So, that browse bar to the left (or wherever it may be in the future) is copy-pasted to every html link that exists within this site.
That's bad. I have... around 100 files now that make up this site (that'll need to change, too, but one thing at a time). If I wanted to change that bar in most any way, I'd have to make that change to all those files. I'd probably make a script that would do that, but still, smarter to have that browse bar html in one place and have everything that wants it grab it with a single bit of markup.
So, how should I do that with Tornado?
Enter Tornado's template documentation.
Reading....
Reading....
Okay, I think I get it. Really, I can copy one of my many browse bar copies into a browse_bar.html that's placed in my template area. Any bit of code that wants it can just:
Let's make a little test of this with my tornado Github repo.
Don't be concerned if you think it looks exactly like the regular homepage. That's what it's supposed to look like. I'm refactoring the site before I further improve it.
Japanese Study Plan
09/09/14
So, as I've stated previously I want to learn some languages:
- Spanish
-
UkrainianGerman - Japanese
It turns out that Ukrainian isn't available yet on Duolingo, but German is. My mother's parents were German, so there's still some heritage there. Unforntunately, it doesn't have the added benefit of something to give to my still-living grandparent, my babuska, who is Ukrainian.
I'll figure something out there, though, hopefully.
Anyways, I'm already really side-tracked from the title of this post. Japanese study plan. I already got some good textbooks on learning Japanese, and I've forgotten most of their content.
The plan with Japanese is to slowly build vocabulary, kanji, and useful sentences with the digital flashcard software, Mnemosyne. I'm currently using the Nakama I and II textbooks as my main resource.
So far, it's going pretty well. I'm regaining lost Japanese at a decent rate, and Mnemosyne is making sure I retain that regained ground.
Game: Back Again
09/08/14
So... I got distracted there for a bit. With, like, website stuff, and learning spoken languages. Which, you know, is fun. Today was the first Game Dev Club meeting of the semester. Well, is, I'm writing this before, in the meeting room.
Already, it's good motivation to get back into game stuffs.
....Where was I? Oh, yeah. I was stuck on trying to implement components. Too complicated, too fast. I don't have functionality I want to split between separate game entities, yet. Might as well just continue hacking things together until things get too confusing or hard to maintain.
Screw it, I'm going to work towards movement in two dimensions. That's the next step.
The Editor
09/07/14
I'd like to make a YouTube show called "The Editor". It's where I'd take movies of any kind of quality and talk about how I think I could make them better.
It would range from small edits to complete rewrites, and cover the horrifically bad to the amazingly great.
Some movies I'd like to tackle:
- Green Lantern
- Man of Steel
- Frozen
- Tangled
- Click
- Pacific Rim
- TMNT
- Spiderman 3
Actually, I'd like to do more than just movies. I'm thinking I'd like to attempt to critique a piece of entertainment in the medium it was presented in.
Other bits of entertainment include:
- Death Note (manga)
- Walking Dead (adventure game)
- Zelda (action-adventure game series)
I have a webcam and a microphone. Perhaps it's time to just pick a movie and try for it.
Site: Tornado Transition Plan
09/06/14
All right, so I want to make this site run with a tornado background. Why? Well, there are a couple of reasons....
- Currently, a lot of the HTML is copy-pasted
- A lot of stuff I want to do will be really tedious to copy-paste
- Previous and next posts on individual blog posts
- Changes to that browse bar to the left there (that's right, copy-past)
- Code is currently really tedious to format in basic HTML
- HTML overall is pretty tedious, I might want to check out other markup languages
So, I need a plan. And that means another list. Screw it, this time, an ordered list.
- Replace all instances of browse bar copy-paste code with tornado template code
- Script that copies static HTML blogs posts to database (maybe start with SQLite)
- Split blog page into series of blog posts (there's starting to be a lot of posts, about time to break it up into pieces)
- Switch from static setup to tornado setup
- Improvements to the project page (nothing to do with tornado, I just want to do this at some point)
Each of those pieces are going to require their own plans and exploration. Expect blog posts on them as I do them (eventually).
The Case for Lives
09/05/14
Every once in a while, while I peruse the Internet instead of doing things that are both more fun and more rewarding, I come across some bit of literature that talks about how lives shouldn't exist in games anymore.
Are lives still a useful game mechanic?
Having gone back and played a lot of the older games with lives in them: yes. And this isn't nostalgia, as most of these games weren't games I had played when I was younger (and even the games that I had played were games I barely remembered).
Lives are a piece of a tiered health system. Layered carefully, it is an intelligent means of structuring how a game punishes your error. That games lately don't use them intelligently does not indicate that they are an outdated mechanic. The actual problem is that features in modern games destructively interfere with the lives system, making them pointless or frustrating.
These features are:
- All previous content is available
- The game notifies you of available secrets and compels replaying levels until all are found
- Level-design that doesn't take lives into account
Letting any previous level be played at any time is a serious design choice that says a lot about your game. Yet, it seems that all games do it now because they can. I think this can break a game on several levels. In fact, it can break levels.
Let's look to Mario on how this works. Super Mario Bros. 3 and Super Mario World are very similar games, but they also have many differences. A significant difference would be that in Super Mario Bros. 3 you can not replay conquered levels, and in Super Mario World you can replay any available level.
This design difference actually breaks Super Mario World in a lot of ways.
- Special things aren't so special
- Want blue Yoshi? Go to any level you know how to get him in
- Want the cape? Go to a level that has easy access
- Want lots of extra lives? Grind levels where they're easy to get
- Start + Select out after you get what you want
- This destroys replayability
- Special levels with special items are replayed constantly for available secrets
- Levels with multiple endings are replayed immediately to get additional path
- Fun but otherwise straight-forward levels are rarely if ever revisited
- Narratively, it doesn't make any sense
- Didn't I "beat" this level, why has nothing changed?
- What does beating a level do, then? Why can I move on now?
- Shouldn't the level be different in some way?
Compare this to Super Mario Bros. 3
- Special levels are super special
- Secrets can be got at once between beating the level and replaying the world
- Fully exploring any given level requires additional playthroughs of a certain amounts of the whole game
- Narrative is conserved
- Beaten levels are conquered, there's no level to play anymore
- The enemy can conquer you, and regain territory
Yeah, Super Mario Bros. 3 may gain additional frustration due to lost progress of Game Overs, but the game considered that. Not only are there checkpoints for lives, but checkpoints for Game Overs: defeating the middle castle in each world unlocks a shortcut that bypasses the first half of the world's levels.
Yeah, you'll have to replay levels, but you can't normally do that, and you may be able to find new secrets on this playthrough. You are also allowed to replay the areas that explicitly give powerups and lives to help you on your journey. You are given an opportunity to prepare yourself for the challenge you previously failed. And most important of all: levels are short, and if you've master the content you can get to the part you're bad at really quickly.
And, also, you're practicing for that part you failed. Earlier challenges of the game combine in interesting ways to make harder, later challenges in the game. Replaying earlier, easier content tightens skills necessary to beat the harder, later part.
So, lives have their good points and their bad points. A good game with lives highlights the good and mitigates the bad, and it can really add to the experience of the game.
High School Talk: Post-Mortem
09/04/14
So, it started off a little awkward. I was having trouble finding the right words to say. My little rough draft was clearly not enough for me to get a feel of what to say and let me improv it from there. I eventually asked for a question, and explained that I do better with discussions than general speeches. The principal obliged and it helped me greatly to move on from there.
I guess for a future talking endeavour, I'll practice having a conversation with myself about the topic. I'll start with the rough draft as I did with this talk, because I ended up saying most of the content on that draft in a different order with different words. I definitely think that thinking was very valuable. I might also keep a short outline of what I want to go through on hand during the talk, or maybe practice some sort of system that makes remembering where I want the conversation I'm having to go. Otherwise, it's quite likely I'll go on tangents (as I like to do).
I ended up bringing up a lot more specific resources than I originally planned, but I think that's good. Pointing out resources directly connected to what I'm talking about seems like it could be really useful for anyone interested.
I mentioned Duolingo and Xerocraft, specifically. And a bunch of books I found useful and interesting. A good number of people asked questions, and not all of them were teachers.
This talk was a success for what it was, but I'll need to get much better at this whole public speaking thing.
High School Talk: Rough Draft
09/03/14
Today I went to my old high school and gave a talk to the students there. Below is a rough draft I put together to think about what I wanted to say to them.
The principal thinks some of you need, and I think I quote, "A kick in the pants." She wants me to really drive home the point that you're in the driver's seat of your lives.
Which was something that really spoke to me as a subject, because lately I've been engrossed with agency. Which is exactly what the principal is talking about: the ability to act.
I have been out of college for two years, three months, and fourteen days. That time has been some of the biggest personal growth of my entire life. It wasn't because I had way more time after leaving school. In fact, I have much less free time after graduating than I had before.
When I graduated and entered the working world proper, that's when I finally decided to learn who I was. Well, "decided" is a misleading statement, I was forced to confront who I was.
I was disillusioned. I thought I'd come out of the academic environment a computer ninja, and be super competent at my job. I was not. I was passable; nothing more.
I thought the key to doing anything better was to try harder. To brute force it. Everything I did was easy, and I only ever did so little because I didn't care to do more. I thought if I resolved to learn or do something hard enough, it would get done. And yet I found myself browsing reddit when I wanted to improve my C++.
People aren't static creatures. Sometimes it feels I switch between completely different people. And different people want different things.
I find myself really angry at past me a lot, and I've come to conceptualize him as a different person. But lately, that's happening less and less. That's because over the last 2 years, 3 months, and 14 days I finally did all those things I was told over and over to do: time management.
But what that has really entailed is learning who I am. How can I convince myself to do this, and how can I convince myself not to do that? That's what time management really is, choosing to do something instead of all other things at properly determined times.
This is a lot harder than you think it would be, and right now you've been given the perfect environment to master it. You got your library setting, a work-at-your-own-pace setup, and teachers whom would love to impart advice and wisdom on how to do things, both in and outside school work.
I do a lot of weird things to see what keeps me in a productive state of mind. Stuff you may think isn't related to being productive. For a little while, I would clock-out in the middle of the work-day and go for a run or go to the gym. This wasn't just to get fit, though that was a nice benefit. I found exercise cleared my head and put me back at max productivity.
I think I would've benefitted greatly from trying to figure this out when I was a student here in highschool. Challenge yourself. Both with work you're obligated to do and work you want to do. See how you do. Analyze what you do wrong, analyze the habits that emerge that you don't like, and strategize how to do better next time.
Learning Languages
09/02/14
I want to learn a lot languages.
- C++
- Javascript
- Haskell
- wait wait wait
I mean the other kind of languages. I mean, I want to learn programming languages, too, but I've always regretted being monolingual. There are also three particular languages I want to learn, specifically.
- Spanish
- Ukrainian
- Japanese
Spanish because my girlfriend is native-fluent in Spanish. Ukrainian because it's my grandmother's mother tongue. I was, in fact, quite angry with my father for not teaching me Ukrainian as I grew up.
"I didn't know enough to teach you."
You knew enough to keep up a conversation with Babuska!
I'm sorry, I shouldn't have an argument with my dad in front of you, Stephan.
Anyways... where was I?
Languages and why I want to learn them. That's right. Japanese is the second language class I took in high school, and I took an additional year in college. I was really into anime in my teenage years, and that was basically the only reason I wanted to learn Japanese.
I want to continue learning Japanese for two reasons:
- I am a completionist (sometimes)
- Japanese is a freaking cool language
So, this want has been there for a while. For all three languages. But two days ago I started doing something about it. I resolved to devote at least 10 minutes to Spanish and 10 minutes to Japanese each day for the forseeable future. Today I add Ukrainian.
Resources for Study
For about two years now, I've sporadically ruminated over using Duolingo to learn Spanish. I first heard about it from this TED talk from a mind behind reCAPTCHA. At the time, I believe they only offered three languages (Spanish and two others [maybe German and French?]).
Rosse mentioned it the other day and so my bilingual journey began again. I noticed it offered Ukrainian and after a couple days thought, I decided to go for that as well as Spanish.
Unfortunately, they do not yet offer Japanese for English speakers. So, I will build my own study tools for that language. I already have some textbooks and audio CDs I remember being pretty good, and some light research (only 10 minutes per day, remember) has revealed that Mnemosyne may be a good digital flashcard system to build Japanese vocabulary and kanji (one of the Japanese alphabets) knowledge.
I'm excited to finally start studying languages again.
Site: My Tornado Nginx Conf
09/01/14
So, yesterday I tried to grok the example tornado configuration for nginx I found online. Today, I altered the configuration file to my needs, tried it out, failed, and then altered it until it worked.
Hmmm.... I think maybe I should put this in a github repo. Better linkage to the different files and stuff then.
Give me a second....
So, this is my updated version of the configuration file. I've set auto_processes to 1 and whittled down the upstream frontend servers down to the one I think I need.
I symbolically linked this file in the sites-enabled area and attempted to restart nginx.
Restarting nginx: nginx: [emerg] unknown directive "worker_processes" in /etc/nginx/sites-enabled/tornado:1
nginx: configuration file /etc/nginx/nginx.conf test failed
Eh?
I'm redefining stuff defined in /etc/nginx/nginx.conf. Most of this whole configuration is already setup for me in that one, actually. Also, if you look closely at my configuration, I didn't actually name paths for the mime types and stuff like that. So, I whittled my configuration file down to this.
Success!
Check out my tornado site here. Isn't it super amazing, Stephan?
Site: Nginx Config for Tornado
08/31/14
Okay, as stated previously, there is a configuration for plugging a tornado server into nginx. The goal of this post is to translate that magic into something I understand, and alter it according to my needs. Another post will just have the end result and explain what it does without the extra linkage to documentation and forum posts that I will inevitably post here. This is how I learned it, the next post will simply be how to do it while gaining a minimal understanding.
So, I'm going to go through it line by line, figure out what's going on, and present alterations for my needs.
Okay, line one:
Googling "worker_processes nginx" led me here. So, it defines the number of worker processes. Why 2 for tornado? I don't know. The documentation says the value "auto" will try to autodetect will try to autodetect a good number (equal to the number of available CPU cores). That's good enough for me right now. (Though, I guess setting it to one would also be good enough for me right now.)
Self-explanatory, I think, but might as well check the documentation. Yeah, sets a log file for errors. Though, it seems there's lots of flexibility in error setup here. Something to learn about more deeply at a much later date, maybe. Should be fine to leave as is for now.
Defines a file that will store the process ID of the main process. Should be fine to leave as is.
worker_connections 1024;
use epoll;
}
"Provides the configuration file context in which the directives that affect connection processing are specified." Uh.... Wat? Okay, the documentation isn't cutting it here.
Okay, here's a beginner's guide to nginx. Let me read that for you.
Reading....
Reading....
Oh, yes, hmmmm, interesting.
Reading....
I think I get it. Where were we?
worker_connections 1024;
use epoll;
}
Right, right. This kinda defines connection processing settings. So, 1024 connections per worker, and using epoll, an efficient connection processing method used on Linux 2.6+.
Next:
Http directive. Where server connection rules will be defined
Using unicode.
upstream frontends {
server 127.0.0.1:8000;
server 127.0.0.1:8001;
server 127.0.0.1:8002;
server 127.0.0.1:8003;
;}
This was one of the main things really confusing me before. It's basically saying, "These are a bunch of proxy servers to use." Nginx will be the middleman sending and retrieving messages from user to proxy server (in this case, tornado) and vice versa.
I probably won't use this bit of code for my setup. I don't think I'll need multiple proxy servers anytime soon.
default_type application/octet-stream;
Okay, that include is linking to a table mapping filename extensions to MIME types of responses. This is setting up the proper communication channels to tell a user's browser how to deal with content that your site delivers. The default_type command sets any content of unknown MIME type to application/octet-stream.
Fun bit of wikipedia trivia: MIME stands for "Multipurpose Internet Mail Extensions", a specification used to compose non-ASCII parts of email messages. Also known as a Content-type.
Access log. So, like, log of activity of access to server from users, I'm guessing.
proxy_read_timeout 200;
Timeout stuff. You know, when you try to connect to a server for a bit and then it eventually gives up. This might be related to that.
Enabling sending of files.
Allows sending of file header and beginning of file in one packet, and/or sending a file in full packets.
Affects behaivior on processes that transition into the keep-alive state.
gzip_min_length 1000;
gzip_proxied any;
gzip_types text/plain text/css text/xml
application/x-javascript application/xml
application/atom+xml text/javascript;
Compression file handling setup.
# error, not a timeout on the Tornado server
# (to avoid propagating "queries of death" to
# all frontends)
proxy_next_upstream error;
This part is already documented. Awesome.
The directive where we define location rules for content delivery and stuff.
Listen on port 80 for incoming traffic (from the user).
root /path/to/app;
if ($query_string) {
expires max;
}
}
So, in Tornado, it's standard practice to keep your static HTML files in a local directory "static". But nginx is perfectly capable of serving static content to the user, so this setup is having nginx do just that. That "^~" is saying "do not use regular expressions to find content that should be found under the /static/ prefix".
That if block is telling any browser that hasn't gotten the content already that it can cache it for the forseeable future (static data need not be refetched or anything).
Okay, we're getting into the meat here. This is what sends stuff to the Tornado server. This is saying anything trying to access the root site or anything beyond not matching static should go through this location block.
Let's the proxied server pass the Server header through nginx to the client.
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
Header setting configurations.
Use an available server that we defined in the upstream frontent block directive above.
}
}
End location block, server block, and http block. End file.
Whew! That was a lot more taxing than I thought it'd be! But I feel I learned a lot tackling it this way, and maybe someone else will find this little bit of writing useful.
Next site update blog post will be my version of this configuration file, where I made changes and why.
Site: Tornado Preparations
08/30/14
So, I'm trying to setup a tornado server that replaces the static HTML pages I have representing my site. I want it to run right alongside Rosse's blog on this server.
That means I need to mess around with nginx configurations so that I can point the site to the running tornado server. As I have mentioned before, there are configurations for doing just that.
The problem?
That's not a tutorial as I implied it was in a previous post. It's just a configuration file. Which features some magic I frankly don't understand. Now, I could tweak it until it sorta works, but I'd rather understand what I'm doing rather than get the right answer (that's for you Stephan).
I was hoping some further Googling would just explain that configuration file for me and I could have a reference that makes doing exactly what I want to do really easy and something I understand. Unfortunately, the Internet isn't always so nice.
But for future people who feel the same way as I do, it will be.
I will explain that configuration file line for line, and what I changed where and why to fit my simple site with its simple needs.
Coming soon!
Nightmare
08/29/14
I haven't had a nightmare in a really long time. I mean, I've had creepy or scary dreams fairly recently, but I did not consider them nightmares.
I think... I think I might've been a bender. Oh, speaking of bending, Legend of Korra is awesome and if there are people who read this blog that aren't Stephan (or Rosse), and you haven't heard of Korra, you should be watching Korra.
But I'm getting distracted and the dream has already faded so much. I had a group of really badass friends. I don't really remember them at all. I was also a completely different person. For some reason, I got in trouble with the local government, and gave myself up willingly.
And then there's some kind of time-jump, and I'm in prison, being visited by my badass friends. We're going on some sort of tour of the prison, which wasn't too horrible feeling or anything. At some point, a friend said something weird, and I told him that it was dangerous to say that.
It was at this point that I found that I had walked right out of the prison and the door slammed shut and locked behind me. My friends had been trapped inside. I remember thinking something along the lines of being bait, feeling really horrible, and then I woke up, feeling really horrible.
I'm actually pretty shaken up about this, even though I can barely remember anything about the dream. Faces, personalities, history, all I really got is a generic setting... kind of. There's something incredibly terrifying about being free, unable to save or help my friends whom I inadvertenly trapped in a fate I thought was mine alone.
Game: Component First Steps
08/29/14
I've attempted to make a component system before. I didn't know what I was doing nor did I know what I needed the component system to do. A lack of focus on what I needed now hurt the design, I think. A lack of experience makes knowing what I'll need somewhat far in the future impossible.
Hopefully, this time it's different. One, I've read up a bit more on components, and I can use that reading material as reference now. Further, I'm going to be focusing on refactoring my code as it is now (the game should play the same as before), and the goal is to simply the codebase and make it easier to change and understand.
I'm going to mostly be modifying the Player class found in player.cpp. After this edit, it probably shouldn't be called "Player" anymore, as the content that makes it the player should be decoupled out and put into a controller component. "GameObject"? Hmmm... I'll figure it out.
Currently, the player is made up of these separatable pieces:
- Sprite rendered
- Mouse input event logic
- Physics update (gravity and collision detection)
Some stuff that can stay in the player class:
- x position
- y position
- x velocity
- y velocity
- width
- height
Width and height aren't in there yet, but I feel pretty confident that anything in the game that I would call a "game object" would have those. Some things won't ever have a velocity other than zero, but explicitly stating they don't move is perhaps still useful.
But other than those things, I don't think much more should be stuffed into the class. There's going to be various things that cause acceleration, but it'll be good to encapsulate those things elsewhere. Gravity won't affect all things, and the same goes for wind or what-have-you.
So, the separate components will be:
- Code that renders game object-related stuffs
- Code that sends user-input to the right code
- Code that executes jumping actions (sets velocity)
- Code that enforces gravity on a game-object
Hmmm.... Thinking about how I'm going to do this introduces some... difficulties. Gravity and jumping must be coupled. The way I'm doing jumping will set a Vx and Vy based on the clicked location and the gravity. The logic will set the clicked point along the arc that the user clicked on.
Should there, perhaps, be a component hierarchy? Should components contain their own components? I mean, anything that jumps must be coupled to gravity, but not all things connected to gravity will jump.
Hmmm....
- Gravity
- Jumping
- Something that triggers jumping
- Controller input tied to something that triggers jumping
- Something that triggers jumping
- Jumping
Argh! I don't like it. I could setup an event system. A change in gravity sends out an event that tells jumping what's up. Yeah, that's considerably better, but now I'm adding significant complexity.
What's a simple next step that would slowly lead to the infrastructure I need?
Site Now on Nginx
08/29/14
When I first setup this site for blogging purposes, it was for Rosse's blog, Ramblings of Self Improvement. I decided to setup a wordpress blog for her and as such I followed the instructions here for doing just that.
Those instructions assumed you wanted to use an apache server configuration. I didn't know what I wanted to use, or even that I could have wordpress running with a non-apache setup. Now, I know just a little better, because I plan on eventually having my site and blog running with a tornado backend.
As far as I can tell, it turns out I can't just plug tornado into the apache setup somewhere. There are, however, tutorials for doing exactly that with nginx. I could even plug apache into nginx if I understand it correctly. Though I honestly don't know why I would want to do that (I'm still pretty new to all this server magic).
Anyways, switching over was all pretty straight-forward, actually, except for a "Bad Gateway 502" error that took more googling than I would have liked (more on that below).
The Switch
First, there was the necessary googling. It got me to this tutorial for switching a wordpress blog from apahe to nginx.
I installed nginx (though I might've been told it was already installed):
Then I installed php5-fpm (definitely wasn't installed):
Then I went to /etc/php5/fpm/pool.d/www.conf and switched:
To:
And then I went to /etc/nginx/sites-available/. I copied the default file into a ramblingsofselfimprovement and uncommented the already provided php regex server code. I added a symbolic link to ramblingsofselfimprovement to the sites-enabled directory. I also switched:
To:
And:
To:
Then I switched off apache and turned on nginx
And... "Bad Gateway 502". What? Why?
I quickly made another copy of the default file into a ksionda file (for my site). Setting all the variables and directories for my site instead of Rosse's wordpress site.
My site came up fine. I reasoned it must be the php5-fpm setup (as wordpress uses php stuff, and my site doesn't). So I googled for a bit and got a lot of different solutions to my problem, until eventually I found one that worked for me.
In /etc/php5/fpm/pool.d/www.conf I switched:
;listen.group = www-data
;listen.mode = 0660
To:
listen.group = www-data
listen.mode = 0660
Restarted php5-fpm, and everything worked fine and dandy.
Nothing looks or works differently, making this a refactoring, but now I can start morphing my site into something that runs on Tornado, which will hopefully lead to some fun learning on my end, and a site with better features and stuff (though that's a secondary goal).
Game: Makefile
08/24/14
I currently have a Makefile I use to compile my game. I don't like how it's setup anymore. You can see it's current state here. It's a hacked together file that is already becoming cumbersome to change. Pretty soon I think I'm going to want to split my files into multiple directories, and would like to hide the generated object (.o) files under a build directory.
Before I start working in a simple component system, I think cleaning up the Makefile makes sense. At the very least, less reused code and hiding all the object files under a build directory. Separating the code into multiple source directories might become necessary after developing the component system (who knows how many new C++ files might come of that).
Update 08/24/14
Makefile updated. C++ code is now hosted in a src directory and object files compiled into a build directory, as desired. Hopefully, I've updated the Makefile such that further granularity in the src file organization isn't too difficult to maintain.
Game: Placeholder Art
08/24/14
I have taken out the questionably legal art I was using.
Game: Current State and Goals
08/23/14
So, right now my game is split along six cpp files:
- main.cpp: where the main function is
- image.cpp: wrapper functions to SDL image library
- clock.cpp: for frames per second and clock related functionality
- game.cpp: where the game loop lives
- world.cpp: currently just holds and renders the background image
- player.cpp: Holds player sprite, and handles mouse click events
For the next commit, I'm going to focus on splitting the player into separate bits of functionality. Right now, the Player class knows about where it's image is, what an SDL_event is, what gravity in the area is, and so on and so forth.
I want more than just the player to have a sprite to render (including the background) without copy-pasting code and without it being another player object (world.cpp has copy-pasted render code right now).
Basically, I want to mutate towards a component system, I think. But I don't want to make the mistake I made with my pygame toy and build a whole bunch of extra functionality right out of the gate. I need to build something simple, the makes what I currently already have easier to manage and improve, but nothing more. I need to think ahead only for general direction, I should not do any extra coding in the hopes that it'll be useful later.
Anyways, above is what I currently have working so far. You may be thinking, "Wow, that's pretty good art."
....
Yeah, that's placeholder art. You should know that, because it's Samurai Jack and Samurai Jack is awesome. That's a fan-made Samurai Jack spirte. I used these without permission. I need to put proper sources in the repo at some point before I take the art out, so anyone going through the history will have access to them.
I'll do that right now. The sprite appears to have originated from a neoseeker forum. Image search finds no other results....
The background is straight-up background art from the Samurai Jack show.
I do not own nor am I responsible in creating any art in the game so far. And by tomorrow I'm going to replace it with basic art that I do have the right to use. (I'll cook something up in gimp.)
I'll make a commit sourcing the real artists and then I'll switch to homebrew placeholder art. Next steps found!
PS: I'll have posts that go in-depth on how I got to the currently state of the game. They'll be one commit at a time. There's 13 commits between the basic commits I already went over. Most of the posts will be short, I think.
Game: Roll Back
08/22/14
I forgot what I did, so let's ask git.
The 1st Commit
There's only one file in there. A README.md. An autogenerated file that I let github create. I have yet to alter it.
The 2nd Commit
I have a cpp directory now. In there, some wonderfully named files: mysource.cpp and Makefile. Making the Makefile creates an executable called myprogram. It inits SDL and then exits.
I'm taking this step-by-step process pretty seriously.
The 3rd Commit
Everything's mostly the same. Now myprogram has a blank screen pop up for a couple seconds.
The 4th Commit
Looks like I committed (heh, I made a pun) to C++. I've put the cpp files in the main directory and removed the old cpp directory.
The 5th Commit
Changed naming convention for various files. Things actually have names that make sense now!
The... Uhhh... How Much More is There?
It gets a bit more complicated per commit after that.... Eh, I'll go through it all tomorrow. Hopefully by the end of the day you'll be all caught up to how far I am so far, Stephan.
To be continued!
Game: Pygame Prototype
08/21/14
I've tried to make a wuxia-inspired game before.
Well, I've tried several times. I wrote a design document for it for a project proposal in the Game Development class I took (the team decided on another team member's idea). Freshly out of school, I attempted to make an engine that I would build this game on (don't do that). And then, about a year ago, I attempted to approximate the game idea step-by-step.
- Blank Screen that flickered on before program exited
- Blank Screen that lingered for a couple seconds
- Blank Screen that user can exit out of
- Rectangle drawn on screen that user can exit out of
- Arrow-key controlled rectangle on screen
- Click-controlled rectangle on screen
- Gravity on rectangle
- Rectangle stops falling below screen
- Mouse position creates arc that rectangle will jump along
- Platforms
- Collision detection fixes
- (Unfinished next step) Load in file from JSON
I abandoned it at that last step. Which was also a huge step that wasn't the right next step. In fact, a lot of the time I complicated the next step considerably by trying to optimize in some way.
Pre-optimization is a problem I constantly tackle with. "Don't optimzie until you profile" is a concept I'm familiar with, but I still get stuck following the rabit hole. I built a physics system that translated meters to pixels and vice versa (allowing y to increase upwards instead of down and giving things units that made more sense). This added a bunch of complexity and was not even close to necessary yet. I forced in a component system too early before really thinking deeply about what I was doing.
The component system worked, though it was riddled with order of operations issues. Amazingly, all the things I put in made things work, but their incorporation had consequences that I could've avoided if designed them differently later when they were properly needed.
Eventually the design made further development too much, and I accepted the need to abandon the code base. I left the repo on github as pygame_toy. It still works! Though you need to get pygame installed to run it.
It was more of a tech demo than anything else.
Still a great learning experience. I'm going to focus really hard on keeping things simple and thinking deeply about how my design is doing that (via decompling code, avoiding redundant code, etc.). I'm starting again in C++ with SDL, and I'm following a similar yet very different path than that of the pygame toy.
I'll tell you more about that next time, Stephan.
Game: The Beginning (Week One, I Guess)
08/20/14
So, how'd I finally get started on making a game that I've been thinking about for like 8 years (holy crap, 8 years?!?)? Well, actually, I've tried several times, not knowing what I was doing each time (doing a little better each time, at least).
Wow, I actually have a lot of backstory here.... Let's start somewhere interesting.
I was talking to a friend of mine. Should I say his name? I say your name all the time, Stephan, but I don't know, I kinda have your permission and Stephan a common name (actually, I know a few Stephan's, not even counting the Steven's and the Stefen).
I'm really distracted today.
Anyways, I gave my friend a random hello, and at some point I mentioned the idea of working on a game together, and we are. The end.
Well, I guess: the beginning.
We are currently doing doing weekly meetings where we talk about what we did the past week and what we plan to do the following week.
The first week we brainstormed ideas. My first idea was the idea I've thought about for years: a point-and-click platformer inspired by wuxia. Now, even though I've thought about this for a good 8 years, I've never really detailed much beyond that. Lots of abstract fantasizing.
Even with a lack of specifics, my friend liked the idea! So that's what we're first attempting. Yay! There's one specific thing I want to nail: a fight on water. This is inspired by a certain scene in Hero that I found so freaking cool when I first saw it.
So we were off, he'd do some art research and I'd do some programming research. And also dig out my old prototype attempting point-and-click mechanics.
To be continued....
Game Blogging Starts Now
08/19/14
Nine days! Nine days since I've updated the blog! But that entire time I was updating pretty regularly, I swear. Heck, I got a github streak of five days going. Which I'm letting die today, because I've already discussed that I'm not going for that now.
I think the blogging everyday is really good for me right now. It should be something I really strive for. If I haven't done anything lately to blog about, it lets me think deeply about what I want to do and how to go about it. If I do have things to blog about, I should make time to blog about what I've been doing on the day-to-day basis and what I'm trying to achieve.
Right now, I've been focusing pretty hard on the Untitled Wuxia Game Project (github link) which is has multiple purposes motivating it.
Which I'll elaborate more on starting tomorrow.
Sniper Game Idea
08/19/14
You know what would be cool? A true-to-life snipers-only game.
Actually, it would be slow and possibly boring. Hours/days staying hidden while hunting for another human being who's trying to stay hidden while they hunt you. It could be pretty suspenseful, but the majority of the time would be dull.
Currently, shooters solve this problem by controlling the setting such that finding and shooting your opponent is streamlined, and hiding is made more difficult. But perhaps we can make a sniper-based mechanic interesting without simplifying and streamlining the shooting.
How about instead we alter the resources available to the players.
The setting:
- One giant area
- Two well-camoflauged, opposing snipers
- Equipped with a sniper-rifle and a radio for communication with the each other
Why give the snipers radio communication with each other? It adds an entirely different dynamic to the game. A player will have a long period of time to talk with the other player about anything. And let's make it so this game only lets you play strangers. This could lead to mind games, where players try to coax information out of each to easier find and shoot their enemy, or it could lead to a broad conversation with someone that ends with one player killing the other, severing the connection forever.
Of course, there are problems with this idealized setup. Players wouldn't use dialog with an opponent purely in a friendly or game-focused manner. There'd be trolls, as well as generally toxic behaivior from people who should know better.
So, we need a good ban system. No punishment for ever ending the game, and the ban will tell the game what kind of game you're not interested in and what kind of game your opponent seems to be interested in.
What kind of games am I talking about? I think some naturally emergent meta-game would include:
- Just play the game
- Silently
- With dialog mind-games
- General conversation
- Romance-oriented and/or sexist BS
- Insult-oriented (aka troll behaivior)
I'm sure it can be more varied and more specific than the above, but it's a good quick hypothesis. So, to solve the problem, games can be ended at any point by either party, and they just state the reason(s) they ended the game (and the other player will not be aware of this decision).
This serves two purposes:
- The unsatisfied user is incentivized to tell the game what they don't want out of the game as soon as they become unsatisfied
- The game learns more about what users perceive the other user is trying to get out of the game
The game can get the information it needs to match-make the user to an ideal game. As such, I don't think there should be any penalty for ending a game. Important to incentivize ending unfun games to help game find the enjoyable experience.
But that can easily be abused. Trolls could of course immediately end a game for superfluous reasons. The match-making system would definitely need a lot of work. But let's get back to what I'm trying to do.
So, players could talk to each other. Players are strangers to each other, though, that's necessary. It's part of the illusion of fighting an enemy sniper (I would assume that usually they are strangers to each other). But where we break the simulation hopefully allows interesting things to the dynamic.
I would assume (or perhaps hope) that most players are interested in light-hearted conversation. And now, that enemy you're hunting down is a human being. Someone whom you're only interacting with through a competition that ends with neither of you able to talk to each other again.
Well, unless the players share contact info before ending the game....
Let's add a fourth end condition (the three so far: quitting for conflict of interests, shooting enemy player, getting shot by enemy player): friendship. An in-game way of sharing contact information which ends the game with neither party killing the other.
Here's how it works:
- One of the players activates the friendship option
- Their location is revealed to the other player
- The other player
- can easily kill the friendship player
- can also activate his friendship option
- They travel to each other
- The game ends with them shaking hands
- Friendships and stuff can be established in-game
Now, if the players want to share contact info, there's an in-game option that adds an illusionary vulnerability. This would hopefully incentivize against just telling each other contact info, and also allows a non-violent resolution to the game (a rare option in shooters).
Perhaps this idea allows some means of the player to consider the actual horror of what's going on with real sniper battles, and they will take the opportunity/risk of befriending an enemy instead of killing them.
But I suppose the game actually needs incentive to distrust and/or kill the other player. Now, the incentive doesn't need to be high, as the fact that it's all not real will lead many people to reasonably not care that they are simulating something that in reality is horrifying (which is perfectly reasonable, I think). Just a small push, to maybe make the friending a special event....
Got it.
If the game makes it to the end, and it ends with one player killing the other, then it is added to a win/loss record. Stupid reasons to sever a connection to a real human being instead of befriending them.
I like it.
Added to Someday/Maybe
Making Priorities
08/10/14
There are some things, long-term projects, I am planning to work on that I need to make actually priorities for.
Specifically, the things I want to make priorities for are:
- Untitled Wuxia Game Project
- Website improvements (mostly behind-the-scenes sorta stuff)
- Super Smash Bros. Melee competitive ability improvements
- Learning to draw
- Video game history knowledge development
Ordered by how much I really want it (though game-making and website should maybe be switched).
Making a game has been on my mind for a really long time. I started trying to actually make a game in my spare time shortly after graduating, but my inability to do anything productive and my lack of experience made it all pretty difficult. I'm slowly building a skillset of both general productive ability and game-development knowledge that puts making an actual game into the realm of possibility. To the extent that I actually have a webpage setup for that.
This website is becoming the place I organize my thoughts and general plans. It is becoming the tool I use to get things done, and as such I need to practice iterating on it. I need to make the tool better, to become more efficient and to decrease any resistance I have in using the tool. It's also a chance to practice some web programming, which I'm currently not doing at all. This site is static HTML with some bare-bones CSS. That needs to change.
Super Smash Bros. Melee competitive skill improvements is a little silly, but it's a chance to work on various tool creation skills to improve literal skills. It's something to deliberately develop Deliberate Practice routines with.
Learning how to draw is something I've always wanted to do. Drawing on the Right Side of the Brain has been pretty good so far and seems like a good set of exercises on the way to capable drawing. This is slow going, but I got a setup at home ready for whenever I got a little time to do an exercise or read a chapter.
History is something I need to know more of. Game history is something I can start with, as I clearly got an inherent interest in the subject. There's going to be tedious content to deal with here, and a lot of misrepresentation of the past that I need to sift through, like history in general. Knowing history is really useful for predicting the consequences of future choices. Games are a playful place to build that ability.
Opening Up
08/07/14
Sometimes I imagine myself fighting for the world. You know, helping those in poverty. Helping the environment. Sticking it to the billionaires and those with more than they deserve. It's a satisfying fantasy, you know?
I'm not an emotional person. Not much. It's not that I hide them, I don't think. Though I used to, when they first started bubbling out of me. Well, I used them to get my way as a small child, but that was beat out of me really fast. Then I would fight them as hard as I could, which often led to my older siblings and certain others coaxing them out of me. But that was me being emotional over selfish things, really.
I often lacked empathy as a child. I didn't understand people. I could fake it pretty well, but there was a smugness to it. Like, I offered to take my sister's punishment for something, and my sister was not grateful, because she could tell I was doing it for appearances. I was five then.
I was antisocial as a kid. A classic introvert (I think). I kept my number of friends pretty small. I stayed pretty attached to just one person at a time for long periods of time. I would lose touch with everyone else as time went on. I would lose touch with that one friend after moving onto another. I guess I was a "best friend" kind of person, looking back on it.
I hated noise. It grated me so much. The sound of my shoes skidding along the floor annoyed me so much it conditioned me to not drag my feet. My first day of 4th grade, I asked the teacher if it was really okay for the class to be so loud. He inferred that in Canada (where I moved from), the classrooms were much quieter.
They were not. They still aren't, as far as I'm aware.
I grew insufferable. People were stupid. Most, anyways. I knew everything. I assumed everyone thought how I thought, and that when people made decisions different than how I would that they either knew less than me or more (I usually assumed less). There were not differences of opinion, someone knew more and someone knew less.
I hated to lose. I really hated to lose. I hated anything other than winning the way I wanted to win. Being infereior was unacceptable. Being equal was unacceptable. Imperfection was unacceptable. 105% on a test wasn't good enough, I argued with the teacher that it should be 110%. I stalemated a classmate in chess and I spent a good five minutes literally kicking and screaming on the floor. I was fifteen then.
The path to a more humble and caring me has been incredibly gradual. It started around when I was fifteen and is still ongoing to this day....
It seems I've run out of emotional steam....
To be continued....
Vim HTML Setup
08/06/14
This post is a long time coming.. I've been putting it off for no good reason because it shouldn't take that long to write or do the changes to my vimrc setup.
Okay, the problem: I want tab to represent two spaces for HTML files (and various other files but the main concern for now is HTML). Currently, I have it set such that tab is 4 spaces. This creates a couple tiny annoyances when I'm actually writing HTML documents the way I want them written (with each nested item indented two-spaces).
- Backspace has a 50/50 chance of going back 4 spaces or going back 1 space
- Tab goes forward 4 spaces 50% of the time, so I often TAB BACKSPACE SPACE SPACE to indent how I want to
So, let's make it so that for *.html documents, tab is 2 spaces so these problems go away.
So, make a ~/.vim/ftplugins/html.vim and put in my desired html-specific settings.
setlocal softtabstop=2
setlocal shiftwidth=2
And now it is no longer annoying to TAB when writting in HTML. I just need to fix my habit of using the spacebar instead of tab when writing in HTML now.
Yay.
Getting Things Done... Done... Again
08/05/14
I am done with Getting Things Done again. As I've mentioned previously, I had already read the book back in October 2013. It was recommended to me at the end of September and I bought it and read it pretty much right away.
Though, I did put off reading it a bit to finish reading So Good They Can't Ignore You, so I didn't get right to it. It's funny the author of SGTCIY had some criticisms of GTD which I found interesting (though, I I remember your note of how his criticisms seemed rather anecdotal, Stephan).
But anyways, at the end of GTD there is a recommendation to reread the book in 3-6 months, because of course you'll miss some stuff the first time through for various reasons. "It'll be like reading a whole new book," was basically what the end of the book said.
So, almost a year later I managed to read through it again, and I have to say it was a worthwhile action. The first time through, I set up the basic day-to-day stuff like a tickler and boiling things down into the next actionable item, which were incredible boons to my productivity. And then I organized those things further with time-blocking and stuff like that.
While I built up the line-of-sight infrastructure, I tried and failed to setup bigger-picture orgranizational stuffs. Eventually, I just stopped thinking about the bigger picture stuff, and without it I didn't have a well of well-defined actions to regularly pull from. I had such a large well of things to do during my first read through that its inability to replenish itself properly did not reveal itself for months.
But on the second read through, the basic fundamentals for line-of-sight were already in place. It was actually humerous, at one point in particular it told me to think of the very next physical action and note how much it improves my motivation. It didn't affect me at all, as the habit had been ingrained.
With basic fundamentals, now the parts on project tracking and the like jumped out as more doable. And now I'm refactoring my whole organizational setup to integrate this next level of planning.
Which feels right.
When I first read GTD back in October, it wasn't until Febuary of this year that things really clicked and that month or so was super amazing. I wonder if I can expect a similar experience with this second iteration.
Maybe not, there was a lot of things that started going right then, and I can't credit just my personal organization as the main cause.
We'll see.
Anyways, if you have trouble getting things done, I quite recommend reading Getting Things Done. I even recommend reading it more than once. I'll probably read it again sometime next year.
Next up: A Pattern Language. I'm only 60 pages in or so (it's a bit over a thousand pages long), but I'm already enjoying it immensely.
I think I'll attempt to blog through this one a bit at a time while reading it.
Projects Page Up
07/31/14
So, the distraction post got me inspired to work on my Projects page. I'm goign to go by the Getting Things done definition of a project and as "any planned thing that takes more than one physical action to complete". I plan to add to the projects page as they come to me. I'll probably also add some Github projects in there.
I'm still iterating on the best way to organize it all and such, but as it stands I'm pretty excited about projects list on my website. Everywhere else I tried to track projects just didn't feel right for some reason. I might also start putting "next actions" lists in general up on the webpage instead of stored away on the server.
We'll see.
I had posted previously on my organizational infrastructure. I spoke of another revamp to my system at the end of that post. That revamp is happening now with the use of this site. Interestingly enough, it involves relaxing the rigidity of my time-blocking methodology while improving how well I keep track of everything I want to do.
I might be going too lax on the time-blocking now, but I guess that's the PID-control in action. I'll find a happy medium, I'm sure. Right now, I think focusing on properly documenting everything I want to do will unlock a lot of productivity for me.
That's my goal for now.
Distraction Mitigation Strategy
07/28/14
The History
So, I'm easily distracted. Places like reddit are huge parasites to my time-management. I'd like to think of it as though there were two me's. There's productive me: he wants to accomplish things, probably wants more that can be achieved even if perfectly strived for, he also wants to prove himself and just be better; better than other people and better than his current self.
Then there's lazy me. Lazy me cares only about the least resistive path to enjoyment. There are various things that hinder his enjoyment: losing, being wrong, repitiveness, pointlessness, difficulty, tedium.
Some of these hinderances are quite useful, being competitive can keep me focused on tasks I find important, and disliking being wrong can help me correct myself. Sometimes, the dislikes conflict with each other, as my dislike of losing can interfere with my dislike of beging wrong (e.g. in an argument with someone), and this can lead to behaivior that hurts relationships and/or fail to make me a better person.
The worst thing, though, is how all of these dislikes can easily be circumvented, such that lazy me acts in a way that productive me later regrets completely. For instance, reading in general can't be something I lose at, that I'm particularly wrong about. There's enough content on the Internet to never feel repetitive or tedious. There's also so much content on the Internet that I can always pick something easy to do that's just as enjoyable as something difficult that actually creates something productive me cares about. And much of the content consumable online is intrinsically enjoyable, and thus never feels pointless.
You see why reddit can be such an effective parasite here? It makes the Internet, already a capable distraction, even more effective at distracting me from things I want to do for reasons beyond mere enjoyment.
I realized this problem a long time ago. I never tried doing anything about it until around October of 2013. It was then I took my distractions seriously. Up until then, I thought I could develop a discipline to simply stop visiting these sites, to focus on what I wanted to focus on, but I realized that brute force of will often isn't an actual solution to an actual problem. At least, not an actual problem with your internal self (plenty of problems that arise externally to you could perhaps be solved with willpower). But if an internal problem could be solved with willpower, than was it ever really a problem?
Anyways, October 2013. That's when I decided to attempt to use some actual tools to help mitigate my distractions. Enter LeechBlock (for Firefox) and StayFocused (for Chrome). And these together worked really well!
....
For a while, at least. Turning them off was too easy, and StayFocused gave me a minimum of 1-minute on any distraction site per day. 1 minute isn't a lot, but it's enough to convince me I want more, and go through the trouble of turning off LeechBlock or StayFocused for the day, often ruining my productivity for the day.
But both blockers have the option of making them un-modifiable once lockdown goes into effect. Which worked pretty well somedays and not-so-well some others. Eventually, though, it clicked into place, and I properly avoided the time-wasters for a long period of time. I didn't read webcomics at all for over a month, I think.
What happened, I think, is that I successfully switched habits, from reading various unfocused nonsense online to distracting myself with something that would eventually inspire me to get back to work in a high-functioning state. It was a great, virtuous cycle.
That I somehow lost recently. I'm back to comics and reddit and other stuff with a low-probability of long-term payoff (I think). So, now, I'm trying to wein myself on the higher-productivity distractions quicker and with less trial-and-error.
The Plan
StayFocused doesn't work for my purposes. One minute is a minute too many. SiteBlock works much better for my purposes. It immediately blocks a site, and provides custom redirection for blocked sites. It's a close approximation to LeechBlock on Firefox.
As you may know, Stephan, I actually have a website (found here), and on this site I could put some sort of webpage designed to intercept my path to distraction to something that'll bring me back to a stronger focus than before. Well, I guess there will be two: one for home and one for work.
On these pages will be reminders of things I want to do, ideas on what to do, and some questions about my state of mind to consider to best choose a next action. For now, it'll be a static HTML page, like everything else round these parts, but perhaps in the future I'll make it considerably more dynamic and engaging.
QuakeCon: Day 0 (Wednesday)
07/28/14
Do you know what I think of when I think of travelling from Dallas to Tucson? Seeing the ocean.
....
Wait, wait, wait. We went over this already, in the future. This day was very much like my trip home, only backwards.
I got to read plenty of Getting Things Done while on planes, while waiting for planes, while waiting in line. I've almost finished it, now. I planned on finishing it on the trip home, but I was more focused on sleeping.
Oh, yeah, also, the line. When I finally got to Dallas, I needed to check my computer in. I was lucky, pre-registration was still open, and I wouldn't have to wait until the next morning to get my computer through. I had to wait a mere hour and a half to get my computer checked into the BYOC (bring your own computer) area. This was in a line that spanned a single room. The next morning, the line spanned a good fraction of the huge Hilton Hotel....
My friend jokingly referred to QuakeCon as LineCon months ago or so, now I know why. Though, this was my first convention, and I've heard stories about other conventions... is every convention LineCon?
QuakeCon: Day 1 (Thursday)
07/25/14
I woke up bright and early at 9 a.m. on this, the first day of my first QuakeCon (to be fair I was up until 2:30 a.m. waiting in line to get my computer into the LAN area).
And to be honest I don't remember much before the doom event. It's all a blur. I hooked up the computer, I drank some Bawls, I played some Counterstrike. Some trolls got on my case that I was a brony. Accused me of some pretty terrible fetishes for ponies. I played some Smash. I got the rocket-find malware on my computer (which I've mostly scrubbed clean out shortly there-after). I bought and downloaded Dark Souls 2. I played a tiny bit of it (I'll make time later for it, I swear!).
Overall, a blur of fun and awesomeness. And after the Doom demo, a friend and I went to the top floor and enjoyed a nice steak dinner.
A good start to a good experience.
QuakeCon: Doom Live Demo Impressions
07/25/14
The first event on the first day of QuakeCon featured a "live" demo of Doom (considering I don't have access to video of the person playing the demo up-close, I remain healthily skeptical that the demo was done live and not properly scripted). There was lots of cheering and perhaps some weeping during this demo. People were happy. People were really freaking happy.
There was an implied apology about the direction id Software took Doom 3, and there was a promise of going back to Doom's roots. That's why this game is called Doom, not Doom 4. It's going to be faster, it's going to be about "running and gunning" (as opposed to the cover-based obession of today's shooters).
It seemed like everyone in the audience was excited. Some of my friends were excited. Everyone watched the demo. Everyone was excited.
Except me.
I was not excited. I was not impressed. Don't get me wrong, there was a lot of cool stuff shown off, but then there was the gorn that was there just for gorn's sake. I mean, it's Doom, there should be glibs, and there should be blood, and the violence should be super mega ultra violent. But that violent should be dressing, it should complement the fast and crazy action mechanics. It should not interupt that fast and crazy action to show you a prerendered kill move that takes momentary control away from the player (complete with temporary invincibility to make up for that lack of control).
That's the main thing I saw. When any given enemy was properly weakened from the running and gunning, the player could run up to them and perform a scripted kill-move. To be fair, there seemed to be a lot of them per enemy, and between enemies they were different as well. But still, even with the variety, I saw plenty repeated, and even kill moves as short as a second really felt like they slowed down the game.
And I really don't understand why such scripted moments exist in this day and age. Some of the kills that happened purely by shooting the enemies to death were much more entertaining. Demons were shot in half and collapsed to the ground in amazing ways. And that's emergent behaivior based on their physics and model destruction engine. That sort of kill mechanic churn out many more interesting kills than the limited ones they decided to animate statically.
And those kills don't slow down the combat. It's win-win. But instead it looks like a lot of money was invested in the scripted, pseduo quick-time-events. And if that much money was put into it, I remain skeptical at how avoidable using them are (though, in the demo, nothing suggested that they were required).
I suspect all bosses will require an ending using a special kill, and if I'm correct that's a real shame. I have played games like that, and I vastly prefer a more subtle ending to boss fights, that at least don't force all players to have the same experience out of the end of each fight.
So, to give an impression that I feel no one else in the QuakeCon audience will give: the next Doom is definitely a step in the right direction, but I can already tell it has some issues.
QuakeCon: Day 2 (Friday)
07/24/14
The middle day of QuakeCon (inconsistent capitalization on my part there). I played Counter-Strike and some Super Meat Boy before the great adventure for booze began.
I don't drink very often, but I decided early on this Friday to drink a lot. The only thing I can drink a lot of without getting a horrible head ache is vodka. So, I joined my friends on their quest for booze, my goal being to get vodka.
I'm not really sure if this is normal, but there was only ever wine and beer in most of the places we looked (Walgreens, Walmart). Eventually we found a general liquor store and got the variety of spirits we desired.
The great adventure for booze had a purpose. We were going to see Master Pancake that night for the day's QuakeCon event. They are a comedy troupe that makes fun of bad movies for their routine. For this show, they made fun of Labyrinth.
It was amazing. Probably helped that I had already drank half a flask of vodka by the time everyone was seated.
What followed afterwards was awesome at the time, but I felt guilty thinking back to it. I probably should've stopped drinking at half a flask. I stopped drinking closer to two fully-filled flasks in. (In my defense, this was like my sixth time ever really drinking, and I had lost a lot of weight, so I didn't know my limit at all).
I was falling all over myself and my very intelligent and much less drunk friends decided I should go to bed. They carried me out of the QuakeCon area, much to my protests, and then down the hall. I was telling them how they were being really good friends, and how it was interesting that how being drunk didn't stop me from thinking rationally, it just made it easier to dismiss rational thoughts. I told them that the first chance I got, I would run away....
And then one of them tripped, and I sprinted full speed back to the computer area of QuakeCon. That's another weird thing, I couldn't stand still or walk normally without losing my balance and slow collapsing to the floor, but I could run just fine. They freaked out. I was having a blast. I temporarily went back to my computer, told the crowd of Melee players that I ran away, and then I went to hide amongst the other people in QuakeCon.
The room was huge, and I spent a good hour just walking between computers and watching people play games. I walked past the large castle of empty Bawls cans, I watched someone play FTL for a bit, and I stopped by some random woman and told her the story of how my friends tried to take me to the hotel room. Eventually, I made my way back to my area, and joined in on the Super Smash Bros. Melee play.
Eventually, my friends who were looking for me found me back at my station, and yelled, quite reasoanbly, "What the ^@$!" They had been looking for me the whole hour; they thought for sure I had gotten into horrible trouble.
It was at this point I started to realize that what I was doing was both probably dangerous, and if not dangerous, would at least make a lot of people uncomfortable. Here I was, a person so drunk that his friends thought it smart for me to go to bed. All those people I was watching play games, maybe they weren't laughing because it was funny... maybe I was making them nervous and they were humoring me.
It makes the memories a lot less fun to relive, but not a complete waste, at least. I will simply make sure next time to drink much less. It was a lot of fun, still, but it's important not to spoil anyone else's fun if I can help it.
QuakeCon: Day 3 (Saturday)
07/23/14
The final real day of quakecon. I played League of Legends, Counter-Strike, and Super Meat Boy. The event of the day was some end-of-tournament matchups featuring Bawls chugging, Quake 1v1, and Quake CTF (capture the flag).
I was overloaded this day. I was recovering from the previous day, and the constant noise and people drained what little energy for people remained in my introvert self. I absconded from the event and focused on single-player Super Meat Boy until it was time to pack up.
Super Meat Boy is a lot of fun. People say it's hard, but it's designed such that death is not much of a punishment. Levels are short, how you died is usually crystal-clear, and the level restarts under a second after dying. So, it's hard without it really punishing you for failure, and so it's hard but not frustrating. Also, the levels usually have multiple pathways to success, so you're encouraged to try alternative means and change up your strategy. Further, all the worlds of a world are available to you at once, so you can skip a hard level and come back to it later. Lots of good design decisions in the game, overall.
Some aspects of this game's designs really tug at the obsessive-compulsive me that I try hard to fight back. For example, it grades how fast you beat a level (either you got an "A+" or you got NOTHING!). The first time I played this game, I played each level over and over until I got the A+ score.
And then it got worse, because getting an A+ score unlocks the "Dark World" version of a level. And you can get an A+ on those levels, too (though, I assume on those levels it's just for bragging rights).
Quite predictably, I burned out on Super Meat Boy very early on because of my approach to playing it at the time. This time, at QuakeCon, I had a better strategy. A level I beat is done for now, and I move on to the other levels. I can come back and unlock bonus content after I beat the game proper.
This philosophy led to a lot more fun. Though, I don't always practice it perfectly.
I don't feel I have much to say about the other games I played. Overall, I remember this day for the Super Meat Boy playtimes.
QuakeCon's Over: The Trip Home
07/22/14
Do you know what I think of when I think of travelling from Dallas to Tucson? Seeing the ocean.
....
I'm serious.
Did you know that if you pick the cheapest flight tickets from Tucson to Dallas on Southwest, there's a good chance you'll have a layover in LA? I was not really paying attention to trip time when I bought flight fare, if you haven't guessed that already.
Overall, this was a pretty uneventful day. I had already checked my computer out of QuakeCon the night before. The early morning fun was full of taking the five computer and computer-related equipment we had from our 6th-floor room to a friend's Jeep in the parking lot.
Most everyone else in the hotel had similar plans. Now, the sixth floor might sound pretty high up, but did you know there are some 26 floors at the Hilton in Dallas? Did you also know that elevators like to go to the top requested floor before coming down?
A fair chunk of the morning was spent watching full elevators stop on the sixth floor to mock us. "Oh, did you want to bring your equipment down on this elevator?"
I ended up hauling my computer down the stairs. Good exercise, I say.
The rest of the day was spent thinking, eating, sleeping, and/or reading whilst traveling across the country.
And when I got home, I helped a friend move in. All-in-all a pretty enjoyable day, actually.
QuakeCon Retrospective
07/22/14
I'm back! (But you already knew that, Stephan.)
QuakeCon was a lot of fun. So much fun, in fact, that I completely neglected to do any blogging or proper documentation while I was there, as was my plan when I left.
Whoops. The next QuakeCon will go better (and there will be a next one). I now plan to try and back-blog the QuakeCon fun, and the thoughts I had then (and now have in retrospect).
Hopefully, I can both get some good documentation on my trip in and also catch up on all those missed blog posts.
The plan:
- QuakeCon's Over: The Trip Home
- QuakeCon: Day 3 (Saturday)
- QuakeCon: Day 2 (Friday)
- Doom Live Demo Impressions
- QuakeCon: Day 1 (Thursday)
- QuakeCon: Day 0 (Wednesday)
Yeah, that's right, Stephan, I plan on back-logging backwards. Also, those should become links when they're actually posts. I'm hoping that I lose/edit details of older memories slower than newer memories. I mean, the older memoeries have already been altered a bit, maybe the fresher ones have a better chance of better documentation.
We'll find out as the blog posts flow.
Code Complete Complete
07/15/14
Rating: Buy Code Complete, you won't regret it.
I finished reading that book I mentioned earlier today. I started reading it October 2013, if I remember correctly. You could say it took me a while. While reading it, I also read:
- Getting Things Done
- Art of Game Design
- Learn You a Haskell for Great Good
Looking back, I greatly need to improve the amount I read. The original goal was a book a month. Looking more like a book every three months.
To be fair to myself, though, Code Complete is long. It's a good 862 pages. 862 pages that I very much enjoyed, mind you, but still. It's packed with a lot of good content on practical methods of programming, some of which, admittedly, should be common sense. A lot more of it still is something I was told about in college at some point and subsequently forgot.
To be fair to myself, again, a lot of the stuff relearnt through my reading of Code Complete was in regards to standards and habits that are not necessary for work generated during normal college processes.
Anyways, I read it cover-to-cover and enjoyed doing so. I believe rereading it in the future will be quite valuable. I think I'll reread specific chapters as necessary, though. Use it as valuable reference material.
With Code Complete... complete, I believe the next bookly beast I shall conquer will be....
Bash Scripting Improvements
07/15/14
Lately, I have been needing to mess around with bash scripts. Moreso than I really like, but "c'est la vie". I figure if I need to code in it, it's better to use the situation as a means of self-improvement than to let myself be annoyed by it. Anyways, today I was thinking about the best way to do multiline comments in bash, and I found this bit of advice:
This is a test comment
author foo bar
Released under GNU
'
As the source explains, ":" is a built-in command that does nothing, but that's not what I found interesting. I did not know that unterminated quotes would continue a command in bash (csh complains about an "Unmatched '.", futher proof of csh horribleness).
So, it occurred to me, why not get in the habit of putting a usage string at the top of each bash script I write. Sort of like a docstring.
USAGE: ./scriptname [OPTIONS....] ARGUMENT
'
And then, if necessary or wanted, I can print scriptname_usage_string when the program terminates due to incorrect usage.
USAGE: ./scriptname [OPTIONS....] ARGUMENT
Now I can document my bash scripts better and have a string to print to a user if necessary. Neat, hopefully it turns out to be quite useful.
QuakeCon Approaches
07/15/14
As mentioned in my EVO post, I'm going to QuakeCon. If all goes according to plan, my next post should be from the event. It'll be freaking great, but right now, I need to prepare.
Some Days You Just Gotta Read
07/15/14
Yesterday, I was struggling to be productive. I couldn't focus. I felt like I couldn't do anything. Usually when this happens, I waste the day browsing online, consuming worthless nonsense.
Yesterday, though, I thought to myself, "What am I willing to do that's somewhat valuable?", and I ended up picking up my copy of Code Complete and just reading it for the majority of the day.
It's not something that I could or should do everyday, of course. I have real work to do, both at home and at work. But thanks to that, I've nearly finished the book, and I am really getting a lot out of the last few chapters. Lots of good insight and advice that will be very applicable to work and extracurricular projects.
It was definitely much better than wasting the day reading random junk online.
Ironically, a section of Code Complete that I read yesterday talked about something similar. Section 33.9 "Habits". It spoke of focusing on manifesting good habits, and the bad habits will naturally fade.
That makes sense. Anytime I tried to quit doing any given thing, I usually fail, but when I explicitly plan to replace that thing with something else, it works out. I will plan to replace the worthless online reading I fall back to on bad days to material with more substance.
That's why I'm writing this post. I figured a blog post is better than what I usually end up doing on my computer each morning before work. Hopefully, I can get into the habit of thinking "What valuable thing am I willing to do now?" and start doing that thing instead of wasting precious time on activities I find wasteful.
Meta: Styling Code
07/13/14
So, in this post (circular dependency warning!) I posted some vim script code.
Typically, when I see code posted on the Interwebz I see it formated differently, and for good reason. Code needs to stand out, needs to look like code. Bare minimum, it needs:
- Different background color
- Monospaced font
And so I quickly threw together some css for just that purpose.
background-color: #D8D8D8;
width: 400px;
margin-left: 25px;
font-size: 10pt;
font-family: monospace;
}
Now, I just wrap code in a div of class "code" and it'll style how I want it. Also, I can make the styling better later. Right now, it's not that pretty.
Note: that code above is also apart of class "css". I plan to also assign a class of whatever code type code text is. Maybe, eventually, I'll style the code-type as well.
A goal to add to the pile, I guess.
Highlighting the 80th Column in Vim
07/13/14
Vim is a text editor. It is the best text editor. That's right, Stephan, better than emacs (yes, huh). It's got a bit of a learning curve to it, but it's worth it for the level of control gained.
I am not using vim to its full potential. Though, to be fair, very few probably are. Getting to a level of comfort and staying there is pretty normal. I have stopped a bit too far from maximizing my text editing effectiveness.
For that reason, I have to decided to make a drastic change to my .vimrc file (the vim settings file, basically). I am going to....
Pause for dramatic effect.
Do what the title of this post says.
Probably actually only a one-liner. Googling... googling... googling...
Oh, oh. That last one. This one. Yeah. Now to just post the code in here....
set colorcolumn=80
But that's making the 80th column an annoying shade of red.
highlight ColorColumn ctermbg=7
I think that looks much better.
Grade B
This is a long post for such a small thing, but it's a warmup for things that are harder to do, I think. Like other vim stuff I've been putting off.
Hmmm... I've been doing styling stuff behind the scenes up until now, but I suppose it could be useful to have some sort of meta-post about this.
Oh, oh, there's a link, I made a meta-post about it. Yep, I'm going to blog proper about the learning I do to improve this site.
Experiment: Blogging About Things While I Do Them
07/11/14
There has been a long period of my life where I have not had a blog. We're talking a good 23 years, 10 months, 17 days plus or minus a couple attempts at blogging that I barely remember (and would rather forget; past me was pretty angsty at times).
During this time, I managed to do some things that, had I documented it, I might've been able to help out others trying to do the same thing. For example, plymouth was breaking my boot-up of Ubuntu when I first setup Ubuntu. Plymouth and my NVIDIA graphics card didn't play nicely at the time. A lot of looking online did not provide any kind of fix or workaround. Eventually, I merged two pieces advice together, and at least got a workaround (that made bootup take a bit longer, but let me use nvidia drivers at least).
I never told anyone about this workaround. I lurked, I found a solution others had not posted yet, and I didn't help anyone. Remember that selfishness I mentioned in my first post, Stephan? This is the sort of thing I was talking about.
That workaround has been lost to time, and is no longer particularly valuable. The problem has long since been properly fixed. But there's stuff I'm figuring out all the time that I leave undocumented how I figured out.
Sometimes, I don't even realize how much stuff I've figured out until I talk to other people about it, and they look at me like I'm speaking a different language. The problem is, it's subtle and small at first. It seems insignificant, but it slowly builds up to a considerable amount of knowledge and capability.
So, I'm going to try to be better about documenting the stuff I'm learning while I learn it. To provide the means by which I learned it. Hopefully, I can provide a higher-quality roadmap to improvement to the next person to try whatever it is I try to do.
And maybe when I get around to implementing comments, readers will be able to point me in a better direction when I do it wrong. Though, I guess he could always just tell me in person.
Anyways, some future posts to expect out of this experiment:
- Vim Setting Based on Extension of File Being Edited
- Highlighting the 80th Column in Vim
- Gamecube Emulator Setup
- Super Smash Bros. Melee Netplay Setup on Gamecube Editor
Truth be told, I've already figured out that first vim one, but I need to retrace my steps again, because I didn't implement it after looking it up and I've forgotten the specifics.
No EVO For Me
07/11/14
EVO is a fighting game competition. This year the competition is featuring such games as:
- Ultra Street Fighter IV
- Blaz Blue Chronophantasma
- Killer Instinct
- Ultimate Marvel Vs. Capcom 3
- King of Fighters XIII
- Injustice: Gods Among Us
- Super Smash Bros. Melee
- Tekken Tag Tournament 2
See that game in bold up there?
That game was released in 2001. Every other game on that list is much more recent. Super Smash Bros. Melee is among them in its unaltered 2001 form.
It's an amazing game. You should play it. Even its sequel, Super Smash Bros. Brawl on the Wii is pretty amazing. The original Super Smash Bros. game? Amazing. If you haven't played a game in the Smash Bros. series, you should, they're great.
I have been playing Melee since it came out. I'm not great at the game, but I'm competent and enjoy pursuing a competitve capability in the game.
I signed up for EVO 2014. I was pumped for EVO. I was going to play Young Link. I was going to play under the alias "Me", and my first match was going to be against some person by the alias "Eggz" who ended up being the winner of the bracket I was placed in.
I was maybe going to get a few wins in due to other people's unfamiliarity with the match-up. When I finally lost, I was going to watch the top players play each other on a level I am far from achieving. I was going to play friendly matches with a great variety of Smash Bros. players from all over the world.
EVO started this morning.
I am not at EVO. Real life sometimes gets in the way of fun plans. You see, next week is QuakeCon. QuakeCon is basically super-special-awesome PC LAN party in convention form. I was planning to go to both, but after some basic vaction-hours math, I realized I could only go to one.
I picked QuakeCon. I picked QuakeCon because it's a longer event, I'll have my huge desktop computer with me the whole time, and I'll probably learn a lot more cool stuff there than at EVO.
It's still pretty disappointing, but this sort of thing happens. As a consolation, however, I have resolved to finally set up a Gamecube emulator on my desktop and join in on the Super Smash Bros. Melee netplay community.
Silver lining: this is totally my longest blog post yet. Isn't it, Stephan?
Fewer Everyday Items
07/09/14
In this post I talked about doing an everyday streak with a lot of items. Planning short devotion to all of them and major devotion to one.
This did not work.
At all.
Now I'm going in the opposite extreme. I will post a blog post everyday. That is the only streak I care about. The goal will be to blog about things I'm doing, or as a rough plan for things I want to do.
This is what is naturally occurring at least. Hopefully, it'll lead to a variety of well-documented productivity out of me.
Individual Posts Have Their Own Link Starting Now
07/08/14
This post should have a header that's a link to just this post's content.
Goal for Today: RSS Feed
07/07/14
From what I have read, RSS readers only require an XML file. Doing it by hand at first shouldn't be difficult.
RSS link should be here. Also, on the side bar.
Hopefully I didn't screw it up. Stephan will let me know if I did. Won't you, Stephan?
Things Looking Much Less Horrible
07/06/14
Instead of real blog post, you can just look at new site layout, Stephan.
(I assume only Stephan reads this. If you are not Stephan, I apologize.)
Project of Focus: Making This Blog Look Better
07/05/14
HTML, CSS, and javascript are all things I want to get better at. Web-development in general is something I want to get better at.
This blog currently has one, big HTML file holding the contents, and a minimal CSS file giving the page what little formating it has.
Time to make this site of mine look a bit nicer and function a bit beyond a single HTML file.
What is Consciousness?
07/04/14
Disclaimer: I have done no research here. It is something I like to think about. As with any armchair philosophy (especially done by someone with no philosophical training), the following is probably completely wrong.
I wonder about consciousness a lot. Even without the word, I distinctly remember my younger self stopping to think about how I was alive. "I can make my fingers squeeze together," I would think as I squeezed my fingers together.
I have consciousness that is aware of its own consciousness. I feel like that's a hint at what it is. It's an analysis machine that takes its own processing and output as input. It will also use its input to alter how it analyzes future input, or allow reassessment of past input.
I really should see what people who think about this professionally define consciousness. I wonder what kind of models they make to simulate their hypotheses.
Sick
07/03/14
I got sick again. Been about a month and a half. That's too short a duration between illnesses, I think. Guess it's unavoidable.
Last time I was sick, I missed a few days. Of work and of personal productivity. The missed work was something I caught up on, but catching up cost even more personal productivity.
This time I didn't even realize proper that I was sick until today. I've been sick since Tuesday. I went to work all three days. I have made my attempts at personal productivity all three days. My strategies for increased productivity are still being formulated.
At the very least I'm much better at being sick.
Tomorrow: expect a post on consciousness. Where I ramble on about my thoughts like yesterday. (Both posts were written in a journal while I was on vacation.)
The Free Will Debate
07/02/14
There's an argument over whether or not free-will exists. Well, there's lots of arguments over free-will:
- can it exist if it's deterministic
- does it come from the brain
- does it come from the soul
- can it only exist if dualism is true
- et cetera
I, myself, am a believer in deterministic free-will. You may scoff and ask, "How can free-will be free-will if it's deterministic?"
I don't understand that question.
I think I don't understand because I don't understand other people's definition of free will. And by "don't understand", I think I mean "don't know".
Free-will isn't a well-defined term.
I have thought a bit on what free-will means to me. Little-by-little I have added the necessary qualities of free-will. Let's start with the basics:
- Free-will is the ability to make choices.
Is this alone enough? No. A coin or a dice can make ecisions (if outcome were decied by result), but they do not contain free will. Some thought must be put into the decisions. So:
- An agent containing free-will must be capable of making choices for reasons
Is that all? No. A computer can make choices, but everyone agrees that currently computers do not contain free-will.
Things must go deeper. Why are those decisions being made for those reasons. The reasons for doing something are derived from an expected result, so:
- Free-willed agents must have goals
And goals need to be tied to actions somehow, so:
- Free-willed agents have models that tie actions to goals
This all ties together into my definition of free-will:
- Free-will is the ability to make choices based on who you are and what you want.
Under this definition, free-will can be deterministic. In fact, shouldn't free-will be deterministic? Shouldn't a person's actions be predictable if you know what kind of person they are?
I guess now I should look up the actual literature on free-will and correct some of my ignorance.
Second Try Starting Now
07/01/14
After my first streak ended it was pretty close to vacation. So I went ahead and stopped trying the daily stuff. All of it. I was going to at least do planks.
But I forgot.
Oops. Oh well. Time to start again. For real.
With some new rules:
- Github streak not important
- Five minutes to each of my "everyday" items
- All free productive time in a day goes to just one "everyday" item
- Large chunks of productive time must go to an "everyday" item
- New "everyday" items can only have five minutes for that day
Github streaks were great, at first. But eventually I started doing a lot of bare minimums to get by. Small issues posted on projects I rarely worked on to begin with. I found an exploit and took advantage of it. Chaining from now on needs to be something with rules I have control over. So that any exploit I find will be fixed when it becomes a problem.
My "everyday" items for now:
- Check tickler items
- Planing/timeblocking
- Clear out inbox
- Digitize entries in notebook/journal
- Organize email
- Reading my book of the month
- Drawing (currently parallel with my book of the month)
- Stretching (expection: has to have more than five minutes each day)
- Planking (2 minutes 30 seconds for now)
- Programming
- Game Design
- Super Smash Bros. Melee practice
- Blog post
There may be too many everyday things, I may decided to cut some out and figure out how/if they fit in at all.
Trying to be productive on something without explicitly planning to at least think about it everyday hasn't worked for the last few weeks. Let's try doing things everyday again, but mutating out the things that don't work and mutating things in to see if they do.
First Try At a Never-Ending Github Streak
06/02/14
Back on April 4th I started a github streak going. It lasted 58 days. I forgot yesterday.
Oops. Oh well. Time to start again. Got a number to beat now.
Things Looking a Bit Better Around Here
05/29/14
Still a lot of work to do, but the content doesn't spread across a full page anymore. And the blog posts are clearly separated now.
Some More Specific Goals for This Blog
05/28/14
Let's solidify some things I want to do with this blog.
Style stuff:
- CSS-styling at all
- Reasonable column width for better readability
- Individual links for each blog post
- "Working On" list on the side for content working on
- Blog should be under www.ksionda.me/blog
- www.ksionda.me should be a home page for me
- github link
- Facebook link
- LinkedIn link
- Google+ link
Technical stuff:
- Dynamically generated date stamps
- Content not contained in one large html document
- rory@www.ksionda.me should be a working email address
Let's Try Making Things Prettier
05/28/14
It's about time I relearn css. This time with purpose, so hopefully I won't so easily forget it all.
Expect things to get uglier before they get prettier.
What is Your Job?
05/22/14
Did you answer, "To make money."?
Do you think a business's job is "to make money"?
That some think that's appropriate logic has always bothered me.
More in-depth post on this will come eventually.
Organization Infrastructure
05/21/14
For about half a year now, I've been taking how I approach being productive seriously.
My transition from school to a full-time job wasn't ideal. It was a slow collapse into an utter inability to do anything. Even gaming became too much of a chore. At some point, I think all I really did was read reddit.
I was miserable. Thankfully, I was able to communicate to work that I couldn't do anything. And, instead of firing me (which would have been justified at the time), my boss found me a mentor and that mentor recommended me some resources.
He recommended two books the first time we talked.
- Getting Things Done
- Code Complete
I had asked explicitly for things that would help me get things done, and for things that would make me better at coding. I bought both books immediately (early October 2013).
I still haven't finished Code Complete, but I finished Getting Things Done in under two months.
Improvement was fast, but not immediate. I quickly attained the ability to do things again. Things did not really click into place until Feburary of 2014, though. I had to slowly mutate the foundation Getting Things Done gave me. Into something that worked properly for me. The final missing piece was explicitly planning my day with time blocking.
When things did click, though, it was bliss. Suddenly, I had so much more time. I had control. I would think about doing things. Those things would get written down. They would get planned at specific times. They would get done.
What's great, also annoying, is that the bliss didn't last. Flaws bubble up in my system, but they aren't flaws that add up over time, they're just there. I'm simply becoming aware of things that could be improved.
I feel another revamp coming. A need to set aside a good day to consider the flaws, so that I can mutate my system again. To even better accomplish what I wish to do.
Parallel Growth
05/19/14
I have been making a lot of improvement along many trajectories, but I am still very inefficient about the whole process. Which may be related to the fact that as I get better, I give myself more things to do. Perhaps it isn't quite focused on a small enough amount of projects.
Though, in all honesty, that's currently unavoidable. There are basic skills I never bothered to learn, that I am now trying to learn. Alongside specific projects using the inadequate skills I already have.
So, progress is slow, but it's still there at least. Currently, I am working on: exercise efficiency, game prototyping, html5 skills (I am, I swear, just not here), writing, learning to draw, general programming ability, functional programming ability (though this may be on a back burner now), and time management abilities.
I should probably write a post on each of these things. Learning to draw might be next. It's what I'm devoting the most time to right now.
Random Fiction: Which is the Dream?
05/17/14
"The only one of these dreams I seem to remember is the first one."
"The second, you mean?"
"I always forget that I don't remember the first, even here. Yes, the second. It reminds me of a story, though. Back in the waking world. When I told someone of that dream."
"So, here you are, in the dream dimension, talking to someone about when, in the waking world, you told someone about a dream?"
"Yes."
"And what did you have to say to this someone about me?"
"You weren't really a very integral part of the story."
"Sounds like it wasn't a very good retelling of the dream. Also, very boring."
"Fair enough. What would you like to talk about?"
"Come on, now. I'm only teasing."
"I know, I know. I prefer to take facetiousness seriously."
"I suppose you do. So, what person's willing to listen to your boring story in the WW?"
"You know, it never ocurred to me before that I do not know his name here."
"Well, you're horrible with names. Quick, what's mine?"
"Ha, ha."
"Clearly, you don't know."
"Clearly. Well, anyways, he's the teacher I tried to email at the end the second dream."
"Oh, yes, heh. Did he tell you about receiving email from you in one of his dreams?"
"Of course not, that's ridiculous."
"See? Boring story."
"Fine, then, let's go sword-fight in the dilapidated mansion."
"No, no, no. Finish your story. It can't possibly put me to sleep."
"Well, short story shorter: I told him about how everyone talked about me being here again, though I had no recollection of the first visit, and how surprised I was at the deliciousness of the food. And he told me, 'Dilapidated mansion? Strange people welcoming you for a second time? Delicious food? Sounds like you were in the land of the dead. And you should never accept food there.'"
"..."
"Well? Anything to say about that?"
"Zzzzzzzzzzz...."
"That reminds me. I also talked about how surprising it was that I could feel pain!"
"Ow! Oh, I was having such a wonderful dream within a dream."
Site Change: Adding Dates (Manually)
05/17/14
Missed a few days there. Hopefully I can catch up. I am no longer sick.
I figure I should add some dates to this, to keep better data on blogging habits.
Eventually there'll be future changes to enable such things automagically.
Update:
I should probably make actual plans on when and how to do site
changes. Expect a future post on that.
Sick Day
05/13/14
Today is the first time I have been sick this year, I think.
First super crazy lazy day.
Kind of nice. Mostly crappy.
The Walking Dead
05/12/14
I enjoy the Walking Dead. The television series and the adventure game from Telltale Games. I will probably enjoy the comic if I ever get around to reading it.
There are some problems I have with both, however. The writing can be sketchy, and the show gets a lot of flak for it. But the games? There is very little talk of the bad writing in the game.
The games are all about the illusion of choice. Basically, the game strives to show you how the choice you made was wrong, regardless of the choice you made.
Normally, the game does an excellent job of casting this illusion. It really makes you ruminate over the actions you have decided to make.
But sometimes, the game fails to deliver a choice that it really should. It fails to do so, purely so the narrative can move as the developers desired.
For example, there is one section of the game where you leave your gun behind. You "forget" it while going to retrieve something you dropped. There is no option to take the gun with you.
This is like those moments in the show, and in horror movies in general, where normal human beings are suddenly stupid to advance the plot.
Except it's even worse. As I am supposed to be in control, and now I'm the one who did something stupid. And characters in the game even blame me for it.
It's rare in the games, but it really ruins the experience when it happens.
Disruption
05/11/14
At some point I'm going to do a post on disruption.
Disruption is now one of those business buzzwords. It doesn't get the respect it deserves. It's a great concept, and it's pretty throughly defined by the man who coined the term, Clayton Christensen.
A lot of stuff is labelled disruption, but there's an easy heuristic to see if it is or not: is the targetted consumer underserved by the competition? Even better: is the targeted consumer uninteresting?
If not, then you aren't disruptive. You're probably just a crappy alternative to the competition. Which is half of what disruptive innovations are, but the other half is the important half.
A disruptive product needs to serve a crappy customer. A customer that the competition is not worried about losing.
Under this lens, it is easy to see how something like the Ouya wasn't disruptive. Who was the Ouya targetting? As a Kickstarted project, it was targetting passionate gaming enthuists.
Those gaming enthuists ended up pretty disappointed. They bought a crappy product.
I guess I just did a post on disruption.... Huh.
At some point I'll do a good post on disruption.
Everyday
05/10/14
I have been trying to do some things everyday.
Github commits. Blog posts. Planking.
I'm not necessarily a believer in the "don't break the chain" mantra, but I see it as a good starting point. It helps me to get a feel for how to do the things I want to do. How to make time for those things. How to make the small amount of time I make for them count.
Lately, my github commits have mostly been towards a GameMaker project. Today I maybe spent five minutes on it. That's not a lot, but I managed to get to a point today I've been working towards a while. The player can now click on the screen, and the avatar will jump along an arc including the clicked pixel.
Soon, I will add better constraints for how the jump works. The GameMaker project will slowly morph from a toy into an actual game.
Hopefully, that'll happen sooner than five minutes a day at a time, but I believe five minutes a day will get me there eventually. I didn't know that before.
Exercise PID Control
05/09/14
I have lost roughly 80 pounds over the last year and a half.
It has been a strange journey. Lots of starting and stopping of the same things.
I started running. I stopped running. I started running.
I went to the gym. I stopped going to the gym. I went to the gym once of week. I stopped going to the gym. I am going to the gym.
I ate a lot. I ate whatever I wanted. I quit soda. I started soda. I quit soda. I started soda. I quit soda. I started counting calories. I lost 50 pounds. I gained proper control over my intake of soda.
I started timing myself. I stopped timing myself. I time myself in a different way.
My habits seem to have undergone a sort of PID control. Slowly approximating to something that works better and better for me.
I'm trying to apply the methods stumbled upon here everywhere. I plan to try and formulize it soon, which is why I'm glad I'm recording my actions now.
More on that, eventually.
Eventually....
05/08/14
UPDATED: 07/09/14
There's a lot of things I want to do.
Eventually.
- Make a website (I guess this is the beginnings of that).
- Make a game.
- Squat 300 pounds.
- Absorb the content of Introduction to Algorithms (aka CLRS).
- Learn Japanese.
-
Making the previous set of sentences an HTML bulleted list. - Et cetera.
It's nice to finally be working towards such things. I have always struggled to work towards the fantasies I had. It was a horrible habit of only doing what I was explicitly told to do.
Escaping academia has forced me to learn a new system of doing things. And I have finally developed the personal tools for extra-curriculars.
It's a pretty amazing feeling.
The First Stone
05/07/14
I have been putting this off for quite a while. I wanted to have something to write about. A better site to present with. More capabilities. Appear competent.
But to do things that way is foolish. And selfish. Foolish in that people rarely become great in isolation. The things they make on their way to greatness must be shared. So that their flaws can be pointed out by others. So that growth can occur. Selfish in that now, right now, I am learning how to learn. I am stumbling onto a virtuous cycle by which I unlock the ability to do more. And to not document this process, to not pave a path that might help others. That's selfish.
So, here's the start. An un-styled, low-tech HTML page. A tiny, unpolished stone. Hopefully the beginnings of a great wall.