Compare commits
1 Commits
master
...
getElement
Author | SHA1 | Date |
---|---|---|
Nicolas Perriault | 972924df80 | 9 years ago |
@ -1,208 +0,0 @@
|
||||
"use strict";
|
||||
|
||||
module.exports = {
|
||||
"parserOptions": {
|
||||
"ecmaVersion": 6
|
||||
},
|
||||
"rules": {
|
||||
// Braces only needed for multi-line arrow function blocks
|
||||
// "arrow-body-style": [2, "as-needed"],
|
||||
|
||||
// Require spacing around =>
|
||||
// "arrow-spacing": 2,
|
||||
|
||||
// Always require spacing around a single line block
|
||||
// "block-spacing": 1,
|
||||
|
||||
// No newline before open brace for a block
|
||||
"brace-style": 2,
|
||||
|
||||
// No space before always a space after a comma
|
||||
"comma-spacing": [2, {"before": false, "after": true}],
|
||||
|
||||
// Commas at the end of the line not the start
|
||||
// "comma-style": 2,
|
||||
|
||||
// Don't require spaces around computed properties
|
||||
// "computed-property-spacing": [2, "never"],
|
||||
|
||||
// Functions must always return something or nothing
|
||||
"consistent-return": 2,
|
||||
|
||||
// Require braces around blocks that start a new line
|
||||
// Note that this rule is likely to be overridden on a per-directory basis
|
||||
// very frequently.
|
||||
// "curly": [2, "multi-line"],
|
||||
|
||||
// Always require a trailing EOL
|
||||
"eol-last": 2,
|
||||
|
||||
// Require function* name()
|
||||
// "generator-star-spacing": [2, {"before": false, "after": true}],
|
||||
|
||||
// Two space indent
|
||||
"indent": [2, 2, { "SwitchCase": 1 }],
|
||||
|
||||
// Space after colon not before in property declarations
|
||||
"key-spacing": [2, { "beforeColon": false, "afterColon": true, "mode": "minimum" }],
|
||||
|
||||
// Unix linebreaks
|
||||
"linebreak-style": [2, "unix"],
|
||||
|
||||
// Always require parenthesis for new calls
|
||||
"new-parens": 2,
|
||||
|
||||
// Use [] instead of Array()
|
||||
// "no-array-constructor": 2,
|
||||
|
||||
// No duplicate arguments in function declarations
|
||||
"no-dupe-args": 2,
|
||||
|
||||
// No duplicate keys in object declarations
|
||||
"no-dupe-keys": 2,
|
||||
|
||||
// No duplicate cases in switch statements
|
||||
"no-duplicate-case": 2,
|
||||
|
||||
// No labels
|
||||
"no-labels": 2,
|
||||
|
||||
// If an if block ends with a return no need for an else block
|
||||
"no-else-return": 2,
|
||||
|
||||
// No empty statements
|
||||
"no-empty": 2,
|
||||
|
||||
// No empty character classes in regex
|
||||
"no-empty-character-class": 2,
|
||||
|
||||
// Disallow empty destructuring
|
||||
"no-empty-pattern": 2,
|
||||
|
||||
// No assiging to exception variable
|
||||
// "no-ex-assign": 2,
|
||||
|
||||
// No using !! where casting to boolean is already happening
|
||||
// "no-extra-boolean-cast": 2,
|
||||
|
||||
// No double semicolon
|
||||
"no-extra-semi": 2,
|
||||
|
||||
// No overwriting defined functions
|
||||
"no-func-assign": 2,
|
||||
|
||||
// Declarations in Program or Function Body
|
||||
"no-inner-declarations": 2,
|
||||
|
||||
// No invalid regular expresions
|
||||
"no-invalid-regexp": 2,
|
||||
|
||||
// No odd whitespace characters
|
||||
"no-irregular-whitespace": 2,
|
||||
|
||||
// No single if block inside an else block
|
||||
"no-lonely-if": 2,
|
||||
|
||||
// No mixing spaces and tabs in indent
|
||||
"no-mixed-spaces-and-tabs": [2, "smart-tabs"],
|
||||
|
||||
// No unnecessary spacing
|
||||
"no-multi-spaces": [2, { exceptions: { "AssignmentExpression": true, "VariableDeclarator": true, "ArrayExpression": true, "ObjectExpression": true } }],
|
||||
|
||||
// No reassigning native JS objects
|
||||
"no-native-reassign": 2,
|
||||
|
||||
// No (!foo in bar)
|
||||
"no-negated-in-lhs": 2,
|
||||
|
||||
// Nested ternary statements are confusing
|
||||
"no-nested-ternary": 2,
|
||||
|
||||
// Use {} instead of new Object()
|
||||
// "no-new-object": 2,
|
||||
|
||||
// No Math() or JSON()
|
||||
"no-obj-calls": 2,
|
||||
|
||||
// No octal literals
|
||||
"no-octal": 2,
|
||||
|
||||
// No redeclaring variables
|
||||
"no-redeclare": 2,
|
||||
|
||||
// No unnecessary comparisons
|
||||
"no-self-compare": 2,
|
||||
|
||||
// No declaring variables from an outer scope
|
||||
"no-shadow": 2,
|
||||
|
||||
// No declaring variables that hide things like arguments
|
||||
"no-shadow-restricted-names": 2,
|
||||
|
||||
// No spaces between function name and parentheses
|
||||
"no-spaced-func": 2,
|
||||
|
||||
// No trailing whitespace
|
||||
"no-trailing-spaces": 2,
|
||||
|
||||
// No using undeclared variables
|
||||
// "no-undef": 2,
|
||||
|
||||
// Error on newline where a semicolon is needed
|
||||
"no-unexpected-multiline": 2,
|
||||
|
||||
// No unreachable statements
|
||||
"no-unreachable": 2,
|
||||
|
||||
// No expressions where a statement is expected
|
||||
// "no-unused-expressions": 2,
|
||||
|
||||
// No declaring variables that are never used
|
||||
"no-unused-vars": [2, {"vars": "all", "args": "none"}],
|
||||
|
||||
// No using variables before defined
|
||||
// "no-use-before-define": [2, "nofunc"],
|
||||
|
||||
// No using with
|
||||
"no-with": 2,
|
||||
|
||||
// No if/while/for blocks on the same line as the if/while/for statement:
|
||||
"nonblock-statement-body-position": [2, "below"],
|
||||
|
||||
// Always require semicolon at end of statement
|
||||
"semi": [2, "always"],
|
||||
|
||||
// Require space after keywords
|
||||
"keyword-spacing": 2,
|
||||
|
||||
// Always use double quotes
|
||||
"quotes": [2, "double", {"avoidEscape": true}],
|
||||
|
||||
// Require space before blocks
|
||||
"space-before-blocks": 2,
|
||||
|
||||
// Never use spaces before function parentheses
|
||||
// "space-before-function-paren": [2, { "anonymous": "always", "named": "never" }],
|
||||
|
||||
// Require spaces before finally, catch, etc.
|
||||
// "space-before-keywords": [2, "always"],
|
||||
|
||||
// No space padding in parentheses
|
||||
// "space-in-parens": [2, "never"],
|
||||
|
||||
// Require spaces around operators
|
||||
// "space-infix-ops": 2,
|
||||
|
||||
// Require spaces after return, throw and case
|
||||
// "space-return-throw-case": 2,
|
||||
|
||||
// ++ and -- should not need spacing
|
||||
// "space-unary-ops": [2, { "words": true, "nonwords": false }],
|
||||
|
||||
// No comparisons to NaN
|
||||
"use-isnan": 2,
|
||||
|
||||
// Only check typeof against valid results
|
||||
"valid-typeof": 2,
|
||||
},
|
||||
};
|
@ -1 +0,0 @@
|
||||
**/*.html linguist-detectable=false
|
@ -1,4 +0,0 @@
|
||||
/benchmarks/
|
||||
/test/
|
||||
.gitattributes
|
||||
.travis.yml
|
@ -1,7 +1,4 @@
|
||||
language: node_js
|
||||
sudo: false
|
||||
node_js:
|
||||
- '11.0'
|
||||
script:
|
||||
- npm run lint
|
||||
- npm run test
|
||||
- '0.10'
|
||||
|
@ -1,15 +0,0 @@
|
||||
# Community Participation Guidelines
|
||||
|
||||
This repository is governed by Mozilla's code of conduct and etiquette guidelines.
|
||||
For more details, please read the
|
||||
[Mozilla Community Participation Guidelines](https://www.mozilla.org/about/governance/policies/participation/).
|
||||
|
||||
## How to Report
|
||||
For more information on how to report violations of the Community Participation Guidelines, please read our '[How to Report](https://www.mozilla.org/about/governance/policies/participation/reporting/)' page.
|
||||
|
||||
<!--
|
||||
## Project Specific Etiquette
|
||||
|
||||
In some cases, there will be additional project etiquette i.e.: (https://bugzilla.mozilla.org/page.cgi?id=etiquette.html).
|
||||
Please update for your project.
|
||||
-->
|
@ -1,99 +0,0 @@
|
||||
/* eslint-env es6:false */
|
||||
/*
|
||||
* Copyright (c) 2010 Arc90 Inc
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This code is heavily based on Arc90's readability.js (1.7.1) script
|
||||
* available at: http://code.google.com/p/arc90labs-readability
|
||||
*/
|
||||
|
||||
var REGEXPS = {
|
||||
// NOTE: These two regular expressions are duplicated in
|
||||
// Readability.js. Please keep both copies in sync.
|
||||
unlikelyCandidates: /-ad-|ai2html|banner|breadcrumbs|combx|comment|community|cover-wrap|disqus|extra|footer|gdpr|header|legends|menu|related|remark|replies|rss|shoutbox|sidebar|skyscraper|social|sponsor|supplemental|ad-break|agegate|pagination|pager|popup|yom-remote/i,
|
||||
okMaybeItsACandidate: /and|article|body|column|content|main|shadow/i,
|
||||
};
|
||||
|
||||
function isNodeVisible(node) {
|
||||
// Have to null-check node.style and node.className.indexOf to deal with SVG and MathML nodes.
|
||||
return (!node.style || node.style.display != "none")
|
||||
&& !node.hasAttribute("hidden")
|
||||
//check for "fallback-image" so that wikimedia math images are displayed
|
||||
&& (!node.hasAttribute("aria-hidden") || node.getAttribute("aria-hidden") != "true" || (node.className && node.className.indexOf && node.className.indexOf("fallback-image") !== -1));
|
||||
}
|
||||
|
||||
/**
|
||||
* Decides whether or not the document is reader-able without parsing the whole thing.
|
||||
*
|
||||
* @return boolean Whether or not we suspect Readability.parse() will suceeed at returning an article object.
|
||||
*/
|
||||
function isProbablyReaderable(doc, isVisible) {
|
||||
if (!isVisible) {
|
||||
isVisible = isNodeVisible;
|
||||
}
|
||||
|
||||
var nodes = doc.querySelectorAll("p, pre");
|
||||
|
||||
// Get <div> nodes which have <br> node(s) and append them into the `nodes` variable.
|
||||
// Some articles' DOM structures might look like
|
||||
// <div>
|
||||
// Sentences<br>
|
||||
// <br>
|
||||
// Sentences<br>
|
||||
// </div>
|
||||
var brNodes = doc.querySelectorAll("div > br");
|
||||
if (brNodes.length) {
|
||||
var set = new Set(nodes);
|
||||
[].forEach.call(brNodes, function(node) {
|
||||
set.add(node.parentNode);
|
||||
});
|
||||
nodes = Array.from(set);
|
||||
}
|
||||
|
||||
var score = 0;
|
||||
// This is a little cheeky, we use the accumulator 'score' to decide what to return from
|
||||
// this callback:
|
||||
return [].some.call(nodes, function(node) {
|
||||
if (!isVisible(node))
|
||||
return false;
|
||||
|
||||
var matchString = node.className + " " + node.id;
|
||||
if (REGEXPS.unlikelyCandidates.test(matchString) &&
|
||||
!REGEXPS.okMaybeItsACandidate.test(matchString)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (node.matches("li p")) {
|
||||
return false;
|
||||
}
|
||||
|
||||
var textContentLength = node.textContent.trim().length;
|
||||
if (textContentLength < 140) {
|
||||
return false;
|
||||
}
|
||||
|
||||
score += Math.sqrt(textContentLength - 140);
|
||||
|
||||
if (score > 20) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
if (typeof module === "object") {
|
||||
module.exports = isProbablyReaderable;
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -1,7 +1,27 @@
|
||||
var Readability = require("./Readability");
|
||||
var isProbablyReaderable = require("./Readability-readerable");
|
||||
var path = require("path");
|
||||
var fs = require("fs");
|
||||
|
||||
// We want to load Readability and JSDOMParser, which aren't set up as commonjs libraries,
|
||||
// and so we need to do some hocus-pocus with 'vm' to import them on a separate scope
|
||||
// (identical) scope context.
|
||||
var vm = require("vm");
|
||||
var readabilityPath = path.join(__dirname, "Readability.js");
|
||||
var jsdomPath = path.join(__dirname, "JSDOMParser.js");
|
||||
|
||||
|
||||
var scopeContext = {};
|
||||
// We generally expect dump() and console.{whatever} to work, so make these available
|
||||
// in the scope we're using:
|
||||
scopeContext.dump = console.log
|
||||
scopeContext.console = console;
|
||||
|
||||
// Actually load files. NB: if either of the files has parse errors,
|
||||
// node is dumb and shows you a syntax error *at this callsite* . Don't try to find
|
||||
// a syntax error on this line, there isn't one. Go look in the file it's loading instead.
|
||||
vm.runInNewContext(fs.readFileSync(jsdomPath), scopeContext, jsdomPath);
|
||||
vm.runInNewContext(fs.readFileSync(readabilityPath), scopeContext, readabilityPath);
|
||||
|
||||
module.exports = {
|
||||
Readability: Readability,
|
||||
isProbablyReaderable: isProbablyReaderable
|
||||
Readability: scopeContext.Readability,
|
||||
JSDOMParser: scopeContext.JSDOMParser
|
||||
};
|
||||
|
@ -0,0 +1,24 @@
|
||||
var path = require("path");
|
||||
var fs = require("fs");
|
||||
var prettyPrint = require("html").prettyPrint;
|
||||
|
||||
function readFile(path) {
|
||||
return fs.readFileSync(path, {encoding: "utf-8"}).trim();
|
||||
}
|
||||
|
||||
function readJSON(path) {
|
||||
return JSON.parse(readFile(path));
|
||||
}
|
||||
|
||||
var testPageRoot = path.join(__dirname, "test-pages");
|
||||
|
||||
exports.getTestPages = function() {
|
||||
return fs.readdirSync(testPageRoot).map(function(dir) {
|
||||
return {
|
||||
dir: dir,
|
||||
source: readFile(path.join(testPageRoot, dir, "source.html")),
|
||||
expectedContent: readFile(path.join(testPageRoot, dir, "expected.html")),
|
||||
expectedMetadata: readJSON(path.join(testPageRoot, dir, "expected-metadata.json")),
|
||||
};
|
||||
});
|
||||
};
|
@ -1,23 +0,0 @@
|
||||
var JSDOM = require("jsdom").JSDOM;
|
||||
var chai = require("chai");
|
||||
chai.config.includeStack = true;
|
||||
var expect = chai.expect;
|
||||
|
||||
var testPages = require("./utils").getTestPages();
|
||||
var isProbablyReaderable = require("../index").isProbablyReaderable;
|
||||
|
||||
describe("isProbablyReaderable - test pages", function() {
|
||||
testPages.forEach(function(testPage) {
|
||||
var uri = "http://fakehost/test/page.html";
|
||||
describe(testPage.dir, function() {
|
||||
var doc = new JSDOM(testPage.source, {
|
||||
url: uri,
|
||||
}).window.document;
|
||||
var expected = testPage.expectedMetadata.readerable;
|
||||
it("The result should " + (expected ? "" : "not ") + "be readerable", function() {
|
||||
expect(isProbablyReaderable(doc)).eql(expected);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -1,8 +1,6 @@
|
||||
{
|
||||
"title": "Get your Frontend JavaScript Code Covered | Code",
|
||||
"byline": "Nicolas Perriault —",
|
||||
"dir": null,
|
||||
"excerpt": "Nicolas Perriault's homepage.",
|
||||
"siteName": null,
|
||||
"readerable": true
|
||||
}
|
||||
|
@ -1,8 +0,0 @@
|
||||
{
|
||||
"title": "Dublin Core property title",
|
||||
"byline": "Dublin Core property author",
|
||||
"dir": null,
|
||||
"excerpt": "Dublin Core property description",
|
||||
"siteName": null,
|
||||
"readerable": true
|
||||
}
|
@ -1,6 +0,0 @@
|
||||
<div id="readability-page-1" class="page">
|
||||
<article>
|
||||
<p> Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. </p>
|
||||
<p> Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. </p>
|
||||
</article>
|
||||
</div>
|
@ -1,45 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>Title Element</title>
|
||||
<meta name="title" content="Meta name title"/>
|
||||
<meta name="og:title" content="Open Graph name title"/>
|
||||
<meta name="twitter:title" content="Twitter name title"/>
|
||||
<meta name="DC.title" content="Dublin Core name title"/>
|
||||
<meta property="dc:title" content="Dublin Core property title"/>
|
||||
<meta property="twitter:title" content="Twitter property title"/>
|
||||
<meta property="og:title" content="Open Graph property title"/>
|
||||
<meta name="author" content="Meta name author"/>
|
||||
<meta name="DC.creator" content="Dublin Core name author"/>
|
||||
<meta property="dc:creator" content="Dublin Core property author"/>
|
||||
<meta name="description" content="Meta name description"/>
|
||||
<meta name="og:description" content="Open Graph name description"/>
|
||||
<meta name="twitter:description" content="Twitter name description"/>
|
||||
<meta name="DC.description" content="Dublin Core name description"/>
|
||||
<meta property="dc:description" content="Dublin Core property description"/>
|
||||
<meta property="twitter:description" content="Twitter property description"/>
|
||||
<meta property="og:description" content="Open Graph property description"/>
|
||||
</head>
|
||||
<body>
|
||||
<article>
|
||||
<h1>Test document title</h1>
|
||||
<p>
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
||||
</p>
|
||||
<p>
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
||||
</p>
|
||||
</article>
|
||||
</body>
|
||||
</html>
|
@ -1,8 +0,0 @@
|
||||
{
|
||||
"title": "Preferred title",
|
||||
"byline": "Creator Name",
|
||||
"dir": null,
|
||||
"excerpt": "Preferred description",
|
||||
"siteName": null,
|
||||
"readerable": true
|
||||
}
|
@ -1,6 +0,0 @@
|
||||
<div id="readability-page-1" class="page">
|
||||
<article>
|
||||
<p> Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. </p>
|
||||
<p> Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. </p>
|
||||
</article>
|
||||
</div>
|
@ -1,35 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>Title Element</title>
|
||||
<meta property="x:title dc:title" content="Preferred title"/>
|
||||
<meta property="og:title twitter:title" content="A title"/>
|
||||
<meta property="dc:creator twitter:site_name" content="Creator Name"/>
|
||||
<meta name="author" content="FAIL"/>
|
||||
<meta property="og:description x:description twitter:description" content="A description"/>
|
||||
<meta property="dc:description og:description" content="Preferred description"/>
|
||||
<meta name="description" content="FAIL"/>
|
||||
</head>
|
||||
<body>
|
||||
<article>
|
||||
<h1>Test document title</h1>
|
||||
<p>
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
||||
</p>
|
||||
<p>
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
||||
</p>
|
||||
</article>
|
||||
</body>
|
||||
</html>
|
File diff suppressed because one or more lines are too long
@ -1,8 +0,0 @@
|
||||
{
|
||||
"title": "Conversations with a Cryptid - Chapter 1 - AMournfulHowlInTheNight - 僕のヒーローアカデミア | Boku no Hero Academia",
|
||||
"byline": "Organization for Transformative Works",
|
||||
"dir": null,
|
||||
"excerpt": "An Archive of Our Own, a project of the Organization for Transformative Works",
|
||||
"siteName": null,
|
||||
"readerable": true
|
||||
}
|
File diff suppressed because one or more lines are too long
@ -1,8 +0,0 @@
|
||||
{
|
||||
"title": "Just-released Minecraft exploit makes it easy to crash game servers",
|
||||
"byline": "Dan Goodin - Apr 16, 2015 8:02 pm UTC",
|
||||
"dir": null,
|
||||
"excerpt": "Two-year-old bug exposes thousands of servers to crippling attack.",
|
||||
"siteName": "Ars Technica",
|
||||
"readerable": true
|
||||
}
|
@ -1,8 +0,0 @@
|
||||
{
|
||||
"title": "Base URL with base relative test",
|
||||
"byline": null,
|
||||
"dir": null,
|
||||
"excerpt": "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\n tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\n quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\n consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\n cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\n proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
|
||||
"siteName": null,
|
||||
"readerable": false
|
||||
}
|
@ -1,22 +0,0 @@
|
||||
<div id="readability-page-1" class="page">
|
||||
<article>
|
||||
<p> Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. </p>
|
||||
<p>Links</p>
|
||||
<p><a href="http://fakehost/test/base/foo/bar/baz.html">link</a></p>
|
||||
<p><a href="http://fakehost/test/base/foo/bar/baz.html">link</a></p>
|
||||
<p><a href="http://fakehost/foo/bar/baz.html">link</a></p>
|
||||
<p><a href="http://fakehost/test/base/#foo">link</a></p>
|
||||
<p><a href="http://fakehost/test/base/baz.html#foo">link</a></p>
|
||||
<p><a href="http://fakehost/foo/bar/baz.html#foo">link</a></p>
|
||||
<p><a href="http://test/foo/bar/baz.html">link</a></p>
|
||||
<p><a href="https://test/foo/bar/baz.html">link</a></p>
|
||||
<p>Images</p>
|
||||
<p><img src="http://fakehost/test/base/foo/bar/baz.png" /></p>
|
||||
<p><img src="http://fakehost/test/base/foo/bar/baz.png" /></p>
|
||||
<p><img src="http://fakehost/foo/bar/baz.png" /></p>
|
||||
<p><img src="http://test/foo/bar/baz.png" /></p>
|
||||
<p><img src="https://test/foo/bar/baz.png" /></p>
|
||||
<h2>Foo</h2>
|
||||
<p> Tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. </p>
|
||||
</article>
|
||||
</div>
|
@ -1,44 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<base href="base/"/>
|
||||
<title>Base URL with base relative test</title>
|
||||
</head>
|
||||
<body>
|
||||
<article>
|
||||
<h1>Lorem</h1>
|
||||
<div>
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
||||
</div>
|
||||
<p>Links</p>
|
||||
<p><a href="foo/bar/baz.html">link</a></p>
|
||||
<p><a href="./foo/bar/baz.html">link</a></p>
|
||||
<p><a href="/foo/bar/baz.html">link</a></p>
|
||||
<p><a href="#foo">link</a></p>
|
||||
<p><a href="baz.html#foo">link</a></p>
|
||||
<p><a href="/foo/bar/baz.html#foo">link</a></p>
|
||||
<p><a href="http://test/foo/bar/baz.html">link</a></p>
|
||||
<p><a href="https://test/foo/bar/baz.html">link</a></p>
|
||||
<p>Images</p>
|
||||
<p><img src="foo/bar/baz.png"/></p>
|
||||
<p><img src="./foo/bar/baz.png"/></p>
|
||||
<p><img src="/foo/bar/baz.png"/></p>
|
||||
<p><img src="http://test/foo/bar/baz.png"/></p>
|
||||
<p><img src="https://test/foo/bar/baz.png"/></p>
|
||||
<h2>Foo</h2>
|
||||
<div>
|
||||
Tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
||||
</div>
|
||||
</article>
|
||||
</body>
|
||||
</html>
|
@ -1,8 +0,0 @@
|
||||
{
|
||||
"title": "Base URL with base test",
|
||||
"byline": null,
|
||||
"dir": null,
|
||||
"excerpt": "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\n tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\n quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\n consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\n cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\n proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
|
||||
"siteName": null,
|
||||
"readerable": false
|
||||
}
|
@ -1,22 +0,0 @@
|
||||
<div id="readability-page-1" class="page">
|
||||
<article>
|
||||
<p> Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. </p>
|
||||
<p>Links</p>
|
||||
<p><a href="http://fakehost/foo/bar/baz.html">link</a></p>
|
||||
<p><a href="http://fakehost/foo/bar/baz.html">link</a></p>
|
||||
<p><a href="http://fakehost/foo/bar/baz.html">link</a></p>
|
||||
<p><a href="http://fakehost/#foo">link</a></p>
|
||||
<p><a href="http://fakehost/baz.html#foo">link</a></p>
|
||||
<p><a href="http://fakehost/foo/bar/baz.html#foo">link</a></p>
|
||||
<p><a href="http://test/foo/bar/baz.html">link</a></p>
|
||||
<p><a href="https://test/foo/bar/baz.html">link</a></p>
|
||||
<p>Images</p>
|
||||
<p><img src="http://fakehost/foo/bar/baz.png" /></p>
|
||||
<p><img src="http://fakehost/foo/bar/baz.png" /></p>
|
||||
<p><img src="http://fakehost/foo/bar/baz.png" /></p>
|
||||
<p><img src="http://test/foo/bar/baz.png" /></p>
|
||||
<p><img src="https://test/foo/bar/baz.png" /></p>
|
||||
<h2>Foo</h2>
|
||||
<p> Tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. </p>
|
||||
</article>
|
||||
</div>
|
@ -1,44 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<base href="/"/>
|
||||
<title>Base URL with base test</title>
|
||||
</head>
|
||||
<body>
|
||||
<article>
|
||||
<h1>Lorem</h1>
|
||||
<div>
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
||||
</div>
|
||||
<p>Links</p>
|
||||
<p><a href="foo/bar/baz.html">link</a></p>
|
||||
<p><a href="./foo/bar/baz.html">link</a></p>
|
||||
<p><a href="/foo/bar/baz.html">link</a></p>
|
||||
<p><a href="#foo">link</a></p>
|
||||
<p><a href="baz.html#foo">link</a></p>
|
||||
<p><a href="/foo/bar/baz.html#foo">link</a></p>
|
||||
<p><a href="http://test/foo/bar/baz.html">link</a></p>
|
||||
<p><a href="https://test/foo/bar/baz.html">link</a></p>
|
||||
<p>Images</p>
|
||||
<p><img src="foo/bar/baz.png"/></p>
|
||||
<p><img src="./foo/bar/baz.png"/></p>
|
||||
<p><img src="/foo/bar/baz.png"/></p>
|
||||
<p><img src="http://test/foo/bar/baz.png"/></p>
|
||||
<p><img src="https://test/foo/bar/baz.png"/></p>
|
||||
<h2>Foo</h2>
|
||||
<div>
|
||||
Tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
||||
</div>
|
||||
</article>
|
||||
</body>
|
||||
</html>
|
@ -1,8 +1,6 @@
|
||||
{
|
||||
"title": "Base URL test",
|
||||
"byline": null,
|
||||
"dir": null,
|
||||
"excerpt": "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\n tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\n quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\n consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\n cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\n proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
|
||||
"siteName": null,
|
||||
"readerable": false
|
||||
}
|
||||
|
@ -1,22 +1,42 @@
|
||||
<div id="readability-page-1" class="page">
|
||||
<article>
|
||||
<p> Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. </p>
|
||||
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat
|
||||
non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
|
||||
<p>Links</p>
|
||||
<p><a href="http://fakehost/test/foo/bar/baz.html">link</a></p>
|
||||
<p><a href="http://fakehost/test/foo/bar/baz.html">link</a></p>
|
||||
<p><a href="http://fakehost/foo/bar/baz.html">link</a></p>
|
||||
<p><a href="#foo">link</a></p>
|
||||
<p><a href="http://fakehost/test/baz.html#foo">link</a></p>
|
||||
<p><a href="http://fakehost/foo/bar/baz.html#foo">link</a></p>
|
||||
<p><a href="http://test/foo/bar/baz.html">link</a></p>
|
||||
<p><a href="https://test/foo/bar/baz.html">link</a></p>
|
||||
<p><a href="http://fakehost/test/foo/bar/baz.html">link</a>
|
||||
</p>
|
||||
<p><a href="http://fakehost/test/foo/bar/baz.html">link</a>
|
||||
</p>
|
||||
<p><a href="http://fakehost/foo/bar/baz.html">link</a>
|
||||
</p>
|
||||
<p><a href="http://test/foo/bar/baz.html">link</a>
|
||||
</p>
|
||||
<p><a href="https://test/foo/bar/baz.html">link</a>
|
||||
</p>
|
||||
<p>Images</p>
|
||||
<p><img src="http://fakehost/test/foo/bar/baz.png" /></p>
|
||||
<p><img src="http://fakehost/test/foo/bar/baz.png" /></p>
|
||||
<p><img src="http://fakehost/foo/bar/baz.png" /></p>
|
||||
<p><img src="http://test/foo/bar/baz.png" /></p>
|
||||
<p><img src="https://test/foo/bar/baz.png" /></p>
|
||||
<h2>Foo</h2>
|
||||
<p> Tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. </p>
|
||||
<p>
|
||||
<img src="http://fakehost/test/foo/bar/baz.png">
|
||||
</p>
|
||||
<p>
|
||||
<img src="http://fakehost/test/foo/bar/baz.png">
|
||||
</p>
|
||||
<p>
|
||||
<img src="http://fakehost/foo/bar/baz.png">
|
||||
</p>
|
||||
<p>
|
||||
<img src="http://test/foo/bar/baz.png">
|
||||
</p>
|
||||
<p>
|
||||
<img src="https://test/foo/bar/baz.png">
|
||||
</p>
|
||||
<p>Tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat
|
||||
non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
|
||||
</article>
|
||||
</div>
|
@ -1,8 +1,6 @@
|
||||
{
|
||||
"title": "Basic tag cleaning test",
|
||||
"byline": null,
|
||||
"dir": null,
|
||||
"excerpt": "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\n tempor incididunt ut labore et dolore magna aliqua.",
|
||||
"siteName": null,
|
||||
"readerable": true
|
||||
}
|
||||
|
@ -1,11 +1,19 @@
|
||||
<div id="readability-page-1" class="page">
|
||||
<div>
|
||||
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
|
||||
<p>Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
|
||||
<p>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
|
||||
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua.</p>
|
||||
<p>Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi
|
||||
ut aliquip ex ea commodo consequat.</p>
|
||||
<p>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum
|
||||
dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
|
||||
</div>
|
||||
<div>
|
||||
<p>Tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
|
||||
<p>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
|
||||
<p>Tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat.</p>
|
||||
<p>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum
|
||||
dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
|
||||
</div>
|
||||
</div>
|
@ -1,8 +0,0 @@
|
||||
{
|
||||
"title": "Obama admits US gun laws are his 'biggest frustration'",
|
||||
"byline": null,
|
||||
"dir": null,
|
||||
"excerpt": "President Barack Obama tells the BBC his failure to pass \"common sense gun safety laws\" is the greatest frustration of his presidency.",
|
||||
"siteName": "BBC News",
|
||||
"readerable": true
|
||||
}
|
@ -1,62 +0,0 @@
|
||||
<div id="readability-page-1" class="page">
|
||||
<div property="articleBody">
|
||||
<p>President Barack Obama has admitted that his failure to pass "common sense gun safety laws" in the US is the greatest frustration of his presidency. </p>
|
||||
<p>In an interview with the BBC, Mr Obama said it was "distressing" not to have made progress on the issue "even in the face of repeated mass killings".</p>
|
||||
<p>He vowed to keep trying, but the BBC's North America editor Jon Sopel said the president did not sound very confident. </p>
|
||||
<p>However, Mr Obama said race relations had improved during his presidency. </p>
|
||||
<p>Hours after the interview, a gunman opened fire at a cinema in the US state of Louisiana, killing two people and injuring several others before shooting himself.</p>
|
||||
<p>In a wide-ranging interview, President Obama also said:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<a href="http://www.bbc.co.uk/news/uk-politics-33647154">The UK must stay in the EU</a> to have influence on the world stage
|
||||
</li>
|
||||
<li>He is confident the Iran nuclear deal will be passed by Congress </li>
|
||||
<li>Syria needs a political solution in order to defeat the Islamic State group</li>
|
||||
<li>He would speak "bluntly" against corruption <a href="http://www.bbc.co.uk/news/world-us-canada-33646563">and human rights violations in Kenya</a>
|
||||
</li>
|
||||
<li>He would defend his advocacy of gay rights following protests in Kenya</li>
|
||||
<li>Despite racial tensions, the US is becoming more diverse and more tolerant</li>
|
||||
</ul>
|
||||
<p><a href="http://www.bbc.co.uk/news/world-us-canada-33646542">Read the full transcript of his interview</a></p>
|
||||
<p>Mr Obama lands in Kenya later on Friday for his first visit since becoming president. </p>
|
||||
<p>But with just 18 months left in power, he said gun control was the area where he has been "most frustrated and most stymied" since coming to power in 2009.</p>
|
||||
<p>"If you look at the number of Americans killed since 9/11 by terrorism, it's less than 100. If you look at the number that have been killed by gun violence, it's in the tens of thousands," Mr Obama said. </p>
|
||||
<figure><img src="http://ichef.bbci.co.uk/news/555/cpsprodpb/462D/production/_84456971_gettyimages-167501087.jpg" datasrc="http://ichef.bbci.co.uk/news/976/cpsprodpb/462D/production/_84456971_gettyimages-167501087.jpg" alt="Gun control campaigners protest in McPhearson Square in Washington DC - 25 April 2013" height="549" width="976" />
|
||||
<figcaption>
|
||||
<span> The president said he would continue fighting for greater gun control laws </span>
|
||||
</figcaption>
|
||||
</figure>
|
||||
<p>"For us not to be able to resolve that issue has been something that is distressing," he added. </p>
|
||||
<p>Mr Obama has pushed for stricter gun control throughout his presidency but has been unable to secure any significant changes to the laws. </p>
|
||||
<p>After nine African-American churchgoers were killed in South Carolina in June, he admitted "politics in this town" meant there were few options available.</p>
|
||||
<figure><img src="http://ichef.bbci.co.uk/news/555/media/images/76020000/jpg/_76020974_line976.jpg" datasrc="http://ichef.bbci.co.uk/news/464/media/images/76020000/jpg/_76020974_line976.jpg" alt="line" height="2" width="464" /></figure>
|
||||
<h2>Analysis: Jon Sopel, BBC News, Washington</h2>
|
||||
<figure><img src="http://ichef-1.bbci.co.uk/news/555/cpsprodpb/6D3D/production/_84456972_p072315al-0500.jpg" datasrc="http://ichef-1.bbci.co.uk/news/976/cpsprodpb/6D3D/production/_84456972_p072315al-0500.jpg" alt="President Barack Obama participates in an interview with Jon Sopel of BBC in the Roosevelt Room of the White House - 23 July 2015" height="549" width="976" /></figure>
|
||||
<p>Nine months ago, the president seemed like a spent force, after taking a beating in the midterm elections, during which members of his own party were reluctant to campaign on his record. </p>
|
||||
<p>But the man sat before me today was relaxed and confident, buoyed by a string of "wins" on healthcare, Cuba and Iran, after bitter and ongoing battles with his many critics. </p>
|
||||
<p>The only body swerve the president performed was when I asked him <a href="http://www.bbc.co.uk/news/world-us-canada-33643168"> how many minds he had changed on the Iran nuclear deal </a>after an intense sell aimed at Gulf allies and members of US Congress who remain implacably opposed. </p>
|
||||
<p>There was a momentary flicker across the president's face as if to say "You think you got me?" before his smile returned and he proceeded to talk about how Congress would come round.</p>
|
||||
<p>But notably, he did not give a direct answer to that question, which leaves me with the impression that he has persuaded precisely zero.</p>
|
||||
<p><a href="http://www.bbc.co.uk/news/world-us-canada-33646875">Five things we learned from Obama interview</a></p>
|
||||
<p><a href="http://www.bbc.co.uk/news/world-us-canada-33646545">The presidential body swerve</a></p>
|
||||
<figure><img src="http://ichef.bbci.co.uk/news/555/media/images/76020000/jpg/_76020974_line976.jpg" datasrc="http://ichef.bbci.co.uk/news/464/media/images/76020000/jpg/_76020974_line976.jpg" alt="line" height="2" width="464" /></figure>
|
||||
<p>On race relations, Mr Obama said recent concerns around policing and mass incarcerations were "legitimate and deserve intense attention" but insisted progress had been made. </p>
|
||||
<p>Children growing up during the eight years of his presidency "will have a different view of race relations in this country and what's possible," he said. </p>
|
||||
<p>"There are going to be tensions that arise. But if you look at my daughters' generation, they have an attitude about race that's entirely different than even my generation."</p>
|
||||
<p>Talking about how he was feeling after his recent successes, he said "every president, every leader has strengths and weaknesses". </p>
|
||||
<p>"One of my strengths is I have a pretty even temperament. I don't get too high when it's high and I don't get too low when it's low," he said. </p>
|
||||
<figure><img src="http://ichef-1.bbci.co.uk/news/555/cpsprodpb/142FD/production/_84458628_shirtreuters.jpg" datasrc="http://ichef-1.bbci.co.uk/news/976/cpsprodpb/142FD/production/_84458628_shirtreuters.jpg" alt="Customer looks at Obama shirts at a stall in Nairobi's Kibera slums, 23 July 2015" height="549" width="976" />
|
||||
<figcaption>
|
||||
<span> Kenya is getting ready to welcome the US president </span>
|
||||
</figcaption>
|
||||
</figure>
|
||||
<h2>Kenya trip</h2>
|
||||
<p>Mr Obama was speaking to the BBC at the White House before departing for Kenya.</p>
|
||||
<p>His father was Kenyan and the president is expected to meet relatives in Nairobi.</p>
|
||||
<p>Mr Obama has faced criticism in the country after the US legalised gay marriage. However, in his interview, the president said he would not fall silent on the issue.</p>
|
||||
<p>"I am not a fan of discrimination and bullying of anybody on the basis of race, on the basis of religion, on the basis of sexual orientation or gender," he said.</p>
|
||||
<p>The president also admitted that some African governments, including Kenya's, needed to improve their records on human rights and democracy. However, he defended his decision to engage with and visit those governments. </p>
|
||||
<p>"Well, they're not ideal institutions. But what we found is, is that when we combined blunt talk with engagement, that gives us the best opportunity to influence and open up space for civil society." </p>
|
||||
<p>Mr Obama will become the first US president to address the African Union when he travels on to Ethiopia on Sunday.</p>
|
||||
</div>
|
||||
</div>
|
File diff suppressed because one or more lines are too long
@ -1,8 +0,0 @@
|
||||
{
|
||||
"title": "Open Verilog flow for Silego GreenPak4 programmable logic devices",
|
||||
"byline": null,
|
||||
"dir": "ltr",
|
||||
"excerpt": "I've written a couple of posts in the past few months but they were all for the blog at work so I figured I'm long overdue for one on Silic...",
|
||||
"siteName": null,
|
||||
"readerable": true
|
||||
}
|
@ -1,117 +0,0 @@
|
||||
<div id="readability-page-1" class="page">
|
||||
<div id="post-body-932306423056216142" itemprop="description articleBody">
|
||||
<p> I've written a couple of posts in the past few months but they were all for <a href="http://blog.ioactive.com/search/label/Andrew%20Zonenberg">the blog at work</a> so I figured I'm long overdue for one on Silicon Exposed.</p>
|
||||
<h2> So what's a GreenPak?</h2>
|
||||
<p> Silego Technology is a fabless semiconductor company located in the SF Bay area, which makes (among other things) a line of programmable logic devices known as GreenPak. Their <a href="http://www.silego.com/products/greenpak5.html">5th generation parts</a> were just announced, but I started this project before that happened so I'm still targeting the <a href="http://www.silego.com/products/greenpak4.html">4th generation</a>.</p>
|
||||
<p> GreenPak devices are kind of like itty bitty <a href="http://www.cypress.com/products/32-bit-arm-cortex-m-psoc">PSoCs</a> - they have a mixed signal fabric with an ADC, DACs, comparators, voltage references, plus a digital LUT/FF fabric and some typical digital MCU peripherals like counters and oscillators (but no CPU).</p>
|
||||
<p> It's actually an interesting architecture - FPGAs (including some devices marketed as CPLDs) are a 2D array of LUTs connected via wires to adjacent cells, and true (product term) CPLDs are a star topology of AND-OR arrays connected by a crossbar. GreenPak, on the other hand, is a star topology of LUTs, flipflops, and analog/digital hard IP connected to a crossbar.</p>
|
||||
<p> Without further ado, here's a block diagram showing all the cool stuff you get in the SLG46620V:</p>
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<a href="https://1.bp.blogspot.com/-YIPC5jkXkDE/Vy7YPSqFKWI/AAAAAAAAAxI/a7D6Ji2GxoUvcrwUkI4RLZcr2LFQEJCTACLcB/s1600/block-diagram.png" imageanchor="1"><img height="512" src="https://1.bp.blogspot.com/-YIPC5jkXkDE/Vy7YPSqFKWI/AAAAAAAAAxI/a7D6Ji2GxoUvcrwUkI4RLZcr2LFQEJCTACLcB/s640/block-diagram.png" width="640" /></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>SLG46620V block diagram (from device datasheet)</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p> They're also tiny (the SLG46620V is a 20-pin 0.4mm pitch STQFN measuring 2x3 mm, and the lower gate count SLG46140V is a mere 1.6x2 mm) and probably the cheapest programmable logic device on the market - $0.50 in low volume and less than $0.40 in larger quantities.</p>
|
||||
<p> The Vdd range of GreenPak4 is huge, more like what you'd expect from an MCU than an FPGA! It can run on anything from 1.8 to 5V, although performance is only specified at 1.8, 3.3, and 5V nominal voltages. There's also a dual-rail version that trades one of the GPIO pins for a second power supply pin, allowing you to interface to logic at two different voltage levels.</p>
|
||||
<p> To support low-cost/space-constrained applications, they even have the configuration memory on die. It's one-time programmable and needs external Vpp to program (presumably Silego didn't want to waste die area on charge pumps that would only be used once) but has a SRAM programming mode for prototyping.</p>
|
||||
<p> The best part is that the development software (GreenPak Designer) is free of charge and provided for all major operating systems including Linux! Unfortunately, the only supported design entry method is schematic entry and there's no way to write your design in a HDL.</p>
|
||||
<p> While schematics may be fine for quick tinkering on really simple designs, they quickly get unwieldy. The nightmare of a circuit shown below is just a bunch of counters hooked up to LEDs that blink at various rates.</p>
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<a href="https://1.bp.blogspot.com/-k3naUT3uXao/Vy7WFac246I/AAAAAAAAAw8/mePy_ostO8QJra5ZJrbP2WGhTlJ0B_r8gCLcB/s1600/schematic-from-hell.png" imageanchor="1"><img height="334" src="https://1.bp.blogspot.com/-k3naUT3uXao/Vy7WFac246I/AAAAAAAAAw8/mePy_ostO8QJra5ZJrbP2WGhTlJ0B_r8gCLcB/s640/schematic-from-hell.png" width="640" /></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Schematic from hell!</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p> As if this wasn't enough of a problem, the largest GreenPak4 device (the SLG46620V) is split into two halves with limited routing between them, and the GUI doesn't help the user manage this complexity at all - you have to draw your schematic in two halves and add "cross connections" between them.</p>
|
||||
<p> The icing on the cake is that schematics are a pain to diff and collaborate on. Although GreenPak schematics are XML based, which is a touch better than binary, who wants to read a giant XML diff and try to figure out what's going on in the circuit?</p>
|
||||
<p> This isn't going to be a post on the quirks of Silego's software, though - that would be boring. As it turns out, there's one more exciting feature of these chips that I didn't mention earlier: the configuration bitstream is 100% documented in the device datasheet! This is unheard of in the programmable logic world. As Nick of Arachnid Labs <a href="http://www.arachnidlabs.com/blog/2015/03/30/greenpak/">says</a>, the chip is "just dying for someone to write a VHDL or Verilog compiler for it". As you can probably guess by from the title of this post, I've been busy doing exactly that.</p>
|
||||
<h2> Great! How does it work?</h2>
|
||||
<p> Rather than wasting time writing a synthesizer, I decided to write a GreenPak technology library for Clifford Wolf's excellent open source synthesis tool, <a href="http://www.clifford.at/yosys/">Yosys</a>, and then make a place-and-route tool to turn that into a final netlist. The post-PAR netlist can then be loaded into GreenPak Designer in order to program the device.</p>
|
||||
<p> The first step of the process is to run the "synth_greenpak4" Yosys flow on the Verilog source. This runs a generic RTL synthesis pass, then some coarse-grained extraction passes to infer shift register and counter cells from behavioral logic, and finally maps the remaining logic to LUT/FF cells and outputs a JSON-formatted netlist.</p>
|
||||
<p> Once the design has been synthesized, my tool (named, surprisingly, gp4par) is then launched on the netlist. It begins by parsing the JSON and constructing a directed graph of cell objects in memory. A second graph, containing all of the primitives in the device and the legal connections between them, is then created based on the device specified on the command line. (As of now only the SLG46620V is supported; the SLG46621V can be added fairly easily but the SLG46140V has a slightly different microarchitecture which will require a bit more work to support.)</p>
|
||||
<p> After the graphs are generated, each node in the netlist graph is assigned a numeric label identifying the type of cell and each node in the device graph is assigned a list of legal labels: for example, an I/O buffer site is legal for an input buffer, output buffer, or bidirectional buffer.</p>
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<a href="https://2.bp.blogspot.com/-kIekczO693g/Vy7dBqYifXI/AAAAAAAAAxc/hMNJBs5bedIQOrBzzkhq4gbmhR-n58EQwCLcB/s1600/graph-labels.png" imageanchor="1"><img height="141" src="https://2.bp.blogspot.com/-kIekczO693g/Vy7dBqYifXI/AAAAAAAAAxc/hMNJBs5bedIQOrBzzkhq4gbmhR-n58EQwCLcB/s400/graph-labels.png" width="400" /></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Example labeling for a subset of the netlist and device graphs</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p> The labeled nodes now need to be placed. The initial placement uses a simple greedy algorithm to create a valid (although not necessarily optimal or even routable) placement:</p>
|
||||
<ol>
|
||||
<li>Loop over the cells in the netlist. If any cell has a LOC constraint, which locks the cell to a specific physical site, attempt to assign the node to the specified site. If the specified node is the wrong type, doesn't exist, or is already used by another constrained node, the constraint is invalid so fail with an error.</li>
|
||||
<li>Loop over all of the unconstrained cells in the netlist and assign them to the first unused site with the right label. If none are available, the design is too big for the device so fail with an error.</li>
|
||||
</ol>
|
||||
<p> Once the design is placed, the placement optimizer then loops over the design and attempts to improve it. A simulated annealing algorithm is used, where changes to the design are accepted unconditionally if they make the placement better, and with a random, gradually decreasing probability if they make it worse. The optimizer terminates when the design receives a perfect score (indicating an optimal placement) or if it stops making progress for several iterations. Each iteration does the following:</p>
|
||||
<ol>
|
||||
<li>Compute a score for the current design based on the number of unroutable nets, the amount of routing congestion (number of nets crossing between halves of the device), and static timing analysis (not yet implemented, always zero).</li>
|
||||
<li>Make a list of nodes that contributed to this score in some way (having some attached nets unroutable, crossing to the other half of the device, or failing timing).</li>
|
||||
<li>Remove nodes from the list that are LOC'd to a specific location since we're not allowed to move them.</li>
|
||||
<li>Remove nodes from the list that have only one legal placement in the device (for example, oscillator hard IP) since there's nowhere else for them to go.</li>
|
||||
<li>Pick a node from the remainder of the list at random. Call this our pivot.</li>
|
||||
<li>Find a list of candidate placements for the pivot: </li>
|
||||
<ol>
|
||||
<li>Consider all routable placements in the other half of the device.</li>
|
||||
<li>If none were found, consider all routable placements anywhere in the device.</li>
|
||||
<li>If none were found, consider all placements anywhere in the device even if they're not routable.</li>
|
||||
</ol>
|
||||
<li>Pick one of the candidates at random and move the pivot to that location. If another cell in the netlist is already there, put it in the vacant site left by the pivot.</li>
|
||||
<li>Re-compute the score for the design. If it's better, accept this change and start the next iteration.</li>
|
||||
<li>If the score is worse, accept it with a random probability which decreases as the iteration number goes up. If the change is not accepted, restore the previous placement.</li>
|
||||
</ol>
|
||||
<p> After optimization, the design is checked for routability. If any edges in the netlist graph don't correspond to edges in the device graph, the user probably asked for something impossible (for example, trying to hook a flipflop's output to a comparator's reference voltage input) so fail with an error.</p>
|
||||
<p> The design is then routed. This is quite simple due to the crossbar structure of the device. For each edge in the netlist:</p>
|
||||
<ol>
|
||||
<li>If dedicated (non-fabric) routing is used for this path, configure the destination's input mux appropriately and stop.</li>
|
||||
<li>If the source and destination are in the same half of the device, configure the destination's input mux appropriately and stop.</li>
|
||||
<li>A cross-connection must be used. Check if we already used one to bring the source signal to the other half of the device. If found, configure the destination to route from that cross-connection and stop.</li>
|
||||
<li>Check if we have any cross-connections left going in this direction. If they're all used, the design is unroutable due to congestion so fail with an error.</li>
|
||||
<li>Pick the next unused cross-connection and configure it to route from the source. Configure the destination to route from the cross-connection and stop.</li>
|
||||
</ol>
|
||||
<p> Once routing is finished, run a series of post-PAR design rule checks. These currently include the following:</p>
|
||||
<ul>
|
||||
<li>If any node has no loads, generate a warning</li>
|
||||
<li>If an I/O buffer is connected to analog hard IP, fail with an error if it's not configured in analog mode.</li>
|
||||
<li>Some signals (such as comparator inputs and oscillator power-down controls) are generated by a shared mux and fed to many loads. If different loads require conflicting settings for the shared mux, fail with an error.</li>
|
||||
</ul>
|
||||
<p> If DRC passes with no errors, configure all of the individual cells in the netlist based on the HDL parameters. Fail with an error if an invalid configuration was requested.</p>
|
||||
<p> Finally, generate the bitstream from all of the per-cell configuration and write it to a file.</p>
|
||||
<h2> Great, let's get started!</h2>
|
||||
<p> If you don't already have one, you'll need to buy a <a href="http://www.silego.com/buy/index.php?main_page=product_info&products_id=388">GreenPak4 development kit</a>. The kit includes samples of the SLG46620V (among other devices) and a programmer/emulation board. While you're waiting for it to arrive, install <a href="http://www.silego.com/softdoc/software.html">GreenPak Designer</a>.</p>
|
||||
<p> Download and install Yosys. Although Clifford is pretty good at merging my pull requests, only <a href="https://github.com/azonenberg/yosys/">my fork on Github</a> is guaranteed to have the most up-to-date support for GreenPak devices so don't be surprised if you can't use a bleeding-edge feature with mainline Yosys.</p>
|
||||
<p> Download and install gp4par. You can get it from <a href="https://github.com/azonenberg/openfpga/">the Github repository</a>.</p>
|
||||
<p> Write your HDL, compile with Yosys, P&R with gp4par, and import the bitstream into GreenPak Designer to program the target device. The most current gp4par manual is included in LaTeX source form in the source tree and is automatically built as part of the compile process. If you're just browsing, there's a <a href="http://thanatos.virtual.antikernel.net/unlisted/gp4-hdl.pdf">relatively recent PDF version</a> on my web server.</p>
|
||||
<p> If you'd like to see the Verilog that produced the nightmare of a schematic I showed above, <a href="https://github.com/azonenberg/openfpga/blob/master/tests/greenpak4/Blinky/Blinky.v">here it is</a>.</p>
|
||||
<p> Be advised that this project is still very much a work in progress and there are still a number of SLG46620V features I don't support (see the manual for exact details).</p>
|
||||
<h2> I love it / it segfaulted / there's a problem in the manual!</h2>
|
||||
<p> Hop in our IRC channel (##openfpga on Freenode) and let me know. Feedback is great, pull requests are even better,</p>
|
||||
<h2> You're competing with Silego's IDE. Have they found out and sued you yet?</h2>
|
||||
<p> Nope. They're fully aware of what I'm doing and are rolling out the red carpet for me. They love the idea of a HDL flow as an alternative to schematic entry and are pretty amazed at how fast it's coming together.</p>
|
||||
<p> After I reported a few bugs in their datasheets they decided to skip the middleman and give me direct access to the engineer who writes their documentation so that I can get faster responses. The last time I found a problem (two different parts of the datasheet contradicted each other) an updated datasheet was in my inbox and on their website by the next day. I only wish Xilinx gave me that kind of treatment!</p>
|
||||
<p> They've even <a href="https://twitter.com/SilegoTech/status/717018987771469824">offered me free hardware</a> to help me add support for their latest product family, although I plan to get GreenPak4 support to a more stable state before taking them up on the offer.</p>
|
||||
<h2> So what's next?</h2>
|
||||
<p> Better testing, for starters. I have to verify functionality by hand with a DMM and oscilloscope, which is time consuming.</p>
|
||||
<p> My contact at Silego says they're going to be giving me documentation on the SRAM emulation interface soon, so I'm going to make a hardware-in-loop test platform that connects to my desktop and the Silego ZIF socket, and lets me load new bitstreams via a scriptable interface. It'll have FPGA-based digital I/O as well as an ADC and DAC on every device pin, plus an adjustable voltage regulator for power, so I can feed in arbitrary mixed-signal test waveforms and write PC-based unit tests to verify correct behavior.</p>
|
||||
<p> Other than that, I want to finish support for the SLG46620V in the next month or two. The SLG46621V will be an easy addition since only one pin and the relevant configuration bits have changed from the 46620 (I suspect they're the same die, just bonded out differently).</p>
|
||||
<p> Once that's done I'll have to do some more extensive work to add the SLG46140V since the architecture is a bit different (a lot of the combinatorial logic is merged into multi-function blocks). Luckily, the 46140 has a lot in common architecturally with the GreenPak5 family, so once that's done GreenPak5 will probably be a lot easier to add support for.</p>
|
||||
<p> My thanks go out to Clifford Wolf, whitequark, the IRC users in ##openfpga, and everyone at Silego I've worked with to help make this possible. I hope that one day this project will become mature enough that Silego will ship it as an officially supported extension to GreenPak Designer, making history by becoming the first modern programmable logic vendor to ship a fully open source synthesis and P&R suite. </p>
|
||||
</div>
|
||||
</div>
|
File diff suppressed because it is too large
Load Diff
@ -1,8 +0,0 @@
|
||||
{
|
||||
"title": "'Neutral' Snopes Fact-Checker David Emery: 'Are There Any Un-Angry Trump Supporters?' - Breitbart",
|
||||
"byline": "by Lucas Nolan22 Dec 2016651",
|
||||
"dir": "ltr",
|
||||
"excerpt": "Snopes fact checker and staff writer David Emery posted to Twitter asking if there were “any un-angry Trump supporters?”",
|
||||
"siteName": "Breitbart",
|
||||
"readerable": true
|
||||
}
|
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
@ -1,8 +0,0 @@
|
||||
{
|
||||
"title": "Student Dies After Diet Pills She Bought Online \"Burned Her Up From Within\"",
|
||||
"byline": null,
|
||||
"dir": null,
|
||||
"excerpt": "An inquest into Eloise Parry's death has been adjourned until July.",
|
||||
"siteName": "BuzzFeed",
|
||||
"readerable": true
|
||||
}
|
File diff suppressed because one or more lines are too long
@ -1,8 +0,0 @@
|
||||
{
|
||||
"title": "The Modern Ambitions Behind Neon",
|
||||
"byline": "Sarah Archer",
|
||||
"dir": null,
|
||||
"excerpt": "The once-ubiquitous form of lighting was novel when it first emerged in the early 1900s, though it has since come to represent decline.",
|
||||
"siteName": "CityLab",
|
||||
"readerable": true
|
||||
}
|
File diff suppressed because one or more lines are too long
@ -1,8 +1,6 @@
|
||||
{
|
||||
"title": "Bartleby the Scrivener Web Study Text",
|
||||
"byline": null,
|
||||
"dir": null,
|
||||
"excerpt": "Ere introducing the scrivener, as he first appeared to me, it is fit \n I make some mention of myself, my employees, my business, my chambers, \n and general surroundings; because some such description is indispensable \n to an adequate understanding of the chief character about to be presented.",
|
||||
"siteName": null,
|
||||
"readerable": true
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,8 +0,0 @@
|
||||
{
|
||||
"title": "Twitter Lite se estrena en México, Venezuela y otros nueve países",
|
||||
"byline": "César Salza",
|
||||
"dir": null,
|
||||
"excerpt": "Twitter Lite llega a 11 países de América Latina, para ayudar a los usuarios con mala señal de sus redes móviles.",
|
||||
"siteName": "CNET en Español",
|
||||
"readerable": true
|
||||
}
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,8 +0,0 @@
|
||||
{
|
||||
"title": "Zuckerberg offers peek at Facebook's acquisition strategies",
|
||||
"byline": "Steven Musil",
|
||||
"dir": null,
|
||||
"excerpt": "Facebook CEO says be a friend and have a shared vision, but scare them when you have to and move fast.",
|
||||
"siteName": "CNET",
|
||||
"readerable": true
|
||||
}
|
@ -1,29 +0,0 @@
|
||||
<div id="readability-page-1" class="page">
|
||||
<div itemprop="articleBody" data-component="lazyloadImages">
|
||||
<figure section="shortcodeImage"><span><span itemprop="image" itemscope="" itemtype="https://schema.org/ImageObject"><img src="https://cnet1.cbsistatic.com/img/nAMdBzIE1ogVw5bOBZBaiJCt3Ro=/570x0/2014/03/21/863df5d9-e8b8-4b38-851b-5e3f77f2cf0e/mark-zuckerberg-facebook-home-10671610x407.jpg" alt="" width="570" height="0" />
|
||||
<meta itemprop="url" content="https://cnet1.cbsistatic.com/img/nAMdBzIE1ogVw5bOBZBaiJCt3Ro=/570x0/2014/03/21/863df5d9-e8b8-4b38-851b-5e3f77f2cf0e/mark-zuckerberg-facebook-home-10671610x407.jpg" />
|
||||
<meta itemprop="height" content="0" />
|
||||
<meta itemprop="width" content="570" />
|
||||
</span></span>
|
||||
<figcaption><span class="caption">
|
||||
<p>Facebook CEO Mark Zuckerberg, the man with the acquisition plan.</p>
|
||||
</span><span>Photo by James Martin/CNET </span></figcaption>
|
||||
</figure>
|
||||
<p>Anyone who has ever been involved in closing a billion-dollar acquisition deal will tell you that you don't go in without a clear, well thought out plan.</p>
|
||||
<p>Facebook CEO Mark Zuckerberg knows a thing or two about how to seal the deal on blockbuster buys. After all, he's the man behind his company's <a href="https://www.cnet.com/news/facebook-closes-19-billion-deal-for-whatsapp/" target="_blank">$19 billion acquisition</a> of WhatsApp, he <a href="https://www.cnet.com/news/zuckerberg-did-1-billion-instagram-deal-on-his-own/" target="_blank">personally brokered</a> its $1 billion buyout of <a href="https://www.cnet.com/news/why-facebook-plunked-down-1-billion-to-buy-instagram/" target="_blank">Instagram</a> and closed the <a href="https://www.cnet.com/news/facebook-to-buy-oculus-for-2-billion/" target="_blank">$3 billion deal</a> to buy Oculus VR.</p>
|
||||
<p>Zuckerberg offered a primer on the strategies he and his company employ when they see an attractive target during testimony Tuesday <a href="https://www.cnet.com/news/zenimax-sues-oculus-over-virtual-reality-rift-tech/">in a lawsuit with ZeniMax Media</a>, which accuses Oculus and Facebook of "misappropriating" trade secrets and copyright infringement. At the heart of the lawsuit is technology that helped create liftoff for virtual reality, one of the <a href="http://www.cbsnews.com/videos/the-reality-of-the-virtual-world/" target="_blank" data-component="externalLink">hottest gadget trends today.</a></p>
|
||||
<p>A key Facebook approach is building a long-term relationship with your target, Zuckerberg said at the trial. These deals don't just pop up over night, he said according to a transcript reviewed by <a href="http://www.businessinsider.com/mark-zuckerberg-explains-facebooks-acquisition-strategy-2017-1" target="_blank" data-component="externalLink">Business Insider</a>. They take time to cultivate. </p>
|
||||
<blockquote>
|
||||
<p>I've been building relationships, at least in Instagram and the WhatsApp cases, for years with the founders and the people that are involved in these companies, which made [it] so that when it became time or when we thought it was the right time to move, we felt like we had a good amount of context and had good relationships so that we could move quickly, which was competitively important and why a lot of these acquisitions, I think, came to us instead of our competitors and ended up being very good acquisitions over time that a lot of competitors wished they had gotten instead. </p>
|
||||
</blockquote>
|
||||
<p> He also stressed the need assure your target that you have a shared vision about how you will collaborate after the deal is put to bed. Zuckerberg said this was reason Facebook was able to acquire Oculus for less than its original $4 billion asking price.</p>
|
||||
<blockquote>If this [deal] is going to happen, it's not going to be because we offer a lot of money, although we're going to have to offer a fair price for the company that is more than what they felt like they could do on their own. But they also need to feel like this was actually going to help their mission.</blockquote>
|
||||
<p>When that doesn't work, Zuckerberg said scare tactics is an effective, if undesirable, way of persuading small startups that they face a better chance of survival if they have Facebook to guide their way rather than going it alone.</p>
|
||||
<blockquote>That's less my thing, but I think if you are trying to help convince people that they want to join you, helping them understand all the pain that they would have to go through to build it out independently is a valuable tactic. </blockquote>
|
||||
<p>It also pays to be weary of competing suitors for your startup, Zuckerberg said, and be willing to move fast to stave off rivals and get the deal done.</p>
|
||||
<blockquote>Often, if a company knows we're offering something, they will offer more. So being able to move quickly not only increases our chance of being able to get a deal done if we want to, but it makes it so we don't have end up having to pay a lot more because the process drags out.</blockquote>
|
||||
<p>It wasn't clear why these strategies didn't work on Snapchat CEO Evan Spiegel, who <a href="https://www.cnet.com/news/snapchat-said-to-rebuff-3-billion-offer-from-facebook/">famously rebuffed</a> a $3 billion takeover offer from Facebook in 2013.</p>
|
||||
<p><em><strong>Tech Enabled:</strong> CNET chronicles tech's role in providing new kinds of accessibility. Check it out <a href="https://www.cnet.com/tech-enabled/">here</a>.</em><em><strong><br /></strong></em></p>
|
||||
<p><em><strong>Technically Literate:</strong> Original works of short fiction with unique perspectives on tech, exclusively on CNET. <a href="https://www.cnet.com/technically-literate/">Here</a>.</em></p>
|
||||
</div>
|
||||
</div>
|
File diff suppressed because one or more lines are too long
@ -1,8 +0,0 @@
|
||||
{
|
||||
"title": "The 'birth lottery' and economic mobility",
|
||||
"byline": "Ahiza Garcia",
|
||||
"dir": null,
|
||||
"excerpt": "A recently-released report on poverty and inequality found that the U.S. ranks the lowest among countries with welfare states.",
|
||||
"siteName": "CNNMoney",
|
||||
"readerable": true
|
||||
}
|
@ -1,30 +0,0 @@
|
||||
<div id="readability-page-1" class="page">
|
||||
<div id="storytext">
|
||||
<h2>The U.S. has long been heralded as a land of opportunity -- a place where anyone can succeed regardless of the economic class they were born into.</h2>
|
||||
<p> But a new report released on Monday by <a href="http://web.stanford.edu/group/scspi-dev/cgi-bin/" target="_blank">Stanford University's Center on Poverty and Inequality</a> calls that into question. </p>
|
||||
<p> The report assessed poverty levels, income and wealth inequality, economic mobility and unemployment levels among 10 wealthy countries with social welfare programs. </p>
|
||||
<div id="smartassetcontainer">
|
||||
<p> Powered by SmartAsset.com </p>
|
||||
</div>
|
||||
<p> Among its key findings: the class you're born into matters much more in the U.S. than many of the other countries. </p>
|
||||
<p> As the <a href="http://web.stanford.edu/group/scspi-dev/cgi-bin/publications/state-union-report" target="_blank">report states</a>: "[T]he birth lottery matters more in the U.S. than in most well-off countries." </p>
|
||||
<p> But this wasn't the only finding that suggests the U.S. isn't quite living up to its reputation as a country where everyone has an equal chance to get ahead through sheer will and hard work. </p>
|
||||
<p> <a href="http://money.cnn.com/2016/01/11/news/economy/rich-taxes/index.html?iid=EL"><span>Related: Rich are paying more in taxes but not as much as they used to</span></a> </p>
|
||||
<p> The report also suggested the U.S. might not be the "jobs machine" it thinks it is, when compared to other countries. </p>
|
||||
<p> It ranked near the bottom of the pack based on the levels of unemployment among men and women of prime working age. The study determined this by taking the ratio of employed men and women between the ages of 25 and 54 compared to the total population of each country. </p>
|
||||
<p> The overall rankings of the countries were as follows:<span> <br />1. Finland <span> <br />2. Norway<span> <br />3. Australia <span> <br />4. Canada<span> <br />5. Germany<span> <br />6. France<span> <br />7. United Kingdom <span> <br />8. Italy<span> <br />9. Spain<span> <br />10. United States </span></span>
|
||||
</span>
|
||||
</span>
|
||||
</span>
|
||||
</span>
|
||||
</span>
|
||||
</span>
|
||||
</span>
|
||||
</span>
|
||||
</p>
|
||||
<p> The low ranking the U.S. received was due to its extreme levels of wealth and income inequality and the ineffectiveness of its "safety net" -- social programs aimed at reducing poverty. </p>
|
||||
<p> <a href="http://money.cnn.com/2016/01/05/news/economy/chicago-segregated/index.html?iid=EL"><span>Related: Chicago is America's most segregated city</span></a> </p>
|
||||
<p> The report concluded that the American safety net was ineffective because it provides only half the financial help people need. Additionally, the levels of assistance in the U.S. are generally lower than in other countries. </p>
|
||||
<p><span> CNNMoney (New York) </span> <span>First published February 1, 2016: 1:28 AM ET</span> </p>
|
||||
</div>
|
||||
</div>
|
File diff suppressed because it is too large
Load Diff
@ -1,8 +1,6 @@
|
||||
{
|
||||
"title": "Test script parsing",
|
||||
"byline": null,
|
||||
"dir": null,
|
||||
"excerpt": "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\n tempor incididunt ut labore et dolore magna aliqua.",
|
||||
"siteName": null,
|
||||
"readerable": true
|
||||
}
|
||||
|
@ -1,11 +1,19 @@
|
||||
<div id="readability-page-1" class="page">
|
||||
<div>
|
||||
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
|
||||
<p>Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
|
||||
<p>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
|
||||
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua.</p>
|
||||
<p>Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi
|
||||
ut aliquip ex ea commodo consequat.</p>
|
||||
<p>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum
|
||||
dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
|
||||
</div>
|
||||
<div>
|
||||
<p>Tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
|
||||
<p>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
|
||||
<p>Tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat.</p>
|
||||
<p>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum
|
||||
dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
|
||||
</div>
|
||||
</div>
|
@ -1,8 +0,0 @@
|
||||
{
|
||||
"title": "Daring Fireball: Colophon",
|
||||
"byline": null,
|
||||
"dir": null,
|
||||
"excerpt": "Daring Fireball is written and produced by John Gruber.",
|
||||
"siteName": null,
|
||||
"readerable": true
|
||||
}
|
@ -1,8 +0,0 @@
|
||||
{
|
||||
"title": "Document",
|
||||
"byline": null,
|
||||
"dir": null,
|
||||
"excerpt": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Natus eaque totam provident obcaecati nisi praesentium iusto velit fuga debitis quidem ut repellat corrupti, eligendi inventore quibusdam perspiciatis delectus omnis pariatur excepturi quasi fugit? A adipisci natus nostrum, qui aperiam, at culpa corrupti autem enim earum vitae. Nostrum et officiis facere ex recusandae tenetur, delectus odit provident soluta id perferendis ducimus quibusdam corporis rerum voluptatem architecto sequi beatae quod mollitia voluptatibus earum tempora inventore ut. Deserunt reprehenderit recusandae nostrum, eaque fuga cum, repellat, perspiciatis ducimus in non consequatur ratione. Sint rerum necessitatibus deleniti odio earum voluptatum eos modi ab dolor minus.",
|
||||
"siteName": null,
|
||||
"readerable": true
|
||||
}
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,8 +0,0 @@
|
||||
{
|
||||
"title": "On Recent Controversial Events - Bradley M. Kuhn ( Brad ) ( bkuhn )",
|
||||
"byline": "Bradley M. Kuhn (http://ebb.org/bkuhn/)",
|
||||
"dir": null,
|
||||
"excerpt": "The website of Bradley M. Kuhn, aka Brad, aka bkuhn. This site includes his GPG keys, resume, blog, projects list, software, interviews, speeches and writing.",
|
||||
"siteName": null,
|
||||
"readerable": true
|
||||
}
|
@ -1,26 +0,0 @@
|
||||
<div id="readability-page-1" class="page">
|
||||
<div id="contentWithSidebar">
|
||||
<p> Tuesday 15 October 2019 by Bradley M. Kuhn </p>
|
||||
<p> The last 33 days have been unprecedentedly difficult for the software freedom community and for me personally. Folks have been emailing, phoning, texting, tagging me on social media (— the last of which has been funny, because all my social media accounts are placeholder accounts). But, just about everyone has urged me to comment on the serious issues that the software freedom community now faces. Until now, I have stayed silent regarding all these current topics: from Richard M. Stallman (RMS)'s public statements, to <a href="https://www.fsf.org/news/richard-m-stallman-resigns">his resignation from the Free Software Foundation (FSF)</a>, to the Epstein scandal and its connection to MIT. I've also avoided generally commenting on software freedom organizational governance during this period. I did this for good reason, which is explained below. However, in this blog post, I now share my primary comments on the matters that seem to currently be of the utmost attention of the Open Source and Free Software communities. </p>
|
||||
<p> I have been silent the last month because, until two days ago, I was an at-large member of <a href="https://www.fsf.org/about/staff-and-board">FSF's Board of Directors</a>, and a <a href="https://static.fsf.org/nosvn/fsf-amended-bylaws-current.pdf">Voting Member</a> of the FSF. As a member of FSF's two leadership bodies, I was abiding by a reasonable request from the FSF management and my duty to the organization. Specifically, the FSF asked that all communication during the crisis <a href="https://www.fsf.org/news/richard-m-stallman-resigns">come</a> <a href="https://www.fsf.org/news/fsf-and-gnu">directly</a> from FSF officers and not from at-large directors and/or Voting Members. Furthermore, the FSF management asked all Directors and Voting Members to remain silent on this entire matter — even on issues only tangentially related to the current situation, and even when speaking in our own capacity (e.g., on our own blogs like this one). The FSF is an important organization, and I take any request from the FSF seriously — so I abided fully with their request. </p>
|
||||
<p> The situation was further complicated because folks at my employer, Software Freedom Conservancy (where I also serve on the <a href="https://sfconservancy.org/about/board/#bkuhn">Board of Directors</a>) had strong opinions about this matter as well. Fortunately, the FSF and Conservancy both had already created clear protocols for what I should do if ever there was a disagreement or divergence of views between Conservancy and FSF. I therefore was recused fully from the planning, drafting, and timing of Conservancy's statement on this matter. I thank my colleagues at the Conservancy for working so carefully to keep me entirely outside the loop on their statement and to diligently assure that it was straight-forward for me to manage any potential organizational disagreements. I also thank those at the FSF who outlined clear protocols (ahead of time, back in March 2019) in case a situation like this ever came up. I also know my colleagues at Conservancy care deeply, as I do, about the health and welfare of the FSF and its mission of fighting for universal software freedom for all. None of us want, nor have, any substantive disagreement over software freedom issues. </p>
|
||||
<p> I take very seriously my duty to the various organizations where I have (or have had) affiliations. More generally, I champion non-profit organizational transparency. Unfortunately, the current crisis left me in a quandary between the overarching goal of community transparency and abiding by FSF management's directives. Now that I've left the FSF Board of Directors, FSF's Voting Membership, and all my FSF volunteer roles (which ends my 22-year uninterrupted affiliation with the FSF), I can now comment on the substantive issues that face not just the FSF, but the Free Software community as a whole, while continuing to adhere to my past duty of acting in FSF's best interest. In other words, my affiliation with the FSF has come to an end for many good and useful reasons. The end to this affiliation allows me to speak directly about the core issues at the heart of the community's current crisis. </p>
|
||||
<p> Firstly, all these events — from RMS' public comments on the MIT mailing list, to RMS' resignation from the FSF to RMS' discussions about the next steps for the GNU project — <em>seem</em> to many to have happened ridiculously quickly. But it wasn't actually fast at all. In fact, these events were culmination of issues that were slowly growing in concern to many people, including me. </p>
|
||||
<p> For the last two years, I had been a loud internal voice in the FSF leadership regarding RMS' Free-Software-unrelated public statements; I felt strongly that it was in the best interest of the FSF to actively seek to limit such statements, and that it was my duty to FSF to speak out about this within the organization. Those who only learned of this story in the last month (understandably) believed <a href="https://medium.com/@selamjie/remove-richard-stallman-fec6ec210794">Selam G.'s Medium post</a> raised an entirely new issue. <a href="https://web.archive.org/web/20161107050933/https://www.stallman.org/archives/2016-jul-oct.html#31_October_2016_(Down's_syndrome)">In</a> <a href="https://web.archive.org/web/20170202025227/https://www.stallman.org/archives/2016-nov-feb.html#14_December_2016_(Campaign_of_bull-headed_prudery)">fact</a>, <a href="https://web.archive.org/web/20170224174306/https://www.stallman.org/archives/2016-nov-feb.html#23_February_2017_(A_violent_sex_offender)">RMS'</a> <a href="https://web.archive.org/web/20170612074722/http://stallman.org/archives/2017-mar-jun.html#26_May_2017_(Prudish_ignorantism)">views</a> <a href="https://web.archive.org/web/20170616044924/https://www.stallman.org/archives/2017-mar-jun.html#13_June_2017_(Sex_offender_registry)">and</a> <a href="https://web.archive.org/web/20171020041022/http://stallman.org/archives/2017-jul-oct.html#10_October_2017_(Laws_against_having_sex_with_an_animal)">statements</a> <a href="https://web.archive.org/web/20180131020215/https://stallman.org/archives/2017-jul-oct.html#29_October_2017_(Pestering_women)">posted</a> <a href="https://web.archive.org/web/20180104112431/https://www.stallman.org/archives/2017-nov-feb.html#27_November_2017_(Roy_Moore's_relationships)">on</a> <a href="https://web.archive.org/web/20180509120046/https://stallman.org/archives/2018-mar-jun.html#30_April_2018_(UN_peacekeepers_in_South_Sudan)">stallman.org</a> <a href="https://web.archive.org/web/20180911075211/https://www.stallman.org/archives/2018-jul-oct.html#17_July_2018_(The_bullshitter's_flirting)">about</a> <a href="https://web.archive.org/web/20180911075211/https://www.stallman.org/archives/2018-jul-oct.html#21_August_2018_(Age_and_attraction)">sexual</a> <a href="https://web.archive.org/web/20180924231708/https://stallman.org/archives/2018-jul-oct.html#23_September_2018_(Cody_Wilson)">morality</a> <a href="https://web.archive.org/web/20180919100154/https://stallman.org/antiglossary.html#assult">escalated</a> <a href="https://web.archive.org/web/20181113161736/https://www.stallman.org/archives/2018-sep-dec.html#6_November_2018_(Sex_according_to_porn)">for</a> <a href="https://web.archive.org/web/20190325024048/https://stallman.org/archives/2019-jan-apr.html#14_February_2019_(Respecting_peoples_right_to_say_no)">the</a> <a href="https://www.stallman.org/archives/2019-may-aug.html#11_June_2019_(Stretching_meaning_of_terms)">worse</a> <a href="https://web.archive.org/web/20190801201704/https://stallman.org/archives/2019-may-aug.html#12_June_2019_(Declining_sex_rates)">over</a> <a href="https://web.archive.org/web/20190801201704/https://stallman.org/archives/2019-may-aug.html#30_July_2019_(Al_Franken)">the</a> <a href="https://web.archive.org/web/20190903050208/https://stallman.org/archives/2019-jul-oct.html#27_August_2019_(Me-too_frenzy)">last</a> <a href="https://web.archive.org/web/20191011023557/https://stallman.org/archives/2019-jul-oct.html#21_September_2019_(Sex_workers)">few</a> <a href="https://web.archive.org/web/20180924231708/https://stallman.org/archives/2018-jul-oct.html#23_September_2018_(Cody_Wilson)">years</a>. When the escalation started, I still considered RMS both a friend and colleague, and I attempted to argue with him at length to convince him that some of his positions were harmful to sexual assault survivors and those who are sex trafficked, and to the people who devote their lives in service to such individuals. More importantly to the FSF, I attempted to persuade RMS that launching a controversial campaign on sexual behavior and morality was counter to his and FSF's mission to advance software freedom, and told RMS that my duty as an FSF Director was to assure the best outcome for the FSF, which <acronym title="in my opinion">IMO</acronym> didn't include having a leader who made such statements. Not only is human sexual behavior not a topic on which RMS has adequate academic expertise, but also his positions appear to ignore significant research and widely available information on the subject. Many of his comments, while occasionally politically intriguing, lack empathy for people who experienced trauma. </p>
|
||||
<p> IMO, this is not and has never been a Free Speech issue. I do believe freedom of speech links directly to software freedom: indeed, I see the freedom to publish software under Free licenses as almost a corollary to the freedom of speech. However, we do not need to follow leadership from those whose views we fundamentally disagree. Moreover, organizations need not and should not elevate spokespeople and leaders who speak regularly on unrelated issues that organizations find do not advance their mission, and/or that alienate important constituents. I, like many other software freedom leaders, curtail my public comments on issues not related to <acronym title="Free and Open Source Software">FOSS</acronym>. (Indeed, I would not even be commenting on <em>this issue</em> if it had not become a central issue of concern to the software freedom community.) Leaders have power, and they must exercise the power of their words with <a href="https://lwn.net/Articles/770966/">restraint, not with impunity</a>. </p>
|
||||
<p> RMS has consistently argued that there was a campaign of “prudish intimidation” — seeking to keep him quiet about his views on sexuality. After years of conversing with RMS about how his non-software-freedom views were a distraction, an indulgence, and downright problematic, his general response was to make even more public comments of this nature. The issue is not about RMS' right to say what he believes, nor is it even about whether or not you agree or disagree with RMS' statements. The question is whether an organization should have a designated leader who is on a sustained, public campaign advocating about an unrelated issue that many consider controversial. It really doesn't matter what your view about the controversial issue is; a leader who refuses to stop talking loudly about unrelated issues eventually creates an untenable distraction from the radical activism you're actively trying to advance. The message of universal software freedom is a radical cause; it's basically impossible for one individual to effectively push forward two unrelated controversial agendas at once. In short, the radical message of software freedom became overshadowed by RMS' radical views about sexual morality. </p>
|
||||
<p> And here is where I say the thing that may infuriate many but it's what I believe: I think RMS took a useful step by resigning some of his leadership roles at the FSF. I thank RMS for taking that step, and I wish the FSF Directors well in their efforts to assure that the FSF becomes a welcoming organization to all who care about universal software freedom. The <a href="https://www.fsf.org/about/">FSF's mission</a> is essential to our technological future, and we should all support that mission. I care deeply about that mission myself and have worked and will continue to work in our community in the best interest of the mission. </p>
|
||||
<p> I'm admittedly struggling to find a way to work again with RMS, given his views on sexual morality and his behaviors stemming from those views. I explicitly do not agree with <a href="https://web.archive.org/web/20180919100154/https://stallman.org/antiglossary.html#assult">this “(re-)definition” of sexual assault</a>. Furthermore, I believe uninformed statements about sexual assault are irresponsible and cause harm to victims. #MeToo is <strong><a href="https://web.archive.org/web/20190903050208/https://stallman.org/archives/2019-jul-oct.html#27_August_2019_(Me-too_frenzy)">not a “frenzy”</a></strong>; it is a global movement by individuals who have been harmed seeking to hold both bad actors <em>and</em> society-at-large accountable for ignoring systemic wrongs. Nevertheless, I still am proud of the <a href="https://www.gnu.org/philosophy/freedom-or-power.en.html">essay that I co-wrote with RMS</a> and still find <a href="https://www.gnu.org/gnu/manifesto.en.html">many</a> <a href="https://www.gnu.org/philosophy/free-sw.html">of</a> <a href="https://www.gnu.org/philosophy/why-free.html">RMS'</a> <a href="https://www.gnu.org/philosophy/pragmatic.html">other</a> <a href="https://www.gnu.org/philosophy/microsoft-old.html">essays</a> <a href="https://www.gnu.org/philosophy/gpl-american-way.html">compelling</a>, <a href="https://www.gnu.org/licenses/why-not-lgpl.html">important</a>, <a href="https://www.gnu.org/philosophy/stallman-kth.en.html">and</a> <a href="https://www.gnu.org/philosophy/who-does-that-server-really-serve.en.html">relevant</a>. </p>
|
||||
<p> I want the FSF to succeed in its mission and enter a new era of accomplishments. I've spent the last 22 years, without a break, dedicating substantial time, effort, care and loyalty to the various FSF roles that I've had: including employee, volunteer, at-large Director, and Voting Member. Even though my duties to the FSF are done, and my relationship with the FSF is no longer formal, I still think the FSF is a valuable institution worth helping and saving, specifically because the FSF was founded for a mission that I deeply support. And we should also realize that RMS — a human being (who is flawed like the rest of us) — invented that mission. </p>
|
||||
<p> As culture change becomes more rapid, I hope we can find reasonable nuance and moderation on our complex analysis about people and their disparate views, while we also hold individuals fully accountable for their actions. That's the difficulty we face in the post-post-modern culture of the early twenty-first century. Most importantly, I believe we must find a way to stand firm for software freedom while also making a safe environment for victims of sexual assault, sexual abuse, gaslighting, and other deplorable actions. </p>
|
||||
<p> Posted on Tuesday 15 October 2019 at 09:11 by Bradley M. Kuhn. </p>
|
||||
</div>
|
||||
<p>
|
||||
<code>#include <std/disclaimer.h></code><br />
|
||||
<code>use Standard::Disclaimer;</code><br />
|
||||
<code>from standard import disclaimer</code><br />
|
||||
<code>SELECT full_text FROM standard WHERE type = 'disclaimer';</code>
|
||||
</p>
|
||||
<p> Both previously and presently, I have been employed by and/or done work for various organizations that also have views on Free, Libre, and Open Source Software. As should be blatantly obvious, this is my website, not theirs, so please do not assume views and opinions here belong to any such organization. Since I do co-own ebb.org with my wife, it may not be so obvious that these aren't her views and opinions, either. </p>
|
||||
<p> ebb <sup>℠</sup> is a service mark of Bradley M. Kuhn. </p>
|
||||
</div>
|
@ -1,485 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en-US" xml:lang="en-US" xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
|
||||
<title>
|
||||
On Recent Controversial Events - Bradley M. Kuhn ( Brad ) ( bkuhn )
|
||||
</title>
|
||||
<meta content="Bradley M. Kuhn (http://ebb.org/bkuhn/)" name="author" />
|
||||
<link href="http://ebb.org/bkuhn/rss.xml" rel="alternate" title="Whole Website RSS for Bradley M. Kuhn" type="application/rss+xml" />
|
||||
<link href="http://ebb.org/bkuhn/blog/rss.xml" rel="alternate" title="Blog RSS for Bradley M. Kuhn" type="application/rss+xml" />
|
||||
<link href="http://ebb.org/bkuhn/blog/rss.xml" rel="alternate" title="Articles / Interviews RSS for Bradley M. Kuhn" type="application/rss+xml" />
|
||||
<link href="/css/screen.css" rel="stylesheet" type="text/css" />
|
||||
<link href="mailto:bkuhn@ebb.org" rel="made" />
|
||||
<meta content="kuhn, brad, bradley, bkuhn, hacker, gnu, free, software, linux, unix, perl, liberal, pgp, gpg, geek, system, administrator, network, free software, developer, new york, NY, computer, open source, hacker, software, freedom, software freedom" http-equiv="Keywords" name="Keywords" />
|
||||
<meta content="The website of Bradley M. Kuhn, aka Brad, aka bkuhn. This site includes his GPG keys, resume, blog, projects list, software, interviews, speeches and writing." http-equiv="Description" name="Description" />
|
||||
</head>
|
||||
<body>
|
||||
<div id="site">
|
||||
<div id="sidebar">
|
||||
<div id="title">
|
||||
<p>
|
||||
<a href="/bkuhn">Bradley M. Kuhn</a> <a href="http://ebb.org/bkuhn/rss.xml"><img alt="[RSS of Whole Site]" border="0" src="/images/feed-icon-14x14.png" /></a>
|
||||
</p>
|
||||
</div>
|
||||
<div id="menu">
|
||||
<ul>
|
||||
<li>
|
||||
<a href="/bkuhn/contact">Contact</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/bkuhn/blog">Blog</a>   <a href="http://ebb.org/bkuhn/blog/rss.xml"><img alt="[RSS of Blog]" border="0" src="/images/feed-icon-14x14.png" /></a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="http://identi.ca/bkuhn/">Pump.io Social Network</a>
|
||||
</li><!-- %li= link_to("About", "/bkuhn/about") -->
|
||||
<!-- %li= link_to("Speeches / Talks", "/bkuhn/speeches/") -->
|
||||
<li>
|
||||
<a href="/bkuhn/articles">Interviews / Articles</a>   <a href="http://ebb.org/bkuhn/articles/rss.xml"><img alt="[RSS of Articles]" border="0" src="/images/feed-icon-14x14.png" /></a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/bkuhn/code/">Software</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/bkuhn/resume">Résumé</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<h2>
|
||||
<a href="/bkuhn/tags">Tag</a> Cloud
|
||||
</h2>
|
||||
<ol id="tag-cloud">
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#accounting">accounting</a>
|
||||
</li>
|
||||
<li class="tier-4" title="24 posts">
|
||||
<a href="/bkuhn/tags.html#advocacy">advocacy</a>
|
||||
</li>
|
||||
<li class="tier-4" title="16 posts">
|
||||
<a href="/bkuhn/tags.html#agpl">agpl</a>
|
||||
</li>
|
||||
<li class="tier-3" title="6 posts">
|
||||
<a href="/bkuhn/tags.html#android">android</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#apache">apache</a>
|
||||
</li>
|
||||
<li class="tier-2" title="3 posts">
|
||||
<a href="/bkuhn/tags.html#apple">apple</a>
|
||||
</li>
|
||||
<li class="tier-2" title="3 posts">
|
||||
<a href="/bkuhn/tags.html#apt">apt</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#artistic">artistic</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#asterisk">asterisk</a>
|
||||
</li>
|
||||
<li class="tier-2" title="2 posts">
|
||||
<a href="/bkuhn/tags.html#automotive">automotive</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#autonomous">autonomous</a>
|
||||
</li>
|
||||
<li class="tier-2" title="2 posts">
|
||||
<a href="/bkuhn/tags.html#award">award</a>
|
||||
</li>
|
||||
<li class="tier-2" title="2 posts">
|
||||
<a href="/bkuhn/tags.html#bilski">bilski</a>
|
||||
</li>
|
||||
<li class="tier-2" title="2 posts">
|
||||
<a href="/bkuhn/tags.html#canonical">canonical</a>
|
||||
</li>
|
||||
<li class="tier-3" title="7 posts">
|
||||
<a href="/bkuhn/tags.html#cla">cla</a>
|
||||
</li>
|
||||
<li class="tier-5" title="39 posts">
|
||||
<a href="/bkuhn/tags.html#community">community</a>
|
||||
</li>
|
||||
<li class="tier-3" title="6 posts">
|
||||
<a href="/bkuhn/tags.html#compliance">compliance</a>
|
||||
</li>
|
||||
<li class="tier-4" title="15 posts">
|
||||
<a href="/bkuhn/tags.html#conferences">conferences</a>
|
||||
</li>
|
||||
<li class="tier-5" title="37 posts">
|
||||
<a href="/bkuhn/tags.html#conservancy">conservancy</a>
|
||||
</li>
|
||||
<li class="tier-3" title="8 posts">
|
||||
<a href="/bkuhn/tags.html#copyleft">copyleft</a>
|
||||
</li>
|
||||
<li class="tier-5" title="56 posts">
|
||||
<a href="/bkuhn/tags.html#copyright">copyright</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#cow-orking">cow-orking</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#cpp">cpp</a>
|
||||
</li>
|
||||
<li class="tier-3" title="9 posts">
|
||||
<a href="/bkuhn/tags.html#debian">debian</a>
|
||||
</li>
|
||||
<li class="tier-2" title="3 posts">
|
||||
<a href="/bkuhn/tags.html#denounce">denounce</a>
|
||||
</li>
|
||||
<li class="tier-2" title="4 posts">
|
||||
<a href="/bkuhn/tags.html#development">development</a>
|
||||
</li>
|
||||
<li class="tier-2" title="2 posts">
|
||||
<a href="/bkuhn/tags.html#diversity">diversity</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#emacs">emacs</a>
|
||||
</li>
|
||||
<li class="tier-2" title="4 posts">
|
||||
<a href="/bkuhn/tags.html#encryption">encryption</a>
|
||||
</li>
|
||||
<li class="tier-3" title="10 posts">
|
||||
<a href="/bkuhn/tags.html#enforcement">enforcement</a>
|
||||
</li>
|
||||
<li class="tier-2" title="2 posts">
|
||||
<a href="/bkuhn/tags.html#exceptions">exceptions</a>
|
||||
</li>
|
||||
<li class="tier-2" title="3 posts">
|
||||
<a href="/bkuhn/tags.html#faif">faif</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#fdl">fdl</a>
|
||||
</li>
|
||||
<li class="tier-4" title="11 posts">
|
||||
<a href="/bkuhn/tags.html#for-profit">for-profit</a>
|
||||
</li>
|
||||
<li class="tier-2" title="3 posts">
|
||||
<a href="/bkuhn/tags.html#fosdem">fosdem</a>
|
||||
</li>
|
||||
<li class="tier-4" title="13 posts">
|
||||
<a href="/bkuhn/tags.html#fsf">fsf</a>
|
||||
</li>
|
||||
<li class="tier-2" title="4 posts">
|
||||
<a href="/bkuhn/tags.html#gcc">gcc</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#git">git</a>
|
||||
</li>
|
||||
<li class="tier-4" title="13 posts">
|
||||
<a href="/bkuhn/tags.html#gnome">gnome</a>
|
||||
</li>
|
||||
<li class="tier-3" title="6 posts">
|
||||
<a href="/bkuhn/tags.html#gnu">gnu</a>
|
||||
</li>
|
||||
<li class="tier-2" title="4 posts">
|
||||
<a href="/bkuhn/tags.html#google">google</a>
|
||||
</li>
|
||||
<li class="tier-6" title="107 posts">
|
||||
<a href="/bkuhn/tags.html#gpl">gpl</a>
|
||||
</li>
|
||||
<li class="tier-2" title="2 posts">
|
||||
<a href="/bkuhn/tags.html#gpl-compatibility">gpl-compatibility</a>
|
||||
</li>
|
||||
<li class="tier-5" title="47 posts">
|
||||
<a href="/bkuhn/tags.html#gpl-enforcement">gpl-enforcement</a>
|
||||
</li>
|
||||
<li class="tier-2" title="4 posts">
|
||||
<a href="/bkuhn/tags.html#gplv3">gplv3</a>
|
||||
</li>
|
||||
<li class="tier-2" title="3 posts">
|
||||
<a href="/bkuhn/tags.html#guadec">guadec</a>
|
||||
</li>
|
||||
<li class="tier-2" title="2 posts">
|
||||
<a href="/bkuhn/tags.html#identica">identica</a>
|
||||
</li>
|
||||
<li class="tier-4" title="17 posts">
|
||||
<a href="/bkuhn/tags.html#infringement">infringement</a>
|
||||
</li>
|
||||
<li class="tier-2" title="2 posts">
|
||||
<a href="/bkuhn/tags.html#java">java</a>
|
||||
</li>
|
||||
<li class="tier-2" title="3 posts">
|
||||
<a href="/bkuhn/tags.html#javascript">javascript</a>
|
||||
</li>
|
||||
<li class="tier-2" title="4 posts">
|
||||
<a href="/bkuhn/tags.html#jvm">jvm</a>
|
||||
</li>
|
||||
<li class="tier-2" title="2 posts">
|
||||
<a href="/bkuhn/tags.html#launchpad">launchpad</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#ldap">ldap</a>
|
||||
</li>
|
||||
<li class="tier-2" title="3 posts">
|
||||
<a href="/bkuhn/tags.html#lgpl">lgpl</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#libreoffice">libreoffice</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#libreplanet">libreplanet</a>
|
||||
</li>
|
||||
<li class="tier-6" title="72 posts">
|
||||
<a href="/bkuhn/tags.html#licensing">licensing</a>
|
||||
</li>
|
||||
<li class="tier-2" title="3 posts">
|
||||
<a href="/bkuhn/tags.html#lindows">lindows</a>
|
||||
</li>
|
||||
<li class="tier-4" title="11 posts">
|
||||
<a href="/bkuhn/tags.html#linux">linux</a>
|
||||
</li>
|
||||
<li class="tier-2" title="2 posts">
|
||||
<a href="/bkuhn/tags.html#maemo">maemo</a>
|
||||
</li>
|
||||
<li class="tier-2" title="2 posts">
|
||||
<a href="/bkuhn/tags.html#mail">mail</a>
|
||||
</li>
|
||||
<li class="tier-2" title="2 posts">
|
||||
<a href="/bkuhn/tags.html#meego">meego</a>
|
||||
</li>
|
||||
<li class="tier-4" title="17 posts">
|
||||
<a href="/bkuhn/tags.html#microsoft">microsoft</a>
|
||||
</li>
|
||||
<li class="tier-3" title="6 posts">
|
||||
<a href="/bkuhn/tags.html#mobile">mobile</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#moblin">moblin</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#mono">mono</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#motorola">motorola</a>
|
||||
</li>
|
||||
<li class="tier-2" title="2 posts">
|
||||
<a href="/bkuhn/tags.html#mta">mta</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#mysql">mysql</a>
|
||||
</li>
|
||||
<li class="tier-4" title="13 posts">
|
||||
<a href="/bkuhn/tags.html#net-services">net-services</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#nlp">nlp</a>
|
||||
</li>
|
||||
<li class="tier-2" title="2 posts">
|
||||
<a href="/bkuhn/tags.html#nokia">nokia</a>
|
||||
</li>
|
||||
<li class="tier-4" title="23 posts">
|
||||
<a href="/bkuhn/tags.html#non-profit">non-profit</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#np-complete">np-complete</a>
|
||||
</li>
|
||||
<li class="tier-3" title="7 posts">
|
||||
<a href="/bkuhn/tags.html#open-core">open-core</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#open-foam">open-foam</a>
|
||||
</li>
|
||||
<li class="tier-2" title="4 posts">
|
||||
<a href="/bkuhn/tags.html#oracle">oracle</a>
|
||||
</li>
|
||||
<li class="tier-2" title="4 posts">
|
||||
<a href="/bkuhn/tags.html#parrot">parrot</a>
|
||||
</li>
|
||||
<li class="tier-4" title="16 posts">
|
||||
<a href="/bkuhn/tags.html#patents">patents</a>
|
||||
</li>
|
||||
<li class="tier-3" title="6 posts">
|
||||
<a href="/bkuhn/tags.html#perl">perl</a>
|
||||
</li>
|
||||
<li class="tier-3" title="6 posts">
|
||||
<a href="/bkuhn/tags.html#perljvm">perljvm</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#permissive-license">permissive-license</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#piracy">piracy</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#podcast">podcast</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#podjango">podjango</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#poker">poker</a>
|
||||
</li>
|
||||
<li class="tier-4" title="14 posts">
|
||||
<a href="/bkuhn/tags.html#politics">politics</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#postfix">postfix</a>
|
||||
</li>
|
||||
<li class="tier-4" title="13 posts">
|
||||
<a href="/bkuhn/tags.html#proprietary">proprietary</a>
|
||||
</li>
|
||||
<li class="tier-2" title="3 posts">
|
||||
<a href="/bkuhn/tags.html#qt">qt</a>
|
||||
</li>
|
||||
<li class="tier-2" title="4 posts">
|
||||
<a href="/bkuhn/tags.html#replicant">replicant</a>
|
||||
</li>
|
||||
<li class="tier-2" title="3 posts">
|
||||
<a href="/bkuhn/tags.html#requiem">requiem</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#rtlinux">rtlinux</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#scale">SCALE</a>
|
||||
</li>
|
||||
<li class="tier-3" title="6 posts">
|
||||
<a href="/bkuhn/tags.html#sco">sco</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#scotus">scotus</a>
|
||||
</li>
|
||||
<li class="tier-3" title="5 posts">
|
||||
<a href="/bkuhn/tags.html#security">security</a>
|
||||
</li>
|
||||
<li class="tier-3" title="6 posts">
|
||||
<a href="/bkuhn/tags.html#sexism">sexism</a>
|
||||
</li>
|
||||
<li class="tier-2" title="4 posts">
|
||||
<a href="/bkuhn/tags.html#sflc">sflc</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#slicing">slicing</a>
|
||||
</li>
|
||||
<li class="tier-3" title="7 posts">
|
||||
<a href="/bkuhn/tags.html#social-justice">social-justice</a>
|
||||
</li>
|
||||
<li class="tier-3" title="6 posts">
|
||||
<a href="/bkuhn/tags.html#software">software</a>
|
||||
</li>
|
||||
<li class="tier-6" title="108 posts">
|
||||
<a href="/bkuhn/tags.html#software-freedom">software-freedom</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#speeches">speeches</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#stet">stet</a>
|
||||
</li>
|
||||
<li class="tier-2" title="4 posts">
|
||||
<a href="/bkuhn/tags.html#talks">talks</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#tcl">tcl</a>
|
||||
</li>
|
||||
<li class="tier-2" title="2 posts">
|
||||
<a href="/bkuhn/tags.html#teaching">teaching</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#tech-press">tech-press</a>
|
||||
</li>
|
||||
<li class="tier-5" title="35 posts">
|
||||
<a href="/bkuhn/tags.html#technology">technology</a>
|
||||
</li>
|
||||
<li class="tier-2" title="2 posts">
|
||||
<a href="/bkuhn/tags.html#thesis">thesis</a>
|
||||
</li>
|
||||
<li class="tier-3" title="5 posts">
|
||||
<a href="/bkuhn/tags.html#trademarks">trademarks</a>
|
||||
</li>
|
||||
<li class="tier-3" title="10 posts">
|
||||
<a href="/bkuhn/tags.html#ubuntu">ubuntu</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#voip">voip</a>
|
||||
</li>
|
||||
<li class="tier-2" title="3 posts">
|
||||
<a href="/bkuhn/tags.html#xen">xen</a>
|
||||
</li>
|
||||
</ol>
|
||||
<h2>
|
||||
Powered by
|
||||
</h2><a href="https://gitorious.org/bkuhn/jekyll/source/HEAD:">A Very Old Fork of Jekyll</a> <a href="https://gitorious.org/bkuhn/website/source/HEAD:">"Source Code" for this site</a>
|
||||
</div>
|
||||
<div id="contentWithSidebar">
|
||||
<div id="post">
|
||||
<h1>
|
||||
On Recent Controversial Events
|
||||
</h1>
|
||||
<p class="topAttributionWithDate">
|
||||
Tuesday 15 October 2019 by Bradley M. Kuhn
|
||||
</p>
|
||||
<p>
|
||||
The last 33 days have been unprecedentedly difficult for the software freedom community and for me personally. Folks have been emailing, phoning, texting, tagging me on social media (— the last of which has been funny, because all my social media accounts are placeholder accounts). But, just about everyone has urged me to comment on the serious issues that the software freedom community now faces. Until now, I have stayed silent regarding all these current topics: from Richard M. Stallman (RMS)'s public statements, to <a href="https://www.fsf.org/news/richard-m-stallman-resigns">his resignation from the Free Software Foundation (FSF)</a>, to the Epstein scandal and its connection to MIT. I've also avoided generally commenting on software freedom organizational governance during this period. I did this for good reason, which is explained below. However, in this blog post, I now share my primary comments on the matters that seem to currently be of the utmost attention of the Open Source and Free Software communities.
|
||||
</p>
|
||||
<p>
|
||||
I have been silent the last month because, until two days ago, I was an at-large member of <a href="https://www.fsf.org/about/staff-and-board">FSF's Board of Directors</a>, and a <a href="https://static.fsf.org/nosvn/fsf-amended-bylaws-current.pdf">Voting Member</a> of the FSF. As a member of FSF's two leadership bodies, I was abiding by a reasonable request from the FSF management and my duty to the organization. Specifically, the FSF asked that all communication during the crisis <a href="https://www.fsf.org/news/richard-m-stallman-resigns">come</a> <a href="https://www.fsf.org/news/fsf-and-gnu">directly</a> from FSF officers and not from at-large directors and/or Voting Members. Furthermore, the FSF management asked all Directors and Voting Members to remain silent on this entire matter — even on issues only tangentially related to the current situation, and even when speaking in our own capacity (e.g., on our own blogs like this one). The FSF is an important organization, and I take any request from the FSF seriously — so I abided fully with their request.
|
||||
</p>
|
||||
<p>
|
||||
The situation was further complicated because folks at my employer, Software Freedom Conservancy (where I also serve on the <a href="https://sfconservancy.org/about/board/#bkuhn">Board of Directors</a>) had strong opinions about this matter as well. Fortunately, the FSF and Conservancy both had already created clear protocols for what I should do if ever there was a disagreement or divergence of views between Conservancy and FSF. I therefore was recused fully from the planning, drafting, and timing of Conservancy's statement on this matter. I thank my colleagues at the Conservancy for working so carefully to keep me entirely outside the loop on their statement and to diligently assure that it was straight-forward for me to manage any potential organizational disagreements. I also thank those at the FSF who outlined clear protocols (ahead of time, back in March 2019) in case a situation like this ever came up. I also know my colleagues at Conservancy care deeply, as I do, about the health and welfare of the FSF and its mission of fighting for universal software freedom for all. None of us want, nor have, any substantive disagreement over software freedom issues.
|
||||
</p>
|
||||
<p>
|
||||
I take very seriously my duty to the various organizations where I have (or have had) affiliations. More generally, I champion non-profit organizational transparency. Unfortunately, the current crisis left me in a quandary between the overarching goal of community transparency and abiding by FSF management's directives. Now that I've left the FSF Board of Directors, FSF's Voting Membership, and all my FSF volunteer roles (which ends my 22-year uninterrupted affiliation with the FSF), I can now comment on the substantive issues that face not just the FSF, but the Free Software community as a whole, while continuing to adhere to my past duty of acting in FSF's best interest. In other words, my affiliation with the FSF has come to an end for many good and useful reasons. The end to this affiliation allows me to speak directly about the core issues at the heart of the community's current crisis.
|
||||
</p>
|
||||
<p>
|
||||
Firstly, all these events — from RMS' public comments on the MIT mailing list, to RMS' resignation from the FSF to RMS' discussions about the next steps for the GNU project — <em>seem</em> to many to have happened ridiculously quickly. But it wasn't actually fast at all. In fact, these events were culmination of issues that were slowly growing in concern to many people, including me.
|
||||
</p>
|
||||
<p>
|
||||
For the last two years, I had been a loud internal voice in the FSF leadership regarding RMS' Free-Software-unrelated public statements; I felt strongly that it was in the best interest of the FSF to actively seek to limit such statements, and that it was my duty to FSF to speak out about this within the organization. Those who only learned of this story in the last month (understandably) believed <a href="https://medium.com/@selamjie/remove-richard-stallman-fec6ec210794">Selam G.'s Medium post</a> raised an entirely new issue. <a href="https://web.archive.org/web/20161107050933/https://www.stallman.org/archives/2016-jul-oct.html#31_October_2016_(Down's_syndrome)">In</a> <a href="https://web.archive.org/web/20170202025227/https://www.stallman.org/archives/2016-nov-feb.html#14_December_2016_(Campaign_of_bull-headed_prudery)">fact</a>, <a href="https://web.archive.org/web/20170224174306/https://www.stallman.org/archives/2016-nov-feb.html#23_February_2017_(A_violent_sex_offender)">RMS'</a> <a href="https://web.archive.org/web/20170612074722/http://stallman.org/archives/2017-mar-jun.html#26_May_2017_(Prudish_ignorantism)">views</a> <a href="https://web.archive.org/web/20170616044924/https://www.stallman.org/archives/2017-mar-jun.html#13_June_2017_(Sex_offender_registry)">and</a> <a href="https://web.archive.org/web/20171020041022/http://stallman.org/archives/2017-jul-oct.html#10_October_2017_(Laws_against_having_sex_with_an_animal)">statements</a> <a href="https://web.archive.org/web/20180131020215/https://stallman.org/archives/2017-jul-oct.html#29_October_2017_(Pestering_women)">posted</a> <a href="https://web.archive.org/web/20180104112431/https://www.stallman.org/archives/2017-nov-feb.html#27_November_2017_(Roy_Moore's_relationships)">on</a> <a href="https://web.archive.org/web/20180509120046/https://stallman.org/archives/2018-mar-jun.html#30_April_2018_(UN_peacekeepers_in_South_Sudan)">stallman.org</a> <a href="https://web.archive.org/web/20180911075211/https://www.stallman.org/archives/2018-jul-oct.html#17_July_2018_(The_bullshitter's_flirting)">about</a> <a href="https://web.archive.org/web/20180911075211/https://www.stallman.org/archives/2018-jul-oct.html#21_August_2018_(Age_and_attraction)">sexual</a> <a href="https://web.archive.org/web/20180924231708/https://stallman.org/archives/2018-jul-oct.html#23_September_2018_(Cody_Wilson)">morality</a> <a href="https://web.archive.org/web/20180919100154/https://stallman.org/antiglossary.html#assult">escalated</a> <a href="https://web.archive.org/web/20181113161736/https://www.stallman.org/archives/2018-sep-dec.html#6_November_2018_(Sex_according_to_porn)">for</a> <a href="https://web.archive.org/web/20190325024048/https://stallman.org/archives/2019-jan-apr.html#14_February_2019_(Respecting_peoples_right_to_say_no)">the</a> <a href="https://www.stallman.org/archives/2019-may-aug.html#11_June_2019_(Stretching_meaning_of_terms)">worse</a> <a href="https://web.archive.org/web/20190801201704/https://stallman.org/archives/2019-may-aug.html#12_June_2019_(Declining_sex_rates)">over</a> <a href="https://web.archive.org/web/20190801201704/https://stallman.org/archives/2019-may-aug.html#30_July_2019_(Al_Franken)">the</a> <a href="https://web.archive.org/web/20190903050208/https://stallman.org/archives/2019-jul-oct.html#27_August_2019_(Me-too_frenzy)">last</a> <a href="https://web.archive.org/web/20191011023557/https://stallman.org/archives/2019-jul-oct.html#21_September_2019_(Sex_workers)">few</a> <a href="https://web.archive.org/web/20180924231708/https://stallman.org/archives/2018-jul-oct.html#23_September_2018_(Cody_Wilson)">years</a>. When the escalation started, I still considered RMS both a friend and colleague, and I attempted to argue with him at length to convince him that some of his positions were harmful to sexual assault survivors and those who are sex trafficked, and to the people who devote their lives in service to such individuals. More importantly to the FSF, I attempted to persuade RMS that launching a controversial campaign on sexual behavior and morality was counter to his and FSF's mission to advance software freedom, and told RMS that my duty as an FSF Director was to assure the best outcome for the FSF, which <acronym title="in my opinion">IMO</acronym> didn't include having a leader who made such statements. Not only is human sexual behavior not a topic on which RMS has adequate academic expertise, but also his positions appear to ignore significant research and widely available information on the subject. Many of his comments, while occasionally politically intriguing, lack empathy for people who experienced trauma.
|
||||
</p>
|
||||
<p>
|
||||
IMO, this is not and has never been a Free Speech issue. I do believe freedom of speech links directly to software freedom: indeed, I see the freedom to publish software under Free licenses as almost a corollary to the freedom of speech. However, we do not need to follow leadership from those whose views we fundamentally disagree. Moreover, organizations need not and should not elevate spokespeople and leaders who speak regularly on unrelated issues that organizations find do not advance their mission, and/or that alienate important constituents. I, like many other software freedom leaders, curtail my public comments on issues not related to <acronym title="Free and Open Source Software">FOSS</acronym>. (Indeed, I would not even be commenting on <em>this issue</em> if it had not become a central issue of concern to the software freedom community.) Leaders have power, and they must exercise the power of their words with <a href="https://lwn.net/Articles/770966/">restraint, not with impunity</a>.
|
||||
</p>
|
||||
<p>
|
||||
RMS has consistently argued that there was a campaign of “prudish intimidation” — seeking to keep him quiet about his views on sexuality. After years of conversing with RMS about how his non-software-freedom views were a distraction, an indulgence, and downright problematic, his general response was to make even more public comments of this nature. The issue is not about RMS' right to say what he believes, nor is it even about whether or not you agree or disagree with RMS' statements. The question is whether an organization should have a designated leader who is on a sustained, public campaign advocating about an unrelated issue that many consider controversial. It really doesn't matter what your view about the controversial issue is; a leader who refuses to stop talking loudly about unrelated issues eventually creates an untenable distraction from the radical activism you're actively trying to advance. The message of universal software freedom is a radical cause; it's basically impossible for one individual to effectively push forward two unrelated controversial agendas at once. In short, the radical message of software freedom became overshadowed by RMS' radical views about sexual morality.
|
||||
</p>
|
||||
<p>
|
||||
And here is where I say the thing that may infuriate many but it's what I believe: I think RMS took a useful step by resigning some of his leadership roles at the FSF. I thank RMS for taking that step, and I wish the FSF Directors well in their efforts to assure that the FSF becomes a welcoming organization to all who care about universal software freedom. The <a href="https://www.fsf.org/about/">FSF's mission</a> is essential to our technological future, and we should all support that mission. I care deeply about that mission myself and have worked and will continue to work in our community in the best interest of the mission.
|
||||
</p>
|
||||
<p>
|
||||
I'm admittedly struggling to find a way to work again with RMS, given his views on sexual morality and his behaviors stemming from those views. I explicitly do not agree with <a href="https://web.archive.org/web/20180919100154/https://stallman.org/antiglossary.html#assult">this “(re-)definition” of sexual assault</a>. Furthermore, I believe uninformed statements about sexual assault are irresponsible and cause harm to victims. #MeToo is <strong><a href="https://web.archive.org/web/20190903050208/https://stallman.org/archives/2019-jul-oct.html#27_August_2019_(Me-too_frenzy)">not a “frenzy”</a></strong>; it is a global movement by individuals who have been harmed seeking to hold both bad actors <em>and</em> society-at-large accountable for ignoring systemic wrongs. Nevertheless, I still am proud of the <a href="https://www.gnu.org/philosophy/freedom-or-power.en.html">essay that I co-wrote with RMS</a> and still find <a href="https://www.gnu.org/gnu/manifesto.en.html">many</a> <a href="https://www.gnu.org/philosophy/free-sw.html">of</a> <a href="https://www.gnu.org/philosophy/why-free.html">RMS'</a> <a href="https://www.gnu.org/philosophy/pragmatic.html">other</a> <a href="https://www.gnu.org/philosophy/microsoft-old.html">essays</a> <a href="https://www.gnu.org/philosophy/gpl-american-way.html">compelling</a>, <a href="https://www.gnu.org/licenses/why-not-lgpl.html">important</a>, <a href="https://www.gnu.org/philosophy/stallman-kth.en.html">and</a> <a href="https://www.gnu.org/philosophy/who-does-that-server-really-serve.en.html">relevant</a>.
|
||||
</p>
|
||||
<p>
|
||||
I want the FSF to succeed in its mission and enter a new era of accomplishments. I've spent the last 22 years, without a break, dedicating substantial time, effort, care and loyalty to the various FSF roles that I've had: including employee, volunteer, at-large Director, and Voting Member. Even though my duties to the FSF are done, and my relationship with the FSF is no longer formal, I still think the FSF is a valuable institution worth helping and saving, specifically because the FSF was founded for a mission that I deeply support. And we should also realize that RMS — a human being (who is flawed like the rest of us) — invented that mission.
|
||||
</p>
|
||||
<p>
|
||||
As culture change becomes more rapid, I hope we can find reasonable nuance and moderation on our complex analysis about people and their disparate views, while we also hold individuals fully accountable for their actions. That's the difficulty we face in the post-post-modern culture of the early twenty-first century. Most importantly, I believe we must find a way to stand firm for software freedom while also making a safe environment for victims of sexual assault, sexual abuse, gaslighting, and other deplorable actions.
|
||||
</p>
|
||||
<p class="bottomAttributionWithDate">
|
||||
Posted on Tuesday 15 October 2019 at 09:11 by Bradley M. Kuhn.
|
||||
</p>
|
||||
<p class="comments">
|
||||
Submit comments on this post to <a href="mailto:bkuhn@ebb.org"><bkuhn@ebb.org></a>.
|
||||
</p>
|
||||
<div id="prevlink">
|
||||
<a class="previous" href="/bkuhn/blog/2019/05/23/github-sponsors.html">← <strong>Previous</strong>: Chasing Quick Fixes To Sustainability</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<p id="footer"></p>
|
||||
<hr />
|
||||
<br />
|
||||
<p>
|
||||
<a href="http://creativecommons.org/licenses/by-sa/3.0/us/" rel="license"><img alt="Creative Commons License" src="http://i.creativecommons.org/l/by-sa/3.0/us/88x31.png" style="border-width:10" /></a> This website and all documents on it are licensed under a <a href="http://creativecommons.org/licenses/by-sa/3.0/us/" rel="license">Creative Commons Attribution-Share Alike 3.0 United States License</a> .
|
||||
</p>
|
||||
<hr />
|
||||
<p>
|
||||
<code>#include <std/disclaimer.h></code><br />
|
||||
<code>use Standard::Disclaimer;</code><br />
|
||||
<code>from standard import disclaimer</code><br />
|
||||
<code>SELECT full_text FROM standard WHERE type = 'disclaimer';</code>
|
||||
</p>
|
||||
<p>
|
||||
Both previously and presently, I have been employed by and/or done work for various organizations that also have views on Free, Libre, and Open Source Software. As should be blatantly obvious, this is my website, not theirs, so please do not assume views and opinions here belong to any such organization. Since I do co-own ebb.org with my wife, it may not be so obvious that these aren't her views and opinions, either.
|
||||
</p>
|
||||
<p align="right">
|
||||
— bkuhn
|
||||
</p>
|
||||
<hr />
|
||||
<p>
|
||||
ebb <sup>℠</sup> is a service mark of Bradley M. Kuhn.
|
||||
</p>
|
||||
<address>
|
||||
<a href="http://ebb.org/bkuhn/">Bradley M. Kuhn</a> <a href="mailto:bkuhn@ebb.org"><bkuhn@ebb.org></a>
|
||||
</address>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
File diff suppressed because it is too large
Load Diff
@ -1,8 +1,6 @@
|
||||
{
|
||||
"title": "Embedded videos test",
|
||||
"byline": null,
|
||||
"dir": null,
|
||||
"excerpt": "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\n tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\n quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\n consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\n cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\n proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
|
||||
"siteName": null,
|
||||
"readerable": false
|
||||
}
|
||||
|
@ -1,16 +1,37 @@
|
||||
<div id="readability-page-1" class="page">
|
||||
<article>
|
||||
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
|
||||
<h2>Videos</h2>
|
||||
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat
|
||||
non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
|
||||
<h2>Videos</h2>
|
||||
|
||||
<p>At root</p>
|
||||
<iframe width="560" height="315" src="https://www.youtube.com/embed/LtOGa5M8AuU" frameborder="0" allowfullscreen=""></iframe>
|
||||
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/LtOGa5M8AuU" frameborder="0" allowfullscreen=""></iframe>
|
||||
<iframe src="https://player.vimeo.com/video/32246206?color=ffffff+title=0+byline=0+portrait=0" width="500" height="281" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>
|
||||
<iframe width="560" height="315" src="https://www.youtube.com/embed/LtOGa5M8AuU"
|
||||
frameborder="0" allowfullscreen=""></iframe>
|
||||
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/LtOGa5M8AuU"
|
||||
frameborder="0" allowfullscreen=""></iframe>
|
||||
<iframe src="https://player.vimeo.com/video/32246206?color=ffffff+title=0+byline=0+portrait=0"
|
||||
width="500" height="281" frameborder="0" webkitallowfullscreen="" mozallowfullscreen=""
|
||||
allowfullscreen=""></iframe>
|
||||
<p>In a paragraph</p>
|
||||
<p><iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/LtOGa5M8AuU" frameborder="0" allowfullscreen=""></iframe></p>
|
||||
<p>
|
||||
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/LtOGa5M8AuU"
|
||||
frameborder="0" allowfullscreen=""></iframe>
|
||||
</p>
|
||||
<p>In a div</p>
|
||||
<p><iframe width="560" height="315" src="https://www.youtube.com/embed/LtOGa5M8AuU" frameborder="0" allowfullscreen=""></iframe></p>
|
||||
<h2>Foo</h2>
|
||||
<p> Tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. </p>
|
||||
<p>
|
||||
<iframe width="560" height="315" src="https://www.youtube.com/embed/LtOGa5M8AuU"
|
||||
frameborder="0" allowfullscreen=""></iframe>
|
||||
</p>
|
||||
<h2>Foo</h2>
|
||||
|
||||
<p>Tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
||||
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
||||
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat
|
||||
non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
|
||||
</article>
|
||||
</div>
|
||||
</div>
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue