when all you have is a hammer, everything looks like javascript - ebookcraft 2015 - baldur bjarnason

29
When all you have is a hammer, everything looks like JavaScript

Upload: booknet-canada

Post on 06-Aug-2015

221 views

Category:

Education


2 download

TRANSCRIPT

Page 1: When all you have is a hammer, everything looks like Javascript - ebookcraft 2015 - Baldur Bjarnason

When all you have is a hammer, everything looks

like JavaScript

Page 2: When all you have is a hammer, everything looks like Javascript - ebookcraft 2015 - Baldur Bjarnason

I’m Baldur BjarnasonMy job at Unbound is to, over time, automate everything

that can be automated about our ebook production

Page 3: When all you have is a hammer, everything looks like Javascript - ebookcraft 2015 - Baldur Bjarnason

My goal is to convince you of two things

• That software projects should start small and scale up

• That Javascript is the tool for the job

Page 4: When all you have is a hammer, everything looks like Javascript - ebookcraft 2015 - Baldur Bjarnason

Javascript all the things!

Alternate title for this talk…

Page 5: When all you have is a hammer, everything looks like Javascript - ebookcraft 2015 - Baldur Bjarnason

Really? That can’t be a good idea.

Page 6: When all you have is a hammer, everything looks like Javascript - ebookcraft 2015 - Baldur Bjarnason

Tool-buying versus

Tool-making

Page 7: When all you have is a hammer, everything looks like Javascript - ebookcraft 2015 - Baldur Bjarnason

Tool-making starts small

Small, hacky solutions build up to larger things

Page 8: When all you have is a hammer, everything looks like Javascript - ebookcraft 2015 - Baldur Bjarnason

The case for javascript

Page 9: When all you have is a hammer, everything looks like Javascript - ebookcraft 2015 - Baldur Bjarnason

JS is web nativeIt mixes well with HTML and CSS

Page 10: When all you have is a hammer, everything looks like Javascript - ebookcraft 2015 - Baldur Bjarnason

JS as a skill is eminently reusable

Used in browsers, app automation, servers, plugins, mobile apps, you name it

Page 11: When all you have is a hammer, everything looks like Javascript - ebookcraft 2015 - Baldur Bjarnason

node.jsJavascript without the browser mess

https://nodejs.org

Page 12: When all you have is a hammer, everything looks like Javascript - ebookcraft 2015 - Baldur Bjarnason

Node.js

• Opens up the possibility of standalone scripts

• No browser necessary

• Modularity let’s you start small and add as you iterate

Page 13: When all you have is a hammer, everything looks like Javascript - ebookcraft 2015 - Baldur Bjarnason

Node.js makes javascript fun

Page 14: When all you have is a hammer, everything looks like Javascript - ebookcraft 2015 - Baldur Bjarnason

The laws of software development

Page 15: When all you have is a hammer, everything looks like Javascript - ebookcraft 2015 - Baldur Bjarnason

Gall’s law"A complex system that works is invariably found to have evolved from a simple system that worked. The inverse proposition also appears to be true: A complex system designed from scratch never works and cannot be made to work. You have to start over, beginning with a working simple system."

Page 16: When all you have is a hammer, everything looks like Javascript - ebookcraft 2015 - Baldur Bjarnason

Let’s start off by taking something BBedit does

well and do it badly

Page 17: When all you have is a hammer, everything looks like Javascript - ebookcraft 2015 - Baldur Bjarnason

var fs = require("fs"); var glob = require(‘glob’); var files = glob.sync(‘*.html’);

bodyre = new RegExp('(<h1[^>]*>|</h1>)', 'ig');

files.forEach(function(textname) { var text = fs.readFileSync(textname, "utf8"); var title = text.split(bodyre)[2]; console.log(title); });

Page 18: When all you have is a hammer, everything looks like Javascript - ebookcraft 2015 - Baldur Bjarnason
Page 19: When all you have is a hammer, everything looks like Javascript - ebookcraft 2015 - Baldur Bjarnason

The limits of Regular Expressions

<[^<>/]*?class=\”random-class-thing"[^<>/]*?>)([^<>]*?)(</[^<>/]*?>

versus

document.querySelectorAll('random-class-thing');

Page 20: When all you have is a hammer, everything looks like Javascript - ebookcraft 2015 - Baldur Bjarnason

var fs = require("fs");

var jsdom = require("jsdom");

var jquery = require("jquery");

book = fs.readFileSync("eBook Test-5March14.html", "utf8");

jsdom.env({

html: book,

done: function (errors, window) {

jquery(window);

window.$("h4").unwrap();

window.$("h1").addClass("test2");

fs.writeFileSync("bookbody3.html", window.document.documentElement.innerHTML);

}

});

Page 21: When all you have is a hammer, everything looks like Javascript - ebookcraft 2015 - Baldur Bjarnason
Page 22: When all you have is a hammer, everything looks like Javascript - ebookcraft 2015 - Baldur Bjarnason

The tool-making bit:#!/usr/bin/env node

'use strict'; var program = require(‘commander'); program.version('0.1.0') .option('-f, --folder [path]', 'Output folder') .option('-o, --output [filename]', 'Filename') .option('-v, --verbose', "Let's be chatty and loud") .option('-m, --mangle', 'Obfuscate the font files');

Page 23: When all you have is a hammer, everything looks like Javascript - ebookcraft 2015 - Baldur Bjarnason

Are we having fun yet?

Page 24: When all you have is a hammer, everything looks like Javascript - ebookcraft 2015 - Baldur Bjarnason

The recipe for success

• One part hacky node.js scripts

• One part commander (or similar module)

• Mix well over time

• And the result…

Page 25: When all you have is a hammer, everything looks like Javascript - ebookcraft 2015 - Baldur Bjarnason

Tools!

Page 26: When all you have is a hammer, everything looks like Javascript - ebookcraft 2015 - Baldur Bjarnason

var mangler = function(fontpath, id) {

var font = fs.readFileSync(fontpath);

var shasum = crypto.createHash('sha1').update(id.trim(), 'utf8');

var key = new Buffer(shasum.digest('hex'), 'hex');

var prefix = font.slice(0, 1040);

var _fn = function(blob, i) { return prefix[i] = blob ^ key[i % key.length]; };

for (i = _i = 0, _len = prefix.length; _i < _len; i = ++_i) {

var blob = prefix[i];

_fn(blob, i);

}

font2 = Buffer.concat([prefix, font.slice(1040)]);

fs.writeFileSync(fontpath, font2);

};

Page 27: When all you have is a hammer, everything looks like Javascript - ebookcraft 2015 - Baldur Bjarnason

That was a kick in the faceBut can you guess what it was for?

Page 28: When all you have is a hammer, everything looks like Javascript - ebookcraft 2015 - Baldur Bjarnason

Learning JS

• Mozilla’s re-introduction to JavaScript: https://developer.mozilla.org/en-US/docs/Web/JavaScript/A_re-introduction_to_JavaScript

• Eloquent JavaScript http://eloquentjavascript.net

• JavaScript: The Good Parts by Douglas Crockford

Page 29: When all you have is a hammer, everything looks like Javascript - ebookcraft 2015 - Baldur Bjarnason

Learning JS

• Khan Academy: http://www.khanacademy.org/computing/computer-programming

• Codecademy: http://www.codecademy.com/tracks/javascript