a/o 2020-05-29
--
- Restart with Cmd-R or Cmd-D
- Erase drive / 3x if second-hand
- Reinstall MacOS
This tutorial uses the "Sample hapi.js REST API" project.
Take a look at: https://github.com/agendor/sample-hapi-rest-api/
##Topics
'use strict'; | |
var babel = require('babel-core'); | |
var fs = require('fs'); | |
// borrowed from https://github.com/babel/babel-jest/blob/master/index.js | |
require.extensions['.jsx'] = function (module, filename) { | |
var src = fs.readFileSync(filename, 'utf8'); | |
// Allow the stage to be configured by an environment | |
// variable, but use Babel's default stage (2) if |
Service Worker - offline support for the web
Progressive apps - high-res icon, splash screen, no URL bar, etc.
// promise | |
const sleep = (timeout, v) => new Promise(r => setTimeout(() => r(v), timeout)); | |
// series to call | |
const series = [() => sleep(1000, 1), () => sleep(1000, 2), () => sleep(1000, 3)]; | |
// serialize | |
const r = series | |
.reduce( | |
(m, p) => m.then(v => Promise.all([...v, p()])), | |
Promise.resolve([]) |
import { combineReducers } from 'redux'; | |
import users from './reducers/users'; | |
import posts from './reducers/posts'; | |
export default function createReducer(asyncReducers) { | |
return combineReducers({ | |
users, | |
posts, | |
...asyncReducers | |
}); |
if (typeof Promise === 'undefined') { | |
require.ensure([], (require) => { | |
require('imports?this=>window!es6-promise') | |
}) | |
} | |
if (typeof fetch === 'undefined') { | |
require.ensure([], (require) => { | |
require('imports?self=>window!whatwg-fetch') | |
}) |
# ... | |
[options] | |
# webpack loaders | |
module.name_mapper='.*\.css$' -> '<PROJECT_ROOT>/flow/stub/css-modules.js' | |
module.name_mapper='.*\.\(svg\|png\|jpg\|gif\)$' -> '<PROJECT_ROOT>/flow/stub/url-loader.js' |
export const refreshFrequency = 1000; | |
export const command = `ps axro \"%cpu,ucomm,pid\" \ | |
| sed -e 's/^[ \\t]*//g' -e 's/\\([0-9][0-9]*\\.[0-9][0-9]*\\)\\ /\\1\\%\\,/g' -e 's/\\ \\ *\\([0-9][0-9]*$\\)/\\,\\1/g' -e's/\\ \\ */\\_/g' \ | |
| awk 'FNR>1' \ | |
| head -n 3 \ | |
| awk -F',' '{ printf \"%s,%s,%d\\n\", $1, $2, $3}' \ | |
| sed -e 's/\\_/\\ /g'`; | |
const style = { |
Redux has brought the notion of reducer back into the awareness of many developers for whom they are a novel concept. In fact they are quite simple, and used all the time in such things as SUM
aggregations in databases, where they compute a single value from many.
It's great that Redux has made reducers known to a broader audience, though they are relatively ancient concepts in programming, in fact. But the particular way Redux illustrates a reducer in its documentaion is, in my opinion, with a coding style that is harder to extend and read than it should be. Let's distill reducers down to their essensce, and build up Redux reducers in a way that lowers complexity, and helps separate Redux idioms from your business logic.
A reducer is a pure function that accepts more arguments than it returns. That is to say - one whose "arity" is greater than 1. It 'reduces' the two things you pass it down to a single value. Here are two reducers, in a map