Commit 3b1d8e7137177237163bc7ba4e6956d3d3acb47c
initial commit
Gwen committed on 9/15/2016, 7:06:59 PMFiles changed
.gitignore | added |
build.js | added |
index.js | added |
layouts/blog.jade | added |
layouts/index.jade | added |
layouts/layout.jade | added |
layouts/navbar.jade | added |
layouts/page.jade | added |
layouts/photos.jade | added |
layouts/post.jade | added |
package.json | added |
readme.md | added |
src/2007-grh.jpg | added |
src/blog.md | added |
src/blogtobook.jpg | added |
src/cooking-channel.png | added |
src/d-tarr-home.jpg | added |
src/d-tarr-standing-desk.jpg | added |
src/d-tarr.jpg | added |
src/dorky-gb.jpg | added |
src/dt-interview.md | added |
src/dt.md | added |
src/favicon.png | added |
src/firstmxtrip.md | added |
src/fonts/opensans-bold-webfont.ttf | added |
src/fonts/opensans-italic-webfont.ttf | added |
src/fonts/opensans-light-webfont.ttf | added |
src/fonts/opensans-regular-webfont.ttf | added |
src/g.jpg | added |
src/grh-2000.jpg | added |
src/grh.md | added |
src/key.txt | added |
src/reserva.css | added |
src/roberto-2013-grh-rendering.jpg | added |
src/simplicitease.css | added |
src/static/reserva.css | added |
src/tiny-g.png | added |
build.js | ||
---|---|---|
@@ -1,0 +1,37 @@ | ||
1 … | +var metalsmith = require('metalsmith'), | |
2 … | + markdown = require('metalsmith-markdown'), | |
3 … | + layouts = require('metalsmith-layouts'), | |
4 … | + permalinks = require('metalsmith-permalinks'), | |
5 … | + collections = require('metalsmith-collections'), | |
6 … | + moment = require('moment'); | |
7 … | + | |
8 … | +metalsmith(__dirname) | |
9 … | + .metadata({ | |
10 … | + site: { | |
11 … | + title: 'Gwen Bell | Love & Code | Mexico', | |
12 … | + url: 'http://gwenbell.com/', | |
13 … | + author: 'Gwendolyn Bell', | |
14 … | + photo: 'g.jpg' | |
15 … | + } | |
16 … | + }) | |
17 … | + .use(markdown()) | |
18 … | + .use(collections({ | |
19 … | + blog: { | |
20 … | + pattern: './blog/*.md', | |
21 … | + sortBy: 'date', | |
22 … | + reverse: true | |
23 … | + }, | |
24 … | + })) | |
25 … | + .use(permalinks({ | |
26 … | + pattern: ':collections/:title', | |
27 … | + relative: false | |
28 … | + })) | |
29 … | + .use(layouts({ | |
30 … | + engine: 'jade', | |
31 … | + moment | |
32 … | + })) | |
33 … | + .destination('./build') | |
34 … | + .build(function(err) { | |
35 … | + if (err) {throw err;} | |
36 … | + else { console.log('success. mezcalle is built.'); } | |
37 … | + }); |
index.js | ||
---|---|---|
@@ -1,0 +1,105 @@ | ||
1 … | +var express = require('express'); | |
2 … | +var avatar = require('ssb-avatar'); | |
3 … | +var client = require('ssb-client'); | |
4 … | +var pull = require('pull-stream'); | |
5 … | +var moment = require('moment'); | |
6 … | +var markdown = require('marked'); | |
7 … | +var nm = require('nodemailer'); | |
8 … | +var bodyParser = require('body-parser'); | |
9 … | + | |
10 … | +var app = express(); | |
11 … | +app.set('view engine', 'jade'); | |
12 … | +app.set('views', './layouts'); | |
13 … | + | |
14 … | +app.use(bodyParser.json()); | |
15 … | +app.use(bodyParser.urlencoded({extended: true})); | |
16 … | + | |
17 … | +const me = '@ya/sq19NPxRza5xtoqi9BilwLZ7HgQjG3QpcTRnGgWs=.ed25519' | |
18 … | +const site = 'Gwen Bell'; | |
19 … | + | |
20 … | +app.get('/', function (req, res) { | |
21 … | + client(function (err, sbot) { | |
22 … | + if (err) { | |
23 … | + throw err; | |
24 … | + } | |
25 … | + avatar(sbot, me, me, function (err, avatar){ | |
26 … | + if (err) { | |
27 … | + throw err; | |
28 … | + } | |
29 … | + name = avatar.name; | |
30 … | + image = avatar.image; | |
31 … | + }) | |
32 … | + | |
33 … | + pull( | |
34 … | + sbot.query.read({query: [{$filter: { value: { author: me, content: {type: 'pin'}}}}], limit: 1, reverse: true}), | |
35 … | + pull.drain(function (data) { | |
36 … | + getpin = data; | |
37 … | + pull( | |
38 … | + sbot.query.read({query: [{$filter: { key: getpin.value.content.link}}]}), | |
39 … | + pull.drain(function (data){ | |
40 … | + pinned = data; | |
41 … | + }) | |
42 … | + ) | |
43 … | + }) | |
44 … | + ) | |
45 … | + pull( | |
46 … | + sbot.query.read({query: [{$filter: { value: { author: me, content: {type: 'post'}}}}], limit: 1, reverse: true}), | |
47 … | + pull.drain(function (data) { | |
48 … | + post = data; | |
49 … | + }) | |
50 … | + ) | |
51 … | + pull( | |
52 … | + sbot.query.read({query: [{$filter: { value: { author: me, content: {type: 'vote'}}}}], limit: 1, reverse: true}), | |
53 … | + pull.drain(function (data) { | |
54 … | + vote = data; | |
55 … | + pull( | |
56 … | + sbot.query.read({query: [{$filter: { key: data.value.content.vote.link}}]}), | |
57 … | + pull.drain(function (reblog) { | |
58 … | + avatar(sbot, me, reblog.value.author, function (err, avatar){ | |
59 … | + if (err) { | |
60 … | + throw err; | |
61 … | + } | |
62 … | + reauthor = avatar; | |
63 … | + gotPost(); | |
64 … | + }) | |
65 … | + redo = reblog; | |
66 … | + }) | |
67 … | + ) | |
68 … | + }) | |
69 … | + ) | |
70 … | + pull( | |
71 … | + sbot.query.read({query: [{$filter: { value: { author: me, content: {type: 'git-update'}}}}], limit: 1, reverse: true}), | |
72 … | + pull.drain(function (data) { | |
73 … | + gits = data; | |
74 … | + }) | |
75 … | + ) | |
76 … | + }); | |
77 … | + function gotPost() { | |
78 … | + res.render('index', { title: site, markdown, moment}); | |
79 … | + } | |
80 … | +}); | |
81 … | + | |
82 … | +app.post('/send', function (req, res) { | |
83 … | + var name = req.body.nombre; | |
84 … | + var email = req.body.elmail; | |
85 … | + var website = req.body.siteurl; | |
86 … | + var date = moment().format('MMMM D, YYYY'); | |
87 … | + var str = name + " <" + email + "> " + website + " - " + date; | |
88 … | + | |
89 … | + var transporter = nm.createTransport(); | |
90 … | + | |
91 … | + transporter.sendMail({ | |
92 … | + from: email, | |
93 … | + to: 'gwen@gwenbell.com', | |
94 … | + subject: 'New signup!', | |
95 … | + text: str | |
96 … | + }); | |
97 … | + res.redirect('http://gwenbell.com/'); | |
98 … | +}); | |
99 … | + | |
100 … | +app.use(express.static('./../books/build')) | |
101 … | +app.use(express.static('/static/reserva')) | |
102 … | +app.use(express.static('build')) | |
103 … | + | |
104 … | +app.listen(80); | |
105 … | +console.log('Listening at http://localhost:80/'); |
layouts/blog.jade | ||
---|---|---|
@@ -1,0 +1,13 @@ | ||
1 … | +extends layout | |
2 … | + | |
3 … | +block content | |
4 … | + h2 #{title} | |
5 … | + ul | |
6 … | + each blog in collections.blog | |
7 … | + li | |
8 … | + a(href="/" + blog.path + "/")= blog.title | |
9 … | + span - #{moment(blog.date).format('MMMM Do YYYY')} | |
10 … | + div!= contents | |
11 … | + <a href="http://gwenbell.fetchapp.com/sell/e3547c1e"><img src="/blogtobook.jpg" class="profile" style="width: 30%; float:left;"></a> | |
12 … | + h2 Buy <a href="http://gwenbell.fetchapp.com/sell/e3547c1">Blog to Book</a> for $35, get 25 new pieces only available in book format. Each time I hit the tenth new piece added, the price goes up by a dollar(as of 2016-09-16 2/10 are done). For those of you who've already bought, you get all new pieces included in the current price: 35. | |
13 … | + |
layouts/index.jade | ||
---|---|---|
@@ -1,0 +1,63 @@ | ||
1 … | +extends layout | |
2 … | + | |
3 … | +block content | |
4 … | + | |
5 … | + a(href="/"): h1= title | |
6 … | + h2 Hi & welcome. This site reflects a living, breathing application built on a <a href="/dt-interview">distributed database called scuttlebot</a>. You might think of what you see on this site as a healthy response to what I view as unhealthy centralized social networking: | |
7 … | + | |
8 … | + div(class='message') | |
9 … | + p.small.ri pinned | |
10 … | + img(src='https://evbogue.com/ws/blobs/get/#{image}' class='avatar') | |
11 … | + p <a href='/' target='_parent'>@#{name}</a> | |
12 … | + != markdown(pinned.value.content.text) | |
13 … | + span.date #{moment(pinned.value.timestamp).fromNow()} | |
14 … | + div(class='message') | |
15 … | + img(src='https://evbogue.com/ws/blobs/get/#{image}' class='avatar') | |
16 … | + p <a href='/' target='_parent'>@#{name}</a> | |
17 … | + != markdown(post.value.content.text) | |
18 … | + span.date #{moment(post.value.timestamp).fromNow()} | |
19 … | + div(class='message') | |
20 … | + img(src='https://evbogue.com/ws/blobs/get/#{image}' class='avatar') | |
21 … | + p <a href='/' target='_parent'>@#{name}</a> dug #{vote.value.content.vote.link} | |
22 … | + span.date #{moment(vote.value.timestamp).fromNow()} | |
23 … | + div.message | |
24 … | + img(src='https://evbogue.com/ws/blobs/get/#{reauthor.image}' class='avatar') | |
25 … | + p @<a href='#{redo.value.author}'>#{reauthor.name}</a> said | |
26 … | + != markdown(redo.value.content.text) | |
27 … | + span.date #{moment(redo.value.timestamp).fromNow()} | |
28 … | + div(class='message') | |
29 … | + img(src='https://evbogue.com/ws/blobs/get/#{image}' class='avatar') | |
30 … | + p <a href='/' target='_parent'>@#{name}</a> pushed a git commit to #{gits.value.content.repo}<br /> | |
31 … | + span.date #{moment(gits.value.timestamp).fromNow()} | |
32 … | + <br /> | |
33 … | + <img src="/g.jpg" class="profile" style="width:150px; float:left;" /><h2 id="about"><a href="#about">About</a></h2> <p>Gwen(dolyn) Bell is a Mexico City, Mexico based web developer and technical writer. She's lived in Mexico on and off since her <a href="firstmxtrip">first trip to Mexico in 2006</a>. When she first she told everyone she knew she intended to stay. The commitment took root.</p> | |
34 … | + <p>Gwen practices Stoicism and yoga, takes long walks around Mexico City and builds for the future where the web is decentralized, distributed, cryptographically secure and more home-grown than corporate. She intends to one day build the <a href="/grh">GRH</a>, speak fluent Spanish and drink...in Oaxaca where it was born... the <i>pura mezcal</i>, <i>madre cuixhe</i>.</p> | |
35 … | + <br /> | |
36 … | + <h2 id="details"><a href="#details">Technical Details</a></h2> | |
37 … | + <ul> | |
38 … | + <li>Site hand-built by gb</li> | |
39 … | + <li>Built with Arch Linux local and VPS</li> | |
40 … | + <li>Rocks Git for version control</li> | |
41 … | + <li>Is an active sbot instance</li> | |
42 … | + <li>Built with Node.js</li> | |
43 … | + <li>Pull requests accepted</li> | |
44 … | + </ul> | |
45 … | + <br /> | |
46 … | + <h2 id="contact"><a href="#contact">Contact</a></h2> | |
47 … | + <ul> | |
48 … | + <li>Email: gwen@gwenbell.com <a href="/key.txt">PGP</a></li> | |
49 … | + <li>sbot: gb</li> | |
50 … | + <li><a href="http://git-ssb.celehner.com/%25sa%2FOgrHPhHCw8V0x2wrIgadRJANxQAKY6V9AP%2FF4iyw%3D.sha256"> Issues tracked</a> via pull request</li> | |
51 … | + </ul> | |
52 … | + <h2 id="subscribe"><a href="#subscribe">Subscribe</a></h2> | |
53 … | + form(name='contact', action='/send', method='post') | |
54 … | + input(type='text', name='nombre', placeholder='What name should I call you?') | |
55 … | + br | |
56 … | + input(type='text', name='elmail', placeholder='you@your email address dot com') | |
57 … | + br | |
58 … | + input(type='text', name='siteurl', placeholder='What is your site address?') | |
59 … | + br | |
60 … | + button GO | |
61 … | + br | |
62 … | + br | |
63 … | + hr |
layouts/layout.jade | ||
---|---|---|
@@ -1,0 +1,20 @@ | ||
1 … | +doctype html | |
2 … | + | |
3 … | +html | |
4 … | + head | |
5 … | + title= title | |
6 … | + meta(name='viewport', content='width=device-width') | |
7 … | + meta(name='viewport', content='initial-scale=1.0') | |
8 … | + meta(name='viewport', content='maximum-scale=1') | |
9 … | + link(rel="shortcut icon", href="/favicon.png") | |
10 … | + link(rel='stylesheet' href='/static/reserva.css') | |
11 … | + link(rel='stylesheet' href='/simplicitease.css') | |
12 … | + // link(rel='stylesheet' href='/jenesaisquoi.css') | |
13 … | + body | |
14 … | + include navbar.jade | |
15 … | + .contain | |
16 … | + .twelve.col | |
17 … | + .article | |
18 … | + block content | |
19 … | + <h6 id="contact"><a href="http://gwenbell.com/#contact"><b>gwen@gwenbell dot com 2016</b></p></h6> | |
20 … | + |
layouts/navbar.jade | ||
---|---|---|
@@ -1,0 +1,10 @@ | ||
1 … | +.navbar | |
2 … | + .contain | |
3 … | + .twelve.col | |
4 … | + ul | |
5 … | + li <a href="/">Gwen Bell</a> | |
6 … | + li <a href="http://gwenbell.com/#about">About</a> | |
7 … | + li <a href="http://gwenbell.com//blog">Blog</a> | |
8 … | + li <a href="http://gwenbell.com/#contact">Contact</a> | |
9 … | + li <a href="http://gwenbell.com/#details">Technical Details</a> | |
10 … | + li <a href="http://gwenbell.com/#subscribe">Subscribe</a> |
layouts/page.jade | ||
---|---|---|
@@ -1,0 +1,7 @@ | ||
1 … | +extends layout | |
2 … | + | |
3 … | +block content | |
4 … | + | |
5 … | + a(href=""): h1 #{title} | |
6 … | + div!= contents | |
7 … | + |
layouts/photos.jade | ||
---|---|---|
@@ -1,0 +1,12 @@ | ||
1 … | +extends layout | |
2 … | + | |
3 … | +block content | |
4 … | + | |
5 … | + h2 #{title} | |
6 … | + ul | |
7 … | + each photos in collections.photos | |
8 … | + li | |
9 … | + a(href="/" + photos.path + "/")= photos.title | |
10 … | + span - #{moment(blog.date).format('MMMM Do YYYY')} | |
11 … | + div!= contents | |
12 … | + |
layouts/post.jade | ||
---|---|---|
@@ -1,0 +1,11 @@ | ||
1 … | +extends layout | |
2 … | + | |
3 … | +block content | |
4 … | + | |
5 … | + h2= title | |
6 … | + p(style='color:#666;')= moment(date).format('MMMM Do YYYY') | |
7 … | + div!= contents | |
8 … | + if previous | |
9 … | + p(style='text-align: right; float: right; font-color: red;'): a(href="/#{previous.path}/") #{previous.title + '→'} | |
10 … | + if next | |
11 … | + p(style='text-align: left; float: left;'): a(href="/#{next.path}/") #{'← ' + next.title} |
package.json | ||
---|---|---|
@@ -1,0 +1,26 @@ | ||
1 … | +{ | |
2 … | + "name": "mezcalle", | |
3 … | + "version": "1.0.0", | |
4 … | + "description": "blog", | |
5 … | + "main": "index.js", | |
6 … | + "author": "gwen bell", | |
7 … | + "license": "MIT", | |
8 … | + "dependencies": { | |
9 … | + "body-parser": "^1.15.2", | |
10 … | + "express": "^4.14.0", | |
11 … | + "jade": "^1.11.0", | |
12 … | + "koa": "^1.2.0", | |
13 … | + "koa-static": "^2.0.0", | |
14 … | + "marked": "^0.3.5", | |
15 … | + "metalsmith": "^2.1.0", | |
16 … | + "metalsmith-collections": "^0.7.0", | |
17 … | + "metalsmith-layouts": "^1.6.5", | |
18 … | + "metalsmith-markdown": "^0.2.1", | |
19 … | + "metalsmith-permalinks": "^0.5.0", | |
20 … | + "moment": "^2.13.0", | |
21 … | + "nodemailer": "^2.5.0", | |
22 … | + "pull-stream": "^3.4.3", | |
23 … | + "ssb-avatar": "^0.1.0", | |
24 … | + "ssb-client": "^4.0.3" | |
25 … | + } | |
26 … | +} |
readme.md | ||
---|---|---|
@@ -1,0 +1,4 @@ | ||
1 … | +### title: ReadMe | |
2 … | +#### date: 2016-09-15 | |
3 … | + | |
4 … | +Personal site for Gwen Bell. I build with Node.js, commit with Git and push to git-ssb-web. Merge requests welcome. |
src/2007-grh.jpg |
---|
src/blogtobook.jpg |
---|
src/cooking-channel.png |
---|
src/d-tarr-home.jpg |
---|
src/d-tarr-standing-desk.jpg |
---|
src/d-tarr.jpg |
---|
src/dorky-gb.jpg |
---|
src/dt-interview.md | ||
---|---|---|
@@ -1,0 +1,85 @@ | ||
1 … | +--- | |
2 … | +title: The History of Scuttlebot with Dominic Tarr | |
3 … | +date: 2016-09-01 | |
4 … | +collection: blog | |
5 … | +layout: post.jade | |
6 … | +--- | |
7 … | + | |
8 … | +<img src="/d-tarr.jpg" class="profile full"> | |
9 … | + | |
10 … | +> Scuttlebot is an open source peer-to-peer log store used as a database, identity provider, and messaging system. It has: Global replication, File-synchronization, End-to-end encryption. Scuttlebot behaves just like a Kappa Architecture DB. In the background, it syncs with known peers. Peers do not have to be trusted, and can share logs and files on behalf of other peers, as each log is an unforgeable append-only message feed. This means Scuttlebots comprise a global gossip-protocol mesh without any host dependencies. [Dominic Tarr on Scuttlebot](https://github.com/ssbc/scuttlebot) | |
11 … | + | |
12 … | +**@gb** Dominic, hey. You live on a boat. In New Zealand. How long have you been living on a boat? Did your parents live on a boat (and if not, where'd you grow up)? | |
13 … | + | |
14 … | +**@dominic** Normally you inherit boating, but in my family it actually went the other way. I grew up on a farm, inland. You can't really get that far from the sea in New Zealand, but I didn't have a nautical childhood. Basically, I just decided that a sailboat would be cool one day, and then realized that if I lived aboard, I could save money buying a boat instead of paying rent. I hadn't actually even seen a sailboat up close at that moment. | |
15 … | + | |
16 … | +That was when I was 21, in 2004. I've lived aboard 3 different boats since then, and also built several outrigger sailing canoes (and other various craft). | |
17 … | + | |
18 … | +I live on my boat at anchor, and I have to paddle across when I want to come ashore, and I have to move my boat to different locations depending on the weather conditions. I don't see this as a waste of time because it's a refreshing time out from coding. | |
19 … | + | |
20 … | +Okay, I could go on and on and on, but I'll stop there. | |
21 … | + | |
22 … | +[Note from **gb** I had to wait a week for the next response since Dominic was heading to a conference. Here's a photo of his boat that you can stare at before reading the remainder of the interview if you want.] | |
23 … | + | |
24 … | +<img src="/d-tarr-home.jpg" class="profile full"> | |
25 … | + | |
26 … | +**gb** Didn't you live in the woods for a bit? You lived in a hammock and learned to make your own shoes? This is all very fascinating for those who have always lived 'on grid' -- how'd you get off the grid? | |
27 … | + | |
28 … | +**dominic** Don't worry, there will probably be boating content in all many of my answers, even those not specifically about boats. [And] yeah. That [the woods] was in (roughly) 2010 - 2012. I had left my First and Last Professional Grownup Job. I fired my boss! That is how I like to think of it. Previous to that, I had spent the summer sailing around in this outrigger canoe I had built, and sleeping on beaches etc. I ended up sailing to this commune and spent a month there. But after that, I felt that just becoming a hippie was too easy, and that I should give polite society a fair chance. So I did, and it failed. After burning out from that job, I just had to ride around on my motorbike and grow my hair long for a bit. I spent 6 months living in a swamp (on another boat) then went to Wellington to visit friends, and stayed. I had $200. Wellington has lots of extremely bushy forest all around it (somewhat like Portland, OR) so I just found a secret spot and strung my hammock up. I worked for mininum wage in a sushi resturant (whole other story). Since I wasn't paying rent, I was saving like, $1000 a month, that is as much as I could save at the previous fancy job, while paying rent. I only worked there 3 months. I was always totally open about sleeping outside, everyone was very interested. | |
29 … | + | |
30 … | +> There were two questions that everybody wanted to ask me and the answers were "I get by with a little help from my friends" and "a genteman doesn't say." | |
31 … | + | |
32 … | +That year culminated with me attending the rainbow gathering which I decided was totally stupid, and that it was time to move back to the city, get a haircut, and get a job. What I meant, though, was do something hard. I did get a haircut though. So, sleeping in the forest, and working from a hackerspace, I started coding. I was doing ruby. I showed a friend a prototype, and he said "great, now rewrite it in the language of the future". I switched to node.js and never touched ruby again. | |
33 … | + | |
34 … | +node was very new at the time. (version 0.2.1 when I joined) I could see that the node.js community was full of "mad scientists". Since it was a new thing, I figured it would be full of people who were interested in new things. (I had previously switched from java to ruby following similar reasoning) I bought myself a ticket to the conference, and across the pacific. That was mostly the end of the forest phase. | |
35 … | + | |
36 … | +**gb** Is it true that you are indeed off grid? What parts about living off grid suck? Which parts are awesome (beyond the fact that sometimes ye gods give you the gift of a fish in the morning)? (Below, from Dominic's stream, fish gift before and after.) | |
37 … | + | |
38 … | +<img src="/cooking-channel.png" class="profile full"> | |
39 … | + | |
40 … | +**dominic** Living on a sailboat is like trading first world problems for third world problems. I don't have to pay rent but I am now fully responsible for having clean drinking water, and all the other things that arrive or leave your home via a pipe. Also, of course I have to make sure that nature doesn't destroy my home. If something bad happens, it's probably my own fault, if only by not foreseeing and preparing for that eventuality. | |
41 … | + | |
42 … | +Before I got my first boat I naively imagined that it would be a lot of freedom, and it is, but it's a lot more responsibility. That is independence. | |
43 … | + | |
44 … | +There are a lot more variations between alternative lifestyles than between default lifestyles. I've lived in the forest, on boats (several times) and in a car (in Australia). I definitely like the boat best. I think the best thing is that it makes you very interesting. Most people view living in a boat as quite romantic. (but not, say, living in a van - although that might be easier in other ways). | |
45 … | + | |
46 … | +> A few people telling you that you have inspired them to, at least, rethink their own relationships with society, is very encouraging. It feels like you are making a contribution to broader society, and to do so by mostly shirking the responsibilty that society thinks I ought to have (get a job and a morgage) suits me just fine! | |
47 … | + | |
48 … | +**gb** The interesting thing about this is I get your motivation a bit better now. You've used the word 'encouraging' a few times. Not just in this interview, but also in your interactions on the network. The things you're doing, cyber sailing (and it's true, I think of you as more cyber sailor than anything) are probably in equal parts encouraging (as in resulting in people living in a courageous way) for you as they are for others. Which, in a word in Spanish, is _chido_. (There's another word, which is _apoyo_ which means support/protection/help -- and it's used in the sense that there's an urge to be ultimately supportive of the good efforts of others.) | |
49 … | + | |
50 … | +**gb** What got you started with Scuttlebot in 2013 and Cyphernet (2012?) before that? | |
51 … | + | |
52 … | +**dominic** secure-scuttlebutt is the same project as cyphernet, cyphernet was just an earlier version of the idea. cyphernet was meant to be broader than secure-scuttlebutt, but I realized that there wasn't a general purpose data replication algorithm, but that append-only logs are a) very simple, and b) map directly to social-media applications, which are basically what the internet is today. Other decentralized protocols try to represent web sites as if it's the 1990s. As if the decentralized future internet is just a replica of the centralized internet! | |
53 … | + | |
54 … | +The other project was npmd. This was a reimplementation of the npm client, with the idea of moving towards a decentralized package manager. npm has a lot of edge cases that made that difficult, and things that seemed like reasonable decisions at the time. npm has a replication feature, but I realized it only had that because it was built on couchdb, which has replicaiton. So, to make a secure, and decentralized, package manager, I should first make a secure decentralized database, then just use it to implement a package manager - so I shelved npmd and started working on secure-scuttlebutt. | |
55 … | + | |
56 … | +I wrote a detailed thing about [the history of secure scuttlebutt](%lQIxi2TEjvEyqcIREVUaNcDe2u+7H0RJNVMJpHEwLgA=.sha256). <mark>Note: this link is only accessible inside sbot.</mark> | |
57 … | + | |
58 … | +**gb** What's your tech stack? I know Linux, but beyond that, Dvorak, and beyond that...? And how do you do it all from a boat (specifically, serverside things that can't yet be done on sbot)!? And how do you stabilize your work environment? Twist ties? Glue? Belts? | |
59 … | + | |
60 … | +<img src="/d-tarr-standing-desk.jpg" class="profile full"> | |
61 … | + | |
62 … | +**dominic** I currently have a lenovo thinkpad x201, with archlinux, firefox, npm. I'm not in love with any of that stuff. It's just the best things available for the things I want to use a computer for. | |
63 … | + | |
64 … | +> When you use something a lot you learn about all its flaws, and when something is really successful it gains a life of its own and magnifies the importance of those flaws. Success is kind of a curse, in that way, your creation goes on to torture future generations who would love to replace it but they can't. | |
65 … | + | |
66 … | +This is how I feel about bash, for example, or the web. Also, the context changes, and design features no longer make sense in the new context, yet that design has achived staying power - tar (Tape ARchive format) is a great example of that, tar would be absurd if you invented it today. The whole stack is riddled with things like that. | |
67 … | + | |
68 … | +qwerty is another, there are appealing myths about qwerty origins (like, designed to slow the typist down) but actually nobody knows for sure why qwerty is qwerty. Maybe dvorak is a better keyboard layout, but is hitting buttons with your fingers really the best possible way to talk to a computer? Yeah, so maybe I should also say underneath my laptop is indrustial capitalism and the English language, also full of absurd legacy. | |
69 … | + | |
70 … | +> I think the best thing would be to influence people that that go on to create something better. I don't want to create a technological legacy, but rather something other people can build past, and then abandon like scaffolding. I'm very interested in the concept of bootstrapping. | |
71 … | + | |
72 … | +Like, we now have lasers. But once upon a time our only tools were sticks and rocks and bits of dead animals. So we bootstrapped to lasers from that, therefore you can make lasers using just sticks and rocks and sinew. | |
73 … | + | |
74 … | +**gb** What got you started with being a programmer in the first place? Is this something you've done for ages, or a relatively new thing? Was it some itch you wanted to scratch and now you well and truly have scratched it? | |
75 … | + | |
76 … | +**dominic** I originally wanted to make computer games. I started in QuakeC, it was a scripting language for Quake that made JavaScript look very feature rich. It was the bare minimum you needed to make a 3d shooter. It didn't even have string manipulation, or any kind of inheritance. There was one object type, Entity, and everything in the game was an instance of that. You could add a field to that type, and everything got that. If you wanted to represent a collection you had to add properties to Entity, and then say, create a linked list out of entities. I thought it was great. I had no idea how limited it was. Once I started making games, I pretty much stopped playing them. Programming was just a much more interesting game for me. All my projects where too ambitious to ever finish anything though, and I no longer have anything I created in that period. I later got into electronic music and mostly did that instead of programming. Although I did a computer science degree somewhere in that period (as well as dropping out and living in a sailboat) I didn't actually do very much programming until after I quit my first-and-last-grownup-job, which seemed like it might have been about programming but wasn't really. | |
77 … | + | |
78 … | +> The trouble with programming is that it's an infinite exploration game, and the better you get at it the more it expands. | |
79 … | + | |
80 … | +So now I'm pretty good at programming, but there are also so many things I can't do because I'm already doing this. You can never "scratch the itch" because you just discover more itches! But, you can get to a place where no one has ever been before, and then build a highway to that place. There is nothing in ssb that has not been done before, but as a combination of things it is, and that is exciting. | |
81 … | + | |
82 … | +--- | |
83 … | +To read more notes on interactions with Dominic, read [Overcoming The Overwhelm and Underwhelm on the Path to Becoming a Programmer](http://gwenbell.com/path) and [Things I Learned from Dominic Tarr](http://gwenbell.com/dt). | |
84 … | + | |
85 … | +Thanks for reading! wc reveals that was 2100 words! Questions? Put 'em on sbot if you're on there, and email me for an invite if you're not and want to be. |
src/dt.md | ||
---|---|---|
@@ -1,0 +1,42 @@ | ||
1 … | +--- | |
2 … | +title: Things I Learned from Dominic Tarr | |
3 … | +date: 2013-11-09 | |
4 … | +layout: post.jade | |
5 … | +collection: blog | |
6 … | +--- | |
7 … | + | |
8 … | +[Dominic](/dt-interview) left this morning for London. He was here for a week, during which time I had several hours-long conversations with he and [EB](http://evbogue.com). It was a good omen for the birth day of _Align Your Website_. | |
9 … | + | |
10 … | +I had the fortune of seeing him off. Before he's too far gone, I want to share some of what he shared with me. | |
11 … | + | |
12 … | +## Hammocks! | |
13 … | + | |
14 … | +I mentioned today that Oakland is publishing reports about how trash is piling up in the streets. And that one of the worst kinds of trash is beds. In Japan, we had futons. They're more biodegradable than Western beds, which are made out of coils and springs and stuffing. And Americans appear to hate to reuse beds. So I tell Dominic. | |
15 … | + | |
16 … | +Dominic said, "Oh. That's easy. Humans have already figured this out. Hammocks!" | |
17 … | + | |
18 … | +Then he talked about how you just need to find two trees to string up a hammock. | |
19 … | + | |
20 … | +With that I realized I still have a long way to go on my Stoic journey. | |
21 … | + | |
22 … | +## Random Bits | |
23 … | + | |
24 … | +These are bits from our conversation as Dominic created this repo which came of me expressing my frustration with the manual aspect of updating routes for Bitters. I said, is there a simpler way to do this. And he goes, "aww, that's easy." And then proceeded to write the aforementioned blog example repo. | |
25 … | + | |
26 … | +fs.watch (watches repo, updates if it sees a change) date | c xclip, npm install -g xcp | |
27 … | + | |
28 … | +date | x cut | |
29 … | +date | c outputs copypaste | |
30 … | +[hipster](https://github.com/dominictarr/hipster) // dominic's homemade text editor replacement for vim, which he calls hip. | |
31 … | + | |
32 … | +He uses the [Dvorak simplified keyboard layout](https://duckduckgo.com/Dvorak_Simplified_Keyboard). You've never seen anything like it in action. (Unless...you have.) | |
33 … | + | |
34 … | +He brought up [The Bowling Score Kata](http://butunclebob.com/ArticleS.UncleBob.TheBowlingGameKata). | |
35 … | + | |
36 … | +He mentioned Douglas Engelbart's [The Mother of All Demos](http://en.wikipedia.org/wiki/The_Mother_of_All_Demos). | |
37 … | + | |
38 … | +## Arch | |
39 … | + | |
40 … | +I learned much more than this. And along with [Everett](http://evbogue.com), helped him get [Arch](/arch) onto his box. Which took about seven hours and ended in high fives. | |
41 … | + | |
42 … | +It was great to have him in Oakland. I think his Cyphernet work is something to watch. And, he'd like to see Bitters replace Tumblr. As do I. |
src/favicon.png |
---|
src/firstmxtrip.md | ||
---|---|---|
@@ -1,0 +1,13 @@ | ||
1 … | +--- | |
2 … | +title: First Mexico Trip | |
3 … | +layout: post.jade | |
4 … | +collection: photos | |
5 … | +--- | |
6 … | + | |
7 … | +<img src="/dorky-gb.jpg" class="profile full" /> | |
8 … | + | |
9 … | +First trip to Mexico. To co-lead a yoga retreat. 2006. Hecka dork. | |
10 … | + | |
11 … | +Check them mala beads. Hecka chill. | |
12 … | + | |
13 … | +/me shakes head, laughing |