git ssb

0+

dinoworm 🐛 / campjs-viii-ludditejs



Commit 5b9750c19a6a092e30cfacae9550de48116588c4

somewhat like a presentation meow

Michael Williams committed on 8/4/2017, 12:57:35 AM
Parent: 16d5679a3ddf97e78275474c2bb64e886698438b

Files changed

NOTES.mdchanged
README.mdchanged
index.csschanged
index.htmlchanged
package.jsonchanged
follow_your_dreams.pngadded
git-ssb-screenshot.pngadded
moprheus-cat.pngdeleted
morpheus-cat.pngadded
patchwork-screenshot.jpgadded
rabbit-hole.jpgadded
root-systems.jpgadded
white-rabbit.jpgadded
NOTES.mdView
@@ -473,4 +473,26 @@
473473 - move redux to be a quinteesential example of a function signature standard over fancy syntax or library
474474
475475 - acknowledge that pull streams could be its own talk
476476 - link to actual talks
477 +
478 +---
479 +
480 +- one slide has different header level text size
481 +- work on transitions, hard to tell what each slide is saying
482 + - decentralized vs centralized
483 + - color code
484 + - altenate
485 + - section title slide for introducing concept ("eventual value", "dom elements", "reactive value", "values over time")
486 + - explain the pattern you are going to do in the talk ("sign post"), hey i'm going to
487 + - "i might be a fanboy, but here's more dominic tarr"
488 + - luddite.js benefits -> why should you be a JavaScript luddite?
489 + - douglas englebart face on it's own slide
490 +- catstack cringed
491 +- ending slides weren't decisive, waffling, uncomfortable
492 +- standards are just opinions
493 +- could have stopped after "it's not about being right, it's about being successful"
494 + - add "as my Mom always says"
495 +- shameless plug for Patchwork, get on Patchwork, with link
496 + - add a screenshot
497 +- add contact details to opening and closing slides
498 +- twitter handle in footer of every slide
README.mdView
@@ -1,92 +1,118 @@
1 +layout: true
2 +
3 +<footer>dinosaur.is</footer>
4 +
5 +---
6 +class: center
7 +
18 # luddite.js
29
10 +<img src="./white-rabbit.jpg" />
11 +
12 +<!-- image credit to http://www.rabbitholekc.org/ -->
13 +
14 +???
15 +
316 ---
417
518 ## hey [CampJS](http://campjs.com)
619
7-i'm [Mikey (@ahdinosaur)](http://dinosaur.is) from [Enspiral](http://enspiral.com)
20 +i'm [Mikey](http://dinosaur.is) from [Enspiral](https://enspiral.com) & [Root Systems](https://www.rootsystems.nz)
821
922 <div class="row">
1023 <a href="http://dinosaur.is.com">
1124 <img alt="Mikey's avatar" src="./avatar.png" width="200" />
1225 </a>
1326 <a href="http://enspiral.com">
1427 <img alt="Enspiral logo" src="./enspiral.png" width="200" />
1528 </a>
29 + <a href="http://dinosaur.is">
30 + <img alt="Root Systems logo" src="./root-systems.jpg" width="200" />
31 + </a>
1632 </div>
1733
18-slides are available at <http://dinosaur.is/campjs-viii-ludditejs>.
34 +slides are available at:
1935
36 +<http://dinosaur.is/campjs-viii-ludditejs>
37 +
2038 ???
2139
2240 - second time presenting at a conference.
41 +- i'll try to be upfront and honest, apologies in advance if i disguise any opinions as facts
2342 - i might say negative things about some JavaScript patterns, but i use those patterns too
24- - yes i'm bitter about some things, i'll try to be honest
25-- everyone in the JavaScript community is doing a wonderful job
26-- apologies in advance if i disguise any opinions as facts
43 +- in general everyone in the JavaScript community is doing a wonderful job, i appreciate your work
2744
28----
45 +### let's adventure
2946
30-## what?
47 +#### to the silly wonderland of luddite.js
3148
32-luddite.js
49 +<img src="./rabbit-hole.jpg" height='400' class="center" />
3350
51 +<!-- image credit to Mary Blair at Disney -->
52 +
3453 ???
3554
36-so...
55 +an ambiguous utopia
3756
57 +
3858 ---
59 +class: info
3960
4061 ## Luddite?
4162
4263 the [Luddites](https://en.wikipedia.org/wiki/Luddite) was a political movement against _automated centralized technology_.
4364
44-<div style='display: flex; justify-content: center'>
45- <img src="./luddite.jpg" height='400' />
46-</div>
65 +<img src="./luddite.jpg" height='300' class="center" />
4766
4867 ???
4968
5069 - many Luddites were skilled machine operators in the textile industry
5170 - they wanted machines to make high-quality goods, run by workers who had gone through an apprenticeship and got paid decent wages
5271 - they attacked centralized factories who used automated machines operated by unskilled labor
5372 - they used fictious characters to make their story ring
54- - see Ned Ludd, the made-up leader
73 + - see Ned Ludd, the made-up leader, who lived in Sherwood Forest
5574
5675 ---
76 +class: info
5777
5878 ## luddite.js?
5979
6080 **luddite.js** is a (made-up) meme for _simple decentralized JavaScript_.
6181
6282 - decentralized userland ecosystems
63- - not centralized core committees
6483 - simple patterns based on function signatures
65- - not trendy libraries that lock you in
6684
6785 ???
6886
87 +- not centralized core committees
88 +- not trendy libraries that lock you in
6989 - gonna lead you on a journey through the luddite way to do things
7090 - a study of functional JavaScript patterns that have evolved in userland
7191
7292 ---
93 +class: center, info
7394
74-## decent userland
95 +## decentralized userland ecosystems
7596
97 +---
98 +class: info
99 +
76100 what if i told you...
77101
102 +<img src="./morpheus-cat.png" height="400" />
103 +
78104 that anyone can create a _standard_?
79105
80-<img src="./morpheus-cat.png" height="500" class="center" />
81-
82106 ???
83107
108 +- not everyone needs to agree with you
84109 - no corporate sponsorship necessary
85110
86111 ---
112 +class: info
87113
88-## what is a standard?
114 +### what is a standard?
89115
90116 anything that enough people use is a "standard"
91117
92118 example: ["standard style"](https://github.com/feross/standard)
@@ -105,10 +131,11 @@
105131 - back-end: express
106132 - anything "best practice"
107133
108134 ---
135 +class: info
109136
110-## what is a _luddite.js_ standard?
137 +### what is a _luddite.js_ standard?
111138
112139 a standard based on a function signature
113140
114141 example: [Redux](https://redux.js.org) reducers
@@ -118,17 +145,17 @@
118145 ```
119146
120147 ???
121148
122-- standard function signature
123149 - what other standards based on function signatures can you think of?
124150 - express / connect: (req, res, next)
125151
126152 ---
153 +class: info
127154
128-## why is this important?
155 +### why is this important?
129156
130-- easy to use and test
157 +- easy to test
131158 - accessible for anyone to participate
132159 - no module lock-in
133160
134161 ???
@@ -137,24 +164,31 @@
137164 - you don't need anyone's approval to write a "function specification"
138165 - you can swap libraries that are compatible with the "function specification"
139166
140167 ---
168 +class: center, info
141169
142-## simple functional
170 +## simple patterns based on function signatures
143171
172 +---
173 +class: info
174 +
144175 what if i told you...
145176
146-that you only needed _plain functions and objects_?
177 +<img src="./morpheus-cat.png" height="400" />
147178
179 +that you only needed _functions and objects_?
180 +
148181 ???
149182
150183 - no fancy syntax necessary
151184 - less language clutter
152185 - how can we apply this pattern to the full stack?
153186
154187 ---
188 +class: success
155189
156-## just a function
190 +### just a function
157191
158192 ```js
159193 function fn (options) { return value }
160194 ```
@@ -163,10 +197,11 @@
163197 const fn = (...args) => ({ [key]: value })
164198 ```
165199
166200 ---
201 +class: info
167202
168-## sync function signals
203 +### sync function signals
169204
170205 with a sync function, there are two possible signals:
171206
172207 1. value: `return value`
@@ -186,11 +221,17 @@
186221 }
187222 ```
188223
189224 ---
225 +class: center, info
190226
191-## es modules
227 +## modules
192228
229 +---
230 +class: danger
231 +
232 +### es modules
233 +
193234 ```js
194235 import thing from 'module'
195236
196237 export default thing
@@ -215,10 +256,11 @@
215256 - breaks CommonJS code with default
216257 - yes, i'm bitter about this, i've lost many hours debugging broken code, only to realize the module author published a patch version that broke the CommonJS exports
217258
218259 ---
260 +class: success
219261
220-## or node modules
262 +### node modules
221263
222264 also known as "CommonJS"
223265
224266 ```js
@@ -242,12 +284,17 @@
242284 - run code in JavaScript interpreter
243285 - capture result of `module.exports` variable
244286 - when i started using Node.js from Python, `require`-as-a-function is what excited me the most
245287 - so yes, i'm somewhat bitter that now JavaScript is adopting the same syntax as Python
288 +---
289 +class: center, info
246290
291 +## dom elements
292 +
247293 ---
294 +class: danger
248295
249-## jsx
296 +### jsx
250297
251298 ```js
252299 import React from 'react'
253300
@@ -274,10 +321,11 @@
274321 - "why can't i use `if () { first } else { second }`?
275322 - can only use expressions, not statements
276323
277324 ---
325 +class: success
278326
279-## or hyperscript
327 +### hyperscript
280328
281329 ```js
282330 const h = require('react-hyperscript')
283331
@@ -296,10 +344,11 @@
296344
297345 - `React.createElement` is basically a strict hyperscript without the class/id sugar
298346
299347 ---
348 +class: success
300349
301-## or hyperx
350 +### hyperx
302351
303352 ```js
304353 const hyperx = require('hyperx')
305354 const React = require('react')
@@ -324,13 +373,17 @@
324373
325374 - similar to JSX, but uses existing language features: tagged template string
326375
327376 ---
377 +class: center, info
328378
329-## promise
379 +## eventual value
330380
331-a "promise" is an eventual value
381 +---
382 +class: danger
332383
384 +### promise
385 +
333386 ```js
334387 const promise = new Promise((resolve, reject) => {
335388 // do stuff...
336389 resolve(value)
@@ -338,8 +391,14 @@
338391 reject(error)
339392 }
340393 ```
341394
395 +```js
396 +promise
397 + .then(value => console.log(value))
398 + .catch(err => console.error(value))
399 +```
400 +
342401 ???
343402
344403 ```js
345404 module.exports = fetchCats
@@ -351,10 +410,11 @@
351410 })
352411 ```
353412
354413 ---
414 +class: success
355415
356-## continuable
416 +### continuable
357417
358418 a "continuable" is a function that takes a single argument, a node-style error-first callback
359419
360420 ```js
@@ -389,10 +449,11 @@
389449 })
390450 ```
391451
392452 ---
453 +class: info
393454
394-## async errors
455 +### async errors
395456
396457 with a node-style error-first callback, there are three possible signals:
397458
398459 1. value: `cb(null, value)`
@@ -405,11 +466,76 @@
405466 - promises wrap all your handlers in a `try` / `catch`, so even if you have a different opinion about error handling, promises will force it's opinion on you
406467 - yes, i'm bitter about this, i've lost many hours trying to figure out where my errors went
407468
408469 ---
470 +class: center, info
409471
410-## pull streams
472 +## reactive values
411473
474 +---
475 +class: danger
476 +
477 +### es observables
478 +
479 +https://tc39.github.io/proposal-observable/
480 +
481 +???
482 +
483 +too much detail to explain here
484 +
485 +- https://github.com/tc39/proposal-observable
486 +
487 +---
488 +class: success
489 +
490 +### observ-ables
491 +
492 +reactive values using only functions!
493 +
494 +> - `thing()` gets the value
495 +> - `thing.set(...)` sets the value
496 +> - `thing(function (value) { ... })` listens to the value.
497 +
498 +???
499 +
500 +- [`observ`](https://github.com/Raynos/observ)
501 +- [`observable`](https://github.com/dominictarr/observable)
502 +- [`push-stream`](https://github.com/ahdinosaur/push-stream)
503 +- [`mutant`](https://github.com/mmckegg/mutant)
504 +
505 +---
506 +class: center, info
507 +
508 +## values over time
509 +
510 +---
511 +class: danger
512 +
513 +### node streams
514 +
515 +https://nodejs.org/api/stream.html
516 +
517 +???
518 +
519 +- https://github.com/substack/stream-handbook
520 +- https://github.com/workshopper/stream-adventure
521 +
522 +---
523 +class: danger
524 +
525 +### whatwg streams
526 +
527 +https://streams.spec.whatwg.org/
528 +
529 +???
530 +
531 +- https://github.com/whatwg/streams
532 +
533 +---
534 +class: success
535 +
536 +### pull streams
537 +
412538 async streams using only functions!
413539
414540 ```js
415541 pull(source(), through(), sink())
@@ -419,33 +545,37 @@
419545 - unbuffered by default
420546 - pipeline error propogation
421547 - source and sink back-pressure
422548
423-
424549 ???
425550
551 +pull streams could be its own talk, going to be a quick intro
552 +
426553 - [history of streams](http://dominictarr.com/post/145135293917/history-of-streams)
427554 - [pull stream examples](https://github.com/dominictarr/pull-stream-examples)
428555 - [pull streams intro](http://dominictarr.com/post/149248845122/pull-streams-pull-streams-are-a-very-simple)
429556 - [pull stream](https://pull-stream.github.io/)
430557 - [pull stream workshop](https://github.com/pull-stream/pull-stream-workshop)
431558
432-compare with
559 +---
560 +class: success
433561
434-- node streams:
435- - https://nodejs.org/api/stream.html
436- - https://github.com/substack/stream-handbook
437- - https://github.com/workshopper/stream-adventure
438-- wg-stream
439- - https://streams.spec.whatwg.org/
440- - https://github.com/whatwg/streams
562 +##### source usage
441563
564 +```js
565 +const source = values([0, 1, 2, 3])
566 +
567 +source(null, (err, value) {
568 + console.log('first value:', value)
569 +})
570 +// first value: 0
571 +```
572 +
442573 ---
574 +class: success
443575
444-### source
576 +##### source example
445577
446-example:
447-
448578 ```js
449579 function values (array) {
450580 var i = 0
451581 return (abort, callback) => {
@@ -458,31 +588,34 @@
458588 }
459589 }
460590 ```
461591
462-usage:
463-
464-```js
465-const source = values([0, 1, 2, 3])
466-
467-source(null, (err, value) {
468- console.log('first value:', value)
469-})
470-// first value: 0
471-```
472-
473592 ???
474593
475594 - look ma, just functions!
476595 - yes, we are using callbacks even for synchronous results
477596 - much faster this way, no reason to delay til next tick
478597
479598 ---
599 +class: success
480600
481-### sink
601 +#### sink usage
482602
483-example:
603 +```js
604 +const source = values([0, 1, 2, 3])
484605
606 +log(source)
607 +// 0
608 +// 1
609 +// 2
610 +// 3
611 +```
612 +
613 +---
614 +class: success
615 +
616 +#### sink example
617 +
485618 ```js
486619 function log (read) {
487620 read(null, function next (err, data) {
488621 if (err) return console.log(err)
@@ -492,20 +625,8 @@
492625 })
493626 }
494627 ```
495628
496-usage:
497-
498-```js
499-const source = values([0, 1, 2, 3])
500-
501-log(source)
502-// 0
503-// 1
504-// 2
505-// 3
506-```
507-
508629 ???
509630
510631 with continuables:
511632
@@ -522,13 +643,24 @@
522643 }
523644 ```
524645
525646 ---
647 +class: success
526648
527-### through
649 +#### through usage
528650
529-example:
651 +```js
652 +const source = values([0, 1, 2, 3])
653 +const double = map(x => x * 2)
530654
655 +log(double(source))
656 +```
657 +
658 +---
659 +class: success
660 +
661 +#### through example
662 +
531663 ```js
532664 function map (mapper) {
533665 // a sink function: accept a source
534666 return function (read) {
@@ -544,38 +676,41 @@
544676 }
545677 }
546678 ```
547679
548-usage:
680 +---
681 +class: success
549682
550-```js
551-const source = values([0, 1, 2, 3])
552-const double = map(x => x * 2)
683 +#### wild pull streams
553684
554-log(double(source))
555-```
685 +ecosystem of modules: [pull-stream.github.io](https://pull-stream.github.io)
556686
557----
558-
559-### real pull streams
560-
561687 ```
562-const pull = require('pull-stream')
563-
688 +// parse a csv file
564689 pull(
565- pull.values([0, 1, 2, 3]),
566- pull.map(x => x * 2),
567- pull.log()
690 + File(filename),
691 + CSV(),
692 + pull.drain(console.log)
568693 )
694 +
695 +function CSV () {
696 + return pull(
697 + Split(), // defaults to '\n'
698 + pull.map(function (line) {
699 + return line.split(',')
700 + })
701 + )
702 +}
569703 ```
570704
571705 ???
572706
573-- check out the ecosystem of modules at [pull-stream.github.io](https://pull-stream.github.io)
707 +obviously you don't want to re-implement simple streams from scratch all the time
574708
575709 ---
710 +class: info
576711
577-### pull stream errors
712 +#### pull stream errors
578713
579714 with a pull stream source callback, there are four possible signals:
580715
581716 1. value: `cb(null, value)`
@@ -587,24 +722,38 @@
587722
588723 - both the source and sink can signal back-pressure ("hey i'm busy") by not calling the respective callback
589724
590725 ---
726 +class: center, info
591727
592-## luddite.js benefits
728 +## why should you be a JavaScript luddite?
593729
594730 ---
731 +class: success
595732
596733 ### better performance
597734
598735 software performance is less about gaining muscle, more about losing weight
599736
737 +???
738 +
739 +- code runs faster when it does less
740 +- if you don't use fancy syntax (jsx, etc), you don't need fancy build steps
741 +
600742 ---
743 +class: success
601744
602745 ### easier to describe
603746
604747 specification is a function signature, not a complex state machine
605748
749 +???
750 +
751 +- clear inputs and outputs
752 +- no hidden state to manage
753 +
606754 ---
755 +class: success
607756
608757 ### easier to understand
609758
610759 less "snippet-driven development"
@@ -623,26 +772,37 @@
623772 - https://alistapart.com/column/douglas-engelbart
624773 - http://www.dougengelbart.org/pubs/augment-3906.html
625774 - http://99percentinvisible.org/episode/of-mice-and-men/
626775
776 +
777 + His system, called NLS, showed actual instances of, or precursors to, hypertext, shared screen collaboration, multiple windows, on-screen video teleconferencing, and the mouse as an input device.
778 +
779 + He intended to boost collective intelligence and enable knowledge workers to think in powerful new ways, to collectively solve urgent global problems.
780 +
781 +> The pendulum has swung about as far as it can toward the consumerization of computing technology, in which everything should be immediately intuitive and nothing should require learning, training, or practice. Engelbart’s vision was on the opposite end of that pendulum swing—he believed that the power of these tools came with inherent complexity.
782 +
627783 ---
784 +class: center, info
628785
629786 ## stories
630787
631788 ---
789 +class: warning
632790
633791 ### story: catstack
634792
635793 build a framework from scratch, alone
636794
637-<img src="./catstack.jpg" height="450" class="center" />
795 +<img src="./catstack.jpg" height="350" class="center" />
638796
639797 ???
640798
641-reinvent all the wheels!
799 +reinvent every wheel possible!
642800
643801 https://github.com/root-systems/catstack
644802
803 +i did it, but it was unsustainable, unable to transfer context to team
804 +
645805 - ui views
646806 - hyps
647807 - hyper-fela
648808 - ui state
@@ -665,8 +825,9 @@
665825 - module system
666826 - command-line tasks
667827
668828 ---
829 +class: warning
669830
670831 ### learning:
671832
672833 yay, reinventing wheels for fun and learning
@@ -679,42 +840,49 @@
679840
680841 - no better way to learn how systems work than by building them from scratch
681842 - own your dependencies, don't consume them for granted
682843 - provide consistent flavoring across subsystems
844 +- marginally better than other libraries
683845
684846 cons
685847
686848 - easy to become isolated
687849 - if you aren't enough to become popular, you're alone
688850 - spreads you thin
689- - hard to work on what you want, because you have to fix something else
851 + - hard to work on what you can do best, because you have to spend limited resources on your marginally better stack
690852 - easy to rabbit hole
691853 - probably miss the long tail: i18n, accessibility, tests
692854 - always doing maintenance
693855
694856 ---
857 +class: info
695858
696859 ### revised: dogstack
697860
698861 choose your battles
699862
700-<img src="./dogstack.jpg" height="450" class="center" />
863 +<img src="./dogstack.jpg" height="350" class="center" />
701864
702865 ???
703866
867 +focus on what you do best
868 +
869 +delegates parts where you are only marginally better
870 +
704871 http://dogstack.js.org/
705872
706873 ---
874 +class: success
707875
708876 ### story: patch ecosystem
709877
710-bring-your-own-framework potluck
878 +bring-your-own-JavaScript potluck
711879
712-<img src="./patchwork.png" height="400" class="center" />
880 +<img src="./patchwork.png" height="350" class="center" />
713881
714882 ???
715883
716-build an app with others, bring-your-own framework
884 +build an app with others, bring your own JavaScript opinions
717885
718886 references:
719887
720888 - https://github.com/ssbc/patchcore
@@ -722,23 +890,43 @@
722890 - https://github.com/ssbc/patchbay
723891 - https://github.com/ssbc/patchlite
724892
725893 ---
894 +class: success, center
726895
727-### learning: somebody should...
896 +#### offline social media
728897
729-> if you see something that needs doing, it's your job to do
898 +<img src="./patchwork-screenshot.jpg" height="500" class="center" />
730899
900 +---
901 +class: success, center
902 +
903 +#### git projects
904 +
905 +<img src="./git-ssb-screenshot.png" height="450" class="center" />
906 +
907 +---
908 +class: success
909 +
910 +### learning: mad science works!
911 +
912 +follow your passion
913 +
914 +find others who share your passion
915 +
731916 ???
732917
733-- collaborate with active listening and empathy
918 +- somebody should: if you see something that needs doing, it's your job to do
919 +- find ways to collaborate with active listening and empathy
734920 - mad science: find something worth doing, do it, publish, repeat
735921
736922 ---
923 +class: center, info
737924
738925 ## conclusion
739926
740927 ---
928 +class: info
741929
742930 ### so what
743931
744932 everyone has opinions.
@@ -746,27 +934,79 @@
746934 this one is mine. :3
747935
748936 ???
749937
938 +as my Mom always says:
939 +
940 +> it's not about being right, it's about being successful
941 +
750942 takaways
751-
752943 - izs pants post: https://groups.google.com/forum/#!msg/nodejs/MWaivVTirPY/0pnRjKsggkIJ
753944 - everyone has opinions, be aware of yours' and others'
754945 - when you come over to someone's house, be polite and respect their opinions
755946 - don't force your opinions on others
756947 - share what you're passionate about
757948 - avoid persuading anyone that your way is better
758949 - the luddite.js way is just another opinion, not better or worse than yours
759950
951 +## aids
952 +
953 +- [eating your own dog food](https://en.wikipedia.org/wiki/Eating_your_own_dog_food)
954 +- [mad science method](https://github.com/ahdinosaur/mad-science-handbook/blob/master/collaboration.md#the-mad-science-cycle)
955 +- [do-ocracy](https://communitywiki.org/wiki/DoOcracy)
956 +- marathon: keep a slow & steady pace one step at a time
957 +- if you see a job that needs doing, it's your job to do (do-ocrarcy)
958 +- too much sugar is bad for your health (simple interfaces)
959 +
960 +## blocks
961 +
962 +- cave method: try to design or implement the _perfect_ system before sharing it
963 +- [design by committee](https://en.wikipedia.org/wiki/Design_by_committee)
964 +- sprint: hype, mania, and burn-out
965 +- [waterfall design](https://en.wikipedia.org/wiki/Waterfall_model)
966 +
967 +---
968 +class: info
969 +
760970 ### all the "standards"
761971
762972 make up your own "standards"!
763973
764974 you have just as much a right to make the next JavaScript standard as anyone else.
765975
976 +???
977 +
978 +at the end of the day, standards are just somebody's opinion.
979 +
766980 ---
981 +class: info
767982
983 +## questions?
984 +
985 +---
986 +class: success
987 +
768988 ## thanks!
769989
770-<3
990 +i appreciate the gift of your attention. ♥
771991
772-https://dinosaur.is
992 +<img src="./follow_your_dreams.png" height="300" class="center" />
993 +
994 +<!-- image credit to @substack -->
995 +
996 +???
997 +
998 +## references
999 +
1000 +- [es2040](https://github.com/ahdinosaur/es2040)
1001 +- [Art of Node](https://github.com/maxogden/art-of-node)
1002 +- [Art of I/O](http://ioschool.is/art-of-io/sessions/0/?notes=true)
1003 +- [Tiny Guide to Non Fancy Node](https://github.com/yoshuawuyts/tiny-guide-to-non-fancy-node)
1004 +
1005 +## luddite.js apps
1006 +
1007 +- https://webtorrent.io/
1008 +- http://standardjs.com/
1009 +- https://peermaps.github.io/
1010 +- http://loopjs.com/
1011 +- https://scuttlebutt.nz/
1012 +- https://choo.io/
index.cssView
@@ -77,4 +77,30 @@
7777
7878 .center {
7979 margin: 0 auto;
8080 }
81 +
82 +footer {
83 + position: absolute;
84 + font-size: 1.4rem;
85 + bottom: 12px;
86 + left: 0;
87 + right: 0;
88 + color: #808080;
89 + text-align: center;
90 +}
91 +
92 +.success {
93 + border-top: solid 10px #449d44;
94 +}
95 +
96 +.info {
97 + border-top: solid 10px #5BC0DE;
98 +}
99 +
100 +.warning {
101 + border-top: solid 10px #F0AD4E;
102 +}
103 +
104 +.danger {
105 + border-top: solid 10px #D9534F;
106 +}
index.htmlView
The diff is too large to show. Use a local git client to view these changes.
Old file size: 892365 bytes
New file size: 22601 bytes
package.jsonView
@@ -4,9 +4,9 @@
44 "description": "Luddite.js, or how to write quality JavaScript apps using only functions and objects.",
55 "main": "index.js",
66 "scripts": {
77 "present": "ecstatic .",
8- "build": "markdown-to-slides -t 'Luddite.js' README.md -o index.html -s index.css -j index.js -i",
8 + "build": "markdown-to-slides -t 'Luddite.js' README.md -o index.html -s index.css -j index.js",
99 "watch": "npm run build -- -w",
1010 "livereload": "wtch -d . -e html,css,png,gif,jpg | garnish --level debug",
1111 "static": "ecstatic-lr .",
1212 "start": "npm-run-all -p watch livereload static",
follow_your_dreams.png
follow_your_dreams.png
git-ssb-screenshot.png
git-ssb-screenshot.png
moprheus-cat.png
moprheus-cat.png
morpheus-cat.png
morpheus-cat.png
patchwork-screenshot.jpg
patchwork-screenshot.jpg
rabbit-hole.jpg
rabbit-hole.jpg
root-systems.jpg
root-systems.jpg
white-rabbit.jpg
white-rabbit.jpg

Built with git-ssb-web