This commit is contained in:
vere 2015-10-26 18:33:03 +00:00
commit f941ed0c15
7 changed files with 110 additions and 127 deletions

View File

@ -1,10 +1,10 @@
---
title: Network Goals, Part I
title: Network architecture: goals
sort: 4
hide: true
---
# Constitution of a digital republic: part 1, goals
# Design of a digital republic: part 1, goals
Some of us remember when the Internet was a social network.
Today, the Internet is a modem.
@ -13,7 +13,7 @@ It's a wonderful modem. It connects you to all kinds of great
online services. Some of which are social "networks," but only
networks in the MBA sense. Really they're social *servers*:
giant virtual mainframes running one hardcoded program. 1976
called -- it wants its acoustic coupler back.
called it wants its acoustic coupler back.
So, you prefer 1996. So, you wish you had your decentralized
Internet back. So, you don't seem alone in this. So, we know
@ -34,8 +34,8 @@ against "Governments of the Industrial World, you weary giants of
flesh and steel."
Well... hindsight is 20/20. But in hindsight, even in 1996
things were starting to head south. Usenet -- the brain of the
Internet, when the Internet had a brain -- was already
things were starting to head south. Usenet the brain of the
Internet, when the Internet had a brain was already
disintegrating under the barbarian invasions. And where is the
WELL these days? (John Perry Barlow is probably still on it.)
@ -79,7 +79,7 @@ Dealing is way better than worrying. 1996 worried about the
problem; 2016 ought to deal with it.
A constitution is not a declaration. It's not a list of ideals.
It's more like a bridge -- an actual structure, that fails unless
It's more like a bridge an actual structure, that fails unless
it stands up to genuine load. A bridge isn't a bridge unless it
works. If you want a bridge, you have to build a bridge. It
doesn't typically happen that you set out to build something
@ -94,7 +94,7 @@ network. They weren't trying to, and they didn't.
If we want a decentralized social network, we can't do it without
rigorous engineering work. And we can't limit our work to the
world of code. A decentralized network has to work not just
technically -- but politically, economically, and socially.
technically but politically, economically, and socially.
Where do we go from here? How do we get back to 1996? Admit
we've failed, and try again. How else?
@ -289,7 +289,7 @@ republic, but it certainly works and it's better than nothing.
Thus what seems like an optimal political design: the ugly,
centralized, young larva that's designed to molt into a
beautiful, mature, decentralized butterfly. And once mature, the
larva must molt or die -- not keep growing into a gigantic,
larva must molt or die not keep growing into a gigantic,
man-eating caterpillar of death.
## Economic engineering
@ -374,8 +374,8 @@ space by giving blocks away. You may even increase the value of
your own position.
A monopolized network is not politically healthy. So its
economic value is lower. So -- if the network is properly
designed and structured -- it can be stably demonopolized. The
economic value is lower. So if the network is properly
designed and structured it can be stably demonopolized. The
monopoly power achieved by combining large positions is smaller
than the reputation cost of remonopolization, so centrifugal
force dominates and the system stays decentralized.
@ -562,4 +562,5 @@ Goals are more interesting than ideals, don't you think?
Goals and features are also different things. What are the
features of a network that attempts to achieve these design
goals? In the next installment, we'll look at how our own
network -- Urbit -- measures up to these yardsticks.
network — [Urbit](http://urbit.org) — measures up to these
yardsticks.

View File

@ -3,6 +3,7 @@ logo: black
title: User doc
sort: 1
---
<div class="short">
# User documentation

View File

@ -1,9 +1,4 @@
.lead
#body
margin-top 3rem
margin-top 0
.bar
.bar
margin-top 2rem
margin-bottom 2rem
& > div
@ -42,6 +37,11 @@
font-weight 400
letter-spacing .03rem
.lead
#body
margin-top 3rem
margin-top 0
h1
margin-top 1rem
vertical-align middle

View File

@ -251,12 +251,6 @@ li:before {
transition: opacity 1s ease-in-out;
z-index: 4;
}
img.logo.black {
content: url("https://storage.googleapis.com/urbit-extra/logo/logo-black-100x100.png");
}
img.logo.white {
content: url("https://storage.googleapis.com/urbit-extra/logo/logo-white-100x100.png");
}
img.logo {
height: 2rem;
width: 2rem;
@ -545,58 +539,58 @@ div.post p.ib {
font-weight: 200;
}
}
.lead #body {
margin-top: 3rem;
margin-top: 0;
}
.lead .bar {
.bar {
margin-top: 2rem;
margin-bottom: 2rem;
}
.lead .bar > div {
.bar > div {
display: inline-block;
}
.lead .bar a.logo {
.bar a.logo {
display: inline-block;
height: 2rem;
vertical-align: middle;
border: none;
}
.lead .bar img.logo {
.bar img.logo {
margin-right: 18px;
margin-top: 0;
}
.lead .bar ul {
.bar ul {
margin: 0;
line-height: 2rem;
display: inline-block;
}
.lead .bar ul li::before {
.bar ul li::before {
content: '';
padding-right: none;
}
.lead .bar ul li {
.bar ul li {
display: inline-block;
margin-bottom: 0;
margin-right: 1rem;
vertical-align: middle;
}
.lead .bar ul li a {
.bar ul li a {
border-bottom: none;
text-decoration: underline;
}
.lead .bar ul li a h1 {
.bar ul li a h1 {
margin: 0;
line-height: inherit;
text-transform: capitalize;
font-size: 1.2rem;
}
.lead .bar ul h1 {
.bar ul h1 {
text-transform: capitalize;
font-size: 1rem;
font-weight: 400;
letter-spacing: 0.03rem;
}
.lead #body {
margin-top: 3rem;
margin-top: 0;
}
.lead h1 {
margin-top: 1rem;
vertical-align: middle;

View File

@ -113,6 +113,7 @@ module.exports = query {
setTitle: ->
title = $('#cont h1').first().text() || @props.name
title = @props.meta.title if @props.meta?.title
document.title = "#{title} - #{@props.path}"
setPath: (href,hist) ->

View File

@ -1,17 +1,17 @@
clas = require 'classnames'
logo = require './Logo.coffee'
query = require './Async.coffee'
reactify = require './Reactify.coffee'
recl = React.createClass
{div,p,img,a} = React.DOM
Logo = React.createFactory recl render: ->
Logo = React.createFactory recl
render: ->
{color} = @props
if color is "white" or color is "black" # else?
src = "//storage.googleapis.com/urbit-extra/logo/logo-#{color}-100x100.png"
(img {src,className:"logo"})
(a {href:"http://urbit.org",style:{border:"none"}}, [(img {src,className:"logo"})])
Next = React.createFactory query {
path:'t'

View File

@ -35,8 +35,7 @@ module.exports = {
};
},{"../dispatcher/Dispatcher.coffee":15,"../persistence/TreePersistence.coffee":21}],2:[function(require,module,exports){
},{"../dispatcher/Dispatcher.coffee":14,"../persistence/TreePersistence.coffee":20}],2:[function(require,module,exports){
var BodyComponent, CLICK, Links, TreeActions, TreeStore, a, clas, div, query, reactify, recl, ref;
clas = require('classnames');
@ -243,8 +242,11 @@ module.exports = query({
});
},
setTitle: function() {
var title;
var ref1, title;
title = $('#cont h1').first().text() || this.props.name;
if ((ref1 = this.props.meta) != null ? ref1.title : void 0) {
title = this.props.meta.title;
}
return document.title = title + " - " + this.props.path;
},
setPath: function(href, hist) {
@ -312,8 +314,7 @@ module.exports = query({
}), div);
},{"../actions/TreeActions.coffee":1,"../stores/TreeStore.coffee":22,"./Async.coffee":3,"./BodyComponent.coffee":4,"./Reactify.coffee":12,"classnames":17}],3:[function(require,module,exports){
},{"../actions/TreeActions.coffee":1,"../stores/TreeStore.coffee":21,"./Async.coffee":3,"./BodyComponent.coffee":4,"./Reactify.coffee":11,"classnames":16}],3:[function(require,module,exports){
var TreeActions, TreeStore, _load, code, div, recl, ref, span;
_load = require('./LoadComponent.coffee');
@ -423,14 +424,11 @@ module.exports = function(queries, Child, load) {
};
},{"../actions/TreeActions.coffee":1,"../stores/TreeStore.coffee":22,"./LoadComponent.coffee":10}],4:[function(require,module,exports){
var Logo, Next, a, clas, div, img, logo, p, query, reactify, recl, ref;
},{"../actions/TreeActions.coffee":1,"../stores/TreeStore.coffee":21,"./LoadComponent.coffee":10}],4:[function(require,module,exports){
var Logo, Next, a, clas, div, img, p, query, reactify, recl, ref;
clas = require('classnames');
logo = require('./Logo.coffee');
query = require('./Async.coffee');
reactify = require('./Reactify.coffee');
@ -446,10 +444,17 @@ Logo = React.createFactory(recl({
if (color === "white" || color === "black") {
src = "//storage.googleapis.com/urbit-extra/logo/logo-" + color + "-100x100.png";
}
return img({
return a({
href: "http://urbit.org",
style: {
border: "none"
}
}, [
img({
src: src,
className: "logo"
});
})
]);
}
}));
@ -524,8 +529,7 @@ module.exports = query({
}));
},{"./Async.coffee":3,"./Logo.coffee":11,"./Reactify.coffee":12,"classnames":17}],5:[function(require,module,exports){
},{"./Async.coffee":3,"./Reactify.coffee":11,"classnames":16}],5:[function(require,module,exports){
var div, recl, ref, textarea;
recl = React.createClass;
@ -548,7 +552,6 @@ module.exports = recl({
});
},{}],6:[function(require,module,exports){
var div, recl;
@ -571,8 +574,7 @@ module.exports = {
};
},{"./CodeMirror.coffee":5,"./EmailComponent.coffee":7,"./KidsComponent.coffee":8,"./ListComponent.coffee":9,"./SearchComponent.coffee":13,"./TocComponent.coffee":14}],7:[function(require,module,exports){
},{"./CodeMirror.coffee":5,"./EmailComponent.coffee":7,"./KidsComponent.coffee":8,"./ListComponent.coffee":9,"./SearchComponent.coffee":12,"./TocComponent.coffee":13}],7:[function(require,module,exports){
var button, div, input, p, reactify, recl, ref;
reactify = require('./Reactify.coffee');
@ -652,8 +654,7 @@ module.exports = recl({
});
},{"./Reactify.coffee":12}],8:[function(require,module,exports){
},{"./Reactify.coffee":11}],8:[function(require,module,exports){
var a, div, hr, li, query, reactify, recl, ref, ul;
reactify = require('./Reactify.coffee');
@ -724,8 +725,7 @@ module.exports = query({
}));
},{"./Async.coffee":3,"./Reactify.coffee":12}],9:[function(require,module,exports){
},{"./Async.coffee":3,"./Reactify.coffee":11}],9:[function(require,module,exports){
var a, clas, div, h1, li, query, reactify, recl, ref, ul;
clas = require('classnames');
@ -872,8 +872,7 @@ module.exports = query({
}));
},{"./Async.coffee":3,"./Reactify.coffee":12,"classnames":17}],10:[function(require,module,exports){
},{"./Async.coffee":3,"./Reactify.coffee":11,"classnames":16}],10:[function(require,module,exports){
var div, input, recl, ref, textarea;
recl = React.createClass;
@ -913,13 +912,7 @@ module.exports = recl({
});
},{}],11:[function(require,module,exports){
},{}],12:[function(require,module,exports){
var Virtual, div, load, reactify, recl, ref, rele, span, walk;
recl = React.createClass;
@ -986,8 +979,7 @@ module.exports = _.extend(reactify, {
});
},{"./LoadComponent.coffee":10}],13:[function(require,module,exports){
},{"./LoadComponent.coffee":10}],12:[function(require,module,exports){
var a, div, input, query, reactify, recl, ref,
slice = [].slice;
@ -1125,8 +1117,7 @@ module.exports = query({
}));
},{"./Async.coffee":3,"./Reactify.coffee":12}],14:[function(require,module,exports){
},{"./Async.coffee":3,"./Reactify.coffee":11}],13:[function(require,module,exports){
var div, query, reactify, recl,
slice = [].slice;
@ -1254,8 +1245,7 @@ module.exports = query({
}));
},{"./Async.coffee":3,"./Reactify.coffee":12}],15:[function(require,module,exports){
},{"./Async.coffee":3,"./Reactify.coffee":11}],14:[function(require,module,exports){
var Dispatcher;
Dispatcher = require('flux').Dispatcher;
@ -1276,8 +1266,7 @@ module.exports = _.extend(new Dispatcher(), {
});
},{"flux":18}],16:[function(require,module,exports){
},{"flux":17}],15:[function(require,module,exports){
var rend;
rend = React.render;
@ -1450,8 +1439,7 @@ $(function() {
});
},{"./actions/TreeActions.coffee":1,"./components/AnchorComponent.coffee":2,"./components/BodyComponent.coffee":4,"./components/Components.coffee":6,"./persistence/TreePersistence.coffee":21}],17:[function(require,module,exports){
},{"./actions/TreeActions.coffee":1,"./components/AnchorComponent.coffee":2,"./components/BodyComponent.coffee":4,"./components/Components.coffee":6,"./persistence/TreePersistence.coffee":20}],16:[function(require,module,exports){
/*!
Copyright (c) 2015 Jed Watson.
Licensed under the MIT License (MIT), see
@ -1501,7 +1489,7 @@ $(function() {
}
}());
},{}],18:[function(require,module,exports){
},{}],17:[function(require,module,exports){
/**
* Copyright (c) 2014-2015, Facebook, Inc.
* All rights reserved.
@ -1513,7 +1501,7 @@ $(function() {
module.exports.Dispatcher = require('./lib/Dispatcher')
},{"./lib/Dispatcher":19}],19:[function(require,module,exports){
},{"./lib/Dispatcher":18}],18:[function(require,module,exports){
/*
* Copyright (c) 2014, Facebook, Inc.
* All rights reserved.
@ -1765,7 +1753,7 @@ var _prefix = 'ID_';
module.exports = Dispatcher;
},{"./invariant":20}],20:[function(require,module,exports){
},{"./invariant":19}],19:[function(require,module,exports){
/**
* Copyright (c) 2014, Facebook, Inc.
* All rights reserved.
@ -1820,7 +1808,7 @@ var invariant = function(condition, format, a, b, c, d, e, f) {
module.exports = invariant;
},{}],21:[function(require,module,exports){
},{}],20:[function(require,module,exports){
var dedup;
dedup = {};
@ -1878,8 +1866,7 @@ module.exports = {
};
},{}],22:[function(require,module,exports){
},{}],21:[function(require,module,exports){
var EventEmitter, MessageDispatcher, QUERIES, TreeStore, _curr, _data, _tree, clog;
EventEmitter = require('events').EventEmitter;
@ -2104,8 +2091,7 @@ TreeStore.dispatchToken = MessageDispatcher.register(function(payload) {
module.exports = TreeStore;
},{"../dispatcher/Dispatcher.coffee":15,"events":23}],23:[function(require,module,exports){
},{"../dispatcher/Dispatcher.coffee":14,"events":22}],22:[function(require,module,exports){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
@ -2408,4 +2394,4 @@ function isUndefined(arg) {
return arg === void 0;
}
},{}]},{},[16]);
},{}]},{},[15]);