diff --git a/composer.json b/composer.json index 88b8f0fe6..8d00077dc 100644 --- a/composer.json +++ b/composer.json @@ -3,7 +3,7 @@ { "name": "j4mie/idiorm", "type": "vcs", - "url": "https://github.com/aaronpk/idiorm" + "url": "https://dev.tt-rss.org/fox/idiorm.git" } ], "require": { @@ -13,7 +13,7 @@ "j4mie/idiorm": "dev-master" }, "require-dev": { - "phpstan/phpstan": "^1.", + "phpstan/phpstan": "1.1.2", "phpunit/phpunit": "9.5.16" } } diff --git a/composer.lock b/composer.lock index 378e5a263..df4c441c9 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "410a7fb5a8fb00f33c59de3b78057604", + "content-hash": "26f1906259c39e542432c57d76f16369", "packages": [ { "name": "beberlei/assert", @@ -220,15 +220,9 @@ "version": "dev-master", "source": { "type": "git", - "url": "https://github.com/aaronpk/idiorm.git", + "url": "https://dev.tt-rss.org/fox/idiorm.git", "reference": "efc8ea06698f53e2c479c7696f2b154c47c3a3cb" }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/aaronpk/idiorm/zipball/efc8ea06698f53e2c479c7696f2b154c47c3a3cb", - "reference": "efc8ea06698f53e2c479c7696f2b154c47c3a3cb", - "shasum": "" - }, "require": { "php": ">=5.2.0" }, @@ -1136,20 +1130,20 @@ }, { "name": "phpstan/phpstan", - "version": "1.8.1", + "version": "1.1.2", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "8dbba631fa32f4b289404469c2afd6122fd61d67" + "reference": "bcea0ae85868a89d5789c75f012c93129f842934" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/8dbba631fa32f4b289404469c2afd6122fd61d67", - "reference": "8dbba631fa32f4b289404469c2afd6122fd61d67", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/bcea0ae85868a89d5789c75f012c93129f842934", + "reference": "bcea0ae85868a89d5789c75f012c93129f842934", "shasum": "" }, "require": { - "php": "^7.2|^8.0" + "php": "^7.1|^8.0" }, "conflict": { "phpstan/phpstan-shim": "*" @@ -1159,6 +1153,11 @@ "phpstan.phar" ], "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, "autoload": { "files": [ "bootstrap.php" @@ -1171,7 +1170,7 @@ "description": "PHPStan - PHP Static Analysis Tool", "support": { "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.8.1" + "source": "https://github.com/phpstan/phpstan/tree/1.1.2" }, "funding": [ { @@ -1191,7 +1190,7 @@ "type": "tidelift" } ], - "time": "2022-07-12T16:08:06+00:00" + "time": "2021-11-09T12:41:09+00:00" }, { "name": "phpunit/php-code-coverage", diff --git a/plugins/af_readability/composer.json b/plugins/af_readability/composer.json index bcfb5fe14..b22733315 100644 --- a/plugins/af_readability/composer.json +++ b/plugins/af_readability/composer.json @@ -1,6 +1,12 @@ { + "repositories": [ + { + "name": "fivefilters/readability.php", + "type": "vcs", + "url": "https://dev.tt-rss.org/fox/readability-php.git" + } + ], "require": { - "fivefilters/readability.php": "^2.1", - "psr/http-factory": "1.0.1" + "fivefilters/readability.php": "dev-master" } } diff --git a/plugins/af_readability/composer.lock b/plugins/af_readability/composer.lock index d715943f3..01143fa28 100644 --- a/plugins/af_readability/composer.lock +++ b/plugins/af_readability/composer.lock @@ -4,43 +4,44 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "661da7637203f782143d5bec44b97595", + "content-hash": "9b8120263fb98662acec8e8101e47465", "packages": [ { "name": "fivefilters/readability.php", - "version": "v2.1.0", + "version": "dev-master", "source": { "type": "git", - "url": "https://github.com/fivefilters/readability.php.git", - "reference": "7617a912b6c527909168f5d41d263792f171c42a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/fivefilters/readability.php/zipball/7617a912b6c527909168f5d41d263792f171c42a", - "reference": "7617a912b6c527909168f5d41d263792f171c42a", - "shasum": "" + "url": "https://dev.tt-rss.org/fox/readability-php.git", + "reference": "5ad152c70376002f043bb936d8ae5eed103fb993" }, "require": { "ext-dom": "*", "ext-mbstring": "*", "ext-xml": "*", - "php": ">=7.0.0", + "league/uri": "^6.4", + "masterminds/html5": "^2.0", + "php": ">=7.3.0", "psr/log": "^1.0" }, "require-dev": { - "monolog/monolog": "^1.24", - "phpunit/phpunit": "^6.5" + "monolog/monolog": "^2.3", + "phpunit/phpunit": "^9" }, "suggest": { "monolog/monolog": "Allow logging debug information" }, + "default-branch": true, "type": "library", "autoload": { "psr-4": { - "andreskrey\\Readability\\": "src/" + "fivefilters\\Readability\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "fivefilters\\Readability\\Test\\": "test" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "Apache-2.0" ], @@ -48,19 +49,314 @@ { "name": "Andres Rey", "email": "andreskrey@gmail.com", - "role": "Lead Developer" + "role": "Original Developer" + }, + { + "name": "Keyvan Minoukadeh", + "email": "keyvan@fivefilters.org", + "homepage": "https://www.fivefilters.org", + "role": "Developer/Maintainer" } ], "description": "A PHP port of Readability.js", - "homepage": "https://github.com/andreskrey/readability", + "homepage": "https://github.com/fivefilters/readability.php", "keywords": [ "html", "readability" ], - "support": { - "source": "https://github.com/fivefilters/readability.php/tree/v2.1.0" + "time": "2022-07-16T13:23:08+00:00" + }, + { + "name": "league/uri", + "version": "6.7.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri.git", + "reference": "2d7c87a0860f3126a39f44a8a9bf2fed402dcfea" }, - "time": "2019-07-22T21:42:25+00:00" + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri/zipball/2d7c87a0860f3126a39f44a8a9bf2fed402dcfea", + "reference": "2d7c87a0860f3126a39f44a8a9bf2fed402dcfea", + "shasum": "" + }, + "require": { + "ext-json": "*", + "league/uri-interfaces": "^2.3", + "php": "^7.4 || ^8.0", + "psr/http-message": "^1.0" + }, + "conflict": { + "league/uri-schemes": "^1.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^v3.3.2", + "nyholm/psr7": "^1.5", + "php-http/psr7-integration-tests": "^1.1", + "phpstan/phpstan": "^1.2.0", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0.0", + "phpstan/phpstan-strict-rules": "^1.1.0", + "phpunit/phpunit": "^9.5.10", + "psr/http-factory": "^1.0" + }, + "suggest": { + "ext-fileinfo": "Needed to create Data URI from a filepath", + "ext-intl": "Needed to improve host validation", + "league/uri-components": "Needed to easily manipulate URI objects", + "psr/http-factory": "Needed to use the URI factory" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Uri\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "URI manipulation library", + "homepage": "https://uri.thephpleague.com", + "keywords": [ + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "middleware", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc3986", + "rfc3987", + "rfc6570", + "uri", + "uri-template", + "url", + "ws" + ], + "support": { + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri/issues", + "source": "https://github.com/thephpleague/uri/tree/6.7.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2022-06-29T09:48:18+00:00" + }, + { + "name": "league/uri-interfaces", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri-interfaces.git", + "reference": "00e7e2943f76d8cb50c7dfdc2f6dee356e15e383" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/00e7e2943f76d8cb50c7dfdc2f6dee356e15e383", + "reference": "00e7e2943f76d8cb50c7dfdc2f6dee356e15e383", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.19", + "phpstan/phpstan": "^0.12.90", + "phpstan/phpstan-phpunit": "^0.12.19", + "phpstan/phpstan-strict-rules": "^0.12.9", + "phpunit/phpunit": "^8.5.15 || ^9.5" + }, + "suggest": { + "ext-intl": "to use the IDNA feature", + "symfony/intl": "to use the IDNA feature via Symfony Polyfill" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Uri\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "Common interface for URI representation", + "homepage": "http://github.com/thephpleague/uri-interfaces", + "keywords": [ + "rfc3986", + "rfc3987", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/thephpleague/uri-interfaces/issues", + "source": "https://github.com/thephpleague/uri-interfaces/tree/2.3.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2021-06-28T04:27:21+00:00" + }, + { + "name": "masterminds/html5", + "version": "2.7.5", + "source": { + "type": "git", + "url": "https://github.com/Masterminds/html5-php.git", + "reference": "f640ac1bdddff06ea333a920c95bbad8872429ab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f640ac1bdddff06ea333a920c95bbad8872429ab", + "reference": "f640ac1bdddff06ea333a920c95bbad8872429ab", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-dom": "*", + "ext-libxml": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Masterminds\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matt Butcher", + "email": "technosophos@gmail.com" + }, + { + "name": "Matt Farina", + "email": "matt@mattfarina.com" + }, + { + "name": "Asmir Mustafic", + "email": "goetas@gmail.com" + } + ], + "description": "An HTML5 parser and serializer.", + "homepage": "http://masterminds.github.io/html5-php", + "keywords": [ + "HTML5", + "dom", + "html", + "parser", + "querypath", + "serializer", + "xml" + ], + "support": { + "issues": "https://github.com/Masterminds/html5-php/issues", + "source": "https://github.com/Masterminds/html5-php/tree/2.7.5" + }, + "time": "2021-07-01T14:25:37+00:00" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/master" + }, + "time": "2016-08-06T14:39:51+00:00" }, { "name": "psr/http-factory", @@ -224,7 +520,9 @@ "packages-dev": [], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": { + "fivefilters/readability.php": 20 + }, "prefer-stable": false, "prefer-lowest": false, "platform": [], diff --git a/plugins/af_readability/vendor/composer/autoload_psr4.php b/plugins/af_readability/vendor/composer/autoload_psr4.php index 7aeb217ca..e16ed7f2d 100644 --- a/plugins/af_readability/vendor/composer/autoload_psr4.php +++ b/plugins/af_readability/vendor/composer/autoload_psr4.php @@ -6,7 +6,9 @@ $vendorDir = dirname(dirname(__FILE__)); $baseDir = dirname($vendorDir); return array( - 'andreskrey\\Readability\\' => array($vendorDir . '/fivefilters/readability.php/src'), + 'fivefilters\\Readability\\' => array($vendorDir . '/fivefilters/readability.php/src'), 'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'), - 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src', $vendorDir . '/psr/http-factory/src'), + 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'), + 'Masterminds\\' => array($vendorDir . '/masterminds/html5/src'), + 'League\\Uri\\' => array($vendorDir . '/league/uri-interfaces/src', $vendorDir . '/league/uri/src'), ); diff --git a/plugins/af_readability/vendor/composer/autoload_static.php b/plugins/af_readability/vendor/composer/autoload_static.php index 763e78f08..e269612f2 100644 --- a/plugins/af_readability/vendor/composer/autoload_static.php +++ b/plugins/af_readability/vendor/composer/autoload_static.php @@ -7,19 +7,27 @@ namespace Composer\Autoload; class ComposerStaticInitb44cc79a0eaef9cd9c2f2ac697cbe9c0 { public static $prefixLengthsPsr4 = array ( - 'a' => + 'f' => array ( - 'andreskrey\\Readability\\' => 23, + 'fivefilters\\Readability\\' => 24, ), 'P' => array ( 'Psr\\Log\\' => 8, 'Psr\\Http\\Message\\' => 17, ), + 'M' => + array ( + 'Masterminds\\' => 12, + ), + 'L' => + array ( + 'League\\Uri\\' => 11, + ), ); public static $prefixDirsPsr4 = array ( - 'andreskrey\\Readability\\' => + 'fivefilters\\Readability\\' => array ( 0 => __DIR__ . '/..' . '/fivefilters/readability.php/src', ), @@ -30,7 +38,15 @@ class ComposerStaticInitb44cc79a0eaef9cd9c2f2ac697cbe9c0 'Psr\\Http\\Message\\' => array ( 0 => __DIR__ . '/..' . '/psr/http-message/src', - 1 => __DIR__ . '/..' . '/psr/http-factory/src', + ), + 'Masterminds\\' => + array ( + 0 => __DIR__ . '/..' . '/masterminds/html5/src', + ), + 'League\\Uri\\' => + array ( + 0 => __DIR__ . '/..' . '/league/uri-interfaces/src', + 1 => __DIR__ . '/..' . '/league/uri/src', ), ); diff --git a/plugins/af_readability/vendor/composer/installed.json b/plugins/af_readability/vendor/composer/installed.json index 095b4a165..608ac5e69 100644 --- a/plugins/af_readability/vendor/composer/installed.json +++ b/plugins/af_readability/vendor/composer/installed.json @@ -2,42 +2,43 @@ "packages": [ { "name": "fivefilters/readability.php", - "version": "v2.1.0", - "version_normalized": "2.1.0.0", + "version": "dev-master", + "version_normalized": "dev-master", "source": { "type": "git", - "url": "https://github.com/fivefilters/readability.php.git", - "reference": "7617a912b6c527909168f5d41d263792f171c42a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/fivefilters/readability.php/zipball/7617a912b6c527909168f5d41d263792f171c42a", - "reference": "7617a912b6c527909168f5d41d263792f171c42a", - "shasum": "" + "url": "https://dev.tt-rss.org/fox/readability-php.git", + "reference": "5ad152c70376002f043bb936d8ae5eed103fb993" }, "require": { "ext-dom": "*", "ext-mbstring": "*", "ext-xml": "*", - "php": ">=7.0.0", + "league/uri": "^6.4", + "masterminds/html5": "^2.0", + "php": ">=7.3.0", "psr/log": "^1.0" }, "require-dev": { - "monolog/monolog": "^1.24", - "phpunit/phpunit": "^6.5" + "monolog/monolog": "^2.3", + "phpunit/phpunit": "^9" }, "suggest": { "monolog/monolog": "Allow logging debug information" }, - "time": "2019-07-22T21:42:25+00:00", + "time": "2022-07-16T13:23:08+00:00", + "default-branch": true, "type": "library", - "installation-source": "dist", + "installation-source": "source", "autoload": { "psr-4": { - "andreskrey\\Readability\\": "src/" + "fivefilters\\Readability\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "fivefilters\\Readability\\Test\\": "test" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "Apache-2.0" ], @@ -45,20 +46,327 @@ { "name": "Andres Rey", "email": "andreskrey@gmail.com", - "role": "Lead Developer" + "role": "Original Developer" + }, + { + "name": "Keyvan Minoukadeh", + "email": "keyvan@fivefilters.org", + "homepage": "https://www.fivefilters.org", + "role": "Developer/Maintainer" } ], "description": "A PHP port of Readability.js", - "homepage": "https://github.com/andreskrey/readability", + "homepage": "https://github.com/fivefilters/readability.php", "keywords": [ "html", "readability" ], - "support": { - "source": "https://github.com/fivefilters/readability.php/tree/v2.1.0" - }, "install-path": "../fivefilters/readability.php" }, + { + "name": "league/uri", + "version": "6.7.1", + "version_normalized": "6.7.1.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri.git", + "reference": "2d7c87a0860f3126a39f44a8a9bf2fed402dcfea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri/zipball/2d7c87a0860f3126a39f44a8a9bf2fed402dcfea", + "reference": "2d7c87a0860f3126a39f44a8a9bf2fed402dcfea", + "shasum": "" + }, + "require": { + "ext-json": "*", + "league/uri-interfaces": "^2.3", + "php": "^7.4 || ^8.0", + "psr/http-message": "^1.0" + }, + "conflict": { + "league/uri-schemes": "^1.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^v3.3.2", + "nyholm/psr7": "^1.5", + "php-http/psr7-integration-tests": "^1.1", + "phpstan/phpstan": "^1.2.0", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0.0", + "phpstan/phpstan-strict-rules": "^1.1.0", + "phpunit/phpunit": "^9.5.10", + "psr/http-factory": "^1.0" + }, + "suggest": { + "ext-fileinfo": "Needed to create Data URI from a filepath", + "ext-intl": "Needed to improve host validation", + "league/uri-components": "Needed to easily manipulate URI objects", + "psr/http-factory": "Needed to use the URI factory" + }, + "time": "2022-06-29T09:48:18+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "League\\Uri\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "URI manipulation library", + "homepage": "https://uri.thephpleague.com", + "keywords": [ + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "middleware", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc3986", + "rfc3987", + "rfc6570", + "uri", + "uri-template", + "url", + "ws" + ], + "support": { + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri/issues", + "source": "https://github.com/thephpleague/uri/tree/6.7.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "install-path": "../league/uri" + }, + { + "name": "league/uri-interfaces", + "version": "2.3.0", + "version_normalized": "2.3.0.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri-interfaces.git", + "reference": "00e7e2943f76d8cb50c7dfdc2f6dee356e15e383" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/00e7e2943f76d8cb50c7dfdc2f6dee356e15e383", + "reference": "00e7e2943f76d8cb50c7dfdc2f6dee356e15e383", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.19", + "phpstan/phpstan": "^0.12.90", + "phpstan/phpstan-phpunit": "^0.12.19", + "phpstan/phpstan-strict-rules": "^0.12.9", + "phpunit/phpunit": "^8.5.15 || ^9.5" + }, + "suggest": { + "ext-intl": "to use the IDNA feature", + "symfony/intl": "to use the IDNA feature via Symfony Polyfill" + }, + "time": "2021-06-28T04:27:21+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "League\\Uri\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "Common interface for URI representation", + "homepage": "http://github.com/thephpleague/uri-interfaces", + "keywords": [ + "rfc3986", + "rfc3987", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/thephpleague/uri-interfaces/issues", + "source": "https://github.com/thephpleague/uri-interfaces/tree/2.3.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "install-path": "../league/uri-interfaces" + }, + { + "name": "masterminds/html5", + "version": "2.7.5", + "version_normalized": "2.7.5.0", + "source": { + "type": "git", + "url": "https://github.com/Masterminds/html5-php.git", + "reference": "f640ac1bdddff06ea333a920c95bbad8872429ab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f640ac1bdddff06ea333a920c95bbad8872429ab", + "reference": "f640ac1bdddff06ea333a920c95bbad8872429ab", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-dom": "*", + "ext-libxml": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7" + }, + "time": "2021-07-01T14:25:37+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Masterminds\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matt Butcher", + "email": "technosophos@gmail.com" + }, + { + "name": "Matt Farina", + "email": "matt@mattfarina.com" + }, + { + "name": "Asmir Mustafic", + "email": "goetas@gmail.com" + } + ], + "description": "An HTML5 parser and serializer.", + "homepage": "http://masterminds.github.io/html5-php", + "keywords": [ + "HTML5", + "dom", + "html", + "parser", + "querypath", + "serializer", + "xml" + ], + "support": { + "issues": "https://github.com/Masterminds/html5-php/issues", + "source": "https://github.com/Masterminds/html5-php/tree/2.7.5" + }, + "install-path": "../masterminds/html5" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "version_normalized": "1.0.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "time": "2016-08-06T14:39:51+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/master" + }, + "install-path": "../psr/http-message" + }, { "name": "psr/http-factory", "version": "1.0.1", diff --git a/plugins/af_readability/vendor/composer/installed.php b/plugins/af_readability/vendor/composer/installed.php index 569e919fa..9254e7280 100644 --- a/plugins/af_readability/vendor/composer/installed.php +++ b/plugins/af_readability/vendor/composer/installed.php @@ -5,7 +5,7 @@ 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), - 'reference' => 'af324449360143a31b71771004e319d1e07a308d', + 'reference' => 'fdd1c43612011060b4b876db438eb7ec62dd077d', 'name' => '__root__', 'dev' => true, ), @@ -16,25 +16,45 @@ 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), - 'reference' => 'af324449360143a31b71771004e319d1e07a308d', + 'reference' => 'fdd1c43612011060b4b876db438eb7ec62dd077d', 'dev_requirement' => false, ), 'fivefilters/readability.php' => array( - 'pretty_version' => 'v2.1.0', - 'version' => '2.1.0.0', + 'pretty_version' => 'dev-master', + 'version' => 'dev-master', 'type' => 'library', 'install_path' => __DIR__ . '/../fivefilters/readability.php', - 'aliases' => array(), - 'reference' => '7617a912b6c527909168f5d41d263792f171c42a', + 'aliases' => array( + 0 => '9999999-dev', + ), + 'reference' => '5ad152c70376002f043bb936d8ae5eed103fb993', 'dev_requirement' => false, ), - 'psr/http-factory' => array( - 'pretty_version' => '1.0.1', - 'version' => '1.0.1.0', + 'league/uri' => array( + 'pretty_version' => '6.7.1', + 'version' => '6.7.1.0', 'type' => 'library', - 'install_path' => __DIR__ . '/../psr/http-factory', + 'install_path' => __DIR__ . '/../league/uri', 'aliases' => array(), - 'reference' => '12ac7fcd07e5b077433f5f2bee95b3a771bf61be', + 'reference' => '2d7c87a0860f3126a39f44a8a9bf2fed402dcfea', + 'dev_requirement' => false, + ), + 'league/uri-interfaces' => array( + 'pretty_version' => '2.3.0', + 'version' => '2.3.0.0', + 'type' => 'library', + 'install_path' => __DIR__ . '/../league/uri-interfaces', + 'aliases' => array(), + 'reference' => '00e7e2943f76d8cb50c7dfdc2f6dee356e15e383', + 'dev_requirement' => false, + ), + 'masterminds/html5' => array( + 'pretty_version' => '2.7.5', + 'version' => '2.7.5.0', + 'type' => 'library', + 'install_path' => __DIR__ . '/../masterminds/html5', + 'aliases' => array(), + 'reference' => 'f640ac1bdddff06ea333a920c95bbad8872429ab', 'dev_requirement' => false, ), 'psr/http-message' => array( diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/.coveralls.yml b/plugins/af_readability/vendor/fivefilters/readability.php/.coveralls.yml deleted file mode 100644 index 18e6b2054..000000000 --- a/plugins/af_readability/vendor/fivefilters/readability.php/.coveralls.yml +++ /dev/null @@ -1,3 +0,0 @@ -coverage_clover: test/clover.xml -json_path: test/coveralls-upload.json -service_name: travis-ci \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/.gitattributes b/plugins/af_readability/vendor/fivefilters/readability.php/.gitattributes index ea4dd8899..c08d816c2 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/.gitattributes +++ b/plugins/af_readability/vendor/fivefilters/readability.php/.gitattributes @@ -1 +1,2 @@ -test/* linguist-language=PHP \ No newline at end of file +test/* linguist-language=PHP +* text=auto eol=lf \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/.gitignore b/plugins/af_readability/vendor/fivefilters/readability.php/.gitignore index 5608600f8..52b9f385e 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/.gitignore +++ b/plugins/af_readability/vendor/fivefilters/readability.php/.gitignore @@ -1,4 +1,5 @@ .idea/ vendor composer.lock -/test.* \ No newline at end of file +/test.* +/test/changed/ \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/.styleci.yml b/plugins/af_readability/vendor/fivefilters/readability.php/.styleci.yml deleted file mode 100644 index f5ddf3ed9..000000000 --- a/plugins/af_readability/vendor/fivefilters/readability.php/.styleci.yml +++ /dev/null @@ -1,13 +0,0 @@ -preset: recommended - -enabled: - - concat_with_spaces - - unalign_double_arrow - -disabled: - - concat_without_spaces - - align_double_arrow - - simplified_null_return - - cast_spaces - - trailing_comma_in_multiline_array - - phpdoc_align \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/.travis.yml b/plugins/af_readability/vendor/fivefilters/readability.php/.travis.yml deleted file mode 100644 index 5c3bdd198..000000000 --- a/plugins/af_readability/vendor/fivefilters/readability.php/.travis.yml +++ /dev/null @@ -1,48 +0,0 @@ -language: bash -services: docker - -env: - matrix: - - PHP_VERSION=7.3 LIBXML_VERSION=2.9.9 - - PHP_VERSION=7.3 LIBXML_VERSION=2.9.8 - - PHP_VERSION=7.3 LIBXML_VERSION=2.9.7 - - PHP_VERSION=7.3 LIBXML_VERSION=2.9.6 - - PHP_VERSION=7.3 LIBXML_VERSION=2.9.5 - - PHP_VERSION=7.3 LIBXML_VERSION=2.9.4 - - PHP_VERSION=7.2 LIBXML_VERSION=2.9.9 - - PHP_VERSION=7.2 LIBXML_VERSION=2.9.8 - - PHP_VERSION=7.2 LIBXML_VERSION=2.9.7 - - PHP_VERSION=7.2 LIBXML_VERSION=2.9.6 - - PHP_VERSION=7.2 LIBXML_VERSION=2.9.5 - - PHP_VERSION=7.2 LIBXML_VERSION=2.9.4 - - PHP_VERSION=7.1 LIBXML_VERSION=2.9.9 - - PHP_VERSION=7.1 LIBXML_VERSION=2.9.8 - - PHP_VERSION=7.1 LIBXML_VERSION=2.9.7 - - PHP_VERSION=7.1 LIBXML_VERSION=2.9.6 - - PHP_VERSION=7.1 LIBXML_VERSION=2.9.5 - - PHP_VERSION=7.1 LIBXML_VERSION=2.9.4 - - PHP_VERSION=7.0 LIBXML_VERSION=2.9.9 - - PHP_VERSION=7.0 LIBXML_VERSION=2.9.8 - - PHP_VERSION=7.0 LIBXML_VERSION=2.9.7 - - PHP_VERSION=7.0 LIBXML_VERSION=2.9.6 - - PHP_VERSION=7.0 LIBXML_VERSION=2.9.5 - - PHP_VERSION=7.0 LIBXML_VERSION=2.9.4 - -matrix: - allow_failures: - - env: LIBXML_VERSION=2.9.9 - - env: LIBXML_VERSION=2.9.8 - - env: LIBXML_VERSION=2.9.7 - - env: LIBXML_VERSION=2.9.6 - - env: LIBXML_VERSION=2.9.5 - -install: - - docker run --rm --volume $PWD:/app --workdir="/app" composer install - -script: - - docker build --build-arg PHP_VERSION=${PHP_VERSION} --build-arg LIBXML_VERSION=${LIBXML_VERSION} -t travis-build - < ./docker/php/Dockerfile - - docker run --volume $PWD:/app --workdir="/app" travis-build php ./vendor/bin/phpunit --coverage-clover /app/test/clover.xml - -after_script: - - docker run --volume $PWD:/app --workdir="/app" composer require php-coveralls/php-coveralls:^2.0 - - docker run --volume $PWD:/app --workdir="/app" --env TRAVIS=${TRAVIS} --env TRAVIS_JOB_ID=${TRAVIS_JOB_ID} travis-build php ./vendor/php-coveralls/php-coveralls/bin/php-coveralls -v diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/AUTHORS.md b/plugins/af_readability/vendor/fivefilters/readability.php/AUTHORS.md index cc420e3a8..fabdb5a52 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/AUTHORS.md +++ b/plugins/af_readability/vendor/fivefilters/readability.php/AUTHORS.md @@ -11,3 +11,4 @@ The AUTHORS/Contributors are (and/or have been): * Sergiy Lavryk * Pedro Amorim * Malu Decks +* Keyvan Minoukadeh diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/CONTRIBUTING.md b/plugins/af_readability/vendor/fivefilters/readability.php/CONTRIBUTING.md index 345f71565..208083215 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/CONTRIBUTING.md +++ b/plugins/af_readability/vendor/fivefilters/readability.php/CONTRIBUTING.md @@ -2,8 +2,9 @@ Contributions are **welcome** and will be fully **credited**. -We accept contributions via Pull Requests on [Github](https://github.com/andreskrey/readability.php/). +When it comes to the core article-extraction functionality, please contribute to [Mozilla's Readability](https://github.com/mozilla/readability/) repository, as we're trying to mirror that here. +For anything else, we accept contributions via Pull Requests on [Github](https://github.com/fivefilters/readability.php/). ## Pull Requests diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/Makefile b/plugins/af_readability/vendor/fivefilters/readability.php/Makefile index b3bf15040..c5123f171 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/Makefile +++ b/plugins/af_readability/vendor/fivefilters/readability.php/Makefile @@ -1,28 +1,25 @@ .PHONY: test-all -test-all: start test-7.3 test-7.2 test-7.1 test-7.0 stop +test-all: start test-7.3 test-7.4 test-8 stop test-7.3: - docker-compose exec php-7.3-libxml-2.9.9 php /app/vendor/phpunit/phpunit/phpunit --configuration /app/phpunit.xml + docker-compose exec php-7.3-libxml-2.9.10 php /app/vendor/phpunit/phpunit/phpunit --configuration /app/phpunit.xml -test-7.2: - docker-compose exec php-7.2-libxml-2.9.9 php /app/vendor/phpunit/phpunit/phpunit --configuration /app/phpunit.xml +test-7.4: + docker-compose exec php-7.4-libxml-2.9.10 php /app/vendor/phpunit/phpunit/phpunit --configuration /app/phpunit.xml -test-7.1: - docker-compose exec php-7.1-libxml-2.9.9 php /app/vendor/phpunit/phpunit/phpunit --configuration /app/phpunit.xml - -test-7.0: - docker-compose exec php-7.0-libxml-2.9.9 php /app/vendor/phpunit/phpunit/phpunit --configuration /app/phpunit.xml +test-8: + docker-compose exec php-8-libxml-2.9.10 php /app/vendor/phpunit/phpunit/phpunit --configuration /app/phpunit.xml start: - docker-compose up -d php-7.3-libxml-2.9.9 php-7.2-libxml-2.9.9 php-7.1-libxml-2.9.9 php-7.0-libxml-2.9.9 + docker-compose up -d php-7.3-libxml-2.9.10 php-7.4-libxml-2.9.10 php-8-libxml-2.9.10 stop: docker-compose stop test-all-versions: - for php_version in 7.0 7.1 7.2 7.3; do \ - for libxml_version in 2.9.4 2.9.5 2.9.6 2.9.7 2.9.8 2.9.9; do \ + for php_version in 7.3 7.4 8; do \ + for libxml_version in 2.9.4 2.9.5 2.9.10 2.9.12; do \ docker-compose up -d php-$$php_version-libxml-$$libxml_version; \ docker-compose exec php-$$php_version-libxml-$$libxml_version php /app/vendor/phpunit/phpunit/phpunit --configuration /app/phpunit.xml; \ done \ diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/README.md b/plugins/af_readability/vendor/fivefilters/readability.php/README.md index b6b1e2922..c910714a3 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/README.md +++ b/plugins/af_readability/vendor/fivefilters/readability.php/README.md @@ -1,32 +1,51 @@ # Readability.php -[![Latest Stable Version](https://poser.pugx.org/andreskrey/readability.php/v/stable)](https://packagist.org/packages/andreskrey/readability.php) [![Build Status](https://travis-ci.org/andreskrey/readability.php.svg?branch=master)](https://travis-ci.org/andreskrey/readability.php) [![Coverage Status](https://coveralls.io/repos/github/andreskrey/readability.php/badge.svg?branch=master)](https://coveralls.io/github/andreskrey/readability.php/?branch=master) [![StyleCI](https://styleci.io/repos/71042668/shield?branch=master)](https://styleci.io/repos/71042668) [![Total Downloads](https://poser.pugx.org/andreskrey/readability.php/downloads)](https://packagist.org/packages/andreskrey/readability.php) [![Monthly Downloads](https://poser.pugx.org/andreskrey/readability.php/d/monthly)](https://packagist.org/packages/andreskrey/readability.php) + +## News (August 2021) + +Andres Rey, the [original developer](https://github.com/andreskrey/readability.php) of Readability.php has kindly let us take over maintenance and development of the project. + +Please bear with us while we catch up with [Readability.js](https://github.com/mozilla/readability) changes. There'll be a new release (3.0.0) when we're ready. + +For the changes we've made so far in this repository, please see our [blog post](https://www.fivefilters.org/2021/readability/). + +## About + +[![Latest Stable Version](https://poser.pugx.org/fivefilters/readability.php/v/stable)](https://packagist.org/packages/fivefilters/readability.php) [![Tests](https://github.com/fivefilters/readability.php/actions/workflows/main.yml/badge.svg?branch=master)](https://github.com/fivefilters/readability.php/actions/workflows/main.yml) PHP port of *Mozilla's* **[Readability.js](https://github.com/mozilla/readability)**. Parses html text (usually news and other articles) and returns **title**, **author**, **main image** and **text content** without nav bars, ads, footers, or anything that isn't the main body of the text. Analyzes each node, gives them a score, and determines what's relevant and what can be discarded. -![Screenshot](https://raw.githubusercontent.com/andreskrey/readability.php/assets/screenshot.png) +![Screenshot](https://raw.githubusercontent.com/fivefilters/readability.php/assets/screenshot.png) The project aim is to be a 1 to 1 port of Mozilla's version and to follow closely all changes introduced there, but there are some major differences on the structure. Most of the code is a 1:1 copy –even the comments were imported– but some functions and structures were adapted to suit better the PHP language. -**Lead Developer**: Andres Rey +**Original Developer**: Andres Rey + +**Developer/Maintainer**: FiveFilters.org + +## Code porting + +Master branch - Up to date on 26 August 2021, with the exception of a [piece of code](https://github.com/fivefilters/readability.php/commit/1c662465bded2ab3acf3b975a1315c8c45f0bf73#diff-b9b31807b1a39caec18ddc293e9c52931ba8b55191c61e6b77a623d699a599ffR1899) which doesn't produce the same results in PHP for us compard to the JS version. Perhaps there's an error, or some difference in the underlying code that affects this. If you know what's wrong, please feel free to drop us a note or submit a pull request. :) + +Version 2.1.0 - Up to date with Readability.js up to [19 Nov 2018](https://github.com/mozilla/readability/commit/876c81f710711ba2afb36dd83889d4c5b4fc2743). ## Requirements -PHP 7.0+, ext-dom, ext-xml, and ext-mbstring. To install all this dependencies (in the rare case your system does not have them already), you could try something like this in *nix like environments: +PHP 7.3+, ext-dom, ext-xml, and ext-mbstring. To install these dependencies (in the rare case your system does not have them already), you could try something like this in *nix like environments: -`$ sudo apt-get install php7.1-xml php7.1-mbstring` +`$ sudo apt-get install php7.4-xml php7.4-mbstring` ## How to use it First you have to require the library using composer: -`composer require andreskrey/readability.php` +`composer require fivefilters/readability.php` Then, create a Readability class and pass a Configuration class, feed the `parse()` function with your HTML and echo the variable: ```php -use andreskrey\Readability\Readability; -use andreskrey\Readability\Configuration; -use andreskrey\Readability\ParseException; +use fivefilters\Readability\Readability; +use fivefilters\Readability\Configuration; +use fivefilters\Readability\ParseException; $readability = new Readability(new Configuration()); @@ -86,7 +105,7 @@ $configuration = new Configuration([ Then you pass this Configuration object to Readability. The following options are available. Remember to prepend `set` when calling them using native setters. - **MaxTopCandidates**: default value `5`, max amount of top level candidates. -- **WordThreshold**: default value `500`, minimum amount of characters to consider that the article was parsed successful. +- **CharThreshold**: default value `500`, minimum amount of characters to consider that the article was parsed successful. - **ArticleByLine**: default value `false`, search for the article byline and remove it from the text. It will be moved to the article metadata. - **StripUnlikelyCandidates**: default value `true`, remove nodes that are unlikely to have relevant information. Useful for debugging or parsing complex or non-standard articles. - **CleanConditionally**: default value `true`, remove certain nodes after parsing to return a cleaner result. @@ -95,13 +114,15 @@ Then you pass this Configuration object to Readability. The following options ar - **SubstituteEntities**: default value `false`, disables the `substituteEntities` flag of libxml. Will avoid substituting HTML entities. Like `á` to á. - **NormalizeEntities**: default value `false`, converts UTF-8 characters to its HTML Entity equivalent. Useful to parse HTML with mixed encoding. - **OriginalURL**: default value `http://fakehost`, original URL from the article used to fix relative URLs. -- **SummonCthulhu**: default value `false`, remove all ` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - Just-released Minecraft exploit makes it easy to crash game servers | Ars Technica - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - -
-
- -

ArsTechnica

- - -
-
- -

- Risk Assessment - / - Security & Hacktivism -

- -
-
-

Just-released Minecraft exploit makes it easy to crash game servers

-

Two-year-old bug exposes thousands of servers to crippling attack.

- -
-
-
-
-
- -
-
- - -

A flaw in the wildly popular online game Minecraft makes it easy for just about anyone to crash the server hosting the game, according to a computer programmer who has released proof-of-concept code that exploits the vulnerability.

-

"I thought a lot before writing this post," Pakistan-based developer Ammar Askar wrote in a blog post published Thursday, 21 months, he said, after privately reporting the bug to Minecraft developer Mojang. "On the one hand I don't want to expose thousands of servers to a major vulnerability, yet on the other hand Mojang has failed to act on it."

-

The bug resides in the networking internals of the Minecraft protocol. It allows the contents of inventory slots to be exchanged, so that, among other things, items in players' hotbars are displayed automatically after logging in. Minecraft items can also store arbitrary metadata in a file format known as Named Binary Tag (NBT), which allows complex data structures to be kept in hierarchical nests. Askar has released proof-of-concept attack code he said exploits the vulnerability to crash any server hosting the game. Here's how it works.

-
-

The vulnerability stems from the fact that the client is allowed to send the server information about certain slots. This, coupled with the NBT format’s nesting allows us to craft a packet that is incredibly complex for the server to deserialize but trivial for us to generate.

-

In my case, I chose to create lists within lists, down to five levels. This is a json representation of what it looks like.

-
rekt: {
+                    
+                    
+                
+ +
+ +
+
+
+
+

+ Biz & IT — +

+

+ Just-released Minecraft exploit makes it easy to crash game servers +

+

+ Two-year-old bug exposes thousands of servers to crippling attack. +

+ +
+
+
+
+ Just-released Minecraft exploit makes it easy to crash game servers +
+
+ Kevin +
+
+
+ +

+ A flaw in the wildly popular online game Minecraft makes it easy for just about anyone to crash the server hosting the game, according to a computer programmer who has released proof-of-concept code that exploits the vulnerability. +

+

+ "I thought a lot before writing this post," Pakistan-based developer Ammar Askar wrote in a blog post published Thursday, 21 months, he said, after privately reporting the bug to Minecraft developer Mojang. "On the one hand I don't want to expose thousands of servers to a major vulnerability, yet on the other hand Mojang has failed to act on it." +

+

+ The bug resides in the networking internals of the Minecraft protocol. It allows the contents of inventory slots to be exchanged, so that, among other things, items in players' hotbars are displayed automatically after logging in. Minecraft items can also store arbitrary metadata in a file format known as Named Binary Tag (NBT), which allows complex data structures to be kept in hierarchical nests. Askar has released proof-of-concept attack code he said exploits the vulnerability to crash any server hosting the game. Here's how it works. +

+
+

+ The vulnerability stems from the fact that the client is allowed to send the server information about certain slots. This, coupled with the NBT format’s nesting allows us to craft a packet that is incredibly complex for the server to deserialize but trivial for us to generate. +

+

+ In my case, I chose to create lists within lists, down to five levels. This is a json representation of what it looks like. +

+
+
rekt: {
     list: [
         list: [
             list: [
@@ -311,455 +392,243 @@
         ...
     ]
     ...
-}
-

The root of the object, rekt, contains 300 lists. Each list has a list with 10 sublists, and each of those sublists has 10 of their own, up until 5 levels of recursion. That’s a total of 10^5 * 300 = 30,000,000 lists.

-

And this isn’t even the theoretical maximum for this attack. Just the nbt data for this payload is 26.6 megabytes. But luckily Minecraft implements a way to compress large packets, lucky us! zlib shrinks down our evil data to a mere 39 kilobytes.

-

Note: in previous versions of Minecraft, there was no protocol wide compression for big packets. Previously, NBT was sent compressed with gzip and prefixed with a signed short of its length, which reduced our maximum payload size to 2^15 - 1. Now that the length is a varint capable of storing integers up to 2^28, our potential for attack has increased significantly.

-

When the server will decompress our data, it’ll have 27 megs in a buffer somewhere in memory, but that isn’t the bit that’ll kill it. When it attempts to parse it into NBT, it’ll create java representations of the objects meaning suddenly, the sever is having to create several million java objects including ArrayLists. This runs the server out of memory and causes tremendous CPU load.

-

This vulnerability exists on almost all previous and current Minecraft versions as of 1.8.3, the packets used as attack vectors are the 0x08: Block Placement Packet and 0x10: Creative Inventory Action.

-

The fix for this vulnerability isn’t exactly that hard, the client should never really send a data structure as complex as NBT of arbitrary size and if it must, some form of recursion and size limits should be implemented.

-

These were the fixes that I recommended to Mojang 2 years ago.

-
-

Ars is asking Mojang for comment and will update this post if company officials respond.

+}
+
+

+ The root of the object, rekt, contains 300 lists. Each list has a list with 10 sublists, and each of those sublists has 10 of their own, up until 5 levels of recursion. That’s a total of 10^5 * 300 = 30,000,000 lists. +

+

+ And this isn’t even the theoretical maximum for this attack. Just the nbt data for this payload is 26.6 megabytes. But luckily Minecraft implements a way to compress large packets, lucky us! zlib shrinks down our evil data to a mere 39 kilobytes. +

+

+ Note: in previous versions of Minecraft, there was no protocol wide compression for big packets. Previously, NBT was sent compressed with gzip and prefixed with a signed short of its length, which reduced our maximum payload size to 2^15 - 1. Now that the length is a varint capable of storing integers up to 2^28, our potential for attack has increased significantly. +

+

+ When the server will decompress our data, it’ll have 27 megs in a buffer somewhere in memory, but that isn’t the bit that’ll kill it. When it attempts to parse it into NBT, it’ll create java representations of the objects meaning suddenly, the sever is having to create several million java objects including ArrayLists. This runs the server out of memory and causes tremendous CPU load. +

+

+ This vulnerability exists on almost all previous and current Minecraft versions as of 1.8.3, the packets used as attack vectors are the 0x08: Block Placement Packet and 0x10: Creative Inventory Action. +

+

+ The fix for this vulnerability isn’t exactly that hard, the client should never really send a data structure as complex as NBT of arbitrary size and if it must, some form of recursion and size limits should be implemented. +

+

+ These were the fixes that I recommended to Mojang 2 years ago. +

+
+

+ Ars is asking Mojang for comment and will update this post if company officials respond. +

+
+
+
+
+
+
+ + +
+
-
-

Expand full story

+
+
+ + +
+
+
+ +
+
+ +
+
+

+ You must to comment. +

+
+
+
+
+ +
+
+
+
+
+

+ Channel Ars Technica +

+
+
+
+ +
+ +
+
+ + +
- - - - - - - + + + + + + + - - - - - - - - - - + ]]> + + + diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url-base-element-relative/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url-base-element-relative/expected-images.json index 5e3fa4120..51ed665a0 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url-base-element-relative/expected-images.json +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url-base-element-relative/expected-images.json @@ -1,6 +1,6 @@ -{ - "0": "http:\/\/fakehost\/test\/base\/foo\/bar\/baz.png", - "2": "http:\/\/fakehost\/foo\/bar\/baz.png", - "3": "http:\/\/test\/foo\/bar\/baz.png", - "4": "https:\/\/test\/foo\/bar\/baz.png" -} \ No newline at end of file +[ + "http:\/\/fakehost\/test\/base\/foo\/bar\/baz.png", + "http:\/\/fakehost\/foo\/bar\/baz.png", + "http:\/\/test\/foo\/bar\/baz.png", + "https:\/\/test\/foo\/bar\/baz.png" +] \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url-base-element-relative/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url-base-element-relative/expected.html index 14d23f672..1a8d41293 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url-base-element-relative/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url-base-element-relative/expected.html @@ -1,4 +1,5 @@
+

Lorem

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, @@ -17,11 +18,11 @@

link

link

Images

-

-

-

-

-

+

+

+

+

+

Foo

Tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url-base-element/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url-base-element/expected-images.json index c4a597eea..68c486489 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url-base-element/expected-images.json +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url-base-element/expected-images.json @@ -1,5 +1,5 @@ -{ - "0": "http:\/\/fakehost\/foo\/bar\/baz.png", - "3": "http:\/\/test\/foo\/bar\/baz.png", - "4": "https:\/\/test\/foo\/bar\/baz.png" -} \ No newline at end of file +[ + "http:\/\/fakehost\/foo\/bar\/baz.png", + "http:\/\/test\/foo\/bar\/baz.png", + "https:\/\/test\/foo\/bar\/baz.png" +] \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url-base-element/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url-base-element/expected.html index 5037eb265..3a03ddb79 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url-base-element/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url-base-element/expected.html @@ -1,4 +1,5 @@

+

Lorem

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, @@ -17,11 +18,11 @@

link

link

Images

-

-

-

-

-

+

+

+

+

+

Foo

Tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url/expected-images.json index 1c28ae60c..e072ac11c 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url/expected-images.json +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url/expected-images.json @@ -1,6 +1,6 @@ -{ - "0": "http:\/\/fakehost\/test\/foo\/bar\/baz.png", - "2": "http:\/\/fakehost\/foo\/bar\/baz.png", - "3": "http:\/\/test\/foo\/bar\/baz.png", - "4": "https:\/\/test\/foo\/bar\/baz.png" -} \ No newline at end of file +[ + "http:\/\/fakehost\/test\/foo\/bar\/baz.png", + "http:\/\/fakehost\/foo\/bar\/baz.png", + "http:\/\/test\/foo\/bar\/baz.png", + "https:\/\/test\/foo\/bar\/baz.png" +] \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url/expected.html index 36981e1e7..e9da69da3 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url/expected.html @@ -1,4 +1,5 @@

+

Lorem

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, @@ -17,11 +18,11 @@

link

link

Images

-

-

-

-

-

+

+

+

+

+

Foo

Tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bbc-1/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bbc-1/expected-images.json index 44bca8dce..5c50d84c8 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bbc-1/expected-images.json +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bbc-1/expected-images.json @@ -1,7 +1,7 @@ -{ - "0": "http:\/\/ichef.bbci.co.uk\/news\/1024\/cpsprodpb\/3D8B\/production\/_84455751_84455749.jpg", - "1": "http:\/\/ichef.bbci.co.uk\/news\/555\/cpsprodpb\/462D\/production\/_84456971_gettyimages-167501087.jpg", - "2": "http:\/\/ichef.bbci.co.uk\/news\/555\/media\/images\/76020000\/jpg\/_76020974_line976.jpg", - "3": "http:\/\/ichef-1.bbci.co.uk\/news\/555\/cpsprodpb\/6D3D\/production\/_84456972_p072315al-0500.jpg", - "5": "http:\/\/ichef-1.bbci.co.uk\/news\/555\/cpsprodpb\/142FD\/production\/_84458628_shirtreuters.jpg" -} \ No newline at end of file +[ + "http:\/\/ichef.bbci.co.uk\/news\/1024\/cpsprodpb\/3D8B\/production\/_84455751_84455749.jpg", + "http:\/\/ichef.bbci.co.uk\/news\/555\/cpsprodpb\/462D\/production\/_84456971_gettyimages-167501087.jpg", + "http:\/\/ichef.bbci.co.uk\/news\/555\/media\/images\/76020000\/jpg\/_76020974_line976.jpg", + "http:\/\/ichef-1.bbci.co.uk\/news\/555\/cpsprodpb\/6D3D\/production\/_84456972_p072315al-0500.jpg", + "http:\/\/ichef-1.bbci.co.uk\/news\/555\/cpsprodpb\/142FD\/production\/_84458628_shirtreuters.jpg" +] \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bbc-1/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bbc-1/expected-metadata.json index 6af682f84..8d5937b38 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bbc-1/expected-metadata.json +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bbc-1/expected-metadata.json @@ -3,6 +3,6 @@ "Direction": null, "Excerpt": "President Barack Obama tells the BBC his failure to pass \"common sense gun safety laws\" is the greatest frustration of his presidency.", "Image": "http:\/\/ichef.bbci.co.uk\/news\/1024\/cpsprodpb\/3D8B\/production\/_84455751_84455749.jpg", - "Title": "Obama admits US gun laws are his 'biggest frustration' - BBC News", + "Title": "Obama admits US gun laws are his 'biggest frustration'", "SiteName": "BBC News" -} +} \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bbc-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bbc-1/expected.html index ca646fe80..1e3c6d30a 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bbc-1/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bbc-1/expected.html @@ -1,5 +1,6 @@

-

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.

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".

He vowed to keep trying, but the BBC's North America editor Jon Sopel said the president did not sound very confident.

However, Mr Obama said race relations had improved during his presidency.

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.

In a wide-ranging interview, President Obama also said:

  • +

    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.

    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".

    He vowed to keep trying, but the BBC's North America editor Jon Sopel said the president did not sound very confident.

    However, Mr Obama said race relations had improved during his presidency.

    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.

    In a wide-ranging interview, President Obama also said:

      +
    • The UK must stay in the EU to have influence on the world stage
    • He is confident the Iran nuclear deal will be passed by Congress
    • Syria needs a political solution in order to defeat the Islamic State group
    • @@ -7,10 +8,14 @@
    • He would defend his advocacy of gay rights following protests in Kenya
    • Despite racial tensions, the US is becoming more diverse and more tolerant
    • -

    Read the full transcript of his interview

    Mr Obama lands in Kenya later on Friday for his first visit since becoming president.

    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.

    "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.

    Gun control campaigners protest in McPhearson Square in Washington DC - 25 April 2013
    +

Read the full transcript of his interview

Mr Obama lands in Kenya later on Friday for his first visit since becoming president.

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.

"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.

Gun control campaigners protest in McPhearson Square in Washington DC - 25 April 2013 +
+ The president said he would continue fighting for greater gun control laws -

"For us not to be able to resolve that issue has been something that is distressing," he added.

Mr Obama has pushed for stricter gun control throughout his presidency but has been unable to secure any significant changes to the laws.

After nine African-American churchgoers were killed in South Carolina in June, he admitted "politics in this town" meant there were few options available.

line

Analysis: Jon Sopel, BBC News, Washington

President Barack Obama participates in an interview with Jon Sopel of BBC in the Roosevelt Room of the White House - 23 July 2015

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.

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.

The only body swerve the president performed was when I asked him how many minds he had changed on the Iran nuclear deal after an intense sell aimed at Gulf allies and members of US Congress who remain implacably opposed.

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.

But notably, he did not give a direct answer to that question, which leaves me with the impression that he has persuaded precisely zero.

Five things we learned from Obama interview

The presidential body swerve

line

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.

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.

"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."

Talking about how he was feeling after his recent successes, he said "every president, every leader has strengths and weaknesses".

"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.

Customer looks at Obama shirts at a stall in Nairobi's Kibera slums, 23 July 2015
+

"For us not to be able to resolve that issue has been something that is distressing," he added.

Mr Obama has pushed for stricter gun control throughout his presidency but has been unable to secure any significant changes to the laws.

After nine African-American churchgoers were killed in South Carolina in June, he admitted "politics in this town" meant there were few options available.

line

Analysis: Jon Sopel, BBC News, Washington

President Barack Obama participates in an interview with Jon Sopel of BBC in the Roosevelt Room of the White House - 23 July 2015

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.

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.

The only body swerve the president performed was when I asked him how many minds he had changed on the Iran nuclear deal after an intense sell aimed at Gulf allies and members of US Congress who remain implacably opposed.

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.

But notably, he did not give a direct answer to that question, which leaves me with the impression that he has persuaded precisely zero.

Five things we learned from Obama interview

The presidential body swerve

line

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.

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.

"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."

Talking about how he was feeling after his recent successes, he said "every president, every leader has strengths and weaknesses".

"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.

Customer looks at Obama shirts at a stall in Nairobi's Kibera slums, 23 July 2015 +
+ Kenya is getting ready to welcome the US president

Kenya trip

Mr Obama was speaking to the BBC at the White House before departing for Kenya.

His father was Kenyan and the president is expected to meet relatives in Nairobi.

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.

"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.

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.

"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."

Mr Obama will become the first US president to address the African Union when he travels on to Ethiopia on Sunday.

diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/blogger/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/blogger/expected.html index ec3a02a43..20d9033a6 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/blogger/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/blogger/expected.html @@ -1,46 +1,73 @@

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 Silicon Exposed.

So what's a GreenPak?

-

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 5th generation parts were just announced, but I started this project before that happened so I'm still targeting the 4th generation.

GreenPak devices are kind of like itty bitty PSoCs - 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).

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.

Without further ado, here's a block diagram showing all the cool stuff you get in the SLG46620V:

+ + + + +
- +

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 5th generation parts were just announced, but I started this project before that happened so I'm still targeting the 4th generation.

GreenPak devices are kind of like itty bitty PSoCs - 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).

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.

Without further ado, here's a block diagram showing all the cool stuff you get in the SLG46620V:

+ + + - -
+
SLG46620V block diagram (from device datasheet)

- 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.

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.

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.

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.

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.

+ + + + +
- +
SLG46620V block diagram (from device datasheet)

+ 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.

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.

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.

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.

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.

+ + + - -
+
Schematic from hell!

+

Schematic from hell!

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.

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?

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 says, 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.

Great! How does it work?

-

Rather than wasting time writing a synthesizer, I decided to write a GreenPak technology library for Clifford Wolf's excellent open source synthesis tool, Yosys, 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.

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.

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.)

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.

+ + + + +
- +

Rather than wasting time writing a synthesizer, I decided to write a GreenPak technology library for Clifford Wolf's excellent open source synthesis tool, Yosys, 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.

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.

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.)

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.

+ + + - -
+
Example labeling for a subset of the netlist and device graphs

- 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:

  1. 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.
  2. +
Example labeling for a subset of the netlist and device graphs

+ 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:

    +
  1. 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.
  2. 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.

- 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:

  1. 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).
  2. + 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:

      +
    1. 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).
    2. 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).
    3. Remove nodes from the list that are LOC'd to a specific location since we're not allowed to move them.
    4. 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.
    5. Pick a node from the remainder of the list at random. Call this our pivot.
    6. Find a list of candidate placements for the pivot:
    7. -
      1. Consider all routable placements in the other half of the device.
      2. +
          +
        1. Consider all routable placements in the other half of the device.
        2. If none were found, consider all routable placements anywhere in the device.
        3. If none were found, consider all placements anywhere in the device even if they're not routable.
        4. -
      3. 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.
      4. +
      +
    8. 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.
    9. Re-compute the score for the design. If it's better, accept this change and start the next iteration.
    10. 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.

    - 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.

    The design is then routed. This is quite simple due to the crossbar structure of the device. For each edge in the netlist:

    1. If dedicated (non-fabric) routing is used for this path, configure the destination's input mux appropriately and stop.
    2. + 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.

      The design is then routed. This is quite simple due to the crossbar structure of the device. For each edge in the netlist:

        +
      1. If dedicated (non-fabric) routing is used for this path, configure the destination's input mux appropriately and stop.
      2. If the source and destination are in the same half of the device, configure the destination's input mux appropriately and stop.
      3. 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.
      4. 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.
      5. 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.

      - Once routing is finished, run a series of post-PAR design rule checks. These currently include the following:

      • If any node has no loads, generate a warning
      • + Once routing is finished, run a series of post-PAR design rule checks. These currently include the following:

          +
        • If any node has no loads, generate a warning
        • If an I/O buffer is connected to analog hard IP, fail with an error if it's not configured in analog mode.
        • 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.

        diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/breitbart/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/breitbart/expected.html index e2f04c74b..b4a000f03 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/breitbart/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/breitbart/expected.html @@ -1,9 +1,15 @@

        -

        Supporters of Republican presidential nominee Donald Trump cheer during election night at the New York Hilton Midtown in New York on November 9, 2016.  / AFP / JIM WATSON        (Photo credit should read JIM WATSON/AFP/Getty Images)

        JIM WATSON/AFP/Getty Images

        + +
        +

        Supporters of Republican presidential nominee Donald Trump cheer during election night at the New York Hilton Midtown in New York on November 9, 2016.  / AFP / JIM WATSON        (Photo credit should read JIM WATSON/AFP/Getty Images)

        JIM WATSON/AFP/Getty Images

        -
        +
        + + +
        +

        SIGN UP FOR OUR NEWSLETTER

        @@ -15,7 +21,7 @@

        SIGN UP FOR OUR NEWSLETTER

        -

        The tweet from Vulture magazine reads, “#Hamilton Chicago show interrupted by angry Trump supporter.” Emery retweeted the story, saying, “Are there un-angry Trump supporters?”

        +

        The tweet from Vulture magazine reads, “#Hamilton Chicago show interrupted by angry Trump supporter.” Emery retweeted the story, saying, “Are there un-angry Trump supporters?”

        @@ -33,7 +39,7 @@

        Facebook believe that Emery, along with other Snopes writers, ABC News, and Politifact are impartial enough to label and silence what they believe to be “fake news” on social media.

        -

        Lucas Nolan is a reporter for Breitbart Tech covering issues of free speech and online censorship. Follow him on Twitter @LucasNolan_ or email him at lnolan@breitbart.com

        +

        Lucas Nolan is a reporter for Breitbart Tech covering issues of free speech and online censorship. Follow him on Twitter @LucasNolan_ or email him at lnolan@breitbart.com

        diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bug-1255978/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bug-1255978/expected.html index c281eef90..520f8e803 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bug-1255978/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bug-1255978/expected.html @@ -1,4 +1,4 @@ -
        +

        Most people go to hotels for the pleasure of sleeping in a giant bed with clean white sheets and waking up to fresh towels in the morning.

        But those towels and sheets might not be as clean as they look, according to the hotel bosses that responded to an online thread about the things hotel owners don’t want you to know.

        @@ -14,7 +14,7 @@
        -

        bandb2.jpg

        +

        bandb2.jpg

        @@ -37,7 +37,7 @@
        -

        hotel-door-getty.jpg

        +

        hotel-door-getty.jpg

        @@ -53,13 +53,10 @@
        -
        -

        luggage-3.jpg

        +

        luggage-3.jpg

        - -

        3. Don’t use a wooden luggage rack

        @@ -70,7 +67,7 @@
        -

        Lifestyle-hotels.jpg

        +

        Lifestyle-hotels.jpg

        @@ -91,20 +88,12 @@ -
        -
        - -
        +

        Business news in pictures

        - - -
        -
        -

        6. Mini bars almost always lose money

        Despite the snacks in the minibar seeming like the most overpriced food you have ever seen, hotel owners are still struggling to make a profit from those snacks. "Minibars almost always lose money, even when they charge $10 for a Diet Coke,” Sharon said.

        @@ -114,7 +103,7 @@
        -

        agenda7.jpg

        +

        agenda7.jpg

        @@ -126,11 +115,14 @@

        7. Always made sure the hand towels are clean when you arrive

        Forrest Jones made a discovery when he was helping out with the housekeepers. “You know where you almost always find a hand towel in any recently-vacated hotel room that was occupied by a guy? On the floor, next to the bed, about halfway down, maybe a little toward the foot of the bed. Same spot in the floor, next to almost every bed occupied by a man, in every room. I'll leave the rest to your imagination,” he said.

        -
        \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bug-1255978/source.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bug-1255978/source.html index 08840dc24..b08ca34e5 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bug-1255978/source.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bug-1255978/source.html @@ -7,248 +7,6 @@ - The seven secrets that hotel owners don't want you to know | The Independent @@ -599,34889 +357,6 @@ - @@ -35747,2384 +622,6 @@ - - - - diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/buzzfeed-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/buzzfeed-1/expected.html index 46a3f3212..d1e6dc0bf 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/buzzfeed-1/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/buzzfeed-1/expected.html @@ -12,22 +12,20 @@

        She added: “They never stood a chance of saving her. She burned and crashed.”

        -
        -

        +

        Facebook

        -

        +

        Facebook

        -

        West Mercia police said the tablets were believed to contain dinitrophenol, known as DNP, which is a highly toxic industrial chemical.

        “We are undoubtedly concerned over the origin and sale of these pills and are working with partner agencies to establish where they were bought from and how they were advertised,” said chief inspector Jennifer Mattinson from the West Mercia police.

        @@ -36,6 +34,7 @@

        Fiona Parry issued a plea for people to stay away from pills containing the chemical.

        +

        “[Eloise] just never really understood how dangerous the tablets that she took were,” she said. “Most of us don’t believe that a slimming tablet could possibly kill us.

        “DNP is not a miracle slimming pill. It is a deadly toxin.”

        diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/clean-links/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/clean-links/expected-images.json index be86a5838..328eca36b 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/clean-links/expected-images.json +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/clean-links/expected-images.json @@ -1,3 +1,3 @@ [ - "http:\/\/fakehost\/test\/hmhome.gif " + "http:\/\/fakehost\/test\/hmhome.gif" ] \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/clean-links/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/clean-links/expected.html index 8c1b8b121..f9c6e071f 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/clean-links/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/clean-links/expected.html @@ -1,11 +1,12 @@ -
        -
        +

        Study Webtext

        -

        "Bartleby the Scrivener: A Story of Wall-Street " (1853) 

        +

        "Bartleby the Scrivener: A Story of Wall-Street " (1853) 
        Herman Melville

        -

        To the story text without notes
        +

        To the story text without notes
+

        -

        Prepared by Ann +

        Prepared by Ann Woodlief, Virginia Commonwealth University

        Click on text in red for hypertext notes and questions
        I @@ -1383,4 +1384,4 @@

        Ah Bartleby! Ah humanity!

        -
        \ No newline at end of file +
        \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnet-svg-classes/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnet-svg-classes/expected-metadata.json index be68e3164..632df58ea 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnet-svg-classes/expected-metadata.json +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnet-svg-classes/expected-metadata.json @@ -1,8 +1,8 @@ { - "Author": null, + "Author": "por \n \n \n César Salza", "Direction": 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.", "Image": "https:\/\/cdn1.cnet.com\/img\/JumVcu1ZSLtPP8ui0UWaSlgi5RU=\/670x503\/2017\/12\/01\/b36ce794-e0b8-495c-a198-184923a8f4e9\/twitter-lite.jpg", "Title": "Twitter Lite se estrena en México, Venezuela y otros nueve países", "SiteName": "CNET en Español" -} +} \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnet-svg-classes/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnet-svg-classes/expected.html index 1b6351245..3adf9501c 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnet-svg-classes/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnet-svg-classes/expected.html @@ -1,23 +1,27 @@ -
        -
        twitter-lite +
        +
        twitter-lite

        Twitter Lite estará disponible en Google Play Store en 11 países de América Latina.

        Twitter -

        Twitter ha dado a conocer que Twitter Lite llegará a un total de 24 nuevos países a partir de hoy, 11 de ellos de América Latina.

        -

        Según explicó en un comunicado Twitter Lite ahora estará disponible en Bolivia, Brasil, Chile, Colombia, Costa Rica, Ecuador, México, Panamá, Perú, El Salvador y Venezuela.

        + +
        +

        Twitter ha dado a conocer que Twitter Lite llegará a un total de 24 nuevos países a partir de hoy, 11 de ellos de América Latina.

        +

        Según explicó en un comunicado Twitter Lite ahora estará disponible en Bolivia, Brasil, Chile, Colombia, Costa Rica, Ecuador, México, Panamá, Perú, El Salvador y Venezuela.

        Twitter Lite es la versión ligera de la aplicación de la red social para Android, disponible en la Google Play Store. Con este app los usuarios que experimentan fallos de red o que viven en países con redes con poca velocidad de conexión como Venezuela podrán descargar los tuits de forma más rápida.

        Entre sus novedades, Twitter Lite permite la carga rápida de tuits en redes 2G y 3G, y ofrece ayuda offline en caso de que pierdas tu conexión; a eso debemos sumar que minimiza el uso de datos y ofrece un modo de ahorro, en el que únicamente se descargan las fotos o videos de los tuits que quieres ver.

        Además, el app ocupa menos espacio en tu teléfono móvil, al reducir a 3MB su peso.

        -

        Twitter dio a conocer Twitter Lite en abril en India, y desde entonces ha estado trabajando para llevarlo a más países. La empresa en los últimos meses también se ha involucrado de forma definitiva en la eliminación de los abusos en la red social, tomando medidas incluso en la verificación de cuentas.

        -
        -
        +

        Twitter dio a conocer Twitter Lite en abril en India, y desde entonces ha estado trabajando para llevarlo a más países. La empresa en los últimos meses también se ha involucrado de forma definitiva en la eliminación de los abusos en la red social, tomando medidas incluso en la verificación de cuentas.

        +
        +
        +
        +

        Reproduciendo: Mira esto: Google Assistant mejora, hay más cambios en Twitter y...

        - 8:09

        + 8:09

        -
        -
        \ No newline at end of file + +
        \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnet/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnet/expected-metadata.json index 773cbb9f0..d51b85260 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnet/expected-metadata.json +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnet/expected-metadata.json @@ -1,8 +1,8 @@ { - "Author": "Steven Musil", + "Author": "by \n\n \n Steven Musil\n \n\n\n January 18, 2017 11:00 PM PST\n \n \n \n \n \n \n\n \n @stevenmusil", "Direction": null, "Excerpt": "Facebook CEO says be a friend and have a shared vision, but scare them when you have to and move fast.", "Image": "https:\/\/cnet3.cbsistatic.com\/img\/1JaRRjqhoGxDVkFxTRRWkZgyK2Q=\/670x503\/2014\/03\/21\/863df5d9-e8b8-4b38-851b-5e3f77f2cf0e\/mark-zuckerberg-facebook-home-10671610x407.jpg", "Title": "Zuckerberg offers peek at Facebook's acquisition strategies", "SiteName": "CNET" -} +} \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnet/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnet/expected.html index 4f401dad0..f9a3b7421 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnet/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnet/expected.html @@ -1,15 +1,17 @@ -
        +
        -
        +

        Facebook CEO Mark Zuckerberg, the man with the acquisition plan.

        Photo by James Martin/CNET -

        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.

        + +
        +

        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.

        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 $19 billion acquisition of WhatsApp, he personally brokered its $1 billion buyout of Instagram and closed the $3 billion deal to buy Oculus VR.

        -

        Zuckerberg offered a primer on the strategies he and his company employ when they see an attractive target during testimony Tuesday in a lawsuit with ZeniMax Media, 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 hottest gadget trends today.

        -

        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 Business Insider. They take time to cultivate.

        +

        Zuckerberg offered a primer on the strategies he and his company employ when they see an attractive target during testimony Tuesday in a lawsuit with ZeniMax Media, 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 hottest gadget trends today.

        +

        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 Business Insider. They take time to cultivate.

        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.

        @@ -32,7 +34,7 @@ -

        Tech Enabled: CNET chronicles tech's role in providing new kinds of accessibility. Check it out here.

        +

        Tech Enabled: CNET chronicles tech's role in providing new kinds of accessibility. Check it out here.

        Technically Literate: Original works of short fiction with unique perspectives on tech, exclusively on CNET. Here.

        @@ -40,4 +42,5 @@ -
        \ No newline at end of file + +
        \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnn/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnn/expected.html index 552455fe8..368cf7737 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnn/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnn/expected.html @@ -6,10 +6,11 @@

        The report assessed poverty levels, income and wealth inequality, economic mobility and unemployment levels among 10 wealthy countries with social welfare programs.

        -
        -
        -
        -
        + + + + +

        Powered by SmartAsset.com

        @@ -20,10 +21,6 @@
        -
        -
        -
        -

        Among its key findings: the class you're born into matters much more in the U.S. than many of the other countries.

        As the report states: "[T]he birth lottery matters more in the U.S. than in most well-off countries."

        @@ -32,7 +29,7 @@

        The report also suggested the U.S. might not be the "jobs machine" it thinks it is, when compared to other countries.

        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.

        -

        The overall rankings of the countries were as follows:

        1. Finland

        2. Norway

        3. Australia

        4. Canada

        5. Germany

        6. France

        7. United Kingdom

        8. Italy

        9. Spain

        10. United States
        +

        The overall rankings of the countries were as follows:
        1. Finland
        2. Norway
        3. Australia
        4. Canada
        5. Germany
        6. France
        7. United Kingdom
        8. Italy
        9. Spain
        10. United States
        diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/daringfireball-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/daringfireball-1/expected.html index 6c3f15447..7fbd053c8 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/daringfireball-1/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/daringfireball-1/expected.html @@ -1,16 +1,12 @@

        - - - -
        -
        - +

        About This Site

        Daring Fireball is written and produced by John Gruber.

        - Photograph of the author. -

        Portrait by George Del Barrio

        + Photograph of the author. +
        Portrait by George Del Barrio

        Mac Apps

        - +

        iPhone Apps

        + +

        Server Software

        The Daring Fireball website is hosted by Joyent.

        Articles and links are published through Movable Type. In addition to my own SmartyPants and Markdown plug-ins, Daring Fireball uses several excellent Movable Type plug-ins, including Brad Choate’s MT-Regex and MT-IfEmpty, and Nat Irons’s Amputator.

        Stats are tracked using Mint. Additional web nerdery, including the membership system, is fueled by Perl, PHP, and MySQL.

        Web Standards

        Web standards are important, and Daring Fireball adheres to them. Specifically, Daring Fireball’s HTML markup should validate as either HTML 5 or XHTML 4.01 Transitional, its layout is constructed using valid CSS, and its syndicated feed is valid Atom.

        If Daring Fireball looks goofy in your browser, you’re likely using a shitty browser that doesn’t support web standards. Internet Explorer, I’m looking in your direction. If you complain about this, I will laugh at you, because I do not care. If, however, you are using a modern, standards-compliant browser and have trouble viewing or reading Daring Fireball, please do let me know.

        -
        - - - - -
        - -
        \ No newline at end of file +
        \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/different-sources-for-images/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/different-sources-for-images/expected.html index 93f4c92fe..e5a6261c0 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/different-sources-for-images/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/different-sources-for-images/expected.html @@ -1,4 +1,5 @@
        +

        Lorem

        Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, @@ -8,11 +9,11 @@ proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

        Images

        -

        -

        -

        -

        -

        +

        +

        +

        +

        +

        Tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ehow-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ehow-1/expected.html index 397322e20..d73c3c52c 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ehow-1/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ehow-1/expected.html @@ -2,15 +2,20 @@

        -
        -
        -

        Glass cloche terrariums are not only appealing to the eye, but they also preserve a bit of nature in your home and serve as a simple, yet beautiful, piece of art. Closed terrariums are easy to care for, as they retain much of their own moisture and provide a warm environment with a consistent level of humidity. You won’t have to water the terrariums unless you see that the walls are not misting up. Small growing plants that don’t require a lot of light work best such as succulents, ferns, moss, even orchids.

        -
        Glass cloche terrariums
        Glass cloche terrariums (Lucy Akins)
        -
        - + +
        -
        -

        What You'll Need:

        • Cloche
        • +

          Glass cloche terrariums are not only appealing to the eye, but they also preserve a bit of nature in your home and serve as a simple, yet beautiful, piece of art. Closed terrariums are easy to care for, as they retain much of their own moisture and provide a warm environment with a consistent level of humidity. You won’t have to water the terrariums unless you see that the walls are not misting up. Small growing plants that don’t require a lot of light work best such as succulents, ferns, moss, even orchids.

          +
          Glass cloche terrariums
          +
          Glass cloche terrariums (Lucy Akins)
          +
        +
        +
        +

        Other People Are Reading

        + +
        +

        What You'll Need:

          +
        • Cloche
        • Planter saucer, small shallow dish or desired platform
        • Floral foam oasis
        • Ruler
        • @@ -20,75 +25,78 @@
        • Moss
        • Tweezers
        • Other small decorative items (optional)
        • -
        -
        -
        +
      +
-

Step 1

Measure the circumference of your cloche and cut the foam oasis about 3/4 inch (2 cm) smaller. Place the foam oasis into a container full of water and allow to soak until it sinks to the bottom. Dig out a hole on the oasis large enough to fit your plant, being careful not to pierce all the way through to the bottom.

-
Dig a hole in the oasis.
Dig a hole in the oasis. (Lucy Akins)
-
+
Dig a hole in the oasis.
+
Dig a hole in the oasis. (Lucy Akins)
+
-

Step 2

Insert your plant into the hole.

-
Orchid in foam oasis
Orchid in foam oasis (Lucy Akins)
-
+
Orchid in foam oasis
+
Orchid in foam oasis (Lucy Akins)
+
-

Step 3

You can add various plants if you wish.

-
Various foliage
Various foliage (Lucy Akins)
-
+
Various foliage
+
Various foliage (Lucy Akins)
+
-

Step 4

Using floral pins, attach enough moss around the oasis to cover it.

-
Attach moss.
Attach moss. (Lucy Akins)
-
+
Attach moss.
+
Attach moss. (Lucy Akins)
+
-

Step 5

Gently place the cloche over the oasis. The glass may push some of the moss upward, exposing some of the foam.

-
Place cloche over oasis.
Place cloche over oasis. (Lucy Akins)
-
+
Place cloche over oasis.
+
Place cloche over oasis. (Lucy Akins)
+
-

Step 6

Simply pull down the moss with tweezers or insert more moss to fill in the empty spaces.

-
Rearrange moss.
Rearrange moss. (Lucy Akins)
-
+
Rearrange moss.
+
Rearrange moss. (Lucy Akins)
+
-

Step 7

You can use any platform you wish. In this case, a small saucer was used.

-
Place cloche on a platform to sit on.
Place cloche on a platform to sit on. (Lucy Akins)
-
+
Place cloche on a platform to sit on.
+
Place cloche on a platform to sit on. (Lucy Akins)
+
-

Step 8

This particular terrarium rests on a planter saucer and features a small white pumpkin.

-
Cloche placed on a terracotta saucer
Cloche placed on a terracotta saucer (Lucy Akins)
-
+
Cloche placed on a terracotta saucer
+
Cloche placed on a terracotta saucer (Lucy Akins)
+
-

Step 9

This particular terrarium was placed on a wood slice and a little toy squirrel was placed inside to add a little whimsy.

-
Placed on a wooden slice
Placed on a wooden slice (Lucy Akins)
-
+
Placed on a wooden slice
+
Placed on a wooden slice (Lucy Akins)
+
-

Finished Terrarium

Displayed alone or in a group, these pretty arrangements allow you to add a little nature to your decor or tablescape.

-
Cloche terrarium
Cloche terrarium (Lucy Akins)
-
+
Cloche terrarium
+
Cloche terrarium (Lucy Akins)
+ -

Featured

+ + +
+

Featured

-
\ No newline at end of file +
+ \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ehow-2/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ehow-2/expected.html index ea7d138e1..48823ad84 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ehow-2/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ehow-2/expected.html @@ -1,58 +1,68 @@ -
- -
-
+
-

+

+

-
- -
-
-
+
+
+

Graduation parties are a great way to commemorate the years of hard work teens and college co-eds devote to education. They’re also costly for mom and dad.

The average cost of a graduation party in 2013 was a whopping $1,200, according to Graduationparty.com; $700 of that was allocated for food. However that budget was based on Midwestern statistics, and parties in urban areas like New York City are thought to have a much higher price tag.

Thankfully, there are plenty of creative ways to trim a little grad party fat without sacrificing any of the fun or celebratory spirit.

-
Graduation
+
+ Graduation +
+
(Mike Watson Images/Moodboard/Getty) -
-
+ +
-

Parties hosted at restaurants, clubhouses and country clubs eliminate the need to spend hours cleaning up once party guests have gone home. But that convenience comes with a price tag. A country club may charge as much as $2,000 for room rental and restaurant food and beverage will almost always cost more than food prepped and served at home.

-
Save money hosting the party at home.
- Thomas Jackson/Digital Vision/Getty Images
+
+ Save money hosting the party at home. +
+
+ Thomas Jackson/Digital Vision/Getty Images
-

Instead of hiring a DJ, use your iPod or Smartphone to spin the tunes. Both easily hook up to most speakers or mp3 compatible docks to play music from your music library. Or download Pandora, the free online radio app, and play hours of music for free.

Personalize the music with a playlist of the grad’s favorite songs or songs that were big hits during his or her years in school.

-
Online radio can take the place of a hired DJ.
- Spencer Platt/Getty Images News/Getty Images
+
+ Online radio can take the place of a hired DJ. +
+
+ Spencer Platt/Getty Images News/Getty Images
-

Avoid canned drinks, which guests often open, but don't finish. Serve pitchers of tap water with lemon and cucumber slices or sliced strawberries for an interesting and refreshing flavor. Opt for punches and non-alcoholic drinks for high school graduates that allow guests to dole out the exact amount they want to drink.

-
Serve drinks in pitchers, not in cans.
- evgenyb/iStock/Getty Images
+
+ Serve drinks in pitchers, not in cans. +
+
+ evgenyb/iStock/Getty Images
@@ -60,65 +70,79 @@
-

Instead of inviting everyone you – and the graduate – know or ever knew, scale back the guest list. Forgo inviting guests that you or your grad haven't seen for eons. There is no reason to provide provisions for people who are essentially out of your lives. Sticking to a small, but personal, guest list allows more time to mingle with loved ones during the party, too.

-
Limit guests to those close to the graduate.
- Kane Skennar/Photodisc/Getty Images
+
+ Limit guests to those close to the graduate. +
+
+ Kane Skennar/Photodisc/Getty Images
-

See if your grad and his best friend, girlfriend or close family member would consider hosting a joint party. You can split some of the expenses, especially when the two graduates share mutual friends. You'll also have another parent to bounce ideas off of and to help you stick to your budget when you're tempted to splurge.

-
Throw a joint bash for big savings.
- Mike Watson Images/Moodboard/Getty
+
+ Throw a joint bash for big savings. +
+
+ Mike Watson Images/Moodboard/Getty
-

Skip carving stations of prime rib and jumbo shrimp as appetizers, especially for high school graduation parties. Instead, serve some of the graduate's favorite side dishes that are cost effective, like a big pot of spaghetti with breadsticks. Opt for easy and simple food such as pizza, finger food and mini appetizers.

Avoid pre-packaged foods and pre-made deli platters. These can be quite costly. Instead, make your own cheese and deli platters for less than half the cost of pre-made.

-
Cost effective appetizers are just as satisfying as pre-made deli platters.
- Mark Stout/iStock/Getty Images
+
+ Cost effective appetizers are just as satisfying as pre-made deli platters. +
+
+ Mark Stout/iStock/Getty Images
-

Instead of an evening dinner party, host a grad lunch or all appetizers party. Brunch and lunch fare or finger food costs less than dinner. Guests also tend to consume less alcohol in the middle of the day, which keeps cost down.

-
A brunch gathering will cost less than a dinner party.
- Mark Stout/iStock/Getty Images
+
+ A brunch gathering will cost less than a dinner party. +
+
+ Mark Stout/iStock/Getty Images
+
+
+
+

Other People Are Reading

+
+
-
-

Decorate your party in the graduate's current school colors or the colors of the school he or she will be headed to next. Décor that is not specifically graduation-themed may cost a bit less, and any leftovers can be re-used for future parties, picnics and events.

-
Theme the party by color without graduation-specific decor.
- jethuynh/iStock/Getty Images
+
+ Theme the party by color without graduation-specific decor. +
+
+ jethuynh/iStock/Getty Images

- Related Searches + Related Searches

Promoted By Zergnet

-
- -
\ No newline at end of file +
+ \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/embedded-videos/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/embedded-videos/expected.html index 327e6503c..4dc9164f9 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/embedded-videos/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/embedded-videos/expected.html @@ -1,19 +1,20 @@
+

Lorem

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.

-

Videos

+

At root

- - - + + +

In a paragraph

-

+

In a div

-

+

Foo

Tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/engadget/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/engadget/expected-images.json index f3993407b..315467ff9 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/engadget/expected-images.json +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/engadget/expected-images.json @@ -1,14 +1,13 @@ [ - "https:\/\/o.aolcdn.com\/images\/dims?crop=1600%2C943%2C0%2C0&quality=85&format=jpg&resize=1600%2C943&image_uri=http%3A%2F%2Fo.aolcdn.com%2Fhss%2Fstorage%2Fmidas%2Fd457f269d1400106a402302a310de800%2F205826071%2FXbox%2BOne%2BX%2Breview%2Bgallery%2B1.jpg&client=a1acac3e1b3290917d92&signature=9fa7b29452763464190c6edff6822489df516d1b", - "https:\/\/o.aolcdn.com\/images\/dims?thumbnail=45%2C45&quality=80&image_uri=http%3A%2F%2Fwww.blogcdn.com%2Fwww.engadget.com%2Fmedia%2F2016%2F03%2Fdevindra-engadget-headshot-small.jpg&client=cbc79c14efcebee57402&signature=e6ffba7468c380581b6589a70ce5d7c1ec40cd1d", - "https:\/\/o.aolcdn.com\/images\/dims?thumbnail=980%2C653&quality=80&image_uri=https%3A%2F%2Fs.blogcdn.com%2Fslideshows%2Fimages%2Fslides%2F714%2F208%2F8%2FS7142088%2Fslug%2Fl%2Fxbox-one-x-review-gallery-1-1.jpg&client=cbc79c14efcebee57402&signature=9bb08b52e12de8e4060f863a52c613489529818d", - "https:\/\/o.aolcdn.com\/images\/dims?crop=1600%2C1067%2C0%2C0&quality=85&format=jpg&resize=1600%2C1067&image_uri=http%3A%2F%2Fo.aolcdn.com%2Fhss%2Fstorage%2Fmidas%2F93beb86758ae1cf95721699e1e006e35%2F205826074%2FXbox%2BOne%2BX%2Breview%2Bgallery%2B7.jpg&client=a1acac3e1b3290917d92&signature=c0f2d36259c2c1decfb60aae364527cda2560d4a", - "https:\/\/o.aolcdn.com\/images\/dims?crop=1600%2C949%2C0%2C0&quality=85&format=jpg&resize=1600%2C949&image_uri=http%3A%2F%2Fo.aolcdn.com%2Fhss%2Fstorage%2Fmidas%2F9ece7fdad1e7025dec06ac9bf98688d0%2F205826075%2FXbox%2BOne%2BX%2Breview%2Bgallery%2B5.jpg&client=a1acac3e1b3290917d92&signature=9913883753141e7df322616bfe0bc41c6ecd80c8", - "https:\/\/o.aolcdn.com\/images\/dims?resize=980%2C640&quality=100&image_uri=https%3A%2F%2Fo.aolcdn.com%2Fimages%2Fdims%3Fcrop%3D1599%252C1043%252C0%252C0%26quality%3D85%26format%3Djpg%26resize%3D1600%252C1043%26image_uri%3Dhttp%253A%252F%252Fo.aolcdn.com%252Fhss%252Fstorage%252Fmidas%252F8b98ec8f6649158fe7448ac2f2695ac5%252F205826072%252FXbox%252BOne%252BX%252Breview%252Bgallery%252B6.jpg%26client%3Da1acac3e1b3290917d92%26signature%3D353dad1308f98c2c9dfc82c58a540a8b2f1fe63c&client=cbc79c14efcebee57402&signature=60b7c061460d0d45f5d367b8a9c62978af6b76ce", - "https:\/\/o.aolcdn.com\/images\/dims?resize=980%2C640&quality=100&image_uri=https%3A%2F%2Fo.aolcdn.com%2Fimages%2Fdims%3Fcrop%3D1600%252C900%252C0%252C0%26quality%3D85%26format%3Djpg%26resize%3D1600%252C900%26image_uri%3Dhttp%253A%252F%252Fo.aolcdn.com%252Fhss%252Fstorage%252Fmidas%252F1885534bd201fc37481b806645c1fc8b%252F205828119%252FXbox%252Bone%252BX%252Bscreenshot%252Bgallery%252B8.jpg%26client%3Da1acac3e1b3290917d92%26signature%3Df63cf67c88b37fd9424855984e45f6b950c8c11a&client=cbc79c14efcebee57402&signature=0adca80fc8ee26a7353be639082881450a5ad49f", - "https:\/\/o.aolcdn.com\/images\/dims?crop=1600%2C900%2C0%2C0&quality=85&format=jpg&resize=1600%2C900&image_uri=http%3A%2F%2Fo.aolcdn.com%2Fhss%2Fstorage%2Fmidas%2F8352a8a14e88e2ca2ba5be4d8381a055%2F205828115%2FXbox%2Bone%2BX%2Bscreenshot%2Bgallery%2B1.jpg&client=a1acac3e1b3290917d92&signature=d2ccb22e0eaabeb05bfe46e83dbe26fd07f01da8", - "https:\/\/o.aolcdn.com\/images\/dims?thumbnail=980%2C653&quality=80&image_uri=https%3A%2F%2Fs.blogcdn.com%2Fslideshows%2Fimages%2Fslides%2F714%2F292%2F4%2FS7142924%2Fslug%2Fl%2Fxbox-one-x-screenshot-gallery-2-1.jpg&client=cbc79c14efcebee57402&signature=38c95635c7aad58a8a48038e05589f5cf35b1e28", - "https:\/\/o.aolcdn.com\/images\/dims?crop=1600%2C900%2C0%2C0&quality=85&format=jpg&resize=1600%2C900&image_uri=http%3A%2F%2Fo.aolcdn.com%2Fhss%2Fstorage%2Fmidas%2Facb08903fbe26ad77b80db8c8e7e8fb1%2F205828118%2FXbox%2Bone%2BX%2Bscreenshot%2Bgallery%2B7.jpg&client=a1acac3e1b3290917d92&signature=21630fa5ec6d8fdce2c35f7e1f652636a2d8efe7", - "https:\/\/o.aolcdn.com\/images\/dims?resize=980%2C640&quality=100&image_uri=https%3A%2F%2Fo.aolcdn.com%2Fimages%2Fdims%3Fcrop%3D1600%252C1027%252C0%252C0%26quality%3D85%26format%3Djpg%26resize%3D1600%252C1027%26image_uri%3Dhttp%253A%252F%252Fo.aolcdn.com%252Fhss%252Fstorage%252Fmidas%252Fa2c8ba1caccdbb9e0559797e5141eafd%252F205826078%252FXbox%252BOne%252BX%252Breview%252Bgallery%252B11.jpg%26client%3Da1acac3e1b3290917d92%26signature%3Da11bcddced805c6e3698f8ce0494102aef057265&client=cbc79c14efcebee57402&signature=1e9bd192add2772bc842a34e67b7572cfd1b265a", - "https:\/\/o.aolcdn.com\/images\/dims?crop=1600%2C1028%2C0%2C0&quality=85&format=jpg&resize=1600%2C1028&image_uri=http%3A%2F%2Fo.aolcdn.com%2Fhss%2Fstorage%2Fmidas%2F5396460ef8b6bde7fb7272d9e66a7701%2F205826076%2FXbox%2BOne%2BX%2Breview%2Bgallery%2B9.jpg&client=a1acac3e1b3290917d92&signature=f5b5b4b986c2f8b5031a4469ae0ecec82aff65b0" + "https:\/\/o.aolcdn.com\/images\/dims?crop=1600%2C943%2C0%2C0&quality=85&format=jpg&resize=1600%2C943&image_uri=http%3A%2F%2Fo.aolcdn.com%2Fhss%2Fstorage%2Fmidas%2Fd457f269d1400106a402302a310de800%2F205826071%2FXbox%2BOne%2BX%2Breview%2Bgallery%2B1.jpg&client=a1acac3e1b3290917d92&signature=9fa7b29452763464190c6edff6822489df516d1b", + "https:\/\/o.aolcdn.com\/images\/dims?thumbnail=980%2C653&quality=80&image_uri=https%3A%2F%2Fs.blogcdn.com%2Fslideshows%2Fimages%2Fslides%2F714%2F208%2F8%2FS7142088%2Fslug%2Fl%2Fxbox-one-x-review-gallery-1-1.jpg&client=cbc79c14efcebee57402&signature=9bb08b52e12de8e4060f863a52c613489529818d", + "https:\/\/o.aolcdn.com\/images\/dims?crop=1600%2C1067%2C0%2C0&quality=85&format=jpg&resize=1600%2C1067&image_uri=http%3A%2F%2Fo.aolcdn.com%2Fhss%2Fstorage%2Fmidas%2F93beb86758ae1cf95721699e1e006e35%2F205826074%2FXbox%2BOne%2BX%2Breview%2Bgallery%2B7.jpg&client=a1acac3e1b3290917d92&signature=c0f2d36259c2c1decfb60aae364527cda2560d4a", + "https:\/\/o.aolcdn.com\/images\/dims?crop=1600%2C949%2C0%2C0&quality=85&format=jpg&resize=1600%2C949&image_uri=http%3A%2F%2Fo.aolcdn.com%2Fhss%2Fstorage%2Fmidas%2F9ece7fdad1e7025dec06ac9bf98688d0%2F205826075%2FXbox%2BOne%2BX%2Breview%2Bgallery%2B5.jpg&client=a1acac3e1b3290917d92&signature=9913883753141e7df322616bfe0bc41c6ecd80c8", + "https:\/\/o.aolcdn.com\/images\/dims?resize=980%2C640&quality=100&image_uri=https%3A%2F%2Fo.aolcdn.com%2Fimages%2Fdims%3Fcrop%3D1599%252C1043%252C0%252C0%26quality%3D85%26format%3Djpg%26resize%3D1600%252C1043%26image_uri%3Dhttp%253A%252F%252Fo.aolcdn.com%252Fhss%252Fstorage%252Fmidas%252F8b98ec8f6649158fe7448ac2f2695ac5%252F205826072%252FXbox%252BOne%252BX%252Breview%252Bgallery%252B6.jpg%26client%3Da1acac3e1b3290917d92%26signature%3D353dad1308f98c2c9dfc82c58a540a8b2f1fe63c&client=cbc79c14efcebee57402&signature=60b7c061460d0d45f5d367b8a9c62978af6b76ce", + "https:\/\/o.aolcdn.com\/images\/dims?resize=980%2C640&quality=100&image_uri=https%3A%2F%2Fo.aolcdn.com%2Fimages%2Fdims%3Fcrop%3D1600%252C900%252C0%252C0%26quality%3D85%26format%3Djpg%26resize%3D1600%252C900%26image_uri%3Dhttp%253A%252F%252Fo.aolcdn.com%252Fhss%252Fstorage%252Fmidas%252F1885534bd201fc37481b806645c1fc8b%252F205828119%252FXbox%252Bone%252BX%252Bscreenshot%252Bgallery%252B8.jpg%26client%3Da1acac3e1b3290917d92%26signature%3Df63cf67c88b37fd9424855984e45f6b950c8c11a&client=cbc79c14efcebee57402&signature=0adca80fc8ee26a7353be639082881450a5ad49f", + "https:\/\/o.aolcdn.com\/images\/dims?crop=1600%2C900%2C0%2C0&quality=85&format=jpg&resize=1600%2C900&image_uri=http%3A%2F%2Fo.aolcdn.com%2Fhss%2Fstorage%2Fmidas%2F8352a8a14e88e2ca2ba5be4d8381a055%2F205828115%2FXbox%2Bone%2BX%2Bscreenshot%2Bgallery%2B1.jpg&client=a1acac3e1b3290917d92&signature=d2ccb22e0eaabeb05bfe46e83dbe26fd07f01da8", + "https:\/\/o.aolcdn.com\/images\/dims?thumbnail=980%2C653&quality=80&image_uri=https%3A%2F%2Fs.blogcdn.com%2Fslideshows%2Fimages%2Fslides%2F714%2F292%2F4%2FS7142924%2Fslug%2Fl%2Fxbox-one-x-screenshot-gallery-2-1.jpg&client=cbc79c14efcebee57402&signature=38c95635c7aad58a8a48038e05589f5cf35b1e28", + "https:\/\/o.aolcdn.com\/images\/dims?crop=1600%2C900%2C0%2C0&quality=85&format=jpg&resize=1600%2C900&image_uri=http%3A%2F%2Fo.aolcdn.com%2Fhss%2Fstorage%2Fmidas%2Facb08903fbe26ad77b80db8c8e7e8fb1%2F205828118%2FXbox%2Bone%2BX%2Bscreenshot%2Bgallery%2B7.jpg&client=a1acac3e1b3290917d92&signature=21630fa5ec6d8fdce2c35f7e1f652636a2d8efe7", + "https:\/\/o.aolcdn.com\/images\/dims?resize=980%2C640&quality=100&image_uri=https%3A%2F%2Fo.aolcdn.com%2Fimages%2Fdims%3Fcrop%3D1600%252C1027%252C0%252C0%26quality%3D85%26format%3Djpg%26resize%3D1600%252C1027%26image_uri%3Dhttp%253A%252F%252Fo.aolcdn.com%252Fhss%252Fstorage%252Fmidas%252Fa2c8ba1caccdbb9e0559797e5141eafd%252F205826078%252FXbox%252BOne%252BX%252Breview%252Bgallery%252B11.jpg%26client%3Da1acac3e1b3290917d92%26signature%3Da11bcddced805c6e3698f8ce0494102aef057265&client=cbc79c14efcebee57402&signature=1e9bd192add2772bc842a34e67b7572cfd1b265a", + "https:\/\/o.aolcdn.com\/images\/dims?crop=1600%2C1028%2C0%2C0&quality=85&format=jpg&resize=1600%2C1028&image_uri=http%3A%2F%2Fo.aolcdn.com%2Fhss%2Fstorage%2Fmidas%2F5396460ef8b6bde7fb7272d9e66a7701%2F205826076%2FXbox%2BOne%2BX%2Breview%2Bgallery%2B9.jpg&client=a1acac3e1b3290917d92&signature=f5b5b4b986c2f8b5031a4469ae0ecec82aff65b0" ] \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/engadget/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/engadget/expected.html index 44a2afe0d..17496cc24 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/engadget/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/engadget/expected.html @@ -1,39 +1,4 @@ -

-

- -

But only hardcore - gamers will appreciate it.

-

-
-
-
- -
-

-

-
- -
- - - -
-
-
-
- -
-
-
- -
- - -
-
-
-
+

The Xbox One X is the ultimate video game system. It sports more horsepower than any system ever. And it plays more @@ -49,35 +14,22 @@ the $279 Xbox One S.

-
-
-
-
- -
-
-
-

Gallery: Xbox One +

+

Gallery: Xbox One X | 14 Photos

-

-

-
-
-
-
- - -
-
-
+

+ +

+ +
+
- -
-
  • Most +
      +
    • Most powerful hardware ever in a home console
    • Solid @@ -86,10 +38,12 @@
    • 4K Blu-ray drive is great for movie fans
    • -
+ +
-
  • Expensive +
      +
    • Expensive
    • Not worth it if you don’t have a 4K TV @@ -97,9 +51,9 @@
    • Still no VR support
    • -
+ +
-

As promised, the Xbox One X is the @@ -108,17 +62,11 @@ PlayStation 4 Pro. 4K/HDR enhanced games look great, but it’s lack of VR is disappointing in 2017.

-
-
-
-
+
-
-
-

Hardware

-

+

Despite all the power inside, the One X is Microsoft's smallest console to date. It looks similar to the Xbox One S, except it has an entirely @@ -136,7 +84,7 @@ That additional horsepower means the Xbox One X can run more games in full native 4K than the Sony's console.

-

+

Along the front, there's the slot-loading 4K Blu-ray drive, a physical power button, a single USB port and a controller pairing button. And around back, @@ -147,22 +95,13 @@ Kinect around, you'll need to use a USB adapter to plug it in.

+
+
+
Devindra Hardawar/AOL +
+
-
-
-
- - -
-
Devindra Hardawar/AOL -
-
-
-
-
-
-

The console's controller hasn't changed since its last mini-upgrade with the Xbox One S. That revision rounded out its seams, improved bumper performance @@ -176,22 +115,13 @@ has rechargeable controllers.

In use

+
+
+
Devindra Hardawar/AOL +
+
-
-
-
- - -
-
Devindra Hardawar/AOL -
-
-
-
-
-
-

You won't find any major differences between the One X and the last Xbox at first — aside from a more dramatic startup sequence. Navigating the Xbox @@ -223,36 +153,13 @@ times were on-par with what I've seen with the game on the Xbox One S.

-
-
-
-
-
-
- -
-
-
-
+
-
-
-
- -
-
-
-
-
-
-
-
-
-
+
+ +
+
-
-
-

You can also play in Performance mode, which bumps the frame rate up to 60FPS and uses higher quality graphical effects, while rendering it lower in @@ -278,25 +185,17 @@ levels of bloom lighting and shadow detail.

-
-
-
-
-
-
-

Gallery: Xbox +
+

Gallery: Xbox One X screenshots | 9 Photos

-

-

-
-

-
-
+

+ +

+ +
+
-
-
-

Killer Instinct and Super Lucky's Tale run in 4K at a smooth 60FPS. They both looked and played better than their standard @@ -329,36 +228,13 @@ Basically, don't expect your entire 360 library to get enhanced.

-
-
-
-
-
-
- -
-
-
-
+
-
-
-
- -
-
-
-
-
-
-
-
-
-
+
+ +
+
-
-
-

Even if a game isn't specifically tuned for the new console, Microsoft says you might still see some performance improvements. The PlayStation 4 Pro, @@ -376,7 +252,7 @@ more widely supported, but it would have been nice to see Dolby's, too.

- +

And speaking of Dolby technology, Microsoft is also highlighting Atmos support on the One X, just like @@ -402,22 +278,13 @@ PlayStation VR.

Pricing and the competition

+
+
+
Devindra Hardawar/AOL +
+
-
-
-
- - -
-
Devindra Hardawar/AOL -
-
-
-
-
-
-

The biggest knock against the Xbox One X is its $500 price. The PS4 Pro launched at $400 last year, and there's a good chance we'll see plenty of deals @@ -449,7 +316,7 @@ PC, you won't be missing out on much by ditching consoles.

Wrap-up

-

+

Ultimately, the Xbox One X offers some major performance upgrades that gamers will notice -- especially if you're coming from an original Xbox @@ -459,21 +326,6 @@ that will matter. It's exactly what the company promised: the fastest game console ever made.

-
-
-
-
-
-
-
-
-
-
- -

-

From around the web

-

- - -
\ No newline at end of file + + \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/fortressofsolitude/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/fortressofsolitude/expected-metadata.json index 8405f6763..6eaca95a9 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/fortressofsolitude/expected-metadata.json +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/fortressofsolitude/expected-metadata.json @@ -1,5 +1,5 @@ { - "Author": "Written by Edward Wallace", + "Author": null, "Direction": null, "Excerpt": "Just when you think the marketing behind the film couldn't get any more amazing, they go and release a music video from the Deadpool 2 soundtrack starring Canadian singer Céline Dion.", "Image": "http:\/\/www.fortressofsolitude.co.za\/wp-content\/uploads\/2018\/05\/Céline-Dion-Belches-Her-Way-Onto-Deadpool-2s-Soundtrack.jpg", diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/fortressofsolitude/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/fortressofsolitude/expected.html index 5dc679145..fc178ad79 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/fortressofsolitude/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/fortressofsolitude/expected.html @@ -1 +1 @@ -

Céline Dion Belches Her Way Onto Deadpool 2's Soundtrack


Ryan Reynolds never stops surprising fans with his Deadpool, a.k.a. the Merc with the Mouth, persona. Just when you think the marketing behind the film couldn’t get any more amazing, they go and release a music video from the Deadpool 2 soundtrack starring Canadian singer Céline Dion. Yes, the one who sang the Titanic theme song. Your eyes do not deceive you.

Showtime, Mama. #EffortMaximal #Deadpool2 pic.twitter.com/ZKLrucXJO4

— Ryan Reynolds (@VancityReynolds) May 3, 2018

“What’s left to say? These prayers ain’t working anymore. Every word shot down in flames. What’s left to do with these broken pieces on the floor? I’m losing my voice calling on you,” Dion croons in the video for “Ashes”. Near the end of it, the filthy, foul-mouthed Deadpool shows up in a surprising twist mentioning that he should have gotten N’sync instead.

Deadpool 2 opens in theatres on May 18.


\ No newline at end of file +

Céline Dion Belches Her Way Onto Deadpool 2's Soundtrack


Ryan Reynolds never stops surprising fans with his Deadpool, a.k.a. the Merc with the Mouth, persona. Just when you think the marketing behind the film couldn’t get any more amazing, they go and release a music video from the Deadpool 2 soundtrack starring Canadian singer Céline Dion. Yes, the one who sang the Titanic theme song. Your eyes do not deceive you.

Showtime, Mama. #EffortMaximal #Deadpool2 pic.twitter.com/ZKLrucXJO4

— Ryan Reynolds (@VancityReynolds) May 3, 2018

“What’s left to say? These prayers ain’t working anymore. Every word shot down in flames. What’s left to do with these broken pieces on the floor? I’m losing my voice calling on you,” Dion croons in the video for “Ashes”. Near the end of it, the filthy, foul-mouthed Deadpool shows up in a surprising twist mentioning that he should have gotten N’sync instead.

Deadpool 2 opens in theatres on May 18.


\ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/gmw/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/gmw/expected.html index 1b69754ff..119205b62 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/gmw/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/gmw/expected.html @@ -6,7 +6,7 @@

  翱翔于距地球数千公里的太空中,进入广袤漆黑的未知领域,是一项艰苦卓绝的工作。这让人感到巨大压力和极度恐慌。那么,为什么不能让宇航员来一杯“地球末日”鸡尾酒来放松一下?

  不幸的是,对于希望能喝上一杯的太空探险者,那些将他们送上太空的政府机构普遍禁止他们染指包括酒在内的含酒精饮料。

  但是,很快普通人都会有机会向人类“最终的边疆”出发——以平民化旅行的形式,去探索和殖民火星。确实,火星之旅将是一次令人感到痛苦的旅行,可能一去不复返并要几年时间才能完成,但是否应该允许参与者在旅程中痛饮一番?或至少携带能在火星上发酵自制酒精饮料的设备?

-

(Credit: Nasa)

+

(Credit: Nasa)

  图注:巴兹?奥尔德林(Buzz Aldrin)可能是第二个在月球上行走的人,但他是第一个在月球上喝酒的人

@@ -21,7 +21,7 @@

  所以,如果酒精对人体的物理效应与海拔高度无关,那么在国际空间站上睡前小饮一杯不应该是一个大问题,对吧?错了。

  美国宇航局约翰逊航天中心发言人丹尼尔·霍特(Daniel Huot)表示:“国际空间站上的宇航员不允许喝酒。在国际空间站上,酒精和其它挥发性化合物的使用受到控制,因为它们的挥发物可能对该站的水回收系统产生影响。”

  为此,国际空间站上的宇航员甚至没有被提供含有酒精的产品,例如漱口水、香水或须后水。如果在国际空间站上饮酒狂欢,溢出的啤酒也可能存在损坏设备的风险。

-

(Credit: iStock)

+

(Credit: iStock)

  图注:测试表明,有关人在高空中喝酒更容易醉的传言是不正确的

@@ -40,7 +40,7 @@

  因此,即使宇航员自己被禁止在地球轨道上饮酒,但他们正在做的工作可以提高在地上消费的酒的质量。

  相比之下,执行登陆火星任务的人将远离家乡几年,而不是几个月,因此可能会有人提出有关禁止饮酒的规定可以放松一些。

  然而,像戴夫?汉森这样的专家认为,继续禁止饮酒并没有什么害处。除了实际的安全问题,饮酒还可能有其它挑战。汉森认为,地球人存在许多社会文化方面的差异,而且人连续几年时间呆在一个狭小的空间里,很容易突然发怒,这些因素都使饮酒问题变得很棘手。

-

(Credit: David Frohman/Peachstate Historical Consulting Inc)

+

(Credit: David Frohman/Peachstate Historical Consulting Inc)

  图注:奥尔德林的圣餐杯回到了地球上

@@ -49,7 +49,7 @@

  原标题:他晚于阿姆斯特朗登月 却是首个敢在月球喝酒的人

  出品︱网易科学人栏目组 胖胖

  作者︱春春 - +

[责任编辑:肖春芳]

diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/heise/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/heise/expected.html index 95ab304b5..35c7971b4 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/heise/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/heise/expected.html @@ -1,20 +1,34 @@
-

1Password scannt auch QR-Codes.

+
+ + +
+ +

1Password scannt auch QR-Codes.

(Bild: Hersteller)

-

Das in der iOS-Version bereits enthaltene TOTP-Feature ist nun auch für OS X 10.10 verfügbar. Zudem gibt es neue Zusatzfelder in der Datenbank und weitere Verbesserungen.

-

AgileBits hat Version 5.3 seines bekannten Passwortmanagers 1Password für OS X freigegeben. Mit dem Update wird eine praktische Funktion nachgereicht, die die iOS-Version der Anwendung bereits seit längerem beherrscht: Das direkte Erstellen von Einmal-Passwörtern. Unterstützt wird dabei der TOTP-Standard (Time-Based One-Time Passwords), den unter anderem Firmen wie Evernote, Dropbox oder Google einsetzen, um ihre Zugänge besser abzusichern. Neben Account und regulärem Passwort wird dabei dann ein Zusatzcode verlangt, der nur kurze Zeit gilt.

-

Zur TOTP-Nutzung muss zunächst ein Startwert an 1Password übergeben werden. Das geht unter anderem per QR-Code, den die App über ein neues Scanfenster selbst einlesen kann – etwa aus dem Webbrowser. Eine Einführung in die Technik gibt ein kurzes Video. Die TOTP-Unterstützung in 1Password erlaubt es, auf ein zusätzliches Gerät (z.B. ein iPhone) neben dem Mac zu verzichten, das den Code liefert – was allerdings auch die Sicherheit verringert, weil es keinen "echten" zweiten Faktor mehr gibt.

+
+ +
+ + + +

Das in der iOS-Version bereits enthaltene TOTP-Feature ist nun auch für OS X 10.10 verfügbar. Zudem gibt es neue Zusatzfelder in der Datenbank und weitere Verbesserungen.

+

AgileBits hat Version 5.3 seines bekannten Passwortmanagers 1Password für OS X freigegeben. Mit dem Update wird eine praktische Funktion nachgereicht, die die iOS-Version der Anwendung bereits seit längerem beherrscht: Das direkte Erstellen von Einmal-Passwörtern. Unterstützt wird dabei der TOTP-Standard (Time-Based One-Time Passwords), den unter anderem Firmen wie Evernote, Dropbox oder Google einsetzen, um ihre Zugänge besser abzusichern. Neben Account und regulärem Passwort wird dabei dann ein Zusatzcode verlangt, der nur kurze Zeit gilt.

+

Zur TOTP-Nutzung muss zunächst ein Startwert an 1Password übergeben werden. Das geht unter anderem per QR-Code, den die App über ein neues Scanfenster selbst einlesen kann – etwa aus dem Webbrowser. Eine Einführung in die Technik gibt ein kurzes Video. Die TOTP-Unterstützung in 1Password erlaubt es, auf ein zusätzliches Gerät (z.B. ein iPhone) neben dem Mac zu verzichten, das den Code liefert – was allerdings auch die Sicherheit verringert, weil es keinen "echten" zweiten Faktor mehr gibt.

Update 5.3 des Passwortmanagers liefert auch noch weitere Verbesserungen. So gibt es die Möglichkeit, FaceTime-Audio- oder Skype-Anrufe aus 1Password zu starten, die Zahl der Zusatzfelder in der Datenbank wurde erweitert und der Umgang mit unterschiedlichen Zeitzonen klappt besser. Die Engine zur Passworteingabe im Browser soll beschleunigt worden sein.

1Password kostet aktuell knapp 50 Euro im Mac App Store und setzt in seiner aktuellen Version mindestens OS X 10.10 voraus. -(bsc) -

+(bsc) +
+ + +

\ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/herald-sun-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/herald-sun-1/expected.html index 6896eedab..988c78c53 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/herald-sun-1/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/herald-sun-1/expected.html @@ -1,14 +1,13 @@
-
-

A new Bill would require telecommunications service providers to store so-called ‘metadat

+

A new Bill would require telecommunications service providers to store so-called ‘metadat +

A new Bill would require telecommunications service providers to store so-called ‘metadata’ for two years. Source: Supplied

-

A HIGH-powered federal government team has been doing the rounds of media organisations in the past few days in an attempt to allay concerns about the impact of new surveillance legislation on press freedom. It failed.

@@ -17,10 +16,6 @@
- - -

The Bill would require telecommunications service providers to store so-called “metadata” — the who, where, when and how of a communication, but not its content — for two years so security and law enforcement agencies can access it without warrant. Few would argue against the use of such material to catch criminals or terrorists. But, as Parliament’s Joint Committee on Intelligence and Security has pointed out, it would also be used “for the purpose of determining the identity of a journalist’s sources”.

And that should ring warning bells for anyone genuinely concerned with the health of our democracy. Without the ability to protect the identity of sources, journalists would be greatly handicapped in exposing corruption, dishonesty, waste, incompetence and misbehaviour by public officials.

The Press Council is concerned the laws would crush investigative journalism.

“These legitimate concerns cannot be addressed effectively short of exempting journalists and media organisations,” says president David Weisbrot.

The media union is adamant journalists’ metadata must be exempted from the law. That’s what media bosses want, too, though they have a fallback position based on new safeguards being implemented in Britain.

That would prevent access to the metadata of journalists or media organisations without a judicial warrant. There would be a code including — according to the explanatory notes of the British Bill — “provision to protect the public interest in the confidentiality of journalistic sources”.

In their meetings this week, the government team boasted of concessions in the new Data Retention Bill. The number of agencies able to access metadata will be reduced by excluding such organisations as the RSPCA and local councils. And whenever an authorisation is issued for access to information about a journalist’s sources, the Ombudsman (or, where ASIO is involved, the Inspector-General of Intelligence and Security) will receive a copy.

That does nothing to solve the problem. The Government has effectively admitted as much by agreeing that the parliamentary committee should conduct a separate review of how to deal with the issue of journalists’ sources.

But another inquiry would be a waste of time — the committee has already received and considered dozens of submissions on the subject. The bottom line is that the Government does not deny that the legislation is flawed, but is demanding it be passed anyway with the possibility left open of a repair job down the track. That is a ridiculous approach.

Claims that immediate action is imperative do not stand up. These are measures that won’t come into full effect for two years. Anyway, amending the Bill to either exempt journalists or adopt the UK model could be done quickly, without any risk to national security.

AS Opposition Leader Bill Shorten said in a letter to Abbott last month: “Press freedom concerns about mandatory data retention would ideally be addressed in this Bill to avoid the need for future additional amendments or procedures to be put in place in the future.”

The Data Retention Bill will be debated in the House of Representatives this week. Then, on Friday, CEOs from leading media organisations will front the parliamentary committee to air their concerns before the legislation goes to the Senate.

Those CEOs should make it clear they are just as angry about this as they were about Stephen Conroy’s attempt to impinge on press freedom through media regulation under the previous Labor government.

Memories of the grief Conroy brought down on his head would undoubtedly make Abbott sit up and take notice.

LAURIE OAKES IS THE NINE NETWORK POLITICAL EDITOR

-
\ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/hukumusume/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/hukumusume/expected-images.json index 88d2990ee..1e62b57f5 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/hukumusume/expected-images.json +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/hukumusume/expected-images.json @@ -1,7 +1,10 @@ [ - "http:\/\/fakehost\/test\/..\/..\/..\/gazou\/pc_gazou\/aesop\/aesop052.jpg", - "http:\/\/fakehost\/test\/..\/..\/..\/..\/366\/logo_bana\/corner_1.gif", - "http:\/\/fakehost\/test\/..\/..\/..\/..\/366\/logo_bana\/corner_2.gif", - "http:\/\/fakehost\/test\/..\/..\/..\/gazou\/origami_gazou\/kantan\/dogface.gif", - "http:\/\/fakehost\/test\/..\/..\/..\/gazou\/origami_gazou\/kantan\/dog.gif" + "http:\/\/fakehost\/366\/logo_bana\/corner_1.gif", + "http:\/\/fakehost\/366\/logo_bana\/corner_2.gif", + "http:\/\/fakehost\/gazou\/pc_gazou\/aesop\/aesop052.jpg", + "http:\/\/fakehost\/gazou\/origami_gazou\/kantan\/dogface.gif", + "http:\/\/fakehost\/gazou\/origami_gazou\/kantan\/dog.gif", + "http:\/\/fakehost\/gazou\/pc_gazou\/all\/top_bana\/back_logo_r.gif", + "file:\/\/\/C|\/Documents%20and%20Settings\/%E7%A6%8F%E5%A8%98note\/%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97\/company_website15\/image\/spacer.gif", + "file:\/\/\/C|\/Documents%20and%20Settings\/%E7%A6%8F%E5%A8%98note\/%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97" ] \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/hukumusume/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/hukumusume/expected.html index defbcc10c..1d63a9eef 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/hukumusume/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/hukumusume/expected.html @@ -1,13 +1,48 @@ -
+
+ + + + + + + + + +
+ + + +
+ + + + + + + + + +
+ + +
+   +
+ +

- 福娘童話集 > きょうのイソップ童話 > 1月のイソップ童話 > 欲張りなイヌ + 福娘童話集 > きょうのイソップ童話 > 1月のイソップ童話 > 欲張りなイヌ

-

元旦のイソップ童話

よくばりなイヌ

+

元旦のイソップ童話

よくばりなイヌ

欲張りなイヌ

ひらがな ←→ 日本語・英語 ←→ English

- +
-
+ + + @@ -15,25 +50,178 @@ ( おりがみくらぶ より) - + + + -
+ + おりがみをつくろう -
+ +

- 犬の顔の折り紙いぬのかお   犬の顔の紙いぬ -

+ + +
+ 犬の顔の折り紙いぬのかお   犬の顔の紙いぬ +

+
+
+ + + + - - + + + + + -
♪音声配信(html5)
-
+
+ +
亜姫の朗読☆ イソップ童話より

+ + + +

 肉をくわえたイヌが、橋を渡っていました。  ふと下を見ると、川の中にも肉をくわえたイヌがいます。 イヌはそれを見て、思いました。(あいつの肉の方が、大きそうだ)  イヌは、くやしくてたまりません。 (そうだ、あいつをおどかして、あの肉を取ってやろう)  そこでイヌは、川の中のイヌに向かって思いっきり吠えました。 「ウゥー、ワン!!」  そのとたん、くわえていた肉はポチャンと川の中に落ちてしまいました。 「ああー、ぁぁー」  川の中には、がっかりしたイヌの顔がうつっています。  さっきの川の中のイヌは、水にうつった自分の顔だったのです。  同じ物を持っていても、人が持っている物の方が良く見え、また、欲張るとけっきょく損をするというお話しです。

おしまい

-

-
\ No newline at end of file +

前のページへ戻る

+ + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+      1月 1日の豆知識

+ 366日への旅

+
+ きょうの記念日元旦 +
+ きょうの誕生花松(まつ) +
+ きょうの誕生日・出来事1949年 Mr.マリック(マジシャン) +
+ 恋の誕生日占い自分の考えをしっかりと持った女の子。 +
+ なぞなぞ小学校○(丸)を取ったらお母さんになってしまう男の人は? +
+ あこがれの職業紹介歌手 +
+ 恋の魔法とおまじない 001両思いになれる おまじない +
+   1月 1日の童話・昔話

+ 福娘童話集

+
+ きょうの日本昔話ネコがネズミを追いかける訳 +
+ きょうの世界昔話モンゴルの十二支話 +
+ きょうの日本民話仕事の取替えっこ +
+ きょうのイソップ童話欲張りなイヌ +
+ きょうの江戸小話ぞうきんとお年玉 +
+ きょうの百物語百物語の幽霊 +
+ + + + + + + + + + + + + + + + + + + + + +
+ 福娘のサイト +
+ 366日への旅

毎日の記念日・誕生花 ・有名人の誕生日と性格判断

+
+ 福娘童話集

世界と日本の童話と昔話

+
+ 女の子応援サイト -さくら-

誕生日占い、お仕事紹介、おまじない、など

+
+ 子どもの病気相談所

病気検索と対応方法、症状から検索するWEB問診

+
+ 世界60秒巡り

国旗国歌や世界遺産など、世界の国々の豆知識

+
+ + \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/iab-1/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/iab-1/expected-images.json index f548bd9b2..105a38059 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/iab-1/expected-images.json +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/iab-1/expected-images.json @@ -1,4 +1,4 @@ -{ - "0": "http:\/\/www.iab.com\/wp-content\/uploads\/2015\/10\/getting-lean-with-digital-ad-ux-300x250.jpg", - "2": "http:\/\/www.iab.com\/wp-content\/uploads\/2015\/05\/auto-draft-16-150x150.jpg" -} \ No newline at end of file +[ + "http:\/\/www.iab.com\/wp-content\/uploads\/2015\/10\/getting-lean-with-digital-ad-ux-300x250.jpg", + "http:\/\/www.iab.com\/wp-content\/uploads\/2015\/05\/auto-draft-16-150x150.jpg" +] \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/iab-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/iab-1/expected.html index dd4faf3b4..ea619a92e 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/iab-1/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/iab-1/expected.html @@ -1,5 +1,4 @@
-

We messed up. As technologists, tasked with delivering content and services to users, we lost track of the user experience.

Twenty years ago we saw an explosion of websites, built by developers around the world, providing all forms of content. This was the beginning of an age of enlightenment, the intersection of content and technology. Many of us in the technical field felt compelled, and even empowered, to produce information as the distribution means for mass communication were no longer restricted by a high barrier to entry.

In 2000, the dark ages came when the dot-com bubble burst. We were told that our startups were gone or that our divisions sustained by corporate parent companies needed to be in the black. It was a wakeup call that led to a renaissance age. Digital advertising became the foundation of an economic engine that, still now, sustains the free and democratic World Wide Web. In digital publishing, we strived to balance content, commerce, and technology. The content management systems and communication gateways we built to inform and entertain populations around the world disrupted markets and in some cases governments, informed communities of imminent danger, and liberated new forms of art and entertainment—all while creating a digital middle class of small businesses.

@@ -9,7 +8,7 @@

Through our pursuit of further automation and maximization of margins during the industrial age of media technology, we built advertising technology to optimize publishers’ yield of marketing budgets that had eroded after the last recession. Looking back now, our scraping of dimes may have cost us dollars in consumer loyalty. The fast, scalable systems of targeting users with ever-heftier advertisements have slowed down the public internet and drained more than a few batteries. We were so clever and so good at it that we over-engineered the capabilities of the plumbing laid down by, well, ourselves. This steamrolled the users, depleted their devices, and tried their patience.

The rise of ad blocking poses a threat to the internet and could potentially drive users to an enclosed platform world dominated by a few companies. We have let the fine equilibrium of content, commerce, and technology get out of balance in the open web. We had, and still do have, a responsibility to educate the business side, and in some cases to push back. We lost sight of our social and ethical responsibility to provide a safe, usable experience for anyone and everyone wanting to consume the content of their choice.

We need to bring that back into alignment, starting right now.

-

Getting LEAN with Digital Ad UXToday, the IAB Tech Lab is launching the L.E.A.N. Ads program. Supported by the Executive Committee of the IAB Tech Lab Board, IABs around the world, and hundreds of member companies, L.E.A.N. stands for Light, Encrypted, Ad choice supported, Non-invasive ads. These are principles that will help guide the next phases of advertising technical standards for the global digital advertising supply chain.

+

Getting LEAN with Digital Ad UXToday, the IAB Tech Lab is launching the L.E.A.N. Ads program. Supported by the Executive Committee of the IAB Tech Lab Board, IABs around the world, and hundreds of member companies, L.E.A.N. stands for Light, Encrypted, Ad choice supported, Non-invasive ads. These are principles that will help guide the next phases of advertising technical standards for the global digital advertising supply chain.

As with any other industry, standards should be created by non-profit standards-setting bodies, with many diverse voices providing input. We will invite all parties for public comment, and make sure consumer interest groups have the opportunity to provide input.

L.E.A.N. Ads do not replace the current advertising standards many consumers still enjoy and engage with while consuming content on our sites across all IP enabled devices. Rather, these principles will guide an alternative set of standards that provide choice for marketers, content providers, and consumers.

Among the many areas of concentration, we must also address frequency capping on retargeting in Ad Tech and make sure a user is targeted appropriately before, but never AFTER they make a purchase. If we are so good at reach and scale, we can be just as good, if not better, at moderation. Additionally, we must address volume of ads per page as well as continue on the path to viewability. The dependencies here are critical to an optimized user experience.

@@ -18,13 +17,13 @@

Finally, we must do this in an increasingly fragmented market, across screens. We must do this in environments where entire sites are blocked, purposefully or not. Yes, it is disappointing that our development efforts will have to manage with multiple frameworks while we work to supply the economic engine to sustain an open internet. However, our goal is still to provide diverse content and voices to as many connected users as possible around the world.

That is user experience.

-

IAB Tech Lab Members can join the IAB Tech Lab Ad Blocking Working Group, please email adblocking@iab.com for more information.

Read more about ad blocking here.

-
-
-
Auto Draft 14
+

IAB Tech Lab Members can join the IAB Tech Lab Ad Blocking Working Group, please email adblocking@iab.com for more information.

+

Read more about ad blocking here.

+
+
Auto Draft 14
+

About the author

Scott Cunningham

Senior Vice President of Technology and Ad Operations at IAB, and General Manager of the IAB Tech Lab

-
-
\ No newline at end of file +
\ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ietf-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ietf-1/expected.html index ff46f7a1d..ab794ec4d 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ietf-1/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ietf-1/expected.html @@ -1,6 +1,10 @@
-[Docs] [txt|pdf] [Tracker] [Email] [Diff1] [Diff2] [Nits]



Versions: 00 01 02 03 04



INTERNET DRAFT                                      Michiel B. de Jong
+[Docs] [txt|pdf] [Tracker] [Email] [Diff1] [Diff2] [Nits]               
+
+Versions: 00 01 02 03 04
+
+
INTERNET DRAFT                                      Michiel B. de Jong
 Document: draft-dejong-remotestorage-04                   IndieHosters
                                                              F. Kooman
 Intended Status: Proposed Standard                       (independent)
@@ -53,7 +57,7 @@ Copyright Notice
 
 
 de Jong                                                         [Page 1]
-
 
+
 
 Internet-Draft              remoteStorage                  December 2014
 
 
@@ -89,7 +93,7 @@ Table of Contents
   18. Authors' addresses............................................22
 
 
-1.  Introduction
+1.  Introduction
 
     Many services for data storage are available over the internet. This
     specification describes a vendor-independent interface for such
@@ -103,7 +107,7 @@ Table of Contents
 
 
 de Jong                                                         [Page 2]
-
 
+
 
 Internet-Draft              remoteStorage                  December 2014
 
 
@@ -122,7 +126,7 @@ Table of Contents
     The exact details of these four actions are described in this
     specification.
 
-2. Terminology
+2. Terminology
 
     The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
     "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
@@ -135,7 +139,7 @@ Table of Contents
     implement the general requirement when such failure would result in
     interoperability failure.
 
-3. Storage model
+3. Storage model
 
     The server stores data in nodes that form a tree structure.
     Internal nodes are called 'folders' and leaf nodes are called
@@ -153,7 +157,7 @@ Table of Contents
 
 
 de Jong                                                         [Page 3]
-
 
+
 
 Internet-Draft              remoteStorage                  December 2014
 
 
@@ -163,7 +167,7 @@ Table of Contents
        * content length
        * content
 
-4. Requests
+4. Requests
 
     Client-to-server requests SHOULD be made over https [HTTPS], and
     servers MUST comply with HTTP/1.1 [HTTP]. Specifically, they
@@ -203,7 +207,7 @@ Table of Contents
 
 
 de Jong                                                         [Page 4]
-
 
+
 
 Internet-Draft              remoteStorage                  December 2014
 
 
@@ -253,7 +257,7 @@ Table of Contents
 
 
 de Jong                                                         [Page 5]
-
 
+
 
 Internet-Draft              remoteStorage                  December 2014
 
 
@@ -303,11 +307,11 @@ Table of Contents
 
 
 de Jong                                                         [Page 6]
-
 
+
 
 Internet-Draft              remoteStorage                  December 2014
 
 
-5. Response codes
+5. Response codes
 
     Response codes SHOULD be given as defined by [HTTP, section 6] and
     [BEARER, section 3.1]. The following is a non-normative checklist
@@ -340,7 +344,7 @@ Table of Contents
     Clients SHOULD also handle the case where a response takes too long
     to arrive, or where no response is received at all.
 
-6. Versioning
+6. Versioning
 
     All successful requests MUST return an 'ETag' header [HTTP] with, in
     the case of GET, the current version, in the case of PUT, the new
@@ -353,7 +357,7 @@ Table of Contents
 
 
 de Jong                                                         [Page 7]
-
 
+
 
 Internet-Draft              remoteStorage                  December 2014
 
 
@@ -370,14 +374,14 @@ Table of Contents
     A provider MAY offer version rollback functionality to its users,
     but this specification does not define the user interface for that.
 
-7. CORS headers
+7. CORS headers
 
     All responses MUST carry CORS headers [CORS]. The server MUST also
     reply to OPTIONS requests as per CORS. For GET requests, a wildcard
     origin MAY be returned, but for PUT and DELETE requests, the
     response MUST echo back the Origin header sent by the client.
 
-8. Session description
+8. Session description
 
     The information that a client needs to receive in order to be able
     to connect to a server SHOULD reach the client as described in the
@@ -403,7 +407,7 @@ Table of Contents
 
 
 de Jong                                                         [Page 8]
-
 
+
 
 Internet-Draft              remoteStorage                  December 2014
 
 
@@ -418,7 +422,7 @@ Table of Contents
     * https://storage.example.com/bob/public/documents/
     * https://storage.example.com/bob/public/documents/draft.txt
 
-9. Bearer tokens and access control
+9. Bearer tokens and access control
 
     A bearer token represents one or more access scopes. These access
     scopes are represented as strings of the form <module> <level>,
@@ -453,12 +457,12 @@ Table of Contents
 
 
 de Jong                                                         [Page 9]
-
 
+
 
 Internet-Draft              remoteStorage                  December 2014
 
 
 
-10. Application-first bearer token issuance
+10. Application-first bearer token issuance
 
     To make a remoteStorage server available as 'the remoteStorage of
     <account> at <host>', exactly one link of the following format
@@ -503,7 +507,7 @@ Table of Contents
 
 
 de Jong                                                        [Page 10]
-
 
+
 
 Internet-Draft              remoteStorage                  December 2014
 
 
@@ -533,7 +537,7 @@ Table of Contents
     client_id parameter in favor of relying on the redirect_uri
     parameter for client identification.
 
-11. Storage-first bearer token issuance
+11. Storage-first bearer token issuance
 
     The provider MAY also present a dashboard to the user, where they
     have some way to add open web app manifests [MANIFEST]. Adding a
@@ -553,7 +557,7 @@ Table of Contents
 
 
 de Jong                                                        [Page 11]
-
 
+
 
 Internet-Draft              remoteStorage                  December 2014
 
 
@@ -591,19 +595,19 @@ Table of Contents
     debug tool, thus bypassing the need for an OAuth dance. Clients
     SHOULD NOT rely on this in production.
 
-12. Example wire transcripts
+12. Example wire transcripts
 
     The following examples are not normative ("\" indicates a line was
     wrapped).
 
-12.1. WebFinger
+12.1. WebFinger
 
     In application-first, an in-browser application might issue the
     following request, using XMLHttpRequest and CORS:
 
 
 de Jong                                                        [Page 12]
-
 
+
 
 Internet-Draft              remoteStorage                  December 2014
 
 
@@ -643,7 +647,7 @@ motestorage-04",
            }]
          }
 
-12.2. OAuth dialog form
+12.2. OAuth dialog form
 
     Once the in-browser application has discovered the server's OAuth
     end-point, it will typically redirect the user to this URL, in
@@ -653,7 +657,7 @@ motestorage-04",
 
 
 de Jong                                                        [Page 13]
-
 
+
 
 Internet-Draft              remoteStorage                  December 2014
 
 
@@ -673,7 +677,7 @@ unhosted.5apps.com&response_type=token HTTP/1.1
             <title>Allow access?</title>
         ...
 
-12.3. OAuth dialog form submission
+12.3. OAuth dialog form submission
 
     When the user submits the form, the request would look something
     like this:
@@ -698,12 +702,12 @@ low
         Location:https://drinks-unhosted.5apps.com/#access_token=j2YnGt\
 XjzzzHNjkd1CJxoQubA1o%3D&token_type=bearer&state=
 
-12.4. OPTIONS preflight
+12.4. OPTIONS preflight
 
 
 
 de Jong                                                        [Page 14]
-
 
+
 
 Internet-Draft              remoteStorage                  December 2014
 
 
@@ -726,7 +730,7 @@ XjzzzHNjkd1CJxoQubA1o%3D&token_type=bearer&state=
         Access-Control-Allow-Headers: Authorization, Content-Length, Co\
 ntent-Type, Origin, X-Requested-With, If-Match, If-None-Match
 
-12.5. Initial PUT
+12.5. Initial PUT
 
     An initial PUT may contain an 'If-None-Match: *' header, like this:
 
@@ -749,11 +753,11 @@ ntent-Type, Origin, X-Requested-With, If-Match, If-None-Match
         Access-Control-Allow-Origin: https://drinks-unhosted.5apps.com
         ETag: "1382694045000"
 
-12.6. Subsequent PUT
+12.6. Subsequent PUT
 
 
 de Jong                                                        [Page 15]
-
 
+
 
 Internet-Draft              remoteStorage                  December 2014
 
 
@@ -779,7 +783,7 @@ e.io/spec/modules/myfavoritedrinks/drink"}
         Access-Control-Allow-Origin: https://drinks-unhosted.5apps.com
         ETag: "1382694048000"
 
-12.7. GET
+12.7. GET
 
     A GET request would also include the bearer token, and optionally
     an If-None-Match header:
@@ -803,7 +807,7 @@ e.io/spec/modules/myfavoritedrinks/drink"}
 
 
 de Jong                                                        [Page 16]
-
 
+
 
 Internet-Draft              remoteStorage                  December 2014
 
 
@@ -838,7 +842,7 @@ charset=UTF-8","Content-Length":106}}}
         HTTP/1.1 404 Not Found
         Access-Control-Allow-Origin: https://drinks-unhosted.5apps.com
 
-12.8. DELETE
+12.8. DELETE
 
     A DELETE request may look like this:
 
@@ -853,7 +857,7 @@ charset=UTF-8","Content-Length":106}}}
 
 
 de Jong                                                        [Page 17]
-
 
+
 
 Internet-Draft              remoteStorage                  December 2014
 
 
@@ -863,7 +867,7 @@ charset=UTF-8","Content-Length":106}}}
         Access-Control-Allow-Origin: https://drinks-unhosted.5apps.com
         ETag: "1382694048000"
 
-13. Distributed versioning
+13. Distributed versioning
 
     This section is non-normative, and is intended to explain some of
     the design choices concerning ETags and folder listings. At the
@@ -903,7 +907,7 @@ charset=UTF-8","Content-Length":106}}}
 
 
 de Jong                                                        [Page 18]
-
 
+
 
 Internet-Draft              remoteStorage                  December 2014
 
 
@@ -925,7 +929,7 @@ charset=UTF-8","Content-Length":106}}}
     but it is up to whichever client discovers a given version
     conflict, to resolve it.
 
-14. Security Considerations
+14. Security Considerations
 
     To prevent man-in-the-middle attacks, the use of https instead of
     http is important for both the interface itself and all end-points
@@ -953,7 +957,7 @@ charset=UTF-8","Content-Length":106}}}
 
 
 de Jong                                                        [Page 19]
-
 
+
 
 Internet-Draft              remoteStorage                  December 2014
 
 
@@ -970,7 +974,7 @@ charset=UTF-8","Content-Length":106}}}
     The server SHOULD also detect and stop denial-of-service attacks
     that aim to overwhelm its interface with too much traffic.
 
-15. IANA Considerations
+15. IANA Considerations
 
     This document registers the 'remotestorage' link relation, as well
     as the following WebFinger properties:
@@ -980,7 +984,7 @@ charset=UTF-8","Content-Length":106}}}
       * "http://tools.ietf.org/html/rfc7233"
       * "http://remotestorage.io/spec/web-authoring"
 
-16. Acknowledgements
+16. Acknowledgements
 
     The authors would like to thank everybody who contributed to the
     development of this protocol, including Kenny Bentley, Javier Diaz,
@@ -993,95 +997,95 @@ charset=UTF-8","Content-Length":106}}}
     Rick van Rein, Mark Nottingham, Julian Reschke, and Markus
     Lanthaler, among many others.
 
-17. References
+17. References
 
-17.1. Normative References
+17.1. Normative References
 
-    [WORDS]
+    [WORDS]
         Bradner, S., "Key words for use in RFCs to Indicate Requirement
         Levels", BCP 14, RFC 2119, March 1997.
 
 
 de Jong                                                        [Page 20]
-
 
+
 
 Internet-Draft              remoteStorage                  December 2014
 
 
 
-    [IRI]
+    [IRI]
         Duerst, M., "Internationalized Resource Identifiers (IRIs)",
         RFC 3987, January 2005.
 
-    [WEBFINGER]
+    [WEBFINGER]
         Jones, P., Salguerio, G., Jones, M, and Smarr, J.,
         "WebFinger", RFC7033, September 2013.
 
-    [OAUTH]
+    [OAUTH]
         "Section 4.2: Implicit Grant", in: Hardt, D. (ed), "The OAuth
         2.0 Authorization Framework", RFC6749, October 2012.
 
-17.2. Informative References
+17.2. Informative References
 
-    [HTTPS]
+    [HTTPS]
         Rescorla, E., "HTTP Over TLS", RFC2818, May 2000.
 
-    [HTTP]
+    [HTTP]
         Fielding et al., "Hypertext Transfer Protocol (HTTP/1.1):
         Semantics and Content", RFC7231, June 2014.
 
-    [COND]
+    [COND]
         Fielding et al., "Hypertext Transfer Protocol (HTTP/1.1):
         Conditional Requests", RFC7232, June 2014.
 
-    [RANGE]
+    [RANGE]
         Fielding et al., "Hypertext Transfer Protocol (HTTP/1.1):
         Conditional Requests", RFC7233, June 2014.
 
-    [SPDY]
+    [SPDY]
         Mark Belshe, Roberto Peon, "SPDY Protocol - Draft 3.1", http://
         www.chromium.org/spdy/spdy-protocol/spdy-protocol-draft3-1,
         September 2013.
 
-    [JSON-LD]
+    [JSON-LD]
         M. Sporny, G. Kellogg, M. Lanthaler, "JSON-LD 1.0", W3C
         Proposed Recommendation,
         http://www.w3.org/TR/2014/REC-json-ld-20140116/, January 2014.
 
-    [CORS]
+    [CORS]
         van Kesteren, Anne (ed), "Cross-Origin Resource Sharing --
         W3C Candidate Recommendation 29 January 2013",
 
 
 de Jong                                                        [Page 21]
-
 
+
 
 Internet-Draft              remoteStorage                  December 2014
 
 
         http://www.w3.org/TR/cors/, January 2013.
 
-    [MANIFEST]
+    [MANIFEST]
         Mozilla Developer Network (ed), "App manifest -- Revision
         330541", https://developer.mozilla.org/en-
         US/Apps/Build/Manifest$revision/566677, April 2014.
 
-    [DATASTORE]
+    [DATASTORE]
         "WebAPI/DataStore", MozillaWiki, retrieved May 2014.
         https://wiki.mozilla.org/WebAPI/DataStore#Manifest
 
-    [KERBEROS]
+    [KERBEROS]
         C. Neuman et al., "The Kerberos Network Authentication Service
         (V5)", RFC4120, July 2005.
 
-    [BEARER]
+    [BEARER]
         M. Jones, D. Hardt, "The OAuth 2.0 Authorization Framework:
         Bearer Token Usage", RFC6750, October 2012.
 
-    [AUTHORING]
+    [AUTHORING]
         "Using remoteStorage for web authoring", reSite wiki, retrieved
         September 2014. https://github.com/michielbdejong/resite/wiki
         /Using-remoteStorage-for-web-authoring
 
-18. Authors' addresses
+18. Authors' addresses
 
     Michiel B. de Jong
     IndieHosters
@@ -1104,7 +1108,8 @@ charset=UTF-8","Content-Length":106}}}
 
 de Jong                                                        [Page 22]
 
-


Html markup produced by rfcmarkup 1.111, available from +

+Html markup produced by rfcmarkup 1.111, available from https://tools.ietf.org/tools/rfcmarkup/
\ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/infobae/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/infobae/expected.html index e575c7beb..f28c6898e 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/infobae/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/infobae/expected.html @@ -1 +1 @@ -

Jonathan Castellari tiene 25 años y fue golpeado por una patota de 8 hombres

Jonathan Castellari tiene 25 años y fue golpeado por una patota de 8 hombres

Eran casi las 6:30 de la mañana. Jonathan Castellari, de 25 años, volvía de bailar junto a Sebastián, su amigo. Les pareció una buena idea detenerse en el Mc Donald's de Avenida Córdoba al 3100 con el objetivo de desayunar y continuar el viaje hasta sus hogares. Mientras esperaban la comida, un grupo de 8 chicos de entre 20 y 25 años ingresó al local con el mismo objetivo, aunque adoptaron otro plan: mirarlos fijamente, reírse de ellos y hacer chistes sobre la sexualidad de ambos.

Sebastián relató a Infobae: "Estábamos esperando nuestro pedido, haciéndonos chistes, riéndonos de lo sucedido durante la noche. Hablábamos entre nosotros. En ese momento entró un grupo de 8 chicos, de contextura grande, y notamos que estaban alcoholizados. Nos miraban, hacían chistes, se reían de nosotros. Fue ahí cuando decidimos salir con Jonathan a fumar un cigarrillo y esperar que se fueran. Él salió primero y vi que uno de estos pibes lo abrazó y se lo llevó. Instantáneamente se metieron los demás a pegarle. Le pegaron mucho. Quise pararlos y no pude. Ligué yo también, pero nada en comparación a lo que sufrió Jonathan. Cuando lo soltaron lo agarré como pude y justo una enfermera del Sanatorio Güemes (está a dos cuadras del local) estaba tomando un café y le dio los primeros auxilios".

"Fuimos a verlo recién, no paraba de llorar y de decirnos que le pegaron por puto", dijo a Infobae María Rachid, titular del Instituto contra la Discriminación de la Defensoría del Pueblo CABA. "Lamentablemente su situación es delicada. Recién nos informaron que lo van a intervenir quirúrgicamente porque podría perder un ojo".

Como Jonathan no conoce a los agresores, desde la Defensoría y la Federación LGBT se comunicaron con autoridades del Ministerio de Seguridad para que soliciten las cámaras de seguridad del Mc Donald's, del sanatorio Güemes y de otros negocios de la cuadra para poder identificarlos.

Gastón Llopart, abogado de Sebastián, le detalló a Infobae que Jonathan está "próximo a recibir una intervención quirúrgica, ya que tuvo fractura en el hueso del pómulo derecho de su rostro. Sebastián llamó al 911 dos veces y no fueron. Me contaron que los agresores los siguieron hasta el sanatorio mientras los insultaban: la gente de seguridad tuvo que echarlos".

Llopart agregó que la patota, mientras lo golpeaban, le gritaba: "Te vamos a matar por puto". La familia de Jonathan está en el sanatorio a la espera de la intervención quirúrgica. Llopart dijo que "harán la denuncia el lunes por la mañana, cuando existan mayores precisiones de lo ocurrido".

Jonathan y Sebastián forman parte de Ciervos Pampas Rugby Club, un equipo que nació hace cinco años como el primer equipo de la Argentina por la diversidad sexual. Se trata de un combinado que no está integrado en un 100% por varones gays, pero en el que estos encuentran un lugar en el cual expresar libremente su orientación sexual, sin miedo a los prejuicios o a la discriminación. El club emitió un comunicado en su cuenta de Facebook, relatando los hechos y solidarizándose con Jonathan.

\ No newline at end of file +

Jonathan Castellari tiene 25 años y fue golpeado por una patota de 8 hombres

Jonathan Castellari tiene 25 años y fue golpeado por una patota de 8 hombres

Eran casi las 6:30 de la mañana. Jonathan Castellari, de 25 años, volvía de bailar junto a Sebastián, su amigo. Les pareció una buena idea detenerse en el Mc Donald's de Avenida Córdoba al 3100 con el objetivo de desayunar y continuar el viaje hasta sus hogares. Mientras esperaban la comida, un grupo de 8 chicos de entre 20 y 25 años ingresó al local con el mismo objetivo, aunque adoptaron otro plan: mirarlos fijamente, reírse de ellos y hacer chistes sobre la sexualidad de ambos.

Sebastián relató a Infobae: "Estábamos esperando nuestro pedido, haciéndonos chistes, riéndonos de lo sucedido durante la noche. Hablábamos entre nosotros. En ese momento entró un grupo de 8 chicos, de contextura grande, y notamos que estaban alcoholizados. Nos miraban, hacían chistes, se reían de nosotros. Fue ahí cuando decidimos salir con Jonathan a fumar un cigarrillo y esperar que se fueran. Él salió primero y vi que uno de estos pibes lo abrazó y se lo llevó. Instantáneamente se metieron los demás a pegarle. Le pegaron mucho. Quise pararlos y no pude. Ligué yo también, pero nada en comparación a lo que sufrió Jonathan. Cuando lo soltaron lo agarré como pude y justo una enfermera del Sanatorio Güemes (está a dos cuadras del local) estaba tomando un café y le dio los primeros auxilios".

"Fuimos a verlo recién, no paraba de llorar y de decirnos que le pegaron por puto", dijo a Infobae María Rachid, titular del Instituto contra la Discriminación de la Defensoría del Pueblo CABA. "Lamentablemente su situación es delicada. Recién nos informaron que lo van a intervenir quirúrgicamente porque podría perder un ojo".

Como Jonathan no conoce a los agresores, desde la Defensoría y la Federación LGBT se comunicaron con autoridades del Ministerio de Seguridad para que soliciten las cámaras de seguridad del Mc Donald's, del sanatorio Güemes y de otros negocios de la cuadra para poder identificarlos.

Gastón Llopart, abogado de Sebastián, le detalló a Infobae que Jonathan está "próximo a recibir una intervención quirúrgica, ya que tuvo fractura en el hueso del pómulo derecho de su rostro. Sebastián llamó al 911 dos veces y no fueron. Me contaron que los agresores los siguieron hasta el sanatorio mientras los insultaban: la gente de seguridad tuvo que echarlos".

Llopart agregó que la patota, mientras lo golpeaban, le gritaba: "Te vamos a matar por puto". La familia de Jonathan está en el sanatorio a la espera de la intervención quirúrgica. Llopart dijo que "harán la denuncia el lunes por la mañana, cuando existan mayores precisiones de lo ocurrido".

Jonathan y Sebastián forman parte de Ciervos Pampas Rugby Club, un equipo que nació hace cinco años como el primer equipo de la Argentina por la diversidad sexual. Se trata de un combinado que no está integrado en un 100% por varones gays, pero en el que estos encuentran un lugar en el cual expresar libremente su orientación sexual, sin miedo a los prejuicios o a la discriminación. El club emitió un comunicado en su cuenta de Facebook, relatando los hechos y solidarizándose con Jonathan.

\ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/keep-images/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/keep-images/expected-images.json index d5b5affb7..e5097f4b8 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/keep-images/expected-images.json +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/keep-images/expected-images.json @@ -1,17 +1,17 @@ -{ - "0": "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/800\/1*sLDnS1UWEFIS33uLMxq3cw.jpeg", - "1": "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*sLDnS1UWEFIS33uLMxq3cw.jpeg", - "2": "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/800\/1*3vIhkoHIzcxvUdijoCVx6w.png", - "3": "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*4gN1-fzOwCniw-DbqQjDeQ.jpeg", - "4": "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*2KPmZkIBUrhps-2uwDvYFQ.jpeg", - "5": "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*PU40bbbox2Ompc5I3RE99A.jpeg", - "6": "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/800\/1*ohyycinH18fz98TCyUzVgQ.png", - "7": "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*mKvUNOAVQxl6atCbxbCZsg.jpeg", - "8": "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*knT10_FNVUmqQIBLnutmzQ.jpeg", - "10": "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*Vr61dyCTRwk6CemmVF8YAQ.jpeg", - "11": "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*a-1_13xE6_ErQ-QSlz6myw.jpeg", - "13": "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*IWXhtSsVv0gNnCwnDEXk-Q.jpeg", - "14": "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*NGcrjfkV0l37iQH2uyYjEw.jpeg", - "15": "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*WRlKt3q3mt7utmwxcbl3sQ.jpeg", - "16": "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/800\/1*320_4I0lxbn5x3bx4XPI5Q.png" -} \ No newline at end of file +[ + "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/800\/1*sLDnS1UWEFIS33uLMxq3cw.jpeg", + "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*sLDnS1UWEFIS33uLMxq3cw.jpeg", + "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/800\/1*3vIhkoHIzcxvUdijoCVx6w.png", + "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*4gN1-fzOwCniw-DbqQjDeQ.jpeg", + "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*2KPmZkIBUrhps-2uwDvYFQ.jpeg", + "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*PU40bbbox2Ompc5I3RE99A.jpeg", + "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/800\/1*ohyycinH18fz98TCyUzVgQ.png", + "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*mKvUNOAVQxl6atCbxbCZsg.jpeg", + "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*knT10_FNVUmqQIBLnutmzQ.jpeg", + "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*Vr61dyCTRwk6CemmVF8YAQ.jpeg", + "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*a-1_13xE6_ErQ-QSlz6myw.jpeg", + "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*IWXhtSsVv0gNnCwnDEXk-Q.jpeg", + "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*NGcrjfkV0l37iQH2uyYjEw.jpeg", + "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*WRlKt3q3mt7utmwxcbl3sQ.jpeg", + "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/800\/1*320_4I0lxbn5x3bx4XPI5Q.png" +] \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/keep-images/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/keep-images/expected.html index d3696f7d1..ca16b4e1b 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/keep-images/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/keep-images/expected.html @@ -1,58 +1,65 @@ -
-
-
-
+
-
+
+
-

-
+

+

+ +
-

Welcome to DoctorX’s Barcelona lab, where the drugs you bought online are tested for safety and purity. No questions asked.

+

Welcome to DoctorX’s Barcelona lab, where the drugs you bought online are tested for safety and purity. No questions asked.

-
+
+
-

-

Standing at a table in a chemistry lab in Barcelona, Cristina Gil Lladanosa +

+

+
+

Standing at a table in a chemistry lab in Barcelona, Cristina Gil Lladanosa tears open a silver, smell-proof protective envelope. She slides out a transparent bag full of crystals. Around her, machines whir and hum, and other researchers mill around in long, white coats.

-

She is holding the lab’s latest delivery of a drug bought from the “deep +

She is holding the lab’s latest delivery of a drug bought from the “deep web,” the clandestine corner of the internet that isn’t reachable by normal search engines, and is home to some sites that require special software - to access. Labeled as MDMA (the street + to access. Labeled as MDMA (the street term is ecstasy), this sample has been shipped from Canada. Lladanosa and her colleague Iván Fornís Espinosa have also received drugs, anonymously, from people in China, Australia, Europe and the United States.

-

“Here we have speed, MDMA, cocaine, pills,” Lladanosa says, pointing to +

“Here we have speed, MDMA, cocaine, pills,” Lladanosa says, pointing to vials full of red, green, blue and clear solutions sitting in labeled boxes.

-
+
+
-

-
Cristina Gil Lladanosa, at the Barcelona testing lab | photo by Joan Bardeletti
+

+

+
Cristina Gil Lladanosa, at the Barcelona testing lab | photo by Joan Bardeletti
+ +
-

Since 2011, with the launch of Silk Road, anybody has been able to safely buy illegal +

Since 2011, with the launch of Silk Road, anybody has been able to safely buy illegal drugs from the deep web and have them delivered to their door. Though the FBI shut down that black market in October 2013, other outlets have emerged to fill its role. For the last 10 months the lab at which Lladanosa and Espinosa work has offered a paid testing service of those drugs. By sending in samples for analysis, users can know exactly what it is they are buying, and make a more informed decision about whether to ingest the substance. - The group, called Energy Control, + The group, called Energy Control, which has being running “harm reduction” programs since 1999, is the first to run a testing service explicitly geared towards verifying those purchases from the deep web.

-

Before joining Energy Control, Lladanosa briefly worked at a pharmacy, +

Before joining Energy Control, Lladanosa briefly worked at a pharmacy, whereas Espinosa spent 14 years doing drug analysis. Working at Energy Control is “more gratifying,” and “rewarding” than her previous jobs, Lladanosa told me. They also receive help from a group of volunteers, made up of a mixture of “squatters,” as Espinosa put it, and medical students, who prepare the samples for testing.

-

After weighing out the crystals, aggressively mixing it with methanol +

After weighing out the crystals, aggressively mixing it with methanol until dissolved, and delicately pouring the liquid into a tiny brown bottle, Lladanosa, a petite woman who is nearly engulfed by her lab coat, is now ready to test the sample. She loads a series of three trays on top of a @@ -60,50 +67,61 @@ A jungle of thick pipes hang from the lab’s ceiling behind it.

-
+
+
-

-
Photo by Joan Bardeletti
+

+

+
Photo by Joan Bardeletti
+ +
-

“Chromatography separates all the substances,” Lladanosa says as she loads +

“Chromatography separates all the substances,” Lladanosa says as she loads the machine with an array of drugs sent from the deep web and local Spanish users. It can tell whether a sample is pure or contaminated, and if the latter, with what.

-

Rushes of hot air blow across the desk as the gas chromatograph blasts +

Rushes of hot air blow across the desk as the gas chromatograph blasts the sample at 280 degrees Celsius. Thirty minutes later the machine’s robotic arm automatically moves over to grip another bottle. The machine will continue cranking through the 150 samples in the trays for most of the work week.

-
+
+
-

-
Photo by Joan Bardeletti
+

+

+
Photo by Joan Bardeletti
+ +
-

To get the drugs to Barcelona, a user mails at least 10 milligrams of +

To get the drugs to Barcelona, a user mails at least 10 milligrams of a substance to the offices of the Asociación Bienestar y Desarrollo, the non-government organization that oversees Energy Control. The sample then gets delivered to the testing service’s laboratory, at the Barcelona Biomedical Research Park, a futuristic, seven story building sitting metres away from the beach. Energy Control borrows its lab space from a biomedical research group for free.

-

The tests cost 50 Euro per sample. Users pay, not surprisingly, with Bitcoin. +

The tests cost 50 Euro per sample. Users pay, not surprisingly, with Bitcoin. In the post announcing Energy Control’s service on the deep web, the group promised that “All profits of this service are set aside of maintenance of this project.”

-

About a week after testing, those results are sent in a PDF to an email +

About a week after testing, those results are sent in a PDF to an email address provided by the anonymous client.

-

“The process is quite boring, because you are in a routine,” Lladanosa +

“The process is quite boring, because you are in a routine,” Lladanosa says. But one part of the process is consistently surprising: that moment when the results pop up on the screen. “Every time it’s something different.” For instance, one cocaine sample she had tested also contained phenacetin, a painkiller added to increase the product’s weight; lidocaine, an anesthetic that numbs the gums, giving the impression that the user is taking higher quality cocaine; and common caffeine.

-
+
+
-

-

The deep web drug lab is the brainchild of Fernando Caudevilla, a Spanish +

+

+
+

The deep web drug lab is the brainchild of Fernando Caudevilla, a Spanish physician who is better known as “DoctorX” on the deep web, a nickname given to him by his Energy Control co-workers because of his earlier writing about the history, risks and recreational culture of MDMA. In the physical @@ -113,39 +131,43 @@ harms of certain substances.

-
+
+
-

-
Fernando Caudevilla, AKA DoctorX. Photo: Joseph Cox
+

+

+
Fernando Caudevilla, AKA DoctorX. Photo: Joseph Cox
+ +
-

Caudevilla first ventured into Silk Road forums in April 2013. “I would +

Caudevilla first ventured into Silk Road forums in April 2013. “I would like to contribute to this forum offering professional advice in topics - related to drug use and health,” he wrote in an introductory post, + related to drug use and health,” he wrote in an introductory post, using his DoctorX alias. Caudevilla offered to provide answers to questions that a typical doctor is not prepared, or willing, to respond to, at least not without a lecture or a judgment. “This advice cannot replace a complete face-to-face medical evaluation,” he wrote, “but I know how difficult it can be to talk frankly about these things.”

-

The requests flooded in. A diabetic asked what effect MDMA has on blood +

The requests flooded in. A diabetic asked what effect MDMA has on blood sugar; another what the risks of frequent psychedelic use were for a young person. Someone wanted to know whether amphetamine use should be avoided during lactation. In all, Fernando’s thread received over 50,000 visits and 300 questions before the FBI shut down Silk Road.

-

“He’s amazing. A gift to this community,” one user wrote on the Silk Road +

“He’s amazing. A gift to this community,” one user wrote on the Silk Road 2.0 forum, a site that sprang up after the original. “His knowledge is invaluable, and never comes with any judgment.” Up until recently, Caudevilla answered questions on the marketplace “Evolution.” Last week, however, - the administrators of that site pulled a scam, + the administrators of that site pulled a scam, shutting the market down and escaping with an estimated $12 million worth of Bitcoin.

-

Caudevilla’s transition from dispensing advice to starting up a no-questions-asked +

Caudevilla’s transition from dispensing advice to starting up a no-questions-asked drug testing service came as a consequence of his experience on the deep web. He’d wondered whether he could help bring more harm reduction services to a marketplace without controls. The Energy Control project, as part of its mandate of educating drug users and preventing harm, had already been carrying out drug testing for local Spanish users since 2001, at music festivals, night clubs, or through a drop-in service at a lab in Madrid.

-

“I thought, we are doing this in Spain, why don’t we do an international +

“I thought, we are doing this in Spain, why don’t we do an international drug testing service?” Caudevilla told me when I visited the other Energy Control lab, in Madrid. Caudevilla, a stocky character with ear piercings and short, shaved hair, has eyes that light up whenever he discusses the @@ -157,31 +179,38 @@ transparency,” Caudevilla said. “We could not make mistakes,” he added.

-
+
+
-

-
Photo: Joseph Cox
+

+

+
Photo: Joseph Cox
+ +
-
+
+
-

-

While the Energy Control lab in Madrid lab only tests Spanish drugs from +

+

+
+

While the Energy Control lab in Madrid lab only tests Spanish drugs from various sources, it is the Barcelona location which vets the substances bought in the shadowy recesses of of the deep web. Caudevilla no longer runs it, having handed it over to his colleague Ana Muñoz. She maintains a presence on the deep web forums, answers questions from potential users, and sends back reports when they are ready.

-

The testing program exists in a legal grey area. The people who own the +

The testing program exists in a legal grey area. The people who own the Barcelona lab are accredited to experiment with and handle drugs, but Energy Control doesn’t have this permission itself, at least not in writing.

-

“We have a verbal agreement with the police and other authorities. They +

“We have a verbal agreement with the police and other authorities. They already know what we are doing,” Lladanosa tells me. It is a pact of mutual benefit. Energy Control provides the police with information on batches of drugs in Spain, whether they’re from the deep web or not, Espinosa says. They also contribute to the European Monitoring Centre for Drugs and Drug Addiction’s early warning system, a collaboration that attempts to spread information about dangerous drugs as quickly as possible.

-

By the time of my visit in February, Energy Control had received over +

By the time of my visit in February, Energy Control had received over 150 samples from the deep web and have been receiving more at a rate of between 4 and 8 a week. Traditional drugs, such as cocaine and MDMA, make up about 70 percent of the samples tested, but the Barcelona lab has also @@ -189,131 +218,150 @@ synthetic cannabinoids, and even pills of Viagra.

-
+
+
-

-
Photo by Joan Bardeletti
+

+

+
Photo by Joan Bardeletti
+ +
-

So it’s fair to make a tentative judgement on what people are paying for +

So it’s fair to make a tentative judgement on what people are paying for on the deep web. The verdict thus far? Overall, drugs on the deep web appear to be of much higher quality than those found on the street.

-

“In general, the cocaine is amazing,” says Caudevilla, saying that the +

“In general, the cocaine is amazing,” says Caudevilla, saying that the samples they’ve seen have purities climbing towards 80 or 90 percent, and some even higher. To get an idea of how unusual this is, take a look at - the United Nations Office on Drugs and Crime World Drug Report 2014, + the United Nations Office on Drugs and Crime World Drug Report 2014, which reports that the average quality of street cocaine in Spain is just over 40 percent, while in the United Kingdom it is closer to 30 percent.“We have found 100 percent [pure] cocaine,” he adds. “That’s really, really strange. That means that, technically, this cocaine has been purified, with clandestine methods.”

-

Naturally, identifying vendors who sell this top-of-the-range stuff is +

Naturally, identifying vendors who sell this top-of-the-range stuff is one of the reasons that people have sent samples to Energy Control. Caudevilla was keen to stress that, officially, Energy Control’s service “is not intended to be a control of drug quality,” meaning a vetting process for identifying the best sellers, but that is exactly how some people have been using it.

-

As one buyer on the Evolution market, elmo666, wrote to me over the site’s +

As one buyer on the Evolution market, elmo666, wrote to me over the site’s messaging system, “My initial motivations were selfish. My primary motivation was to ensure that I was receiving and continue to receive a high quality product, essentially to keep the vendor honest as far as my interactions with them went.”

-

Vendors on deep web markets advertise their product just like any other +

Vendors on deep web markets advertise their product just like any other outlet does, using flash sales, gimmicky giveaways and promises of drugs that are superior to those of their competitors. The claims, however, can turn out to be empty: despite the test results that show that deep web cocaine vendors typically sell product that is of a better quality than that found on the street, in plenty of cases, the drugs are nowhere near as pure as advertised.

-

“You won’t be getting anything CLOSE to what you paid for,” one user complained +

“You won’t be getting anything CLOSE to what you paid for,” one user complained about the cocaine from ‘Mirkov’, a vendor on Evolution. “He sells 65% not 95%.”

-
+
+
-

-
Photo by Joan Bardeletti
+

+

+
Photo by Joan Bardeletti
+ +
-
+
+
-

-

Despite the prevalence of people using the service to gauge the quality +

+

+
+

Despite the prevalence of people using the service to gauge the quality of what goes up their nose, many users send samples to Energy Control in the spirit of its original mission: keeping themselves alive and healthy. The worst case scenario from drugs purchased on the deep web is, well the - worst case. That was the outcome when Patrick McMullen, a + worst case. That was the outcome when Patrick McMullen, a 17-year-old Scottish student, ingested half a gram of MDMA and three tabs of LSD, reportedly purchased from the Silk Road. While talking to his friends on Skype, his words became slurred and he passed out. Paramedics could not revive him. The coroner for that case, Sherrif Payne, who deemed the cause of death ecstasy toxicity, told The Independent “You never know the purity of what you are taking and you can easily come unstuck.”

-

ScreamMyName, a deep web user who has been active since the original Silk +

ScreamMyName, a deep web user who has been active since the original Silk Road, wants to alert users to the dangerous chemicals that are often mixed with drugs, and is using Energy Control as a means to do so.

-

“We’re at a time where some vendors are outright sending people poison. +

“We’re at a time where some vendors are outright sending people poison. Some do it unknowingly,” ScreamMyName told me in an encrypted message. “Cocaine production in South America is often tainted with either levamisole or phenacetine. Both poison to humans and both with severe side effects.”

-

In the case of Levamisole, those prescribing it are often not doctors +

In the case of Levamisole, those prescribing it are often not doctors but veterinarians, as Levamisole is commonly used on animals, primarily for the treatment of worms. If ingested by humans it can lead to cases - of extreme eruptions of the skin, as documented in a study from researchers at the University + of extreme eruptions of the skin, as documented in a study from researchers at the University of California, San Francisco. But Lladanosa has found Levamisole in cocaine samples; dealers use it to increase the product weight, allowing them to stretch their batch further for greater profit — and also, she says, because Levamisole has a strong stimulant effect.

-

“It got me sick as fuck,” Dr. Feel, an Evolution user, wrote on the site’s +

“It got me sick as fuck,” Dr. Feel, an Evolution user, wrote on the site’s forums after consuming cocaine that had been cut with 23 percent Levamisole, and later tested by Energy Control. “I was laid up in bed for several days because of that shit. The first night I did it, I thought I was going to die. I nearly drove myself to the ER.”

-

“More people die because of tainted drugs than the drugs themselves,” +

“More people die because of tainted drugs than the drugs themselves,” Dr. Feel added. “It’s the cuts and adulterants that are making people sick and killing them.”

-
+
+
-

-
Photo by Joan Bardeletti
+

+

+
Photo by Joan Bardeletti
+ +
-

The particular case of cocaine cut with Levamisole is one of the reasons +

The particular case of cocaine cut with Levamisole is one of the reasons that ScreamMyName has been pushing for more drug testing on the deep web markets. “I recognize that drug use isn’t exactly healthy, but why exacerbate the problem?” he told me when I contacted him after his post. “[Energy Control] provides a way for users to test the drugs they’ll use and for these very users to know what it is they’re putting in their bodies. Such services are in very short supply.”

-

After sending a number of Energy Control tests himself, ScreamMyName started +

After sending a number of Energy Control tests himself, ScreamMyName started a de facto crowd-sourcing campaign to get more drugs sent to the lab, and then shared the results, after throwing in some cash to get the ball rolling. - He set up a Bitcoin wallet, with the hope that users might chip in + He set up a Bitcoin wallet, with the hope that users might chip in to fund further tests. At the time of writing, the wallet has received a total of 1.81 bitcoins; around $430 at today’s exchange rates.

-

In posts to the Evolution community, ScreamMyName pitched this project +

In posts to the Evolution community, ScreamMyName pitched this project as something that will benefit users and keep drug dealer honest. “When the funds build up to a point where we can purchase an [Energy Control] test fee, we’ll do a US thread poll for a few days and try to cohesively decide on what vendor to test,” he continued.

-
+
+
-

-
Photo by Joan Bardeletti
+

+

+
Photo by Joan Bardeletti
+ +
-

Other members of the community have been helping out, too. PlutoPete, +

Other members of the community have been helping out, too. PlutoPete, a vendor from the original Silk Road who sold cannabis seeds and other legal items, has provided ScreamMyName with packaging to safely send the samples to Barcelona. “A box of baggies, and a load of different moisture barrier bags,” PlutoPete told me over the phone. “That’s what all the vendors use.”

-

It’s a modest program so far. ScreamMyName told me that so far he had +

It’s a modest program so far. ScreamMyName told me that so far he had gotten enough public funding to purchase five different Energy Control tests, in addition to the ten or so he’s sent himself so far. “The program created is still in its infancy and it is growing and changing as we go along but I have a lot of faith in what we’re doing,” he says.

-

But the spirit is contagious: elmo666, the other deep web user testing +

But the spirit is contagious: elmo666, the other deep web user testing cocaine, originally kept the results of the drug tests to himself, but he, too, saw a benefit to distributing the data. “It is clear that it is a useful service to other users, keeping vendors honest and drugs (and @@ -321,17 +369,17 @@ on the forums, and then created a thread with summaries of the test results, as well as comments from the vendors if they provided it. Other users were soon basing their decisions on what to buy on elmo666‘s tests.

-

“I’m defo trying the cola based on the incredibly helpful elmo and his +

“I’m defo trying the cola based on the incredibly helpful elmo and his energy control results and recommendations,” wrote user jayk1984. On top of this, elmo666 plans to launch an independent site on the deep web that will collate all of these results, which should act as a resource for users of all the marketplaces.

-

As word of elmo666's efforts spread, he began getting requests from drug +

As word of elmo666's efforts spread, he began getting requests from drug dealers who wanted him to use their wares for testing. Clearly, they figured that a positive result from Energy Control would be a fantastic marketing tool to draw more customers. They even offered elmo666 free samples. (He passed.)

-

Meanwhile, some in the purchasing community are arguing that those running +

Meanwhile, some in the purchasing community are arguing that those running markets on the deep web should be providing quality control themselves. PlutoPete told me over the phone that he had been in discussions about this with Dread Pirate Roberts, the pseudonymous owner of the original @@ -339,7 +387,7 @@ on Silk Road 1, doing lots of anonymous buys to police each category. But of course they took the thing [Silk Road] down before we got it properly off the ground,” he lamented.

-

But perhaps it is best that the users, those who are actually consuming +

But perhaps it is best that the users, those who are actually consuming the drugs, remain in charge of shaming dealers and warning each other. “It’s our responsibility to police the market based on reviews and feedback,” elmo666 wrote in an Evolution forum post. It seems that in the lawless @@ -347,35 +395,40 @@ sold openly, users have cooperated in an organic display of self-regulation to stamp out those particular batches of drugs that are more likely to harm users.

-

“That’s always been the case with the deep web,” PlutoPete told me. Indeed, +

“That’s always been the case with the deep web,” PlutoPete told me. Indeed, ever since Silk Road, a stable of the drug markets has been the review system, where buyers can leave a rating and feedback for vendors, letting others know about the reliability of the seller. But DoctorX’s lab, rigorously testing the products with scientific instruments, takes it a step further.

-
+
+
-

-
Photo by Joan Bardeletti
+

+

+
Photo by Joan Bardeletti
+ +
-

“In the white market, they have quality control. In the dark market, it +

“In the white market, they have quality control. In the dark market, it should be the same,” Cristina Gil Lladanosa says to me before I leave the Barcelona lab.

-

A week after I visit the lab, the results of the MDMA arrive in my inbox: +

A week after I visit the lab, the results of the MDMA arrive in my inbox: it is 85 percent pure, with no indications of other active ingredients. Whoever ordered that sample from the digital shelves of the deep web, and had it shipped to their doorstep in Canada, got hold of some seriously good, and relatively safe drugs. And now they know it.

-
+
+
-

-

Top photo by Joan Bardeletti +

+

+
+

Top photo by Joan Bardeletti

-

Follow Backchannel: Twitter - |Facebook +

Follow Backchannel: Twitter + |Facebook

- - - \ No newline at end of file + \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/la-nacion/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/la-nacion/expected.html index 5640699c1..2084cd8cc 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/la-nacion/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/la-nacion/expected.html @@ -1,9 +1,12 @@ -
+
+

Los pueblos indígenas reclaman por derechos que permanecen incumplidos, por eso es más eficiente canalizar la protesta que reprimirla

+ +

Abdullah Ocalan, el líder independentista kurdo, desembarcó en Italia en noviembre de 1998 y pidió asilo político. Arrastraba un pedido de captura de Turquía, donde era acusado por terrorismo. El ex comunista Massimo D'Alema, recién asumido, dudaba. Acoger a Ocalan implicaba comprarse @@ -21,8 +24,12 @@ supuestos contactos internacionales de organizaciones mapuches. Entre ellos aparecía Ocalan, a quien el informe ubicó "con domicilios en Palermo y en el centro porteño", y aseguraba incluso que había sido visto "en Neuquén, Río Negro y Chubut durante el juicio a Jones Huala".

-

-
Foto: LA NACION

Esta falsa noticia fue la más rocambolesca de una larga cadena. Dos hechos quedaron en evidencia: +

+

+
Foto: LA NACION
+
+ +

Esta falsa noticia fue la más rocambolesca de una larga cadena. Dos hechos quedaron en evidencia: primero, que hay periodistas que no chequean la información; segundo, que los servicios de inteligencia los utilizan para manipular la agenda pública. Y sobre los servicios hay dos posibilidades: o son burros o son perversos. Las opciones no son excluyentes, aunque cualquiera alcanza para tornarlos indignos de @@ -37,6 +44,7 @@ Estado", vincular a un grupo que reclama tierras en la región de sus ancestros con otro que busca gobernar el mundo según sus normas religiosas y ha masacrado a miles de personas requiere de una operación intelectual tan audaz como inadecuada.

+

La asociación con el movimiento kurdo, en cambio, asoma menos inverosímil. Desde su arresto, Ocalan transformó su pensamiento: de una visión nacionalista con inspiración estalinista evolucionó al confederalismo democrático, una propuesta de organización comunal, ecologista, más apegada a las raíces @@ -54,6 +62,7 @@ matar directamente, es realizar sabotajes, movilizaciones, ataques a iglesias y empresas y mucha prensa". ¡En Medio Oriente pagarían por un terrorismo así! Ningún hecho de violencia debe ser minimizado, pero las analogías no resisten prueba.

+

La "cuestión mapuche" es social antes que policial. La Constitución manda "reconocer la preexistencia étnica y cultural de los pueblos indígenas argentinos. Garantizar el respeto a su identidad?; reconocer la personería jurídica de sus comunidades, y la posesión y propiedad comunitarias de las tierras que @@ -82,4 +91,6 @@ del Estado argentino no fue tanto quiénes lo desafiaron como quiénes lo gobernaron. Cambiemos.

Andrés Malamud es politólogo e investigador en la Universidad de Lisboa. Martín Schapiro es abogado administrativista y analista internacional

-
\ No newline at end of file + + +
\ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lemonde-1/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lemonde-1/expected-metadata.json index a45fcaf97..0f462101a 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lemonde-1/expected-metadata.json +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lemonde-1/expected-metadata.json @@ -1,5 +1,5 @@ { - "Author": null, + "Author": "Martin Untersinger (avec Damien Leloup et Morgane Tual)", "Direction": null, "Excerpt": "Largement approuvé par les députés, le texte sera désormais examiné par le Sénat, puis le Conseil constitutionnel.", "Image": "http:\/\/s1.lemde.fr\/image\/2015\/05\/05\/600x315\/4628128_3_47fc_projet-de-loi-renseignement_aeba800424730d672d1bd08faf203438.jpg", diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lemonde-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lemonde-1/expected.html index dd91ed502..bb3a0d89f 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lemonde-1/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lemonde-1/expected.html @@ -1,38 +1,33 @@ -

Le Monde | - • Mis à jour le - | -Par -

+

- +

-

Les députés ont, sans surprise, adopté à une large majorité (438 contre 86 et 42 abstentions) le projet de loi sur le renseignement défendu par le gouvernement lors d’un vote solennel, mardi 5 mai. Il sera désormais examiné par le Sénat, puis le Conseil constitutionnel, prochainement saisi par 75 députés. Dans un souci d'apaisement, François Hollande avait annoncé par avance qu'il saisirait les Sages.

+

Les députés ont, sans surprise, adopté à une large majorité (438 contre 86 et 42 abstentions) le projet de loi sur le renseignement défendu par le gouvernement lors d’un vote solennel, mardi 5 mai. Il sera désormais examiné par le Sénat, puis le Conseil constitutionnel, prochainement saisi par 75 députés. Dans un souci d'apaisement, François Hollande avait annoncé par avance qu'il saisirait les Sages.

Revivez le direct du vote à l’Assemblée avec vos questions.

Ont voté contre : 10 députés socialistes (sur 288), 35 UMP (sur 198), 11 écologistes (sur 18), 11 UDI (sur 30), 12 députés Front de gauche (sur 15) et 7 non-inscrits (sur 9). Le détail est disponible sur le site de l'Assemblée nationale.

Parmi les députés ayan voté contre figurent notamment des opposants de la première heure, comme l'UMP Laure de la Raudière ou l'écologiste Sergio Coronado, mais aussi quelques poids lourds de l'opposition comme Patrick Devedjian ou Claude Goasguen. A gauche, on trouve parmi les quelque opposants au texte Aurélie Filipetti. Christian Paul, qui avait été très actif lors d'autres débats sur les libertés numériques, s'est abstenu.

-

Pouria Amirshahi, député socialiste des Français de l'étranger qui a également voté contre, a annoncé qu'il transmettrait un « mémorandum argumenté » au Conseil constitutionnel et demanderait à se faire auditionner sur le projet de loi. D'autres députés ont prévu de faire la même démarche.

+

Pouria Amirshahi, député socialiste des Français de l'étranger qui a également voté contre, a annoncé qu'il transmettrait un « mémorandum argumenté » au Conseil constitutionnel et demanderait à se faire auditionner sur le projet de loi. D'autres députés ont prévu de faire la même démarche.

Ce texte, fortement décrié par la société civile pour son manque de contre-pouvoir et le caractère intrusif des techniques qu’il autorise, entend donner un cadre aux pratiques des services de renseignement, rendant légales certaines pratiques qui, jusqu’à présent, ne l’étaient pas.

Retour sur ses principales dispositions, après son passage en commission des lois et après le débat en séance publique.

Définition des objectifs des services

-

Le projet de loi énonce les domaines que peuvent invoquer les services pour justifier leur surveillance. Il s’agit notamment, de manière attendue, de « l’indépendance nationale, de l’intégrité du territoire et de la défense nationale » et de « la prévention du terrorisme », mais également des « intérêts majeurs de la politique étrangère », ainsi que de la « prévention des atteintes à la forme républicaine des institutions » et de « la criminalité et de la délinquance organisées ». Des formulations parfois larges qui inquiètent les opposants au texte qui craignent qu’elles puissent permettre de surveiller des activistes ou des manifestants.

+

Le projet de loi énonce les domaines que peuvent invoquer les services pour justifier leur surveillance. Il s’agit notamment, de manière attendue, de « l’indépendance nationale, de l’intégrité du territoire et de la défense nationale » et de « la prévention du terrorisme », mais également des « intérêts majeurs de la politique étrangère », ainsi que de la « prévention des atteintes à la forme républicaine des institutions » et de « la criminalité et de la délinquance organisées ». Des formulations parfois larges qui inquiètent les opposants au texte qui craignent qu’elles puissent permettre de surveiller des activistes ou des manifestants.

La Commission de contrôle

Le contrôle de cette surveillance sera confié à une nouvelle autorité administrative indépendante, la Commission nationale de contrôle des techniques de renseignement (CNCTR), composée de six magistrats du Conseil d’Etat et de la Cour de cassation, de trois députés et trois sénateurs de la majorité et de l’opposition, et d’un expert technique. Elle remplacera l’actuelle Commission nationale de contrôle des interceptions de sécurité (CNCIS).

-

Elle délivrera son avis, sauf cas d’urgence, avant toute opération de surveillance ciblée. Deux types urgences sont prévus par la loi : d’un côté une « urgence absolue », pour laquelle un agent pourra se passer de l’avis de la CNCTR mais pas de l’autorisation du premier ministre. De l’autre, une urgence opérationnelle extrêmement limitée, notamment en termes de techniques, à l’initiative du chef du service de renseignement, qui se passe de l’avis de la CNCTR. Ces cas d’urgence ne justifieront pas l’intrusion d’un domicile ni la surveillance d’un journaliste, un parlementaire ou un avocat. Dans ces cas, la procédure classique devra s’appliquer.

+

Elle délivrera son avis, sauf cas d’urgence, avant toute opération de surveillance ciblée. Deux types urgences sont prévus par la loi : d’un côté une « urgence absolue », pour laquelle un agent pourra se passer de l’avis de la CNCTR mais pas de l’autorisation du premier ministre. De l’autre, une urgence opérationnelle extrêmement limitée, notamment en termes de techniques, à l’initiative du chef du service de renseignement, qui se passe de l’avis de la CNCTR. Ces cas d’urgence ne justifieront pas l’intrusion d’un domicile ni la surveillance d’un journaliste, un parlementaire ou un avocat. Dans ces cas, la procédure classique devra s’appliquer.

L’avis de la CNCTR ne sera pas contraignant, mais cette commission pourra saisir le Conseil d’Etat si elle estime que la loi n’est pas respectée et elle disposera de pouvoirs d’enquête. Ce recours juridictionnel est une nouveauté dans le monde du renseignement.

-

Les « boîtes noires »

-

Une des dispositions les plus contestées de ce projet de loi prévoit de pouvoir contraindre les fournisseurs d’accès à Internet (FAI) à « détecter une menace terroriste sur la base d’un traitement automatisé ». Ce dispositif – autorisé par le premier ministre par tranche de quatre mois – permettrait de détecter, en temps réel ou quasi réel, les personnes ayant une activité en ligne typique de « schémas » utilisés par les terroristes pour transmettre des informations.

-

En pratique, les services de renseignement pourraient installer chez les FAI une « boîte noire » surveillant le trafic. Le contenu des communications – qui resterait « anonyme » – ne serait pas surveillé, mais uniquement les métadonnées : origine ou destinataire d’un message, adresse IP d’un site visité, durée de la conversation ou de la connexion… Ces données ne seraient pas conservées.

+

Les « boîtes noires »

+

Une des dispositions les plus contestées de ce projet de loi prévoit de pouvoir contraindre les fournisseurs d’accès à Internet (FAI) à « détecter une menace terroriste sur la base d’un traitement automatisé ». Ce dispositif – autorisé par le premier ministre par tranche de quatre mois – permettrait de détecter, en temps réel ou quasi réel, les personnes ayant une activité en ligne typique de « schémas » utilisés par les terroristes pour transmettre des informations.

+

En pratique, les services de renseignement pourraient installer chez les FAI une « boîte noire » surveillant le trafic. Le contenu des communications – qui resterait « anonyme » – ne serait pas surveillé, mais uniquement les métadonnées : origine ou destinataire d’un message, adresse IP d’un site visité, durée de la conversation ou de la connexion… Ces données ne seraient pas conservées.

La Commission nationale informatique et libertés (CNIL), qui critique fortement cette disposition. La CNIL soulève notamment que l’anonymat de ces données est très relatif, puisqu’il peut être levé.

-

Lire aussi : Les critiques de la CNIL contre le projet de loi sur le renseignement

-

Le dispositif introduit une forme de « pêche au chalut » – un brassage très large des données des Français à la recherche de quelques individus. Le gouvernement se défend de toute similarité avec les dispositifs mis en place par la NSA américaine, arguant notamment que les données ne seront pas conservées et que cette activité sera contrôlée par une toute nouvelle commission aux moyens largement renforcés. Il s’agit cependant d’un dispositif très large, puisqu’il concernera tous les fournisseurs d’accès à Internet, et donc tous les internautes français.

-

L’élargissement de la surveillance électronique pour détecter les « futurs » terroristes

-

La surveillance des métadonnées sera aussi utilisée pour tenter de détecter de nouveaux profils de terroristes potentiels, prévoit le projet de loi. Le gouvernement considère qu’il s’agit d’une manière efficace de détecter les profils qui passent aujourd’hui « entre les mailles du filet », par exemple des personnes parties en Syrie ou en Irak sans qu’aucune activité suspecte n’ait été décelée avant leur départ.

+

Lire aussi : Les critiques de la CNIL contre le projet de loi sur le renseignement

+

Le dispositif introduit une forme de « pêche au chalut » – un brassage très large des données des Français à la recherche de quelques individus. Le gouvernement se défend de toute similarité avec les dispositifs mis en place par la NSA américaine, arguant notamment que les données ne seront pas conservées et que cette activité sera contrôlée par une toute nouvelle commission aux moyens largement renforcés. Il s’agit cependant d’un dispositif très large, puisqu’il concernera tous les fournisseurs d’accès à Internet, et donc tous les internautes français.

+

L’élargissement de la surveillance électronique pour détecter les « futurs » terroristes

+

La surveillance des métadonnées sera aussi utilisée pour tenter de détecter de nouveaux profils de terroristes potentiels, prévoit le projet de loi. Le gouvernement considère qu’il s’agit d’une manière efficace de détecter les profils qui passent aujourd’hui « entre les mailles du filet », par exemple des personnes parties en Syrie ou en Irak sans qu’aucune activité suspecte n’ait été décelée avant leur départ.

Pour repérer ces personnes, la loi permettra d’étendre la surveillance électronique à toutes les personnes en contact avec des personnes déjà suspectées. En analysant leurs contacts, la fréquence de ces derniers et les modes de communication, les services de renseignement espèrent pouvoir détecter ces nouveaux profils en amont.

De nouveaux outils et méthodes de collecte

Les services pourront également procéder, après un avis de la CNCTR, à la pose de micros dans une pièce ou de mouchards sur un objet (voiture par exemple), ou à l’intérieur d’un ordinateur. L’utilisation des IMSI-catchers (fausses antennes qui permettent d’intercepter des conversations téléphoniques) est également légalisée, pour les services de renseignement, dans certains cas. Le nombre maximal de ces appareils sera fixé par arrêté du premier ministre après l’avis de la CNCTR.

-

Lire : Que sont les IMSI-catchers, ces valises qui espionnent les téléphones portables ?

-

La loi introduit également des mesures de surveillance internationale : concrètement, les procédures de contrôle seront allégées lorsqu’un des « bouts » de la communication sera situé à l’étranger (concrètement, un Français qui parle avec un individu situé à l’étranger). Cependant, comme l’a souligné l’Arcep (l’Autorité de régulation des communications électroniques et des postes), sollicitée pour le versant technique de cette mesure, il est parfois difficile de s’assurer qu’une communication, même passant par l’étranger, ne concerne pas deux Français.

+

Lire : Que sont les IMSI-catchers, ces valises qui espionnent les téléphones portables ?

+

La loi introduit également des mesures de surveillance internationale : concrètement, les procédures de contrôle seront allégées lorsqu’un des « bouts » de la communication sera situé à l’étranger (concrètement, un Français qui parle avec un individu situé à l’étranger). Cependant, comme l’a souligné l’Arcep (l’Autorité de régulation des communications électroniques et des postes), sollicitée pour le versant technique de cette mesure, il est parfois difficile de s’assurer qu’une communication, même passant par l’étranger, ne concerne pas deux Français.

Un nouveau fichier

La loi crée un fichier judiciaire national automatisé des auteurs d’infractions terroristes (Fijait), dont les données pourront être conservées pendant vingt ans.

Ce fichier concerne les personnes ayant été condamnées, même si une procédure d’appel est en cours. Les mineurs pourront aussi être inscrits dans ce fichier et leurs données conservées jusqu’à dix ans. L’inscription ne sera pas automatique et se fera sur décision judiciaire. Certaines mises en examen pourront aussi apparaître sur ce fichier. En cas de non-lieu, relaxe, acquittement, amnistie ou réhabilitation, ces informations seront effacées.

@@ -40,7 +35,7 @@ Par
\ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lemonde-2/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lemonde-2/expected-metadata.json index c402d3e27..eb7aee3dc 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lemonde-2/expected-metadata.json +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lemonde-2/expected-metadata.json @@ -1,8 +1,8 @@ { - "Author": null, + "Author": "Collectif", "Direction": null, - "Excerpt": "Le retour à la stabilité coûtera des milliards d'euros, mais l'Union européenne en vaut la peine, estime un collectif d'industriels.", + "Excerpt": "Le retour \u00e0 la stabilit\u00e9 co\u00fbtera des milliards d'euros, mais l'Union europ\u00e9enne en vaut la peine, estime un collectif d'industriels.", "Image": "http:\/\/s1.lemde.fr\/medias\/web\/1.2.705\/img\/placeholder\/default.png", - "Title": "La crise européenne est une crise de la dette, pas de l'euro", - "SiteName": "Le Monde.fr" -} + "Title": "La crise europ\u00e9enne est une crise de la dette, pas de l'euro", + "SiteName": "Le Monde" +} \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lemonde-2/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lemonde-2/expected.html index af69efe32..69f6da53a 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lemonde-2/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lemonde-2/expected.html @@ -1,13 +1,14 @@

Le retour à la stabilité coûtera des milliards d'euros, mais l'Union européenne en vaut la peine, estime un collectif d'industriels.

L'union monétaire s'enlise dans la crise, l'euro reste soumis au feu des critiques. C'est le bilan des nombreux débats qui ont eu lieu ces derniers mois.

-

En tant qu'industriels allemands et français, qui ont la responsabilité de 1 500 milliards d'euros de chiffre d'affaires et de cinq millions de salariés dans le monde entier, nous nous soucions de l'avenir de l'euro et de l'union économique et monétaire européenne. L'histoire de l'euro est une véritable réussite. Qui aurait pensé, lorsque l'euro a été introduit il y a douze ans, qu'il aurait aujourd'hui gagné en valeur par rapport au dollar et de nombreuses autres monnaies ?

+

En tant qu'industriels allemands et français, qui ont la responsabilité de 1 500 milliards d'euros de chiffre d'affaires et de cinq millions de salariés dans le monde entier, nous nous soucions de l'avenir de l'euro et de l'union économique et monétaire européenne. L'histoire de l'euro est une véritable réussite. Qui aurait pensé, lorsque l'euro a été introduit il y a douze ans, qu'il aurait aujourd'hui gagné en valeur par rapport au dollar et de nombreuses autres monnaies ?

L'euro s'est imposé comme seconde monnaie de référence à côté du dollar et a renforcé le rôle de l'Europe en tant que puissance économique. Avec l'euro, un marché commun doté d'une monnaie unique et sans fluctuation de cours de change a vu le jour, créant ainsi prospérité et richesse pour nous tous. Depuis son introduction, près de 9 millions de nouveaux emplois ont été créés dans la zone euro. Les entreprises européennes profitent de ce développement. Elles ont élargi leurs capacités de financement et augmenté leur compétitivité à l'international.

-

Le ralentissement de l'économie mondiale a conduit certains pays de l'union monétaire à s'endetter encore davantage. A court terme, ces pays doivent être aidés pour regagner leur indépendance financière et recréer les conditions d'un avenir meilleur pour leur population.

-

En contrepartie, des mesures efficaces doivent être mises en oeuvre. Le retour à une situation financière stable coûtera de nombreux milliards d'euros, mais l'Union européenne et notre monnaie commune en valent la peine. Nous devons convaincre nos concitoyens de cela.

+

Le ralentissement de l'économie mondiale a conduit certains pays de l'union monétaire à s'endetter encore davantage. A court terme, ces pays doivent être aidés pour regagner leur indépendance financière et recréer les conditions d'un avenir meilleur pour leur population.

+

En contrepartie, des mesures efficaces doivent être mises en oeuvre. Le retour à une situation financière stable coûtera de nombreux milliards d'euros, mais l'Union européenne et notre monnaie commune en valent la peine. Nous devons convaincre nos concitoyens de cela.

RÈGLES PLUS STRICTES

-

Nous avons besoin d'une politique économique européenne et de règles de stabilité plus strictes. Pour éviter, à l'avenir, une crise telle que celle que nous traversons actuellement, nous devons renforcer les règles de stabilité existantes et assurer leur respect. Les solutions envisagées, comme, par exemple, l'exclusion de pays membres de la zone euro ou la scission entre une Union des pays du Nord et du Sud, ne sont pas bonnes. Cela aurait des conséquences qui sont difficilement prévisibles aujourd'hui. De telles propositions démagogiques ne sont pas adaptées à la gravité de la situation.

-

Cependant, des mesures doivent être prises à temps et être aussi efficaces que possible. De plus, les Etats membres doivent coordonner, plus étroitement qu'auparavant, leur politique économique intérieure et parler d'une seule voix vis-à-vis de l'extérieur.

-

En tant qu'industriels allemands et français, nous voulons souligner les immenses avantages que l'espace monétaire commun a apportés. Nous envoyons un message de soutien aux responsables politiques, afin qu'ils mettent en place des conditions nécessaires à un euro durablement stable et compétitif. C'est la base de la future prospérité en Europe. L'union monétaire a durablement besoin de finances publiques solides, de règles de responsabilité claires, de structures transparentes et de conditions de concurrence équitables.

+

Nous avons besoin d'une politique économique européenne et de règles de stabilité plus strictes. Pour éviter, à l'avenir, une crise telle que celle que nous traversons actuellement, nous devons renforcer les règles de stabilité existantes et assurer leur respect. Les solutions envisagées, comme, par exemple, l'exclusion de pays membres de la zone euro ou la scission entre une Union des pays du Nord et du Sud, ne sont pas bonnes. Cela aurait des conséquences qui sont difficilement prévisibles aujourd'hui. De telles propositions démagogiques ne sont pas adaptées à la gravité de la situation.

+

Cependant, des mesures doivent être prises à temps et être aussi efficaces que possible. De plus, les Etats membres doivent coordonner, plus étroitement qu'auparavant, leur politique économique intérieure et parler d'une seule voix vis-à-vis de l'extérieur.

+

En tant qu'industriels allemands et français, nous voulons souligner les immenses avantages que l'espace monétaire commun a apportés. Nous envoyons un message de soutien aux responsables politiques, afin qu'ils mettent en place des conditions nécessaires à un euro durablement stable et compétitif. C'est la base de la future prospérité en Europe. L'union monétaire a durablement besoin de finances publiques solides, de règles de responsabilité claires, de structures transparentes et de conditions de concurrence équitables.

Ce n'est qu'à ces conditions que l'euro sortira renforcé de la crise de la dette. Il n'y a pas d'alternative sérieuse à l'euro commun. L'euro symbolise l'Europe d'aujourd'hui. Un échec de l'euro serait un revers fatal pour l'Europe.

-

-Appel Frank (Deutsche Post) ; Aschenbroich Jacques (Valeo) ; Berger Roland (Roland Berger Strategy Consultants) ; Bock Kurt (BASF) ; Bories Christel (Constellium) ; Borsig Clemens (Deutsche Bank) ; Brunck Robert (CGG Veritas) ; Buffet Patrick (Eramet) ; Burda Hubert (Hubert Burda Media Holding) ; Caparros Alain (Rewe group) ; Clamadieu Jean-Pierre (Rhodia) ; Cromme Gerhard (ThyssenKrupp) ; Crouzet Philippe (Vallourec) ; de Chalendar Pierre-André (Saint-Gobain) ; de Margerie Christophe (Total) ; de Romanet Augustin (Caisse des dépôts et consignations) ; Degenhart Elmar (Continental) ; Diekmann Michael (Allianz) ; Engel Klaus (Evonik Industries) ; Fehrenbach Franz (Robert Bosch) ; Frérot Antoine (Veolia Environnement) ; Hagemann Snabe Jim (SAP) ; Henrot François (Groupe Rothschild Cie Banque) ; Hermelin Paul (Cap Gemini) ; Kormann Hermut (Lazard) ; Kron Patrick (Alstom) ; Lachmann Henri (Schneider Electric) ; Lafont Bruno (Lafarge) ; Lauvergeon Anne (Areva) ; Lévy Maurice (Publicis Groupe SA) ; Lévy Jean-Bernard (Vivendi) ; Löscher Peter (Siemens) ; Mestrallet Gérard (GDF Suez) ; Obermann René (Deutsche Telekom) ;Oetker Arend (Dr Arend Oetker Holding) ; Oudéa Frédéric (Société Générale) ; Potier Benoit (Air Liquide) ; Ranque Denis (Cercle de l'industrie/Technicolor) ; Reithofer Norbert (BMW) ; Reitzle Wolfgang (Linde) ; Richard Stéphane (France Telecom) ; Rollier Michel (Michelin) ; Rose Frédéric (Technicolor) ; Schnepp Gilles (Legrand) ; Spinetta Jean-Cyril (Air-France KLM)  ; Teyssen Johannes (E.ON)  ; Thumann Jürgen (BusinessEurope) ; Verwaayen Ben (Alcatel-Lucent) ; Viehbacher Chris (Sanofi) ; Zetsche Dieter (Daimler).

\ No newline at end of file +

+Appel Frank (Deutsche Post) ; Aschenbroich Jacques (Valeo) ; Berger Roland (Roland Berger Strategy Consultants) ; Bock Kurt (BASF) ; Bories Christel (Constellium) ; Borsig Clemens (Deutsche Bank) ; Brunck Robert (CGG Veritas) ; Buffet Patrick (Eramet) ; Burda Hubert (Hubert Burda Media Holding) ; Caparros Alain (Rewe group) ; Clamadieu Jean-Pierre (Rhodia) ; Cromme Gerhard (ThyssenKrupp) ; Crouzet Philippe (Vallourec) ; de Chalendar Pierre-André (Saint-Gobain) ; de Margerie Christophe (Total) ; de Romanet Augustin (Caisse des dépôts et consignations) ; Degenhart Elmar (Continental) ; Diekmann Michael (Allianz) ; Engel Klaus (Evonik Industries) ; Fehrenbach Franz (Robert Bosch) ; Frérot Antoine (Veolia Environnement) ; Hagemann Snabe Jim (SAP) ; Henrot François (Groupe Rothschild Cie Banque) ; Hermelin Paul (Cap Gemini) ; Kormann Hermut (Lazard) ; Kron Patrick (Alstom) ; Lachmann Henri (Schneider Electric) ; Lafont Bruno (Lafarge) ; Lauvergeon Anne (Areva) ; Lévy Maurice (Publicis Groupe SA) ; Lévy Jean-Bernard (Vivendi) ; Löscher Peter (Siemens) ; Mestrallet Gérard (GDF Suez) ; Obermann René (Deutsche Telekom) ;Oetker Arend (Dr Arend Oetker Holding) ; Oudéa Frédéric (Société Générale) ; Potier Benoit (Air Liquide) ; Ranque Denis (Cercle de l'industrie/Technicolor) ; Reithofer Norbert (BMW) ; Reitzle Wolfgang (Linde) ; Richard Stéphane (France Telecom) ; Rollier Michel (Michelin) ; Rose Frédéric (Technicolor) ; Schnepp Gilles (Legrand) ; Spinetta Jean-Cyril (Air-France KLM)  ; Teyssen Johannes (E.ON)  ; Thumann Jürgen (BusinessEurope) ; Verwaayen Ben (Alcatel-Lucent) ; Viehbacher Chris (Sanofi) ; Zetsche Dieter (Daimler).
+

\ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/liberation-1/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/liberation-1/expected-metadata.json index 5f2b7b5ee..8ad2b2c12 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/liberation-1/expected-metadata.json +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/liberation-1/expected-metadata.json @@ -1,5 +1,5 @@ { - "Author": "AFP", + "Author": "Par Sébastien Farcis", "Direction": null, "Excerpt": "Laurent Fabius a accueilli jeudi matin à Roissy un premier avion spécial ramenant des rescapés.", "Image": "http:\/\/md1.libe.com\/photo\/755923-000_hkg10175905.jpg?modified_at=1430371146&width=750", diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/liberation-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/liberation-1/expected.html index 889c2b928..1eeb65754 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/liberation-1/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/liberation-1/expected.html @@ -1,13 +1,16 @@ -
-
-

Un troisième Français a été tué dans le tremblement de terre samedi au Népal, emporté par une avalanche, a déclaré jeudi le ministre des Affaires étrangères. Les autorités françaises sont toujours sans nouvelles «d’encore plus de 200» personnes. «Pour certains d’entre eux on est très interrogatif», a ajouté Laurent Fabius. Il accueillait à Roissy un premier avion spécial ramenant des rescapés. L’Airbus A350 affrété par les autorités françaises s’est posé peu avant 5h45 avec à son bord 206 passagers, dont 12 enfants et 26 blessés, selon une source du Quai d’Orsay. Quasiment tous sont français, à l’exception d’une quinzaine de ressortissants allemands, suisses, italiens, portugais ou encore turcs. Des psychologues, une équipe médicale et des personnels du centre de crise du Quai d’Orsay les attendent.

-

L’appareil, mis à disposition par Airbus, était arrivé à Katmandou mercredi matin avec 55 personnels de santé et humanitaires, ainsi que 25 tonnes de matériel (abris, médicaments, aide alimentaire). Un deuxième avion dépêché par Paris, qui était immobilisé aux Emirats depuis mardi avec 20 tonnes de matériel, est arrivé jeudi à Katmandou, dont le petit aéroport est engorgé par le trafic et l’afflux d’aide humanitaire. Il devait lui aussi ramener des Français, «les plus éprouvés» par la catastrophe et les «plus vulnérables (blessés, familles avec enfants)», selon le ministère des Affaires étrangères.

-

2 209 Français ont été localisés sains et saufs tandis que 393 n’ont pas encore pu être joints, selon le Quai d’Orsay. Environ 400 Français ont demandé à être rapatriés dans les vols mis en place par la France.

-

Le séisme a fait près de 5 500 morts et touche huit des 28 millions d’habitants du Népal. Des dizaines de milliers de personnes sont sans abri.

+
+
+ + + +
+

Un troisième Français a été tué dans le tremblement de terre samedi au Népal, emporté par une avalanche, a déclaré jeudi le ministre des Affaires étrangères. Les autorités françaises sont toujours sans nouvelles «d’encore plus de 200» personnes. «Pour certains d’entre eux on est très interrogatif», a ajouté Laurent Fabius. Il accueillait à Roissy un premier avion spécial ramenant des rescapés. L’Airbus A350 affrété par les autorités françaises s’est posé peu avant 5h45 avec à son bord 206 passagers, dont 12 enfants et 26 blessés, selon une source du Quai d’Orsay. Quasiment tous sont français, à l’exception d’une quinzaine de ressortissants allemands, suisses, italiens, portugais ou encore turcs. Des psychologues, une équipe médicale et des personnels du centre de crise du Quai d’Orsay les attendent.

+

L’appareil, mis à disposition par Airbus, était arrivé à Katmandou mercredi matin avec 55 personnels de santé et humanitaires, ainsi que 25 tonnes de matériel (abris, médicaments, aide alimentaire). Un deuxième avion dépêché par Paris, qui était immobilisé aux Emirats depuis mardi avec 20 tonnes de matériel, est arrivé jeudi à Katmandou, dont le petit aéroport est engorgé par le trafic et l’afflux d’aide humanitaire. Il devait lui aussi ramener des Français, «les plus éprouvés» par la catastrophe et les «plus vulnérables (blessés, familles avec enfants)», selon le ministère des Affaires étrangères.

+

2 209 Français ont été localisés sains et saufs tandis que 393 n’ont pas encore pu être joints, selon le Quai d’Orsay. Environ 400 Français ont demandé à être rapatriés dans les vols mis en place par la France.

+

Le séisme a fait près de 5 500 morts et touche huit des 28 millions d’habitants du Népal. Des dizaines de milliers de personnes sont sans abri.

- -

+ +

- -
-
\ No newline at end of file +
+ \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lifehacker-post-comment-load/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lifehacker-post-comment-load/expected-images.json index b46843d47..1efdcbde3 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lifehacker-post-comment-load/expected-images.json +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lifehacker-post-comment-load/expected-images.json @@ -1,11 +1,11 @@ -{ - "0": "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--hqqO9fze--\/n1s6c2m6kc07iqdyllj6.jpg", - "2": "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--QeUTCiuW--\/o4dpyrcbiqyfrc3bxx6p.jpg", - "3": "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--mlR3Ku0_--\/xrhkwleyurcizy4akiae.jpg", - "4": "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--Tacb0tyW--\/qodag11euf2npkawkn9v.jpg", - "5": "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--x9hLbIKJ--\/imfc9ybqfw0jmztbhfrh.jpg", - "6": "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--6NwBgQLy--\/afy7n45jfvsjdmmhonct.jpg", - "7": "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--ciqk42G0--\/s3pq8vjrvyjgne4lfsod.jpg", - "8": "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--mtob1sjR--\/y2ldv5eufb3jcrtfouye.jpg", - "9": "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--4Ajak63w--\/atb9qm07fvvg7hqkumkw.jpg" -} \ No newline at end of file +[ + "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--hqqO9fze--\/n1s6c2m6kc07iqdyllj6.jpg", + "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--QeUTCiuW--\/o4dpyrcbiqyfrc3bxx6p.jpg", + "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--mlR3Ku0_--\/xrhkwleyurcizy4akiae.jpg", + "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--Tacb0tyW--\/qodag11euf2npkawkn9v.jpg", + "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--x9hLbIKJ--\/imfc9ybqfw0jmztbhfrh.jpg", + "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--6NwBgQLy--\/afy7n45jfvsjdmmhonct.jpg", + "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--ciqk42G0--\/s3pq8vjrvyjgne4lfsod.jpg", + "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--mtob1sjR--\/y2ldv5eufb3jcrtfouye.jpg", + "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--4Ajak63w--\/atb9qm07fvvg7hqkumkw.jpg" +] \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lifehacker-post-comment-load/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lifehacker-post-comment-load/expected.html index 2f862a91c..758a827e5 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lifehacker-post-comment-load/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lifehacker-post-comment-load/expected.html @@ -1,4 +1,15 @@ -

How to Program Your Mind to Stop Buying Crap You Don’t Need

We all buy things from time to time that we don't really need. It's okay to appeal to your wants every once in a while, as long as you're in control. If you struggle with clutter, impulse buys, and buyer's remorse, here's how to put your mind in the right place before you even set foot in a store.

+

How to Program Your Mind to Stop Buying Crap You Don’t Need

+ + + + + + + + + + +

We all buy things from time to time that we don't really need. It's okay to appeal to your wants every once in a while, as long as you're in control. If you struggle with clutter, impulse buys, and buyer's remorse, here's how to put your mind in the right place before you even set foot in a store.

@@ -21,7 +32,7 @@ -

How to Program Your Mind to Stop Buying Crap You Don’t Need

+

How to Program Your Mind to Stop Buying Crap You Don’t Need

@@ -43,7 +54,48 @@ -
  • Color: Stores use color to make products attractive and eye-catching, but they also use color on price labels. Red stands out and can encourage taking action, that's why it's commonly associated with sale signage and advertising. When you see red, remember what they're trying to do to your brain with that color. You don't to buy something just because it's on sale.
  • Navigation Roadblocks: Stores force you to walk around stuff you don't need to find the stuff you are really after. Have a list of what you need before you go in, go straight to it, and imagine it's the only item in the store.
  • The Touch Factor: Stores place items they want to sell in easy to reach locations and encourage you to touch them. Don't do it! As soon as you pick something up, you're more likely to buy it because your mind suddenly takes ownership of the object. Don't pick anything up and don't play with display items.
  • Scents and Sounds: You'll probably hear classic, upbeat tunes when you walk into a store. The upbeat music makes you happy and excited, while playing familiar songs makes you feel comfortable. They also use pleasant smells to put your mind at ease. A happy, comfortable mind at ease is a dangerous combination for your brain when shopping. There's not much you can do to avoid this unless you shop online, but it's good to be aware of it.

And sure, we can blame the stores all we want, but you won't change how they operate—you can only be aware of how your brain is falling for their tricks. Even without the stores, your brain is working against you on its own, thanks to some simple cognitive biases.

+
  • Color: Stores use color to make products attractive and eye-catching, but they also use color on price labels. Red stands out and can encourage taking action, that's why it's commonly associated with sale signage and advertising. When you see red, remember what they're trying to do to your brain with that color. You don't to buy something just because it's on sale.
  • Navigation Roadblocks: Stores force you to walk around stuff you don't need to find the stuff you are really after. Have a list of what you need before you go in, go straight to it, and imagine it's the only item in the store.
  • The Touch Factor: Stores place items they want to sell in easy to reach locations and encourage you to touch them. Don't do it! As soon as you pick something up, you're more likely to buy it because your mind suddenly takes ownership of the object. Don't pick anything up and don't play with display items.
  • Scents and Sounds: You'll probably hear classic, upbeat tunes when you walk into a store. The upbeat music makes you happy and excited, while playing familiar songs makes you feel comfortable. They also use pleasant smells to put your mind at ease. A happy, comfortable mind at ease is a dangerous combination for your brain when shopping. There's not much you can do to avoid this unless you shop online, but it's good to be aware of it.
+ + + + + + + + + + +

And sure, we can blame the stores all we want, but you won't change how they operate—you can only be aware of how your brain is falling for their tricks. Even without the stores, your brain is working against you on its own, thanks to some simple cognitive biases.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -78,7 +130,7 @@ -

How to Program Your Mind to Stop Buying Crap You Don’t Need

+

How to Program Your Mind to Stop Buying Crap You Don’t Need

@@ -102,6 +154,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

The purpose of this exercise is twofold: you see what you already have and don't need to ever buy again, and you get to see what you shouldn't have bought in the first place. As you list everything out, separate items into categories. It's extremely important that you are as honest with yourself as possible while you do this. It's also important you actually write this all down or type it all out. Here is the first set of categories to separate everything into:

@@ -113,7 +195,7 @@ -
  • Need: You absolutely need this item to get by on a day to day basis.
  • Sometimes Need: You don't need this item every day, but you use it on a somewhat regular basis.
  • Want: You bought this item because you wanted it, not because you needed it.
  • Crap: You don't have a good reason why you have it and you already know it needs to go (there's probably a few of these items, at least).

Leave the things you listed as "needs" alone, put your stuff listed as "crap" in a pile or box to go bye-bye, and move your attention back to your "sometimes need" and "want" lists. You need to go back over both of those lists because you probably fudged some of the listings, either subconsciously or intentionally. Now ask yourself these three questions as you go through both the "sometimes need" and "want" lists:

+
  • Need: You absolutely need this item to get by on a day to day basis.
  • Sometimes Need: You don't need this item every day, but you use it on a somewhat regular basis.
  • Want: You bought this item because you wanted it, not because you needed it.
  • Crap: You don't have a good reason why you have it and you already know it needs to go (there's probably a few of these items, at least).
@@ -124,7 +206,29 @@ -
  • When was the last time I used this?
  • When will I use this again?
  • Does this item bring you joy?

Remember to be honest and adjust your lists accordingly. There's nothing wrong with keeping things you wanted. Material items can bring happiness to many people, but make sure the items on your "want" list actively provide you joy and are being used. If an item doesn't get much use or doesn't make you happy, add it to the "crap" list.

+

Leave the things you listed as "needs" alone, put your stuff listed as "crap" in a pile or box to go bye-bye, and move your attention back to your "sometimes need" and "want" lists. You need to go back over both of those lists because you probably fudged some of the listings, either subconsciously or intentionally. Now ask yourself these three questions as you go through both the "sometimes need" and "want" lists:

+ + + + + + + + + + +
  • When was the last time I used this?
  • When will I use this again?
  • Does this item bring you joy?
+ + + + + + + + + + +

Remember to be honest and adjust your lists accordingly. There's nothing wrong with keeping things you wanted. Material items can bring happiness to many people, but make sure the items on your "want" list actively provide you joy and are being used. If an item doesn't get much use or doesn't make you happy, add it to the "crap" list.

@@ -157,7 +261,7 @@ -

How to Program Your Mind to Stop Buying Crap You Don’t Need

+

How to Program Your Mind to Stop Buying Crap You Don’t Need

@@ -201,7 +305,7 @@ -

How to Program Your Mind to Stop Buying Crap You Don’t Need

+

How to Program Your Mind to Stop Buying Crap You Don’t Need

@@ -245,7 +349,7 @@ -

How to Program Your Mind to Stop Buying Crap You Don’t Need

+

How to Program Your Mind to Stop Buying Crap You Don’t Need

@@ -289,7 +393,7 @@ -

How to Program Your Mind to Stop Buying Crap You Don’t Need

+

How to Program Your Mind to Stop Buying Crap You Don’t Need

@@ -311,7 +415,18 @@ -
  • Is this a planned purchase?
  • Will it end up in the "crap" list picture one day?
  • Where am I going to put it?
  • Have I included this in my budget?
  • Why do I want/need it?

Custom build your test to hit all of your weaknesses. If you make a lot of impulse buys, include questions that address that. If you experience a lot of buyer's remorse, include a lot of questions that make you think about the use of item after you buy it. If buying the latest and greatest technology is your weakness, Joshua Becker at Becoming Minimalist suggests you ask yourself what problem the piece of tech solves. If you can't think of anything it solves or if you already have something that solves it, you don't need it. Be thorough and build a test that you can run through your mind every time you consider buying something.

+
  • Is this a planned purchase?
  • Will it end up in the "crap" list picture one day?
  • Where am I going to put it?
  • Have I included this in my budget?
  • Why do I want/need it?
+ + + + + + + + + + +

Custom build your test to hit all of your weaknesses. If you make a lot of impulse buys, include questions that address that. If you experience a lot of buyer's remorse, include a lot of questions that make you think about the use of item after you buy it. If buying the latest and greatest technology is your weakness, Joshua Becker at Becoming Minimalist suggests you ask yourself what problem the piece of tech solves. If you can't think of anything it solves or if you already have something that solves it, you don't need it. Be thorough and build a test that you can run through your mind every time you consider buying something.

@@ -333,7 +448,7 @@ -

How to Program Your Mind to Stop Buying Crap You Don’t Need

+

How to Program Your Mind to Stop Buying Crap You Don’t Need

@@ -379,7 +494,37 @@ -

The last thing you should consider when it comes to impulse buys is "artificial replacement." As Trent Hamm at The Simple Dollar explains, artificial replacement can happen when you start to reduce the time you get with your main interests:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

The last thing you should consider when it comes to impulse buys is "artificial replacement." As Trent Hamm at The Simple Dollar explains, artificial replacement can happen when you start to reduce the time you get with your main interests:

@@ -424,7 +569,7 @@ -

How to Program Your Mind to Stop Buying Crap You Don’t Need

+

How to Program Your Mind to Stop Buying Crap You Don’t Need

@@ -435,7 +580,7 @@ -

Once you've programmed your mind to stop buying crap you don't need, you'll have some extra cash to play with. Take all that money and start putting it toward your future and things you will need further down the road. You might need a home, a vehicle, or a way to retire, but none of that can happen until you start planning for it.

+

Once you've programmed your mind to stop buying crap you don't need, you'll have some extra cash to play with. Take all that money and start putting it toward your future and things you will need further down the road. You might need a home, a vehicle, or a way to retire, but none of that can happen until you start planning for it.

@@ -457,7 +602,7 @@ -

With your debts whittled down, you should start an emergency fund. No matter how well you plan things, accidents and health emergencies can still happen. An emergency fund is designed to make those kinds of events more manageable. This type of savings account is strictly for when life throws you a curveball, but you can grow one pretty easily with only modest savings.

+

With your debts whittled down, you should start an emergency fund. No matter how well you plan things, accidents and health emergencies can still happen. An emergency fund is designed to make those kinds of events more manageable. This type of savings account is strictly for when life throws you a curveball, but you can grow one pretty easily with only modest savings.

@@ -468,7 +613,7 @@ -

When you've paid off your debt and prepared yourself for troubled times, you can start saving for the big stuff. All that money you're not spending on crap anymore can be saved, invested, and compounded to let you buy comfort and security. If you don't know where to start, talk to a financial planner. Or create a simple, yet effective "set and forget" investment portfolio. You've worked hard to reprogram your mind, so make sure you reap the benefits for many years to come.

+

When you've paid off your debt and prepared yourself for troubled times, you can start saving for the big stuff. All that money you're not spending on crap anymore can be saved, invested, and compounded to let you buy comfort and security. If you don't know where to start, talk to a financial planner. Or create a simple, yet effective "set and forget" investment portfolio. You've worked hard to reprogram your mind, so make sure you reap the benefits for many years to come.

@@ -481,4 +626,34 @@ -

Photos by cmgirl (Shutterstock), Macrovector (Shutterstock), J E Theriot, davidd, George Redgrave, David Amsler, Arup Malakar, J B, jakerome, 401(K) 2012.

\ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Photos by cmgirl (Shutterstock), Macrovector (Shutterstock), J E Theriot, davidd, George Redgrave, David Amsler, Arup Malakar, J B, jakerome, 401(K) 2012.

\ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lifehacker-working/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lifehacker-working/expected-images.json index b46843d47..1efdcbde3 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lifehacker-working/expected-images.json +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lifehacker-working/expected-images.json @@ -1,11 +1,11 @@ -{ - "0": "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--hqqO9fze--\/n1s6c2m6kc07iqdyllj6.jpg", - "2": "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--QeUTCiuW--\/o4dpyrcbiqyfrc3bxx6p.jpg", - "3": "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--mlR3Ku0_--\/xrhkwleyurcizy4akiae.jpg", - "4": "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--Tacb0tyW--\/qodag11euf2npkawkn9v.jpg", - "5": "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--x9hLbIKJ--\/imfc9ybqfw0jmztbhfrh.jpg", - "6": "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--6NwBgQLy--\/afy7n45jfvsjdmmhonct.jpg", - "7": "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--ciqk42G0--\/s3pq8vjrvyjgne4lfsod.jpg", - "8": "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--mtob1sjR--\/y2ldv5eufb3jcrtfouye.jpg", - "9": "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--4Ajak63w--\/atb9qm07fvvg7hqkumkw.jpg" -} \ No newline at end of file +[ + "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--hqqO9fze--\/n1s6c2m6kc07iqdyllj6.jpg", + "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--QeUTCiuW--\/o4dpyrcbiqyfrc3bxx6p.jpg", + "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--mlR3Ku0_--\/xrhkwleyurcizy4akiae.jpg", + "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--Tacb0tyW--\/qodag11euf2npkawkn9v.jpg", + "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--x9hLbIKJ--\/imfc9ybqfw0jmztbhfrh.jpg", + "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--6NwBgQLy--\/afy7n45jfvsjdmmhonct.jpg", + "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--ciqk42G0--\/s3pq8vjrvyjgne4lfsod.jpg", + "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--mtob1sjR--\/y2ldv5eufb3jcrtfouye.jpg", + "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--4Ajak63w--\/atb9qm07fvvg7hqkumkw.jpg" +] \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lifehacker-working/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lifehacker-working/expected.html index 2f862a91c..758a827e5 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lifehacker-working/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lifehacker-working/expected.html @@ -1,4 +1,15 @@ -

How to Program Your Mind to Stop Buying Crap You Don’t Need

We all buy things from time to time that we don't really need. It's okay to appeal to your wants every once in a while, as long as you're in control. If you struggle with clutter, impulse buys, and buyer's remorse, here's how to put your mind in the right place before you even set foot in a store.

+

How to Program Your Mind to Stop Buying Crap You Don’t Need

+ + + + + + + + + + +

We all buy things from time to time that we don't really need. It's okay to appeal to your wants every once in a while, as long as you're in control. If you struggle with clutter, impulse buys, and buyer's remorse, here's how to put your mind in the right place before you even set foot in a store.

@@ -21,7 +32,7 @@ -

How to Program Your Mind to Stop Buying Crap You Don’t Need

+

How to Program Your Mind to Stop Buying Crap You Don’t Need

@@ -43,7 +54,48 @@ -
  • Color: Stores use color to make products attractive and eye-catching, but they also use color on price labels. Red stands out and can encourage taking action, that's why it's commonly associated with sale signage and advertising. When you see red, remember what they're trying to do to your brain with that color. You don't to buy something just because it's on sale.
  • Navigation Roadblocks: Stores force you to walk around stuff you don't need to find the stuff you are really after. Have a list of what you need before you go in, go straight to it, and imagine it's the only item in the store.
  • The Touch Factor: Stores place items they want to sell in easy to reach locations and encourage you to touch them. Don't do it! As soon as you pick something up, you're more likely to buy it because your mind suddenly takes ownership of the object. Don't pick anything up and don't play with display items.
  • Scents and Sounds: You'll probably hear classic, upbeat tunes when you walk into a store. The upbeat music makes you happy and excited, while playing familiar songs makes you feel comfortable. They also use pleasant smells to put your mind at ease. A happy, comfortable mind at ease is a dangerous combination for your brain when shopping. There's not much you can do to avoid this unless you shop online, but it's good to be aware of it.

And sure, we can blame the stores all we want, but you won't change how they operate—you can only be aware of how your brain is falling for their tricks. Even without the stores, your brain is working against you on its own, thanks to some simple cognitive biases.

+
  • Color: Stores use color to make products attractive and eye-catching, but they also use color on price labels. Red stands out and can encourage taking action, that's why it's commonly associated with sale signage and advertising. When you see red, remember what they're trying to do to your brain with that color. You don't to buy something just because it's on sale.
  • Navigation Roadblocks: Stores force you to walk around stuff you don't need to find the stuff you are really after. Have a list of what you need before you go in, go straight to it, and imagine it's the only item in the store.
  • The Touch Factor: Stores place items they want to sell in easy to reach locations and encourage you to touch them. Don't do it! As soon as you pick something up, you're more likely to buy it because your mind suddenly takes ownership of the object. Don't pick anything up and don't play with display items.
  • Scents and Sounds: You'll probably hear classic, upbeat tunes when you walk into a store. The upbeat music makes you happy and excited, while playing familiar songs makes you feel comfortable. They also use pleasant smells to put your mind at ease. A happy, comfortable mind at ease is a dangerous combination for your brain when shopping. There's not much you can do to avoid this unless you shop online, but it's good to be aware of it.
+ + + + + + + + + + +

And sure, we can blame the stores all we want, but you won't change how they operate—you can only be aware of how your brain is falling for their tricks. Even without the stores, your brain is working against you on its own, thanks to some simple cognitive biases.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -78,7 +130,7 @@ -

How to Program Your Mind to Stop Buying Crap You Don’t Need

+

How to Program Your Mind to Stop Buying Crap You Don’t Need

@@ -102,6 +154,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

The purpose of this exercise is twofold: you see what you already have and don't need to ever buy again, and you get to see what you shouldn't have bought in the first place. As you list everything out, separate items into categories. It's extremely important that you are as honest with yourself as possible while you do this. It's also important you actually write this all down or type it all out. Here is the first set of categories to separate everything into:

@@ -113,7 +195,7 @@ -
  • Need: You absolutely need this item to get by on a day to day basis.
  • Sometimes Need: You don't need this item every day, but you use it on a somewhat regular basis.
  • Want: You bought this item because you wanted it, not because you needed it.
  • Crap: You don't have a good reason why you have it and you already know it needs to go (there's probably a few of these items, at least).

Leave the things you listed as "needs" alone, put your stuff listed as "crap" in a pile or box to go bye-bye, and move your attention back to your "sometimes need" and "want" lists. You need to go back over both of those lists because you probably fudged some of the listings, either subconsciously or intentionally. Now ask yourself these three questions as you go through both the "sometimes need" and "want" lists:

+
  • Need: You absolutely need this item to get by on a day to day basis.
  • Sometimes Need: You don't need this item every day, but you use it on a somewhat regular basis.
  • Want: You bought this item because you wanted it, not because you needed it.
  • Crap: You don't have a good reason why you have it and you already know it needs to go (there's probably a few of these items, at least).
@@ -124,7 +206,29 @@ -
  • When was the last time I used this?
  • When will I use this again?
  • Does this item bring you joy?

Remember to be honest and adjust your lists accordingly. There's nothing wrong with keeping things you wanted. Material items can bring happiness to many people, but make sure the items on your "want" list actively provide you joy and are being used. If an item doesn't get much use or doesn't make you happy, add it to the "crap" list.

+

Leave the things you listed as "needs" alone, put your stuff listed as "crap" in a pile or box to go bye-bye, and move your attention back to your "sometimes need" and "want" lists. You need to go back over both of those lists because you probably fudged some of the listings, either subconsciously or intentionally. Now ask yourself these three questions as you go through both the "sometimes need" and "want" lists:

+ + + + + + + + + + +
  • When was the last time I used this?
  • When will I use this again?
  • Does this item bring you joy?
+ + + + + + + + + + +

Remember to be honest and adjust your lists accordingly. There's nothing wrong with keeping things you wanted. Material items can bring happiness to many people, but make sure the items on your "want" list actively provide you joy and are being used. If an item doesn't get much use or doesn't make you happy, add it to the "crap" list.

@@ -157,7 +261,7 @@ -

How to Program Your Mind to Stop Buying Crap You Don’t Need

+

How to Program Your Mind to Stop Buying Crap You Don’t Need

@@ -201,7 +305,7 @@ -

How to Program Your Mind to Stop Buying Crap You Don’t Need

+

How to Program Your Mind to Stop Buying Crap You Don’t Need

@@ -245,7 +349,7 @@ -

How to Program Your Mind to Stop Buying Crap You Don’t Need

+

How to Program Your Mind to Stop Buying Crap You Don’t Need

@@ -289,7 +393,7 @@ -

How to Program Your Mind to Stop Buying Crap You Don’t Need

+

How to Program Your Mind to Stop Buying Crap You Don’t Need

@@ -311,7 +415,18 @@ -
  • Is this a planned purchase?
  • Will it end up in the "crap" list picture one day?
  • Where am I going to put it?
  • Have I included this in my budget?
  • Why do I want/need it?

Custom build your test to hit all of your weaknesses. If you make a lot of impulse buys, include questions that address that. If you experience a lot of buyer's remorse, include a lot of questions that make you think about the use of item after you buy it. If buying the latest and greatest technology is your weakness, Joshua Becker at Becoming Minimalist suggests you ask yourself what problem the piece of tech solves. If you can't think of anything it solves or if you already have something that solves it, you don't need it. Be thorough and build a test that you can run through your mind every time you consider buying something.

+
  • Is this a planned purchase?
  • Will it end up in the "crap" list picture one day?
  • Where am I going to put it?
  • Have I included this in my budget?
  • Why do I want/need it?
+ + + + + + + + + + +

Custom build your test to hit all of your weaknesses. If you make a lot of impulse buys, include questions that address that. If you experience a lot of buyer's remorse, include a lot of questions that make you think about the use of item after you buy it. If buying the latest and greatest technology is your weakness, Joshua Becker at Becoming Minimalist suggests you ask yourself what problem the piece of tech solves. If you can't think of anything it solves or if you already have something that solves it, you don't need it. Be thorough and build a test that you can run through your mind every time you consider buying something.

@@ -333,7 +448,7 @@ -

How to Program Your Mind to Stop Buying Crap You Don’t Need

+

How to Program Your Mind to Stop Buying Crap You Don’t Need

@@ -379,7 +494,37 @@ -

The last thing you should consider when it comes to impulse buys is "artificial replacement." As Trent Hamm at The Simple Dollar explains, artificial replacement can happen when you start to reduce the time you get with your main interests:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

The last thing you should consider when it comes to impulse buys is "artificial replacement." As Trent Hamm at The Simple Dollar explains, artificial replacement can happen when you start to reduce the time you get with your main interests:

@@ -424,7 +569,7 @@ -

How to Program Your Mind to Stop Buying Crap You Don’t Need

+

How to Program Your Mind to Stop Buying Crap You Don’t Need

@@ -435,7 +580,7 @@ -

Once you've programmed your mind to stop buying crap you don't need, you'll have some extra cash to play with. Take all that money and start putting it toward your future and things you will need further down the road. You might need a home, a vehicle, or a way to retire, but none of that can happen until you start planning for it.

+

Once you've programmed your mind to stop buying crap you don't need, you'll have some extra cash to play with. Take all that money and start putting it toward your future and things you will need further down the road. You might need a home, a vehicle, or a way to retire, but none of that can happen until you start planning for it.

@@ -457,7 +602,7 @@ -

With your debts whittled down, you should start an emergency fund. No matter how well you plan things, accidents and health emergencies can still happen. An emergency fund is designed to make those kinds of events more manageable. This type of savings account is strictly for when life throws you a curveball, but you can grow one pretty easily with only modest savings.

+

With your debts whittled down, you should start an emergency fund. No matter how well you plan things, accidents and health emergencies can still happen. An emergency fund is designed to make those kinds of events more manageable. This type of savings account is strictly for when life throws you a curveball, but you can grow one pretty easily with only modest savings.

@@ -468,7 +613,7 @@ -

When you've paid off your debt and prepared yourself for troubled times, you can start saving for the big stuff. All that money you're not spending on crap anymore can be saved, invested, and compounded to let you buy comfort and security. If you don't know where to start, talk to a financial planner. Or create a simple, yet effective "set and forget" investment portfolio. You've worked hard to reprogram your mind, so make sure you reap the benefits for many years to come.

+

When you've paid off your debt and prepared yourself for troubled times, you can start saving for the big stuff. All that money you're not spending on crap anymore can be saved, invested, and compounded to let you buy comfort and security. If you don't know where to start, talk to a financial planner. Or create a simple, yet effective "set and forget" investment portfolio. You've worked hard to reprogram your mind, so make sure you reap the benefits for many years to come.

@@ -481,4 +626,34 @@ -

Photos by cmgirl (Shutterstock), Macrovector (Shutterstock), J E Theriot, davidd, George Redgrave, David Amsler, Arup Malakar, J B, jakerome, 401(K) 2012.

\ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Photos by cmgirl (Shutterstock), Macrovector (Shutterstock), J E Theriot, davidd, George Redgrave, David Amsler, Arup Malakar, J B, jakerome, 401(K) 2012.

\ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/links-in-tables/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/links-in-tables/expected-metadata.json index d6b1330af..d13d96c0a 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/links-in-tables/expected-metadata.json +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/links-in-tables/expected-metadata.json @@ -1,5 +1,5 @@ { - "Author": null, + "Author": "", "Direction": null, "Excerpt": "Posted by Andrew Hayden, Software Engineer on Google Play Android users are downloading tens of billions of apps and games on Google Pla...", "Image": "https:\/\/2.bp.blogspot.com\/-chCZZinlUTg\/WEcxvJo9gdI\/AAAAAAAADnk\/3ND_BspqN6Y2j5xxkLFW3RyS2Ig0NHZpQCLcB\/w1200-h630-p-k-nu\/ipsum-opsum.gif", diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/links-in-tables/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/links-in-tables/expected.html index 05e072336..12d773354 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/links-in-tables/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/links-in-tables/expected.html @@ -54,7 +54,7 @@ to inefficient patches. Watch how much the compressed text on the right side changes from a one-letter change in the uncompressed text on the left:

-

+

File-by-File therefore is based on detecting changes in the uncompressed data. To generate a patch, we first decompress both old and new files before computing @@ -105,45 +105,50 @@ Patching? Here are examples of app updates already using File-by-File Patching:

- -
- +

Application

+ + + + + + + +

Application

Original Size

Previous (BSDiff) Patch Size

(% vs original)

File-by-File Patch Size (% vs original)

-
+

71.1 MB

13.4 MB (-81%)

8.0 MB (-89%)

-
+

32.7 MB

17.5 MB (-46%)

9.6 MB (-71%)

-
+

17.8 MB

7.6 MB (-57%)

7.3 MB (-59%)

-
+

18.9 MB

17.2 MB (-9%)

13.1 MB (-31%)

-
+

52.4 MB

19.1 MB (-64%)

8.4 MB (-84%)

-
+

16.2 MB

7.7 MB (-52%)

1.2 MB (-92%)

-
- +

Disclaimer: if you see different patch sizes when you press "update" manually, that is because we are not currently using File-by-file for @@ -169,6 +174,6 @@ As a developer if you're interested in reducing your APK size still further, here are some general tips on reducing APK size.

-

+

\ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lwn-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lwn-1/expected.html index 358f95655..f17b05a00 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lwn-1/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lwn-1/expected.html @@ -1,373 +1,655 @@ -
- -
-

A trademark battle in the Arduino community

- -

The Arduino has been one of the biggest success stories of the open-hardware movement, but that success does not protect it from internal conflict. In recent months, two of the project's founders have come into conflict about the direction of future efforts—and that conflict has turned into a legal dispute about who owns the rights to the Arduino trademark.

-

The current fight is a battle between two companies that both bear the Arduino name: Arduino LLC and Arduino SRL. The disagreements that led to present state of affairs go back a bit further.

-

The Arduino project grew out of 2005-era course work taught at the Interaction Design Institute Ivrea (IDII) in Ivrea, Italy (using Processing, Wiring, and pre-existing microcontroller hardware). After the IDII program was discontinued, the open-hardware Arduino project as we know it was launched by Massimo Banzi, David Cuartielles, and David Mellis (who had worked together at IDII), with co-founders Tom Igoe and Gianluca Martino joining shortly afterward. The project released open hardware designs (including full schematics and design files) as well as the microcontroller software to run on the boards and the desktop IDE needed to program it.

-

Arduino LLC was incorporated in 2008 by Banzi, Cuartielles, Mellis, Igoe, and Martino. The company is registered in the United States, and it has continued to design the Arduino product line, develop the software, and run the Arduino community site. The hardware devices themselves, however, were manufactured by a separate company, "Smart Projects SRL," that was founded by Martino. "SRL" is essentially the Italian equivalent of "LLC"—Smart Projects was incorporated in Italy.

-

This division of responsibilities—with the main Arduino project handling everything except for board manufacturing—may seem like an odd one, but it is consistent with Arduino's marketing story. From its earliest days, the designs for the hardware have been freely available, and outside companies were allowed to make Arduino-compatible devices. The project has long run a certification +

+ + +
+

A trademark battle in the Arduino community

+ +

The Arduino has been one of the biggest success stories of the open-hardware movement, but that success does not protect it from internal conflict. In recent months, two of the project's founders have come into conflict about the direction of future efforts—and that conflict has turned into a legal dispute about who owns the rights to the Arduino trademark.

+

The current fight is a battle between two companies that both bear the Arduino name: Arduino LLC and Arduino SRL. The disagreements that led to present state of affairs go back a bit further.

+

The Arduino project grew out of 2005-era course work taught at the Interaction Design Institute Ivrea (IDII) in Ivrea, Italy (using Processing, Wiring, and pre-existing microcontroller hardware). After the IDII program was discontinued, the open-hardware Arduino project as we know it was launched by Massimo Banzi, David Cuartielles, and David Mellis (who had worked together at IDII), with co-founders Tom Igoe and Gianluca Martino joining shortly afterward. The project released open hardware designs (including full schematics and design files) as well as the microcontroller software to run on the boards and the desktop IDE needed to program it.

+

Arduino LLC was incorporated in 2008 by Banzi, Cuartielles, Mellis, Igoe, and Martino. The company is registered in the United States, and it has continued to design the Arduino product line, develop the software, and run the Arduino community site. The hardware devices themselves, however, were manufactured by a separate company, "Smart Projects SRL," that was founded by Martino. "SRL" is essentially the Italian equivalent of "LLC"—Smart Projects was incorporated in Italy.

+

This division of responsibilities—with the main Arduino project handling everything except for board manufacturing—may seem like an odd one, but it is consistent with Arduino's marketing story. From its earliest days, the designs for the hardware have been freely available, and outside companies were allowed to make Arduino-compatible devices. The project has long run a certification program for third-party manufacturers interested in using the "Arduino" branding, but allows (and arguably even encourages) informal software and firmware compatibility.

-

The Arduino branding was not formally registered as a trademark in the early days, however. Arduino LLC filed to register the US trademark in April 2009, and it was granted in 2011.

-

At this point, the exact events begin to be harder to verify, but the original group of founders reportedly had a difference of opinion about how to license out hardware production rights to other companies. Wired Italy reports that Martino and Smart Projects resisted the other four founders' plans to "internationalize" production—although it is not clear if that meant that Smart Projects disapproved of licensing out any official hardware manufacturing to other companies, or had some other concern. Heise Online adds that the conflict seemed to be about moving some production to China.

-

What is clear is that Smart Projects filed a petition with the US Patent and Trademark Office (USPTO) in October 2014 asking the USPTO to cancel Arduino LLC's trademark on "Arduino." Then, in November 2014, Smart Projects changed its company's name to Arduino SRL. Somewhere around that time, Martino sold off his ownership stake in Smart Projects SRL and new owner Federico Musto was named CEO.

-

Unsurprisingly, Arduino LLC did not care for the petition to the USPTO and, in January 2015, the company filed a trademark-infringement lawsuit against Arduino SRL. Confusing matters further, the re-branded Arduino SRL has set up its own web site using the domain name arduino.org, which duplicates most of the site features found on the original Arduino site (arduino.cc). That includes both a hardware store and software downloads.

-

Musto, the new CEO of the company now called Arduino SRL, has a bit of a history with Arduino as well. His other manufacturing business had collaborated with Arduino LLC on the design and production of the Arduino Yún, which has received some criticism for including proprietary components.

-

Hackaday has run a two-part series (in February and March) digging into the ins and outs of the dispute, including the suggestion that Arduino LLC's recent release of version 1.6.0 of the Arduino IDE was a move intended to block Arduino SRL from hijacking IDE development. Commenter Paul Stoffregen (who was the author of the Heise story above) noted that Arduino SRL recently created a fork of the Arduino IDE on GitHub.

-

Most recently, Banzi broke his silence about the dispute in a story published at MAKEzine. There, Banzi claims that Martino secretly filed a trademark application on "Arduino" in Italy in 2008 and told none of the other Arduino founders. He also details a series of unpleasant negotiations between the companies, including Smart Projects stopping the royalty payments it had long sent to Arduino LLC for manufacturing devices and re-branding its boards with the Arduino.org URL.

-

Users appear to be stuck in the middle. Banzi says that several retail outlets that claim to be selling "official" Arduino boards are actually paying Arduino SRL, not Arduino LLC, but it is quite difficult to determine which retailers are lined up on which side, since there are (typically) several levels of supplier involved. The two Arduino companies' web sites also disagree about the available hardware, with Arduino.org offering the new Arduino Zero model for sale today and Arduino.cc listing it as "Coming soon."

-

Furthermore, as Hackaday's March story explains, the recently-released Arduino.cc IDE now reports that boards manufactured by Arduino SRL are "uncertified." That warning does not prevent users from programming the other company's hardware, but it will no doubt confuse quite a few users who believe they possess genuine Arduino-manufactured devices.

-

The USPTO page for Arduino SRL's petition notes pre-trial disclosure dates have been set for August and October of 2015 (for Arduino SRL and Arduino LLC, respectively), which suggests that this debate is far from over. Of course, it is always disappointing to observe a falling out between project founders, particularly when the project in question has had such an impact on open-source software and open hardware.

-

One could argue that disputes of this sort are proof that even small projects started among friends need to take legal and intellectual-property issues (such as trademarks) seriously from the very beginning—perhaps Arduino and Smart Projects thought that an informal agreement was all that was necessary in the early days, after all.

-

But, perhaps, once a project becomes profitable, there is simply no way to predict what might happen. Arduino LLC would seem to have a strong case for continual and rigorous use of the "Arduino" trademark, which is the salient point in US trademark law. It could still be a while before the courts rule on either side of that question, however.

-

Comments (5 posted)

- -

Mapping and data mining with QGIS 2.8

-

By Nathan Willis -

March 25, 2015

-

QGIS is a free-software geographic information system (GIS) tool; it provides a unified interface in which users can import, edit, and analyze geographic-oriented information, and it can produce output as varied as printable maps or map-based web services. The project recently made its first update to be designated a long-term release (LTR), and that release is both poised for high-end usage and friendly to newcomers alike.

-

The new release is version 2.8, which was unveiled on March 2. An official change +

The Arduino branding was not formally registered as a trademark in the early days, however. Arduino LLC filed to register the US trademark in April 2009, and it was granted in 2011.

+

At this point, the exact events begin to be harder to verify, but the original group of founders reportedly had a difference of opinion about how to license out hardware production rights to other companies. Wired Italy reports that Martino and Smart Projects resisted the other four founders' plans to "internationalize" production—although it is not clear if that meant that Smart Projects disapproved of licensing out any official hardware manufacturing to other companies, or had some other concern. Heise Online adds that the conflict seemed to be about moving some production to China.

+

What is clear is that Smart Projects filed a petition with the US Patent and Trademark Office (USPTO) in October 2014 asking the USPTO to cancel Arduino LLC's trademark on "Arduino." Then, in November 2014, Smart Projects changed its company's name to Arduino SRL. Somewhere around that time, Martino sold off his ownership stake in Smart Projects SRL and new owner Federico Musto was named CEO.

+

Unsurprisingly, Arduino LLC did not care for the petition to the USPTO and, in January 2015, the company filed a trademark-infringement lawsuit against Arduino SRL. Confusing matters further, the re-branded Arduino SRL has set up its own web site using the domain name arduino.org, which duplicates most of the site features found on the original Arduino site (arduino.cc). That includes both a hardware store and software downloads.

+

Musto, the new CEO of the company now called Arduino SRL, has a bit of a history with Arduino as well. His other manufacturing business had collaborated with Arduino LLC on the design and production of the Arduino Yún, which has received some criticism for including proprietary components.

+

Hackaday has run a two-part series (in February and March) digging into the ins and outs of the dispute, including the suggestion that Arduino LLC's recent release of version 1.6.0 of the Arduino IDE was a move intended to block Arduino SRL from hijacking IDE development. Commenter Paul Stoffregen (who was the author of the Heise story above) noted that Arduino SRL recently created a fork of the Arduino IDE on GitHub.

+

Most recently, Banzi broke his silence about the dispute in a story published at MAKEzine. There, Banzi claims that Martino secretly filed a trademark application on "Arduino" in Italy in 2008 and told none of the other Arduino founders. He also details a series of unpleasant negotiations between the companies, including Smart Projects stopping the royalty payments it had long sent to Arduino LLC for manufacturing devices and re-branding its boards with the Arduino.org URL.

+

Users appear to be stuck in the middle. Banzi says that several retail outlets that claim to be selling "official" Arduino boards are actually paying Arduino SRL, not Arduino LLC, but it is quite difficult to determine which retailers are lined up on which side, since there are (typically) several levels of supplier involved. The two Arduino companies' web sites also disagree about the available hardware, with Arduino.org offering the new Arduino Zero model for sale today and Arduino.cc listing it as "Coming soon."

+

Furthermore, as Hackaday's March story explains, the recently-released Arduino.cc IDE now reports that boards manufactured by Arduino SRL are "uncertified." That warning does not prevent users from programming the other company's hardware, but it will no doubt confuse quite a few users who believe they possess genuine Arduino-manufactured devices.

+

The USPTO page for Arduino SRL's petition notes pre-trial disclosure dates have been set for August and October of 2015 (for Arduino SRL and Arduino LLC, respectively), which suggests that this debate is far from over. Of course, it is always disappointing to observe a falling out between project founders, particularly when the project in question has had such an impact on open-source software and open hardware.

+

One could argue that disputes of this sort are proof that even small projects started among friends need to take legal and intellectual-property issues (such as trademarks) seriously from the very beginning—perhaps Arduino and Smart Projects thought that an informal agreement was all that was necessary in the early days, after all.

+

But, perhaps, once a project becomes profitable, there is simply no way to predict what might happen. Arduino LLC would seem to have a strong case for continual and rigorous use of the "Arduino" trademark, which is the salient point in US trademark law. It could still be a while before the courts rule on either side of that question, however.

+

Comments (5 posted)

+ +

Mapping and data mining with QGIS 2.8

+

By Nathan Willis +
March 25, 2015

+

QGIS is a free-software geographic information system (GIS) tool; it provides a unified interface in which users can import, edit, and analyze geographic-oriented information, and it can produce output as varied as printable maps or map-based web services. The project recently made its first update to be designated a long-term release (LTR), and that release is both poised for high-end usage and friendly to newcomers alike.

+

The new release is version 2.8, which was unveiled on March 2. An official change log is available on the QGIS site, while the release itself was announced primarily through blog posts (such as this post by Anita Graser of the project's steering committee). Downloads are available for a variety of platforms, including packages for Ubuntu, Debian, Fedora, openSUSE, and several other distributions.

-

[QGIS main interface]

As the name might suggest, QGIS is a Qt application; the latest release will, in fact, build on both Qt4 and Qt5, although the binaries released by the project come only in Qt4 form at present. 2.8 has been labeled a long-term release (LTR)—which, in this case, means that the project has committed to providing backported bug fixes for one full calendar year, and that the 2.8.x series is in permanent feature freeze. The goal, according to the change log, is to provide a stable version suitable for businesses and deployments in other large organizations. The change log itself points out that the development of quite a few new features was underwritten by various GIS companies or university groups, which suggests that taking care of these organizations' needs is reaping dividends for the project.

-

For those new to QGIS (or GIS in general), there is a detailed new-user tutorial that provides a thorough walk-through of the data-manipulation, mapping, and analysis functions. Being a new user, I went through the tutorial; although there are a handful of minor differences between QGIS 2.8 and the version used in the text (primarily whether specific features were accessed through a toolbar or right-click menu), on the whole it is well worth the time.

-

QGIS is designed to make short work of importing spatially oriented data sets, mining information from them, and turning the results into a meaningful visualization. Technically speaking, the visualization output is optional: one could simply extract the needed statistics and results and use them to answer some question or, perhaps, publish the massaged data set as a database for others to use.

-

But well-made maps are often the easiest way to illuminate facts about populations, political regions, geography, and many other topics when human comprehension is the goal. QGIS makes importing data from databases, web-mapping services (WMS), and even unwieldy flat-file data dumps a painless experience. It handles converting between a variety of map-referencing systems more or less automatically, and allows the user to focus on finding the useful attributes of the data sets and rendering them on screen.

-

Here be data

-

The significant changes in QGIS 2.8 fall into several categories. There are updates to how QGIS handles the mathematical expressions and queries users can use to filter information out of a data set, improvements to the tools used to explore the on-screen map canvas, and enhancements to the "map composer" used to produce visual output. This is on top of plenty of other under-the-hood improvements, naturally.

-

[QGIS query builder]

In the first category are several updates to the filtering tools used to mine a data set. Generally speaking, each independent data set is added to a QGIS project as its own layer, then transformed with filters to focus in on a specific portion of the original data. For instance, the land-usage statistics for a region might be one layer, while roads and buildings for the same region from OpenStreetMap might be two additional layers. Such filters can be created in several ways: there is a "query builder" that lets the user construct and test expressions on a data layer, then save the results, an SQL console for performing similar queries on a database, and spreadsheet-like editing tools for working directly on data tables.

-

All three have been improved in this release. New are support for if(condition, true, false) conditional statements, a set of operations for geometry primitives (e.g., to test whether regions overlap or lines intersect), and an "integer divide" operation. Users can also add comments to their queries to annotate their code, and there is a new custom +

[QGIS main interface]

As the name might suggest, QGIS is a Qt application; the latest release will, in fact, build on both Qt4 and Qt5, although the binaries released by the project come only in Qt4 form at present. 2.8 has been labeled a long-term release (LTR)—which, in this case, means that the project has committed to providing backported bug fixes for one full calendar year, and that the 2.8.x series is in permanent feature freeze. The goal, according to the change log, is to provide a stable version suitable for businesses and deployments in other large organizations. The change log itself points out that the development of quite a few new features was underwritten by various GIS companies or university groups, which suggests that taking care of these organizations' needs is reaping dividends for the project.

+

For those new to QGIS (or GIS in general), there is a detailed new-user tutorial that provides a thorough walk-through of the data-manipulation, mapping, and analysis functions. Being a new user, I went through the tutorial; although there are a handful of minor differences between QGIS 2.8 and the version used in the text (primarily whether specific features were accessed through a toolbar or right-click menu), on the whole it is well worth the time.

+

QGIS is designed to make short work of importing spatially oriented data sets, mining information from them, and turning the results into a meaningful visualization. Technically speaking, the visualization output is optional: one could simply extract the needed statistics and results and use them to answer some question or, perhaps, publish the massaged data set as a database for others to use.

+

But well-made maps are often the easiest way to illuminate facts about populations, political regions, geography, and many other topics when human comprehension is the goal. QGIS makes importing data from databases, web-mapping services (WMS), and even unwieldy flat-file data dumps a painless experience. It handles converting between a variety of map-referencing systems more or less automatically, and allows the user to focus on finding the useful attributes of the data sets and rendering them on screen.

+

Here be data

+

The significant changes in QGIS 2.8 fall into several categories. There are updates to how QGIS handles the mathematical expressions and queries users can use to filter information out of a data set, improvements to the tools used to explore the on-screen map canvas, and enhancements to the "map composer" used to produce visual output. This is on top of plenty of other under-the-hood improvements, naturally.

+

[QGIS query builder]

In the first category are several updates to the filtering tools used to mine a data set. Generally speaking, each independent data set is added to a QGIS project as its own layer, then transformed with filters to focus in on a specific portion of the original data. For instance, the land-usage statistics for a region might be one layer, while roads and buildings for the same region from OpenStreetMap might be two additional layers. Such filters can be created in several ways: there is a "query builder" that lets the user construct and test expressions on a data layer, then save the results, an SQL console for performing similar queries on a database, and spreadsheet-like editing tools for working directly on data tables.

+

All three have been improved in this release. New are support for if(condition, true, false) conditional statements, a set of operations for geometry primitives (e.g., to test whether regions overlap or lines intersect), and an "integer divide" operation. Users can also add comments to their queries to annotate their code, and there is a new custom function editor for writing Python functions that can be called in mathematical expressions within the query builder.

-

It is also now possible to select only some rows in a table, then perform calculations just on the selection—previously, users would have to extract the rows of interest into a new table first. Similarly, in the SQL editor, the user can highlight a subset of the SQL query and execute it separately, which is no doubt helpful for debugging.

-

There have also been several improvements to the Python and Processing plugins. Users can now drag-and-drop Python scripts onto QGIS and they will be run automatically. Several new analysis algorithms are now available through the Processing interface that were previously Python-only; they include algorithms for generating grids of points or vectors within a region, splitting layers and lines, generating hypsometric +

It is also now possible to select only some rows in a table, then perform calculations just on the selection—previously, users would have to extract the rows of interest into a new table first. Similarly, in the SQL editor, the user can highlight a subset of the SQL query and execute it separately, which is no doubt helpful for debugging.

+

There have also been several improvements to the Python and Processing plugins. Users can now drag-and-drop Python scripts onto QGIS and they will be run automatically. Several new analysis algorithms are now available through the Processing interface that were previously Python-only; they include algorithms for generating grids of points or vectors within a region, splitting layers and lines, generating hypsometric curves, refactoring data sets, and more.

-

Maps in, maps out

-

[QGIS simplify tool]

The process of working with on-screen map data picked up some improvements in the new release as well. Perhaps the most fundamental is that each map layer added to the canvas is now handled in its own thread, so fewer hangs in the user interface are experienced when re-rendering a layer (as happens whenever the user changes the look of points or shapes in a layer). Since remote databases can also be layers, this multi-threaded approach is more resilient against connectivity problems, too. The interface also now supports temporary "scratch" layers that can be used to merge, filter, or simply experiment with a data set, but are not saved when the current project is saved.

-

For working on the canvas itself, polygonal regions can now use raster images (tiled, if necessary) as fill colors, the map itself can be rotated arbitrarily, and objects can be "snapped" to align with items on any layer (not just the current layer). For working with raster image layers (e.g., aerial photographs) or simply creating new geometric shapes by hand, there is a new digitizing tool that can offer assistance by locking lines to specific angles, automatically keeping borders parallel, and other niceties.

-

There is a completely overhauled "simplify" tool that is used to reduce the number of extraneous vertices of a vector layer (thus reducing its size). The old simplify tool provided only a relative "tolerance" setting that did not correspond directly to any units. With the new tool, users can set a simplification threshold in terms of the underlying map units, layer-specific units, pixels, and more—and, in addition, the tool reports how much the simplify operation has reduced the size of the data.

-

[QGIS style editing]

There has also been an effort to present a uniform interface to one of the most important features of the map canvas: the ability to change the symbology used for an item based on some data attribute. The simplest example might be to change the line color of a road based on whether its road-type attribute is "highway," "service road," "residential," or so on. But the same feature is used to automatically highlight layer information based on the filtering and querying functionality discussed above. The new release allows many more map attributes to be controlled by these "data definition" settings, and provides a hard-to-miss button next to each attribute, through which a custom data definition can be set.

-

QGIS's composer module is the tool used to take project data and generate a map that can be used outside of the application (in print, as a static image, or as a layer for MapServer or some other software tool, for example). Consequently, it is not a simple select-and-click-export tool; composing the output can involve a lot of choices about which data to make visible, how (and where) to label it, and how to make it generally accessible.

-

The updated composer in 2.8 now has a full-screen mode and sports several new options for configuring output. For instance, the user now has full control over how map axes are labeled. In previous releases, the grid coordinates of the map could be turned on or off, but the only options were all or nothing. Now, the user can individually choose whether coordinates are displayed on all four sides, and can even choose in which direction vertical text labels will run (so that they can be correctly justified to the edge of the map, for example).

-

There are, as usual, many more changes than there is room to discuss. Some particularly noteworthy improvements include the ability to save and load bookmarks for frequently used data sources (perhaps most useful for databases, web services, and other non-local data) and improvements to QGIS's server module. This module allows one QGIS instance to serve up data accessible to other QGIS applications (for example, to simply team projects). The server can now be extended with Python plugins and the data layers that it serves can be styled with style rules like those used in the desktop interface.

-

QGIS is one of those rare free-software applications that is both powerful enough for high-end work and yet also straightforward to use for the simple tasks that might attract a newcomer to GIS in the first place. The 2.8 release, particularly with its project-wide commitment to long-term support, appears to be an update well worth checking out, whether one needs to create a simple, custom map or to mine a database for obscure geo-referenced meaning.

-

Comments (3 posted)

- -

Development activity in LibreOffice and OpenOffice

-

By Jonathan Corbet -

March 25, 2015

The LibreOffice project was announced with great fanfare in September 2010. Nearly one year later, the OpenOffice.org project (from which LibreOffice was forked) was +

Maps in, maps out

+

[QGIS simplify tool]

The process of working with on-screen map data picked up some improvements in the new release as well. Perhaps the most fundamental is that each map layer added to the canvas is now handled in its own thread, so fewer hangs in the user interface are experienced when re-rendering a layer (as happens whenever the user changes the look of points or shapes in a layer). Since remote databases can also be layers, this multi-threaded approach is more resilient against connectivity problems, too. The interface also now supports temporary "scratch" layers that can be used to merge, filter, or simply experiment with a data set, but are not saved when the current project is saved.

+

For working on the canvas itself, polygonal regions can now use raster images (tiled, if necessary) as fill colors, the map itself can be rotated arbitrarily, and objects can be "snapped" to align with items on any layer (not just the current layer). For working with raster image layers (e.g., aerial photographs) or simply creating new geometric shapes by hand, there is a new digitizing tool that can offer assistance by locking lines to specific angles, automatically keeping borders parallel, and other niceties.

+

There is a completely overhauled "simplify" tool that is used to reduce the number of extraneous vertices of a vector layer (thus reducing its size). The old simplify tool provided only a relative "tolerance" setting that did not correspond directly to any units. With the new tool, users can set a simplification threshold in terms of the underlying map units, layer-specific units, pixels, and more—and, in addition, the tool reports how much the simplify operation has reduced the size of the data.

+

[QGIS style editing]

There has also been an effort to present a uniform interface to one of the most important features of the map canvas: the ability to change the symbology used for an item based on some data attribute. The simplest example might be to change the line color of a road based on whether its road-type attribute is "highway," "service road," "residential," or so on. But the same feature is used to automatically highlight layer information based on the filtering and querying functionality discussed above. The new release allows many more map attributes to be controlled by these "data definition" settings, and provides a hard-to-miss button next to each attribute, through which a custom data definition can be set.

+

QGIS's composer module is the tool used to take project data and generate a map that can be used outside of the application (in print, as a static image, or as a layer for MapServer or some other software tool, for example). Consequently, it is not a simple select-and-click-export tool; composing the output can involve a lot of choices about which data to make visible, how (and where) to label it, and how to make it generally accessible.

+

The updated composer in 2.8 now has a full-screen mode and sports several new options for configuring output. For instance, the user now has full control over how map axes are labeled. In previous releases, the grid coordinates of the map could be turned on or off, but the only options were all or nothing. Now, the user can individually choose whether coordinates are displayed on all four sides, and can even choose in which direction vertical text labels will run (so that they can be correctly justified to the edge of the map, for example).

+

There are, as usual, many more changes than there is room to discuss. Some particularly noteworthy improvements include the ability to save and load bookmarks for frequently used data sources (perhaps most useful for databases, web services, and other non-local data) and improvements to QGIS's server module. This module allows one QGIS instance to serve up data accessible to other QGIS applications (for example, to simply team projects). The server can now be extended with Python plugins and the data layers that it serves can be styled with style rules like those used in the desktop interface.

+

QGIS is one of those rare free-software applications that is both powerful enough for high-end work and yet also straightforward to use for the simple tasks that might attract a newcomer to GIS in the first place. The 2.8 release, particularly with its project-wide commitment to long-term support, appears to be an update well worth checking out, whether one needs to create a simple, custom map or to mine a database for obscure geo-referenced meaning.

+

Comments (3 posted)

+ +

Development activity in LibreOffice and OpenOffice

+

By Jonathan Corbet +
March 25, 2015

The LibreOffice project was announced with great fanfare in September 2010. Nearly one year later, the OpenOffice.org project (from which LibreOffice was forked) was cut loose from Oracle and found a new home as an Apache project. It is fair to say that the rivalry between the two projects in the time since then has been strong. Predictions that one project or the other would fail have not been borne out, but that does not mean that the two projects are equally successful. A look at the two projects' development communities reveals some interesting differences. -

-

Release histories

-

Apache OpenOffice has made two releases in the past year: 4.1 in April 2014 and 4.1.1 (described as "a micro update" in the release announcement) in August. The main feature added during that time would appear to be significantly improved accessibility support.

-

The release history for LibreOffice tells a slightly different story:

- -
-
-

It seems clear that LibreOffice has maintained a rather more frenetic release cadence, generally putting out at least one release per month. The project typically keeps at least two major versions alive at any one time. Most of the releases are of the minor, bug-fix variety, but there have been two major releases in the last year as well.

- -

Development statistics

-

In the one-year period since late March 2014, there have been 381 changesets committed to the OpenOffice Subversion repository. The most active committers are:

- -
- - - -
Most active OpenOffice developers
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
By changesets
Herbert Dürr6316.6%
Jürgen Schmidt             5614.7%
Armin Le Grand5614.7%
Oliver-Rainer Wittmann4612.1%
Tsutomu Uchino338.7%
Kay Schenk277.1%
Pedro Giffuni236.1%
Ariel Constenla-Haile225.8%
Andrea Pescetti143.7%
Steve Yin112.9%
Andre Fischer102.6%
Yuri Dario71.8%
Regina Henschel61.6%
Juan C. Sanz20.5%
Clarence Guo20.5%
Tal Daniel20.5%
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
By changed lines
Jürgen Schmidt             45549988.1%
Andre Fischer261483.8%
Pedro Giffuni231833.4%
Armin Le Grand110181.6%
Juan C. Sanz45820.7%
Oliver-Rainer Wittmann43090.6%
Andrea Pescetti39080.6%
Herbert Dürr28110.4%
Tsutomu Uchino19910.3%
Ariel Constenla-Haile12580.2%
Steve Yin10100.1%
Kay Schenk6160.1%
Regina Henschel4170.1%
Yuri Dario2680.0%
tal160.0%
Clarence Guo110.0%
-

In truth, the above list is not just the most active OpenOffice developers — it is all of them; a total of 16 developers have committed changes to OpenOffice in the last year. Those developers changed 528,000 lines of code, but, as can be seen above, Jürgen Schmidt accounted for the bulk of those changes, which were mostly updates to translation files.

-

The top four developers in the "by changesets" column all work for IBM, so IBM is responsible for a minimum of about 60% of the changes to OpenOffice in the last year.

-

The picture for LibreOffice is just a little bit different; in the same one-year period, the project has committed 22,134 changesets from 268 developers. The most active of these developers were:

- -
- - - -
Most active LibreOffice developers
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
By changesets
Caolán McNamara430719.5%
Stephan Bergmann235110.6%
Miklos Vajna14496.5%
Tor Lillqvist11595.2%
Noel Grandin10644.8%
Markus Mohrhard9354.2%
Michael Stahl9154.1%
Kohei Yoshida7553.4%
Tomaž Vajngerl6583.0%
Thomas Arnhold6192.8%
Jan Holesovsky4662.1%
Eike Rathke4572.1%
Matteo Casalin4422.0%
Bjoern Michaelsen4211.9%
Chris Sherlock3961.8%
David Tardon3861.7%
Julien Nabet3621.6%
Zolnai Tamás3381.5%
Matúš Kukan2561.2%
Robert Antoni Buj Gelonch2311.0%
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
By changed lines
Lionel Elie Mamane24406212.5%
Noel Grandin23871112.2%
Stephan Bergmann1612208.3%
Miklos Vajna1293256.6%
Caolán McNamara975445.0%
Tomaž Vajngerl694043.6%
Tor Lillqvist594983.1%
Laurent Balland-Poirier528022.7%
Markus Mohrhard505092.6%
Kohei Yoshida455142.3%
Chris Sherlock367881.9%
Peter Foley343051.8%
Christian Lohmaier337871.7%
Thomas Arnhold327221.7%
David Tardon216811.1%
David Ostrovsky216201.1%
Jan Holesovsky207921.1%
Valentin Kettner205261.1%
Robert Antoni Buj Gelonch204471.0%
Michael Stahl182160.9%
-

To a first approximation, the top ten companies supporting LibreOffice in the last year are:

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Companies supporting LibreOffice development
(by changesets)
Red Hat841738.0%
Collabora Multimedia653129.5%
(Unknown)512623.2%
(None)14906.7%
Canonical4221.9%
Igalia S.L.800.4%
Ericsson210.1%
Yandex180.1%
FastMail.FM170.1%
SUSE70.0%
-

Development work on LibreOffice is thus concentrated in a small number of companies, though it is rather more spread out than OpenOffice development. It is worth noting that the LibreOffice developers with unknown affiliation, who contributed 23% of the changes, make up 82% of the developer base, so there would appear to be a substantial community of developers contributing from outside the above-listed companies.

- -

Some conclusions

-

Last October, some concerns were raised on the OpenOffice list about the health of that project's community. At the time, Rob Weir shrugged them off as the result of a marketing effort by the LibreOffice crowd. There can be no doubt that the war of words between these two projects has gotten tiresome at times, but, looking at the above numbers, it is hard not to conclude that there is an issue that goes beyond marketing hype here.

-

In the 4½ years since its founding, the LibreOffice project has put together a community with over 250 active developers. There is support from multiple companies and an impressive rate of patches going into the project's repository. The project's ability to sustain nearly monthly releases on two branches is a direct result of that community's work. Swearing at LibreOffice is one of your editor's favorite pastimes, but it seems clear that the project is on a solid footing with a healthy community.

-

OpenOffice, instead, is driven by four developers from a single company — a company that appears to have been deemphasizing OpenOffice work for some time. As a result, the project's commit rate is a fraction of what LibreOffice is able to sustain and releases are relatively rare. As of this writing, the OpenOffice +

+

Release histories

+

Apache OpenOffice has made two releases in the past year: 4.1 in April 2014 and 4.1.1 (described as "a micro update" in the release announcement) in August. The main feature added during that time would appear to be significantly improved accessibility support.

+

The release history for LibreOffice tells a slightly different story:

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ReleaseDate
4.2.3April 2014
4.1.6April 2014
4.2.4May 2014
4.2.5June 2014
4.3July 2014
4.2.6August 2014
4.3.1August 2014
4.3.2September 2014
4.2.7/4.3.3October 2014
4.3.4November 2014
4.2.8December 2014
4.3.5December 2014
4.4January 2015
4.3.6February 2015
4.4.1February 2015
+
+

It seems clear that LibreOffice has maintained a rather more frenetic release cadence, generally putting out at least one release per month. The project typically keeps at least two major versions alive at any one time. Most of the releases are of the minor, bug-fix variety, but there have been two major releases in the last year as well.

+ +

Development statistics

+

In the one-year period since late March 2014, there have been 381 changesets committed to the OpenOffice Subversion repository. The most active committers are:

+ +
+ + + + + + + + + + +
Most active OpenOffice developers
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
By changesets
Herbert Dürr6316.6%
Jürgen Schmidt             5614.7%
Armin Le Grand5614.7%
Oliver-Rainer Wittmann4612.1%
Tsutomu Uchino338.7%
Kay Schenk277.1%
Pedro Giffuni236.1%
Ariel Constenla-Haile225.8%
Andrea Pescetti143.7%
Steve Yin112.9%
Andre Fischer102.6%
Yuri Dario71.8%
Regina Henschel61.6%
Juan C. Sanz20.5%
Clarence Guo20.5%
Tal Daniel20.5%
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
By changed lines
Jürgen Schmidt             45549988.1%
Andre Fischer261483.8%
Pedro Giffuni231833.4%
Armin Le Grand110181.6%
Juan C. Sanz45820.7%
Oliver-Rainer Wittmann43090.6%
Andrea Pescetti39080.6%
Herbert Dürr28110.4%
Tsutomu Uchino19910.3%
Ariel Constenla-Haile12580.2%
Steve Yin10100.1%
Kay Schenk6160.1%
Regina Henschel4170.1%
Yuri Dario2680.0%
tal160.0%
Clarence Guo110.0%
+
+
+

In truth, the above list is not just the most active OpenOffice developers — it is all of them; a total of 16 developers have committed changes to OpenOffice in the last year. Those developers changed 528,000 lines of code, but, as can be seen above, Jürgen Schmidt accounted for the bulk of those changes, which were mostly updates to translation files.

+

The top four developers in the "by changesets" column all work for IBM, so IBM is responsible for a minimum of about 60% of the changes to OpenOffice in the last year.

+

The picture for LibreOffice is just a little bit different; in the same one-year period, the project has committed 22,134 changesets from 268 developers. The most active of these developers were:

+ +
+ + + + + + + + + + +
Most active LibreOffice developers
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
By changesets
Caolán McNamara430719.5%
Stephan Bergmann235110.6%
Miklos Vajna14496.5%
Tor Lillqvist11595.2%
Noel Grandin10644.8%
Markus Mohrhard9354.2%
Michael Stahl9154.1%
Kohei Yoshida7553.4%
Tomaž Vajngerl6583.0%
Thomas Arnhold6192.8%
Jan Holesovsky4662.1%
Eike Rathke4572.1%
Matteo Casalin4422.0%
Bjoern Michaelsen4211.9%
Chris Sherlock3961.8%
David Tardon3861.7%
Julien Nabet3621.6%
Zolnai Tamás3381.5%
Matúš Kukan2561.2%
Robert Antoni Buj Gelonch2311.0%
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
By changed lines
Lionel Elie Mamane24406212.5%
Noel Grandin23871112.2%
Stephan Bergmann1612208.3%
Miklos Vajna1293256.6%
Caolán McNamara975445.0%
Tomaž Vajngerl694043.6%
Tor Lillqvist594983.1%
Laurent Balland-Poirier528022.7%
Markus Mohrhard505092.6%
Kohei Yoshida455142.3%
Chris Sherlock367881.9%
Peter Foley343051.8%
Christian Lohmaier337871.7%
Thomas Arnhold327221.7%
David Tardon216811.1%
David Ostrovsky216201.1%
Jan Holesovsky207921.1%
Valentin Kettner205261.1%
Robert Antoni Buj Gelonch204471.0%
Michael Stahl182160.9%
+
+
+

To a first approximation, the top ten companies supporting LibreOffice in the last year are:

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Companies supporting LibreOffice development
(by changesets)
Red Hat841738.0%
Collabora Multimedia653129.5%
(Unknown)512623.2%
(None)14906.7%
Canonical4221.9%
Igalia S.L.800.4%
Ericsson210.1%
Yandex180.1%
FastMail.FM170.1%
SUSE70.0%
+
+

Development work on LibreOffice is thus concentrated in a small number of companies, though it is rather more spread out than OpenOffice development. It is worth noting that the LibreOffice developers with unknown affiliation, who contributed 23% of the changes, make up 82% of the developer base, so there would appear to be a substantial community of developers contributing from outside the above-listed companies.

+ +

Some conclusions

+

Last October, some concerns were raised on the OpenOffice list about the health of that project's community. At the time, Rob Weir shrugged them off as the result of a marketing effort by the LibreOffice crowd. There can be no doubt that the war of words between these two projects has gotten tiresome at times, but, looking at the above numbers, it is hard not to conclude that there is an issue that goes beyond marketing hype here.

+

In the 4½ years since its founding, the LibreOffice project has put together a community with over 250 active developers. There is support from multiple companies and an impressive rate of patches going into the project's repository. The project's ability to sustain nearly monthly releases on two branches is a direct result of that community's work. Swearing at LibreOffice is one of your editor's favorite pastimes, but it seems clear that the project is on a solid footing with a healthy community.

+

OpenOffice, instead, is driven by four developers from a single company — a company that appears to have been deemphasizing OpenOffice work for some time. As a result, the project's commit rate is a fraction of what LibreOffice is able to sustain and releases are relatively rare. As of this writing, the OpenOffice blog shows no posts in 2015. In the October discussion, Rob said that "the dogs may bark but the caravan moves on." That may be true, but, in this case, the caravan does not appear to be moving with any great speed.

-

Anything can happen in the free-software development world; it is entirely possible that a reinvigorated OpenOffice.org may yet give LibreOffice a run for its money. But something will clearly have to change to bring that future around. As things stand now, it is hard not to conclude that LibreOffice has won the battle for developer participation.

-

Comments (74 posted)

- -

Page editor: Jonathan Corbet -

-

Inside this week's LWN.net Weekly Edition

-
  • Security: Toward secure package downloads; New vulnerabilities in drupal, mozilla, openssl, python-django ...
  • -
  • Kernel: LSFMM coverage: NFS, defragmentation, epoll(), copy offload, and more.
  • -
  • Distributions: A look at Debian's 2015 DPL candidates; Debian, Fedora, ...
  • -
  • Development: A look at GlusterFS; LibreOffice Online; Open sourcing existing code; Secure Boot in Windows 10; ...
  • -
  • Announcements: A Turing award for Michael Stonebraker, Sébastien Jodogne, ReGlue are Free Software Award winners, Kat Walsh joins FSF board of directors, Cyanogen, ...
  • -

Next page: Security>> -

- - - - - - -
\ No newline at end of file +

Anything can happen in the free-software development world; it is entirely possible that a reinvigorated OpenOffice.org may yet give LibreOffice a run for its money. But something will clearly have to change to bring that future around. As things stand now, it is hard not to conclude that LibreOffice has won the battle for developer participation.

+

Comments (74 posted)

+ +

Page editor: Jonathan Corbet +

+

Inside this week's LWN.net Weekly Edition

+
    +
  • Security: Toward secure package downloads; New vulnerabilities in drupal, mozilla, openssl, python-django ...
  • +
  • Kernel: LSFMM coverage: NFS, defragmentation, epoll(), copy offload, and more.
  • +
  • Distributions: A look at Debian's 2015 DPL candidates; Debian, Fedora, ...
  • +
  • Development: A look at GlusterFS; LibreOffice Online; Open sourcing existing code; Secure Boot in Windows 10; ...
  • +
  • Announcements: A Turing award for Michael Stonebraker, Sébastien Jodogne, ReGlue are Free Software Award winners, Kat Walsh joins FSF board of directors, Cyanogen, ...
  • +

Next page: Security>> +

+ + + + + + +
\ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/marketwatch/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/marketwatch/expected-images.json index cfe75d030..cab39a2c1 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/marketwatch/expected-images.json +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/marketwatch/expected-images.json @@ -1,3 +1,5 @@ [ - "http:\/\/s.marketwatch.com\/public\/resources\/MWimages\/MW-GG178_realty_ZG_20180323163027.jpg" -] + "http:\/\/s.marketwatch.com\/public\/resources\/MWimages\/MW-GG178_realty_ZG_20180323163027.jpg", + "https:\/\/ei.marketwatch.com\/Multimedia\/2018\/03\/23\/Photos\/ZH\/MW-GG178_realty_20180323163027_ZH.jpg?uuid=0597cc9a-2ed9-11e8-a272-ac162d7bc1f7", + "https:\/\/i.mktw.net\/_newsimages\/2014_dreds\/andreariquiernew_100.png" +] \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/marketwatch/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/marketwatch/expected-metadata.json index 94f36a271..d603426e4 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/marketwatch/expected-metadata.json +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/marketwatch/expected-metadata.json @@ -2,7 +2,7 @@ "Author": "Andrea Riquier", "Direction": null, "Excerpt": "House prices show no sign of slowing down, according to a closely-watched index out Tuesday.", - "Image": "http://s.marketwatch.com/public/resources/MWimages/MW-GG178_realty_ZG_20180323163027.jpg", + "Image": "http:\/\/s.marketwatch.com\/public\/resources\/MWimages\/MW-GG178_realty_ZG_20180323163027.jpg", "Title": "Home prices are still on fire, Case-Shiller data show", - "SiteName": null -} + "SiteName": "MarketWatch" +} \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/marketwatch/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/marketwatch/expected.html index bd81ab3d7..253125136 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/marketwatch/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/marketwatch/expected.html @@ -1,4 +1,49 @@ -
+
+ + +

Published: Mar 27, 2018 9:00 a.m. ET

+ + + + + +

+ + +

After a lull, San Francisco is back to being one of the top three hottest markets

+

+ +
+ + + + +
+ + + + + +
+

+ Bloomberg News/Landov +

+
A home for sale in Seattle, Wash., one of the nation’s hottest housing markets.
+
+ +
+
+

+ Author photo +

By

+ + + +
+ +
@@ -8,7 +53,7 @@ -

The numbers: The S&P/Case-Shiller national index rose a seasonally adjusted 0.5% in the three-month period ending in January, and was up 6.2% compared to a year before. The 20-city index rose a seasonally adjusted 0.8% for the month, and 6.4% for the year.

What happened: Prices are still on fire. And the West is still the best: Seattle, Las Vegas and San Francisco all notched double-digit yearly price gains. Only one city, Washington, D.C., had a negative monthly reading.

As David Blitzer, chairman of the index committee at S&P Dow Jones Indices, noted in a release, the price gains are all about demand and lack of supply.

“The current months-supply — how many months at the current sales rate would be needed to absorb homes currently for sale — is 3.4; the average since 2000 is 6.0 months, and the high in July 2010 was 11.9,” Blitzer wrote. “Currently, the homeowner vacancy rate is 1.6% compared to an average of 2.1% since 2000; it peaked in 2010 at 2.7%. Despite limited supplies, rising prices and higher mortgage rates, affordability is not a concern.”

Relatively affordable housing is cold comfort to many would-be home buyers who simply can’t find anything to buy.

Read: Most house hunters have been searching for 3 months or more

Big picture: Economists had forecast a 0.7% monthly increase, and a 6.2% 12-month increase, for the 20-city index. As MarketWatch has reported, most housing analysts have argued that the ongoing price gains in housing can’t last — and yet they have so far.

Metro Monthly change 12-month change
Atlanta 0.7% 6.5%
Boston 0.2% 5.3%
Charlotte 0.4% 6.0%
Chicago 0.0% 2.4%
Cleveland 0.0% 3.5%
Dallas 0.2% 6.9%
Denver 0.7% 7.6%
Detroit 0.1% 7.6%
Las Vegas 0.6% 11.1%
Los Angeles 0.6% 7.6%
Miami 0.6% 4.0%
Minneapolis 0.1% 5.9%
New York 0.0% 5.2%
Phoenix 0.3% 5.9%
Portland 0.4% 7.1%
San Diego 0.8% 7.4%
San Francisco 0.4% 10.2%
Seattle 0.7% 12.9%
Tampa 0.4% 6.7%
Washington -0.4% 2.4%

Read: Mortgage rates edge up even as trade war worries loom ahead

+

The numbers: The S&P/Case-Shiller national index rose a seasonally adjusted 0.5% in the three-month period ending in January, and was up 6.2% compared to a year before. The 20-city index rose a seasonally adjusted 0.8% for the month, and 6.4% for the year.

What happened: Prices are still on fire. And the West is still the best: Seattle, Las Vegas and San Francisco all notched double-digit yearly price gains. Only one city, Washington, D.C., had a negative monthly reading.

As David Blitzer, chairman of the index committee at S&P Dow Jones Indices, noted in a release, the price gains are all about demand and lack of supply.

“The current months-supply — how many months at the current sales rate would be needed to absorb homes currently for sale — is 3.4; the average since 2000 is 6.0 months, and the high in July 2010 was 11.9,” Blitzer wrote. “Currently, the homeowner vacancy rate is 1.6% compared to an average of 2.1% since 2000; it peaked in 2010 at 2.7%. Despite limited supplies, rising prices and higher mortgage rates, affordability is not a concern.”

Relatively affordable housing is cold comfort to many would-be home buyers who simply can’t find anything to buy.

Read: Most house hunters have been searching for 3 months or more

Big picture: Economists had forecast a 0.7% monthly increase, and a 6.2% 12-month increase, for the 20-city index. As MarketWatch has reported, most housing analysts have argued that the ongoing price gains in housing can’t last — and yet they have so far.

Metro Monthly change 12-month change
Atlanta 0.7% 6.5%
Boston 0.2% 5.3%
Charlotte 0.4% 6.0%
Chicago 0.0% 2.4%
Cleveland 0.0% 3.5%
Dallas 0.2% 6.9%
Denver 0.7% 7.6%
Detroit 0.1% 7.6%
Las Vegas 0.6% 11.1%
Los Angeles 0.6% 7.6%
Miami 0.6% 4.0%
Minneapolis 0.1% 5.9%
New York 0.0% 5.2%
Phoenix 0.3% 5.9%
Portland 0.4% 7.1%
San Diego 0.8% 7.4%
San Francisco 0.4% 10.2%
Seattle 0.7% 12.9%
Tampa 0.4% 6.7%
Washington -0.4% 2.4%

Read: Mortgage rates edge up even as trade war worries loom ahead

@@ -44,4 +89,10 @@ -
\ No newline at end of file +
+
+
+ + + + \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-1/expected.html index 679d8b75b..eb623275e 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-1/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-1/expected.html @@ -1,54 +1,61 @@
-

Open Journalism Project:

-

Better Student Journalism

+ +

Better Student Journalism

-

We pushed out the first version of the Open Journalism site in January. Our goal is for the +

We pushed out the first version of the Open Journalism site in January. Our goal is for the site to be a place to teach students what they should know about journalism on the web. It should be fun too.

-

Topics like mapping, security, command - line tools, and open source are +

Topics like mapping, security, command + line tools, and open source are all concepts that should be made more accessible, and should be easily understood at a basic level by all journalists. We’re focusing on students because we know student journalism well, and we believe that teaching maturing journalists about the web will provide them with an important lens to view the world with. This is how we got to where we are now.

-

Circa 2011

-

In late 2011 I sat in the design room of our university’s student newsroom +

Circa 2011

+

In late 2011 I sat in the design room of our university’s student newsroom with some of the other editors: Kate Hudson, Brent Rose, and Nicholas Maronese. I was working as the photo editor then—something I loved doing. I was very happy travelling and photographing people while listening to their stories.

-

Photography was my lucky way of experiencing the many types of people +

Photography was my lucky way of experiencing the many types of people my generation seemed to avoid, as well as many the public spends too much time discussing. One of my habits as a photographer was scouring sites like Flickr to see how others could frame the world in ways I hadn’t previously considered.

-
+
+
-

-
topleftpixel.com

I started discovering beautiful things the web could do with images: +

+

+
topleftpixel.com
+
+

I started discovering beautiful things the web could do with images: things not possible with print. Just as every generation revolts against walking in the previous generations shoes, I found myself questioning the expectations that I came up against as a photo editor. In our newsroom the expectations were built from an outdated information world. We were expected to fill old shoes.

-

So we sat in our student newsroom—not very happy with what we were doing. +

So we sat in our student newsroom—not very happy with what we were doing. Our weekly newspaper had remained essentially unchanged for 40+ years. Each editorial position had the same requirement every year. The big change happened in the 80s when the paper started using colour. We’d also stumbled into having a website, but it was updated just once a week with the release of the newspaper.

-

Information had changed form, but the student newsroom hadn’t, and it +

Information had changed form, but the student newsroom hadn’t, and it was becoming harder to romanticize the dusty newsprint smell coming from the shoes we were handed down from previous generations of editors. It was, we were told, all part of “becoming a journalist.”

-
+
+
-

-

We don’t know what we don’t know

-

We spent much of the rest of the school year asking “what should we be +

+

+
+

We don’t know what we don’t know

+

We spent much of the rest of the school year asking “what should we be doing in the newsroom?”, which mainly led us to ask “how do we use the web to tell stories?” It was a straightforward question that led to many more questions about the web: something we knew little about. Out in the @@ -56,12 +63,12 @@ in a dying print world. They wore the same design of shoes that we were supposed to fill. Being pushed to repeat old, failing strategies and blocked from trying something new scared us.

-

We had questions, so we started doing some research. We talked with student +

We had questions, so we started doing some research. We talked with student newsrooms in Canada and the United States, and filled too many Google Doc files with notes. Looking at the notes now, they scream of fear. We annotated our notes with naive solutions, often involving scrambled and immature odysseys into the future of online journalism.

-

There was a lot we didn’t know. We didn’t know how to build a mobile app. +

There was a lot we didn’t know. We didn’t know how to build a mobile app. We didn’t know if we should build a mobile app. We didn’t know how to run a server. We didn’t know where to go to find a server. @@ -69,122 +76,141 @@ We didn’t know how people used the web to read news. We didn’t know what news should be on the web. If news is just information, what does that even look like?

-

We asked these questions to many students at other papers to get a consensus +

We asked these questions to many students at other papers to get a consensus of what had worked and what hadn’t. They reported similar questions and fears about the web but followed with “print advertising is keeping us afloat so we can’t abandon it”.

-

In other words, we knew that we should be building a newer pair of shoes, +

In other words, we knew that we should be building a newer pair of shoes, but we didn’t know what the function of the shoes should be.

-

Common problems in student newsrooms (2011)

-

Our questioning of other student journalists in 15 student newsrooms brought +

Common problems in student newsrooms (2011)

+

Our questioning of other student journalists in 15 student newsrooms brought up a few repeating issues.

-
  • Lack of mentorship
  • -
  • A news process that lacked consideration of the web
  • -
  • No editor/position specific to the web
  • -
  • Little exposure to many of the cool projects being put together by professional +
      +
    • Lack of mentorship
    • +
    • A news process that lacked consideration of the web
    • +
    • No editor/position specific to the web
    • +
    • Little exposure to many of the cool projects being put together by professional newsrooms
    • -
    • Lack of diverse skills within the newsroom. Writers made up 95% of the +
    • Lack of diverse skills within the newsroom. Writers made up 95% of the personnel. Students with other skills were not sought because journalism was seen as “a career with words.” The other 5% were designers, designing words on computers, for print.
    • -
    • Not enough discussion between the business side and web efforts
    • -
    +
  • Not enough discussion between the business side and web efforts
  • +
+
+
-

-
From our 2011 research

Common problems in student newsrooms (2013)

-

Two years later, we went back and looked at what had changed. We talked +

+

+
From our 2011 research
+ +

Common problems in student newsrooms (2013)

+

Two years later, we went back and looked at what had changed. We talked to a dozen more newsrooms and weren’t surprised by our findings.

-
  • Still no mentorship or link to professional newsrooms building stories +
      +
    • Still no mentorship or link to professional newsrooms building stories for the web
    • -
    • Very little control of website and technology
    • -
    • The lack of exposure that student journalists have to interactive storytelling. +
    • Very little control of website and technology
    • +
    • The lack of exposure that student journalists have to interactive storytelling. While some newsrooms are in touch with what’s happening with the web and journalism, there still exists a huge gap between the student newsroom and its professional counterpart
    • -
    • No time in the current news development cycle for student newsrooms to +
    • No time in the current news development cycle for student newsrooms to experiment with the web
    • -
    • Lack of skill diversity (specifically coding, interaction design, and +
    • Lack of skill diversity (specifically coding, interaction design, and statistics)
    • -
    • Overly restricted access to student website technology. Changes are primarily +
    • Overly restricted access to student website technology. Changes are primarily visual rather than functional.
    • -
    • Significantly reduced print production of many papers
    • -
    • Computers aren’t set up for experimenting with software and code, and +
    • Significantly reduced print production of many papers
    • +
    • Computers aren’t set up for experimenting with software and code, and often locked down
    • -

    Newsrooms have traditionally been covered in copies of The New York Times +

+

Newsrooms have traditionally been covered in copies of The New York Times or Globe and Mail. Instead newsrooms should try spend at 20 minutes each week going over the coolest/weirdest online storytelling in an effort to - expose each other to what is possible. “Hey, what has the New York Times R&D lab been up to this week?

-

Instead of having computers that are locked down, try setting aside a + expose each other to what is possible. “Hey, what has the New York Times R&D lab been up to this week?

+

Instead of having computers that are locked down, try setting aside a few office computers that allow students to play and “break”, or encourage editors to buy their own Macbooks so they’re always able to practice with code and new tools on their own.

-

From all this we realized that changing a student newsroom is difficult. +

From all this we realized that changing a student newsroom is difficult. It takes patience. It requires that the business and editorial departments of the student newsroom be on the same (web)page. The shoes of the future must be different from the shoes we were given.

-

We need to rethink how long the new shoe design will be valid. It’s more +

We need to rethink how long the new shoe design will be valid. It’s more important that we focus on the process behind making footwear than on actually creating a specific shoe. We shouldn’t be building a shoe to last 40 years. Our footwear design process will allow us to change and adapt as technology evolves. The media landscape will change, so having a newsroom that can change with it will be critical.

-

We are building a shoe machine, not a shoe. +

We are building a shoe machine, not a shoe.

-

A train or light at the end of the tunnel: are student newsrooms changing for the better?

+

A train or light at the end of the tunnel: are student newsrooms changing for the better?

-

In our 2013 research we found that almost 50% of student newsrooms had +

In our 2013 research we found that almost 50% of student newsrooms had created roles specifically for the web. This sounds great, but is still problematic in its current state.

-
+
+
-

+

+

We designed many of these slides to help explain to ourselves what we were doing -

When a newsroom decides to create a position for the web, it’s often with + + +

When a newsroom decides to create a position for the web, it’s often with the intent of having content flow steadily from writers onto the web. This is a big improvement from just uploading stories to the web whenever there is a print issue. However…

-
  1. The handoff -

    Problems arise because web editors are given roles that absolve the rest +
      +
    1. The handoff +
      Problems arise because web editors are given roles that absolve the rest of the editors from thinking about the web. All editors should be involved in the process of story development for the web. While it’s a good idea to have one specific editor manage the website, contributors and editors should all play with and learn about the web. Instead of “can you make a computer do XYZ for me?”, we should be saying “can you show me how to make a computer do XYZ?”
    2. -
    3. Not just social media

      A +
    4. Not just social media
      A web editor could do much more than simply being in charge of the social media accounts for the student paper. Their responsibility could include teaching all other editors to be listening to what’s happening online. The web editor can take advantage of live information to change how the student newsroom reports news in real time.
    5. -
    6. Web (interactive) editor

      The +
    7. Web (interactive) editor
      The goal of having a web editor should be for someone to build and tell stories that take full advantage of the web as their medium. Too often the web’s interactivity is not considered when developing the story. The web then ends up as a resting place for print words.
    8. -

    Editors at newsrooms are still figuring out how to convince writers of +

+

Editors at newsrooms are still figuring out how to convince writers of the benefit to having their content online. There’s still a stronger draw to writers seeing their name in print than on the web. Showing writers that their stories can be told in new ways to larger audiences is a convincing argument that the web is a starting point for telling a story, not its graveyard.

-

When everyone in the newsroom approaches their website with the intention +

When everyone in the newsroom approaches their website with the intention of using it to explore the web as a medium, they all start to ask “what is possible?” and “what can be done?” You can’t expect students to think in terms of the web if it’s treated as a place for print words to hang out on a web page.

-

We’re OK with this problem, if we see newsrooms continue to take small +

We’re OK with this problem, if we see newsrooms continue to take small steps towards having all their editors involved in the stories for the web.

-
+
+
-

+

+

The current Open Journalism site was a few years in the making. This was - an original launch page we use in 2012

What we know

-
  • New process -

    Our rough research has told us newsrooms need to be reorganized. This + an original launch page we use in 2012 + +

    What we know

    +
      +
    • New process +
      Our rough research has told us newsrooms need to be reorganized. This includes every part of the newsroom’s workflow: from where a story and its information comes from, to thinking of every word, pixel, and interaction the reader will have with your stories. If I was a photo editor that wanted @@ -196,16 +222,16 @@ “digital manifestos”, it’s about being curious enough that you’ll want to to continue experimenting with your process until you’ve found one that fits your newsroom’s needs.
    • -
    • More (remote) mentorship -

      Lack of mentorship is still a big problem. Google’s fellowship program is great. The fact that it +
    • More (remote) mentorship +
      Lack of mentorship is still a big problem. Google’s fellowship program is great. The fact that it only caters to United States students isn’t. There are only a handful of internships in Canada where students interested in journalism can get experience writing code and building interactive stories. We’re OK with this for now, as we expect internships and mentorship over the next 5 years between professional newsrooms and student newsrooms will only increase. It’s worth noting that some of that mentorship will likely be done remotely.
    • -
    • Changing a newsroom culture -

      Skill diversity needs to change. We encourage every student newsroom we +
    • Changing a newsroom culture +
      Skill diversity needs to change. We encourage every student newsroom we talk to, to start building a partnership with their school’s Computer Science department. It will take some work, but you’ll find there are many CS undergrads that love playing with web technologies, and using data to tell stories. @@ -215,71 +241,83 @@ who love statistics and exploring data. Getting students who are amazing at design, data, code, words, and images into one room is one of the coolest experience I’ve had. Everyone benefits from a more diverse newsroom.
    • -

    What we don’t know

    -
    • Sharing curiosity for the web -

      We don’t know how to best teach students about the web. It’s not efficient +
    +

    What we don’t know

    +
      +
    • Sharing curiosity for the web +
      We don’t know how to best teach students about the web. It’s not efficient for us to teach coding classes. We do go into newsrooms and get them running their first code exercises, but if someone wants to learn to program, we can only provide the initial push and curiosity. We will be trying out “labs” with a few schools next school year to hopefully get a better idea of how to teach students about the web.
    • -
    • Business -

      We don’t know how to convince the business side of student papers that +
    • Business +
      We don’t know how to convince the business side of student papers that they should invest in the web. At the very least we’re able to explain that having students graduate with their current skill set is painful in the current job market.
    • -
    • The future -

      We don’t know what journalism or the web will be like in 10 years, but +
    • The future +
      We don’t know what journalism or the web will be like in 10 years, but we can start encouraging students to keep an open mind about the skills they’ll need. We’re less interested in preparing students for the current newsroom climate, than we are in teaching students to have the ability to learn new tools quickly as they come and go.
    • -
    -

    What we’re trying to share with others

    -
    • A concise guide to building stories for the web -

      There are too many options to get started. We hope to provide an opinionated +
    +
    +

    What we’re trying to share with others

    +
      +
    • A concise guide to building stories for the web +
      There are too many options to get started. We hope to provide an opinionated guide that follows both our experiences, research, and observations from trying to teach our peers.
    • -

    Student newsrooms don’t have investors to please. Student newsrooms can +

+

Student newsrooms don’t have investors to please. Student newsrooms can change their website every week if they want to try a new design or interaction. As long as students start treating the web as a different medium, and start building stories around that idea, then we’ll know we’re moving forward.

-

A note to professional news orgs

-

We’re also asking professional newsrooms to be more open about their process +

A note to professional news orgs

+

We’re also asking professional newsrooms to be more open about their process of developing stories for the web. You play a big part in this. This means writing about it, and sharing code. We need to start building a bridge between student journalism and professional newsrooms.

-
+
+
-

-
2012

This is a start

-

We going to continue slowly growing the content on Open Journalism. We still consider this the beta version, +

+

+
2012
+
+

This is a start

+

We going to continue slowly growing the content on Open Journalism. We still consider this the beta version, but expect to polish it, and beef up the content for a real launch at the beginning of the summer.

-

We expect to have more original tutorials as well as the beginnings of +

We expect to have more original tutorials as well as the beginnings of what a curriculum may look like that a student newsroom can adopt to start guiding their transition to become a web first newsroom. We’re also going - to be working with the Queen’s Journal and - The Ubysseynext school year to better understand how to make the student + to be working with the Queen’s Journal and + The Ubysseynext school year to better understand how to make the student newsroom a place for experimenting with telling stories on the web. If this sound like a good idea in your newsroom, we’re still looking to add 1 more school.

-

We’re trying out some new shoes. And while they’re not self-lacing, and +

We’re trying out some new shoes. And while they’re not self-lacing, and smell a bit different, we feel lacing up a new pair of kicks can change a lot.

-
+
+
-

+

+

-

Let’s talk. Let’s listen. + +

Let’s talk. Let’s listen.

-

We’re still in the early stages of what this project will look like, so if you want to help or have thoughts, let’s talk. +

We’re still in the early stages of what this project will look like, so if you want to help or have thoughts, let’s talk.

-

pippin@pippinlee.com +

pippin@pippinlee.com

-

This isn’t supposed to be a +

This isn’t supposed to be a manifesto™© we just think it’s pretty cool to share what we’ve learned so far, and hope you’ll do the same. We’re all in this together.

diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-2/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-2/expected.html index 222b09dbc..34eeab36f 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-2/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-2/expected.html @@ -1 +1 @@ -

Words need defenders.

On Behalf of “Literally”

You either are a “literally” abuser or know of one. If you’re anything like me, hearing the word “literally” used incorrectly causes a little piece of your soul to whither and die. Of course I do not mean that literally, I mean that figuratively. An abuser would have said: “Every time a person uses that word, a piece of my soul literally withers and dies.” Which is terribly, horribly wrong.

For whatever bizarre reason, people feel the need to use literally as a sort of verbal crutch. They use it to emphasize a point, which is silly because they’re already using an analogy or a metaphor to illustrate said point. For example: “Ugh, I literally tore the house apart looking for my remote control!” No, you literally did not tear apart your house, because it’s still standing. If you’d just told me you “tore your house apart” searching for your remote, I would’ve understood what you meant. No need to add “literally” to the sentence.

Maybe I should define literally.

Literally means actually. When you say something literally happened, you’re describing the scene or situation as it actually happened.

So you should only use literally when you mean it. It should not be used in hyperbole. Example: “That was so funny I literally cried.” Which is possible. Some things are funny enough to elicit tears. Note the example stops with “literally cried.” You cannot literally cry your eyes out. The joke wasn’t so funny your eyes popped out of their sockets.

When in Doubt, Leave it Out

“I’m so hungry I could eat a horse,” means you’re hungry. You don’t need to say “I’m so hungry I could literally eat a horse.” Because you can’t do that in one sitting, I don’t care how big your stomach is.

“That play was so funny I laughed my head off,” illustrates the play was amusing. You don’t need to say you literally laughed your head off, because then your head would be on the ground and you wouldn’t be able to speak, much less laugh.

“I drove so fast my car was flying,” we get your point: you were speeding. But your car is never going fast enough to fly, so don’t say your car was literally flying.

Insecurities?

Maybe no one believed a story you told as a child, and you felt the need to prove that it actually happened. No really, mom, I literally climbed the tree. In efforts to prove truth, you used literally to describe something real, however outlandish it seemed. Whatever the reason, now your overuse of literally has become a habit.

Hard Habit to Break?

Abusing literally isn’t as bad a smoking, but it’s still an unhealthy habit (I mean that figuratively). Help is required in order to break it.

This is my version of an intervention for literally abusers. I’m not sure how else to do it other than in writing. I know this makes me sound like a know-it-all, and I accept that. But there’s no excuse other than blatant ignorance to misuse the word “literally.” So just stop it.

Don’t say “Courtney, this post is so snobbish it literally burned up my computer.” Because nothing is that snobbish that it causes computers to combust. Or: “Courtney, your head is so big it literally cannot get through the door.” Because it can, unless it’s one of those tiny doors from Alice in Wonderland and I need to eat a mushroom to make my whole body smaller.

No One’s Perfect

And I’m not saying I am. I’m trying to restore meaning to a word that’s lost meaning. I’m standing up for literally. It’s a good word when used correctly. People are butchering it and destroying it every day (figuratively speaking) and the massacre needs to stop. Just as there’s a coalition of people against the use of certain fonts (like Comic Sans and Papyrus), so should there be a coalition of people against the abuse of literally.

Saying it to Irritate?

Do you misuse the word “literally” just to annoy your know-it-all or grammar police friends/acquaintances/total strangers? If so, why? Doing so would be like me going outside when it’s freezing, wearing nothing but a pair of shorts and t-shirt in hopes of making you cold by just looking at me. Who suffers more?

Graphical Representation

Matthew Inman of “The Oatmeal” wrote a comic about literally. Abusers and defenders alike should check it out. It’s clear this whole craze about literally is driving a lot of us nuts. You literally abusers are killing off pieces of our souls. You must be stopped, or the world will be lost to meaninglessness forever. Figuratively speaking.

\ No newline at end of file +

Words need defenders.

On Behalf of “Literally”

You either are a “literally” abuser or know of one. If you’re anything like me, hearing the word “literally” used incorrectly causes a little piece of your soul to whither and die. Of course I do not mean that literally, I mean that figuratively. An abuser would have said: “Every time a person uses that word, a piece of my soul literally withers and dies.” Which is terribly, horribly wrong.

For whatever bizarre reason, people feel the need to use literally as a sort of verbal crutch. They use it to emphasize a point, which is silly because they’re already using an analogy or a metaphor to illustrate said point. For example: “Ugh, I literally tore the house apart looking for my remote control!” No, you literally did not tear apart your house, because it’s still standing. If you’d just told me you “tore your house apart” searching for your remote, I would’ve understood what you meant. No need to add “literally” to the sentence.

Maybe I should define literally.

Literally means actually. When you say something literally happened, you’re describing the scene or situation as it actually happened.

So you should only use literally when you mean it. It should not be used in hyperbole. Example: “That was so funny I literally cried.” Which is possible. Some things are funny enough to elicit tears. Note the example stops with “literally cried.” You cannot literally cry your eyes out. The joke wasn’t so funny your eyes popped out of their sockets.

When in Doubt, Leave it Out

“I’m so hungry I could eat a horse,” means you’re hungry. You don’t need to say “I’m so hungry I could literally eat a horse.” Because you can’t do that in one sitting, I don’t care how big your stomach is.

“That play was so funny I laughed my head off,” illustrates the play was amusing. You don’t need to say you literally laughed your head off, because then your head would be on the ground and you wouldn’t be able to speak, much less laugh.

“I drove so fast my car was flying,” we get your point: you were speeding. But your car is never going fast enough to fly, so don’t say your car was literally flying.

Insecurities?

Maybe no one believed a story you told as a child, and you felt the need to prove that it actually happened. No really, mom, I literally climbed the tree. In efforts to prove truth, you used literally to describe something real, however outlandish it seemed. Whatever the reason, now your overuse of literally has become a habit.

Hard Habit to Break?

Abusing literally isn’t as bad a smoking, but it’s still an unhealthy habit (I mean that figuratively). Help is required in order to break it.

This is my version of an intervention for literally abusers. I’m not sure how else to do it other than in writing. I know this makes me sound like a know-it-all, and I accept that. But there’s no excuse other than blatant ignorance to misuse the word “literally.” So just stop it.

Don’t say “Courtney, this post is so snobbish it literally burned up my computer.” Because nothing is that snobbish that it causes computers to combust. Or: “Courtney, your head is so big it literally cannot get through the door.” Because it can, unless it’s one of those tiny doors from Alice in Wonderland and I need to eat a mushroom to make my whole body smaller.

No One’s Perfect

And I’m not saying I am. I’m trying to restore meaning to a word that’s lost meaning. I’m standing up for literally. It’s a good word when used correctly. People are butchering it and destroying it every day (figuratively speaking) and the massacre needs to stop. Just as there’s a coalition of people against the use of certain fonts (like Comic Sans and Papyrus), so should there be a coalition of people against the abuse of literally.

Saying it to Irritate?

Do you misuse the word “literally” just to annoy your know-it-all or grammar police friends/acquaintances/total strangers? If so, why? Doing so would be like me going outside when it’s freezing, wearing nothing but a pair of shorts and t-shirt in hopes of making you cold by just looking at me. Who suffers more?

Graphical Representation

Matthew Inman of “The Oatmeal” wrote a comic about literally. Abusers and defenders alike should check it out. It’s clear this whole craze about literally is driving a lot of us nuts. You literally abusers are killing off pieces of our souls. You must be stopped, or the world will be lost to meaninglessness forever. Figuratively speaking.

\ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-3/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-3/expected-images.json index 54ac86669..250efd7c8 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-3/expected-images.json +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-3/expected-images.json @@ -1,3 +1,7 @@ [ - "https:\/\/cdn-images-1.medium.com\/max\/1200\/1*kbPh7V97eyRodSOw2-ALDw.png" + "https:\/\/miro.medium.com\/max\/398\/1*kbPh7V97eyRodSOw2-ALDw.png", + "https:\/\/miro.medium.com\/fit\/c\/96\/96\/0*qPHQu8WqsC6cV_ud.jpg", + "https:\/\/miro.medium.com\/max\/796\/1*kbPh7V97eyRodSOw2-ALDw.png", + "https:\/\/miro.medium.com\/max\/1388\/1*Fpb2Bvdx7Q-688vdm-NdkQ.png", + "https:\/\/miro.medium.com\/max\/616\/1*lvOySry5gHHJfGU_bQXrzA.png" ] \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-3/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-3/expected-metadata.json index 59ef2043d..cf74b9534 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-3/expected-metadata.json +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-3/expected-metadata.json @@ -1,8 +1,8 @@ { "Author": "John C. Welch", "Direction": null, - "Excerpt": "How to get shanked doing what people say they want", - "Image": "https:\/\/cdn-images-1.medium.com\/max\/1200\/1*kbPh7V97eyRodSOw2-ALDw.png", - "Title": "Samantha and The Great Big Lie", + "Excerpt": "(EDIT: removed the link to Samantha\u2019s post, because the arments and the grubers and the rest of The Deck Clique got what they wanted: a non-proper person driven off the internet lightly capped with a\u2026", + "Image": "https:\/\/miro.medium.com\/max\/398\/1*kbPh7V97eyRodSOw2-ALDw.png", + "Title": "Samantha and The Great Big Lie - John C. Welch - Medium", "SiteName": "Medium" -} +} \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-3/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-3/expected.html index f1c311e75..0a32b38ba 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-3/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-3/expected.html @@ -1,226 +1,688 @@ -
-
+
- -

How to get shanked doing what people say they want

-
don’t preach to me

Mr. integrity
-

(EDIT: removed the link to Samantha’s post, because the arments and the grubers and the rest of The Deck Clique got what they wanted: a non-proper person driven off the internet lightly capped with a dusting of transphobia along the way, all totally okay because the ends justify the means, and it’s okay when “good” people do it.)

-

First, I need to say something about this article: the reason I’m writing it infuriates me. Worse than installing CS 3 or Acrobat 7 ever did, and the former inspired comparisons to fecophile porn. I’m actually too mad to cuss. Well, not completely, but in this case, I don’t think the people I’m mad at are worth the creativity I try to put into profanity. This is about a brownfield of hypocrisy and viciously deliberate mischaracterization that “shame” cannot even come close to the shame those behind it should feel.

-

Now, read this post by Samantha Bielefeld: The Elephant in the Room. First, it is a well-written critical piece that raises a few points in a calm, rational, nonconfrontational fashion, exactly the kind of things the pushers of The Great Big Lie say we need more of, as opposed to the screaming that is the norm in such cases.

-

…sorry, I should explain “The Great Big Lie”. There are several, but in this case, our specific instance of “The Great Big Lie” is about criticism. Over and over, you hear from the very people I am not going to be nice to in this that we need “better” criticsm. Instead of rage and anger, volume and vitriol, we need in-depth rational criticism, that isn’t personal or ad hominem. That it should focus on points, not people.

-

That, readers, is “The Big Lie”. It is a lie so big that if one ponders the reality of it, as I am going to, one wonders why anyone would believe it. It is a lie and it is one we should stop telling.

-
-
-
-
-
-

Samantha’s points (I assume you read it, for you are smart people who know the importance of such things) are fairly clear:

-
  1. With the release of Overcast 2.0, a product Samantha actually likes, Marco Arment moved to a patronage model that will probably be successful for him.
  2. -
  3. Arment’s insistence that “anyone can do this” while technically true, (anyone can in fact, implement this pricing model), also implies that “anyone” can have the kind of success that a developer with Marco’s history, financial status, and deep ties to the Apple News Web is expected to have. This is silly.
  4. -
  5. Marco Arment occupies a fairly unique position in the Apple universe, (gained by hard work and no small talent), and because of that, benefits from a set of privileges that a new developer or even one that has been around for a long time, but isn’t, well, Marco, not only don’t have, but have little chance of attaining anytime soon.
  6. -
  7. Marco has earned his success and is entitled to the benefits and privileges it brings, but he seems rather blind to all of that, and seems to still imagine himself as “two guys in a garage”. This is just not correct.
  8. -
  9. In addition, the benefits and privileges of the above ensure that by releasing Overcast 2 as a free app, with patronage pricing, he has, if not gutted, severely hurt the ability of folks actually selling their apps for an up-front price of not free to continue doing so. This has the effect of accelerating the “race to the bottom” in the podcast listening app segment, which hurts devs who cannot afford to work on a “I don’t really need this money, so whatever you feel like sending is okay” model.
  10. -

None of this is incorrect. None of this is an ad hominem attack in any way. It is just pointing out that a developer of Arment’s stature and status lives in a very different world than someone in East Frog Balls, Arkansas trying to make a living off of App sales. Our dev in EFB doesn’t have the main sites on the Apple web falling all over themselves to review their app the way that Arment does. They’re not friends with the people being The Loop, Daring Fireball, SixColors, iMore, The Mac Observer, etc., yadda.

-

So, our hero, in a fit of well-meaning ignorance writes this piece (posted this morning, 14 Oct. 15) and of course, the response and any criticisms are just as reasonable and thoughtful.

-

If you really believe that, you are the most preciously ignorant person in the world, and can I have your seriously charmed life.

-
-
-
-
-
-

The response, from all quarters, including Marco, someone who is so sensitive to criticism that the word “useless” is enough to shut him down, who blocked a friend of mine for the high crime of pointing out that his review of podcasting mics centered around higher priced gear and ignored folks without the scratch, who might not be ready for such things, is, in a single word, disgusting. Vomitous even.

-

It’s an hours-long dogpile that beggars even my imagination, and I can imagine almost anything. Seriously, it’s all there in Samantha’s Twitter Feed. From what I can tell, she’s understandably shocked over it. I however was not. This one comment in her feed made me smile (warning, this wanders a bit…er…LOT. Twitter timelines are not easy to put together):

-
I can see why you have some reservations about publishing it, but my gut feeling is that he would take it better than Nilay.
-

Oh honey, bless your sweet, ignorant heart. Marco is one of the biggest pushers of The Big Lie, and one of the reasons it is such a lie.

-

But it gets better. First, you have the “hey, Marco earned his status!” lot. A valid point, and one Bielefeld explicitly acknowledges, here:

-
From his ground floor involvement in Tumblr (for which he is now a millionaire), to the creation and sale of a wildly successful app called Instapaper, he has become a household name in technology minded circles. It is this extensive time spent in the spotlight, the huge following on Twitter, and dedicated listeners of his weekly aired Accidental Tech Podcast, that has granted him the freedom to break from seeking revenue in more traditional manners.
-

and here:

-
I’m not knocking his success, he has put effort into his line of work, and has built his own life.
-

and here:

-
He has earned his time in the spotlight, and it’s only natural for him to take advantage of it.
-

But still, you get the people telling her something she already acknowledge:

-
I don’t think he’s blind. he’s worked to where he has gotten and has had failures like everyone else.
-

Thank you for restating something in the article. To the person who wrote it.

-

In the original article, Samantha talked about the money Marco makes from his podcast. She based that on the numbers provided by ATP in terms of sponsorship rates and the number of current sponsors the podcast has. Is this going to yield perfect numbers? No. But the numbers you get from it will at least be reasonable, or should be unless the published sponsorship rates are just fantasy, and you’re stupid for taking them seriously.

-

At first, she went with a simple formula:

-
$4K x 3 per episode = $12K x 52 weeks / 3 hosts splitting it.
-

That’s not someone making shit up, right? Rather quickly, someone pointed out that she’d made an error in how she calculated it:

-
That’s $4k per ad, no? So more like $12–16k per episode.
-

She’d already realized her mistake and fixed it.

-
which is actually wrong, and I’m correcting now. $4,000 per sponsor, per episode! So, $210,000 per year.
-

Again, this is based on publicly available data the only kind someone not part of ATP or a close friend of Arment has access to. So while her numbers may be wrong, if they are, there’s no way for her to know that. She’s basing her opinion on actual available data. Which is sadly rare.

-

This becomes a huge flashpoint. You name a reason to attack her over this, people do. No really. For example, she’s not calculating his income taxes correctly:

-
especially since it isn’t his only source of income thus, not an indicator of his marginal inc. tax bracket.
-
thus, guessing net income is more haphazard than stating approx. gross income.
-

Ye Gods. She’s not doing his taxes for him, her point is invalid?

-

Then there’s the people who seem to have not read anything past what other people are telling them:

-
Not sure what to make of your Marco piece, to be honest. You mention his fame, whatever, but what’s the main idea here?
-

Just how spoon-fed do you have to be? Have you no teeth?

-

Of course, Marco jumps in, and predictably, he’s snippy:

-
If you’re going to speak in precise absolutes, it’s best to first ensure that you’re correct.
-

If you’re going to be like that, it’s best to provide better data. Don’t get snippy when someone is going off the only data available, and is clearly open to revising based on better data.

-

Then Marco’s friends/fans get into it:

-
I really don’t understand why it’s anyone’s business
-

Samantha is trying to qualify for sainthood at this point:

-
It isn’t really, it was a way of putting his income in context in regards to his ability to gamble with Overcast.
-

Again, she’s trying to drag people back to her actual point, but no one is going to play. The storm has begun. Then we get people who are just spouting nonsense:

-
Why is that only relevant for him? It’s a pretty weird metric,especially since his apps aren’t free.
-

Wha?? Overcast 2 is absolutely free. Samantha points this out:

-
His app is free, that’s what sparked the article to begin with.
-

The response is literally a parallel to “How can there be global warming if it snowed today in my town?”

-
If it’s free, how have I paid for it? Twice?
-

She is still trying:

-
You paid $4.99 to unlock functionality in Overcast 1.0 and you chose to support him with no additional functionality in 2.0
-

He is having none of it. IT SNOWED! SNOWWWWWWW!

-
Yes. That’s not free. Free is when you choose not to make money. And that can be weaponized. But that’s not what Overcast does.
-

She however, is relentless:

-
No, it’s still free. You can choose to support it, you are required to pay $4.99 for Pocket Casts. Totally different model.
-

Dude seems to give up. (Note: allllll the people bagging on her are men. All of them. Mansplaining like hell. And I’d bet every one of them considers themselves a feminist.)

-

We get another guy trying to push the narrative she’s punishing him for his success, which is just…it’s stupid, okay? Stupid.

-
It also wasn’t my point in writing my piece today, but it seems to be everyone’s focus.
-

(UNDERSTATEMENT OF THE YEAR)

-
I think the focus should be more on that fact that while it’s difficult, Marco spent years building his audience.
-
It doesn’t matter what he makes it how he charges. If the audience be earned is willing to pay for it, awesome.
-

She tries, oh lord, she tries:

-
To assert that he isn’t doing anything any other dev couldn’t, is wrong. It’s successful because it’s Marco.
-

But no, HE KNOWS HER POINT BETTER THAN SHE DOES:

-
No, it’s successful because he busted his ass to make it so. It’s like any other business. He grew it.
-

Christ. This is like a field of strawmen. Stupid ones. Very stupid ones.

-

One guy tries to blame it all on Apple, another in a string of Wha??? moments:

-
the appropriate context is Apple’s App Store policies. Other devs aren’t Marco’s responsibility
-

Seriously? Dude, are you even trying to talk about what Samantha actually wrote? At this point, Samantha is clearly mystified at the entire thing:

-
Why has the conversation suddenly turned to focus on nothing more than ATP sponsorship income?
-

Because it’s a nit they can pick and allows them to ignore everything you wrote. That’s the only reason.

-

One guy is “confused”:

-
I see. He does have clout, so are you saying he’s too modest in how he sees himself as a dev?
-
Yes. He can’t be equated to the vast majority of other developers. Like calling Gruber, “just another blogger”.
-
Alright, that’s fair. I was just confused by the $ and fame angle at first.
-

Samantha’s point centers on the benefits Marco gains via his fame and background. HOW DO YOU NOT MENTION THAT? HOW IS THAT CONFUSING?

-

People of course are telling her it’s her fault for mentioning a salient fact at all:

-
Why has the conversation suddenly turned to focus on nothing more than ATP sponsorship income?
-
Maybe because you went there with your article?
-
As a way of rationalizing his ability to gamble with the potential for Overcast to generate income…not the norm at all.
-

Of course, had she not brought up those important points, she’d have been bagged on for “not providing proof”. Lose some, lose more. By now, she’s had enough and she just deletes all mention of it. Understandable, but sad she was bullied into doing that.

-

Yes, bullied. That’s all this is. Bullying. She didn’t lie, cheat, or exaagerate. If her numbers were wrong, they weren’t wrong in a way she had any ability to do anything about. But there’s blood in the water, and the comments and attacks get worse:

-
Because you decided to start a conversation about someone else’s personal shit. You started this war.
-

War. THIS. IS. WAR.

-

This is a bunch of nerds attacking someone for reasoned, calm, polite criticism of their friend/idol. Samantha is politely pushing back a bit:

-
That doesn’t explain why every other part of my article is being pushed aside.
-

She’s right. This is all nonsense. This is people ignoring her article completely, just looking for things to attack so it can be dismissed. It’s tribalism at its purest.

-

Then some of the other annointed get into it, including Jason Snell in one of the most spectactular displays of “I have special knowledge you can’t be expected to have, therefore you are totally off base and wrong, even though there’s no way for you to know this” I’ve seen in a while. Jason:

-
You should never use an ad rate card to estimate ad revenue from any media product ever.
-
I learned this when I started working for a magazine — rate cards are mostly fiction, like prices on new cars
-

How…exactly…in the name of whatever deity Jason may believe in…is Samantha or anyone not “in the biz” supposed to know this. Also, what exactly does a magazine on paper like Macworld have to do with sponsorships for a podcast? I have done podcasts that were sponsored, and I can retaliate with “we charged what the rate card said we did. Checkmate Elitests!

-

Samantha basically abases herself at his feet:

-
I understand my mistake, and it’s unfortunate that it has completely diluted the point of my article.
-

I think she should have told him where and how to stuff that nonsense, but she’s a nicer person than I am. Also, it’s appropriate that Jason’s twitter avatar has its nose in the air. This is some rank snobbery. It’s disgusting and if anyone pulled that on him, Jason would be very upset. But hey, one cannot criticize The Marco without getting pushback. By “pushback”, I mean “an unrelenting fecal flood”.

-

Her only mistake was criticizing one of the Kool Kids. Folks, if you criticize anyone in The Deck Clique, or their friends, expect the same thing, regardless of tone or point.

-

Another App Dev, seemingly unable to parse Samantha’s words, needs more explanation:

-
so just looking over your mentions, I’m curious what exactly was your main point? Ignoring the podcast income bits.
-

Oh wait, he didn’t even read the article. Good on you, Dev Guy, good. on. you. Still, she plays nice with someone who didn’t even read her article:

-
That a typical unknown developer can’t depend on patronage to generate revenue, and charging for apps will become a negative.
-

Marco comes back of course, and now basically accuses her of lying about other devs talking to her and supporting her point:

-
How many actual developers did you hear from, really? Funny how almost nobody wants to give a (real) name on these accusations.
-

Really? You’re going to do that? “There’s no name, so I don’t think it’s a real person.” Just…what’s the Joe Welch quote from the McCarthy hearings?

-
Let us not assassinate this lad further, Senator. You’ve done enough. Have you no sense of decency, sir? At long last, have you left no sense of decency?
-

That is what this is at this point: character assasination because she said something critical of A Popular Person. It’s disgusting. Depressing and disgusting. No one, none of these people have seriously discussed her point, heck, it looks like they barely bothered to read it, if they did at all.

-

Marco starts getting really petty with her (no big shock) and Samantha finally starts pushing back:

-
Glad to see you be the bigger person and ignore the mindset of so many developers not relating to you, good for you!
-

That of course, is what caused Marco to question the validity, if not the existence of her sources. (Funny how anonymous sources are totes okay when they convenience Marco et al, and work for oh, Apple, but when they are inconvenient? Ha! PROVIDE ME PROOF YOU INTEMPERATE WOMAN!)

-

Make no mistake, there’s some sexist shit going on here. Every tweet I’ve quoted was authored by a guy.

-

Of course, Marco has to play the “I’ve been around longer than you” card with this bon mot:

-
Yup, before you existed!
-

Really dude? I mean, I’m sorry about the penis, but really?

-

Mind you, when the criticism isn’t just bizarrely stupid, Samantha reacts the way Marco and his ilk claim they would to (if they ever got any valid criticism. Which clearly is impossible):

-
Not to get into the middle of this, but “income” is not the term you’re looking for. “Revenue” is.
-
lol. Noted.
-
And I wasn’t intending to be a dick, just a lot of people hear/say “income” when they intend “revenue”, and then discussion …
-
… gets derailed by a jedi handwave of “Expenses”. But outside of charitable donation, it is all directly related.
-
haha. Thank you for the clarification.
-

Note to Marco and the other…whatever they are…that is how one reacts to that kind of criticism. With a bit of humor and self-deprecation. You should try it sometime. For real, not just in your heads or conversations in Irish Pubs in S.F.

-

But now, the door has been cracked, and the cheap shots come out:

-
@testflight_app: Don’t worry guys, we process @marcoarment’s apps in direct proportion to his megabucks earnings. #fairelephant
-

(Note: testflight_app is a parody account. Please do not mess with the actual testflight folks. They are still cool.)

-

Or this…conversation:

-
- - +

John C. Welch +

+ +
+

+ How to get shanked doing what people say they want +

+
+

+ don’t preach to me
+ Mr. integrity +

+
+

+ (EDIT: removed the link to Samantha’s post, because the arments and the grubers and the rest of The Deck Clique got what they wanted: a non-proper person driven off the internet lightly capped with a dusting of transphobia along the way, all totally okay because the ends justify the means, and it’s okay when “good” people do it.) +

+

+ First, I need to say something about this article: the reason I’m writing it infuriates me. Worse than installing CS 3 or Acrobat 7 ever did, and the former inspired comparisons to fecophile porn. I’m actually too mad to cuss. Well, not completely, but in this case, I don’t think the people I’m mad at are worth the creativity I try to put into profanity. This is about a brownfield of hypocrisy and viciously deliberate mischaracterization that “shame” cannot even come close to the shame those behind it should feel. +

+

+ Now, read this post by Samantha Bielefeld: The Elephant in the Room. First, it is a well-written critical piece that raises a few points in a calm, rational, nonconfrontational fashion, exactly the kind of things the pushers of The Great Big Lie say we need more of, as opposed to the screaming that is the norm in such cases. +

+

+ …sorry, I should explain “The Great Big Lie”. There are several, but in this case, our specific instance of “The Great Big Lie” is about criticism. Over and over, you hear from the very people I am not going to be nice to in this that we need “better” criticsm. Instead of rage and anger, volume and vitriol, we need in-depth rational criticism, that isn’t personal or ad hominem. That it should focus on points, not people. +

+

+ That, readers, is “The Big Lie”. It is a lie so big that if one ponders the reality of it, as I am going to, one wonders why anyone would believe it. It is a lie and it is one we should stop telling. +

+
+

+ Samantha’s points (I assume you read it, for you are smart people who know the importance of such things) are fairly clear: +

+
    +
  1. With the release of Overcast 2.0, a product Samantha actually likes, Marco Arment moved to a patronage model that will probably be successful for him. +
  2. +
  3. Arment’s insistence that “anyone can do this” while technically true, (anyone can in fact, implement this pricing model), also implies that “anyone” can have the kind of success that a developer with Marco’s history, financial status, and deep ties to the Apple News Web is expected to have. This is silly. +
  4. +
  5. Marco Arment occupies a fairly unique position in the Apple universe, (gained by hard work and no small talent), and because of that, benefits from a set of privileges that a new developer or even one that has been around for a long time, but isn’t, well, Marco, not only don’t have, but have little chance of attaining anytime soon. +
  6. +
  7. Marco has earned his success and is entitled to the benefits and privileges it brings, but he seems rather blind to all of that, and seems to still imagine himself as “two guys in a garage”. This is just not correct. +
  8. +
  9. In addition, the benefits and privileges of the above ensure that by releasing Overcast 2 as a free app, with patronage pricing, he has, if not gutted, severely hurt the ability of folks actually selling their apps for an up-front price of not free to continue doing so. This has the effect of accelerating the “race to the bottom” in the podcast listening app segment, which hurts devs who cannot afford to work on a “I don’t really need this money, so whatever you feel like sending is okay” model. +
  10. +
+

+ None of this is incorrect. None of this is an ad hominem attack in any way. It is just pointing out that a developer of Arment’s stature and status lives in a very different world than someone in East Frog Balls, Arkansas trying to make a living off of App sales. Our dev in EFB doesn’t have the main sites on the Apple web falling all over themselves to review their app the way that Arment does. They’re not friends with the people being The Loop, Daring Fireball, SixColors, iMore, The Mac Observer, etc., yadda. +

+

+ So, our hero, in a fit of well-meaning ignorance writes this piece (posted this morning, 14 Oct. 15) and of course, the response and any criticisms are just as reasonable and thoughtful. +

+

+ If you really believe that, you are the most preciously ignorant person in the world, and can I have your seriously charmed life. +

+
+

+ The response, from all quarters, including Marco, someone who is so sensitive to criticism that the word “useless” is enough to shut him down, who blocked a friend of mine for the high crime of pointing out that his review of podcasting mics centered around higher priced gear and ignored folks without the scratch, who might not be ready for such things, is, in a single word, disgusting. Vomitous even. +

+

+ It’s an hours-long dogpile that beggars even my imagination, and I can imagine almost anything. Seriously, it’s all there in Samantha’s Twitter Feed. From what I can tell, she’s understandably shocked over it. I however was not. This one comment in her feed made me smile (warning, this wanders a bit…er…LOT. Twitter timelines are not easy to put together): +

+
+

+ I can see why you have some reservations about publishing it, but my gut feeling is that he would take it better than Nilay. +

+
+

+ Oh honey, bless your sweet, ignorant heart. Marco is one of the biggest pushers of The Big Lie, and one of the reasons it is such a lie. +

+

+ But it gets better. First, you have the “hey, Marco earned his status!” lot. A valid point, and one Bielefeld explicitly acknowledges, here: +

+
+

+ From his ground floor involvement in Tumblr (for which he is now a millionaire), to the creation and sale of a wildly successful app called Instapaper, he has become a household name in technology minded circles. It is this extensive time spent in the spotlight, the huge following on Twitter, and dedicated listeners of his weekly aired Accidental Tech Podcast, that has granted him the freedom to break from seeking revenue in more traditional manners. +

+
+

+ and here: +

+
+

+ I’m not knocking his success, he has put effort into his line of work, and has built his own life. +

+
+

+ and here: +

+
+

+ He has earned his time in the spotlight, and it’s only natural for him to take advantage of it. +

+
+

+ But still, you get the people telling her something she already acknowledge: +

+
+

+ I don’t think he’s blind. he’s worked to where he has gotten and has had failures like everyone else. +

+
+

+ Thank you for restating something in the article. To the person who wrote it. +

+

+ In the original article, Samantha talked about the money Marco makes from his podcast. She based that on the numbers provided by ATP in terms of sponsorship rates and the number of current sponsors the podcast has. Is this going to yield perfect numbers? No. But the numbers you get from it will at least be reasonable, or should be unless the published sponsorship rates are just fantasy, and you’re stupid for taking them seriously. +

+

+ At first, she went with a simple formula: +

+
+

+ $4K x 3 per episode = $12K x 52 weeks / 3 hosts splitting it. +

+
+

+ That’s not someone making shit up, right? Rather quickly, someone pointed out that she’d made an error in how she calculated it: +

+
+

+ That’s $4k per ad, no? So more like $12–16k per episode. +

+
+

+ She’d already realized her mistake and fixed it. +

+
+

+ which is actually wrong, and I’m correcting now. $4,000 per sponsor, per episode! So, $210,000 per year. +

+
+

+ Again, this is based on publicly available data the only kind someone not part of ATP or a close friend of Arment has access to. So while her numbers may be wrong, if they are, there’s no way for her to know that. She’s basing her opinion on actual available data. Which is sadly rare. +

+

+ This becomes a huge flashpoint. You name a reason to attack her over this, people do. No really. For example, she’s not calculating his income taxes correctly: +

+
+

+ especially since it isn’t his only source of income thus, not an indicator of his marginal inc. tax bracket. +

+

+ thus, guessing net income is more haphazard than stating approx. gross income. +

+
+

+ Ye Gods. She’s not doing his taxes for him, her point is invalid? +

+

+ Then there’s the people who seem to have not read anything past what other people are telling them: +

+
+

+ Not sure what to make of your Marco piece, to be honest. You mention his fame, whatever, but what’s the main idea here? +

+
+

+ Just how spoon-fed do you have to be? Have you no teeth? +

+

+ Of course, Marco jumps in, and predictably, he’s snippy: +

+
+

+ If you’re going to speak in precise absolutes, it’s best to first ensure that you’re correct. +

+
+

+ If you’re going to be like that, it’s best to provide better data. Don’t get snippy when someone is going off the only data available, and is clearly open to revising based on better data. +

+

+ Then Marco’s friends/fans get into it: +

+
+

+ I really don’t understand why it’s anyone’s business +

+
+

+ Samantha is trying to qualify for sainthood at this point: +

+
+

+ It isn’t really, it was a way of putting his income in context in regards to his ability to gamble with Overcast. +

+
+

+ Again, she’s trying to drag people back to her actual point, but no one is going to play. The storm has begun. Then we get people who are just spouting nonsense: +

+
+

+ Why is that only relevant for him? It’s a pretty weird metric,especially since his apps aren’t free. +

+
+

+ Wha?? Overcast 2 is absolutely free. Samantha points this out: +

+
+

+ His app is free, that’s what sparked the article to begin with. +

+
+

+ The response is literally a parallel to “How can there be global warming if it snowed today in my town?” +

+
+

+ If it’s free, how have I paid for it? Twice? +

+
+

+ She is still trying: +

+
+

+ You paid $4.99 to unlock functionality in Overcast 1.0 and you chose to support him with no additional functionality in 2.0 +

+
+

+ He is having none of it. IT SNOWED! SNOWWWWWWW! +

+
+

+ Yes. That’s not free. Free is when you choose not to make money. And that can be weaponized. But that’s not what Overcast does. +

+
+

+ She however, is relentless: +

+
+

+ No, it’s still free. You can choose to support it, you are required to pay $4.99 for Pocket Casts. Totally different model. +

+
+

+ Dude seems to give up. (Note: allllll the people bagging on her are men. All of them. Mansplaining like hell. And I’d bet every one of them considers themselves a feminist.) +

+

+ We get another guy trying to push the narrative she’s punishing him for his success, which is just…it’s stupid, okay? Stupid. +

+
+

+ It also wasn’t my point in writing my piece today, but it seems to be everyone’s focus. +

+
+

+ (UNDERSTATEMENT OF THE YEAR) +

+
+

+ I think the focus should be more on that fact that while it’s difficult, Marco spent years building his audience. +

+

+ It doesn’t matter what he makes it how he charges. If the audience be earned is willing to pay for it, awesome. +

+
+

+ She tries, oh lord, she tries: +

+
+

+ To assert that he isn’t doing anything any other dev couldn’t, is wrong. It’s successful because it’s Marco. +

+
+

+ But no, HE KNOWS HER POINT BETTER THAN SHE DOES: +

+
+

+ No, it’s successful because he busted his ass to make it so. It’s like any other business. He grew it. +

+
+

+ Christ. This is like a field of strawmen. Stupid ones. Very stupid ones. +

+

+ One guy tries to blame it all on Apple, another in a string of Wha??? moments: +

+
+

+ the appropriate context is Apple’s App Store policies. Other devs aren’t Marco’s responsibility +

+
+

+ Seriously? Dude, are you even trying to talk about what Samantha actually wrote? At this point, Samantha is clearly mystified at the entire thing: +

+
+

+ Why has the conversation suddenly turned to focus on nothing more than ATP sponsorship income? +

+
+

+ Because it’s a nit they can pick and allows them to ignore everything you wrote. That’s the only reason. +

+

+ One guy is “confused”: +

+
+

+ I see. He does have clout, so are you saying he’s too modest in how he sees himself as a dev? +

+

+ Yes. He can’t be equated to the vast majority of other developers. Like calling Gruber, “just another blogger”. +

+

+ Alright, that’s fair. I was just confused by the $ and fame angle at first. +

+
+

+ Samantha’s point centers on the benefits Marco gains via his fame and background. HOW DO YOU NOT MENTION THAT? HOW IS THAT CONFUSING? +

+

+ People of course are telling her it’s her fault for mentioning a salient fact at all: +

+
+

+ Why has the conversation suddenly turned to focus on nothing more than ATP sponsorship income? +

+

+ Maybe because you went there with your article? +

+

+ As a way of rationalizing his ability to gamble with the potential for Overcast to generate income…not the norm at all. +

+
+

+ Of course, had she not brought up those important points, she’d have been bagged on for “not providing proof”. Lose some, lose more. By now, she’s had enough and she just deletes all mention of it. Understandable, but sad she was bullied into doing that. +

+

+ Yes, bullied. That’s all this is. Bullying. She didn’t lie, cheat, or exaagerate. If her numbers were wrong, they weren’t wrong in a way she had any ability to do anything about. But there’s blood in the water, and the comments and attacks get worse: +

+
+

+ Because you decided to start a conversation about someone else’s personal shit. You started this war. +

+
+

+ War. THIS. IS. WAR. +

+

+ This is a bunch of nerds attacking someone for reasoned, calm, polite criticism of their friend/idol. Samantha is politely pushing back a bit: +

+
+

+ That doesn’t explain why every other part of my article is being pushed aside. +

+
+

+ She’s right. This is all nonsense. This is people ignoring her article completely, just looking for things to attack so it can be dismissed. It’s tribalism at its purest. +

+

+ Then some of the other annointed get into it, including Jason Snell in one of the most spectactular displays of “I have special knowledge you can’t be expected to have, therefore you are totally off base and wrong, even though there’s no way for you to know this” I’ve seen in a while. Jason: +

+
+

+ You should never use an ad rate card to estimate ad revenue from any media product ever. +

+

+ I learned this when I started working for a magazine — rate cards are mostly fiction, like prices on new cars +

+
+

+ How…exactly…in the name of whatever deity Jason may believe in…is Samantha or anyone not “in the biz” supposed to know this. Also, what exactly does a magazine on paper like Macworld have to do with sponsorships for a podcast? I have done podcasts that were sponsored, and I can retaliate with “we charged what the rate card said we did. Checkmate Elitests!” +

+

+ Samantha basically abases herself at his feet: +

+
+

+ I understand my mistake, and it’s unfortunate that it has completely diluted the point of my article. +

+
+

+ I think she should have told him where and how to stuff that nonsense, but she’s a nicer person than I am. Also, it’s appropriate that Jason’s twitter avatar has its nose in the air. This is some rank snobbery. It’s disgusting and if anyone pulled that on him, Jason would be very upset. But hey, one cannot criticize The Marco without getting pushback. By “pushback”, I mean “an unrelenting fecal flood”. +

+

+ Her only mistake was criticizing one of the Kool Kids. Folks, if you criticize anyone in The Deck Clique, or their friends, expect the same thing, regardless of tone or point. +

+

+ Another App Dev, seemingly unable to parse Samantha’s words, needs more explanation: +

+
+

+ so just looking over your mentions, I’m curious what exactly was your main point? Ignoring the podcast income bits. +

+
+

+ Oh wait, he didn’t even read the article. Good on you, Dev Guy, good. on. you. Still, she plays nice with someone who didn’t even read her article: +

+
+

+ That a typical unknown developer can’t depend on patronage to generate revenue, and charging for apps will become a negative. +

+
+

+ Marco comes back of course, and now basically accuses her of lying about other devs talking to her and supporting her point: +

+
+

+ How many actual developers did you hear from, really? Funny how almost nobody wants to give a (real) name on these accusations. +

+
+

+ Really? You’re going to do that? “There’s no name, so I don’t think it’s a real person.” Just…what’s the Joe Welch quote from the McCarthy hearings? +

+
+

+ Let us not assassinate this lad further, Senator. You’ve done enough. Have you no sense of decency, sir? At long last, have you left no sense of decency? +

+
+

+ That is what this is at this point: character assasination because she said something critical of A Popular Person. It’s disgusting. Depressing and disgusting. No one, none of these people have seriously discussed her point, heck, it looks like they barely bothered to read it, if they did at all. +

+

+ Marco starts getting really petty with her (no big shock) and Samantha finally starts pushing back: +

+
+

+ Glad to see you be the bigger person and ignore the mindset of so many developers not relating to you, good for you! +

+
+

+ That of course, is what caused Marco to question the validity, if not the existence of her sources. (Funny how anonymous sources are totes okay when they convenience Marco et al, and work for oh, Apple, but when they are inconvenient? Ha! PROVIDE ME PROOF YOU INTEMPERATE WOMAN!) +

+

+ Make no mistake, there’s some sexist shit going on here. Every tweet I’ve quoted was authored by a guy. +

+

+ Of course, Marco has to play the “I’ve been around longer than you” card with this bon mot: +

+
+

+ Yup, before you existed! +

+
+

+ Really dude? I mean, I’m sorry about the penis, but really? +

+

+ Mind you, when the criticism isn’t just bizarrely stupid, Samantha reacts the way Marco and his ilk claim they would to (if they ever got any valid criticism. Which clearly is impossible): +

+
+

+ Not to get into the middle of this, but “income” is not the term you’re looking for. “Revenue” is. +

+

+ lol. Noted. +

+

+ And I wasn’t intending to be a dick, just a lot of people hear/say “income” when they intend “revenue”, and then discussion … +

+

+ … gets derailed by a jedi handwave of “Expenses”. But outside of charitable donation, it is all directly related. +

+

+ haha. Thank you for the clarification. +

+
+

+ Note to Marco and the other…whatever they are…that is how one reacts to that kind of criticism. With a bit of humor and self-deprecation. You should try it sometime. For real, not just in your heads or conversations in Irish Pubs in S.F. +

+

+ But now, the door has been cracked, and the cheap shots come out: +

+
+

+ @testflight_app: Don’t worry guys, we process @marcoarment’s apps in direct proportion to his megabucks earnings. #fairelephant +

+
+

+ (Note: testflight_app is a parody account. Please do not mess with the actual testflight folks. They are still cool.) +

+

+ Or this…conversation: +

+
+
+

Image for post +

-

Good job guys. Good job. Defend the tribe. Attack the other. Frederico attempts to recover from his stunning display of demeaning douchery: ‏@viticci: @s_bielefeld I don’t know if it’s an Italian thing, but counting other people’s money is especially weird for me. IMO, bad move in the post.

-

Samantha is clearly sick of his crap: ‏@s_bielefeld: @viticci That’s what I’m referring to, the mistake of ever having mentioned it. So, now, Marco can ignore the bigger issue and go on living.

-

Good for her. There’s being patient and being roadkill.

-

Samantha does put the call out for her sources to maybe let her use their names:

-
From all of you I heard from earlier, anyone care to go on record?
-

My good friend, The Angry Drunk points out the obvious problem:

-
Nobody’s going to go on record when they count on Marco’s friends for their PR.
-

This is true. Again, the sites that are Friends of Marco:

-

Daring Fireball

-

The Loop

-

SixColors

-

iMore

-

MacStories

-

A few others, but I want this post to end one day.

-

You piss that crew off, and given how petty rather a few of them have demonstrated they are, good luck on getting any kind of notice from them.

-

Of course, the idea this could happen is just craycray:

-
@KevinColeman .@Angry_Drunk @s_bielefeld @marcoarment Wow, you guys are veering right into crazy conspiracy theory territory. #JetFuelCantMeltSteelBeams
-

Yeah. Because a mature person like Marco would never do anything like that.

-

Of course, the real point on this is starting to happen:

-
you’re getting a lot of heat now but happy you are writing things that stir up the community. Hope you continue to be a voice!
-
I doubt I will.
-

See, they’ve done their job. Mess with the bull, you get the horns. Maybe you should find another thing to write about, this isn’t a good place for you. Great job y’all.

-

Some people aren’t even pretending. They’re just in full strawman mode:

-
@timkeller: Unfair to begrudge a person for leveraging past success, especially when that success is earned. No ‘luck’ involved.
-
@s_bielefeld: @timkeller I plainly stated that I don’t hold his doing this against him. Way to twist words.
-

I think she’s earned her anger at this point.

-

Don’t worry, Marco knows what the real problem is: most devs just suck —

-
- - +
+

+ Good job guys. Good job. Defend the tribe. Attack the other. Frederico attempts to recover from his stunning display of demeaning douchery: ‏@viticci: @s_bielefeld I don’t know if it’s an Italian thing, but counting other people’s money is especially weird for me. IMO, bad move in the post. +

+

+ Samantha is clearly sick of his crap: ‏@s_bielefeld: @viticci That’s what I’m referring to, the mistake of ever having mentioned it. So, now, Marco can ignore the bigger issue and go on living. +

+

+ Good for her. There’s being patient and being roadkill. +

+

+ Samantha does put the call out for her sources to maybe let her use their names: +

+
+

+ From all of you I heard from earlier, anyone care to go on record? +

+
+

+ My good friend, The Angry Drunk points out the obvious problem: +

+
+

+ Nobody’s going to go on record when they count on Marco’s friends for their PR. +

+
+

+ This is true. Again, the sites that are Friends of Marco: +

+

+ Daring Fireball +

+

+ The Loop +

+

+ SixColors +

+

+ iMore +

+

+ MacStories +

+

+ A few others, but I want this post to end one day. +

+

+ You piss that crew off, and given how petty rather a few of them have demonstrated they are, good luck on getting any kind of notice from them. +

+

+ Of course, the idea this could happen is just craycray: +

+
+

+ @KevinColeman .@Angry_Drunk @s_bielefeld @marcoarment Wow, you guys are veering right into crazy conspiracy theory territory. #JetFuelCantMeltSteelBeams +

+
+

+ Yeah. Because a mature person like Marco would never do anything like that. +

+

+ Of course, the real point on this is starting to happen: +

+
+

+ you’re getting a lot of heat now but happy you are writing things that stir up the community. Hope you continue to be a voice! +

+

+ I doubt I will. +

+
+

+ See, they’ve done their job. Mess with the bull, you get the horns. Maybe you should find another thing to write about, this isn’t a good place for you. Great job y’all. +

+

+ Some people aren’t even pretending. They’re just in full strawman mode: +

+
+

+ @timkeller: Unfair to begrudge a person for leveraging past success, especially when that success is earned. No ‘luck’ involved. +

+

+ @s_bielefeld: @timkeller I plainly stated that I don’t hold his doing this against him. Way to twist words. +

+
+

+ I think she’s earned her anger at this point. +

+

+ Don’t worry, Marco knows what the real problem is: most devs just suck — +

+
+
+

Image for post +

-

I have a saying that applies in this case: don’t place your head so far up your nethers that you go full Klein Bottle. Marco has gone full Klein Bottle. (To be correct, he went FKB some years ago.)

-

There are some bright spots. My favorite is when Building Twenty points out the real elephant in the room:

-
@BuildingTwenty: Both @s_bielefeld & I wrote similar critiques of @marcoarment’s pricing model yet the Internet pilloried only the woman. Who’d have guessed?
-

Yup.

-

Another bright spot are these comments from Ian Betteridge, who has been doing this even longer than Marco:

-
You know, any writer who has never made a single factual error in a piece hasn’t ever written anything worth reading.
-
I learned my job with the support of people who helped me. Had I suffered an Internet pile on for every error I wouldn’t have bothered.
-

To which Samantha understandably replies:

-
and it’s honestly something I’m contemplating right now, whether to continue…
-

Gee, I can’t imagine why. Why with comments like this from Chris Breen that completely misrepresent Samantha’s point, (who until today, I would have absolutely defended as being better than this, something I am genuinely saddened to be wrong about), why wouldn’t she want to continue doing this?

-
If I have this right, some people are outraged that a creator has decided to give away his work.
-

No Chris, you don’t have this right. But hey, who has time to find out the real issue and read an article. I’m sure your friends told you everything you need to know.

-

Noted Feminist Glenn Fleishman gets a piece of the action too:

-
- - +
+

+ I have a saying that applies in this case: don’t place your head so far up your nethers that you go full Klein Bottle. Marco has gone full Klein Bottle. (To be correct, he went FKB some years ago.) +

+

+ There are some bright spots. My favorite is when Building Twenty points out the real elephant in the room: +

+
+

+ @BuildingTwenty: Both @s_bielefeld & I wrote similar critiques of @marcoarment’s pricing model yet the Internet pilloried only the woman. Who’d have guessed? +

+
+

+ Yup. +

+

+ Another bright spot are these comments from Ian Betteridge, who has been doing this even longer than Marco: +

+
+

+ You know, any writer who has never made a single factual error in a piece hasn’t ever written anything worth reading. +

+

+ I learned my job with the support of people who helped me. Had I suffered an Internet pile on for every error I wouldn’t have bothered. +

+
+

+ To which Samantha understandably replies: +

+
+

+ and it’s honestly something I’m contemplating right now, whether to continue… +

+
+

+ Gee, I can’t imagine why. Why with comments like this from Chris Breen that completely misrepresent Samantha’s point, (who until today, I would have absolutely defended as being better than this, something I am genuinely saddened to be wrong about), why wouldn’t she want to continue doing this? +

+
+

+ If I have this right, some people are outraged that a creator has decided to give away his work. +

+
+

+ No Chris, you don’t have this right. But hey, who has time to find out the real issue and read an article. I’m sure your friends told you everything you need to know. +

+

+ Noted Feminist Glenn Fleishman gets a piece of the action too: +

+
+
+

Image for post +

-

I’m not actually surprised here. I watched Fleishman berate a friend of mine who has been an engineer for…heck, waaaaay too long on major software products in the most condescending way because she tried to point out that as a very technical woman, “The Magazine” literally had nothing to say to her and maybe he should fix that. “Impertinent” was I believe what he called her, but I may have the specific word wrong. Not the attitude mind you. Great Feminists like Glenn do not like uppity women criticizing Great Feminists who are their Great Allies.

-

Great Feminists are often tools.

-
-
-
-
-
-

Luckily, I hope, the people who get Samantha’s point also started chiming in (and you get 100% of the women commenting here that I’ve seen):

-
I don’t think he’s wrong for doing it, he just discusses it as if the market’s a level playing field — it isn’t
-
This is a great article with lots of great points about the sustainability of iOS development. Thank you for publishing it.
-
Regardless of the numbers and your view of MA, fair points here about confirmation bias in app marketing feasibility http://samanthabielefeld.com/the-elephant-in-the-room …
-
thank you for posting this, it covers a lot of things people don’t like to talk about.
-
I’m sure you have caught untold amounts of flak over posting this because Marco is blind to his privilege as a developer.
-
Catching up on the debate, and agreeing with Harry’s remark. (Enjoyed your article, Samantha, and ‘got’ your point.)
-
-
-
-
-
-

I would like to say I’m surprised at the reaction to Samantha’s article, but I’m not. In spite of his loud declarations of support for The Big Lie, Marco Arment is as bad at any form of criticism that he hasn’t already approved as a very insecure tween. An example from 2011: http://www.businessinsider.com/marco-arment-2011-9

-

Marco is great with criticism as long as it never actually criticizes him. If it does, be prepared a flood of petty, petulant whining that a room full of bored preschoolers on a hot day would be hard-pressed to match.

-

Today has been…well, it sucks. It sucks because someone doing what all the Arments of the world claim to want was naive enough to believe what they were told, and found out the hard way just how big a lie The Big Lie is, and how vicious people are when you’re silly enough to believe anything they say about criticism.

-

And note again, every single condescending crack, misrepresentation, and strawman had an exclusively male source. Most of them have, at one point or another, loudly trumpted themselves as Feminist Allies, as a friend to women struggling with the sexism and misogyny in tech. Congratulations y’all on being just as bad as the people you claim to oppose.

-

Samantha has handled this better than anyone else could have. My respect for her as a person and a writer is off the charts. If she choses to walk away from blogging in the Apple space, believe me I understand. As bad as today was for her, I’ve seen worse. Much worse.

-

But I hope she doesn’t. I hope she stays, because she is Doing This Right, and in a corner of the internet that has become naught but an endless circle jerk, a cliquish collection, a churlish, childish cohort interested not in writing or the truth, but in making sure The Right People are elevated, and The Others put down, she is someone worth reading and listening to. The number people who owe her apologies goes around the block, and I don’t think she’ll ever see a one. I’m sure as heck not apologizing for them, I’ll not make their lives easier in the least.

-

All of you, all. of. you…Marco, Breen, Snell, Vittici, had a chance to live by your words. You were faced with reasoned, polite, respectful criticism and instead of what you should have done, you all dropped trou and sprayed an epic diarrheal discharge all over someone who had done nothing to deserve it. Me, I earned most of my aggro, Samantha did not earn any of the idiocy I’ve seen today. I hope you’re all proud of yourselves. Someone should be, it won’t be me. Ever.

-

So I hope she stays, but if she goes, I understand. For what it’s worth, I don’t think she’s wrong either way.

-
-
-
\ No newline at end of file + +

+ I’m not actually surprised here. I watched Fleishman berate a friend of mine who has been an engineer for…heck, waaaaay too long on major software products in the most condescending way because she tried to point out that as a very technical woman, “The Magazine” literally had nothing to say to her and maybe he should fix that. “Impertinent” was I believe what he called her, but I may have the specific word wrong. Not the attitude mind you. Great Feminists like Glenn do not like uppity women criticizing Great Feminists who are their Great Allies. +

+

+ Great Feminists are often tools. +

+
+

+ Luckily, I hope, the people who get Samantha’s point also started chiming in (and you get 100% of the women commenting here that I’ve seen): +

+
+

+ I don’t think he’s wrong for doing it, he just discusses it as if the market’s a level playing field — it isn’t +

+

+ This is a great article with lots of great points about the sustainability of iOS development. Thank you for publishing it. +

+

+ Regardless of the numbers and your view of MA, fair points here about confirmation bias in app marketing feasibility http://samanthabielefeld.com/the-elephant-in-the-room … +

+

+ thank you for posting this, it covers a lot of things people don’t like to talk about. +

+

+ I’m sure you have caught untold amounts of flak over posting this because Marco is blind to his privilege as a developer. +

+

+ Catching up on the debate, and agreeing with Harry’s remark. (Enjoyed your article, Samantha, and ‘got’ your point.) +

+
+
+

+ I would like to say I’m surprised at the reaction to Samantha’s article, but I’m not. In spite of his loud declarations of support for The Big Lie, Marco Arment is as bad at any form of criticism that he hasn’t already approved as a very insecure tween. An example from 2011: http://www.businessinsider.com/marco-arment-2011-9 +

+

+ Marco is great with criticism as long as it never actually criticizes him. If it does, be prepared a flood of petty, petulant whining that a room full of bored preschoolers on a hot day would be hard-pressed to match. +

+

+ Today has been…well, it sucks. It sucks because someone doing what all the Arments of the world claim to want was naive enough to believe what they were told, and found out the hard way just how big a lie The Big Lie is, and how vicious people are when you’re silly enough to believe anything they say about criticism. +

+

+ And note again, every single condescending crack, misrepresentation, and strawman had an exclusively male source. Most of them have, at one point or another, loudly trumpted themselves as Feminist Allies, as a friend to women struggling with the sexism and misogyny in tech. Congratulations y’all on being just as bad as the people you claim to oppose. +

+

+ Samantha has handled this better than anyone else could have. My respect for her as a person and a writer is off the charts. If she choses to walk away from blogging in the Apple space, believe me I understand. As bad as today was for her, I’ve seen worse. Much worse. +

+

+ But I hope she doesn’t. I hope she stays, because she is Doing This Right, and in a corner of the internet that has become naught but an endless circle jerk, a cliquish collection, a churlish, childish cohort interested not in writing or the truth, but in making sure The Right People are elevated, and The Others put down, she is someone worth reading and listening to. The number people who owe her apologies goes around the block, and I don’t think she’ll ever see a one. I’m sure as heck not apologizing for them, I’ll not make their lives easier in the least. +

+

+ All of you, all. of. you…Marco, Breen, Snell, Vittici, had a chance to live by your words. You were faced with reasoned, polite, respectful criticism and instead of what you should have done, you all dropped trou and sprayed an epic diarrheal discharge all over someone who had done nothing to deserve it. Me, I earned most of my aggro, Samantha did not earn any of the idiocy I’ve seen today. I hope you’re all proud of yourselves. Someone should be, it won’t be me. Ever. +

+

+ So I hope she stays, but if she goes, I understand. For what it’s worth, I don’t think she’s wrong either way. +

+
\ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-3/source.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-3/source.html index 37c246419..1bd8d82f5 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-3/source.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-3/source.html @@ -1,4815 +1,1645 @@ - - - - - - Samantha and The Great Big Lie – John C. Welch – Medium - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
-
-
- -
- + + + + + + + Samantha and The Great Big Lie. How to get shanked doing what people… | by John C. Welch | Medium + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+ +
+ + +
+
+ +
-
-
-
-
-
-
-
-
-
-
-
-
-

Samantha and The Great Big Lie

-

How to get shanked doing what people say they want

-
don’t preach to me
Mr. integrity
-

(EDIT: removed the link to Samantha’s post, because the arments and the grubers and the rest of The Deck Clique got what they wanted: a non-proper person driven off the internet lightly capped with a dusting of transphobia along the way, all totally okay because the ends justify the means, and it’s okay when “good” people do it.)

-

First, I need to say something about this article: the reason I’m writing it infuriates me. Worse than installing CS 3 or Acrobat 7 ever did, and the former inspired comparisons to fecophile porn. I’m actually too mad to cuss. Well, not completely, but in this case, I don’t think the people I’m mad at are worth the creativity I try to put into profanity. This is about a brownfield of hypocrisy and viciously deliberate mischaracterization that “shame” cannot even come close to the shame those behind it should feel.

-

Now, read this post by Samantha Bielefeld: The Elephant in the Room. First, it is a well-written critical piece that raises a few points in a calm, rational, nonconfrontational fashion, exactly the kind of things the pushers of The Great Big Lie say we need more of, as opposed to the screaming that is the norm in such cases.

-

…sorry, I should explain “The Great Big Lie”. There are several, but in this case, our specific instance of “The Great Big Lie” is about criticism. Over and over, you hear from the very people I am not going to be nice to in this that we need “better” criticsm. Instead of rage and anger, volume and vitriol, we need in-depth rational criticism, that isn’t personal or ad hominem. That it should focus on points, not people.

-

That, readers, is “The Big Lie”. It is a lie so big that if one ponders the reality of it, as I am going to, one wonders why anyone would believe it. It is a lie and it is one we should stop telling.

-
-
-
-
-
-
-
-
-
-

Samantha’s points (I assume you read it, for you are smart people who know the importance of such things) are fairly clear:

-
    -
  1. With the release of Overcast 2.0, a product Samantha actually likes, Marco Arment moved to a patronage model that will probably be successful for him.
  2. -
  3. Arment’s insistence that “anyone can do this” while technically true, (anyone can in fact, implement this pricing model), also implies that “anyone” can have the kind of success that a developer with Marco’s history, financial status, and deep ties to the Apple News Web is expected to have. This is silly.
  4. -
  5. Marco Arment occupies a fairly unique position in the Apple universe, (gained by hard work and no small talent), and because of that, benefits from a set of privileges that a new developer or even one that has been around for a long time, but isn’t, well, Marco, not only don’t have, but have little chance of attaining anytime soon.
  6. -
  7. Marco has earned his success and is entitled to the benefits and privileges it brings, but he seems rather blind to all of that, and seems to still imagine himself as “two guys in a garage”. This is just not correct.
  8. -
  9. In addition, the benefits and privileges of the above ensure that by releasing Overcast 2 as a free app, with patronage pricing, he has, if not gutted, severely hurt the ability of folks actually selling their apps for an up-front price of not free to continue doing so. This has the effect of accelerating the “race to the bottom” in the podcast listening app segment, which hurts devs who cannot afford to work on a “I don’t really need this money, so whatever you feel like sending is okay” model.
  10. -
-

None of this is incorrect. None of this is an ad hominem attack in any way. It is just pointing out that a developer of Arment’s stature and status lives in a very different world than someone in East Frog Balls, Arkansas trying to make a living off of App sales. Our dev in EFB doesn’t have the main sites on the Apple web falling all over themselves to review their app the way that Arment does. They’re not friends with the people being The Loop, Daring Fireball, SixColors, iMore, The Mac Observer, etc., yadda.

-

So, our hero, in a fit of well-meaning ignorance writes this piece (posted this morning, 14 Oct. 15) and of course, the response and any criticisms are just as reasonable and thoughtful.

-

If you really believe that, you are the most preciously ignorant person in the world, and can I have your seriously charmed life.

-
-
-
-
-
-
-
-
-
-

The response, from all quarters, including Marco, someone who is so sensitive to criticism that the word “useless” is enough to shut him down, who blocked a friend of mine for the high crime of pointing out that his review of podcasting mics centered around higher priced gear and ignored folks without the scratch, who might not be ready for such things, is, in a single word, disgusting. Vomitous even.

-

It’s an hours-long dogpile that beggars even my imagination, and I can imagine almost anything. Seriously, it’s all there in Samantha’s Twitter Feed. From what I can tell, she’s understandably shocked over it. I however was not. This one comment in her feed made me smile (warning, this wanders a bit…er…LOT. Twitter timelines are not easy to put together):

-
I can see why you have some reservations about publishing it, but my gut feeling is that he would take it better than Nilay.
-

Oh honey, bless your sweet, ignorant heart. Marco is one of the biggest pushers of The Big Lie, and one of the reasons it is such a lie.

-

But it gets better. First, you have the “hey, Marco earned his status!” lot. A valid point, and one Bielefeld explicitly acknowledges, here:

-
From his ground floor involvement in Tumblr (for which he is now a millionaire), to the creation and sale of a wildly successful app called Instapaper, he has become a household name in technology minded circles. It is this extensive time spent in the spotlight, the huge following on Twitter, and dedicated listeners of his weekly aired Accidental Tech Podcast, that has granted him the freedom to break from seeking revenue in more traditional manners.
-

and here:

-
I’m not knocking his success, he has put effort into his line of work, and has built his own life.
-

and here:

-
He has earned his time in the spotlight, and it’s only natural for him to take advantage of it.
-

But still, you get the people telling her something she already acknowledge:

-
I don’t think he’s blind. he’s worked to where he has gotten and has had failures like everyone else.
-

Thank you for restating something in the article. To the person who wrote it.

-

In the original article, Samantha talked about the money Marco makes from his podcast. She based that on the numbers provided by ATP in terms of sponsorship rates and the number of current sponsors the podcast has. Is this going to yield perfect numbers? No. But the numbers you get from it will at least be reasonable, or should be unless the published sponsorship rates are just fantasy, and you’re stupid for taking them seriously.

-

At first, she went with a simple formula:

-
$4K x 3 per episode = $12K x 52 weeks / 3 hosts splitting it.
-

That’s not someone making shit up, right? Rather quickly, someone pointed out that she’d made an error in how she calculated it:

-
That’s $4k per ad, no? So more like $12–16k per episode.
-

She’d already realized her mistake and fixed it.

-
which is actually wrong, and I’m correcting now. $4,000 per sponsor, per episode! So, $210,000 per year.
-

Again, this is based on publicly available data the only kind someone not part of ATP or a close friend of Arment has access to. So while her numbers may be wrong, if they are, there’s no way for her to know that. She’s basing her opinion on actual available data. Which is sadly rare.

-

This becomes a huge flashpoint. You name a reason to attack her over this, people do. No really. For example, she’s not calculating his income taxes correctly:

-
especially since it isn’t his only source of income thus, not an indicator of his marginal inc. tax bracket.
-
thus, guessing net income is more haphazard than stating approx. gross income.
-

Ye Gods. She’s not doing his taxes for him, her point is invalid?

-

Then there’s the people who seem to have not read anything past what other people are telling them:

-
Not sure what to make of your Marco piece, to be honest. You mention his fame, whatever, but what’s the main idea here?
-

Just how spoon-fed do you have to be? Have you no teeth?

-

Of course, Marco jumps in, and predictably, he’s snippy:

-
If you’re going to speak in precise absolutes, it’s best to first ensure that you’re correct.
-

If you’re going to be like that, it’s best to provide better data. Don’t get snippy when someone is going off the only data available, and is clearly open to revising based on better data.

-

Then Marco’s friends/fans get into it:

-
I really don’t understand why it’s anyone’s business
-

Samantha is trying to qualify for sainthood at this point:

-
It isn’t really, it was a way of putting his income in context in regards to his ability to gamble with Overcast.
-

Again, she’s trying to drag people back to her actual point, but no one is going to play. The storm has begun. Then we get people who are just spouting nonsense:

-
Why is that only relevant for him? It’s a pretty weird metric,especially since his apps aren’t free.
-

Wha?? Overcast 2 is absolutely free. Samantha points this out:

-
His app is free, that’s what sparked the article to begin with.
-

The response is literally a parallel to “How can there be global warming if it snowed today in my town?”

-
If it’s free, how have I paid for it? Twice?
-

She is still trying:

-
You paid $4.99 to unlock functionality in Overcast 1.0 and you chose to support him with no additional functionality in 2.0
-

He is having none of it. IT SNOWED! SNOWWWWWWW!

-
Yes. That’s not free. Free is when you choose not to make money. And that can be weaponized. But that’s not what Overcast does.
-

She however, is relentless:

-
No, it’s still free. You can choose to support it, you are required to pay $4.99 for Pocket Casts. Totally different model.
-

Dude seems to give up. (Note: allllll the people bagging on her are men. All of them. Mansplaining like hell. And I’d bet every one of them considers themselves a feminist.)

-

We get another guy trying to push the narrative she’s punishing him for his success, which is just…it’s stupid, okay? Stupid.

-
It also wasn’t my point in writing my piece today, but it seems to be everyone’s focus.
-

(UNDERSTATEMENT OF THE YEAR)

-
I think the focus should be more on that fact that while it’s difficult, Marco spent years building his audience.
-
It doesn’t matter what he makes it how he charges. If the audience be earned is willing to pay for it, awesome.
-

She tries, oh lord, she tries:

-
To assert that he isn’t doing anything any other dev couldn’t, is wrong. It’s successful because it’s Marco.
-

But no, HE KNOWS HER POINT BETTER THAN SHE DOES:

-
No, it’s successful because he busted his ass to make it so. It’s like any other business. He grew it.
-

Christ. This is like a field of strawmen. Stupid ones. Very stupid ones.

-

One guy tries to blame it all on Apple, another in a string of Wha??? moments:

-
the appropriate context is Apple’s App Store policies. Other devs aren’t Marco’s responsibility
-

Seriously? Dude, are you even trying to talk about what Samantha actually wrote? At this point, Samantha is clearly mystified at the entire thing:

-
Why has the conversation suddenly turned to focus on nothing more than ATP sponsorship income?
-

Because it’s a nit they can pick and allows them to ignore everything you wrote. That’s the only reason.

-

One guy is “confused”:

-
I see. He does have clout, so are you saying he’s too modest in how he sees himself as a dev?
-
Yes. He can’t be equated to the vast majority of other developers. Like calling Gruber, “just another blogger”.
-
Alright, that’s fair. I was just confused by the $ and fame angle at first.
-

Samantha’s point centers on the benefits Marco gains via his fame and background. HOW DO YOU NOT MENTION THAT? HOW IS THAT CONFUSING?

-

People of course are telling her it’s her fault for mentioning a salient fact at all:

-
Why has the conversation suddenly turned to focus on nothing more than ATP sponsorship income?
-
Maybe because you went there with your article?
-
As a way of rationalizing his ability to gamble with the potential for Overcast to generate income…not the norm at all.
-

Of course, had she not brought up those important points, she’d have been bagged on for “not providing proof”. Lose some, lose more. By now, she’s had enough and she just deletes all mention of it. Understandable, but sad she was bullied into doing that.

-

Yes, bullied. That’s all this is. Bullying. She didn’t lie, cheat, or exaagerate. If her numbers were wrong, they weren’t wrong in a way she had any ability to do anything about. But there’s blood in the water, and the comments and attacks get worse:

-
Because you decided to start a conversation about someone else’s personal shit. You started this war.
-

War. THIS. IS. WAR.

-

This is a bunch of nerds attacking someone for reasoned, calm, polite criticism of their friend/idol. Samantha is politely pushing back a bit:

-
That doesn’t explain why every other part of my article is being pushed aside.
-

She’s right. This is all nonsense. This is people ignoring her article completely, just looking for things to attack so it can be dismissed. It’s tribalism at its purest.

-

Then some of the other annointed get into it, including Jason Snell in one of the most spectactular displays of “I have special knowledge you can’t be expected to have, therefore you are totally off base and wrong, even though there’s no way for you to know this” I’ve seen in a while. Jason:

-
You should never use an ad rate card to estimate ad revenue from any media product ever.
-
I learned this when I started working for a magazine — rate cards are mostly fiction, like prices on new cars
-

How…exactly…in the name of whatever deity Jason may believe in…is Samantha or anyone not “in the biz” supposed to know this. Also, what exactly does a magazine on paper like Macworld have to do with sponsorships for a podcast? I have done podcasts that were sponsored, and I can retaliate with “we charged what the rate card said we did. Checkmate Elitests!

-

Samantha basically abases herself at his feet:

-
I understand my mistake, and it’s unfortunate that it has completely diluted the point of my article.
-

I think she should have told him where and how to stuff that nonsense, but she’s a nicer person than I am. Also, it’s appropriate that Jason’s twitter avatar has its nose in the air. This is some rank snobbery. It’s disgusting and if anyone pulled that on him, Jason would be very upset. But hey, one cannot criticize The Marco without getting pushback. By “pushback”, I mean “an unrelenting fecal flood”.

-

Her only mistake was criticizing one of the Kool Kids. Folks, if you criticize anyone in The Deck Clique, or their friends, expect the same thing, regardless of tone or point.

-

Another App Dev, seemingly unable to parse Samantha’s words, needs more explanation:

-
so just looking over your mentions, I’m curious what exactly was your main point? Ignoring the podcast income bits.
-

Oh wait, he didn’t even read the article. Good on you, Dev Guy, good. on. you. Still, she plays nice with someone who didn’t even read her article:

-
That a typical unknown developer can’t depend on patronage to generate revenue, and charging for apps will become a negative.
-

Marco comes back of course, and now basically accuses her of lying about other devs talking to her and supporting her point:

-
How many actual developers did you hear from, really? Funny how almost nobody wants to give a (real) name on these accusations.
-

Really? You’re going to do that? “There’s no name, so I don’t think it’s a real person.” Just…what’s the Joe Welch quote from the McCarthy hearings?

-
Let us not assassinate this lad further, Senator. You’ve done enough. Have you no sense of decency, sir? At long last, have you left no sense of decency?
-

That is what this is at this point: character assasination because she said something critical of A Popular Person. It’s disgusting. Depressing and disgusting. No one, none of these people have seriously discussed her point, heck, it looks like they barely bothered to read it, if they did at all.

-

Marco starts getting really petty with her (no big shock) and Samantha finally starts pushing back:

-
Glad to see you be the bigger person and ignore the mindset of so many developers not relating to you, good for you!
-

That of course, is what caused Marco to question the validity, if not the existence of her sources. (Funny how anonymous sources are totes okay when they convenience Marco et al, and work for oh, Apple, but when they are inconvenient? Ha! PROVIDE ME PROOF YOU INTEMPERATE WOMAN!)

-

Make no mistake, there’s some sexist shit going on here. Every tweet I’ve quoted was authored by a guy.

-

Of course, Marco has to play the “I’ve been around longer than you” card with this bon mot:

-
Yup, before you existed!
-

Really dude? I mean, I’m sorry about the penis, but really?

-

Mind you, when the criticism isn’t just bizarrely stupid, Samantha reacts the way Marco and his ilk claim they would to (if they ever got any valid criticism. Which clearly is impossible):

-
Not to get into the middle of this, but “income” is not the term you’re looking for. “Revenue” is.
-
lol. Noted.
-
And I wasn’t intending to be a dick, just a lot of people hear/say “income” when they intend “revenue”, and then discussion …
-
… gets derailed by a jedi handwave of “Expenses”. But outside of charitable donation, it is all directly related.
-
haha. Thank you for the clarification.
-

Note to Marco and the other…whatever they are…that is how one reacts to that kind of criticism. With a bit of humor and self-deprecation. You should try it sometime. For real, not just in your heads or conversations in Irish Pubs in S.F.

-

But now, the door has been cracked, and the cheap shots come out:

-
@testflight_app: Don’t worry guys, we process @marcoarment’s apps in direct proportion to his megabucks earnings. #fairelephant
-

(Note: testflight_app is a parody account. Please do not mess with the actual testflight folks. They are still cool.)

-

Or this…conversation:

-
-
-
-
-
-
-

Good job guys. Good job. Defend the tribe. Attack the other. Frederico attempts to recover from his stunning display of demeaning douchery: ‏@viticci: @s_bielefeld I don’t know if it’s an Italian thing, but counting other people’s money is especially weird for me. IMO, bad move in the post.

-

Samantha is clearly sick of his crap: ‏@s_bielefeld: @viticci That’s what I’m referring to, the mistake of ever having mentioned it. So, now, Marco can ignore the bigger issue and go on living.

-

Good for her. There’s being patient and being roadkill.

-

Samantha does put the call out for her sources to maybe let her use their names:

-
From all of you I heard from earlier, anyone care to go on record?
-

My good friend, The Angry Drunk points out the obvious problem:

-
Nobody’s going to go on record when they count on Marco’s friends for their PR.
-

This is true. Again, the sites that are Friends of Marco:

-

Daring Fireball

-

The Loop

-

SixColors

-

iMore

-

MacStories

-

A few others, but I want this post to end one day.

-

You piss that crew off, and given how petty rather a few of them have demonstrated they are, good luck on getting any kind of notice from them.

-

Of course, the idea this could happen is just craycray:

-
@KevinColeman .@Angry_Drunk @s_bielefeld @marcoarment Wow, you guys are veering right into crazy conspiracy theory territory. #JetFuelCantMeltSteelBeams
-

Yeah. Because a mature person like Marco would never do anything like that.

-

Of course, the real point on this is starting to happen:

-
you’re getting a lot of heat now but happy you are writing things that stir up the community. Hope you continue to be a voice!
-
I doubt I will.
-

See, they’ve done their job. Mess with the bull, you get the horns. Maybe you should find another thing to write about, this isn’t a good place for you. Great job y’all.

-

Some people aren’t even pretending. They’re just in full strawman mode:

-
@timkeller: Unfair to begrudge a person for leveraging past success, especially when that success is earned. No ‘luck’ involved.
-
@s_bielefeld: @timkeller I plainly stated that I don’t hold his doing this against him. Way to twist words.
-

I think she’s earned her anger at this point.

-

Don’t worry, Marco knows what the real problem is: most devs just suck —

-
-
-
-
-
-
-

I have a saying that applies in this case: don’t place your head so far up your nethers that you go full Klein Bottle. Marco has gone full Klein Bottle. (To be correct, he went FKB some years ago.)

-

There are some bright spots. My favorite is when Building Twenty points out the real elephant in the room:

-
@BuildingTwenty: Both @s_bielefeld & I wrote similar critiques of @marcoarment’s pricing model yet the Internet pilloried only the woman. Who’d have guessed?
-

Yup.

-

Another bright spot are these comments from Ian Betteridge, who has been doing this even longer than Marco:

-
You know, any writer who has never made a single factual error in a piece hasn’t ever written anything worth reading.
-
I learned my job with the support of people who helped me. Had I suffered an Internet pile on for every error I wouldn’t have bothered.
-

To which Samantha understandably replies:

-
and it’s honestly something I’m contemplating right now, whether to continue…
-

Gee, I can’t imagine why. Why with comments like this from Chris Breen that completely misrepresent Samantha’s point, (who until today, I would have absolutely defended as being better than this, something I am genuinely saddened to be wrong about), why wouldn’t she want to continue doing this?

-
If I have this right, some people are outraged that a creator has decided to give away his work.
-

No Chris, you don’t have this right. But hey, who has time to find out the real issue and read an article. I’m sure your friends told you everything you need to know.

-

Noted Feminist Glenn Fleishman gets a piece of the action too:

-
-
-
-
-
-
-

I’m not actually surprised here. I watched Fleishman berate a friend of mine who has been an engineer for…heck, waaaaay too long on major software products in the most condescending way because she tried to point out that as a very technical woman, “The Magazine” literally had nothing to say to her and maybe he should fix that. “Impertinent” was I believe what he called her, but I may have the specific word wrong. Not the attitude mind you. Great Feminists like Glenn do not like uppity women criticizing Great Feminists who are their Great Allies.

-

Great Feminists are often tools.

-
-
-
-
-
-
-
-
-
-

Luckily, I hope, the people who get Samantha’s point also started chiming in (and you get 100% of the women commenting here that I’ve seen):

-
I don’t think he’s wrong for doing it, he just discusses it as if the market’s a level playing field — it isn’t
-
This is a great article with lots of great points about the sustainability of iOS development. Thank you for publishing it.
-
Regardless of the numbers and your view of MA, fair points here about confirmation bias in app marketing feasibility http://samanthabielefeld.com/the-elephant-in-the-room …
-
thank you for posting this, it covers a lot of things people don’t like to talk about.
-
I’m sure you have caught untold amounts of flak over posting this because Marco is blind to his privilege as a developer.
-
Catching up on the debate, and agreeing with Harry’s remark. (Enjoyed your article, Samantha, and ‘got’ your point.)
-
-
-
-
-
-
-
-
-
-

I would like to say I’m surprised at the reaction to Samantha’s article, but I’m not. In spite of his loud declarations of support for The Big Lie, Marco Arment is as bad at any form of criticism that he hasn’t already approved as a very insecure tween. An example from 2011: http://www.businessinsider.com/marco-arment-2011-9

-

Marco is great with criticism as long as it never actually criticizes him. If it does, be prepared a flood of petty, petulant whining that a room full of bored preschoolers on a hot day would be hard-pressed to match.

-

Today has been…well, it sucks. It sucks because someone doing what all the Arments of the world claim to want was naive enough to believe what they were told, and found out the hard way just how big a lie The Big Lie is, and how vicious people are when you’re silly enough to believe anything they say about criticism.

-

And note again, every single condescending crack, misrepresentation, and strawman had an exclusively male source. Most of them have, at one point or another, loudly trumpted themselves as Feminist Allies, as a friend to women struggling with the sexism and misogyny in tech. Congratulations y’all on being just as bad as the people you claim to oppose.

-

Samantha has handled this better than anyone else could have. My respect for her as a person and a writer is off the charts. If she choses to walk away from blogging in the Apple space, believe me I understand. As bad as today was for her, I’ve seen worse. Much worse.

-

But I hope she doesn’t. I hope she stays, because she is Doing This Right, and in a corner of the internet that has become naught but an endless circle jerk, a cliquish collection, a churlish, childish cohort interested not in writing or the truth, but in making sure The Right People are elevated, and The Others put down, she is someone worth reading and listening to. The number people who owe her apologies goes around the block, and I don’t think she’ll ever see a one. I’m sure as heck not apologizing for them, I’ll not make their lives easier in the least.

-

All of you, all. of. you…Marco, Breen, Snell, Vittici, had a chance to live by your words. You were faced with reasoned, polite, respectful criticism and instead of what you should have done, you all dropped trou and sprayed an epic diarrheal discharge all over someone who had done nothing to deserve it. Me, I earned most of my aggro, Samantha did not earn any of the idiocy I’ve seen today. I hope you’re all proud of yourselves. Someone should be, it won’t be me. Ever.

-

So I hope she stays, but if she goes, I understand. For what it’s worth, I don’t think she’s wrong either way.

-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+ +
+
+

+ +

+
+
+
+
+
+
+ +
+

+ +

+
+
+
+
+ + +
- -
-
-
- -
- -
-
-
    -
  • Share
  • -
  • -
    -
  • -
  • -
  • -
+
-
-
-
-
- Go to the profile of John C. Welch -
-
-
Never miss a story from John C. Welch, when you sign up for Medium. Learn more
-
Never miss a story from John C. Welch
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+

+ +

+
+
+
+
+ +
+
+

+ +

+
+
+
+
+
+
+ +
+

+ +

+
+
+
+
+
+ +
+
+ +
+
+ +
+
+
+ + +
+
+
+
-
+
+
+
+
+
+
+
+ John C. Welch +
+
+

+ Written by +

+
+
+
+

+ John C. Welch +

+
+ +
+
+
+
+
+

+
+
+ +
+
+
+
+
+
+
+
+ John C. Welch +
+
+

+ Written by +

+
+

+ John C. Welch +

+
+ +
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ More From Medium +

+
+
+
+
+ +
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+ +
+ +
+ + +
+
+
+
+
+ +
+
+ +
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +

+ Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch +

+
+
+ +

+ Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore +

+
+
+ +

+ Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade +

+
+
+
+
+
+ + +
+

+
About +

+ Help +

+

+ Legal +

+
+
+
+

+ Get the Medium app +

+
+
+
+ A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store +
+
+ A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store +
+
-
-
- - - - - - -===========^CCrash Annotation GraphicsCriticalError: |[C0][GFX1-]: Receive IPC close with reason=AbnormalShutdown (t=7.53758) [GFX1-]: Receive IPC close with reason=AbnormalShutdown localhost:mozilla-central itoyxd$ localhost:mozilla-central itoyxd$ localhost:mozilla-central itoyxd$ ./mach run 0:00.20 /Users/itoyxd/evan/dev/mozilla/mozilla-central/obj-firefox/dist/Nightly.app/Contents/MacOS/firefox -no-remote -foreground -profile /Users/itoyxd/evan/dev/mozilla/mozilla-central/obj-firefox/tmp/scratch_user 2017-02-17 16:57:43.743 plugin-container[11969:394160] *** CFMessagePort: bootstrap_register(): failed 1100 (0x44c) 'Permission denied', port = 0x943f, name = 'com.apple.tsm.portname' See /usr/include/servers/bootstrap_defs.h for the error codes. 2017-02-17 16:57:43.743 plugin-container[11969:394160] *** CFMessagePort: bootstrap_register(): failed 1100 (0x44c) 'Permission denied', port = 0x4907, name = 'com.apple.CFPasteboardClient' See /usr/include/servers/bootstrap_defs.h for the error codes. 2017-02-17 16:57:43.743 plugin-container[11969:394160] void __CFPasteboardSetup() : Failed to allocate communication port for com.apple.CFPasteboardClient; this is likely due to sandbox restrictions 2017-02-17 16:57:50.234 plugin-container[11972:394329] *** CFMessagePort: bootstrap_register(): failed 1100 (0x44c) 'Permission denied', port = 0x953f, name = 'com.apple.tsm.portname' See /usr/include/servers/bootstrap_defs.h for the error codes. 2017-02-17 16:57:50.235 plugin-container[11972:394329] *** CFMessagePort: bootstrap_register(): failed 1100 (0x44c) 'Permission denied', port = 0x4b0b, name = 'com.apple.CFPasteboardClient' See /usr/include/servers/bootstrap_defs.h for the error codes. 2017-02-17 16:57:50.235 plugin-container[11972:394329] void __CFPasteboardSetup() : Failed to allocate communication port for com.apple.CFPasteboardClient; this is likely due to sandbox restrictions =========== - - - - - - - Samantha and The Great Big Lie – Medium - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
- -
-
-
-
-
-
-
-
-

Samantha and The Great Big Lie

-

How to get shanked doing what people say they want

-
don’t preach to me
Mr. integrity
-

(EDIT: removed the link to Samantha’s post, because the arments and the grubers and the rest of The Deck Clique got what they wanted: a non-proper person driven off the internet lightly capped with a dusting of transphobia along the way, all totally okay because the ends justify the means, and it’s okay when “good” people do it.)

-

First, I need to say something about this article: the reason I’m writing it infuriates me. Worse than installing CS 3 or Acrobat 7 ever did, and the former inspired comparisons to fecophile porn. I’m actually too mad to cuss. Well, not completely, but in this case, I don’t think the people I’m mad at are worth the creativity I try to put into profanity. This is about a brownfield of hypocrisy and viciously deliberate mischaracterization that “shame” cannot even come close to the shame those behind it should feel.

-

Now, read this post by Samantha Bielefeld: The Elephant in the Room. First, it is a well-written critical piece that raises a few points in a calm, rational, nonconfrontational fashion, exactly the kind of things the pushers of The Great Big Lie say we need more of, as opposed to the screaming that is the norm in such cases.

-

…sorry, I should explain “The Great Big Lie”. There are several, but in this case, our specific instance of “The Great Big Lie” is about criticism. Over and over, you hear from the very people I am not going to be nice to in this that we need “better” criticsm. Instead of rage and anger, volume and vitriol, we need in-depth rational criticism, that isn’t personal or ad hominem. That it should focus on points, not people.

-

That, readers, is “The Big Lie”. It is a lie so big that if one ponders the reality of it, as I am going to, one wonders why anyone would believe it. It is a lie and it is one we should stop telling.

-
-
-
-
-
-
-
-
-
-

Samantha’s points (I assume you read it, for you are smart people who know the importance of such things) are fairly clear:

-
    -
  1. With the release of Overcast 2.0, a product Samantha actually likes, Marco Arment moved to a patronage model that will probably be successful for him.
  2. -
  3. Arment’s insistence that “anyone can do this” while technically true, (anyone can in fact, implement this pricing model), also implies that “anyone” can have the kind of success that a developer with Marco’s history, financial status, and deep ties to the Apple News Web is expected to have. This is silly.
  4. -
  5. Marco Arment occupies a fairly unique position in the Apple universe, (gained by hard work and no small talent), and because of that, benefits from a set of privileges that a new developer or even one that has been around for a long time, but isn’t, well, Marco, not only don’t have, but have little chance of attaining anytime soon.
  6. -
  7. Marco has earned his success and is entitled to the benefits and privileges it brings, but he seems rather blind to all of that, and seems to still imagine himself as “two guys in a garage”. This is just not correct.
  8. -
  9. In addition, the benefits and privileges of the above ensure that by releasing Overcast 2 as a free app, with patronage pricing, he has, if not gutted, severely hurt the ability of folks actually selling their apps for an up-front price of not free to continue doing so. This has the effect of accelerating the “race to the bottom” in the podcast listening app segment, which hurts devs who cannot afford to work on a “I don’t really need this money, so whatever you feel like sending is okay” model.
  10. -
-

None of this is incorrect. None of this is an ad hominem attack in any way. It is just pointing out that a developer of Arment’s stature and status lives in a very different world than someone in East Frog Balls, Arkansas trying to make a living off of App sales. Our dev in EFB doesn’t have the main sites on the Apple web falling all over themselves to review their app the way that Arment does. They’re not friends with the people being The Loop, Daring Fireball, SixColors, iMore, The Mac Observer, etc., yadda.

-

So, our hero, in a fit of well-meaning ignorance writes this piece (posted this morning, 14 Oct. 15) and of course, the response and any criticisms are just as reasonable and thoughtful.

-

If you really believe that, you are the most preciously ignorant person in the world, and can I have your seriously charmed life.

-
-
-
-
-
-
-
-
-
-

The response, from all quarters, including Marco, someone who is so sensitive to criticism that the word “useless” is enough to shut him down, who blocked a friend of mine for the high crime of pointing out that his review of podcasting mics centered around higher priced gear and ignored folks without the scratch, who might not be ready for such things, is, in a single word, disgusting. Vomitous even.

-

It’s an hours-long dogpile that beggars even my imagination, and I can imagine almost anything. Seriously, it’s all there in Samantha’s Twitter Feed. From what I can tell, she’s understandably shocked over it. I however was not. This one comment in her feed made me smile (warning, this wanders a bit…er…LOT. Twitter timelines are not easy to put together):

-
I can see why you have some reservations about publishing it, but my gut feeling is that he would take it better than Nilay.
-

Oh honey, bless your sweet, ignorant heart. Marco is one of the biggest pushers of The Big Lie, and one of the reasons it is such a lie.

-

But it gets better. First, you have the “hey, Marco earned his status!” lot. A valid point, and one Bielefeld explicitly acknowledges, here:

-
From his ground floor involvement in Tumblr (for which he is now a millionaire), to the creation and sale of a wildly successful app called Instapaper, he has become a household name in technology minded circles. It is this extensive time spent in the spotlight, the huge following on Twitter, and dedicated listeners of his weekly aired Accidental Tech Podcast, that has granted him the freedom to break from seeking revenue in more traditional manners.
-

and here:

-
I’m not knocking his success, he has put effort into his line of work, and has built his own life.
-

and here:

-
He has earned his time in the spotlight, and it’s only natural for him to take advantage of it.
-

But still, you get the people telling her something she already acknowledge:

-
I don’t think he’s blind. he’s worked to where he has gotten and has had failures like everyone else.
-

Thank you for restating something in the article. To the person who wrote it.

-

In the original article, Samantha talked about the money Marco makes from his podcast. She based that on the numbers provided by ATP in terms of sponsorship rates and the number of current sponsors the podcast has. Is this going to yield perfect numbers? No. But the numbers you get from it will at least be reasonable, or should be unless the published sponsorship rates are just fantasy, and you’re stupid for taking them seriously.

-

At first, she went with a simple formula:

-
$4K x 3 per episode = $12K x 52 weeks / 3 hosts splitting it.
-

That’s not someone making shit up, right? Rather quickly, someone pointed out that she’d made an error in how she calculated it:

-
That’s $4k per ad, no? So more like $12–16k per episode.
-

She’d already realized her mistake and fixed it.

-
which is actually wrong, and I’m correcting now. $4,000 per sponsor, per episode! So, $210,000 per year.
-

Again, this is based on publicly available data the only kind someone not part of ATP or a close friend of Arment has access to. So while her numbers may be wrong, if they are, there’s no way for her to know that. She’s basing her opinion on actual available data. Which is sadly rare.

-

This becomes a huge flashpoint. You name a reason to attack her over this, people do. No really. For example, she’s not calculating his income taxes correctly:

-
especially since it isn’t his only source of income thus, not an indicator of his marginal inc. tax bracket.
-
thus, guessing net income is more haphazard than stating approx. gross income.
-

Ye Gods. She’s not doing his taxes for him, her point is invalid?

-

Then there’s the people who seem to have not read anything past what other people are telling them:

-
Not sure what to make of your Marco piece, to be honest. You mention his fame, whatever, but what’s the main idea here?
-

Just how spoon-fed do you have to be? Have you no teeth?

-

Of course, Marco jumps in, and predictably, he’s snippy:

-
If you’re going to speak in precise absolutes, it’s best to first ensure that you’re correct.
-

If you’re going to be like that, it’s best to provide better data. Don’t get snippy when someone is going off the only data available, and is clearly open to revising based on better data.

-

Then Marco’s friends/fans get into it:

-
I really don’t understand why it’s anyone’s business
-

Samantha is trying to qualify for sainthood at this point:

-
It isn’t really, it was a way of putting his income in context in regards to his ability to gamble with Overcast.
-

Again, she’s trying to drag people back to her actual point, but no one is going to play. The storm has begun. Then we get people who are just spouting nonsense:

-
Why is that only relevant for him? It’s a pretty weird metric,especially since his apps aren’t free.
-

Wha?? Overcast 2 is absolutely free. Samantha points this out:

-
His app is free, that’s what sparked the article to begin with.
-

The response is literally a parallel to “How can there be global warming if it snowed today in my town?”

-
If it’s free, how have I paid for it? Twice?
-

She is still trying:

-
You paid $4.99 to unlock functionality in Overcast 1.0 and you chose to support him with no additional functionality in 2.0
-

He is having none of it. IT SNOWED! SNOWWWWWWW!

-
Yes. That’s not free. Free is when you choose not to make money. And that can be weaponized. But that’s not what Overcast does.
-

She however, is relentless:

-
No, it’s still free. You can choose to support it, you are required to pay $4.99 for Pocket Casts. Totally different model.
-

Dude seems to give up. (Note: allllll the people bagging on her are men. All of them. Mansplaining like hell. And I’d bet every one of them considers themselves a feminist.)

-

We get another guy trying to push the narrative she’s punishing him for his success, which is just…it’s stupid, okay? Stupid.

-
It also wasn’t my point in writing my piece today, but it seems to be everyone’s focus.
-

(UNDERSTATEMENT OF THE YEAR)

-
I think the focus should be more on that fact that while it’s difficult, Marco spent years building his audience.
-
It doesn’t matter what he makes it how he charges. If the audience be earned is willing to pay for it, awesome.
-

She tries, oh lord, she tries:

-
To assert that he isn’t doing anything any other dev couldn’t, is wrong. It’s successful because it’s Marco.
-

But no, HE KNOWS HER POINT BETTER THAN SHE DOES:

-
No, it’s successful because he busted his ass to make it so. It’s like any other business. He grew it.
-

Christ. This is like a field of strawmen. Stupid ones. Very stupid ones.

-

One guy tries to blame it all on Apple, another in a string of Wha??? moments:

-
the appropriate context is Apple’s App Store policies. Other devs aren’t Marco’s responsibility
-

Seriously? Dude, are you even trying to talk about what Samantha actually wrote? At this point, Samantha is clearly mystified at the entire thing:

-
Why has the conversation suddenly turned to focus on nothing more than ATP sponsorship income?
-

Because it’s a nit they can pick and allows them to ignore everything you wrote. That’s the only reason.

-

One guy is “confused”:

-
I see. He does have clout, so are you saying he’s too modest in how he sees himself as a dev?
-
Yes. He can’t be equated to the vast majority of other developers. Like calling Gruber, “just another blogger”.
-
Alright, that’s fair. I was just confused by the $ and fame angle at first.
-

Samantha’s point centers on the benefits Marco gains via his fame and background. HOW DO YOU NOT MENTION THAT? HOW IS THAT CONFUSING?

-

People of course are telling her it’s her fault for mentioning a salient fact at all:

-
Why has the conversation suddenly turned to focus on nothing more than ATP sponsorship income?
-
Maybe because you went there with your article?
-
As a way of rationalizing his ability to gamble with the potential for Overcast to generate income…not the norm at all.
-

Of course, had she not brought up those important points, she’d have been bagged on for “not providing proof”. Lose some, lose more. By now, she’s had enough and she just deletes all mention of it. Understandable, but sad she was bullied into doing that.

-

Yes, bullied. That’s all this is. Bullying. She didn’t lie, cheat, or exaagerate. If her numbers were wrong, they weren’t wrong in a way she had any ability to do anything about. But there’s blood in the water, and the comments and attacks get worse:

-
Because you decided to start a conversation about someone else’s personal shit. You started this war.
-

War. THIS. IS. WAR.

-

This is a bunch of nerds attacking someone for reasoned, calm, polite criticism of their friend/idol. Samantha is politely pushing back a bit:

-
That doesn’t explain why every other part of my article is being pushed aside.
-

She’s right. This is all nonsense. This is people ignoring her article completely, just looking for things to attack so it can be dismissed. It’s tribalism at its purest.

-

Then some of the other annointed get into it, including Jason Snell in one of the most spectactular displays of “I have special knowledge you can’t be expected to have, therefore you are totally off base and wrong, even though there’s no way for you to know this” I’ve seen in a while. Jason:

-
You should never use an ad rate card to estimate ad revenue from any media product ever.
-
I learned this when I started working for a magazine — rate cards are mostly fiction, like prices on new cars
-

How…exactly…in the name of whatever deity Jason may believe in…is Samantha or anyone not “in the biz” supposed to know this. Also, what exactly does a magazine on paper like Macworld have to do with sponsorships for a podcast? I have done podcasts that were sponsored, and I can retaliate with “we charged what the rate card said we did. Checkmate Elitests!

-

Samantha basically abases herself at his feet:

-
I understand my mistake, and it’s unfortunate that it has completely diluted the point of my article.
-

I think she should have told him where and how to stuff that nonsense, but she’s a nicer person than I am. Also, it’s appropriate that Jason’s twitter avatar has its nose in the air. This is some rank snobbery. It’s disgusting and if anyone pulled that on him, Jason would be very upset. But hey, one cannot criticize The Marco without getting pushback. By “pushback”, I mean “an unrelenting fecal flood”.

-

Her only mistake was criticizing one of the Kool Kids. Folks, if you criticize anyone in The Deck Clique, or their friends, expect the same thing, regardless of tone or point.

-

Another App Dev, seemingly unable to parse Samantha’s words, needs more explanation:

-
so just looking over your mentions, I’m curious what exactly was your main point? Ignoring the podcast income bits.
-

Oh wait, he didn’t even read the article. Good on you, Dev Guy, good. on. you. Still, she plays nice with someone who didn’t even read her article:

-
That a typical unknown developer can’t depend on patronage to generate revenue, and charging for apps will become a negative.
-

Marco comes back of course, and now basically accuses her of lying about other devs talking to her and supporting her point:

-
How many actual developers did you hear from, really? Funny how almost nobody wants to give a (real) name on these accusations.
-

Really? You’re going to do that? “There’s no name, so I don’t think it’s a real person.” Just…what’s the Joe Welch quote from the McCarthy hearings?

-
Let us not assassinate this lad further, Senator. You’ve done enough. Have you no sense of decency, sir? At long last, have you left no sense of decency?
-

That is what this is at this point: character assasination because she said something critical of A Popular Person. It’s disgusting. Depressing and disgusting. No one, none of these people have seriously discussed her point, heck, it looks like they barely bothered to read it, if they did at all.

-

Marco starts getting really petty with her (no big shock) and Samantha finally starts pushing back:

-
Glad to see you be the bigger person and ignore the mindset of so many developers not relating to you, good for you!
-

That of course, is what caused Marco to question the validity, if not the existence of her sources. (Funny how anonymous sources are totes okay when they convenience Marco et al, and work for oh, Apple, but when they are inconvenient? Ha! PROVIDE ME PROOF YOU INTEMPERATE WOMAN!)

-

Make no mistake, there’s some sexist shit going on here. Every tweet I’ve quoted was authored by a guy.

-

Of course, Marco has to play the “I’ve been around longer than you” card with this bon mot:

-
Yup, before you existed!
-

Really dude? I mean, I’m sorry about the penis, but really?

-

Mind you, when the criticism isn’t just bizarrely stupid, Samantha reacts the way Marco and his ilk claim they would to (if they ever got any valid criticism. Which clearly is impossible):

-
Not to get into the middle of this, but “income” is not the term you’re looking for. “Revenue” is.
-
lol. Noted.
-
And I wasn’t intending to be a dick, just a lot of people hear/say “income” when they intend “revenue”, and then discussion …
-
… gets derailed by a jedi handwave of “Expenses”. But outside of charitable donation, it is all directly related.
-
haha. Thank you for the clarification.
-

Note to Marco and the other…whatever they are…that is how one reacts to that kind of criticism. With a bit of humor and self-deprecation. You should try it sometime. For real, not just in your heads or conversations in Irish Pubs in S.F.

-

But now, the door has been cracked, and the cheap shots come out:

-
@testflight_app: Don’t worry guys, we process @marcoarment’s apps in direct proportion to his megabucks earnings. #fairelephant
-

(Note: testflight_app is a parody account. Please do not mess with the actual testflight folks. They are still cool.)

-

Or this…conversation:

-
-
-
-
-
-
-

Good job guys. Good job. Defend the tribe. Attack the other. Frederico attempts to recover from his stunning display of demeaning douchery: ‏@viticci: @s_bielefeld I don’t know if it’s an Italian thing, but counting other people’s money is especially weird for me. IMO, bad move in the post.

-

Samantha is clearly sick of his crap: ‏@s_bielefeld: @viticci That’s what I’m referring to, the mistake of ever having mentioned it. So, now, Marco can ignore the bigger issue and go on living.

-

Good for her. There’s being patient and being roadkill.

-

Samantha does put the call out for her sources to maybe let her use their names:

-
From all of you I heard from earlier, anyone care to go on record?
-

My good friend, The Angry Drunk points out the obvious problem:

-
Nobody’s going to go on record when they count on Marco’s friends for their PR.
-

This is true. Again, the sites that are Friends of Marco:

-

Daring Fireball

-

The Loop

-

SixColors

-

iMore

-

MacStories

-

A few others, but I want this post to end one day.

-

You piss that crew off, and given how petty rather a few of them have demonstrated they are, good luck on getting any kind of notice from them.

-

Of course, the idea this could happen is just craycray:

-
@KevinColeman .@Angry_Drunk @s_bielefeld @marcoarment Wow, you guys are veering right into crazy conspiracy theory territory. #JetFuelCantMeltSteelBeams
-

Yeah. Because a mature person like Marco would never do anything like that.

-

Of course, the real point on this is starting to happen:

-
you’re getting a lot of heat now but happy you are writing things that stir up the community. Hope you continue to be a voice!
-
I doubt I will.
-

See, they’ve done their job. Mess with the bull, you get the horns. Maybe you should find another thing to write about, this isn’t a good place for you. Great job y’all.

-

Some people aren’t even pretending. They’re just in full strawman mode:

-
@timkeller: Unfair to begrudge a person for leveraging past success, especially when that success is earned. No ‘luck’ involved.
-
@s_bielefeld: @timkeller I plainly stated that I don’t hold his doing this against him. Way to twist words.
-

I think she’s earned her anger at this point.

-

Don’t worry, Marco knows what the real problem is: most devs just suck —

-
-
-
-
-
-
-

I have a saying that applies in this case: don’t place your head so far up your nethers that you go full Klein Bottle. Marco has gone full Klein Bottle. (To be correct, he went FKB some years ago.)

-

There are some bright spots. My favorite is when Building Twenty points out the real elephant in the room:

-
@BuildingTwenty: Both @s_bielefeld & I wrote similar critiques of @marcoarment’s pricing model yet the Internet pilloried only the woman. Who’d have guessed?
-

Yup.

-

Another bright spot are these comments from Ian Betteridge, who has been doing this even longer than Marco:

-
You know, any writer who has never made a single factual error in a piece hasn’t ever written anything worth reading.
-
I learned my job with the support of people who helped me. Had I suffered an Internet pile on for every error I wouldn’t have bothered.
-

To which Samantha understandably replies:

-
and it’s honestly something I’m contemplating right now, whether to continue…
-

Gee, I can’t imagine why. Why with comments like this from Chris Breen that completely misrepresent Samantha’s point, (who until today, I would have absolutely defended as being better than this, something I am genuinely saddened to be wrong about), why wouldn’t she want to continue doing this?

-
If I have this right, some people are outraged that a creator has decided to give away his work.
-

No Chris, you don’t have this right. But hey, who has time to find out the real issue and read an article. I’m sure your friends told you everything you need to know.

-

Noted Feminist Glenn Fleishman gets a piece of the action too:

-
-
-
-
-
-
-

I’m not actually surprised here. I watched Fleishman berate a friend of mine who has been an engineer for…heck, waaaaay too long on major software products in the most condescending way because she tried to point out that as a very technical woman, “The Magazine” literally had nothing to say to her and maybe he should fix that. “Impertinent” was I believe what he called her, but I may have the specific word wrong. Not the attitude mind you. Great Feminists like Glenn do not like uppity women criticizing Great Feminists who are their Great Allies.

-

Great Feminists are often tools.

-
-
-
-
-
-
-
-
-
-

Luckily, I hope, the people who get Samantha’s point also started chiming in (and you get 100% of the women commenting here that I’ve seen):

-
I don’t think he’s wrong for doing it, he just discusses it as if the market’s a level playing field — it isn’t
-
This is a great article with lots of great points about the sustainability of iOS development. Thank you for publishing it.
-
Regardless of the numbers and your view of MA, fair points here about confirmation bias in app marketing feasibility http://samanthabielefeld.com/the-elephant-in-the-room …
-
thank you for posting this, it covers a lot of things people don’t like to talk about.
-
I’m sure you have caught untold amounts of flak over posting this because Marco is blind to his privilege as a developer.
-
Catching up on the debate, and agreeing with Harry’s remark. (Enjoyed your article, Samantha, and ‘got’ your point.)
-
-
-
-
-
-
-
-
-
-

I would like to say I’m surprised at the reaction to Samantha’s article, but I’m not. In spite of his loud declarations of support for The Big Lie, Marco Arment is as bad at any form of criticism that he hasn’t already approved as a very insecure tween. An example from 2011: http://www.businessinsider.com/marco-arment-2011-9

-

Marco is great with criticism as long as it never actually criticizes him. If it does, be prepared a flood of petty, petulant whining that a room full of bored preschoolers on a hot day would be hard-pressed to match.

-

Today has been…well, it sucks. It sucks because someone doing what all the Arments of the world claim to want was naive enough to believe what they were told, and found out the hard way just how big a lie The Big Lie is, and how vicious people are when you’re silly enough to believe anything they say about criticism.

-

And note again, every single condescending crack, misrepresentation, and strawman had an exclusively male source. Most of them have, at one point or another, loudly trumpted themselves as Feminist Allies, as a friend to women struggling with the sexism and misogyny in tech. Congratulations y’all on being just as bad as the people you claim to oppose.

-

Samantha has handled this better than anyone else could have. My respect for her as a person and a writer is off the charts. If she choses to walk away from blogging in the Apple space, believe me I understand. As bad as today was for her, I’ve seen worse. Much worse.

-

But I hope she doesn’t. I hope she stays, because she is Doing This Right, and in a corner of the internet that has become naught but an endless circle jerk, a cliquish collection, a churlish, childish cohort interested not in writing or the truth, but in making sure The Right People are elevated, and The Others put down, she is someone worth reading and listening to. The number people who owe her apologies goes around the block, and I don’t think she’ll ever see a one. I’m sure as heck not apologizing for them, I’ll not make their lives easier in the least.

-

All of you, all. of. you…Marco, Breen, Snell, Vittici, had a chance to live by your words. You were faced with reasoned, polite, respectful criticism and instead of what you should have done, you all dropped trou and sprayed an epic diarrheal discharge all over someone who had done nothing to deserve it. Me, I earned most of my aggro, Samantha did not earn any of the idiocy I’ve seen today. I hope you’re all proud of yourselves. Someone should be, it won’t be me. Ever.

-

So I hope she stays, but if she goes, I understand. For what it’s worth, I don’t think she’s wrong either way.

-
-
-
-
- -
-
-
-
-
    -
  • Share
  • -
  • -
    -
  • -
  • -
  • -
-
-
-
-
-
-
- Go to the profile of John C. Welch -
-
-
Never miss a story from John C. Welch, when you sign up for Medium. Learn more
-
Never miss a story from John C. Welch
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- - - - -
- - - - + + + + + + + + + + + + + + + + + diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/missing-paragraphs/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/missing-paragraphs/expected-metadata.json index b0ef9465b..cf0a02b5e 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/missing-paragraphs/expected-metadata.json +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/missing-paragraphs/expected-metadata.json @@ -3,6 +3,6 @@ "Direction": null, "Excerpt": "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy\n eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam\n voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet\n clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit\n amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam\n nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat,\n sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.\n Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor\n sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed\n diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat,\n sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.\n Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor\n sit amet.", "Image": null, - "Title": "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy\n eirmod tempor invidunt", + "Title": "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt", "SiteName": null } diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/mozilla-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/mozilla-1/expected.html index ba1896ea7..986406c8f 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/mozilla-1/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/mozilla-1/expected.html @@ -1,67 +1,96 @@ -
+
+

It’s easier than ever to personalize Firefox and make it work the way you do. -

No other browser gives you so much choice and flexibility.

+
No other browser gives you so much choice and flexibility.

-

+

-
+
-

Designed to

be redesigned

+

Designed to
be redesigned

Get fast and easy access to the features you use most in the new menu. Open the “Customize” panel to add, move or remove any button you want. Keep your favorite features — add-ons, private browsing, Sync and more — one quick click away.

-

+

+

-

+

-
-
-
+
+

More ways to customize

+ + +
+
+

Themes

Make Firefox match your style. Choose from thousands of themes and dress up your browser with a single click.

-

Try it now +

Try it now -

Learn more +
Learn more -

Next

Preview of the currently selected theme

+

Next

Preview of the currently selected theme +

-
+

Add-ons

Next

Add-ons are like apps that you install to add features to Firefox. They let you compare prices, check the weather, listen to music, send a tweet and more.

-

Here are a few of our favorites -

Learn more +
Learn more

-

+

+

-
+

Awesome Bar

Next

The Awesome Bar learns as you browse to make your version of Firefox unique. Find and return to your favorite sites without having to remember a URL.

-

See what it can do for you +

See what it can do for you

-

Firefox Awesome Bar

+

Firefox Awesome Bar +

-
+
-
-
\ No newline at end of file + +
\ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/mozilla-2/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/mozilla-2/expected.html index 8ce4c0703..7cf3fc38e 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/mozilla-2/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/mozilla-2/expected.html @@ -1,8 +1,14 @@ -
+
+
+
+

Get to know the features that make it the most complete browser for building the Web.

-
  • +
+
    +
  • - Screenshot + Screenshot +

    WebIDE

    Develop, deploy and debug Firefox OS apps directly in your browser, or on a Firefox OS device, with this tool that replaces App Manager.

    Learn more about WebIDE @@ -10,24 +16,32 @@
  • - Screenshot + Screenshot +

    Valence

    Develop and debug your apps across multiple browsers and devices with this powerful extension that comes pre-installed with Firefox Developer Edition.

    Learn more about Valence
  • -
+ +

Important: Sync your new profile

Developer Edition comes with a new profile so you can run it alongside other versions of Firefox. To access your bookmarks, browsing history and more, you need to sync the profile with your existing Firefox Account, or create a new one. Learn more

-
-

Features and tools

-
  • +
+ +
+
+

Features and tools

+
+
    +
  • - Screenshot + Screenshot +

    Page Inspector

    Examine the HTML and CSS of any Web page and easily modify the structure and layout of a page.

    Learn more about Page Inspector @@ -35,7 +49,8 @@
  • - Screenshot + Screenshot +

    Web Console

    See logged information associated with a Web page and use Web Console to interact with Web pages using JavaScript.

    Learn more about Web Console @@ -43,7 +58,8 @@
  • - Screenshot + Screenshot +

    JavaScript Debugger

    Step through JavaScript code and examine or modify its state to help track down bugs.

    Learn more about JavaScript Debugger @@ -51,7 +67,8 @@
  • - Screenshot + Screenshot +

    Network Monitor

    See all the network requests your browser makes, how long each request takes and details of each request.

    Learn more about Network Monitor @@ -59,7 +76,8 @@
  • - Screenshot + Screenshot +

    Web Audio Editor

    Inspect and interact with Web Audio API in real time to ensure that all audio nodes are connected in the way you expect.

    Learn more about Web Audio Editor @@ -67,11 +85,13 @@
  • - Screenshot + Screenshot +

    Style Editor

    View and edit CSS styles associated with a Web page, create new ones and apply existing CSS stylesheets to any page.

    Learn more about Style Editor
  • -
-
\ No newline at end of file + + + \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/msn/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/msn/expected.html index 3ed4d696c..77570113d 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/msn/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/msn/expected.html @@ -1,7 +1,10 @@ -

+

+
+

- - <span style="font-size:13px;">Nintendo/Apple</span> + + <span style="font-size:13px;">Nintendo/Apple</span> + © Provided by Business Insider Inc Nintendo/Apple @@ -13,6 +16,7 @@

The name and basic idea might sound like one of those endless score attack games like "Temple Run," but that's not the case. "Super Mario Run" is divided into hand-crafted levels with a clear end-point like any other Mario game, meaning you're essentially getting the Mario experience for $10 without needing to control his movement.

$10 might seem like a bit much compared to the $0 people pay for most mobile games, but it's possible the game has $10 worth of levels to play in it. It's also not iPhone exclusive, but the Android version will launch at a later, currently unknown date.

To see "Super Mario Run" in action, check out the footage below:

-

+

-
\ No newline at end of file +
+
\ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-1/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-1/expected-images.json index c89c43ca2..077eb6014 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-1/expected-images.json +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-1/expected-images.json @@ -1,4 +1,4 @@ [ - "https:\/\/static01.nyt.com\/images\/2017\/01\/14\/world\/13SUDAN-1\/13SUDAN-1-videoSixteenByNineJumbo1600.jpg", + "https:\/\/static01.nyt.com\/images\/2017\/01\/14\/world\/13SUDAN-1\/13SUDAN-1-facebookJumbo.jpg", "https:\/\/static01.nyt.com\/images\/2017\/01\/14\/world\/13SUDAN-1\/13SUDAN-1-master768.jpg" ] \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-1/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-1/expected-metadata.json index 36da83868..724e18ade 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-1/expected-metadata.json +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-1/expected-metadata.json @@ -2,7 +2,7 @@ "Author": "Jeffrey Gettleman", "Direction": null, "Excerpt": "For the first time since the 1990s, the country will be able to trade extensively with the United States.", - "Image": "https:\/\/static01.nyt.com\/images\/2017\/01\/14\/world\/13SUDAN-1\/13SUDAN-1-videoSixteenByNineJumbo1600.jpg", + "Image": "https:\/\/static01.nyt.com\/images\/2017\/01\/14\/world\/13SUDAN-1\/13SUDAN-1-facebookJumbo.jpg", "Title": "United States to Lift Sudan Sanctions", "SiteName": null -} +} \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-1/expected.html index 60f7148bc..415165947 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-1/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-1/expected.html @@ -1,13 +1,32 @@ -
-
-
Photo +
+ + +
+
+ + + + + + + + + +
+
+ Photo
-

-
-
United Nations peacekeepers at a refugee camp in Sudan on Monday. In exchange for the lifting of United States trade sanctions, Sudan has said it will improve access for aid groups, stop supporting rebels in neighboring South Sudan and cooperate with American intelligence agents. +

+ + +
+
+ United Nations peacekeepers at a refugee camp in Sudan on Monday. In exchange for the lifting of United States trade sanctions, Sudan has said it will improve access for aid groups, stop supporting rebels in neighboring South Sudan and cooperate with American intelligence agents. Credit Ashraf Shazly/Agence France-Presse — Getty Images -

LONDON — After nearly 20 years of hostile relations, the American government plans to reverse its position on Sudan and lift trade sanctions, Obama administration officials said late Thursday.

+ + +

LONDON — After nearly 20 years of hostile relations, the American government plans to reverse its position on Sudan and lift trade sanctions, Obama administration officials said late Thursday.

Sudan is one of the poorest, most isolated and most violent countries in Africa, and for years the United States has imposed punitive measures against it in a largely unsuccessful attempt to get the Sudanese government to stop killing its own people.

On Friday, the Obama administration will announce a new Sudan strategy. For the first time since the 1990s, the nation will be able to trade extensively with the United States, allowing it to buy goods like tractors and spare parts and attract much-needed investment in its collapsing economy.

In return, Sudan will improve access for aid groups, stop supporting rebels in neighboring South Sudan, cease the bombing of insurgent territory and cooperate with American intelligence agents.

@@ -28,10 +47,29 @@

“There is no reason to believe the guys in charge have changed their stripes,” said Mr. Reeves, a senior fellow at the François-Xavier Bagnoud Center for Health and Human Rights at Harvard University. “These guys are the worst of the worst.”

Obama administration officials said that they had briefed President-elect Donald J. Trump’s transition team, but that they did not know if Mr. Trump would stick with a policy of warmer relations with Sudan.

They said that Sudan had a long way to go in terms of respecting human rights, but that better relations could help increase American leverage.

-

Mr. Reeves said he thought that the American government was being manipulated and that the Obama administration had made a “deal with the devil.”

+

Mr. Reeves said he thought that the American government was being manipulated and that the Obama administration had made a “deal with the devil.”

+

Continue reading the main story

- - - -
\ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-2/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-2/expected-images.json index e4b49d00e..1afbadf84 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-2/expected-images.json +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-2/expected-images.json @@ -1,4 +1,4 @@ [ - "https:\/\/static01.nyt.com\/images\/2016\/07\/30\/business\/db-dealprof\/db-dealprof-videoSixteenByNineJumbo1600.jpg", - "https:\/\/static01.nyt.com\/images\/2016\/07\/30\/business\/db-dealprof\/db-dealprof-master315.jpg" + "https:\/\/static01.nyt.com\/images\/2016\/07\/30\/business\/db-dealprof\/db-dealprof-facebookJumbo.jpg", + "https:\/\/static01.nyt.com\/images\/2016\/07\/30\/business\/db-dealprof\/db-dealprof-master315.jpg" ] \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-2/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-2/expected-metadata.json index 7fbcf29ee..21af4ee0d 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-2/expected-metadata.json +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-2/expected-metadata.json @@ -1,8 +1,8 @@ { "Author": "Steven Davidoff Solomon", "Direction": null, - "Excerpt": "The internet giant’s decision to sell its business is plagued with challenges that reveal how unusual deal structures can affect shareholders.", - "Image": "https:\/\/static01.nyt.com\/images\/2016\/07\/30\/business\/db-dealprof\/db-dealprof-videoSixteenByNineJumbo1600.jpg", - "Title": "Yahoo’s Sale to Verizon Leaves Shareholders With Little Say", + "Excerpt": "The internet giant\u2019s decision to sell its business is plagued with challenges that reveal how unusual deal structures can affect shareholders.", + "Image": "https:\/\/static01.nyt.com\/images\/2016\/07\/30\/business\/db-dealprof\/db-dealprof-facebookJumbo.jpg", + "Title": "Yahoo\u2019s Sale to Verizon Leaves Shareholders With Little Say", "SiteName": null -} +} \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-2/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-2/expected.html index 1584ca437..168bd3bc5 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-2/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-2/expected.html @@ -1,21 +1,43 @@ -
-
-
Photo +
+ + +
+
+ + + + + + + + + + + +
+
+ Photo
-

-
-
+

+ + +
+
+ Credit Harry Campbell -

Yahoo’s $4.8 billion sale to Verizon is a complicated beast, showing how different acquisition structures can affect how shareholders are treated.

+ + +

Yahoo’s $4.8 billion sale to Verizon is a complicated beast, showing how different acquisition structures can affect how shareholders are treated.

First, let’s say what the Yahoo sale is not. It is not a sale of the publicly traded company. Instead, it is a sale of the Yahoo subsidiary and some related assets to Verizon.

The sale is being done in two steps. The first step will be the transfer of any assets related to Yahoo business to a singular subsidiary. This includes the stock in the business subsidiaries that make up Yahoo that are not already in the single subsidiary, as well as the odd assets like benefit plan rights. This is what is being sold to Verizon. A license of Yahoo’s oldest patents is being held back in the so-called Excalibur portfolio. This will stay with Yahoo, as will Yahoo’s stakes in Alibaba Group and Yahoo Japan.

It is hard to overestimate how complex an asset sale like this is. Some of the assets are self-contained, but they must be gathered up and transferred. Employees need to be shuffled around and compensation arrangements redone. Many contracts, like the now-infamous one struck with the search engine Mozilla, which may result in a payment of up to a $1 billion, will contain change-of-control provisions that will be set off and have to be addressed. Tax issues always loom large.

Continue reading the main story

- - - -
-
+ +
+ +

Continue reading the main story

+
+

In the second step, at the closing, Yahoo will sell the stock in the single subsidiary to Verizon. At that point, Yahoo will change its name to something without “Yahoo” in it. My favorite is simply Remain Co., the name Yahoo executives are using. Remain Co. will become a holding company for the Alibaba and Yahoo Japan stock. Included will also be $10 billion in cash, plus the Excalibur patent portfolio and a number of minority investments including Snapchat. Ahh, if only Yahoo had bought Snapchat instead of Tumblr (indeed, if only Yahoo had bought Google or Facebook when it had the chance).

Because it is a sale of a subsidiary, the $4.8 billion will be paid to Yahoo. Its shareholders will not receive any money unless Yahoo pays it out in a dividend (after paying taxes). Instead, Yahoo shareholders will be left holding shares in the renamed company.

@@ -35,7 +57,25 @@

Finally, if another bidder still wants to acquire Yahoo, it has time. The agreement with Verizon allows Yahoo to terminate the deal and accept a superior offer by paying a $144 million breakup fee to Verizon. And if Yahoo shareholders change their minds and want to stick with Yahoo’s chief executive, Marissa Mayer, and vote down the deal, there is a so-called naked no-vote termination fee of $15 million payable to Verizon to reimburse expenses.

All in all, this was as hairy a deal as they come. There was the procedural and logistical complications of selling a company when the chief executive wanted to stay. Then there was the fact that this was an asset sale, including all of the challenges that go with it. Throw in all of the tax issues and the fact that this is a public company, and it is likely that the lawyers involved will have nightmares for years to come.

Continue reading the main story

- - - -
\ No newline at end of file + + + + + + + + + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/pixnet/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/pixnet/expected-metadata.json index dafb56b44..577686706 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/pixnet/expected-metadata.json +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/pixnet/expected-metadata.json @@ -1,8 +1,8 @@ { - "Author": "史蒂文的家_藍天 (stevenhgm)", + "Author": "\u53f2\u8482\u6587\u7684\u5bb6_\u85cd\u5929 (stevenhgm)", "Direction": null, - "Excerpt": "一波波接續性低溫寒流報到 已將新竹尖石鄉後山一帶層層山巒披上嫣紅的彩衣 玉峰道路一路上雲氣山嵐滯留山頭 順路下切蜿蜒道路後不久即抵達來到"玉峰國小" "美樹"美", + "Excerpt": "\u4e00\u6ce2\u6ce2\u63a5\u7e8c\u6027\u4f4e\u6eab\u5bd2\u6d41\u5831\u5230 \u5df2\u5c07\u65b0\u7af9\u5c16\u77f3\u9109\u5f8c\u5c71\u4e00\u5e36\u5c64\u5c64\u5c71\u5dd2\u62ab\u4e0a\u5ae3\u7d05\u7684\u5f69\u8863 \u7389\u5cf0\u9053\u8def\u4e00\u8def\u4e0a\u96f2\u6c23\u5c71\u5d50\u6eef\u7559\u5c71\u982d \u9806\u8def\u4e0b\u5207\u873f\u8712\u9053\u8def\u5f8c\u4e0d\u4e45\u5373\u62b5\u9054\u4f86\u5230\"\u7389\u5cf0\u570b\u5c0f\" \"\u7f8e\u6a39\"\u7f8e", "Image": "http:\/\/pic.pimg.tw\/stevenhgm\/1387895093-631461272.jpg", - "Title": "新竹尖石_美樹營地賞楓 (2) @ 史蒂文的家_藍天 :: 痞客邦 PIXNET ::", - "SiteName": "史蒂文的家_藍天" -} + "Title": "\u65b0\u7af9\u5c16\u77f3_\u7f8e\u6a39\u71df\u5730\u8cde\u6953 (2) @ \u53f2\u8482\u6587\u7684\u5bb6_\u85cd\u5929 :: \u75de\u5ba2\u90a6 PIXNET ::", + "SiteName": "\u53f2\u8482\u6587\u7684\u5bb6_\u85cd\u5929" +} \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/pixnet/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/pixnet/expected.html index ffa81c794..80a2e4a7b 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/pixnet/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/pixnet/expected.html @@ -1,6 +1,6 @@

- 12-IMG_3886.jpg + 12-IMG_3886.jpg

一波波接續性低溫寒流報到 已將新竹尖石鄉後山一帶層層山巒披上嫣紅的彩衣

@@ -14,7 +14,7 @@

營區內除了露營、民宿、餐飲賞楓項目多了許多原木飾品更有畫龍點睛加乘效果

-

30-IMG_4228.jpg

+

30-IMG_4228.jpg

廣受歡迎的美樹營地有個很大特色就是楓紅時期楓香樹由綠轉黃、轉紅到楓紅層層

一來到"美樹"馬上眼睛為之一亮 也會深深地為那多種顏色多層次渲染之下楓紅而迷惑 @@ -29,66 +29,66 @@

-

31-IMG_4231.jpg

+

31-IMG_4231.jpg

每年12月向來是攝影班外拍的絕佳場所之一 楓紅期間入園費$50元

園區給愛攝一族淨空場景而不是散搭帳蓬之下反而影響拍照畫面與構圖取景

露營的話則須待中午過後再進場搭帳的彈性做法個人也相當支持這樣的權宜之計

- P1610088.jpg + P1610088.jpg

來到現場已是落葉飄飄堆疊滿地 不時隨著風吹雨襲而葉落垂地

- P1610069.jpg + P1610069.jpg

不忍踩過剛剛掉落的樹葉 沿著前人足跡踏痕輕踩而行

雖然只是一廂情願的想法 終究還是不可避免地將會化為塵土

-

02-P1610080.jpg

+

02-P1610080.jpg

葉落繽紛顯得幾分蕭瑟氣息 空氣中可以嗅得出來依然瀰漫著濕寒水氣

偶而還會飄下來一些霧氣水滴 不時張望尋找最佳楓葉主題

-

04-P1610087.jpg

+

04-P1610087.jpg

外拍的攝影班學員一堆早已不時穿梭其間

各自努力地找尋自認為最好的拍攝角度

-

05-P1610099.jpg

+

05-P1610099.jpg

-

P1610095.jpg

+

P1610095.jpg

-

13-IMG_3891.jpg

+

13-IMG_3891.jpg

-

15-IMG_3906.jpg

+

15-IMG_3906.jpg

"水槽"上面的這幾隻彩繪版貓頭鷹也太可愛了

同樣的造型加上不同色彩宛如賦予不同的生命力一般 cool!

-

16-IMG_3916.jpg

+

16-IMG_3916.jpg

雨水洗塵後的枝頭固然掉落些葉片是否也洗去塵勞憂傷

-

17-IMG_3919.jpg

+

17-IMG_3919.jpg

-

06-IMG_3853.jpg

+

06-IMG_3853.jpg

喜歡拍照的不論是平面掃描、天空搜尋、地上地毯式搜索

有如小說偵探一般 不放過蛛絲馬跡地用力尋尋覓覓找尋最美角度

-

07-P1610104.jpg

+

07-P1610104.jpg

-

08-IMG_3862.jpg

+

08-IMG_3862.jpg

原本這周是由小朱團長早在一年前就跟"簍信"預定下來的場子

早上從台北出門之際還是小雨不斷細雨紛飛來到此地雖雨已停

但多日來的雨勢不斷已有部分區域水漬成攤並不適合落置帳篷

@@ -98,32 +98,32 @@

-

18-P1610141.jpg

+

18-P1610141.jpg

午後從"秀巒"回到美樹之際已經全數撤退只剩下我們三車留下來

唯有"離開地球表面"睡車上的才可以不受到地上泥濘而影響

-

19-IMG_3933.jpg

+

19-IMG_3933.jpg

-

14-P1610134.jpg

+

14-P1610134.jpg

午後山嵐興起雲氣遊蕩盤旋在對岸山頭 人潮來來去去似乎也沒有減少

-

44-P1610283.jpg

-

美樹民宿有開設餐廳 室內簡單佈置提供伙食餐飲

+

44-P1610283.jpg

+

美樹民宿有開設餐廳 室內簡單佈置提供伙食餐飲

- P1610212.jpg + P1610212.jpg

這兩間是民宿房間 跟著民宿主人"簍信"聊起來還提到日後將改變成兩層木屋

一樓則是咖啡飲料/賣店提供訪客來賓有個落腳席座之地 二樓才會是民宿房間

-

心中有了計畫想法才會有日後的夢想藍圖 相信將會改變得更好的民宿露營環境

+

心中有了計畫想法才會有日後的夢想藍圖 相信將會改變得更好的民宿露營環境

- P1610219.jpg + P1610219.jpg

民宿前這一大區楓香林為土質營位 大致區分前、後兩個營區

前面這一區約可搭上十二帳/車/廳 後面那區也大約4~5帳/車/廳

@@ -131,26 +131,26 @@

-

10-P1610114.jpg

+

10-P1610114.jpg

營區水電方便 水槽也很有特色

-

22-P1610245.jpg

+

22-P1610245.jpg

這次選擇左側地勢高些以防午夜下雨泥濘

-

20-P1610238.jpg

+

20-P1610238.jpg

"野馬"特地帶來了冬至應景食材ㄜ---湯圓

這家還是最近被評比第一名氣的湯圓專賣店

-

21-P1610241.jpg

-

向來對於湯圓是敬謝不敏 沒想到是出乎意料之外的好吃 沒話說!

+

21-P1610241.jpg

+

向來對於湯圓是敬謝不敏 沒想到是出乎意料之外的好吃 沒話說!

-

24-IMG_4113.jpg

+

24-IMG_4113.jpg

喜歡原住民朋友的坦率、真誠 要將民宿營地經營的有聲有色並非容易之事

午茶時間與"簍信"閒聊分享著他的觀點理念之時很支持對於環境應有生態保護

@@ -159,46 +159,46 @@

-

32-IMG_4248.jpg

+

32-IMG_4248.jpg

-

25-IMG_4152.jpg

+

25-IMG_4152.jpg

入夜前雨絲終於漸漸緩和下來 雖然氣溫很低卻沒感受到寒冷的跡象

是山谷中少了寒氣還是美樹營區裡的人熱情洋溢暖化了不少寒意

-

IMG_4158.jpg

-

聖誕前夕裝點些聖誕飾品 感受一下節慶的氛圍

+

IMG_4158.jpg

+

聖誕前夕裝點些聖誕飾品 感受一下節慶的氛圍

-

26-P1610261.jpg

+

26-P1610261.jpg

晚餐準備了砂鍋魚頭

-

46-1021221美樹露營.jpg

+

46-1021221美樹露營.jpg

"蒯嫂"還特地準備著羊肩排、鹹豬肉、柳葉魚...哇!這哩澎湃哩...

 "永老爺"早已備妥了好酒為遠自台南來的蒯兄嫂敬一杯囉

感謝蒯嫂精心準備的好料理 食指大動好菜色感恩ㄟ!

-

27-IMG_4173.jpg

-

吃得快精光之際...才想到忘了拍合照...(哇哩咧 ^&*()

+

27-IMG_4173.jpg

+

吃得快精光之際...才想到忘了拍合照...(哇哩咧 ^&*()

-

28-IMG_4178.jpg

+

28-IMG_4178.jpg

-

29-IMG_4188.jpg

+

29-IMG_4188.jpg

隔日睡到很晚才起床 不用拍日出晨光的營地對我來說都是個幸福的睡眠

哪怕是葉落飄零落滿地還是睡夢周公召見而去 起床的事~差點都忘記了

- IMG_4205.jpg + IMG_4205.jpg

昨天細雨紛飛依然打落了不少落葉中間這株整個都快變成枯枝了

昨天依稀凋零稀疏的楓葉殘留今兒個完全不復存在(上周是最美的代名詞)

-

33-IMG_4255.jpg

+

33-IMG_4255.jpg

上回來得太早沒能見到楓葉泛紅 這次晚了一周已陸續落葉也無從比對楓葉差異性 

另一種角度看不論青楓、金黃葉紅的楓香、葉落飄零秋滿霜、落葉枯枝的蕭瑟 @@ -207,44 +207,44 @@

-

34-P1610269.jpg

-

早起的"蒯嫂"已經備好熱騰騰中式稀飯、包子、蔬果 頓時~有幸福的感覺

+

34-P1610269.jpg

+

早起的"蒯嫂"已經備好熱騰騰中式稀飯、包子、蔬果 頓時~有幸福的感覺

-

35-IMG_4303.jpg

+

35-IMG_4303.jpg

星期天早上趁著攝影團還沒入場先來人物場景特寫

野馬家兩張新"座椅"就當作是試坐囉!拍謝哩

-

38-IMG_4330.jpg

+

38-IMG_4330.jpg

- P1610279.jpg + P1610279.jpg

難得有此無人美景在楓樹下的聖誕氛圍也一定要來一張才行

-

37-IMG_4323.jpg

+

37-IMG_4323.jpg

三家合照(Hero也一定要入鏡的)

-

40-IMG_4342.jpg

+

40-IMG_4342.jpg

接著攝影團入場帶隊老師請求借個時間也來讓學員練習楓樹下的聖誕飾品

此時剛好也遇到早在FB社團相互回應卻頭一次謀面的Mr."大雄"真是幸會了

-

42-IMG_4382.jpg

+

42-IMG_4382.jpg

接近中午時分陽光漸露 藍天帷幕再次嶄露頭角 ~ 久違了!

期盼下的天空終於放晴 沒有缺席的藍天還是準時赴約如期出席

-

41-IMG_4366.jpg

+

41-IMG_4366.jpg

這兩天肉肉(Hero)天雨濕滑無法自由奔跑都快悶壞了

天晴後"蒯嫂"帶著散步遊園也好解解悶

-

43-IMG_4383.jpg

+

43-IMG_4383.jpg

收拾好裝備準備離開營地 亮麗的天空鮮明對比下的楓樹林又讓人覺得有點捨不得離開

道別了"美樹營地"準備前往而行"石磊國小"一個很生疏的小學座落在這深山部落裡

@@ -255,7 +255,7 @@ 資訊

-

聯絡電話:03-584-7231  行動: 0937-141993

林錦武 (泰雅族名: 摟信)

營地地址:新竹縣尖石鄉玉峰村6鄰20號 +

聯絡電話:03-584-7231  行動: 0937-141993
林錦武 (泰雅族名: 摟信)
營地地址:新竹縣尖石鄉玉峰村6鄰20號
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/reordering-paragraphs/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/reordering-paragraphs/expected.html index 4a46dd585..500f6872f 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/reordering-paragraphs/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/reordering-paragraphs/expected.html @@ -1,4 +1,5 @@

+

Regarding item# 11111, under sufficiently extreme conditions, quarks may become deconfined and exist as free particles. In the course of asymptotic freedom, the strong interaction becomes weaker at higher temperatures. @@ -23,4 +24,5 @@ of matter is called quark-gluon plasma.[81] The exact conditions needed to give rise to this state are unknown and have been the subject of a great deal of speculation and experimentation.

-

\ No newline at end of file +
+
\ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/replace-brs/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/replace-brs/expected.html index 56e36a4bc..778fdc062 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/replace-brs/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/replace-brs/expected.html @@ -1,14 +1,14 @@

- Lorem ipsum

dolor sit

amet, consectetur adipisicing elit, sed do eiusmod

- tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,

+ 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

+ 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.

- Tempor

incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,

- quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo

+ 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

+ cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

\ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/replace-font-tags/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/replace-font-tags/expected.html index a36b1a252..cb19cbf17 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/replace-font-tags/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/replace-font-tags/expected.html @@ -1,5 +1,6 @@
-

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod +

Lorem

+

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 diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/replace-font-tags/source.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/replace-font-tags/source.html index 5789e5676..d47851d25 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/replace-font-tags/source.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/replace-font-tags/source.html @@ -8,7 +8,7 @@

Lorem

- Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod + 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 diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/rtl-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/rtl-1/expected.html index eba1686e9..9c611c9e6 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/rtl-1/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/rtl-1/expected.html @@ -1,4 +1,6 @@ -
+
+
+

Lorem

Lorem ipsum dolor sit amet.

@@ -8,4 +10,5 @@

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.

-
\ No newline at end of file +
+
\ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/rtl-2/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/rtl-2/expected.html index eba1686e9..9c611c9e6 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/rtl-2/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/rtl-2/expected.html @@ -1,4 +1,6 @@ -
+
+
+

Lorem

Lorem ipsum dolor sit amet.

@@ -8,4 +10,5 @@

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.

-
\ No newline at end of file +
+
\ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/rtl-3/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/rtl-3/expected.html index 75448882b..789260191 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/rtl-3/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/rtl-3/expected.html @@ -1,4 +1,6 @@ -
+
+
+

Lorem

Lorem ipsum dolor sit amet.

@@ -8,4 +10,5 @@

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.

-
\ No newline at end of file +
+
\ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/rtl-4/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/rtl-4/expected.html index 14724e72d..0d55d33d5 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/rtl-4/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/rtl-4/expected.html @@ -1,4 +1,6 @@ -
+
+
+

Lorem

Lorem ipsum dolor sit amet.

@@ -8,4 +10,5 @@

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.

-
\ No newline at end of file +
+
\ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/salon-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/salon-1/expected.html index d1cb60ef1..4df6b4287 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/salon-1/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/salon-1/expected.html @@ -12,7 +12,7 @@ murdering his ex-wife, seized hostages in a café that was located in Sydney’s Central Business District or “CBD.” In the process he put up an Islamic flag – “igniting,” as Reuters reported, - “fears of a jihadist attack in the heart of the country’s biggest city.”

In the midst of the fear, Uber stepped in and tweeted this announcement:  + “fears of a jihadist attack in the heart of the country’s biggest city.”

In the midst of the fear, Uber stepped in and tweeted this announcement:  “We are all concerned with events in CBD. Fares have increased to encourage more drivers to come online & pick up passengers in the area.”

As Mashable reports, @@ -196,7 +196,7 @@

And then there’s the matter of our collective psyche. In her book “A Paradise Built in Hell: The Extraordinary Communities that Arise in Disaster,” Rebecca Solnit wrote of the purpose, meaning and deep satisfaction people find - when they pull together to help one another in the face of adversity.  + when they pull together to help one another in the face of adversity.  But in the world Uber seeks to create, those surges of the spirit would be replaced by surge pricing.

diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/simplyfound-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/simplyfound-1/expected.html index 55b74a98c..8e8313dc6 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/simplyfound-1/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/simplyfound-1/expected.html @@ -1,18 +1,18 @@
-

The Raspberry Pi Foundation started by a handful of volunteers in 2012 when they released the original Raspberry Pi 256MB Model B without knowing what to expect.  In a short four-year period they have grown to over sixty full-time employees and have shipped over eight million units to-date.  Raspberry Pi has achieved new heights by being shipped to the International Space Station for research and by being an affordable computing platforms used by teachers throughout the world.  "It has become the all-time best-selling computer in the UK".

+

The Raspberry Pi Foundation started by a handful of volunteers in 2012 when they released the original Raspberry Pi 256MB Model B without knowing what to expect.  In a short four-year period they have grown to over sixty full-time employees and have shipped over eight million units to-date.  Raspberry Pi has achieved new heights by being shipped to the International Space Station for research and by being an affordable computing platforms used by teachers throughout the world.  "It has become the all-time best-selling computer in the UK".

Raspberry Pi 3 - A credit card sized PC that only costs $35 - Image: Raspberry Pi Foundation

-

Raspberry Pi Foundation is charity organization that pushes for a digital revolution with a mission to inspire kids to learn by creating computer-powered objects.  The foundation also helps teachers learn computing  skills through free training and readily available tutorials & example code for creating cool things such as music.

+

Raspberry Pi Foundation is charity organization that pushes for a digital revolution with a mission to inspire kids to learn by creating computer-powered objects.  The foundation also helps teachers learn computing  skills through free training and readily available tutorials & example code for creating cool things such as music.

Raspberry Pi in educations - Image: Raspberry Pi Foundation

-

In celebration of their 4th year anniversary, the foundation has released Raspberry Pi 3 with the same price tag of $35 USD.  The 3rd revision features a 1.2GHz 64-bit quad-core ARM CPU with integrated Bluetooth 4.1 and 802.11n wireless LAN chipsets.  The ARM Cortex-A53 CPU along with other architectural enhancements making it the fastest Raspberry Pi to-date.  The 3rd revision is reportedly about 50-60% times faster than its predecessor Raspberry Pi 2 and about 10 times faster then the original Raspberry PI.

+

In celebration of their 4th year anniversary, the foundation has released Raspberry Pi 3 with the same price tag of $35 USD.  The 3rd revision features a 1.2GHz 64-bit quad-core ARM CPU with integrated Bluetooth 4.1 and 802.11n wireless LAN chipsets.  The ARM Cortex-A53 CPU along with other architectural enhancements making it the fastest Raspberry Pi to-date.  The 3rd revision is reportedly about 50-60% times faster than its predecessor Raspberry Pi 2 and about 10 times faster then the original Raspberry PI.

Raspberry Pi - Various Usage

-

Raspberry Pi 3 is now available via many online resellers.  At this time, you should use a recent 32-bit NOOBS or Raspbian image from their downloads page with a promise of a switch to a 64-bit version only if further investigation proves that there is indeed some value in moving to 64-bit mode.

+

Raspberry Pi 3 is now available via many online resellers.  At this time, you should use a recent 32-bit NOOBS or Raspbian image from their downloads page with a promise of a switch to a 64-bit version only if further investigation proves that there is indeed some value in moving to 64-bit mode.

\ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/social-buttons/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/social-buttons/expected.html index 6d135be2c..30c09b2ec 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/social-buttons/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/social-buttons/expected.html @@ -1,4 +1,5 @@
+

Lorem ipsum dolor

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 diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/style-tags-removal/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/style-tags-removal/expected.html index d3a8806b4..a5ba2c6d7 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/style-tags-removal/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/style-tags-removal/expected.html @@ -1,4 +1,6 @@

+

Lorem

+

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, @@ -7,6 +9,7 @@ cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

+

Foo

Tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/svg-parsing/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/svg-parsing/expected.html index 1cc45591b..faa8ff814 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/svg-parsing/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/svg-parsing/expected.html @@ -11,7 +11,13 @@ 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.

-

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod + + + + + + +

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 diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/table-style-attributes/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/table-style-attributes/expected-images.json index c2a1ea915..dc3706450 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/table-style-attributes/expected-images.json +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/table-style-attributes/expected-images.json @@ -1,3 +1,3 @@ [ - "http:\/\/fakehost\/test\/..\/compass1.gif" + "http:\/\/fakehost\/compass1.gif" ] \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/table-style-attributes/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/table-style-attributes/expected.html index 77c083b21..7ded97c76 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/table-style-attributes/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/table-style-attributes/expected.html @@ -1,17 +1,21 @@

linux usability -

...or, why do I bother.


© 2002, 2003 +
...or, why do I bother.

© 2002, 2003 Jamie Zawinski

- + +
+ + + + + + -

In December 2002, I tried to install some software on my computer. The experience was, shall we say, less than pleasant. On many levels. I wrote about my experience, as I so often do.

Then in January, the jackasses over at Slashdot posted a link to it, calling it a "review" of Linux video software. I guess you could consider it a review, if you were to squint at it just right. But really what it is is a rant about how I had an evening stolen from me by crap software design. It is a flame about the pathetic state of Linux usability in general, and the handful of video players I tried out in particular. It makes no attempt to be balanced or objective or exhaustive. It is a description of my experience. Perhaps your experience was different. Good for you.

So of course that day I got hundreds of emails about it. Every Linux apologist in the world wanted to make sure I was fully informed of their opinion. The replies were roughly in the following groups:

-
  • "Right on! I had exactly the same experience! Thank you for putting it into words." (This was about 1/3 of the replies.) +
      +
    • "Right on! I had exactly the same experience! Thank you for putting it into words." (This was about 1/3 of the replies.)
    • "You're clearly an idiot, Linux is too sophisticated for you, you clearly are incapable of understanding anything, you should go back to kindergarten and/or use a Mac." (Oddly, all of these messages used the word `clearly' repeatedly.) @@ -29,29 +33,38 @@
    • "While you have some valid complaints, I'm going to focus on this one inconsequential error you made in your characterization of one of the many roadblocks you encountered. You suck!"
    • -
    • "It's your fault for using Red Hat! You should be using Debian/Mandrake/Gentoo instead!" +
    • "It's your fault for using Red Hat! You should be using Debian/Mandrake/Gentoo instead!"
    • "Red Hat 7.2 is totally obsolete! It's almost 14 months old! What were you expecting!"
    • -

While I am flattered that so many logorrheic Linux fanboys are sufficiently interested in my opinions and experiences to share their deeply heartfelt views with me, you can all rest assured that:

-
    • I've heard it before; and
    • +
        +
          +
        • I've heard it before; and
        • I didn't care the first time.
        • -

      So please. Don't bother sending me any more mail about this. It's a near certainty that I will just delete it unread, so you might as well not waste your time. Feel free to call me names on your own web page if you feel the need to get it out of your system. But kindly stay out of my inbox. +

    +
+

So please. Don't bother sending me any more mail about this. It's a near certainty that I will just delete it unread, so you might as well not waste your time. Feel free to call me names on your own web page if you feel the need to get it out of your system. But kindly stay out of my inbox.

+
+

that said...

I understand that one can play videos on one's computer. I understand these videos come in many different formats. Every now and then I try to figure out what the Done Thing is, as far as playing movies on one's Linux machine.

-
    (Really my eventual goal is to be able to create video on Linux, but I figured I'd start small, and see if I could just get playback working before trying something that is undoubtedly ten thousand times harder.)

I finally found RPMs of mplayer that would consent to install themselves on a Red Hat 7.2 machine, and actually got it to play some videos. Amazing. But it's a total pain in the ass to use due to rampant "themeing." Why do people do this? They map this stupid shaped window with no titlebar (oh, sorry, your choice of a dozen stupidly-shaped windows without titlebars) all of which use fonts that are way too small to read. But, here's the best part, there's no way to raise the window to the top. So if another window ever gets on top of it, well, sorry, you're out of luck. And half of the themes always map the window at the very bottom of the +

    (Really my eventual goal is to be able to create video on Linux, but I figured I'd start small, and see if I could just get playback working before trying something that is undoubtedly ten thousand times harder.)
+

I finally found RPMs of mplayer that would consent to install themselves on a Red Hat 7.2 machine, and actually got it to play some videos. Amazing. But it's a total pain in the ass to use due to rampant "themeing." Why do people do this? They map this stupid shaped window with no titlebar (oh, sorry, your choice of a dozen stupidly-shaped windows without titlebars) all of which use fonts that are way too small to read. But, here's the best part, there's no way to raise the window to the top. So if another window ever gets on top of it, well, sorry, you're out of luck. And half of the themes always map the window at the very bottom of the screen -- conveniently under my panel where I can't reach it.

Resizing the window changes the aspect ratio of the video! Yeah, I'm sure someone has ever wanted that.

It moves the mouse to the upper left corner of every dialog box it creates! Which is great, because that means that when it gets into this cute little state of popping up a blank dialog that says "Error" five times a second, you can't even move the mouse over to another window to kill the program, you have to log in from another machine.

@@ -65,38 +78,45 @@ RPMs, and it sucks about the same as mplayer, and in about the same ways, th

Oh, and even though I have libdvdcss installed (as evidenced by the fact that Ogle actually works) Xine won't play the same disc that Ogle will play. It seems to be claiming that the CSS stuff isn't installed, which it clearly is.

An idiocy that all of these programs have in common is that, in addition to opening a window for the movie, and a window for the control panel, they also spray a constant spatter of curses crud on the terminal they were started from. I imagine at some point, there was some user who said, ``this program is pretty nice, but you know what it's missing? It's missing a lot of pointless chatter about what plugins and fonts have been loaded!''

-
And here's the Random Commentary section: +
And here's the Random Commentary section:
Makali wrote:
    Whenever a programmer thinks, "Hey, skins, what a cool idea", their computer's speakers should create some sort of cock-shaped soundwave and plunge it repeatedly through their skulls. -

I am fully in support of this proposed audio-cock technology.

+ +

I am fully in support of this proposed audio-cock technology.

Various people wrote:

    You shouldn't even bother compiling the GUI into mplayer! -

So I should solve the problem of ``crappy GUI'' by replacing it with ``no GUI at all?'' I should use the program only from the command line, or by memorizing magic keystrokes? Awesome idea.

+ +

So I should solve the problem of ``crappy GUI'' by replacing it with ``no GUI at all?'' I should use the program only from the command line, or by memorizing magic keystrokes? Awesome idea.

Various other people wrote:

    You didn't try vlc! -

True, I hadn't. Now I have. It has an overly-complicated UI, (the Preferences panel is a festival of overkill) but at least it uses standard menus and buttons, so it doesn't make you want to claw your eyes out immediately. But, it can only play a miniscule number of video formats, so it's mostly useless. *plonk*

+ +

True, I hadn't. Now I have. It has an overly-complicated UI, (the Preferences panel is a festival of overkill) but at least it uses standard menus and buttons, so it doesn't make you want to claw your eyes out immediately. But, it can only play a miniscule number of video formats, so it's mostly useless. *plonk*

Someone else wrote:

    Have you considered changing distributions? -

Yes, every single time I try something like this, I very seriously consider getting a Mac.

+ +

Yes, every single time I try something like this, I very seriously consider getting a Mac.

Really the only thing that's stopping me is that I fear the Emacs situation.

(By which I mean, ``Lack of a usable version thereof.'' No, running RMSmacs inside a terminal window doesn't qualify. Nor does running an X server on the Mac: if I were going to switch, why in the world would I continue inflicting the X Windows Disaster on myself? Wouldn't getting away from that be the whole point?)

-
    (I understand there is an almost-functional Aqua version of +

    By the way, the suggestion to switch Linux distrubutions in order to get a single app to work might sound absurd at first. And that's because it is. But I've been saturated with Unix-peanut-gallery effluvia for so long that it no longer even surprises me when every +

+

By the way, the suggestion to switch Linux distrubutions in order to get a single app to work might sound absurd at first. And that's because it is. But I've been saturated with Unix-peanut-gallery effluvia for so long that it no longer even surprises me when every question -- no matter how simple -- results in someone suggesting that you either A) patch your kernel or B) change distros. It's inevitable and inescapable, like Hitler.

-
-

[ up ]

+
+ +

[ up ]

\ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/telegraph/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/telegraph/expected-metadata.json index be19af16d..26924de7f 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/telegraph/expected-metadata.json +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/telegraph/expected-metadata.json @@ -1,8 +1,8 @@ { - "Author": "Our Foreign Staff \n \n\n16 November 2017 • 2:15pm", + "Author": null, "Direction": null, - "Excerpt": "Zimbabwe President Robert Mugabe, his wife Grace and two key figures from her G40 political faction are under house arrest at Mugabe's "Blue House" compound in Harare and are insisting the 93 year-old finishes his presidential term, a source said.", + "Excerpt": "Zimbabwe President Robert Mugabe, his wife Grace and two key figures from her G40 political faction are under house arrest at Mugabe's \"Blue House\" compound in Harare and are insisting the 93 year-old finishes his presidential term, a source said.", "Image": "http:\/\/www.telegraph.co.uk\/content\/dam\/news\/2017\/11\/16\/TELEMMGLPICT000146889449-xlarge_trans_NvBQzQNjv4BqySoB6nTCgtc7U4LQ_FPO4hKi2sT3vi7ux2-RDZwC4QA.jpeg", "Title": "Zimbabwe coup: Robert Mugabe and wife Grace 'insisting he finishes his term', as priest steps in to mediate", "SiteName": "The Telegraph" -} +} \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/telegraph/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/telegraph/expected.html index 23a2a74ed..352b47d57 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/telegraph/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/telegraph/expected.html @@ -1,38 +1,20 @@
-
-

Zimbabwe President Robert Mugabe, his wife Grace and two key figures from her G40 political faction are under house arrest at Mugabe's "Blue House" compound in Harare and are insisting the 93 year-old finishes his presidential term, a source said.

The G40 figures are cabinet ministers Jonathan Moyo and Saviour Kasukuwere, who fled to the compound after their homes were attacked by troops in Tuesday night's coup, the source, who said he had spoken to people inside the compound, told Reuters.

Mr Mugabe is resisting mediation by a Catholic priest to allow the former guerrilla a graceful exit after the military takeover.

The priest, Fidelis Mukonori, is acting as a middle-man between Mr Mugabe and the generals, who seized power in a targeted operation against "criminals" in his entourage, a senior political source told Reuters.

The source could not provide details of the talks, which appear to be aimed at a smooth and bloodless transition after the departure of Mr Mugabe, who has led Zimbabwe since independence in 1980.

Mr Mugabe, still seen by many Africans as a liberation hero, is reviled in the West as a despot whose disastrous handling of the economy and willingness to resort to violence to maintain power destroyed one of Africa's most promising states.

-
-
-
-
+

Zimbabwean intelligence reports seen by Reuters suggest that former security chief Emmerson Mnangagwa, who was ousted as vice-president this month, has been mapping out a post-Mugabe vision with the military and opposition for more than a year.

-
-
-
-
+

Fuelling speculation that Mnangagwa's plan might be rolling into action, opposition leader Morgan Tsvangirai, who has been receiving cancer treatment in Britain and South Africa, returned to Harare late on Wednesday, his spokesman said.

South Africa said Mr Mugabe had told President Jacob Zuma by telephone on Wednesday that he was confined to his home but was otherwise fine and the military said it was keeping him and his family, including wife Grace, safe.

-
-
-
-
-
+

Despite the lingering admiration for Mr Mugabe, there is little public affection for 52-year-old Grace, a former government typist who started having an affair with Mr Mugabe in the early 1990s as his first wife, Sally, was dying of kidney disease.

Dubbed "DisGrace" or "Gucci Grace" on account of her reputed love of shopping, she enjoyed a meteoric rise through the ranks of Mugabe's ruling Zanu-PF in the last two years, culminating in Mnangagwa's removal a week ago - a move seen as clearing the way for her to succeed her husband.

-
-
-
-
+

In contrast to the high political drama unfolding behind closed doors, the streets of the capital remained calm, with people going about their daily business, albeit under the watch of soldiers on armoured vehicles at strategic locations.

-
-
-
+

Whatever the final outcome, the events could signal a once-in-a-generation change for the former British colony, a regional breadbasket reduced to destitution by economic policies Mr Mugabe's critics have long blamed on him.

-
-
\ No newline at end of file +
\ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/title-and-h1-discrepancy/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/title-and-h1-discrepancy/expected.html index e4fa77ae9..8eded27c6 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/title-and-h1-discrepancy/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/title-and-h1-discrepancy/expected.html @@ -1,4 +1,5 @@
+

This is a long title with a colon: But the final text here is different

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/tmz-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/tmz-1/expected.html index 6eb48b97d..6849dfe5a 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/tmz-1/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/tmz-1/expected.html @@ -1,6 +1,6 @@

-

Lupita Nyong'o

+

$150K Pearl Oscar Dress ... STOLEN!!!!

@@ -13,22 +13,23 @@

EXCLUSIVE

- 0225-lupita-nyongo-getty-01Lupita Nyong'o's now-famous Oscar dress + 0225-lupita-nyongo-getty-01Lupita Nyong'o's now-famous Oscar dress -- adorned in pearls -- was stolen right out of her hotel room ... TMZ has learned.

Law enforcement sources tell TMZ ... the dress was taken out of Lupita's room at The London West Hollywood. The dress is made of pearls ... 6,000 white Akoya pearls. It's valued at $150,000.

Our sources say Lupita told cops it was taken from her room sometime between - 8 AM and 9 PM Wednesday ... while she was gone.  

+ 8 AM and 9 PM Wednesday ... while she was gone.  

We're told there is security footage that cops are looking at that could - catch the culprit right in the act. 

+ catch the culprit right in the act. 

- update_graphic_red_bar12:00 PM PT -- Sheriff's deputies were at The London Thursday - morning.  We know they were in the manager's office and we're told + update_graphic_red_bar12:00 PM PT -- Sheriff's deputies were at The London Thursday + morning.  We know they were in the manager's office and we're told they have looked at security footage to determine if they can ID the culprit.

- 0226-SUB-london-hotel-swipe-tmz-02

+ 0226-SUB-london-hotel-swipe-tmz-02 +

\ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/tumblr/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/tumblr/expected.html index 56df59658..92cea2194 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/tumblr/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/tumblr/expected.html @@ -1,11 +1,4 @@ -
-
- - -
+

Minecraft 1.8 - The Bountiful Update

-

+ Added Granite, Andesite, and Diorite stone blocks, with smooth versions

+ Added Slime Block

+ Added Iron Trapdoor

+ Added Prismarine and Sea Lantern blocks

+ Added the Ocean Monument

+ Added Red Sandstone

+ Added Banners

+ Added Armor Stands

+ Added Coarse Dirt (dirt where grass won’t grow)

+ Added Guardian mobs, with item drops

+ Added Endermite mob

+ Added Rabbits, with item drops

+ Added Mutton and Cooked Mutton

+ Villagers will harvest crops and plant new ones

+ Mossy Cobblestone and Mossy Stone Bricks are now craftable

+ Chiseled Stone Bricks are now craftable

+ Doors and fences now come in all wood type variants

+ Sponge block has regained its water-absorbing ability and becomes wet

+ Added a spectator game mode (game mode 3)

+ Added one new achievement

+ Added “Customized” world type

+ Added hidden “Debug Mode” world type

+ Worlds can now have a world barrier

+ Added @e target selector for Command Blocks

+ Added /blockdata command

+ Added /clone command

+ Added /execute command

+ Added /fill command

+ Added /particle command

+ Added /testforblocks command

+ Added /title command

+ Added /trigger command

+ Added /worldborder command

+ Added /stats command

+ Containers can be locked in custom maps by using the “Lock” data tag

+ Added logAdminCommands, showDeathMessages, reducedDebugInfo, sendCommandFeedback, and randomTickSpeed game rules

+ Added three new statistics

+ Player skins can now have double layers across the whole model, and left/right arms/legs can be edited independently

+ Added a new player model with smaller arms, and a new player skin called Alex?

+ Added options for configuring what pieces of the skin that are visible

+ Blocks can now have custom visual variations in the resource packs

+ Minecraft Realms now has an activity chart, so you can see who has been online

+ Minecraft Realms now lets you upload your maps

* Difficulty setting is saved per world, and can be locked if wanted

* Enchanting has been redone, now costs lapis lazuli in addition to enchantment levels

* Villager trading has been rebalanced

* Anvil repairing has been rebalanced

* Considerable faster client-side performance

* Max render distance has been increased to 32 chunks (512 blocks)

* Adventure mode now prevents you from destroying blocks, unless your items have the CanDestroy data tag

* Resource packs can now also define the shape of blocks and items, and not just their textures

* Scoreboards have been given a lot of new features

* Tweaked the F3 debug screen

* Block ID numbers (such as 1 for stone), are being replaced by ID names (such as minecraft:stone)

* Server list has been improved

* A few minor changes to village and temple generation

* Mob heads for players now show both skin layers

* Buttons can now be placed on the ceiling

* Lots and lots of other changes

* LOTS AND LOTS of other changes

- Removed Herobrine

-
- -
-
\ No newline at end of file +

+ Added Granite, Andesite, and Diorite stone blocks, with smooth versions
+ Added Slime Block
+ Added Iron Trapdoor
+ Added Prismarine and Sea Lantern blocks
+ Added the Ocean Monument
+ Added Red Sandstone
+ Added Banners
+ Added Armor Stands
+ Added Coarse Dirt (dirt where grass won’t grow)
+ Added Guardian mobs, with item drops
+ Added Endermite mob
+ Added Rabbits, with item drops
+ Added Mutton and Cooked Mutton
+ Villagers will harvest crops and plant new ones
+ Mossy Cobblestone and Mossy Stone Bricks are now craftable
+ Chiseled Stone Bricks are now craftable
+ Doors and fences now come in all wood type variants
+ Sponge block has regained its water-absorbing ability and becomes wet
+ Added a spectator game mode (game mode 3)
+ Added one new achievement
+ Added “Customized” world type
+ Added hidden “Debug Mode” world type
+ Worlds can now have a world barrier
+ Added @e target selector for Command Blocks
+ Added /blockdata command
+ Added /clone command
+ Added /execute command
+ Added /fill command
+ Added /particle command
+ Added /testforblocks command
+ Added /title command
+ Added /trigger command
+ Added /worldborder command
+ Added /stats command
+ Containers can be locked in custom maps by using the “Lock” data tag
+ Added logAdminCommands, showDeathMessages, reducedDebugInfo, sendCommandFeedback, and randomTickSpeed game rules
+ Added three new statistics
+ Player skins can now have double layers across the whole model, and left/right arms/legs can be edited independently
+ Added a new player model with smaller arms, and a new player skin called Alex?
+ Added options for configuring what pieces of the skin that are visible
+ Blocks can now have custom visual variations in the resource packs
+ Minecraft Realms now has an activity chart, so you can see who has been online
+ Minecraft Realms now lets you upload your maps
* Difficulty setting is saved per world, and can be locked if wanted
* Enchanting has been redone, now costs lapis lazuli in addition to enchantment levels
* Villager trading has been rebalanced
* Anvil repairing has been rebalanced
* Considerable faster client-side performance
* Max render distance has been increased to 32 chunks (512 blocks)
* Adventure mode now prevents you from destroying blocks, unless your items have the CanDestroy data tag
* Resource packs can now also define the shape of blocks and items, and not just their textures
* Scoreboards have been given a lot of new features
* Tweaked the F3 debug screen
* Block ID numbers (such as 1 for stone), are being replaced by ID names (such as minecraft:stone)
* Server list has been improved
* A few minor changes to village and temple generation
* Mob heads for players now show both skin layers
* Buttons can now be placed on the ceiling
* Lots and lots of other changes
* LOTS AND LOTS of other changes
- Removed Herobrine

+
\ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/uses-getfirstelementchild-function/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/uses-getfirstelementchild-function/expected.html index 21644834f..09cd2478d 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/uses-getfirstelementchild-function/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/uses-getfirstelementchild-function/expected.html @@ -1,9 +1,11 @@ -
-
-

+
+

+

-

+
+ +

General Info

The Seattle Thunderbirds are excited to announce the dates of their annual Summer Hockey Clinic! This three day hockey school will feature top level instruction, both on and off-ice, from Thunderbirds players and coaches. Each day @@ -21,8 +23,8 @@ You will begin your daily training on-ice and complete the day off-ice (see the next page for a complete schedule). Please come prepared with appropriate work-out gear and sneakers!

-

• GROUP A: 7, 8 & 9 yrs old $125

• GROUP B: 10 & 11 yrs old $125

• GROUP - C: 12, 13 & 14 yrs old $125

• ADULTS: 18 & Over $160

+

• GROUP A: 7, 8 & 9 yrs old $125
• GROUP B: 10 & 11 yrs old $125
• GROUP + C: 12, 13 & 14 yrs old $125
• ADULTS: 18 & Over $160

To reserve your space in the T-Birds Summer Hockey Clinic and receive your Ticket Special, fill out the registration form on reverse. Space is limited and @@ -31,17 +33,17 @@ hockey players of all ages to improve their skills and enjoy their time with us. To help ensure this, the Thunderbirds\' training staff will be at the clinic for its entirety.

-

Elevate your game!

Improve your skating…

• lengthen your stride

- • gain power

• balance and agility

-

Improve your puck skills…

• puck control and deking

• power moves +

Elevate your game!
Improve your skating…
• lengthen your stride
+ • gain power
• balance and agility

+

Improve your puck skills…
• puck control and deking
• power moves and puck protection

-

Improve your passing and team play…

• puck support and \'ice - vision\'

• shooting for accuracy vs rebounds

• game systems

-



Instructors: Instructors for the 2007 Summer Hockey Clinics will +

Improve your passing and team play…
• puck support and \'ice + vision\'
• shooting for accuracy vs rebounds
• game systems

+


Instructors: Instructors for the 2007 Summer Hockey Clinics will include Seattle Thunderbirds Head Coach Rob Sumner, Assistant Coach Turner Stevenson, past Thunderbirds Ryan Gibbons and Tyler Metcalfe and past and present Seattle Thunderbirds players.

- +

When/Where

The Thunderbirds Summer Hockey Clinic will take place from Tuesday, August 14th, through Thursday, August 16th, at Kingsgate Ice Arena, 14326 124th Ave. NE, Kirkland, WA 98034.

@@ -49,67 +51,124 @@ certified helmet with full facemask. Youth players must also wear a mouth guard. Adult players may wear a half visor, however full cages and mouth guards are highly recommended.

- -

• To register and pay for your clinic online, compelte the form below

• +


Registration

+

• To register and pay for your clinic online, compelte the form below
• To register and pay for your clinic via mail, click here to download the registration form

- + + +
+ + + + - + +

Summer Hockey Clinic Registration Form

-
- + + + + + -

Player Name

+ + + + - + + + - + + + - + + + - + + + - + + + - + + - - - - - + + + + + + + + + + - - + + + - + + - - - + + + + + + + + + - - - + + + + + + + + -

Player Name

Email Address

Email Address

Birthdate

Birthdate

Address

Address

City/St

City/St

Zip

Day Phone

Day Phone

Eve Phone

Please indicate your curreny hockey association or +

Please indicate your curreny hockey association or league:

SKAHA   SJHA    KVAHA    - GSHL    Other

If other, pelase specify:

Position:

Forward    Defense    Goalie

+

SKAHA   SJHA    KVAHA    + GSHL    Other

If other, pelase specify:

Position:

Forward    Defense    Goalie

Jersey Size

S   M    L    XL    +

Jersey Size

S   M    L    XL    XXL

I want to purchase the following T-Birds Summer Hockey +

I want to purchase the following T-Birds Summer Hockey Clinic:

- - - - -

GROUP A

7, 8 & 9

$125

GROUP B

10 & 11

$125

GROUP C

12, 13 & 14

- $125

ADULTS

18 & Over

$160

 

Waiver and Release

By checking this box, I understand that participation + + + + + + + + + +

GROUP A
7, 8 & 9
$125
+

GROUP B
10 & 11
$125
+

GROUP C
12, 13 & 14
+ $125

ADULTS
18 & Over
$160
+

+

 

Waiver and Release

By checking this box, I understand that participation of the sport constitutes a risk to me (or my child). I voluntarily recognize, accept and assume risk and release the Seattle Thunderbirds and Kingsgate Arena from any and all liability.

Once you click submit, you will be +

Once you click submit, you will be given the link to continue to online payment

+
+
+
-
-
\ No newline at end of file +
\ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wapo-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wapo-1/expected.html index ed051e882..7fd81feaf 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wapo-1/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wapo-1/expected.html @@ -1,4 +1,5 @@
+

CAIRO — Gunmen opened fire on visitors at Tunisia’s most renowned museum on Wednesday, killing at least 19 people, including 17 foreigners, in an assault that threatened to upset the fragile @@ -112,7 +113,9 @@

In January, Libyan militants loyal to the Islamic State beheaded 21 Christians — 20 of them Egyptian Copts — along the country’s coast. They later seized the Libyan city of Sirte.

-



+

+
+

Officials are worried about the number of Tunisian militants who may have joined the jihadists in Libya — with the goal of returning home to fight the Tunis government.

diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wapo-2/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wapo-2/expected.html index cb2a8ceda..d87cb3755 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wapo-2/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wapo-2/expected.html @@ -1,6 +1,8 @@

-

Israeli Prime Minister Benjamin Netanyahu reacts as he visits the Western Wall in Jerusalem on March 18 following his party's victory in Israel's general election. (Thomas Coex/AFP/Getty Images) -

President Obama told the U.N. General Assembly 18 months ago that he would + +
Israeli Prime Minister Benjamin Netanyahu reacts as he visits the Western Wall in Jerusalem on March 18 following his party's victory in Israel's general election. (Thomas Coex/AFP/Getty Images) +

+

President Obama told the U.N. General Assembly 18 months ago that he would seek “real breakthroughs on these two issues — Iran’s nuclear program and ­Israeli-Palestinian peace.”

But Benjamin Netanyahu’s triumph in Tuesday’s @@ -95,7 +97,7 @@

“That could be an issue forced onto the agenda about the same time as a potential nuclear deal.”

-

Steven Mufson covers the White House. Since joining The Post, he has covered +

Steven Mufson covers the White House. Since joining The Post, he has covered economics, China, foreign policy and energy.

\ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/webmd-2/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/webmd-2/expected.html index d9e181691..f9f1d5d73 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/webmd-2/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/webmd-2/expected.html @@ -6,18 +6,19 @@ -

April 17, 2015 -- Imagine being sick in the hospital with a bacterial infection and doctors can't stop it from spreading. This so-called "superbug" scenario is not science fiction. It's an urgent, worldwide worry that is prompting swift action.

+

April 17, 2015 -- Imagine being sick in the hospital with a bacterial infection and doctors can't stop it from spreading. This so-called "superbug" scenario is not science fiction. It's an urgent, worldwide worry that is prompting swift action.

Every year, about 2 million people get sick from a superbug, according to the CDC. About 23,000 die. Earlier this year, an outbreak of CRE (carbapenem-resistant enterobacteriaceae) linked to contaminated medical tools sickened 11 people at two Los-Angeles area hospitals. Two people died, and more than 200 others may have been exposed.

-

The White House recently released a comprehensive plan outlining steps to combat drug-resistant bacteria. The plan identifies three "urgent" and several "serious" threats. We asked infectious disease experts to explain what some of them are and when to worry.

+

The White House recently released a comprehensive plan outlining steps to combat drug-resistant bacteria. The plan identifies three "urgent" and several "serious" threats. We asked infectious disease experts to explain what some of them are and when to worry.

+

But First: What's a Superbug?

-

It's a term coined by the media to describe bacteria that cannot be killed using multiple antibiotics. "It resonates because it's scary," says Stephen Calderwood, MD, president of the Infectious Diseases Society of America. "But in fairness, there is no real definition."

+

It's a term coined by the media to describe bacteria that cannot be killed using multiple antibiotics. "It resonates because it's scary," says Stephen Calderwood, MD, president of the Infectious Diseases Society of America. "But in fairness, there is no real definition."

Instead, doctors often use phrases like "multidrug-resistant bacteria." That's because a superbug isn't necessarily resistant to all antibiotics. It refers to bacteria that can't be treated using two or more, says Brian K. Coombes, PhD, of McMaster University in Ontario.

Any species of bacteria can turn into a superbug.

Misusing antibiotics (such as taking them when you don't need them or not finishing all of your medicine) is the "single leading factor" contributing to this problem, the CDC says. The concern is that eventually doctors will run out of antibiotics to treat them.

"What the public should know is that the more antibiotics you’ve taken, the higher your superbug risk," says Eric Biondi, MD, who runs a program to decrease unnecessary antibiotic use. "The more encounters you have with the hospital setting, the higher your superbug risk."

-

"Superbugs should be a concern to everyone," Coombes says. "Antibiotics are the foundation on which all modern medicine rests. Cancer chemotherapy, organ transplants, surgeries, and childbirth all rely on antibiotics to prevent infections. If you can't treat those, then we lose the medical advances we have made in the last 50 years."

+

"Superbugs should be a concern to everyone," Coombes says. "Antibiotics are the foundation on which all modern medicine rests. Cancer chemotherapy, organ transplants, surgeries, and childbirth all rely on antibiotics to prevent infections. If you can't treat those, then we lose the medical advances we have made in the last 50 years."

Here are some of the growing superbug threats identified in the 2015 White House report.

\ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikia/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikia/expected.html index de18ee3f3..eb8eb6e55 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikia/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikia/expected.html @@ -1,25 +1,26 @@
-

Although Lucasfilm is already planning a birthday bash for the Star Wars Saga at Celebration Orlando this April, fans might get another present for the saga’s 40th anniversary. According to fan site MakingStarWars.net, rumors abound that Lucasfilm might re-release the unaltered cuts of the saga’s original trilogy.

+

Although Lucasfilm is already planning a birthday bash for the Star Wars Saga at Celebration Orlando this April, fans might get another present for the saga’s 40th anniversary. According to fan site MakingStarWars.net, rumors abound that Lucasfilm might re-release the unaltered cuts of the saga’s original trilogy.

If the rumors are true, this is big news for Star Wars fans. Aside from limited VHS releases, the unaltered cuts of the original trilogy films haven’t been available since they premiered in theaters in the 1970s and ’80s. If Lucasfilm indeed re-releases the films’ original cuts, then this will be the first time in decades that fans can see the films in their original forms. Here’s what makes the unaltered cuts of the original trilogy so special.

The Star Wars Special Editions Caused Controversy - star wars han solo + star wars han solo

-

Thanks to the commercial success of Star Wars, George Lucas has revisited and further edited his films for re-releases. The most notable — and controversial — release were the Special Editions of the original trilogy. In 1997, to celebrate the saga’s 20th anniversary, Lucasfilm spent a total of $15 million to remaster A New Hope, The Empire Strikes Back, and Return of the Jedi. The Special Editions had stints in theaters before moving to home media.

-

Although most of the Special Editions’ changes were cosmetic, others significantly affected the plot of the films. The most notable example is the “Han shot first” scene in A New Hope. As a result, the Special Editions generated significant controversy among Star Wars fans. Many fans remain skeptical about George Lucas’s decision to finish each original trilogy film “the way it was meant to be.”

+

Thanks to the commercial success of Star Wars, George Lucas has revisited and further edited his films for re-releases. The most notable — and controversial — release were the Special Editions of the original trilogy. In 1997, to celebrate the saga’s 20th anniversary, Lucasfilm spent a total of $15 million to remaster A New Hope, The Empire Strikes Back, and Return of the Jedi. The Special Editions had stints in theaters before moving to home media.

+

Although most of the Special Editions’ changes were cosmetic, others significantly affected the plot of the films. The most notable example is the “Han shot first” scene in A New Hope. As a result, the Special Editions generated significant controversy among Star Wars fans. Many fans remain skeptical about George Lucas’s decision to finish each original trilogy film “the way it was meant to be.”

- star wars + star wars

-

While the Special Editions represent the most significant edits to the original trilogy, the saga has undergone other changes. Following up on the saga’s first Blu-ray release in 2011, Industrial Light & Magic (ILM) began remastering the entire saga in 3D, starting with the prequel trilogy. The Phantom Menace saw a theatrical 3D re-release in 2012, but Disney’s 2012 acquisition of Lucasfilm indefinitely postponed further 3D releases.

-

In 2015, Attack of the Clones and Revenge of the Sith received limited 3D showings at Celebration Anaheim. Other than that, it seems as though Disney has decided to refocus Lucasfilm’s efforts to new films. Of course, that’s why the saga has produced new content beginning with The Force Awakens. However, it looks like Lucasfilm isn’t likely to generate 3D versions of the original trilogy anytime soon.

+

While the Special Editions represent the most significant edits to the original trilogy, the saga has undergone other changes. Following up on the saga’s first Blu-ray release in 2011, Industrial Light & Magic (ILM) began remastering the entire saga in 3D, starting with the prequel trilogy. The Phantom Menace saw a theatrical 3D re-release in 2012, but Disney’s 2012 acquisition of Lucasfilm indefinitely postponed further 3D releases.

+

In 2015, Attack of the Clones and Revenge of the Sith received limited 3D showings at Celebration Anaheim. Other than that, it seems as though Disney has decided to refocus Lucasfilm’s efforts to new films. Of course, that’s why the saga has produced new content beginning with The Force Awakens. However, it looks like Lucasfilm isn’t likely to generate 3D versions of the original trilogy anytime soon.

Why the Original Film Cuts Matter

- +

-

Admittedly, the differences between the original trilogy’s unaltered cuts and the Special Editions appeal to more hardcore fans. Casual fans are less likely to care about whether Greedo or Han Solo shot first. Still, given Star Wars’ indelible impact on pop culture, there’s certainly a market for the original trilogy’s unaltered cuts. They might not be for every Star Wars fan, but many of us care about them.

-

ILM supervisor John Knoll, who first pitched the story idea for Rogue One, said last year that ILM finished a brand new 4K restoration print of A New Hope. For that reason, it seems likely that Lucasfilm will finally give diehard fans the original film cuts that they’ve clamored for. There’s no word yet whether the unaltered cuts will be released in theaters or on home media. At the very least, however, fans will likely get them after all this time. After all, the Special Editions marked the saga’s 20th anniversary. Star Wars turns 40 years old this year, so there’s no telling what’s in store.

-

+

Admittedly, the differences between the original trilogy’s unaltered cuts and the Special Editions appeal to more hardcore fans. Casual fans are less likely to care about whether Greedo or Han Solo shot first. Still, given Star Wars’ indelible impact on pop culture, there’s certainly a market for the original trilogy’s unaltered cuts. They might not be for every Star Wars fan, but many of us care about them.

+

ILM supervisor John Knoll, who first pitched the story idea for Rogue One, said last year that ILM finished a brand new 4K restoration print of A New Hope. For that reason, it seems likely that Lucasfilm will finally give diehard fans the original film cuts that they’ve clamored for. There’s no word yet whether the unaltered cuts will be released in theaters or on home media. At the very least, however, fans will likely get them after all this time. After all, the Special Editions marked the saga’s 20th anniversary. Star Wars turns 40 years old this year, so there’s no telling what’s in store.

+
+

- Would you like to be part of the Fandom team? Join our Fan Contributor Program and share your voice on Fandom.com! + Would you like to be part of the Fandom team? Join our Fan Contributor Program and share your voice on Fandom.com!

diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia/expected-images.json index 81d1c9d4d..fc1eaf642 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia/expected-images.json +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia/expected-images.json @@ -1,4 +1,5 @@ [ + "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/5\/5c\/Mozilla_dinosaur_head_logo.png\/200px-Mozilla_dinosaur_head_logo.png", "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/7\/76\/Mozilla_Firefox_logo_2013.svg\/220px-Mozilla_Firefox_logo_2013.svg.png", "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/0\/0d\/SeaMonkey.png", "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/d\/d7\/Buggie.svg\/220px-Buggie.svg.png", diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia/expected.html index 8de3ffabc..0764fb833 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia/expected.html @@ -1,5 +1,45 @@ -
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Mozilla
+ Mozilla dinosaur head logo.png +
IndustryOpen-source software
FoundedFebruary 28, 1998; 18 years ago +
FounderNetscape Communications Corporation
ProductsMozilla Application Suite
Divisions + +
Websitemozilla.org/,%20https://www.mozilla.org/tr/

Mozilla is a free-software community, created in 1998 by members of Netscape. The Mozilla community uses, develops, spreads and supports Mozilla products, thereby promoting exclusively free software and open standards, with only minor exceptions.[1] The community is supported institutionally by the Mozilla Foundation and its tax-paying subsidiary, the Mozilla Corporation.[2]

Mozilla produces many products such as the Firefox web browser, Thunderbird e-mail client, Firefox Mobile web browser, Firefox OS mobile operating system, Bugzilla bug tracking system and other projects.

@@ -10,8 +50,8 @@

On January 23, 1998, Netscape made two announcements: first, that Netscape Communicator will be free; second, that the source code will also be free.[3] One day later, Jamie Zawinski from Netscape registered mozilla.org.[4] The project was named Mozilla after the original code name of the Netscape Navigator browser which is a blending of "Mosaic and Godzilla"[5] and used to co-ordinate the development of the Mozilla Application Suite, the open source version of Netscape's internet software, Netscape Communicator.[6][7] Jamie Zawinski says he came up with the name "Mozilla" at a Netscape staff meeting.[8][9] A small group of Netscape employees were tasked with coordination of the new community.

Originally, Mozilla aimed to be a technology provider for companies, such as Netscape, who would commercialize their open source code.[10] When AOL (Netscape's parent company) greatly reduced its involvement with Mozilla in July 2003, the Mozilla Foundation was designated the legal steward of the project.[11] Soon after, Mozilla deprecated the Mozilla Suite in favor of creating independent applications for each function, primarily the Firefox web browser and the Thunderbird email client, and moved to supply them directly to the public.[12]

Recently, Mozilla's activities have expanded to include Firefox on mobile platforms (primarily Android),[13] a mobile OS called Firefox OS,[14] a web-based identity system called Mozilla Persona and a marketplace for HTML5 applications.[15]

-

In a report released in November 2012, Mozilla reported that their total revenue for 2011 was $163 million, which was up 33% from $123 million in 2010. Mozilla noted that roughly 85% of their revenue comes from their contract with Google.[16]

-

At the end of 2013, Mozilla announced a deal with Cisco Systems whereby Firefox would download and use a Cisco-provided binary build of an open source[17]codec to play the proprietary H.264 video format.[18][19] As part of the deal, Cisco would pay any patent licensing fees associated with the binaries that it distributes. Mozilla's CTO, Brendan Eich, acknowledged that this is "not a complete solution" and isn't "perfect".[20] An employee in Mozilla's video formats team, writing in an unofficial capacity, justified[21] it by the need to maintain their large user base, which would be necessary in future battles for truly free video formats.

+

In a report released in November 2012, Mozilla reported that their total revenue for 2011 was $163 million, which was up 33% from $123 million in 2010. Mozilla noted that roughly 85% of their revenue comes from their contract with Google.[16]

+

At the end of 2013, Mozilla announced a deal with Cisco Systems whereby Firefox would download and use a Cisco-provided binary build of an open source[17] codec to play the proprietary H.264 video format.[18][19] As part of the deal, Cisco would pay any patent licensing fees associated with the binaries that it distributes. Mozilla's CTO, Brendan Eich, acknowledged that this is "not a complete solution" and isn't "perfect".[20] An employee in Mozilla's video formats team, writing in an unofficial capacity, justified[21] it by the need to maintain their large user base, which would be necessary in future battles for truly free video formats.

In December 2013, Mozilla announced funding for the development of non-free games[22] through its Game Creator Challenge. However, even those games that may be released under a non-free software or open source license must be made with open web technologies and Javascript as per the work criteria outlined in the announcement.

Eich CEO promotion controversy[edit]

@@ -28,19 +68,19 @@

According to the Mozilla Foundation:[41]

The Mozilla Foundation pledges to support the Mozilla Manifesto in its activities. Specifically, we will:

-
  • Build and enable open-source technologies and communities that support the Manifesto’s principles;
  • +
      +
    • Build and enable open-source technologies and communities that support the Manifesto’s principles;
    • Build and deliver great consumer products that support the Manifesto’s principles;
    • Use the Mozilla assets (intellectual property such as copyrights and trademarks, infrastructure, funds, and reputation) to keep the Internet an open platform;
    • Promote models for creating economic value for the public benefit; and
    • Promote the Mozilla Manifesto principles in public discourse and within the Internet industry.
    • -
+ +

Software[edit]

-
-

+

-

Firefox[edit]

@@ -52,7 +92,7 @@

Firefox Mobile (codenamed Fennec) is the build of the Mozilla Firefox web browser for devices such as smartphones and tablet computers.

Firefox Mobile uses the same Gecko layout engine as Mozilla Firefox. For example, version 1.0 used the same engine as Firefox 3.6, and the following release, 4.0, shared core code with Firefox 4.0. Its features include HTML5 support, Firefox Sync, add-ons support and tabbed browsing.[50]

-

Firefox Mobile is currently available for Android 2.2 and above devices with an ARMv7 or ARMv6 CPU.[51] The x86 architecture is not officially supported.[52]Tristan Nitot, president of Mozilla Europe, has said that it's unlikely that an iPhone or a BlackBerry version will be released, citing Apple's iTunes Store application approval policies (which forbid applications competing with Apple's own, and forbid engines which run downloaded code) and BlackBerry's limited operating system as the reasons.[53]

+

Firefox Mobile is currently available for Android 2.2 and above devices with an ARMv7 or ARMv6 CPU.[51] The x86 architecture is not officially supported.[52] Tristan Nitot, president of Mozilla Europe, has said that it's unlikely that an iPhone or a BlackBerry version will be released, citing Apple's iTunes Store application approval policies (which forbid applications competing with Apple's own, and forbid engines which run downloaded code) and BlackBerry's limited operating system as the reasons.[53]

Firefox OS[edit]

@@ -67,10 +107,8 @@
-
-

+

-

SeaMonkey (formerly the Mozilla Application Suite) is a free and open source cross platform suite of Internet software components including a web browser component, a client for sending and receiving email and USENET newsgroup messages, an HTML editor (Mozilla Composer) and the ChatZilla IRC client.

On March 10, 2005, the Mozilla Foundation announced that it would not release any official versions of Mozilla Application Suite beyond 1.7.x, since it had now focused on the standalone applications Firefox and Thunderbird.[57] SeaMonkey is now maintained by the SeaMonkey Council, which has trademarked the SeaMonkey name with help from the Mozilla Foundation.[58] The Mozilla Foundation provides project hosting for the SeaMonkey developers.

@@ -78,10 +116,8 @@
-
-

+

-

Bugzilla is a web-based general-purpose bug tracking system, which was released as open source software by Netscape Communications in 1998 along with the rest of the Mozilla codebase, and is currently stewarded by Mozilla. It has been adopted by a variety of organizations for use as a bug tracking system for both free and open source software and proprietary projects and products, including the Mozilla Foundation, the Linux kernel, GNOME, KDE, Red Hat, Novell, Eclipse and LibreOffice.[59]

Components[edit]

@@ -147,38 +183,34 @@

Local communities[edit]

-
-

+

-

There are a number of sub-communities that exist based on their geographical locations, where contributors near each other work together on particular activities, such as localization, marketing, PR and user support.

Mozilla Reps[edit]

-
-

+

-

The Mozilla Reps program aims to empower and support volunteer Mozillians who want to become official representatives of Mozilla in their region/locale.

The program provides a simple framework and a specific set of tools to help Mozillians to organize and/or attend events, recruit and mentor new contributors, document and share activities, and support their local communities better.

When joining the program, a Mozilla Rep agrees to take on the following responsibilities:

-
  • Represent Mozilla in their country/region
  • +
      +
    • Represent Mozilla in their country/region
    • Promote the Mozilla Project and its mission
    • Build on and support existing/future local community efforts and programs
    • Inspire, recruit and support new contributors
    • Support and mentor future Mozilla Reps
    • Document clearly all their activities
    • -

    Conferences and events[edit] +

+

Conferences and events[edit]

Mozilla Festival[edit]

-
-

+

Speakers from the Knight Foundation discuss the future of news at the 2011 Mozilla Festival in London.

-

The Mozilla Festival is an annual event where hundreds of passionate people explore the Web, learn together and make things that can change the world. With the emphasis on making—the mantra of the Festival is "less yack, more hack." Journalists, coders, filmmakers, designers, educators, gamers, makers, youth and anyone else, from all over the world, are encouraged to attend, with attendees from more than 40 countries, working together at the intersection between freedom, the Web, and that years theme.

The event revolves around design challenges which address key issues based on the chosen theme for that years festival. In previous years the Mozilla Festival has focused on Learning, and Media, with the 2012 festival being based around making. The titles of the festival revolve around the main theme, freedom (as in freedom of speech not free beer), and the Web.

MozCamps[edit] @@ -190,237 +222,247 @@

See also[edit]

- +

References[edit]

-
  1. ^ For exceptions, see "Values" section below
  2. -
  3. ^ "About the Mozilla Corporation". Mozilla Foundation. +
      +
    1. ^ For exceptions, see "Values" section below
    2. +
    3. ^ "About the Mozilla Corporation". Mozilla Foundation.
    4. -
    5. ^ "Freeing the Source: The Story of Mozilla". Open Sources: Voices from the Open Source Revolution. Retrieved 2016-05-01. +
    6. ^ "Freeing the Source: The Story of Mozilla". Open Sources: Voices from the Open Source Revolution. Retrieved 2016-05-01.
    7. -
    8. ^ "Mozilla.org WHOIS, DNS, & Domain Info". DomainTools. Retrieved 1 May 2016. +
    9. ^ "Mozilla.org WHOIS, DNS, & Domain Info". DomainTools. Retrieved 1 May 2016.
    10. -
    11. ^ Payment, S. (2007). Marc Andreessen and Jim Clark: The Founders of Netscape. Rosen Publishing Group. ISBN 9781404207196. +
    12. ^ Payment, S. (2007). Marc Andreessen and Jim Clark: The Founders of Netscape. Rosen Publishing Group. ISBN 9781404207196.
    13. -
    14. ^ "Netscape Announces mozilla.org, a Dedicated Team and Web Site Supporting Development of Free Client Source Code". Netscape. Archived from the original on October 4, 2002. Retrieved 2012-08-21. +
    15. ^ "Netscape Announces mozilla.org, a Dedicated Team and Web Site Supporting Development of Free Client Source Code". Netscape. Archived from the original on October 4, 2002. Retrieved 2012-08-21.
    16. -
    17. ^ "Mac vendors ponder Netscape gambit.". Macworld. 1 May 1998. Retrieved 2012-08-19. +
    18. ^ "Mac vendors ponder Netscape gambit.". Macworld. 1 May 1998. Retrieved 2012-08-19.
    19. -
    20. ^ Zawinski, Jamie (1996). "nscp dorm". Retrieved 2007-10-12. +
    21. ^ Zawinski, Jamie (1996). "nscp dorm". Retrieved 2007-10-12.
    22. -
    23. ^ Dave Titus with assistance from Andrew Wong. "How was Mozilla born". +
    24. ^ Dave Titus with assistance from Andrew Wong. "How was Mozilla born".
    25. -
    26. ^ "Introduction to Mozilla Source Code". Mozilla. Retrieved 2012-08-18. However, mozilla.org wants to emphasize that these milestones are being produced for testing purposes only. +
    27. ^ "Introduction to Mozilla Source Code". Mozilla. Retrieved 2012-08-18. However, mozilla.org wants to emphasize that these milestones are being produced for testing purposes only.
    28. -
    29. ^ "mozilla.org Announces Launch of the Mozilla Foundation to Lead Open-Source Browser Efforts". Retrieved 2012-08-18. +
    30. ^ "mozilla.org Announces Launch of the Mozilla Foundation to Lead Open-Source Browser Efforts". Retrieved 2012-08-18.
    31. -
    32. ^ Eich, Brendan; David Hyatt (April 2, 2003). "mozilla development roadmap". Mozilla. Retrieved 2009-08-02. +
    33. ^ Eich, Brendan; David Hyatt (April 2, 2003). "mozilla development roadmap". Mozilla. Retrieved 2009-08-02.
    34. -
    35. ^ "Better Browsing on Your Android Smartphone". AllThingsD. Retrieved 2012-08-18. +
    36. ^ "Better Browsing on Your Android Smartphone". AllThingsD. Retrieved 2012-08-18.
    37. -
    38. ^ "Mozilla Releases Test Version of Firefox OS". PC Magazine. Retrieved 2012-08-18. +
    39. ^ "Mozilla Releases Test Version of Firefox OS". PC Magazine. Retrieved 2012-08-18.
    40. -
    41. ^ "Mozilla Marketplace is live, lets you run web apps like desktop programs". Engadget. Retrieved 2012-08-18. +
    42. ^ "Mozilla Marketplace is live, lets you run web apps like desktop programs". Engadget. Retrieved 2012-08-18.
    43. -
    44. ^ Lardinois, Frederic (November 15, 2012). "Mozilla Releases Annual Report For 2011: Revenue Up 33% To $163M, Majority From Google". techcrunch.com. +
    45. ^ Lardinois, Frederic (November 15, 2012). "Mozilla Releases Annual Report For 2011: Revenue Up 33% To $163M, Majority From Google". techcrunch.com.
    46. -
    47. ^ "cisco/openh264 · GitHub". github.com. Retrieved 2014-04-05. +
    48. ^ "cisco/openh264 · GitHub". github.com. Retrieved 2014-04-05.
    49. -
    50. ^ "Mozilla will add H.264 to Firefox as Cisco makes eleventh-hour push for WebRTC's future — Tech News and Analysis". gigaom.com. Retrieved 2014-04-05. +
    51. ^ "Mozilla will add H.264 to Firefox as Cisco makes eleventh-hour push for WebRTC's future — Tech News and Analysis". gigaom.com. Retrieved 2014-04-05.
    52. -
    53. ^ "Cisco to release open-source H.264 codec, Mozilla makes tactical retreat - TechRepublic". techrepublic.com. Retrieved 2014-04-05. +
    54. ^ "Cisco to release open-source H.264 codec, Mozilla makes tactical retreat - TechRepublic". techrepublic.com. Retrieved 2014-04-05.
    55. -
    56. ^ "Video Interoperability on the Web Gets a Boost From Cisco's H.264 Codec". Of course, this is not a not a complete solution. In a perfect world, codecs, like other basic Internet technologies such as TCP/IP, HTTP, and HTML, would be fully open and free +
    57. ^ "Video Interoperability on the Web Gets a Boost From Cisco's H.264 Codec". Of course, this is not a not a complete solution. In a perfect world, codecs, like other basic Internet technologies such as TCP/IP, HTTP, and HTML, would be fully open and free
    58. -
    59. ^ "Comments on Cisco, Mozilla, and H.264". By endorsing Cisco's plan, there's no getting around the fact that we've caved on our principles. That said, principles can't replace being in a practical position to make a difference in the future. - Christopher Montgomery wrote in a personal capacity but works for Mozilla in their codecs team +
    60. ^ "Comments on Cisco, Mozilla, and H.264". By endorsing Cisco's plan, there's no getting around the fact that we've caved on our principles. That said, principles can't replace being in a practical position to make a difference in the future. - Christopher Montgomery wrote in a personal capacity but works for Mozilla in their codecs team
    61. -
    62. ^ "Game Creator Challenge -Contest Terms and Conditions". - submissions to the "amateur" category have to be released as free software, but not for the other two categories +
    63. ^ "Game Creator Challenge -Contest Terms and Conditions". - submissions to the "amateur" category have to be released as free software, but not for the other two categories
    64. -
    65. ^ "Los Angeles Times - Brendan Eich contribution to Proposition 8". latimes.com. Retrieved 2014-07-01. +
    66. ^ "Los Angeles Times - Brendan Eich contribution to Proposition 8". latimes.com. Retrieved 2014-07-01.
    67. -
    68. ^ "Gay Firefox developers boycott Mozilla to protest CEO hire [Updated] | Ars Technica". arstechnica.com. Retrieved 2014-04-05. +
    69. ^ "Gay Firefox developers boycott Mozilla to protest CEO hire [Updated] | Ars Technica". arstechnica.com. Retrieved 2014-04-05.
    70. -
    71. ^ Kelly Faircloth (9 April 2012). "Tech Celeb Makes Prop-8 Donation; Internet Goes Berserk". BetaBeat. BetaBeat. Retrieved 2014-04-28. +
    72. ^ Kelly Faircloth (9 April 2012). "Tech Celeb Makes Prop-8 Donation; Internet Goes Berserk". BetaBeat. BetaBeat. Retrieved 2014-04-28.
    73. -
    74. ^ "Screenshot of OkCupid's statement towards Firefox users". huffingtonpost.com. Retrieved 2014-07-01. +
    75. ^ "Screenshot of OkCupid's statement towards Firefox users". huffingtonpost.com. Retrieved 2014-07-01.
    76. -
    77. ^ "FAQ on CEO Resignation". The Mozilla Blog. Retrieved 2015-04-20. +
    78. ^ "FAQ on CEO Resignation". The Mozilla Blog. Retrieved 2015-04-20.
    79. -
    80. ^ Baker, Mitchell (3 April 2014). "Brendan Eich Steps Down as Mozilla CEO". mozilla blog. Mozilla. Retrieved 2014-04-04. +
    81. ^ Baker, Mitchell (3 April 2014). "Brendan Eich Steps Down as Mozilla CEO". mozilla blog. Mozilla. Retrieved 2014-04-04.
    82. -
    83. ^ "opensecrets.org listing of Sam Yagan's contributions to political candidates". opensecrets.org. Retrieved 2014-07-01. +
    84. ^ "opensecrets.org listing of Sam Yagan's contributions to political candidates". opensecrets.org. Retrieved 2014-07-01.
    85. -
    86. ^ "ontheissues.org listing of votes cast by Chris Cannon". ontheissues.org. Retrieved 2014-07-01. +
    87. ^ "ontheissues.org listing of votes cast by Chris Cannon". ontheissues.org. Retrieved 2014-07-01.
    88. -
    89. ^ "ontheissues.org listing of votes cast on the permanency of the Patriot Act". ontheissues.org. Retrieved 2014-07-01. +
    90. ^ "ontheissues.org listing of votes cast on the permanency of the Patriot Act". ontheissues.org. Retrieved 2014-07-01.
    91. -
    92. ^ "ontheissues.org: Chris Cannon on Homeland Security". ontheissues.org. Retrieved 2014-07-01. +
    93. ^ "ontheissues.org: Chris Cannon on Homeland Security". ontheissues.org. Retrieved 2014-07-01.
    94. -
    95. ^ "ontheissues.org: Chris Cannon on Abortion". ontheissues.org. Retrieved 2014-07-01. +
    96. ^ "ontheissues.org: Chris Cannon on Abortion". ontheissues.org. Retrieved 2014-07-01.
    97. -
    98. ^ Levintova, Hannah (7 April 2014). "OkCupid's CEO Donated to an Anti-Gay Campaign Once, Too". Hanna Levintova article on motherjones.com. motherjones.com. Retrieved 2014-07-01. +
    99. ^ Levintova, Hannah (7 April 2014). "OkCupid's CEO Donated to an Anti-Gay Campaign Once, Too". Hanna Levintova article on motherjones.com. motherjones.com. Retrieved 2014-07-01.
    100. -
    101. ^ Lee, Stephanie M. (8 April 2014). "OKCupid CEO once donated to anti-gay politician". Stephanie M. Lee's blog on sfgate.com. sfgate.com. Retrieved 2014-07-01. +
    102. ^ Lee, Stephanie M. (8 April 2014). "OKCupid CEO once donated to anti-gay politician". Stephanie M. Lee's blog on sfgate.com. sfgate.com. Retrieved 2014-07-01.
    103. -
    104. ^ a b "The Hypocrisy Of Sam Yagan & OkCupid". uncrunched.com blog. uncrunched.com. 6 April 2014. Retrieved 2014-07-01. +
    105. ^ a b "The Hypocrisy Of Sam Yagan & OkCupid". uncrunched.com blog. uncrunched.com. 6 April 2014. Retrieved 2014-07-01.
    106. -
    107. ^ Bellware, Kim (31 March 2014). "OKCupid Publicly Rips Mozilla: 'We Wish Them Nothing But Failure'". Kim Bellware article on huffingtonpost.com. huffingtonpost.com. Retrieved 2014-07-01. +
    108. ^ Bellware, Kim (31 March 2014). "OKCupid Publicly Rips Mozilla: 'We Wish Them Nothing But Failure'". Kim Bellware article on huffingtonpost.com. huffingtonpost.com. Retrieved 2014-07-01.
    109. -
    110. ^ "Mozilla's Appointment Of Brendan Eich As CEO Sparks Controversy After Prop 8 Donation News Re-Emerges". huffingtonpost.com article. huffingtonpost.com. 27 March 2014. Retrieved 2014-07-01. +
    111. ^ "Mozilla's Appointment Of Brendan Eich As CEO Sparks Controversy After Prop 8 Donation News Re-Emerges". huffingtonpost.com article. huffingtonpost.com. 27 March 2014. Retrieved 2014-07-01.
    112. -
    113. ^ Eidelson, Josh (4 April 2014). "OkCupid's gay rights stunt has its limits: Taking a deeper look at the savvy ploy". Josh Eidelson article on salon.com. salon.com. Retrieved 2014-07-01. +
    114. ^ Eidelson, Josh (4 April 2014). "OkCupid's gay rights stunt has its limits: Taking a deeper look at the savvy ploy". Josh Eidelson article on salon.com. salon.com. Retrieved 2014-07-01.
    115. -
    116. ^ a b "Mozilla Manifesto". Mozilla.org. Retrieved 2012-03-21. +
    117. ^ a b "Mozilla Manifesto". Mozilla.org. Retrieved 2012-03-21.
    118. -
    119. ^ "The Mozilla Manifesto". Retrieved 24 July 2015. +
    120. ^ "The Mozilla Manifesto". Retrieved 24 July 2015.
    121. -
    122. ^ "Gecko Layout Engine". download-firefox.org. July 17, 2008. Archived from the original on 2010-11-28. Retrieved 2012-05-10. +
    123. ^ "Gecko Layout Engine". download-firefox.org. July 17, 2008. Archived from the original on 2010-11-28. Retrieved 2012-05-10.
    124. -
    125. ^ "Web Browser Market Share Trends". W3Counter. Awio Web Services LLC. Retrieved 2012-05-10. +
    126. ^ "Web Browser Market Share Trends". W3Counter. Awio Web Services LLC. Retrieved 2012-05-10.
    127. -
    128. ^ "Top 5 Browsers". StatCounter Global Stats. StatCounter. Retrieved 2012-05-10. +
    129. ^ "Top 5 Browsers". StatCounter Global Stats. StatCounter. Retrieved 2012-05-10.
    130. -
    131. ^ "Web browsers (Global marketshare)". Clicky. Roxr Software Ltd. Retrieved 2012-05-10. +
    132. ^ "Web browsers (Global marketshare)". Clicky. Roxr Software Ltd. Retrieved 2012-05-10.
    133. -
    134. ^ Goodger, Ben (February 6, 2006). "Where Did Firefox Come From?". Inside Firefox. Archived from the original on 2011-06-23. Retrieved 2012-01-07. +
    135. ^ Goodger, Ben (February 6, 2006). "Where Did Firefox Come From?". Inside Firefox. Archived from the original on 2011-06-23. Retrieved 2012-01-07.
    136. -
    137. ^ "Mozilla browser becomes Firebird". IBPhoenix. Archived from the original on 2007-09-14. Retrieved 2013-06-10. We at IBPhoenix think that having a browser and a database with the same name in the same space will confuse the market, especially as browsers and databases are often used in the same applications +
    138. ^ "Mozilla browser becomes Firebird". IBPhoenix. Archived from the original on 2007-09-14. Retrieved 2013-06-10. We at IBPhoenix think that having a browser and a database with the same name in the same space will confuse the market, especially as browsers and databases are often used in the same applications
    139. -
    140. ^ Festa, Paul (May 6, 2003). "Mozilla's Firebird gets wings clipped". CNET. Retrieved 2007-01-30. +
    141. ^ Festa, Paul (May 6, 2003). "Mozilla's Firebird gets wings clipped". CNET. Retrieved 2007-01-30.
    142. -
    143. ^ Festa, Paul (February 9, 2004). "Mozilla holds 'fire' in naming fight". CNET News. Retrieved 2007-01-24. +
    144. ^ Festa, Paul (February 9, 2004). "Mozilla holds 'fire' in naming fight". CNET News. Retrieved 2007-01-24.
    145. -
    146. ^ "Mobile features". Mozilla. Retrieved 2012-06-26. +
    147. ^ "Mobile features". Mozilla. Retrieved 2012-06-26.
    148. -
    149. ^ "Mobile System Requirements". +
    150. ^ "Mobile System Requirements".
    151. -
    152. ^ "Firefox Mobile supported devices". +
    153. ^ "Firefox Mobile supported devices".
    154. -
    155. ^ "Mozilla rules out Firefox for iPhone and BlackBerry". +
    156. ^ "Mozilla rules out Firefox for iPhone and BlackBerry".
    157. -
    158. ^ "Boot to Gecko Project". Mozilla. March 2012. Retrieved 2012-03-30. +
    159. ^ "Boot to Gecko Project". Mozilla. March 2012. Retrieved 2012-03-30.
    160. -
    161. ^ "Firefox OS - Devices & Availability". Mozilla. Retrieved 2015-12-30. +
    162. ^ "Firefox OS - Devices & Availability". Mozilla. Retrieved 2015-12-30.
    163. -
    164. ^ "Thunderbird: Stability and Community Innovation | Mitchell's Blog". blog.lizardwrangler.com. Retrieved 2015-04-20. +
    165. ^ "Thunderbird: Stability and Community Innovation | Mitchell's Blog". blog.lizardwrangler.com. Retrieved 2015-04-20.
    166. -
    167. ^ "Two discontinued browsers". LWN.net. 21 December 2005. Retrieved 2012-08-19. +
    168. ^ "Two discontinued browsers". LWN.net. 21 December 2005. Retrieved 2012-08-19.
    169. -
    170. ^ "SeaMonkey trademarks registered!". kairo.at. 2007-05-22. Retrieved 2013-06-10. +
    171. ^ "SeaMonkey trademarks registered!". kairo.at. 2007-05-22. Retrieved 2013-06-10.
    172. -
    173. ^ "Bugzilla Installation List". Retrieved 2014-09-18. +
    174. ^ "Bugzilla Installation List". Retrieved 2014-09-18.
    175. -
    176. ^ a b Eich, Brendan (21 June 2011). "New JavaScript Engine Module Owner". BrendanEich.com. +
    177. ^ a b Eich, Brendan (21 June 2011). "New JavaScript Engine Module Owner". BrendanEich.com.
    178. -
    179. ^ "Bug 759422 - Remove use of e4x in account creation". Bugzilla@Mozilla. 2012-08-17. Retrieved 2012-08-18. +
    180. ^ "Bug 759422 - Remove use of e4x in account creation". Bugzilla@Mozilla. 2012-08-17. Retrieved 2012-08-18.
    181. -
    182. ^ "SpiderMonkey". Mozilla Developer Network. 2012-08-15. Retrieved 2012-08-18. +
    183. ^ "SpiderMonkey". Mozilla Developer Network. 2012-08-15. Retrieved 2012-08-18.
    184. -
    185. ^ "Rhino History". Mozilla Foundation. Retrieved 2008-03-20. +
    186. ^ "Rhino History". Mozilla Foundation. Retrieved 2008-03-20.
    187. -
    188. ^ "Roadmap". Retrieved 10 May 2016. +
    189. ^ "Roadmap". Retrieved 10 May 2016.
    190. -
    191. ^ Larabel, Michael. "Servo Continues Making Progress For Shipping Components In Gecko, Browser.html". Phoronix.com. Retrieved 10 May 2016. +
    192. ^ Larabel, Michael. "Servo Continues Making Progress For Shipping Components In Gecko, Browser.html". Phoronix.com. Retrieved 10 May 2016.
    193. -
    194. ^ "Mozilla VR". Mozilla VR. Retrieved 2016-10-27. +
    195. ^ "Mozilla VR". Mozilla VR. Retrieved 2016-10-27.
    196. -
    197. ^ Persona, Mozilla +
    198. ^ Persona, Mozilla
    199. -
    200. ^ "Persona". Mozilla Developer Network. Retrieved 2016-10-27. +
    201. ^ "Persona". Mozilla Developer Network. Retrieved 2016-10-27.
    202. -
    203. ^ About Mozilla Webmaker, Mozilla +
    204. ^ About Mozilla Webmaker, Mozilla
    205. -
    206. ^ a b Alan Henry. "Mozilla Webmaker Teaches You to Build Web Sites, Apps, and More". Lifehacker. Gawker Media. +
    207. ^ a b Alan Henry. "Mozilla Webmaker Teaches You to Build Web Sites, Apps, and More". Lifehacker. Gawker Media.
    208. -
    209. ^ "Air Mozilla". Mozilla Wiki. +
    210. ^ "Air Mozilla". Mozilla Wiki.
    211. -
    212. ^ "Air Mozilla Reboot, Phase I". +
    213. ^ "Air Mozilla Reboot, Phase I".
    214. -
-

Constant downloads failure in firefox

+ +
+

Constant downloads failure in firefox

External links[edit]

- +
- + + + -
+ Wikimedia Commons has media related to Mozilla.
+ + diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wordpress/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wordpress/expected-metadata.json index 9154ef04d..7a5a65f3d 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wordpress/expected-metadata.json +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wordpress/expected-metadata.json @@ -1,8 +1,8 @@ { "Author": null, - "Direction": null, - "Excerpt": "Stack Overflow published its analysis of 2017 hiring trends based on the targeting options employers selected when posting to Stack Overflow Jobs. The report, which compares data from 200 companies…", + "Direction": "ltr", + "Excerpt": "Stack Overflow published its analysis of 2017 hiring trends based on the targeting options employers selected when posting to Stack Overflow Jobs. The report, which compares data from 200 companies\u2026", "Image": "https:\/\/i0.wp.com\/wptavern.com\/wp-content\/uploads\/2016\/07\/stack-overflow.png?fit=1200%2C470&ssl=1", "Title": "Stack Overflow Jobs Data Shows ReactJS Skills in High Demand, WordPress Market Oversaturated with Developers", "SiteName": "WordPress Tavern" -} +} \ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wordpress/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wordpress/expected.html index 1f47d8fe1..344eb7d12 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wordpress/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wordpress/expected.html @@ -1,14 +1,31 @@ -
+
+ + + + +
+ + + + + +
+ + + + + +

- +

Stack Overflow published its analysis of 2017 hiring trends based on the targeting options employers selected when posting to Stack Overflow Jobs. The report, which compares data from 200 companies since 2015, ranks ReactJS, Docker, and Ansible at the top of the fastest growing skills in demand. When comparing the percentage change from 2015 to 2016, technologies like AJAX, Backbone.js, jQuery, and WordPress are less in demand.

- +

Stack Overflow also measured the demand relative to the available developers in different tech skills. The demand for backend, mobile, and database engineers is higher than the number of qualified candidates available. WordPress is last among the oversaturated fields with a surplus of developers relative to available positions.

- +

In looking at these results, it’s important to consider the inherent biases within the Stack Overflow ecosystem. In 2016, the site surveyed more than 56,000 developers but noted that the survey was “biased against devs who don’t speak English.” The average age of respondents was 29.6 years old and 92.8% of them were male.

For two years running, Stack Overflow survey respondents have ranked WordPress among the most dreaded technologies that they would prefer not to use. This may be one reason why employers wouldn’t be looking to advertise positions on the site’s job board, which is the primary source of the data for this report.

@@ -26,4 +43,29 @@
-
\ No newline at end of file + + + + +
+ + + + + + + + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-1/expected.html index deea6c82f..645639393 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-1/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-1/expected.html @@ -1,45 +1,49 @@ -
-
-

The PlayStation VR

+
+
+
+

The PlayStation VR

-

Sony’s PlayStation VR.

+
+

Sony’s PlayStation VR.

-
-

Virtual reality has officially reached the consoles. And it’s pretty good! Sony’s PlayStation VR is extremely comfortable and reasonably priced, and while it’s lacking killer apps, it’s loaded with lots of interesting ones.

-

But which ones should you buy? I’ve played just about every launch game, and while some are worth your time, others you might want to skip. To help you decide what’s what, I’ve put together this list of the eight PSVR games worth considering.

-

“Rez Infinite” ($30)

-

-

Beloved cult hit “Rez” gets the VR treatment to help launch the PSVR, and the results are terrific. It includes a fully remastered take on the original “Rez” – you zoom through a Matrix-like computer system, shooting down enemies to the steady beat of thumping electronica – but the VR setting makes it incredibly immersive. It gets better the more you play it, too; unlock the amazing Area X mode and you’ll find yourself flying, shooting and bobbing your head to some of the trippiest visuals yet seen in VR.

-

“Thumper” ($20)

-

-

What would happen if Tron, the board game Simon, a Clown beetle, Cthulhu and a noise band met in VR? Chaos, for sure, and also “Thumper.” Called a “violent rhythm game” by its creators, “Thumper” is, well, a violent rhythm game that’s also a gorgeous, unsettling and totally captivating assault on the senses. With simple controls and a straightforward premise – click the X button and the analog stick in time with the music as you barrel down a neon highway — it’s one of the rare games that works equally well both in and out of VR. But since you have PSVR, play it there. It’s marvelous.

-

“Until Dawn: Rush of Blood” ($20)

-

-

Cheeky horror game “Until Dawn” was a breakout hit for the PS4 last year, channeling the classic “dumb teens in the woods” horror trope into an effective interactive drama. Well, forget all that if you fire up “Rush of Blood,” because this one sticks you front and center on a rollercoaster ride from Hell. Literally. You ride through a dimly-lit carnival of terror, dual-wielding pistols as you take down targets, hideous pig monsters and, naturally, maniac clowns. Be warned: If the bad guys don’t get you, the jump scares will.

-

“Headmaster” ($20)

-

-

Soccer meets “Portal” in the weird (and weirdly fun) “Headmaster,” a game about heading soccer balls into nets, targets and a variety of other things while stuck in some diabolical training facility. While at first it seems a little basic, increasingly challenging shots and a consistently entertaining narrative keep it from running off the pitch. Funny, ridiculous and as easy as literally moving your head back and forth, it’s a pleasant PSVR surprise.

-

“RIGS: Mechanized Combat League” ($50)

-

-

Giant mechs + sports? That’s the gist of this robotic blast-a-thon, which pits two teams of three against one another in gorgeous, explosive and downright fun VR combat. At its best, “RIGS” marries the thrill of fast-paced competitive shooters with the insanity of piloting a giant mech in VR. It can, however, be one of the barfier PSVR games. So pack your Dramamine, you’re going to have to ease yourself into this one.

-

“Batman Arkham VR” ($20)

-

-

“I’m Batman,” you will say. And you’ll actually be right this time, because you are Batman in this detective yarn, and you know this because you actually grab the famous cowl and mask, stick it on your head, and stare into the mirrored reflection of Rocksteady Games’ impressive Dark Knight character model. It lacks the action of its fellow “Arkham” games and runs disappointingly short, but it’s a high-quality experience that really shows off how powerfully immersive VR can be.

-

“Job Simulator” ($30)

-

-

There are a number of good VR ports in the PSVR launch lineup, but the HTC Vive launch game “Job Simulator” might be the best. Your task? Lots of tasks, actually, from cooking food to fixing cars to working in an office, all for robots, because did I mention you were in the future? Infinitely charming and surprisingly challenging, it’s a great showpiece for VR.

-

“Eve Valkyrie” ($60)

-

-

Already a hit on the Oculus Rift, this space dogfighting game was one of the first to really show off how VR can turn a traditional game experience into something special. It’s pricey and not quite as hi-res as the Rift version, but “Eve Valkyrie” does an admirable job filling the void left since “Battlestar Galactica” ended. Too bad there aren’t any Cylons in it (or are there?)

-

More games news:

-
+
+

Virtual reality has officially reached the consoles. And it’s pretty good! Sony’s PlayStation VR is extremely comfortable and reasonably priced, and while it’s lacking killer apps, it’s loaded with lots of interesting ones.

+

But which ones should you buy? I’ve played just about every launch game, and while some are worth your time, others you might want to skip. To help you decide what’s what, I’ve put together this list of the eight PSVR games worth considering.

+

“Rez Infinite” ($30)

+

+

Beloved cult hit “Rez” gets the VR treatment to help launch the PSVR, and the results are terrific. It includes a fully remastered take on the original “Rez” – you zoom through a Matrix-like computer system, shooting down enemies to the steady beat of thumping electronica – but the VR setting makes it incredibly immersive. It gets better the more you play it, too; unlock the amazing Area X mode and you’ll find yourself flying, shooting and bobbing your head to some of the trippiest visuals yet seen in VR.

+

“Thumper” ($20)

+

+

What would happen if Tron, the board game Simon, a Clown beetle, Cthulhu and a noise band met in VR? Chaos, for sure, and also “Thumper.” Called a “violent rhythm game” by its creators, “Thumper” is, well, a violent rhythm game that’s also a gorgeous, unsettling and totally captivating assault on the senses. With simple controls and a straightforward premise – click the X button and the analog stick in time with the music as you barrel down a neon highway — it’s one of the rare games that works equally well both in and out of VR. But since you have PSVR, play it there. It’s marvelous.

+

“Until Dawn: Rush of Blood” ($20)

+

+

Cheeky horror game “Until Dawn” was a breakout hit for the PS4 last year, channeling the classic “dumb teens in the woods” horror trope into an effective interactive drama. Well, forget all that if you fire up “Rush of Blood,” because this one sticks you front and center on a rollercoaster ride from Hell. Literally. You ride through a dimly-lit carnival of terror, dual-wielding pistols as you take down targets, hideous pig monsters and, naturally, maniac clowns. Be warned: If the bad guys don’t get you, the jump scares will.

+

“Headmaster” ($20)

+

+

Soccer meets “Portal” in the weird (and weirdly fun) “Headmaster,” a game about heading soccer balls into nets, targets and a variety of other things while stuck in some diabolical training facility. While at first it seems a little basic, increasingly challenging shots and a consistently entertaining narrative keep it from running off the pitch. Funny, ridiculous and as easy as literally moving your head back and forth, it’s a pleasant PSVR surprise.

+

“RIGS: Mechanized Combat League” ($50)

+

+

Giant mechs + sports? That’s the gist of this robotic blast-a-thon, which pits two teams of three against one another in gorgeous, explosive and downright fun VR combat. At its best, “RIGS” marries the thrill of fast-paced competitive shooters with the insanity of piloting a giant mech in VR. It can, however, be one of the barfier PSVR games. So pack your Dramamine, you’re going to have to ease yourself into this one.

+

“Batman Arkham VR” ($20)

+

+

“I’m Batman,” you will say. And you’ll actually be right this time, because you are Batman in this detective yarn, and you know this because you actually grab the famous cowl and mask, stick it on your head, and stare into the mirrored reflection of Rocksteady Games’ impressive Dark Knight character model. It lacks the action of its fellow “Arkham” games and runs disappointingly short, but it’s a high-quality experience that really shows off how powerfully immersive VR can be.

+

“Job Simulator” ($30)

+

+

There are a number of good VR ports in the PSVR launch lineup, but the HTC Vive launch game “Job Simulator” might be the best. Your task? Lots of tasks, actually, from cooking food to fixing cars to working in an office, all for robots, because did I mention you were in the future? Infinitely charming and surprisingly challenging, it’s a great showpiece for VR.

+

“Eve Valkyrie” ($60)

+

+

Already a hit on the Oculus Rift, this space dogfighting game was one of the first to really show off how VR can turn a traditional game experience into something special. It’s pricey and not quite as hi-res as the Rift version, but “Eve Valkyrie” does an admirable job filling the void left since “Battlestar Galactica” ended. Too bad there aren’t any Cylons in it (or are there?)

+

More games news:

+

Ben Silverman is on Twitter at - ben_silverman.

+ +

Ben Silverman is on Twitter at + ben_silverman.

-
-
\ No newline at end of file +
\ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-2/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-2/expected.html index 9bc5f6f5f..92ef4391a 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-2/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-2/expected.html @@ -1,19 +1,11 @@
-
-
- -
-
+
+

1 / 5

-
- +

In this photo dated Tuesday, Nov, 29, 2016 the Soyuz-FG rocket booster with the Progress MS-04 cargo ship is installed on a launch pad in Baikonur, Kazakhstan. The unmanned Russian cargo space ship Progress MS-04 broke up in the atmosphere over Siberia on Thursday Dec. 1, 2016, just minutes after the launch en route to the International Space Station due to an unspecified malfunction, the Russian space agency said.(Oleg Urusov/ Roscosmos Space Agency Press Service photo via AP)

In this photo dated Tuesday, Nov, 29, 2016 the Soyuz-FG rocket booster with the Progress MS-04 cargo ship is installed on a launch pad in Baikonur, Kazakhstan. The unmanned Russian cargo space ship Progress MS-04 broke up in the atmosphere over Siberia on Thursday Dec. 1, 2016, just minutes after the launch en route to the International Space Station due to an unspecified malfunction, the Russian space agency said.(Oleg Urusov/ Roscosmos Space Agency Press Service photo via AP)

-
- -
-
-
+

MOSCOW (AP) — An unmanned Russian cargo spaceship heading to the International Space Station broke up in the atmosphere over Siberia on Thursday due to an unspecified malfunction, the Russian space agency said.

The Progress MS-04 cargo craft broke up at an altitude of 190 kilometers (118 miles) over the remote Russian Tuva region in Siberia that borders Mongolia, Roscosmos said in a statement. It said most of spaceship's debris burnt up as it entered the atmosphere but some fell to Earth over what it called an uninhabited area.

@@ -30,5 +22,4 @@

Aerospace Writer Marcia Dunn in Cape Canaveral, Florida, and Vladimir Isachenkov in Moscow contributed to this report.

-
- \ No newline at end of file +
\ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-3/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-3/expected-metadata.json index 8af68c02b..1af6b8f27 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-3/expected-metadata.json +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-3/expected-metadata.json @@ -1,6 +1,6 @@ { "Author": "By GILLIAN MOHNEY\n March 11, 2015 3:46 PM", - "Direction": null, + "Direction": "ltr", "Excerpt": "A photographer and Navy veteran is fighting back after a photo she posted to Facebook started an online backlash. Vanessa Hicks said she had no idea her photo would be considered controversial. The photo, from a military family’s newborn photo shoot, showed a newborn infant wrapped in an American flag held by his father, who was in his military uniform. Hicks, a Navy veteran herself and the wife of an active-duty Navy member, said her intention was to honor the flag as well as her clients, who wanted to incorporate their military service in the photo shoot.", "Image": "https:\/\/s.yimg.com\/bt\/api\/res\/1.2\/qZaM9MLUOrxLg4IfXt_Niw--\/YXBwaWQ9eW5ld3NfbGVnbztxPTc1O3c9NjAw\/http:\/\/media.zenfs.com\/en-US\/video\/video.abcnewsplus.com\/559ecdbafdb839129816b5c79a996975.cf.png", "Title": "Veteran Wraps Baby in American Flag, Photo Sparks Controversy", diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-3/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-3/expected.html index c5d7e33dc..21bb560e6 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-3/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-3/expected.html @@ -1,28 +1,30 @@ -
-
-

'GMA' Cookie Search:

+
+
+

'GMA' Cookie Search:

-
- - - - -
+ +
-

A photographer and Navy veteran is fighting back after a photo she posted to Facebook started an online backlash.

+ + + + + +

A photographer and Navy veteran is fighting back after a photo she posted to Facebook started an online backlash.

Vanessa Hicks said she had no idea her photo would be considered controversial. The photo, from a military family’s newborn photo shoot, showed a newborn infant wrapped in an American flag held by his father, who was in his military uniform.

Hicks, a Navy veteran herself and the wife of an active-duty Navy member, said her intention was to honor the flag as well as her clients, who wanted to incorporate their military service in the photo shoot.

-

Pizza Man Making Special Delivery Pizza Delivery to Afghanistan During Super Bowl

-

Redesigned Scopes Fail to Stop 'Superbug Outbreaks

-

Antarctica 'Penguin Post Office' Attracts Record Number of Applicants

+

Pizza Man Making Special Delivery Pizza Delivery to Afghanistan During Super Bowl

+

Redesigned Scopes Fail to Stop 'Superbug Outbreaks

+

Antarctica 'Penguin Post Office' Attracts Record Number of Applicants

“This is what he was fighting for, his son wrapped in an American flag,” Hicks told ABC News. However, when she posted the image on her page, she started to get comments accusing her of desecrating the flag.

On one Facebook page an unidentified poster put up her picture writing and wrote they found it was “disrespectful, rude, tacky, disgusting, and against the U.S. Flag Code.”

-

View photo

.

Vanessa Hicks

Vanessa Hicks

+

View photo

.

Vanessa Hicks
+

Vanessa Hicks

-

The Federal Flag Code has guidelines for the proper treatment of the U.S. Flag but there are no rules for punishment related to violations. In the past, the Supreme Court has found that people are protected from punishment under the First Amendment for manipulating or even burning the flag. +

The Federal Flag Code has guidelines for the proper treatment of the U.S. Flag but there are no rules for punishment related to violations. In the past, the Supreme Court has found that people are protected from punishment under the First Amendment for manipulating or even burning the flag.

Hicks said she was surprised when messages suddenly started to pop up on her Facebook page and even her own website criticizing her photos.

She said she stayed up until 4 a.m. recently to take down comments from her business and company page, even on shoots that had nothing to do with the flag.

@@ -32,13 +34,12 @@

Hicks, whose husband is still on active duty in the Navy, said the flag is a symbol of U.S. freedoms including the First Amendment right to free speech.

“[My husband] wouldn’t die for a flag, he would die for the freedoms that this country offers,” she told ABC News.

After her story grabbed local headlines, Hicks has been inundated by requests for photos shoots, and she said she plans to give 15 percent of all profits related to these shoots to the USO.

-
-
- -
+ + +
+ -
\ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-4/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-4/expected-metadata.json index c8459ad79..18324c4ff 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-4/expected-metadata.json +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-4/expected-metadata.json @@ -1,5 +1,5 @@ { - "Author": null, + "Author": "個人", "Direction": null, "Excerpt": "トレンドマイクロは3月9日、Wi-Fi利用時の通信を暗号化し保護するスマホ・タブレット - Yahoo!ニュース(CNET Japan)", "Image": "http:\/\/i.yimg.jp\/images\/jpnews\/cre\/common\/all\/images\/fbico_ogp_600x600.png", diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-4/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-4/expected.html index db7694ab3..04be3c96b 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-4/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-4/expected.html @@ -1,9 +1,7 @@ -
-

+

トレンドマイクロは3月9日、Wi-Fi利用時の通信を暗号化し保護するスマホ・タブレット向けのセキュリティアプリ「フリーWi-Fiプロテクション」(iOS/Android)の発売を開始すると発表した。1年版ライセンスは2900円(税込)で、2年版ライセンスは5000円(税込)。

 フリーWi-Fiプロテクションは、App Storeおよび、Google Playにて販売され、既に提供しているスマホ・タブレット向け総合セキュリティ対策アプリ「ウイルスバスター モバイル」と併用することで、不正アプリや危険なウェブサイトからの保護に加え、通信の盗み見を防ぐことができる。

 2020年の東京オリンピック・パラリンピックの開催などを見据え、フリーWi-Fi(公衆無線LAN)の設置が促進され、フリーWi-Fiの利用者も増加している。

 一方で、脆弱な設定のフリーWi-Fiや攻撃者が設置した偽のフリーWi-Fiへの接続などによる情報漏えい、通信の盗み見などのセキュリティリスクが危惧されているという。

 正規事業者が提供する安全性の高いフリーWi-Fiのほかにも、通信を暗号化していない安全性の低いフリーWi-Fi、さらにはサイバー犯罪者が設置したフリーWi-Fiなどさまざまなものが混在している。また、利用者は、接続する前にひとつひとつ安全性を確認するのは難しい状況だとしている。

 トレンドマイクロがスマートフォン保持者でフリーWi-Fiの利用経験がある人に実施した調査では、回答者の約85%が安全なフリーWi-Fiと危険なフリーWi-Fiは「見分けられない」と回答。さらに、約65%がフリーWi-Fiの利用に不安を感じていると回答している。

 こうした環境の変化やユーザの状況を鑑み、フリーWi-Fiプロテクションの提供を開始する。同アプリをインストールすることで利用者は、万が一安全性の低いフリーWi-Fiのアクセスポイントに接続してしまった場合でも、その通信を暗号化でき、通信の盗み見やそれによる情報漏えいのリスクを低減できるようになる。 -

 具体的には、フリーWi-Fi利用時に、スマートフォンがフリーWi-Fiプロテクションインフラに接続することにより、フリーWi-Fiのアクセスポイントを介した通信がVPN(Virtual Private Network)で暗号化される。これにより利用者は、第三者から通信を傍受されることやデータの情報漏えいを防ぐことが可能。さらに、かんたん自動接続の機能により、通信を暗号化していない安全性が低いフリーWi-Fi接続時や利用者が指定したWi-Fiへ接続する際に、自動的に通信を暗号化し、利用者の通信を保護する。

 また、フリーWi-Fiプロテクションインフラと、莫大なセキュリティ情報のビッグデータを保有するクラウド型セキュリティ技術基盤「Trend Micro Smart Protection Network」(SPN)が連携することで、フリーWi-Fiプロテクションインフラを経由してインターネットを利用する際に、利用者がフィッシング詐欺サイトや偽サイトなどへの不正サイトへアクセスすることをブロックできるという。

-
\ No newline at end of file +

 具体的には、フリーWi-Fi利用時に、スマートフォンがフリーWi-Fiプロテクションインフラに接続することにより、フリーWi-Fiのアクセスポイントを介した通信がVPN(Virtual Private Network)で暗号化される。これにより利用者は、第三者から通信を傍受されることやデータの情報漏えいを防ぐことが可能。さらに、かんたん自動接続の機能により、通信を暗号化していない安全性が低いフリーWi-Fi接続時や利用者が指定したWi-Fiへ接続する際に、自動的に通信を暗号化し、利用者の通信を保護する。

 また、フリーWi-Fiプロテクションインフラと、莫大なセキュリティ情報のビッグデータを保有するクラウド型セキュリティ技術基盤「Trend Micro Smart Protection Network」(SPN)が連携することで、フリーWi-Fiプロテクションインフラを経由してインターネットを利用する際に、利用者がフィッシング詐欺サイトや偽サイトなどへの不正サイトへアクセスすることをブロックできるという。

\ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/youth/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/youth/expected.html index f4ae9daac..dba688f1f 100644 --- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/youth/expected.html +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/youth/expected.html @@ -1,8 +1,5 @@ -
-
-
-
-

海外留学生看两会:出国前后关注点大不同

+
+

海外留学生看两会:出国前后关注点大不同

图为马素湘在澳大利亚悉尼游玩时的近影。

  出国前后关注点大不同

  出国前:政治科目会出啥考题?

@@ -12,7 +9,7 @@

   无独有偶,英国剑桥大学的李博灏也有着类似的经历。他表示,在国内读本科时,虽然关注过两会,但并不像现在这样,将关注点放在国家社会经济迫切需要解决的难题与问题上。“出国前更关心与我们学生的实际问题以及切身利益相关的议题,比如奖学金、助学金的发放与申请;相关工作行业就业前景等。”

   在英国求学6年后,李博灏希望能够学有所用,为国家发展过程中遇到的难题寻求解决办法。因此随着课题研究的深入,他更加关注国家和社会目前所面临的挑战,比如中等收入陷阱、供给侧改革、创意创新产业的发展等议题。

   还有一些学子表示,出国前对两会不太了解,出国后反而对两会热点多了些思考。在澳大利亚墨尔本留学的马素湘说:“想不关注都难啊!刷微博看新闻到处都是两会的消息。而且我现在学的是新闻专业,对世界发生的大小事都会留意。随着年龄、阅历增长,家国情怀也渐长,会关心国家发展的各方面问题。”

-

+

图为李博灏在瑞士日内日瓦联合国欧洲总部的近影。

  关注点多与所学专业相关

  法学专业热议法定婚龄 很多人关心供给侧改革

@@ -20,7 +17,7 @@

   对此提案,卢宇有着自己的看法,“百花齐放的局面固然可喜,但也不能一哄而上,国家应该提高行业准入门槛,完善新能源汽车准入管理规则,从源头上进行制度创新,将一些不具备新能源汽车生产资质的厂家淘汰出局,并高度关注电池系统安全问题,严格执行充电桩生产的国际标准。”

   马素湘表示,“出国读研之前,我在国内学习法学,因此对相关的问题比较感兴趣。今年两会上人大代表黄细花提出把法定婚龄降低到18岁的提案;而在微博的热搜榜上,一本儿童性教育读物引起了极大的争议。我认为降低婚龄并不适合我国国情。因为性教育的缺乏导致我国大部分人在18岁之前没有接受过完整的性教育,思想行动上也不够成熟,如何能够对自己的人生和自己的另一半负责?所以我希望能有人大代表提议在国民儿童阶段完善我国的性教育,而不是为了鼓励生育将法定婚龄提前。”

   李博灏是英国剑桥大学制造业研究所创新设计管理中心的一名博士。他格外关注的话题是供给侧结构性改革,知识产权保护,消费升级等议题。“我的博士研究课题是关于推动创新设计密集型产业的发展从而帮助中等收入国家克服中等收入陷阱的探索,因此一直十分关注国内关于供给侧改革的相关议题。通过本届两会对于该议题的进一步关注,我希望可以有效地帮助我了解供给侧改革与中等收入陷阱问题目前的发展状况以及解决情况;也希望可以与更多的机构取得联系,并帮助他们了解该议题最前沿的研究与解决方案。”

-

+

图为卢宇与祖国五星红旗和联合国会旗的合影。

   两会成为了解国情的窗口

   盼准确把握国家发展需求 愿寻求机遇回国有所作为

@@ -30,7 +27,4 @@

   在两会上,全国政协委员张近东提出“当前中国经济的发展正在从数量型向质量型转变,消费升级将成为企业新一轮创新发展的动力。”对此,李博灏认为这也是他关注的问题。他认为:“在消费市场持续扩大的大环境下,如何能够通过促进创新设计产业的发展以及消费品品质的提升,推动国内消费增长并促进其在可持续经济增长中的作用,是一个迫切需要解决的问题。在当前供给侧改革的大环境下,消费升级的重要性越发突显。”

   作为两会的资深粉,卢宇聊起两会话题充满了期待。“今年是国家‘十三五’规划的关键时期,‘一带一路’建设也在如火如荼地进行中。作为一名中国留学生,我一直都关注着能在哪些领域为国家、为中外合作共赢做出贡献。‘大众创业、万众创新’提出有几年了。全国各省市在吸引留学人才归国创业就业方面纷纷提出了各种优惠政策,但目前大都集中在沿海发达省份,而且主要惠及理工科博士,政策覆盖面还不够广。期待从国家层面设立工作组加强留学人才的统筹协调,完善顶层设计。人文社科类留学人才是未来国家智库的重要后备力量,也应该适当加强对他们的政策鼓励,更好地服务于‘一带一路’国家战略。”

   卢宇还认为两会应该增设学子代表,列席旁听两会,拓展留学生参政议政渠道。“我相信优秀留学生的国际化视野必将为家乡建设带来新的思路,增添新的活力。”卢宇恳切地说。

-
-
-
-
\ No newline at end of file +
\ No newline at end of file diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php index 34b3b7ad0..51b54d2f0 100644 --- a/vendor/composer/autoload_real.php +++ b/vendor/composer/autoload_real.php @@ -22,8 +22,6 @@ class ComposerAutoloaderInit19fc2ff1c0f9a92279c7979386bb2056 return self::$loader; } - require __DIR__ . '/platform_check.php'; - spl_autoload_register(array('ComposerAutoloaderInit19fc2ff1c0f9a92279c7979386bb2056', 'loadClassLoader'), true, true); self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(\dirname(__FILE__))); spl_autoload_unregister(array('ComposerAutoloaderInit19fc2ff1c0f9a92279c7979386bb2056', 'loadClassLoader')); diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index 935e86201..917ad98ff 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -297,15 +297,9 @@ "version_normalized": "dev-master", "source": { "type": "git", - "url": "https://github.com/aaronpk/idiorm.git", + "url": "https://dev.tt-rss.org/fox/idiorm.git", "reference": "efc8ea06698f53e2c479c7696f2b154c47c3a3cb" }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/aaronpk/idiorm/zipball/efc8ea06698f53e2c479c7696f2b154c47c3a3cb", - "reference": "efc8ea06698f53e2c479c7696f2b154c47c3a3cb", - "shasum": "" - }, "require": { "php": ">=5.2.0" }, @@ -316,7 +310,7 @@ "time": "2022-03-26T15:19:01+00:00", "default-branch": true, "type": "library", - "installation-source": "dist", + "installation-source": "source", "autoload": { "classmap": [ "idiorm.php" @@ -960,31 +954,36 @@ }, { "name": "phpstan/phpstan", - "version": "1.8.1", - "version_normalized": "1.8.1.0", + "version": "1.1.2", + "version_normalized": "1.1.2.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "8dbba631fa32f4b289404469c2afd6122fd61d67" + "reference": "bcea0ae85868a89d5789c75f012c93129f842934" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/8dbba631fa32f4b289404469c2afd6122fd61d67", - "reference": "8dbba631fa32f4b289404469c2afd6122fd61d67", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/bcea0ae85868a89d5789c75f012c93129f842934", + "reference": "bcea0ae85868a89d5789c75f012c93129f842934", "shasum": "" }, "require": { - "php": "^7.2|^8.0" + "php": "^7.1|^8.0" }, "conflict": { "phpstan/phpstan-shim": "*" }, - "time": "2022-07-12T16:08:06+00:00", + "time": "2021-11-09T12:41:09+00:00", "bin": [ "phpstan", "phpstan.phar" ], "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, "installation-source": "dist", "autoload": { "files": [ @@ -998,7 +997,7 @@ "description": "PHPStan - PHP Static Analysis Tool", "support": { "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.8.1" + "source": "https://github.com/phpstan/phpstan/tree/1.1.2" }, "funding": [ { diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php index 6f5250cc9..e2f618c68 100644 --- a/vendor/composer/installed.php +++ b/vendor/composer/installed.php @@ -5,7 +5,7 @@ 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), - 'reference' => '4b6161892000cb2b8392dce92a9cf2cabdf2d20e', + 'reference' => '96f704d157fcf20da130f37a31fbffd62a8a9892', 'name' => '__root__', 'dev' => true, ), @@ -16,7 +16,7 @@ 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), - 'reference' => '4b6161892000cb2b8392dce92a9cf2cabdf2d20e', + 'reference' => '96f704d157fcf20da130f37a31fbffd62a8a9892', 'dev_requirement' => false, ), 'beberlei/assert' => array( @@ -157,12 +157,12 @@ 'dev_requirement' => true, ), 'phpstan/phpstan' => array( - 'pretty_version' => '1.8.1', - 'version' => '1.8.1.0', + 'pretty_version' => '1.1.2', + 'version' => '1.1.2.0', 'type' => 'library', 'install_path' => __DIR__ . '/../phpstan/phpstan', 'aliases' => array(), - 'reference' => '8dbba631fa32f4b289404469c2afd6122fd61d67', + 'reference' => 'bcea0ae85868a89d5789c75f012c93129f842934', 'dev_requirement' => true, ), 'phpunit/php-code-coverage' => array( diff --git a/vendor/composer/platform_check.php b/vendor/composer/platform_check.php deleted file mode 100644 index adfb472fb..000000000 --- a/vendor/composer/platform_check.php +++ /dev/null @@ -1,26 +0,0 @@ -= 80000)) { - $issues[] = 'Your Composer dependencies require a PHP version ">= 8.0.0". You are running ' . PHP_VERSION . '.'; -} - -if ($issues) { - if (!headers_sent()) { - header('HTTP/1.1 500 Internal Server Error'); - } - if (!ini_get('display_errors')) { - if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { - fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL); - } elseif (!headers_sent()) { - echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; - } - } - trigger_error( - 'Composer detected issues in your platform: ' . implode(' ', $issues), - E_USER_ERROR - ); -} diff --git a/vendor/j4mie/idiorm/.gitattributes b/vendor/j4mie/idiorm/.gitattributes new file mode 100644 index 000000000..be8c7b340 --- /dev/null +++ b/vendor/j4mie/idiorm/.gitattributes @@ -0,0 +1,5 @@ +.gitignore export-ignore +.gitattributes export-ignore +/test export-ignore +.travis.yml export-ignore +phpunit.xml export-ignore diff --git a/vendor/j4mie/idiorm/.gitignore b/vendor/j4mie/idiorm/.gitignore new file mode 100644 index 000000000..34b5c58a7 --- /dev/null +++ b/vendor/j4mie/idiorm/.gitignore @@ -0,0 +1,7 @@ +*.swp +*.sqlite +docs/_build +/phpunit.phar +/vendor +/composer.lock +.DS_Store diff --git a/vendor/j4mie/idiorm/.travis.yml b/vendor/j4mie/idiorm/.travis.yml new file mode 100644 index 000000000..fee02856e --- /dev/null +++ b/vendor/j4mie/idiorm/.travis.yml @@ -0,0 +1,42 @@ +language: php +php: + - 5.4 + - 5.6 + - 7.0 + - 7.1 + - hhvm +env: PHPV=0 +matrix: + include: + - php: 5.2 + dist: precise + env: PHPV=52 + - php: 5.3 + dist: precise +before_install: | + if [ "$PHPV" -eq 52 ]; then + pecl install phar + fi +install: | + if [ "$PHPV" -ne 52 ]; then + composer install + else + # special handling for PHP 5.2 testing as there is no composer available + export X="$HOME/.idiorm/bin" + mkdir -p "$X" + curl -sSfL https://github.com/treffynnon/php5.2-phpunit3.6.12-phar/releases/download/1.0.2/php52-phpunit.phar -o "$X/phpunit" + chmod +x "$X/phpunit" + fi +script: | + if [ "$PHPV" -ne 52 ]; then + composer run-script test -- --colors --coverage-text + else + # special handling for PHP 5.2 testing as there is no composer available + # we need phpunit-3.6.12, but there is no phar file for it so comment out for now + $X/phpunit --colors --coverage-text + fi +cache: + directories: + - $HOME/.composer/cache + - $HOME/.idiorm + - vendor \ No newline at end of file diff --git a/vendor/j4mie/idiorm/phpunit.xml b/vendor/j4mie/idiorm/phpunit.xml new file mode 100644 index 000000000..efbc81c44 --- /dev/null +++ b/vendor/j4mie/idiorm/phpunit.xml @@ -0,0 +1,12 @@ + + + + test + test + + + \ No newline at end of file diff --git a/vendor/j4mie/idiorm/test/CacheIntegrationTest.php b/vendor/j4mie/idiorm/test/CacheIntegrationTest.php new file mode 100644 index 000000000..0a5dc6101 --- /dev/null +++ b/vendor/j4mie/idiorm/test/CacheIntegrationTest.php @@ -0,0 +1,43 @@ +count(); + $this->assertEquals(3, $x); + } + + public function tearDown() { + ORM::raw_execute('DROP TABLE `league`'); + } + + public function testRegressionForPullRequest319() { + $rs = ORM::for_table('league')->where('class_id', 1); + $total = $rs->count(); + $this->assertEquals(1, $total); + $row = $rs->find_one(); + $this->assertEquals(array('class_id' => 1), $row->as_array()); + + $rs = ORM::for_table('league')->where('class_id', 1); + $total = $rs->count(); + $this->assertEquals(1, $total); + try { + $row = $rs->find_one(); + } catch(PDOException $e) { + $this->fail("Caching is breaking subsequent queries!\n{$e->getMessage()}"); + } + $this->assertEquals(array('class_id' => 1), $row->as_array()); + } + +} diff --git a/vendor/j4mie/idiorm/test/CacheTest.php b/vendor/j4mie/idiorm/test/CacheTest.php new file mode 100644 index 000000000..a3daa91d0 --- /dev/null +++ b/vendor/j4mie/idiorm/test/CacheTest.php @@ -0,0 +1,42 @@ +where('name', 'Fred')->where('age', 17)->find_one(); + ORM::for_table('widget')->where('name', 'Bob')->where('age', 42)->find_one(); + $expected = ORM::get_last_query(); + ORM::for_table('widget')->where('name', 'Fred')->where('age', 17)->find_one(); // this shouldn't run a query! + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testQueryGenerationOnlyOccursOnceWithMultipleConnections() { + // Test caching with multiple connections (also a bit of a hack) + ORM::for_table('widget', self::ALTERNATE)->where('name', 'Steve')->where('age', 80)->find_one(); + ORM::for_table('widget', self::ALTERNATE)->where('name', 'Tom')->where('age', 120)->find_one(); + $expected = ORM::get_last_query(); + ORM::for_table('widget', self::ALTERNATE)->where('name', 'Steve')->where('age', 80)->find_one(); // this shouldn't run a query! + $this->assertEquals($expected, ORM::get_last_query(self::ALTERNATE)); + } + +} \ No newline at end of file diff --git a/vendor/j4mie/idiorm/test/CacheTest53.php b/vendor/j4mie/idiorm/test/CacheTest53.php new file mode 100644 index 000000000..bc30b0aaf --- /dev/null +++ b/vendor/j4mie/idiorm/test/CacheTest53.php @@ -0,0 +1,82 @@ +assertEquals(true, is_string($query)); + $phpunit->assertEquals(true, is_array($parameters)); + $phpunit->assertEquals(true, is_string($connection)); + $phpunit->assertEquals('widget', $table_name); + $parameter_string = join(',', $parameters); + $key = $query . ':' . $parameter_string; + $my_key = 'some-prefix'.crc32($key); + return $my_key; + }); + ORM::configure('cache_query_result', function ($cache_key, $value, $table_name, $connection_name) use ($phpunit, &$my_cache) { + $phpunit->assertEquals(true, is_string($cache_key)); + $phpunit->assertEquals('widget', $table_name); + $my_cache[$cache_key] = $value; + }); + ORM::configure('check_query_cache', function ($cache_key, $table_name, $connection_name) use ($phpunit, &$my_cache) { + $phpunit->assertEquals(true, is_string($cache_key)); + $phpunit->assertEquals(true, is_string($connection_name)); + $phpunit->assertEquals('widget', $table_name); + + if(isset($my_cache) and isset($my_cache[$cache_key])){ + $phpunit->assertEquals(true, is_array($my_cache[$cache_key])); + return $my_cache[$cache_key]; + } else { + return false; + } + }); + ORM::configure('clear_cache', function ($table_name, $connection_name) use ($phpunit, &$my_cache) { + $phpunit->assertEquals(true, is_string($table_name)); + $phpunit->assertEquals(true, is_string($connection_name)); + $my_cache = array(); + }); + ORM::for_table('widget')->where('name', 'Fred')->where('age', 21)->find_one(); + ORM::for_table('widget')->where('name', 'Fred')->where('age', 21)->find_one(); + ORM::for_table('widget')->where('name', 'Bob')->where('age', 42)->find_one(); + + //our custom cache should be full now + $this->assertEquals(true, !empty($my_cache)); + + //checking custom cache key + foreach($my_cache as $k=>$v){ + $this->assertEquals('some-prefix', substr($k,0,11)); + } + + $new = ORM::for_table('widget')->create(); + $new->name = "Joe"; + $new->age = 25; + $saved = $new->save(); + + //our custom cache should be empty now + $this->assertEquals(true, empty($my_cache)); + } +} \ No newline at end of file diff --git a/vendor/j4mie/idiorm/test/ConfigTest.php b/vendor/j4mie/idiorm/test/ConfigTest.php new file mode 100644 index 000000000..c6f4631ad --- /dev/null +++ b/vendor/j4mie/idiorm/test/ConfigTest.php @@ -0,0 +1,125 @@ + 'widget_id', + 'widget_handle' => 'widget_handle_id', + )); + } + + protected function tearDownIdColumnOverrides() { + ORM::configure('id_column_overrides', array()); + } + + public function testSettingIdColumn() { + ORM::for_table('widget')->find_one(5); + $expected = "SELECT * FROM `widget` WHERE `primary_key` = '5' LIMIT 1"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testSettingIdColumnOverridesOne() { + $this->setUpIdColumnOverrides(); + + ORM::for_table('widget')->find_one(5); + $expected = "SELECT * FROM `widget` WHERE `widget_id` = '5' LIMIT 1"; + $this->assertEquals($expected, ORM::get_last_query()); + + $this->tearDownIdColumnOverrides(); + } + + public function testSettingIdColumnOverridesTwo() { + $this->setUpIdColumnOverrides(); + + ORM::for_table('widget_handle')->find_one(5); + $expected = "SELECT * FROM `widget_handle` WHERE `widget_handle_id` = '5' LIMIT 1"; + $this->assertEquals($expected, ORM::get_last_query()); + + $this->tearDownIdColumnOverrides(); + } + + public function testSettingIdColumnOverridesThree() { + $this->setUpIdColumnOverrides(); + + ORM::for_table('widget_nozzle')->find_one(5); + $expected = "SELECT * FROM `widget_nozzle` WHERE `primary_key` = '5' LIMIT 1"; + $this->assertEquals($expected, ORM::get_last_query()); + + $this->tearDownIdColumnOverrides(); + } + + public function testInstanceIdColumnOne() { + $this->setUpIdColumnOverrides(); + + ORM::for_table('widget')->use_id_column('new_id')->find_one(5); + $expected = "SELECT * FROM `widget` WHERE `new_id` = '5' LIMIT 1"; + $this->assertEquals($expected, ORM::get_last_query()); + + $this->tearDownIdColumnOverrides(); + } + + public function testInstanceIdColumnTwo() { + $this->setUpIdColumnOverrides(); + + ORM::for_table('widget_handle')->use_id_column('new_id')->find_one(5); + $expected = "SELECT * FROM `widget_handle` WHERE `new_id` = '5' LIMIT 1"; + $this->assertEquals($expected, ORM::get_last_query()); + + $this->tearDownIdColumnOverrides(); + } + + public function testInstanceIdColumnThree() { + $this->setUpIdColumnOverrides(); + + ORM::for_table('widget_nozzle')->use_id_column('new_id')->find_one(5); + $expected = "SELECT * FROM `widget_nozzle` WHERE `new_id` = '5' LIMIT 1"; + $this->assertEquals($expected, ORM::get_last_query()); + + $this->tearDownIdColumnOverrides(); + } + + public function testGetConfig() { + $this->assertTrue(ORM::get_config('logging')); + ORM::configure('logging', false); + $this->assertFalse(ORM::get_config('logging')); + ORM::configure('logging', true); + } + + public function testGetConfigArray() { + $expected = array( + 'connection_string' => 'sqlite::memory:', + 'id_column' => 'primary_key', + 'id_column_overrides' => array(), + 'error_mode' => PDO::ERRMODE_EXCEPTION, + 'username' => null, + 'password' => null, + 'driver_options' => null, + 'identifier_quote_character' => '`', + 'logging' => true, + 'logger' => null, + 'caching' => false, + 'caching_auto_clear' => false, + 'return_result_sets' => false, + 'limit_clause_style' => 'limit', + ); + $this->assertEquals($expected, ORM::get_config()); + } + +} diff --git a/vendor/j4mie/idiorm/test/ConfigTest53.php b/vendor/j4mie/idiorm/test/ConfigTest53.php new file mode 100644 index 000000000..ef8af778a --- /dev/null +++ b/vendor/j4mie/idiorm/test/ConfigTest53.php @@ -0,0 +1,36 @@ +assertTrue(is_callable($function)); + + $log_string = "UPDATE `widget` SET `added` = NOW() WHERE `id` = '1'"; + $this->assertEquals($log_string, $function($log_string)); + + ORM::configure('logger', null); + } + +} \ No newline at end of file diff --git a/vendor/j4mie/idiorm/test/IdiormResultSetTest.php b/vendor/j4mie/idiorm/test/IdiormResultSetTest.php new file mode 100644 index 000000000..c458d9972 --- /dev/null +++ b/vendor/j4mie/idiorm/test/IdiormResultSetTest.php @@ -0,0 +1,81 @@ +assertInternalType('array', $IdiormResultSet->get_results()); + } + + public function testConstructor() { + $result_set = array('item' => new stdClass); + $IdiormResultSet = new IdiormResultSet($result_set); + $this->assertSame($IdiormResultSet->get_results(), $result_set); + } + + public function testSetResultsAndGetResults() { + $result_set = array('item' => new stdClass); + $IdiormResultSet = new IdiormResultSet(); + $IdiormResultSet->set_results($result_set); + $this->assertSame($IdiormResultSet->get_results(), $result_set); + } + + public function testAsArray() { + $result_set = array('item' => new stdClass); + $IdiormResultSet = new IdiormResultSet(); + $IdiormResultSet->set_results($result_set); + $this->assertSame($IdiormResultSet->as_array(), $result_set); + } + + public function testCount() { + $result_set = array('item' => new stdClass); + $IdiormResultSet = new IdiormResultSet($result_set); + $this->assertSame($IdiormResultSet->count(), 1); + $this->assertSame(count($IdiormResultSet), 1); + } + + public function testGetIterator() { + $result_set = array('item' => new stdClass); + $IdiormResultSet = new IdiormResultSet($result_set); + $this->assertInstanceOf('ArrayIterator', $IdiormResultSet->getIterator()); + } + + public function testForeach() { + $result_set = array('item' => new stdClass); + $IdiormResultSet = new IdiormResultSet($result_set); + $return_array = array(); + foreach($IdiormResultSet as $key => $record) { + $return_array[$key] = $record; + } + $this->assertSame($result_set, $return_array); + } + + public function testCallingMethods() { + $result_set = array('item' => ORM::for_table('test'), 'item2' => ORM::for_table('test')); + $IdiormResultSet = new IdiormResultSet($result_set); + $IdiormResultSet->set('field', 'value')->set('field2', 'value'); + + foreach($IdiormResultSet as $record) { + $this->assertTrue(isset($record->field)); + $this->assertSame($record->field, 'value'); + + $this->assertTrue(isset($record->field2)); + $this->assertSame($record->field2, 'value'); + } + } + +} \ No newline at end of file diff --git a/vendor/j4mie/idiorm/test/MulitpleConnectionTest.php b/vendor/j4mie/idiorm/test/MulitpleConnectionTest.php new file mode 100644 index 000000000..a58f3ca83 --- /dev/null +++ b/vendor/j4mie/idiorm/test/MulitpleConnectionTest.php @@ -0,0 +1,52 @@ +assertInstanceOf('MockPDO', ORM::get_db()); + $this->assertInstanceOf('MockPDO', ORM::get_db(ORM::DEFAULT_CONNECTION)); + $this->assertInstanceOf('MockDifferentPDO', ORM::get_db(self::ALTERNATE)); + } + + public function testRawExecuteOverAlternateConnection() { + $expected = "SELECT * FROM `foo`"; + ORM::raw_execute("SELECT * FROM `foo`", array(), self::ALTERNATE); + + $this->assertEquals($expected, ORM::get_last_query(self::ALTERNATE)); + } + + public function testFindOneOverDifferentConnections() { + ORM::for_table('widget')->find_one(); + $statementOne = ORM::get_last_statement(); + $this->assertInstanceOf('MockPDOStatement', $statementOne); + + ORM::for_table('person', self::ALTERNATE)->find_one(); + $statementOne = ORM::get_last_statement(); // get_statement is *not* per connection + $this->assertInstanceOf('MockDifferentPDOStatement', $statementOne); + + $expected = "SELECT * FROM `widget` LIMIT 1"; + $this->assertNotEquals($expected, ORM::get_last_query()); // Because get_last_query() is across *all* connections + $this->assertEquals($expected, ORM::get_last_query(ORM::DEFAULT_CONNECTION)); + + $expectedToo = "SELECT * FROM `person` LIMIT 1"; + $this->assertEquals($expectedToo, ORM::get_last_query(self::ALTERNATE)); + } + +} \ No newline at end of file diff --git a/vendor/j4mie/idiorm/test/ORMTest.php b/vendor/j4mie/idiorm/test/ORMTest.php new file mode 100644 index 000000000..b85b0f65a --- /dev/null +++ b/vendor/j4mie/idiorm/test/ORMTest.php @@ -0,0 +1,185 @@ +assertEquals('0', ORM::CONDITION_FRAGMENT); + $this->assertEquals('1', ORM::CONDITION_VALUES); + } + + public function testForTable() { + $result = ORM::for_table('test'); + $this->assertInstanceOf('ORM', $result); + } + + public function testCreate() { + $model = ORM::for_table('test')->create(); + $this->assertInstanceOf('ORM', $model); + $this->assertTrue($model->is_new()); + } + + public function testIsNew() { + $model = ORM::for_table('test')->create(); + $this->assertTrue($model->is_new()); + + $model = ORM::for_table('test')->create(array('test' => 'test')); + $this->assertTrue($model->is_new()); + } + + public function testIsDirty() { + $model = ORM::for_table('test')->create(); + $this->assertFalse($model->is_dirty('test')); + + $model = ORM::for_table('test')->create(array('test' => 'test')); + $this->assertTrue($model->is_dirty('test')); + + $model->test = null; + $this->assertTrue($model->is_dirty('test')); + + $model->test = ''; + $this->assertTrue($model->is_dirty('test')); + } + + public function testArrayAccess() { + $value = 'test'; + $model = ORM::for_table('test')->create(); + $model['test'] = $value; + $this->assertTrue(isset($model['test'])); + $this->assertEquals($model['test'], $value); + unset($model['test']); + $this->assertFalse(isset($model['test'])); + } + + public function testFindResultSet() { + $result_set = ORM::for_table('test')->find_result_set(); + $this->assertInstanceOf('IdiormResultSet', $result_set); + $this->assertSame(count($result_set), 5); + } + + public function testFindResultSetByDefault() { + ORM::configure('return_result_sets', true); + + $result_set = ORM::for_table('test')->find_many(); + $this->assertInstanceOf('IdiormResultSet', $result_set); + $this->assertSame(count($result_set), 5); + + ORM::configure('return_result_sets', false); + + $result_set = ORM::for_table('test')->find_many(); + $this->assertInternalType('array', $result_set); + $this->assertSame(count($result_set), 5); + } + + public function testGetLastPdoStatement() { + ORM::for_table('widget')->where('name', 'Fred')->find_one(); + $statement = ORM::get_last_statement(); + $this->assertInstanceOf('MockPDOStatement', $statement); + } + + /** + * @expectedException IdiormMethodMissingException + */ + public function testInvalidORMFunctionCallShouldCreateException() { + $orm = ORM::for_table('test'); + $orm->invalidFunctionCall(); + } + + /** + * @expectedException IdiormMethodMissingException + */ + public function testInvalidResultsSetFunctionCallShouldCreateException() { + $resultSet = ORM::for_table('test')->find_result_set(); + $resultSet->invalidFunctionCall(); + } + + /** + * These next two tests are needed because if you have select()ed some fields, + * but not the primary key, then the primary key is not available for the + * update/delete query - see issue #203. + * We need to change the primary key here to something other than `id` + * becuase MockPDOStatement->fetch() always returns an id. + */ + public function testUpdateNullPrimaryKey() { + try { + $widget = ORM::for_table('widget') + ->use_id_column('primary') + ->select('foo') + ->where('primary', 1) + ->find_one() + ; + + $widget->foo = 'bar'; + $widget->save(); + + throw new Exception('Test did not throw expected exception'); + } catch (Exception $e) { + $this->assertEquals($e->getMessage(), 'Primary key ID missing from row or is null'); + } + } + + public function testDeleteNullPrimaryKey() { + try { + $widget = ORM::for_table('widget') + ->use_id_column('primary') + ->select('foo') + ->where('primary', 1) + ->find_one() + ; + + $widget->delete(); + + throw new Exception('Test did not throw expected exception'); + } catch (Exception $e) { + $this->assertEquals($e->getMessage(), 'Primary key ID missing from row or is null'); + } + } + + public function testNullPrimaryKey() { + try { + $widget = ORM::for_table('widget') + ->use_id_column('primary') + ->select('foo') + ->where('primary', 1) + ->find_one() + ; + + $widget->id(true); + + throw new Exception('Test did not throw expected exception'); + } catch (Exception $e) { + $this->assertEquals($e->getMessage(), 'Primary key ID missing from row or is null'); + } + } + + public function testNullPrimaryKeyPart() { + try { + $widget = ORM::for_table('widget') + ->use_id_column(array('id', 'primary')) + ->select('foo') + ->where('id', 1) + ->where('primary', 1) + ->find_one() + ; + + $widget->id(true); + + throw new Exception('Test did not throw expected exception'); + } catch (Exception $e) { + $this->assertEquals($e->getMessage(), 'Primary key ID contains null value(s)'); + } + } +} \ No newline at end of file diff --git a/vendor/j4mie/idiorm/test/QueryBuilderMssqlTest.php b/vendor/j4mie/idiorm/test/QueryBuilderMssqlTest.php new file mode 100644 index 000000000..be67b3316 --- /dev/null +++ b/vendor/j4mie/idiorm/test/QueryBuilderMssqlTest.php @@ -0,0 +1,32 @@ +find_one(); + $expected = 'SELECT TOP 1 * FROM "widget"'; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testLimit() { + ORM::for_table('widget')->limit(5)->find_many(); + $expected = 'SELECT TOP 5 * FROM "widget"'; + $this->assertEquals($expected, ORM::get_last_query()); + } + +} + diff --git a/vendor/j4mie/idiorm/test/QueryBuilderPsr1Test53.php b/vendor/j4mie/idiorm/test/QueryBuilderPsr1Test53.php new file mode 100644 index 000000000..3b267eba6 --- /dev/null +++ b/vendor/j4mie/idiorm/test/QueryBuilderPsr1Test53.php @@ -0,0 +1,582 @@ +findMany(); + $expected = "SELECT * FROM `widget`"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testFindOne() { + ORM::forTable('widget')->findOne(); + $expected = "SELECT * FROM `widget` LIMIT 1"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testFindOneWithPrimaryKeyFilter() { + ORM::forTable('widget')->findOne(5); + $expected = "SELECT * FROM `widget` WHERE `id` = '5' LIMIT 1"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testWhereIdIs() { + ORM::forTable('widget')->whereIdIs(5)->findOne(); + $expected = "SELECT * FROM `widget` WHERE `id` = '5' LIMIT 1"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testSingleWhereClause() { + ORM::forTable('widget')->where('name', 'Fred')->findOne(); + $expected = "SELECT * FROM `widget` WHERE `name` = 'Fred' LIMIT 1"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testMultipleWhereClauses() { + ORM::forTable('widget')->where('name', 'Fred')->where('age', 10)->findOne(); + $expected = "SELECT * FROM `widget` WHERE `name` = 'Fred' AND `age` = '10' LIMIT 1"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testWhereNotEqual() { + ORM::forTable('widget')->whereNotEqual('name', 'Fred')->findMany(); + $expected = "SELECT * FROM `widget` WHERE `name` != 'Fred'"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testWhereLike() { + ORM::forTable('widget')->whereLike('name', '%Fred%')->findOne(); + $expected = "SELECT * FROM `widget` WHERE `name` LIKE '%Fred%' LIMIT 1"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testWhereNotLike() { + ORM::forTable('widget')->whereNotLike('name', '%Fred%')->findOne(); + $expected = "SELECT * FROM `widget` WHERE `name` NOT LIKE '%Fred%' LIMIT 1"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testWhereIn() { + ORM::forTable('widget')->whereIn('name', array('Fred', 'Joe'))->findMany(); + $expected = "SELECT * FROM `widget` WHERE `name` IN ('Fred', 'Joe')"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testWhereNotIn() { + ORM::forTable('widget')->whereNotIn('name', array('Fred', 'Joe'))->findMany(); + $expected = "SELECT * FROM `widget` WHERE `name` NOT IN ('Fred', 'Joe')"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testLimit() { + ORM::forTable('widget')->limit(5)->findMany(); + $expected = "SELECT * FROM `widget` LIMIT 5"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testLimitAndOffset() { + ORM::forTable('widget')->limit(5)->offset(5)->findMany(); + $expected = "SELECT * FROM `widget` LIMIT 5 OFFSET 5"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testOrderByDesc() { + ORM::forTable('widget')->orderByDesc('name')->findOne(); + $expected = "SELECT * FROM `widget` ORDER BY `name` DESC LIMIT 1"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testOrderByAsc() { + ORM::forTable('widget')->orderByAsc('name')->findOne(); + $expected = "SELECT * FROM `widget` ORDER BY `name` ASC LIMIT 1"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testOrderByExpression() { + ORM::forTable('widget')->orderByExpr('SOUNDEX(`name`)')->findOne(); + $expected = "SELECT * FROM `widget` ORDER BY SOUNDEX(`name`) LIMIT 1"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testMultipleOrderBy() { + ORM::forTable('widget')->orderByAsc('name')->orderByDesc('age')->findOne(); + $expected = "SELECT * FROM `widget` ORDER BY `name` ASC, `age` DESC LIMIT 1"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testGroupBy() { + ORM::forTable('widget')->groupBy('name')->findMany(); + $expected = "SELECT * FROM `widget` GROUP BY `name`"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testMultipleGroupBy() { + ORM::forTable('widget')->groupBy('name')->groupBy('age')->findMany(); + $expected = "SELECT * FROM `widget` GROUP BY `name`, `age`"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testGroupByExpression() { + ORM::forTable('widget')->groupByExpr("FROM_UNIXTIME(`time`, '%Y-%m')")->findMany(); + $expected = "SELECT * FROM `widget` GROUP BY FROM_UNIXTIME(`time`, '%Y-%m')"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testHaving() { + ORM::forTable('widget')->groupBy('name')->having('name', 'Fred')->findOne(); + $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` = 'Fred' LIMIT 1"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testMultipleHaving() { + ORM::forTable('widget')->groupBy('name')->having('name', 'Fred')->having('age', 10)->findOne(); + $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` = 'Fred' AND `age` = '10' LIMIT 1"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testHavingNotEqual() { + ORM::forTable('widget')->groupBy('name')->havingNotEqual('name', 'Fred')->findMany(); + $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` != 'Fred'"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testHavingLike() { + ORM::forTable('widget')->groupBy('name')->havingLike('name', '%Fred%')->findOne(); + $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` LIKE '%Fred%' LIMIT 1"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testHavingNotLike() { + ORM::forTable('widget')->groupBy('name')->havingNotLike('name', '%Fred%')->findOne(); + $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` NOT LIKE '%Fred%' LIMIT 1"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testHavingIn() { + ORM::forTable('widget')->groupBy('name')->havingIn('name', array('Fred', 'Joe'))->findMany(); + $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` IN ('Fred', 'Joe')"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testHavingNotIn() { + ORM::forTable('widget')->groupBy('name')->havingNotIn('name', array('Fred', 'Joe'))->findMany(); + $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` NOT IN ('Fred', 'Joe')"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testHavingLessThan() { + ORM::forTable('widget')->groupBy('name')->havingLt('age', 10)->havingGt('age', 5)->findMany(); + $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `age` < '10' AND `age` > '5'"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testHavingLessThanOrEqualAndGreaterThanOrEqual() { + ORM::forTable('widget')->groupBy('name')->havingLte('age', 10)->havingGte('age', 5)->findMany(); + $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `age` <= '10' AND `age` >= '5'"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testHavingNull() { + ORM::forTable('widget')->groupBy('name')->havingNull('name')->findMany(); + $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` IS NULL"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testHavingNotNull() { + ORM::forTable('widget')->groupBy('name')->havingNotNull('name')->findMany(); + $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` IS NOT NULL"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testRawHaving() { + ORM::forTable('widget')->groupBy('name')->havingRaw('`name` = ? AND (`age` = ? OR `age` = ?)', array('Fred', 5, 10))->findMany(); + $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` = 'Fred' AND (`age` = '5' OR `age` = '10')"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testComplexQuery() { + ORM::forTable('widget')->where('name', 'Fred')->limit(5)->offset(5)->orderByAsc('name')->findMany(); + $expected = "SELECT * FROM `widget` WHERE `name` = 'Fred' ORDER BY `name` ASC LIMIT 5 OFFSET 5"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testWhereLessThanAndGreaterThan() { + ORM::forTable('widget')->whereLt('age', 10)->whereGt('age', 5)->findMany(); + $expected = "SELECT * FROM `widget` WHERE `age` < '10' AND `age` > '5'"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testWhereLessThanAndEqualAndGreaterThanAndEqual() { + ORM::forTable('widget')->whereLte('age', 10)->whereGte('age', 5)->findMany(); + $expected = "SELECT * FROM `widget` WHERE `age` <= '10' AND `age` >= '5'"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testWhereNull() { + ORM::forTable('widget')->whereNull('name')->findMany(); + $expected = "SELECT * FROM `widget` WHERE `name` IS NULL"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testWhereNotNull() { + ORM::forTable('widget')->whereNotNull('name')->findMany(); + $expected = "SELECT * FROM `widget` WHERE `name` IS NOT NULL"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testRawWhereClause() { + ORM::forTable('widget')->whereRaw('`name` = ? AND (`age` = ? OR `age` = ?)', array('Fred', 5, 10))->findMany(); + $expected = "SELECT * FROM `widget` WHERE `name` = 'Fred' AND (`age` = '5' OR `age` = '10')"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testRawWhereClauseWithPercentSign() { + ORM::forTable('widget')->whereRaw('STRFTIME("%Y", "now") = ?', array(2012))->findMany(); + $expected = "SELECT * FROM `widget` WHERE STRFTIME(\"%Y\", \"now\") = '2012'"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testRawWhereClauseWithNoParameters() { + ORM::forTable('widget')->whereRaw('`name` = "Fred"')->findMany(); + $expected = "SELECT * FROM `widget` WHERE `name` = \"Fred\""; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testRawWhereClauseInMethodChain() { + ORM::forTable('widget')->where('age', 18)->whereRaw('(`name` = ? OR `name` = ?)', array('Fred', 'Bob'))->where('size', 'large')->findMany(); + $expected = "SELECT * FROM `widget` WHERE `age` = '18' AND (`name` = 'Fred' OR `name` = 'Bob') AND `size` = 'large'"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testRawQuery() { + ORM::forTable('widget')->rawQuery('SELECT `w`.* FROM `widget` w')->findMany(); + $expected = "SELECT `w`.* FROM `widget` w"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testRawQueryWithParameters() { + ORM::forTable('widget')->rawQuery('SELECT `w`.* FROM `widget` w WHERE `name` = ? AND `age` = ?', array('Fred', 5))->findMany(); + $expected = "SELECT `w`.* FROM `widget` w WHERE `name` = 'Fred' AND `age` = '5'"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testRawQueryWithNamedPlaceholders() { + ORM::forTable('widget')->rawQuery('SELECT `w`.* FROM `widget` w WHERE `name` = :name AND `age` = :age', array(':name' => 'Fred', ':age' => 5))->findMany(); + $expected = "SELECT `w`.* FROM `widget` w WHERE `name` = 'Fred' AND `age` = '5'"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testSimpleResultColumn() { + ORM::forTable('widget')->select('name')->findMany(); + $expected = "SELECT `name` FROM `widget`"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testMultipleSimpleResultColumns() { + ORM::forTable('widget')->select('name')->select('age')->findMany(); + $expected = "SELECT `name`, `age` FROM `widget`"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testSpecifyTableNameAndColumnInResultColumns() { + ORM::forTable('widget')->select('widget.name')->findMany(); + $expected = "SELECT `widget`.`name` FROM `widget`"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testMainTableAlias() { + ORM::forTable('widget')->tableAlias('w')->findMany(); + $expected = "SELECT * FROM `widget` `w`"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testAliasesInResultColumns() { + ORM::forTable('widget')->select('widget.name', 'widget_name')->findMany(); + $expected = "SELECT `widget`.`name` AS `widget_name` FROM `widget`"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testAliasesInSelectManyResults() { + ORM::forTable('widget')->selectMany(array('widget_name' => 'widget.name'), 'widget_handle')->findMany(); + $expected = "SELECT `widget`.`name` AS `widget_name`, `widget_handle` FROM `widget`"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testLiteralExpressionInResultColumn() { + ORM::forTable('widget')->selectExpr('COUNT(*)', 'count')->findMany(); + $expected = "SELECT COUNT(*) AS `count` FROM `widget`"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testLiteralExpressionInSelectManyResultColumns() { + ORM::forTable('widget')->selectManyExpr(array('count' => 'COUNT(*)'), 'SUM(widget_order)')->findMany(); + $expected = "SELECT COUNT(*) AS `count`, SUM(widget_order) FROM `widget`"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testSimpleJoin() { + ORM::forTable('widget')->join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->findMany(); + $expected = "SELECT * FROM `widget` JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testSimpleJoinWithWhereIdIsMethod() { + ORM::forTable('widget')->join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->findOne(5); + $expected = "SELECT * FROM `widget` JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id` WHERE `widget`.`id` = '5' LIMIT 1"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testInnerJoin() { + ORM::forTable('widget')->innerJoin('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->findMany(); + $expected = "SELECT * FROM `widget` INNER JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testLeftOuterJoin() { + ORM::forTable('widget')->leftOuterJoin('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->findMany(); + $expected = "SELECT * FROM `widget` LEFT OUTER JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testRightOuterJoin() { + ORM::forTable('widget')->rightOuterJoin('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->findMany(); + $expected = "SELECT * FROM `widget` RIGHT OUTER JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testFullOuterJoin() { + ORM::forTable('widget')->fullOuterJoin('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->findMany(); + $expected = "SELECT * FROM `widget` FULL OUTER JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testMultipleJoinSources() { + ORM::forTable('widget') + ->join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id')) + ->join('widget_nozzle', array('widget_nozzle.widget_id', '=', 'widget.id')) + ->findMany(); + $expected = "SELECT * FROM `widget` JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id` JOIN `widget_nozzle` ON `widget_nozzle`.`widget_id` = `widget`.`id`"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testJoinWithAliases() { + ORM::forTable('widget')->join('widget_handle', array('wh.widget_id', '=', 'widget.id'), 'wh')->findMany(); + $expected = "SELECT * FROM `widget` JOIN `widget_handle` `wh` ON `wh`.`widget_id` = `widget`.`id`"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testJoinWithAliasesAndWhere() { + ORM::forTable('widget')->tableAlias('w')->join('widget_handle', array('wh.widget_id', '=', 'w.id'), 'wh')->whereEqual('id', 1)->findMany(); + $expected = "SELECT * FROM `widget` `w` JOIN `widget_handle` `wh` ON `wh`.`widget_id` = `w`.`id` WHERE `w`.`id` = '1'"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testJoinWithStringConstraint() { + ORM::forTable('widget')->join('widget_handle', "widget_handle.widget_id = widget.id")->findMany(); + $expected = "SELECT * FROM `widget` JOIN `widget_handle` ON widget_handle.widget_id = widget.id"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testRawJoin() { + ORM::forTable('widget')->rawJoin('INNER JOIN ( SELECT * FROM `widget_handle` )', array('widget_handle.widget_id', '=', 'widget.id'), 'widget_handle')->findMany(); + $expected = "SELECT * FROM `widget` INNER JOIN ( SELECT * FROM `widget_handle` ) `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testRawJoinWithParameters() { + ORM::forTable('widget')->rawJoin('INNER JOIN ( SELECT * FROM `widget_handle` WHERE `widget_handle`.name LIKE ? AND `widget_handle`.category = ?)', array('widget_handle.widget_id', '=', 'widget.id'), 'widget_handle', array('%button%', 2))->findMany(); + $expected = "SELECT * FROM `widget` INNER JOIN ( SELECT * FROM `widget_handle` WHERE `widget_handle`.name LIKE '%button%' AND `widget_handle`.category = '2') `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testRawJoinAndRawWhereWithParameters() { + ORM::forTable('widget') + ->rawJoin('INNER JOIN ( SELECT * FROM `widget_handle` WHERE `widget_handle`.name LIKE ? AND `widget_handle`.category = ?)', array('widget_handle.widget_id', '=', 'widget.id'), 'widget_handle', array('%button%', 2)) + ->rawJoin('INNER JOIN ( SELECT * FROM `person` WHERE `person`.name LIKE ?)', array('person.id', '=', 'widget.person_id'), 'person', array('%Fred%')) + ->whereRaw('`id` > ? AND `id` < ?', array(5, 10)) + ->findMany(); + $expected = "SELECT * FROM `widget` INNER JOIN ( SELECT * FROM `widget_handle` WHERE `widget_handle`.name LIKE '%button%' AND `widget_handle`.category = '2') `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id` INNER JOIN ( SELECT * FROM `person` WHERE `person`.name LIKE '%Fred%') `person` ON `person`.`id` = `widget`.`person_id` WHERE `id` > '5' AND `id` < '10'"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testSelectWithDistinct() { + ORM::forTable('widget')->distinct()->select('name')->findMany(); + $expected = "SELECT DISTINCT `name` FROM `widget`"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testInsertData() { + $widget = ORM::forTable('widget')->create(); + $widget->name = "Fred"; + $widget->age = 10; + $widget->save(); + $expected = "INSERT INTO `widget` (`name`, `age`) VALUES ('Fred', '10')"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testInsertDataContainingAnExpression() { + $widget = ORM::forTable('widget')->create(); + $widget->name = "Fred"; + $widget->age = 10; + $widget->setExpr('added', 'NOW()'); + $widget->save(); + $expected = "INSERT INTO `widget` (`name`, `age`, `added`) VALUES ('Fred', '10', NOW())"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testInsertDataUsingArrayAccess() { + $widget = ORM::forTable('widget')->create(); + $widget['name'] = "Fred"; + $widget['age'] = 10; + $widget->save(); + $expected = "INSERT INTO `widget` (`name`, `age`) VALUES ('Fred', '10')"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testUpdateData() { + $widget = ORM::forTable('widget')->findOne(1); + $widget->name = "Fred"; + $widget->age = 10; + $widget->save(); + $expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10' WHERE `id` = '1'"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testUpdateDataContainingAnExpression() { + $widget = ORM::forTable('widget')->findOne(1); + $widget->name = "Fred"; + $widget->age = 10; + $widget->setExpr('added', 'NOW()'); + $widget->save(); + $expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10', `added` = NOW() WHERE `id` = '1'"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testUpdateMultipleFields() { + $widget = ORM::forTable('widget')->findOne(1); + $widget->set(array("name" => "Fred", "age" => 10)); + $widget->save(); + $expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10' WHERE `id` = '1'"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testUpdateMultipleFieldsContainingAnExpression() { + $widget = ORM::forTable('widget')->findOne(1); + $widget->set(array("name" => "Fred", "age" => 10)); + $widget->setExpr(array("added" => "NOW()", "lat_long" => "GeomFromText('POINT(1.2347 2.3436)')")); + $widget->save(); + $expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10', `added` = NOW(), `lat_long` = GeomFromText('POINT(1.2347 2.3436)') WHERE `id` = '1'"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testUpdateMultipleFieldsContainingAnExpressionAndOverridePreviouslySetExpression() { + $widget = ORM::forTable('widget')->findOne(1); + $widget->set(array("name" => "Fred", "age" => 10)); + $widget->setExpr(array("added" => "NOW()", "lat_long" => "GeomFromText('POINT(1.2347 2.3436)')")); + $widget->lat_long = 'unknown'; + $widget->save(); + $expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10', `added` = NOW(), `lat_long` = 'unknown' WHERE `id` = '1'"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testDeleteData() { + $widget = ORM::forTable('widget')->findOne(1); + $widget->delete(); + $expected = "DELETE FROM `widget` WHERE `id` = '1'"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testDeleteMany() { + ORM::forTable('widget')->whereEqual('age', 10)->delete_many(); + $expected = "DELETE FROM `widget` WHERE `age` = '10'"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testCount() { + ORM::forTable('widget')->count(); + $expected = "SELECT COUNT(*) AS `count` FROM `widget` LIMIT 1"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testIgnoreSelectAndCount() { + ORM::forTable('widget')->select('test')->count(); + $expected = "SELECT COUNT(*) AS `count` FROM `widget` LIMIT 1"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testMax() { + ORM::forTable('person')->max('height'); + $expected = "SELECT MAX(`height`) AS `max` FROM `person` LIMIT 1"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testMin() { + ORM::forTable('person')->min('height'); + $expected = "SELECT MIN(`height`) AS `min` FROM `person` LIMIT 1"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testAvg() { + ORM::forTable('person')->avg('height'); + $expected = "SELECT AVG(`height`) AS `avg` FROM `person` LIMIT 1"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testSum() { + ORM::forTable('person')->sum('height'); + $expected = "SELECT SUM(`height`) AS `sum` FROM `person` LIMIT 1"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + /** + * Regression tests + */ + public function testIssue12IncorrectQuotingOfColumnWildcard() { + ORM::forTable('widget')->select('widget.*')->findOne(); + $expected = "SELECT `widget`.* FROM `widget` LIMIT 1"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testIssue57LogQueryRaisesWarningWhenPercentSymbolSupplied() { + ORM::forTable('widget')->whereRaw('username LIKE "ben%"')->findMany(); + $expected = 'SELECT * FROM `widget` WHERE username LIKE "ben%"'; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testIssue57LogQueryRaisesWarningWhenQuestionMarkSupplied() { + ORM::forTable('widget')->whereRaw('comments LIKE "has been released?%"')->findMany(); + $expected = 'SELECT * FROM `widget` WHERE comments LIKE "has been released?%"'; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testIssue74EscapingQuoteMarksIn_quote_identifier_part() { + $widget = ORM::forTable('widget')->findOne(1); + $widget->set('ad`ded', '2013-01-04'); + $widget->save(); + $expected = "UPDATE `widget` SET `ad``ded` = '2013-01-04' WHERE `id` = '1'"; + $this->assertEquals($expected, ORM::getLastQuery()); + } + + public function testIssue90UsingSetExprAloneDoesTriggerQueryGeneration() { + $widget = ORM::forTable('widget')->findOne(1); + $widget->setExpr('added', 'NOW()'); + $widget->save(); + $expected = "UPDATE `widget` SET `added` = NOW() WHERE `id` = '1'"; + $this->assertEquals($expected, ORM::getLastQuery()); + } +} + diff --git a/vendor/j4mie/idiorm/test/QueryBuilderTest.php b/vendor/j4mie/idiorm/test/QueryBuilderTest.php new file mode 100644 index 000000000..bbd5831f8 --- /dev/null +++ b/vendor/j4mie/idiorm/test/QueryBuilderTest.php @@ -0,0 +1,696 @@ +find_many(); + $expected = "SELECT * FROM `widget`"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testFindOne() { + ORM::for_table('widget')->find_one(); + $expected = "SELECT * FROM `widget` LIMIT 1"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testFindOneWithPrimaryKeyFilter() { + ORM::for_table('widget')->find_one(5); + $expected = "SELECT * FROM `widget` WHERE `id` = '5' LIMIT 1"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testWhereIdIs() { + ORM::for_table('widget')->where_id_is(5)->find_one(); + $expected = "SELECT * FROM `widget` WHERE `id` = '5' LIMIT 1"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testWhereIdIn() { + ORM::for_table('widget')->where_id_in(array(4, 5))->find_many(); + $expected = "SELECT * FROM `widget` WHERE `id` IN ('4', '5')"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testSingleWhereClause() { + ORM::for_table('widget')->where('name', 'Fred')->find_one(); + $expected = "SELECT * FROM `widget` WHERE `name` = 'Fred' LIMIT 1"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testMultipleWhereClauses() { + ORM::for_table('widget')->where('name', 'Fred')->where('age', 10)->find_one(); + $expected = "SELECT * FROM `widget` WHERE `name` = 'Fred' AND `age` = '10' LIMIT 1"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testWhereNotEqual() { + ORM::for_table('widget')->where_not_equal('name', 'Fred')->find_many(); + $expected = "SELECT * FROM `widget` WHERE `name` != 'Fred'"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testWhereLike() { + ORM::for_table('widget')->where_like('name', '%Fred%')->find_one(); + $expected = "SELECT * FROM `widget` WHERE `name` LIKE '%Fred%' LIMIT 1"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testWhereNotLike() { + ORM::for_table('widget')->where_not_like('name', '%Fred%')->find_one(); + $expected = "SELECT * FROM `widget` WHERE `name` NOT LIKE '%Fred%' LIMIT 1"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testWhereIn() { + ORM::for_table('widget')->where_in('name', array('Fred', 'Joe'))->find_many(); + $expected = "SELECT * FROM `widget` WHERE `name` IN ('Fred', 'Joe')"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testWhereNotIn() { + ORM::for_table('widget')->where_not_in('name', array('Fred', 'Joe'))->find_many(); + $expected = "SELECT * FROM `widget` WHERE `name` NOT IN ('Fred', 'Joe')"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testWhereAnyIs() { + ORM::for_table('widget')->where_any_is(array( + array('name' => 'Joe', 'age' => 10), + array('name' => 'Fred', 'age' => 20)))->find_many(); + $expected = "SELECT * FROM `widget` WHERE (( `name` = 'Joe' AND `age` = '10' ) OR ( `name` = 'Fred' AND `age` = '20' ))"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testWhereAnyIsOverrideOneColumn() { + ORM::for_table('widget')->where_any_is(array( + array('name' => 'Joe', 'age' => 10), + array('name' => 'Fred', 'age' => 20)), array('age' => '>'))->find_many(); + $expected = "SELECT * FROM `widget` WHERE (( `name` = 'Joe' AND `age` > '10' ) OR ( `name` = 'Fred' AND `age` > '20' ))"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testWhereAnyIsOverrideAllOperators() { + ORM::for_table('widget')->where_any_is(array( + array('score' => '5', 'age' => 10), + array('score' => '15', 'age' => 20)), '>')->find_many(); + $expected = "SELECT * FROM `widget` WHERE (( `score` > '5' AND `age` > '10' ) OR ( `score` > '15' AND `age` > '20' ))"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testLimit() { + ORM::for_table('widget')->limit(5)->find_many(); + $expected = "SELECT * FROM `widget` LIMIT 5"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testLimitAndOffset() { + ORM::for_table('widget')->limit(5)->offset(5)->find_many(); + $expected = "SELECT * FROM `widget` LIMIT 5 OFFSET 5"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testOrderByDesc() { + ORM::for_table('widget')->order_by_desc('name')->find_one(); + $expected = "SELECT * FROM `widget` ORDER BY `name` DESC LIMIT 1"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testOrderByAsc() { + ORM::for_table('widget')->order_by_asc('name')->find_one(); + $expected = "SELECT * FROM `widget` ORDER BY `name` ASC LIMIT 1"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testOrderByExpression() { + ORM::for_table('widget')->order_by_expr('SOUNDEX(`name`)')->find_one(); + $expected = "SELECT * FROM `widget` ORDER BY SOUNDEX(`name`) LIMIT 1"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testMultipleOrderBy() { + ORM::for_table('widget')->order_by_asc('name')->order_by_desc('age')->find_one(); + $expected = "SELECT * FROM `widget` ORDER BY `name` ASC, `age` DESC LIMIT 1"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testGroupBy() { + ORM::for_table('widget')->group_by('name')->find_many(); + $expected = "SELECT * FROM `widget` GROUP BY `name`"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testMultipleGroupBy() { + ORM::for_table('widget')->group_by('name')->group_by('age')->find_many(); + $expected = "SELECT * FROM `widget` GROUP BY `name`, `age`"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testGroupByExpression() { + ORM::for_table('widget')->group_by_expr("FROM_UNIXTIME(`time`, '%Y-%m')")->find_many(); + $expected = "SELECT * FROM `widget` GROUP BY FROM_UNIXTIME(`time`, '%Y-%m')"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testHaving() { + ORM::for_table('widget')->group_by('name')->having('name', 'Fred')->find_one(); + $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` = 'Fred' LIMIT 1"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testMultipleHaving() { + ORM::for_table('widget')->group_by('name')->having('name', 'Fred')->having('age', 10)->find_one(); + $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` = 'Fred' AND `age` = '10' LIMIT 1"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testHavingNotEqual() { + ORM::for_table('widget')->group_by('name')->having_not_equal('name', 'Fred')->find_many(); + $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` != 'Fred'"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testHavingLike() { + ORM::for_table('widget')->group_by('name')->having_like('name', '%Fred%')->find_one(); + $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` LIKE '%Fred%' LIMIT 1"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testHavingNotLike() { + ORM::for_table('widget')->group_by('name')->having_not_like('name', '%Fred%')->find_one(); + $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` NOT LIKE '%Fred%' LIMIT 1"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testHavingIn() { + ORM::for_table('widget')->group_by('name')->having_in('name', array('Fred', 'Joe'))->find_many(); + $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` IN ('Fred', 'Joe')"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testHavingNotIn() { + ORM::for_table('widget')->group_by('name')->having_not_in('name', array('Fred', 'Joe'))->find_many(); + $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` NOT IN ('Fred', 'Joe')"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testHavingLessThan() { + ORM::for_table('widget')->group_by('name')->having_lt('age', 10)->having_gt('age', 5)->find_many(); + $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `age` < '10' AND `age` > '5'"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testHavingLessThanOrEqualAndGreaterThanOrEqual() { + ORM::for_table('widget')->group_by('name')->having_lte('age', 10)->having_gte('age', 5)->find_many(); + $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `age` <= '10' AND `age` >= '5'"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testHavingNull() { + ORM::for_table('widget')->group_by('name')->having_null('name')->find_many(); + $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` IS NULL"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testHavingNotNull() { + ORM::for_table('widget')->group_by('name')->having_not_null('name')->find_many(); + $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` IS NOT NULL"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testRawHaving() { + ORM::for_table('widget')->group_by('name')->having_raw('`name` = ? AND (`age` = ? OR `age` = ?)', array('Fred', 5, 10))->find_many(); + $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` = 'Fred' AND (`age` = '5' OR `age` = '10')"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testComplexQuery() { + ORM::for_table('widget')->where('name', 'Fred')->limit(5)->offset(5)->order_by_asc('name')->find_many(); + $expected = "SELECT * FROM `widget` WHERE `name` = 'Fred' ORDER BY `name` ASC LIMIT 5 OFFSET 5"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testWhereLessThanAndGreaterThan() { + ORM::for_table('widget')->where_lt('age', 10)->where_gt('age', 5)->find_many(); + $expected = "SELECT * FROM `widget` WHERE `age` < '10' AND `age` > '5'"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testWhereLessThanAndEqualAndGreaterThanAndEqual() { + ORM::for_table('widget')->where_lte('age', 10)->where_gte('age', 5)->find_many(); + $expected = "SELECT * FROM `widget` WHERE `age` <= '10' AND `age` >= '5'"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testWhereNull() { + ORM::for_table('widget')->where_null('name')->find_many(); + $expected = "SELECT * FROM `widget` WHERE `name` IS NULL"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testWhereNotNull() { + ORM::for_table('widget')->where_not_null('name')->find_many(); + $expected = "SELECT * FROM `widget` WHERE `name` IS NOT NULL"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testRawWhereClause() { + ORM::for_table('widget')->where_raw('`name` = ? AND (`age` = ? OR `age` = ?)', array('Fred', 5, 10))->find_many(); + $expected = "SELECT * FROM `widget` WHERE `name` = 'Fred' AND (`age` = '5' OR `age` = '10')"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testRawWhereClauseWithPercentSign() { + ORM::for_table('widget')->where_raw('STRFTIME("%Y", "now") = ?', array(2012))->find_many(); + $expected = "SELECT * FROM `widget` WHERE STRFTIME(\"%Y\", \"now\") = '2012'"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testRawWhereClauseWithNoParameters() { + ORM::for_table('widget')->where_raw('`name` = "Fred"')->find_many(); + $expected = "SELECT * FROM `widget` WHERE `name` = \"Fred\""; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testRawWhereClauseInMethodChain() { + ORM::for_table('widget')->where('age', 18)->where_raw('(`name` = ? OR `name` = ?)', array('Fred', 'Bob'))->where('size', 'large')->find_many(); + $expected = "SELECT * FROM `widget` WHERE `age` = '18' AND (`name` = 'Fred' OR `name` = 'Bob') AND `size` = 'large'"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testRawWhereClauseMultiples() { + ORM::for_table('widget')->where('age', 18)->where_raw('(`name` = ? OR `name` = ?)', array('Fred', 'Bob'))->where_raw('(`name` = ? OR `name` = ?)', array('Sarah', 'Jane'))->where('size', 'large')->find_many(); + $expected = "SELECT * FROM `widget` WHERE `age` = '18' AND (`name` = 'Fred' OR `name` = 'Bob') AND (`name` = 'Sarah' OR `name` = 'Jane') AND `size` = 'large'"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testRawQuery() { + ORM::for_table('widget')->raw_query('SELECT `w`.* FROM `widget` w')->find_many(); + $expected = "SELECT `w`.* FROM `widget` w"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testRawQueryWithParameters() { + ORM::for_table('widget')->raw_query('SELECT `w`.* FROM `widget` w WHERE `name` = ? AND `age` = ?', array('Fred', 5))->find_many(); + $expected = "SELECT `w`.* FROM `widget` w WHERE `name` = 'Fred' AND `age` = '5'"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testRawQueryWithNamedPlaceholders() { + ORM::for_table('widget')->raw_query('SELECT `w`.* FROM `widget` w WHERE `name` = :name AND `age` = :age', array(':name' => 'Fred', ':age' => 5))->find_many(); + $expected = "SELECT `w`.* FROM `widget` w WHERE `name` = 'Fred' AND `age` = '5'"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testSimpleResultColumn() { + ORM::for_table('widget')->select('name')->find_many(); + $expected = "SELECT `name` FROM `widget`"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testMultipleSimpleResultColumns() { + ORM::for_table('widget')->select('name')->select('age')->find_many(); + $expected = "SELECT `name`, `age` FROM `widget`"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testSpecifyTableNameAndColumnInResultColumns() { + ORM::for_table('widget')->select('widget.name')->find_many(); + $expected = "SELECT `widget`.`name` FROM `widget`"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testMainTableAlias() { + ORM::for_table('widget')->table_alias('w')->find_many(); + $expected = "SELECT * FROM `widget` `w`"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testAliasesInResultColumns() { + ORM::for_table('widget')->select('widget.name', 'widget_name')->find_many(); + $expected = "SELECT `widget`.`name` AS `widget_name` FROM `widget`"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testAliasesInSelectManyResults() { + ORM::for_table('widget')->select_many(array('widget_name' => 'widget.name'), 'widget_handle')->find_many(); + $expected = "SELECT `widget`.`name` AS `widget_name`, `widget_handle` FROM `widget`"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testLiteralExpressionInResultColumn() { + ORM::for_table('widget')->select_expr('COUNT(*)', 'count')->find_many(); + $expected = "SELECT COUNT(*) AS `count` FROM `widget`"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testLiteralExpressionInSelectManyResultColumns() { + ORM::for_table('widget')->select_many_expr(array('count' => 'COUNT(*)'), 'SUM(widget_order)')->find_many(); + $expected = "SELECT COUNT(*) AS `count`, SUM(widget_order) FROM `widget`"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testSimpleJoin() { + ORM::for_table('widget')->join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->find_many(); + $expected = "SELECT * FROM `widget` JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testSimpleJoinWithWhereIdIsMethod() { + ORM::for_table('widget')->join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->find_one(5); + $expected = "SELECT * FROM `widget` JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id` WHERE `widget`.`id` = '5' LIMIT 1"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testInnerJoin() { + ORM::for_table('widget')->inner_join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->find_many(); + $expected = "SELECT * FROM `widget` INNER JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testLeftOuterJoin() { + ORM::for_table('widget')->left_outer_join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->find_many(); + $expected = "SELECT * FROM `widget` LEFT OUTER JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testRightOuterJoin() { + ORM::for_table('widget')->right_outer_join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->find_many(); + $expected = "SELECT * FROM `widget` RIGHT OUTER JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testFullOuterJoin() { + ORM::for_table('widget')->full_outer_join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->find_many(); + $expected = "SELECT * FROM `widget` FULL OUTER JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testMultipleJoinSources() { + ORM::for_table('widget') + ->join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id')) + ->join('widget_nozzle', array('widget_nozzle.widget_id', '=', 'widget.id')) + ->find_many(); + $expected = "SELECT * FROM `widget` JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id` JOIN `widget_nozzle` ON `widget_nozzle`.`widget_id` = `widget`.`id`"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testJoinWithAliases() { + ORM::for_table('widget')->join('widget_handle', array('wh.widget_id', '=', 'widget.id'), 'wh')->find_many(); + $expected = "SELECT * FROM `widget` JOIN `widget_handle` `wh` ON `wh`.`widget_id` = `widget`.`id`"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testJoinWithAliasesAndWhere() { + ORM::for_table('widget')->table_alias('w')->join('widget_handle', array('wh.widget_id', '=', 'w.id'), 'wh')->where_equal('id', 1)->find_many(); + $expected = "SELECT * FROM `widget` `w` JOIN `widget_handle` `wh` ON `wh`.`widget_id` = `w`.`id` WHERE `w`.`id` = '1'"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testJoinWithStringConstraint() { + ORM::for_table('widget')->join('widget_handle', "widget_handle.widget_id = widget.id")->find_many(); + $expected = "SELECT * FROM `widget` JOIN `widget_handle` ON widget_handle.widget_id = widget.id"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testRawJoin() { + ORM::for_table('widget')->raw_join('INNER JOIN ( SELECT * FROM `widget_handle` )', array('widget_handle.widget_id', '=', 'widget.id'), 'widget_handle')->find_many(); + $expected = "SELECT * FROM `widget` INNER JOIN ( SELECT * FROM `widget_handle` ) `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testRawJoinWithParameters() { + ORM::for_table('widget')->raw_join('INNER JOIN ( SELECT * FROM `widget_handle` WHERE `widget_handle`.name LIKE ? AND `widget_handle`.category = ?)', array('widget_handle.widget_id', '=', 'widget.id'), 'widget_handle', array('%button%', 2))->find_many(); + $expected = "SELECT * FROM `widget` INNER JOIN ( SELECT * FROM `widget_handle` WHERE `widget_handle`.name LIKE '%button%' AND `widget_handle`.category = '2') `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testRawJoinAndRawWhereWithParameters() { + ORM::for_table('widget') + ->raw_join('INNER JOIN ( SELECT * FROM `widget_handle` WHERE `widget_handle`.name LIKE ? AND `widget_handle`.category = ?)', array('widget_handle.widget_id', '=', 'widget.id'), 'widget_handle', array('%button%', 2)) + ->raw_join('INNER JOIN ( SELECT * FROM `person` WHERE `person`.name LIKE ?)', array('person.id', '=', 'widget.person_id'), 'person', array('%Fred%')) + ->where_raw('`id` > ? AND `id` < ?', array(5, 10)) + ->find_many(); + $expected = "SELECT * FROM `widget` INNER JOIN ( SELECT * FROM `widget_handle` WHERE `widget_handle`.name LIKE '%button%' AND `widget_handle`.category = '2') `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id` INNER JOIN ( SELECT * FROM `person` WHERE `person`.name LIKE '%Fred%') `person` ON `person`.`id` = `widget`.`person_id` WHERE `id` > '5' AND `id` < '10'"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testSelectWithDistinct() { + ORM::for_table('widget')->distinct()->select('name')->find_many(); + $expected = "SELECT DISTINCT `name` FROM `widget`"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testInsertData() { + $widget = ORM::for_table('widget')->create(); + $widget->name = "Fred"; + $widget->age = 10; + $widget->save(); + $expected = "INSERT INTO `widget` (`name`, `age`) VALUES ('Fred', '10')"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testInsertDataContainingAnExpression() { + $widget = ORM::for_table('widget')->create(); + $widget->name = "Fred"; + $widget->age = 10; + $widget->set_expr('added', 'NOW()'); + $widget->save(); + $expected = "INSERT INTO `widget` (`name`, `age`, `added`) VALUES ('Fred', '10', NOW())"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testInsertDataUsingArrayAccess() { + $widget = ORM::for_table('widget')->create(); + $widget['name'] = "Fred"; + $widget['age'] = 10; + $widget->save(); + $expected = "INSERT INTO `widget` (`name`, `age`) VALUES ('Fred', '10')"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testUpdateData() { + $widget = ORM::for_table('widget')->find_one(1); + $widget->name = "Fred"; + $widget->age = 10; + $widget->save(); + $expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10' WHERE `id` = '1'"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testUpdateDataContainingAnExpression() { + $widget = ORM::for_table('widget')->find_one(1); + $widget->name = "Fred"; + $widget->age = 10; + $widget->set_expr('added', 'NOW()'); + $widget->save(); + $expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10', `added` = NOW() WHERE `id` = '1'"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testUpdateMultipleFields() { + $widget = ORM::for_table('widget')->find_one(1); + $widget->set(array("name" => "Fred", "age" => 10)); + $widget->save(); + $expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10' WHERE `id` = '1'"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testUpdateMultipleFieldsContainingAnExpression() { + $widget = ORM::for_table('widget')->find_one(1); + $widget->set(array("name" => "Fred", "age" => 10)); + $widget->set_expr(array("added" => "NOW()", "lat_long" => "GeomFromText('POINT(1.2347 2.3436)')")); + $widget->save(); + $expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10', `added` = NOW(), `lat_long` = GeomFromText('POINT(1.2347 2.3436)') WHERE `id` = '1'"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testUpdateMultipleFieldsContainingAnExpressionAndOverridePreviouslySetExpression() { + $widget = ORM::for_table('widget')->find_one(1); + $widget->set(array("name" => "Fred", "age" => 10)); + $widget->set_expr(array("added" => "NOW()", "lat_long" => "GeomFromText('POINT(1.2347 2.3436)')")); + $widget->lat_long = 'unknown'; + $widget->save(); + $expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10', `added` = NOW(), `lat_long` = 'unknown' WHERE `id` = '1'"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testDeleteData() { + $widget = ORM::for_table('widget')->find_one(1); + $widget->delete(); + $expected = "DELETE FROM `widget` WHERE `id` = '1'"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testDeleteMany() { + ORM::for_table('widget')->where_equal('age', 10)->delete_many(); + $expected = "DELETE FROM `widget` WHERE `age` = '10'"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testCount() { + ORM::for_table('widget')->count(); + $expected = "SELECT COUNT(*) AS `count` FROM `widget` LIMIT 1"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testIgnoreSelectAndCount() { + ORM::for_table('widget')->select('test')->count(); + $expected = "SELECT COUNT(*) AS `count` FROM `widget` LIMIT 1"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testMax() { + ORM::for_table('person')->max('height'); + $expected = "SELECT MAX(`height`) AS `max` FROM `person` LIMIT 1"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testMin() { + ORM::for_table('person')->min('height'); + $expected = "SELECT MIN(`height`) AS `min` FROM `person` LIMIT 1"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testAvg() { + ORM::for_table('person')->avg('height'); + $expected = "SELECT AVG(`height`) AS `avg` FROM `person` LIMIT 1"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testSum() { + ORM::for_table('person')->sum('height'); + $expected = "SELECT SUM(`height`) AS `sum` FROM `person` LIMIT 1"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function test_quote_identifier_part() { + $widget = ORM::for_table('widget')->find_one(1); + $widget->set('added', '2013-01-04'); + $widget->save(); + $expected = "UPDATE `widget` SET `added` = '2013-01-04' WHERE `id` = '1'"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function test_quote_multiple_identifiers_part() { + $record = ORM::for_table('widget')->use_id_column(array('id1', 'id2'))->create(); + $expected = "`id1`, `id2`"; + $this->assertEquals($expected, $record->_quote_identifier($record->_get_id_column_name())); + } + + /** + * Compound primary key tests + */ + public function testFindOneWithCompoundPrimaryKey() { + $record = ORM::for_table('widget')->use_id_column(array('id1', 'id2')); + $record->findOne(array('id1' => 10, 'name' => 'Joe', 'id2' => 20)); + $expected = "SELECT * FROM `widget` WHERE `id1` = '10' AND `id2` = '20' LIMIT 1"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testInsertWithCompoundPrimaryKey() { + $record = ORM::for_table('widget')->use_id_column(array('id1', 'id2'))->create(); + $record->set('id1', 10); + $record->set('id2', 20); + $record->set('name', 'Joe'); + $record->save(); + $expected = "INSERT INTO `widget` (`id1`, `id2`, `name`) VALUES ('10', '20', 'Joe')"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testUpdateWithCompoundPrimaryKey() { + $record = ORM::for_table('widget')->use_id_column(array('id1', 'id2'))->create(); + $record->set('id1', 10); + $record->set('id2', 20); + $record->set('name', 'Joe'); + $record->save(); + $record->set('name', 'John'); + $record->save(); + $expected = "UPDATE `widget` SET `name` = 'John' WHERE `id1` = '10' AND `id2` = '20'"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testDeleteWithCompoundPrimaryKey() { + $record = ORM::for_table('widget')->use_id_column(array('id1', 'id2'))->create(); + $record->set('id1', 10); + $record->set('id2', 20); + $record->set('name', 'Joe'); + $record->save(); + $record->delete(); + $expected = "DELETE FROM `widget` WHERE `id1` = '10' AND `id2` = '20'"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testWhereIdInWithCompoundPrimaryKey() { + $record = ORM::for_table('widget')->use_id_column(array('id1', 'id2')); + $record->where_id_in(array( + array('id1' => 10, 'name' => 'Joe', 'id2' => 20), + array('id1' => 20, 'name' => 'Joe', 'id2' => 30)))->find_many(); + $expected = "SELECT * FROM `widget` WHERE (( `id1` = '10' AND `id2` = '20' ) OR ( `id1` = '20' AND `id2` = '30' ))"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + /** + * Regression tests + */ + public function testIssue12IncorrectQuotingOfColumnWildcard() { + ORM::for_table('widget')->select('widget.*')->find_one(); + $expected = "SELECT `widget`.* FROM `widget` LIMIT 1"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testIssue57LogQueryRaisesWarningWhenPercentSymbolSupplied() { + ORM::for_table('widget')->where_raw('username LIKE "ben%"')->find_many(); + $expected = 'SELECT * FROM `widget` WHERE username LIKE "ben%"'; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testIssue57LogQueryRaisesWarningWhenQuestionMarkSupplied() { + ORM::for_table('widget')->where_raw('comments LIKE "has been released?%"')->find_many(); + $expected = 'SELECT * FROM `widget` WHERE comments LIKE "has been released?%"'; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testIssue74EscapingQuoteMarksIn_quote_identifier_part() { + $widget = ORM::for_table('widget')->find_one(1); + $widget->set('ad`ded', '2013-01-04'); + $widget->save(); + $expected = "UPDATE `widget` SET `ad``ded` = '2013-01-04' WHERE `id` = '1'"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testIssue90UsingSetExprAloneDoesTriggerQueryGeneration() { + $widget = ORM::for_table('widget')->find_one(1); + $widget->set_expr('added', 'NOW()'); + $widget->save(); + $expected = "UPDATE `widget` SET `added` = NOW() WHERE `id` = '1'"; + $this->assertEquals($expected, ORM::get_last_query()); + } + + public function testIssue176LimitDoesntWorkFirstTime() { + ORM::reset_config(); + ORM::reset_db(); + + ORM::configure('logging', true); + ORM::configure('connection_string', 'sqlite::memory:'); + + ORM::for_table('sqlite_master')->limit(1)->find_array(); + $expected = "SELECT * FROM `sqlite_master` LIMIT 1"; + $this->assertEquals($expected, ORM::get_last_query()); + } +} + diff --git a/vendor/j4mie/idiorm/test/bootstrap.php b/vendor/j4mie/idiorm/test/bootstrap.php new file mode 100644 index 000000000..7fa1c48b6 --- /dev/null +++ b/vendor/j4mie/idiorm/test/bootstrap.php @@ -0,0 +1,126 @@ +statement = $statement; + } + + /** + * Check that the array + */ + public function execute($params = NULL) { + $count = 0; + $m = array(); + if (is_null($params)) $params = $this->bindParams; + if (preg_match_all('/"[^"\\\\]*(?:\\?)[^"\\\\]*"|\'[^\'\\\\]*(?:\\?)[^\'\\\\]*\'|(\\?)/', $this->statement, $m, PREG_SET_ORDER)) { + $count = count($m); + for ($v = 0; $v < $count; $v++) { + if (count($m[$v]) == 1) unset($m[$v]); + } + $count = count($m); + for ($i = 0; $i < $count; $i++) { + if (!isset($params[$i])) { + ob_start(); + var_dump($m, $params); + $output = ob_get_clean(); + throw new Exception('Incorrect parameter count. Expected ' . $count . ' got ' . count($params) . ".\n" . $this->statement . "\n" . $output); + } + } + } + } + + /** + * Add data to arrays + */ + public function bindParam($paramno, &$param, $type = NULL, $maxlen = NULL, $driverdata = NULL) + { + // Do check on type + if (!is_int($type) || ($type != PDO::PARAM_STR && $type != PDO::PARAM_NULL && $type != PDO::PARAM_BOOL && $type != PDO::PARAM_INT)) + throw new Exception('Incorrect parameter type. Expected $type to be an integer.'); + + // Add param to array + $this->bindParams[is_int($paramno) ? --$paramno : $paramno] = $param; + } + + /** + * Return some dummy data + */ + public function fetch($fetch_style=PDO::FETCH_BOTH, $cursor_orientation=PDO::FETCH_ORI_NEXT, $cursor_offset=0) { + if ($this->current_row == 5) { + return false; + } else { + return array('name' => 'Fred', 'age' => 10, 'id' => ++$this->current_row); + } + } +} + +/** + * Another mock PDOStatement class, used for testing multiple connections + */ +class MockDifferentPDOStatement extends MockPDOStatement { } + +/** + * + * Mock database class implementing a subset + * of the PDO API. + * + */ +class MockPDO extends PDO { + + /** + * Return a dummy PDO statement + */ + public function prepare($statement, $driver_options=array()) { + $this->last_query = new MockPDOStatement($statement); + return $this->last_query; + } +} + +/** + * A different mock database class, for testing multiple connections + * Mock database class implementing a subset of the PDO API. + */ +class MockDifferentPDO extends MockPDO { + + /** + * Return a dummy PDO statement + */ + public function prepare($statement, $driver_options = array()) { + $this->last_query = new MockDifferentPDOStatement($statement); + return $this->last_query; + } +} + +class MockMsSqlPDO extends MockPDO { + + public $fake_driver = 'mssql'; + + /** + * If we are asking for the name of the driver, check if a fake one + * has been set. + */ + public function getAttribute($attribute) { + if ($attribute == self::ATTR_DRIVER_NAME) { + if (!is_null($this->fake_driver)) { + return $this->fake_driver; + } + } + + return parent::getAttribute($attribute); + } + +} diff --git a/vendor/j4mie/idiorm/test/docker_for_php52/Dockerfile b/vendor/j4mie/idiorm/test/docker_for_php52/Dockerfile new file mode 100644 index 000000000..f9640b66a --- /dev/null +++ b/vendor/j4mie/idiorm/test/docker_for_php52/Dockerfile @@ -0,0 +1,182 @@ +FROM ubuntu:12.04 + +# configuration mostly copied from https://github.com/kuborgh/docker-php-5.2 + +RUN mkdir /php && \ + cd /php && \ + apt-get update && \ + apt-get install -y --no-install-recommends \ + autoconf binutils build-essential bzip2 ca-certificates \ + comerr-dev cpp cpp-4.6 dpkg-dev g++ g++-4.6 gcc gcc-4.6 krb5-multidev \ + libapr1-dev libaprutil1-dev libaspell-dev libaspell15 libbz2-dev \ + libc-client2007e libc-client2007e-dev libc-dev-bin libc6-dev libcurl3 \ + libcurl4-openssl-dev libdpkg-perl libexpat1-dev libfreetype6 \ + libfreetype6-dev libgcrypt11-dev libgdbm-dev libgmp10 libgnutls-dev \ + libgnutls-openssl27 libgnutlsxx27 libgomp1 libgpg-error-dev \ + libgssapi-krb5-2 libgssrpc4 libice-dev libice6 libidn11 libidn11-dev \ + libjpeg-dev libjpeg-turbo8 libjpeg-turbo8-dev libjpeg8 libjpeg8-dev \ + libk5crypto3 libkadm5clnt-mit8 libkadm5srv-mit8 libkdb5-6 libkeyutils1 \ + libkrb5-3 libkrb5-dev libkrb5support0 libldap2-dev libltdl-dev libltdl7 \ + libmagic-dev libmagic1 libmcrypt-dev libmcrypt4 libmhash-dev libmhash2 \ + libmpc2 libmpfr4 libncurses5-dev \ + libp11-kit-dev libpam0g-dev libpcre3-dev libpcrecpp0 libpng12-dev libpopt0 \ + libpq-dev libpq5 libpspell-dev libpthread-stubs0 libpthread-stubs0-dev \ + libquadmath0 libreadline-dev libreadline6-dev librtmp-dev librtmp0 \ + libsm-dev libsm6 libsqlite3-dev libssl-dev libstdc++6-4.6-dev libt1-5 \ + libt1-dev libtasn1-3-dev libtimedate-perl libtinfo-dev libx11-6 libx11-data \ + libx11-dev libxau-dev libxau6 libxaw7 libxaw7-dev libxcb1 libxcb1-dev \ + libxdmcp-dev libxdmcp6 libxext-dev libxext6 libxml2 libxml2-dev libxmu-dev \ + libxmu-headers libxmu6 libxpm-dev libxpm4 libxt-dev libxt6 linux-libc-dev \ + m4 make mlock mysql-common openssl patch pkg-config uuid-dev wget \ + x11-common x11proto-core-dev x11proto-input-dev x11proto-kb-dev \ + x11proto-xext-dev xorg-sgml-doctools xtrans-dev zlib1g-dev \ + && \ + wget http://museum.php.net/php5/php-5.2.17.tar.bz2 && \ + tar xfj php-5.2.17.tar.bz2 && \ + ln -s /usr/lib/x86_64-linux-gnu/libjpeg.* /usr/lib/ && \ + ln -s /usr/lib/x86_64-linux-gnu/libpng.* /usr/lib/ && \ + ln -s /usr/lib/x86_64-linux-gnu/libkrb5.* /usr/lib/ && \ + ln -s /usr/lib/x86_64-linux-gnu/libmysqlclient.* /usr/lib/ && \ + cd php-5.2.17; \ + wget -c -t 3 -O ./debian_patches_disable_SSLv2_for_openssl_1_0_0.patch https://bugs.php.net/patch-display.php\?bug_id\=54736\&patch\=debian_patches_disable_SSLv2_for_openssl_1_0_0.patch\&revision=1305414559\&download\=1 && \ + patch -p1 -b < debian_patches_disable_SSLv2_for_openssl_1_0_0.patch && \ + + ./configure \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --prefix=/usr \ + --build=i686-pc-linux-gnu \ + --host=i686-pc-linux-gnu \ + --mandir=/usr/share/man \ + --infodir=/usr/share/info \ + --datadir=/usr/share \ + --sysconfdir=/etc \ + --localstatedir=/var/lib \ + --prefix=/usr/lib/php5.2 \ + --mandir=/usr/lib/php5.2/man \ + --infodir=/usr/lib/php5.2/info \ + --libdir=/usr/lib/php5.2/lib \ + --with-libdir=lib \ + --with-pear \ + --disable-maintainer-zts \ + --enable-bcmath \ + --with-bz2 \ + --enable-calendar \ + --with-curl \ + --with-curlwrappers \ + --disable-dbase \ + --enable-exif \ + --without-fbsql \ + --without-fdftk \ + --enable-ftp \ + --with-gettext \ + --without-gmp \ + --disable-ipv6 \ + --with-kerberos \ + --enable-mbstring \ + --with-mcrypt \ + --with-mhash \ + --without-msql \ + --without-mssql \ + --with-ncurses \ + --with-openssl \ + --with-openssl-dir=/usr \ + --disable-pcntl \ + --without-pgsql \ + --with-pspell \ + --without-recode \ + --disable-shmop \ + --without-snmp \ + --enable-soap \ + --enable-sockets \ + --without-sybase-ct \ + --disable-sysvmsg \ + --disable-sysvsem \ + --disable-sysvshm \ + --without-tidy \ + --disable-wddx \ + --disable-xmlreader \ + --disable-xmlwriter \ + --with-xmlrpc \ + --without-xsl \ + --enable-zip \ + --with-zlib \ + --disable-debug \ + --enable-dba \ + --without-cdb \ + --disable-flatfile \ + --with-gdbm \ + --disable-inifile \ + --without-qdbm \ + --with-freetype-dir=/usr \ + --with-t1lib=/usr \ + --disable-gd-jis-conv \ + --with-jpeg-dir=/usr \ + --with-png-dir=/usr \ + --without-xpm-dir \ + --with-gd \ + --with-imap \ + --with-imap-ssl \ + --without-interbase \ + --without-mysql \ + --without-mysqli \ + --without-oci8 \ + --without-pdo-dblib \ + --without-pdo-mysql \ + --without-pdo-pgsql \ + --without-pdo-odbc \ + --with-readline \ + --without-libedit \ + --without-mm \ + --with-pcre-regex \ + --with-config-file-path=/etc/php/cli-php5.2 \ + --with-config-file-scan-dir=/etc/php/cli-php5.2/ext-active \ + --enable-cli \ + --disable-cgi \ + --disable-embed \ + --with-pic \ + && \ + make clean && \ + make && \ + make install && \ + + pecl install phar && \ + + wget https://github.com/treffynnon/php5.2-phpunit3.6.12-phar/releases/download/1.0.2/php52-phpunit.phar -O ~/phpunit && \ + chmod +x ~/phpunit && \ + + cd /php && \ + + rm -Rf /php && \ + rm -Rf /var/cache/* && \ + rm -Rf /tmp/pear && \ + apt-get purge -y \ + apache2-prefork-dev autoconf binutils build-essential bzip2 \ + comerr-dev cpp cpp-4.6 dpkg-dev g++ g++-4.6 gcc gcc-4.6 krb5-multidev \ + libapr1-dev libaprutil1-dev libaspell-dev libbz2-dev \ + libc-client2007e-dev libc-dev-bin libc6-dev \ + libcurl4-openssl-dev libdpkg-perl libexpat1-dev \ + libfreetype6-dev libgcrypt11-dev libgdbm-dev libgmp10 libgnutls-dev \ + libgnutls-openssl27 libgnutlsxx27 libgomp1 libgpg-error-dev \ + libgssrpc4 libice-dev libice6 libidn11-dev \ + libjpeg-dev libjpeg-turbo8-dev libjpeg8-dev \ + libkadm5clnt-mit8 libkadm5srv-mit8 libkdb5-6 \ + libkrb5-dev libldap2-dev libltdl-dev libltdl7 \ + libmagic-dev libmcrypt-dev libmhash-dev \ + libmpc2 libmpfr4 libmysqlclient-dev libncurses5-dev \ + libp11-kit-dev libpam0g-dev libpcre3-dev libpcrecpp0 libpng12-dev libpopt0 \ + libpq-dev libpq5 libpspell-dev libpthread-stubs0 libpthread-stubs0-dev \ + libquadmath0 libreadline-dev libreadline6-dev librtmp-dev \ + libsm-dev libsm6 libsqlite3-dev libssl-dev libstdc++6-4.6-dev \ + libt1-dev libtasn1-3-dev libtimedate-perl libtinfo-dev \ + libx11-dev libxau-dev libxaw7 libxaw7-dev libxcb1-dev \ + libxdmcp-dev libxext-dev libxext6 libxml2-dev libxmu-dev \ + libxmu-headers libxmu6 libxpm-dev libxpm4 libxt-dev libxt6 linux-libc-dev \ + m4 make patch pkg-config uuid-dev wget \ + x11-common x11proto-core-dev x11proto-input-dev x11proto-kb-dev \ + x11proto-xext-dev xorg-sgml-doctools xtrans-dev zlib1g-dev \ + && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +COPY php.ini /etc/php/cli-php5.2/ \ No newline at end of file diff --git a/vendor/j4mie/idiorm/test/docker_for_php52/README.md b/vendor/j4mie/idiorm/test/docker_for_php52/README.md new file mode 100644 index 000000000..80a6fb707 --- /dev/null +++ b/vendor/j4mie/idiorm/test/docker_for_php52/README.md @@ -0,0 +1,23 @@ +# Docker for PHP 5.2 testing + +Run all the following commands from this diretory. + +# Building the image + + docker build . -f Dockerfile -t treffynnon/php5.2cli + +# Run the tests + + docker run -t -v $(realpath ../..):/tmp/idiorm --rm treffynnon/php5.2cli /root/phpunit -c /tmp/idiorm/phpunit.xml + +# Running the container interactively + + docker run -it -v $(realpath ../..):/tmp/idiorm --rm treffynnon/php5.2cli + +# Running the tests + + ~/phpunit -c tmp/idiorm/phpunit.xml + +# Getting out of the interactive container + + exit \ No newline at end of file diff --git a/vendor/j4mie/idiorm/test/docker_for_php52/php.ini b/vendor/j4mie/idiorm/test/docker_for_php52/php.ini new file mode 100644 index 000000000..e5395ce30 --- /dev/null +++ b/vendor/j4mie/idiorm/test/docker_for_php52/php.ini @@ -0,0 +1,1342 @@ +[PHP] + +;;;;;;;;;;;;;;;;;;; +; About php.ini ; +;;;;;;;;;;;;;;;;;;; +; This file controls many aspects of PHP's behavior. In order for PHP to +; read it, it must be named 'php.ini'. PHP looks for it in the current +; working directory, in the path designated by the environment variable +; PHPRC, and in the path that was defined in compile time (in that order). +; Under Windows, the compile-time path is the Windows directory. The +; path in which the php.ini file is looked for can be overridden using +; the -c argument in command line mode. +; +; The syntax of the file is extremely simple. Whitespace and Lines +; beginning with a semicolon are silently ignored (as you probably guessed). +; Section headers (e.g. [Foo]) are also silently ignored, even though +; they might mean something in the future. +; +; Directives are specified using the following syntax: +; directive = value +; Directive names are *case sensitive* - foo=bar is different from FOO=bar. +; +; The value can be a string, a number, a PHP constant (e.g. E_ALL or M_PI), one +; of the INI constants (On, Off, True, False, Yes, No and None) or an expression +; (e.g. E_ALL & ~E_NOTICE), or a quoted string ("foo"). +; +; Expressions in the INI file are limited to bitwise operators and parentheses: +; | bitwise OR +; & bitwise AND +; ~ bitwise NOT +; ! boolean NOT +; +; Boolean flags can be turned on using the values 1, On, True or Yes. +; They can be turned off using the values 0, Off, False or No. +; +; An empty string can be denoted by simply not writing anything after the equal +; sign, or by using the None keyword: +; +; foo = ; sets foo to an empty string +; foo = none ; sets foo to an empty string +; foo = "none" ; sets foo to the string 'none' +; +; If you use constants in your value, and these constants belong to a +; dynamically loaded extension (either a PHP extension or a Zend extension), +; you may only use these constants *after* the line that loads the extension. +; +; +;;;;;;;;;;;;;;;;;;; +; About this file ; +;;;;;;;;;;;;;;;;;;; +; This is the recommended, PHP 5-style version of the php.ini-dist file. It +; sets some non standard settings, that make PHP more efficient, more secure, +; and encourage cleaner coding. +; +; The price is that with these settings, PHP may be incompatible with some +; applications, and sometimes, more difficult to develop with. Using this +; file is warmly recommended for production sites. As all of the changes from +; the standard settings are thoroughly documented, you can go over each one, +; and decide whether you want to use it or not. +; +; For general information about the php.ini file, please consult the php.ini-dist +; file, included in your PHP distribution. +; +; This file is different from the php.ini-dist file in the fact that it features +; different values for several directives, in order to improve performance, while +; possibly breaking compatibility with the standard out-of-the-box behavior of +; PHP. Please make sure you read what's different, and modify your scripts +; accordingly, if you decide to use this file instead. +; +; - register_long_arrays = Off [Performance] +; Disables registration of the older (and deprecated) long predefined array +; variables ($HTTP_*_VARS). Instead, use the superglobals that were +; introduced in PHP 4.1.0 +; - display_errors = Off [Security] +; With this directive set to off, errors that occur during the execution of +; scripts will no longer be displayed as a part of the script output, and thus, +; will no longer be exposed to remote users. With some errors, the error message +; content may expose information about your script, web server, or database +; server that may be exploitable for hacking. Production sites should have this +; directive set to off. +; - log_errors = On [Security] +; This directive complements the above one. Any errors that occur during the +; execution of your script will be logged (typically, to your server's error log, +; but can be configured in several ways). Along with setting display_errors to off, +; this setup gives you the ability to fully understand what may have gone wrong, +; without exposing any sensitive information to remote users. +; - output_buffering = 4096 [Performance] +; Set a 4KB output buffer. Enabling output buffering typically results in less +; writes, and sometimes less packets sent on the wire, which can often lead to +; better performance. The gain this directive actually yields greatly depends +; on which Web server you're working with, and what kind of scripts you're using. +; - register_argc_argv = Off [Performance] +; Disables registration of the somewhat redundant $argv and $argc global +; variables. +; - magic_quotes_gpc = Off [Performance] +; Input data is no longer escaped with slashes so that it can be sent into +; SQL databases without further manipulation. Instead, you should use the +; database vendor specific escape string function on each input element you +; wish to send to a database. +; - variables_order = "GPCS" [Performance] +; The environment variables are not hashed into the $_ENV. To access +; environment variables, you can use getenv() instead. +; - error_reporting = E_ALL [Code Cleanliness, Security(?)] +; By default, PHP suppresses errors of type E_NOTICE. These error messages +; are emitted for non-critical errors, but that could be a symptom of a bigger +; problem. Most notably, this will cause error messages about the use +; of uninitialized variables to be displayed. +; - allow_call_time_pass_reference = Off [Code cleanliness] +; It's not possible to decide to force a variable to be passed by reference +; when calling a function. The PHP 4 style to do this is by making the +; function require the relevant argument by reference. +; - short_open_tag = Off [Portability] +; Using short tags is discouraged when developing code meant for redistribution +; since short tags may not be supported on the target server. + +;;;;;;;;;;;;;;;;;;;; +; Language Options ; +;;;;;;;;;;;;;;;;;;;; + +; Enable the PHP scripting language engine under Apache. +engine = On + +; Enable compatibility mode with Zend Engine 1 (PHP 4.x) +zend.ze1_compatibility_mode = Off + +; Allow the tags are recognized. +; NOTE: Using short tags should be avoided when developing applications or +; libraries that are meant for redistribution, or deployment on PHP +; servers which are not under your control, because short tags may not +; be supported on the target server. For portable, redistributable code, +; be sure not to use short tags. +short_open_tag = Off + +; Allow ASP-style <% %> tags. +asp_tags = Off + +; The number of significant digits displayed in floating point numbers. +precision = 14 + +; Enforce year 2000 compliance (will cause problems with non-compliant browsers) +y2k_compliance = On + +; Output buffering allows you to send header lines (including cookies) even +; after you send body content, at the price of slowing PHP's output layer a +; bit. You can enable output buffering during runtime by calling the output +; buffering functions. You can also enable output buffering for all files by +; setting this directive to On. If you wish to limit the size of the buffer +; to a certain size - you can use a maximum number of bytes instead of 'On', as +; a value for this directive (e.g., output_buffering=4096). +output_buffering = 4096 + +; You can redirect all of the output of your scripts to a function. For +; example, if you set output_handler to "mb_output_handler", character +; encoding will be transparently converted to the specified encoding. +; Setting any output handler automatically turns on output buffering. +; Note: People who wrote portable scripts should not depend on this ini +; directive. Instead, explicitly set the output handler using ob_start(). +; Using this ini directive may cause problems unless you know what script +; is doing. +; Note: You cannot use both "mb_output_handler" with "ob_iconv_handler" +; and you cannot use both "ob_gzhandler" and "zlib.output_compression". +; Note: output_handler must be empty if this is set 'On' !!!! +; Instead you must use zlib.output_handler. +;output_handler = + +; Transparent output compression using the zlib library +; Valid values for this option are 'off', 'on', or a specific buffer size +; to be used for compression (default is 4KB) +; Note: Resulting chunk size may vary due to nature of compression. PHP +; outputs chunks that are few hundreds bytes each as a result of +; compression. If you prefer a larger chunk size for better +; performance, enable output_buffering in addition. +; Note: You need to use zlib.output_handler instead of the standard +; output_handler, or otherwise the output will be corrupted. +zlib.output_compression = Off +;zlib.output_compression_level = -1 + +; You cannot specify additional output handlers if zlib.output_compression +; is activated here. This setting does the same as output_handler but in +; a different order. +;zlib.output_handler = + +; Implicit flush tells PHP to tell the output layer to flush itself +; automatically after every output block. This is equivalent to calling the +; PHP function flush() after each and every call to print() or echo() and each +; and every HTML block. Turning this option on has serious performance +; implications and is generally recommended for debugging purposes only. +implicit_flush = Off + +; The unserialize callback function will be called (with the undefined class' +; name as parameter), if the unserializer finds an undefined class +; which should be instantiated. +; A warning appears if the specified function is not defined, or if the +; function doesn't include/implement the missing class. +; So only set this entry, if you really want to implement such a +; callback-function. +unserialize_callback_func= + +; When floats & doubles are serialized store serialize_precision significant +; digits after the floating point. The default value ensures that when floats +; are decoded with unserialize, the data will remain the same. +serialize_precision = 100 + +; Whether to enable the ability to force arguments to be passed by reference +; at function call time. This method is deprecated and is likely to be +; unsupported in future versions of PHP/Zend. The encouraged method of +; specifying which arguments should be passed by reference is in the function +; declaration. You're encouraged to try and turn this option Off and make +; sure your scripts work properly with it in order to ensure they will work +; with future versions of the language (you will receive a warning each time +; you use this feature, and the argument will be passed by value instead of by +; reference). +allow_call_time_pass_reference = Off + +; +; Safe Mode +; +safe_mode = Off + +; By default, Safe Mode does a UID compare check when +; opening files. If you want to relax this to a GID compare, +; then turn on safe_mode_gid. +safe_mode_gid = Off + +; When safe_mode is on, UID/GID checks are bypassed when +; including files from this directory and its subdirectories. +; (directory must also be in include_path or full path must +; be used when including) +safe_mode_include_dir = + +; When safe_mode is on, only executables located in the safe_mode_exec_dir +; will be allowed to be executed via the exec family of functions. +safe_mode_exec_dir = + +; Setting certain environment variables may be a potential security breach. +; This directive contains a comma-delimited list of prefixes. In Safe Mode, +; the user may only alter environment variables whose names begin with the +; prefixes supplied here. By default, users will only be able to set +; environment variables that begin with PHP_ (e.g. PHP_FOO=BAR). +; +; Note: If this directive is empty, PHP will let the user modify ANY +; environment variable! +safe_mode_allowed_env_vars = PHP_ + +; This directive contains a comma-delimited list of environment variables that +; the end user won't be able to change using putenv(). These variables will be +; protected even if safe_mode_allowed_env_vars is set to allow to change them. +safe_mode_protected_env_vars = LD_LIBRARY_PATH + +; open_basedir, if set, limits all file operations to the defined directory +; and below. This directive makes most sense if used in a per-directory +; or per-virtualhost web server configuration file. This directive is +; *NOT* affected by whether Safe Mode is turned On or Off. +;open_basedir = + +; This directive allows you to disable certain functions for security reasons. +; It receives a comma-delimited list of function names. This directive is +; *NOT* affected by whether Safe Mode is turned On or Off. +disable_functions = + +; This directive allows you to disable certain classes for security reasons. +; It receives a comma-delimited list of class names. This directive is +; *NOT* affected by whether Safe Mode is turned On or Off. +disable_classes = + +; Colors for Syntax Highlighting mode. Anything that's acceptable in +; would work. +;highlight.string = #DD0000 +;highlight.comment = #FF9900 +;highlight.keyword = #007700 +;highlight.bg = #FFFFFF +;highlight.default = #0000BB +;highlight.html = #000000 + +; If enabled, the request will be allowed to complete even if the user aborts +; the request. Consider enabling it if executing long request, which may end up +; being interrupted by the user or a browser timing out. +; ignore_user_abort = On + +; Determines the size of the realpath cache to be used by PHP. This value should +; be increased on systems where PHP opens many files to reflect the quantity of +; the file operations performed. +; realpath_cache_size=16k + +; Duration of time, in seconds for which to cache realpath information for a given +; file or directory. For systems with rarely changing files, consider increasing this +; value. +; realpath_cache_ttl=120 + +; +; Misc +; +; Decides whether PHP may expose the fact that it is installed on the server +; (e.g. by adding its signature to the Web server header). It is no security +; threat in any way, but it makes it possible to determine whether you use PHP +; on your server or not. +expose_php = Off + + +;;;;;;;;;;;;;;;;;;; +; Resource Limits ; +;;;;;;;;;;;;;;;;;;; + +max_execution_time = 30 ; Maximum execution time of each script, in seconds +max_input_time = 60 ; Maximum amount of time each script may spend parsing request data +;max_input_nesting_level = 64 ; Maximum input variable nesting level +memory_limit = 128M ; Maximum amount of memory a script may consume (128MB) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Error handling and logging ; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +; error_reporting is a bit-field. Or each number up to get desired error +; reporting level +; E_ALL - All errors and warnings (doesn't include E_STRICT) +; E_ERROR - fatal run-time errors +; E_RECOVERABLE_ERROR - almost fatal run-time errors +; E_WARNING - run-time warnings (non-fatal errors) +; E_PARSE - compile-time parse errors +; E_NOTICE - run-time notices (these are warnings which often result +; from a bug in your code, but it's possible that it was +; intentional (e.g., using an uninitialized variable and +; relying on the fact it's automatically initialized to an +; empty string) +; E_STRICT - run-time notices, enable to have PHP suggest changes +; to your code which will ensure the best interoperability +; and forward compatibility of your code +; E_CORE_ERROR - fatal errors that occur during PHP's initial startup +; E_CORE_WARNING - warnings (non-fatal errors) that occur during PHP's +; initial startup +; E_COMPILE_ERROR - fatal compile-time errors +; E_COMPILE_WARNING - compile-time warnings (non-fatal errors) +; E_USER_ERROR - user-generated error message +; E_USER_WARNING - user-generated warning message +; E_USER_NOTICE - user-generated notice message +; +; Examples: +; +; - Show all errors, except for notices and coding standards warnings +; +;error_reporting = E_ALL & ~E_NOTICE +; +; - Show all errors, except for notices +; +;error_reporting = E_ALL & ~E_NOTICE | E_STRICT +; +; - Show only errors +; +;error_reporting = E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR +; +; - Show all errors, except coding standards warnings +; +;error_reporting = E_ALL +error_reporting = 6135 + +; Print out errors (as a part of the output). For production web sites, +; you're strongly encouraged to turn this feature off, and use error logging +; instead (see below). Keeping display_errors enabled on a production web site +; may reveal security information to end users, such as file paths on your Web +; server, your database schema or other information. +; +; possible values for display_errors: +; +; Off - Do not display any errors +; stderr - Display errors to STDERR (affects only CGI/CLI binaries!) +; On or stdout - Display errors to STDOUT (default) +; +; To output errors to STDERR with CGI/CLI: +;display_errors = "stderr" +; +; Default +; +display_errors = Off + +; Even when display_errors is on, errors that occur during PHP's startup +; sequence are not displayed. It's strongly recommended to keep +; display_startup_errors off, except for when debugging. +display_startup_errors = Off + +; Log errors into a log file (server-specific log, stderr, or error_log (below)) +; As stated above, you're strongly advised to use error logging in place of +; error displaying on production web sites. +log_errors = On + +; Set maximum length of log_errors. In error_log information about the source is +; added. The default is 1024 and 0 allows to not apply any maximum length at all. +log_errors_max_len = 1024 + +; Do not log repeated messages. Repeated errors must occur in same file on same +; line unless ignore_repeated_source is set true. +ignore_repeated_errors = Off + +; Ignore source of message when ignoring repeated messages. When this setting +; is On you will not log errors with repeated messages from different files or +; source lines. +ignore_repeated_source = Off + +; If this parameter is set to Off, then memory leaks will not be shown (on +; stdout or in the log). This has only effect in a debug compile, and if +; error reporting includes E_WARNING in the allowed list +report_memleaks = On + +;report_zend_debug = 0 + +; Store the last error/warning message in $php_errormsg (boolean). +track_errors = Off + +; Turn off normal error reporting and emit XML-RPC error XML +;xmlrpc_errors = 0 +; An XML-RPC faultCode +;xmlrpc_error_number = 0 + +; Disable the inclusion of HTML tags in error messages. +; Note: Never use this feature for production boxes. +;html_errors = Off + +; If html_errors is set On PHP produces clickable error messages that direct +; to a page describing the error or function causing the error in detail. +; You can download a copy of the PHP manual from http://www.php.net/docs.php +; and change docref_root to the base URL of your local copy including the +; leading '/'. You must also specify the file extension being used including +; the dot. +; Note: Never use this feature for production boxes. +;docref_root = "/phpmanual/" +;docref_ext = .html + +; String to output before an error message. +;error_prepend_string = "" + +; String to output after an error message. +;error_append_string = "" + +; Log errors to specified file. +;error_log = filename + +; Log errors to syslog (Event Log on NT, not valid in Windows 95). +;error_log = syslog + + +;;;;;;;;;;;;;;;;; +; Data Handling ; +;;;;;;;;;;;;;;;;; +; +; Note - track_vars is ALWAYS enabled as of PHP 4.0.3 + +; The separator used in PHP generated URLs to separate arguments. +; Default is "&". +;arg_separator.output = "&" + +; List of separator(s) used by PHP to parse input URLs into variables. +; Default is "&". +; NOTE: Every character in this directive is considered as separator! +;arg_separator.input = ";&" + +; This directive describes the order in which PHP registers GET, POST, Cookie, +; Environment and Built-in variables (G, P, C, E & S respectively, often +; referred to as EGPCS or GPC). Registration is done from left to right, newer +; values override older values. +variables_order = "GPCS" + +; Whether or not to register the EGPCS variables as global variables. You may +; want to turn this off if you don't want to clutter your scripts' global scope +; with user data. This makes most sense when coupled with track_vars - in which +; case you can access all of the GPC variables through the $HTTP_*_VARS[], +; variables. +; +; You should do your best to write your scripts so that they do not require +; register_globals to be on; Using form variables as globals can easily lead +; to possible security problems, if the code is not very well thought of. +register_globals = Off + +; Whether or not to register the old-style input arrays, HTTP_GET_VARS +; and friends. If you're not using them, it's recommended to turn them off, +; for performance reasons. +register_long_arrays = Off + +; This directive tells PHP whether to declare the argv&argc variables (that +; would contain the GET information). If you don't use these variables, you +; should turn it off for increased performance. +register_argc_argv = Off + +; When enabled, the SERVER and ENV variables are created when they're first +; used (Just In Time) instead of when the script starts. If these variables +; are not used within a script, having this directive on will result in a +; performance gain. The PHP directives register_globals, register_long_arrays, +; and register_argc_argv must be disabled for this directive to have any affect. +auto_globals_jit = On + +; Maximum size of POST data that PHP will accept. +post_max_size = 8M + +; Magic quotes +; + +; Magic quotes for incoming GET/POST/Cookie data. +magic_quotes_gpc = Off + +; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc. +magic_quotes_runtime = Off + +; Use Sybase-style magic quotes (escape ' with '' instead of \'). +magic_quotes_sybase = Off + +; Automatically add files before or after any PHP document. +auto_prepend_file = +auto_append_file = + +; As of 4.0b4, PHP always outputs a character encoding by default in +; the Content-type: header. To disable sending of the charset, simply +; set it to be empty. +; +; PHP's built-in default is text/html +default_mimetype = "text/html" +;default_charset = "iso-8859-1" + +; Always populate the $HTTP_RAW_POST_DATA variable. +;always_populate_raw_post_data = On + + +;;;;;;;;;;;;;;;;;;;;;;;;; +; Paths and Directories ; +;;;;;;;;;;;;;;;;;;;;;;;;; + +; UNIX: "/path1:/path2" +include_path = ".:/usr/lib/php5.2/lib/php" +; +; Windows: "\path1;\path2" +;include_path = ".;c:\php\includes" + +; The root of the PHP pages, used only if nonempty. +; if PHP was not compiled with FORCE_REDIRECT, you SHOULD set doc_root +; if you are running php as a CGI under any web server (other than IIS) +; see documentation for security issues. The alternate is to use the +; cgi.force_redirect configuration below +doc_root = + +; The directory under which PHP opens the script using /~username used only +; if nonempty. +user_dir = + +; Directory in which the loadable extensions (modules) reside. +extension_dir = "/usr/lib/php5.2/lib/extensions/no-debug-non-zts-20060613/" + +; Whether or not to enable the dl() function. The dl() function does NOT work +; properly in multithreaded servers, such as IIS or Zeus, and is automatically +; disabled on them. +enable_dl = On + +; cgi.force_redirect is necessary to provide security running PHP as a CGI under +; most web servers. Left undefined, PHP turns this on by default. You can +; turn it off here AT YOUR OWN RISK +; **You CAN safely turn this off for IIS, in fact, you MUST.** +; cgi.force_redirect = 1 + +; if cgi.nph is enabled it will force cgi to always sent Status: 200 with +; every request. +; cgi.nph = 1 + +; if cgi.force_redirect is turned on, and you are not running under Apache or Netscape +; (iPlanet) web servers, you MAY need to set an environment variable name that PHP +; will look for to know it is OK to continue execution. Setting this variable MAY +; cause security issues, KNOW WHAT YOU ARE DOING FIRST. +; cgi.redirect_status_env = ; + +; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's +; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok +; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting +; this to 1 will cause PHP CGI to fix it's paths to conform to the spec. A setting +; of zero causes PHP to behave as before. Default is 1. You should fix your scripts +; to use SCRIPT_FILENAME rather than PATH_TRANSLATED. +; cgi.fix_pathinfo=1 + +; FastCGI under IIS (on WINNT based OS) supports the ability to impersonate +; security tokens of the calling client. This allows IIS to define the +; security context that the request runs under. mod_fastcgi under Apache +; does not currently support this feature (03/17/2002) +; Set to 1 if running under IIS. Default is zero. +; fastcgi.impersonate = 1; + +; Disable logging through FastCGI connection +; fastcgi.logging = 0 + +; cgi.rfc2616_headers configuration option tells PHP what type of headers to +; use when sending HTTP response code. If it's set 0 PHP sends Status: header that +; is supported by Apache. When this option is set to 1 PHP will send +; RFC2616 compliant header. +; Default is zero. +;cgi.rfc2616_headers = 0 + + +;;;;;;;;;;;;;;;; +; File Uploads ; +;;;;;;;;;;;;;;;; + +; Whether to allow HTTP file uploads. +file_uploads = On + +; Temporary directory for HTTP uploaded files (will use system default if not +; specified). +;upload_tmp_dir = + +; Maximum allowed size for uploaded files. +upload_max_filesize = 2M + + +; Maximum number of files that can be uploaded via a single request +max_file_uploads = 20 + +;;;;;;;;;;;;;;;;;; +; Fopen wrappers ; +;;;;;;;;;;;;;;;;;; + +; Whether to allow the treatment of URLs (like http:// or ftp://) as files. +allow_url_fopen = On + +; Whether to allow include/require to open URLs (like http:// or ftp://) as files. +allow_url_include = Off + +; Define the anonymous ftp password (your email address) +;from="john@doe.com" + +; Define the User-Agent string +; user_agent="PHP" + +; Default timeout for socket based streams (seconds) +default_socket_timeout = 60 + +; If your scripts have to deal with files from Macintosh systems, +; or you are running on a Mac and need to deal with files from +; unix or win32 systems, setting this flag will cause PHP to +; automatically detect the EOL character in those files so that +; fgets() and file() will work regardless of the source of the file. +; auto_detect_line_endings = Off + + +;;;;;;;;;;;;;;;;;;;;;; +; Dynamic Extensions ; +;;;;;;;;;;;;;;;;;;;;;; +; +; If you wish to have an extension loaded automatically, use the following +; syntax: +; +; extension=modulename.extension +; +; For example, on Windows: +; +; extension=msql.dll +; +; ... or under UNIX: +; +; extension=msql.so +; +; Note that it should be the name of the module only; no directory information +; needs to go here. Specify the location of the extension with the +; extension_dir directive above. + + +; Windows Extensions +; Note that ODBC support is built in, so no dll is needed for it. +; Note that many DLL files are located in the extensions/ (PHP 4) ext/ (PHP 5) +; extension folders as well as the separate PECL DLL download (PHP 5). +; Be sure to appropriately set the extension_dir directive. + +;extension=php_bz2.dll +;extension=php_curl.dll +;extension=php_dba.dll +;extension=php_dbase.dll +;extension=php_fdf.dll +;extension=php_gd2.dll +;extension=php_gettext.dll +;extension=php_gmp.dll +;extension=php_ifx.dll +;extension=php_imap.dll +;extension=php_interbase.dll +;extension=php_ldap.dll +;extension=php_mbstring.dll +;extension=php_exif.dll +;extension=php_mcrypt.dll +;extension=php_mhash.dll +;extension=php_mime_magic.dll +;extension=php_ming.dll +;extension=php_msql.dll +;extension=php_mssql.dll +;extension=php_mysql.dll +;extension=php_mysqli.dll +;extension=php_oci8.dll +;extension=php_openssl.dll +;extension=php_pdo.dll +;extension=php_pdo_firebird.dll +;extension=php_pdo_mssql.dll +;extension=php_pdo_mysql.dll +;extension=php_pdo_oci.dll +;extension=php_pdo_oci8.dll +;extension=php_pdo_odbc.dll +;extension=php_pdo_pgsql.dll +;extension=php_pdo_sqlite.dll +;extension=php_pgsql.dll +;extension=php_pspell.dll +;extension=php_shmop.dll +;extension=php_snmp.dll +;extension=php_soap.dll +;extension=php_sockets.dll +;extension=php_sqlite.dll +;extension=php_sybase_ct.dll +;extension=php_tidy.dll +;extension=php_xmlrpc.dll +;extension=php_xsl.dll +;extension=php_zip.dll +extension=phar.so + +;;;;;;;;;;;;;;;;;;; +; Module Settings ; +;;;;;;;;;;;;;;;;;;; + +[Date] +; Defines the default timezone used by the date functions +date.timezone = "Europe/Berlin" + +;date.default_latitude = 31.7667 +;date.default_longitude = 35.2333 + +;date.sunrise_zenith = 90.583333 +;date.sunset_zenith = 90.583333 + +[filter] +;filter.default = unsafe_raw +;filter.default_flags = + +[iconv] +;iconv.input_encoding = ISO-8859-1 +;iconv.internal_encoding = ISO-8859-1 +;iconv.output_encoding = ISO-8859-1 + +[sqlite] +;sqlite.assoc_case = 0 + +[Pcre] +;PCRE library backtracking limit. +;pcre.backtrack_limit=100000 + +;PCRE library recursion limit. +;Please note that if you set this value to a high number you may consume all +;the available process stack and eventually crash PHP (due to reaching the +;stack size limit imposed by the Operating System). +;pcre.recursion_limit=100000 + +[Syslog] +; Whether or not to define the various syslog variables (e.g. $LOG_PID, +; $LOG_CRON, etc.). Turning it off is a good idea performance-wise. In +; runtime, you can define these variables by calling define_syslog_variables(). +define_syslog_variables = Off + +[mail function] +; For Win32 only. +SMTP = localhost +smtp_port = 25 + +; For Win32 only. +;sendmail_from = me@example.com + +; For Unix only. You may supply arguments as well (default: "sendmail -t -i"). +sendmail_path = "/usr/sbin/ssmtp -t" + +; Force the addition of the specified parameters to be passed as extra parameters +; to the sendmail binary. These parameters will always replace the value of +; the 5th parameter to mail(), even in safe mode. +;mail.force_extra_parameters = + +[SQL] +sql.safe_mode = Off + +[ODBC] +;odbc.default_db = Not yet implemented +;odbc.default_user = Not yet implemented +;odbc.default_pw = Not yet implemented + +; Allow or prevent persistent links. +odbc.allow_persistent = On + +; Check that a connection is still valid before reuse. +odbc.check_persistent = On + +; Maximum number of persistent links. -1 means no limit. +odbc.max_persistent = -1 + +; Maximum number of links (persistent + non-persistent). -1 means no limit. +odbc.max_links = -1 + +; Handling of LONG fields. Returns number of bytes to variables. 0 means +; passthru. +odbc.defaultlrl = 4096 + +; Handling of binary data. 0 means passthru, 1 return as is, 2 convert to char. +; See the documentation on odbc_binmode and odbc_longreadlen for an explanation +; of uodbc.defaultlrl and uodbc.defaultbinmode +odbc.defaultbinmode = 1 + +[MySQL] +; Allow or prevent persistent links. +mysql.allow_persistent = On + +; Maximum number of persistent links. -1 means no limit. +mysql.max_persistent = -1 + +; Maximum number of links (persistent + non-persistent). -1 means no limit. +mysql.max_links = -1 + +; Default port number for mysql_connect(). If unset, mysql_connect() will use +; the $MYSQL_TCP_PORT or the mysql-tcp entry in /etc/services or the +; compile-time value defined MYSQL_PORT (in that order). Win32 will only look +; at MYSQL_PORT. +mysql.default_port = + +; Default socket name for local MySQL connects. If empty, uses the built-in +; MySQL defaults. +mysql.default_socket = + +; Default host for mysql_connect() (doesn't apply in safe mode). +mysql.default_host = + +; Default user for mysql_connect() (doesn't apply in safe mode). +mysql.default_user = + +; Default password for mysql_connect() (doesn't apply in safe mode). +; Note that this is generally a *bad* idea to store passwords in this file. +; *Any* user with PHP access can run 'echo get_cfg_var("mysql.default_password") +; and reveal this password! And of course, any users with read access to this +; file will be able to reveal the password as well. +mysql.default_password = + +; Maximum time (in seconds) for connect timeout. -1 means no limit +mysql.connect_timeout = 60 + +; Trace mode. When trace_mode is active (=On), warnings for table/index scans and +; SQL-Errors will be displayed. +mysql.trace_mode = Off + +[MySQLi] + +; Maximum number of links. -1 means no limit. +mysqli.max_links = -1 + +; Default port number for mysqli_connect(). If unset, mysqli_connect() will use +; the $MYSQL_TCP_PORT or the mysql-tcp entry in /etc/services or the +; compile-time value defined MYSQL_PORT (in that order). Win32 will only look +; at MYSQL_PORT. +mysqli.default_port = 3306 + +; Default socket name for local MySQL connects. If empty, uses the built-in +; MySQL defaults. +mysqli.default_socket = + +; Default host for mysql_connect() (doesn't apply in safe mode). +mysqli.default_host = + +; Default user for mysql_connect() (doesn't apply in safe mode). +mysqli.default_user = + +; Default password for mysqli_connect() (doesn't apply in safe mode). +; Note that this is generally a *bad* idea to store passwords in this file. +; *Any* user with PHP access can run 'echo get_cfg_var("mysqli.default_pw") +; and reveal this password! And of course, any users with read access to this +; file will be able to reveal the password as well. +mysqli.default_pw = + +; Allow or prevent reconnect +mysqli.reconnect = Off + +[mSQL] +; Allow or prevent persistent links. +msql.allow_persistent = On + +; Maximum number of persistent links. -1 means no limit. +msql.max_persistent = -1 + +; Maximum number of links (persistent+non persistent). -1 means no limit. +msql.max_links = -1 + +[OCI8] +; enables privileged connections using external credentials (OCI_SYSOPER, OCI_SYSDBA) +;oci8.privileged_connect = Off + +; Connection: The maximum number of persistent OCI8 connections per +; process. Using -1 means no limit. +;oci8.max_persistent = -1 + +; Connection: The maximum number of seconds a process is allowed to +; maintain an idle persistent connection. Using -1 means idle +; persistent connections will be maintained forever. +;oci8.persistent_timeout = -1 + +; Connection: The number of seconds that must pass before issuing a +; ping during oci_pconnect() to check the connection validity. When +; set to 0, each oci_pconnect() will cause a ping. Using -1 disables +; pings completely. +;oci8.ping_interval = 60 + +; Tuning: This option enables statement caching, and specifies how +; many statements to cache. Using 0 disables statement caching. +;oci8.statement_cache_size = 20 + +; Tuning: Enables statement prefetching and sets the default number of +; rows that will be fetched automatically after statement execution. +;oci8.default_prefetch = 10 + +; Compatibility. Using On means oci_close() will not close +; oci_connect() and oci_new_connect() connections. +;oci8.old_oci_close_semantics = Off + +[PostgresSQL] +; Allow or prevent persistent links. +pgsql.allow_persistent = On + +; Detect broken persistent links always with pg_pconnect(). +; Auto reset feature requires a little overheads. +pgsql.auto_reset_persistent = Off + +; Maximum number of persistent links. -1 means no limit. +pgsql.max_persistent = -1 + +; Maximum number of links (persistent+non persistent). -1 means no limit. +pgsql.max_links = -1 + +; Ignore PostgreSQL backends Notice message or not. +; Notice message logging require a little overheads. +pgsql.ignore_notice = 0 + +; Log PostgreSQL backends Notice message or not. +; Unless pgsql.ignore_notice=0, module cannot log notice message. +pgsql.log_notice = 0 + +[Sybase] +; Allow or prevent persistent links. +sybase.allow_persistent = On + +; Maximum number of persistent links. -1 means no limit. +sybase.max_persistent = -1 + +; Maximum number of links (persistent + non-persistent). -1 means no limit. +sybase.max_links = -1 + +;sybase.interface_file = "/usr/sybase/interfaces" + +; Minimum error severity to display. +sybase.min_error_severity = 10 + +; Minimum message severity to display. +sybase.min_message_severity = 10 + +; Compatibility mode with old versions of PHP 3.0. +; If on, this will cause PHP to automatically assign types to results according +; to their Sybase type, instead of treating them all as strings. This +; compatibility mode will probably not stay around forever, so try applying +; whatever necessary changes to your code, and turn it off. +sybase.compatability_mode = Off + +[Sybase-CT] +; Allow or prevent persistent links. +sybct.allow_persistent = On + +; Maximum number of persistent links. -1 means no limit. +sybct.max_persistent = -1 + +; Maximum number of links (persistent + non-persistent). -1 means no limit. +sybct.max_links = -1 + +; Minimum server message severity to display. +sybct.min_server_severity = 10 + +; Minimum client message severity to display. +sybct.min_client_severity = 10 + +[bcmath] +; Number of decimal digits for all bcmath functions. +bcmath.scale = 0 + +[browscap] +;browscap = extra/browscap.ini + +[Informix] +; Default host for ifx_connect() (doesn't apply in safe mode). +ifx.default_host = + +; Default user for ifx_connect() (doesn't apply in safe mode). +ifx.default_user = + +; Default password for ifx_connect() (doesn't apply in safe mode). +ifx.default_password = + +; Allow or prevent persistent links. +ifx.allow_persistent = On + +; Maximum number of persistent links. -1 means no limit. +ifx.max_persistent = -1 + +; Maximum number of links (persistent + non-persistent). -1 means no limit. +ifx.max_links = -1 + +; If on, select statements return the contents of a text blob instead of its id. +ifx.textasvarchar = 0 + +; If on, select statements return the contents of a byte blob instead of its id. +ifx.byteasvarchar = 0 + +; Trailing blanks are stripped from fixed-length char columns. May help the +; life of Informix SE users. +ifx.charasvarchar = 0 + +; If on, the contents of text and byte blobs are dumped to a file instead of +; keeping them in memory. +ifx.blobinfile = 0 + +; NULL's are returned as empty strings, unless this is set to 1. In that case, +; NULL's are returned as string 'NULL'. +ifx.nullformat = 0 + +[Session] +; Handler used to store/retrieve data. +session.save_handler = files + +; Argument passed to save_handler. In the case of files, this is the path +; where data files are stored. Note: Windows users have to change this +; variable in order to use PHP's session functions. +; +; As of PHP 4.0.1, you can define the path as: +; +; session.save_path = "N;/path" +; +; where N is an integer. Instead of storing all the session files in +; /path, what this will do is use subdirectories N-levels deep, and +; store the session data in those directories. This is useful if you +; or your OS have problems with lots of files in one directory, and is +; a more efficient layout for servers that handle lots of sessions. +; +; NOTE 1: PHP will not create this directory structure automatically. +; You can use the script in the ext/session dir for that purpose. +; NOTE 2: See the section on garbage collection below if you choose to +; use subdirectories for session storage +; +; The file storage module creates files using mode 600 by default. +; You can change that by using +; +; session.save_path = "N;MODE;/path" +; +; where MODE is the octal representation of the mode. Note that this +; does not overwrite the process's umask. +;session.save_path = "/tmp" + +; Whether to use cookies. +session.use_cookies = 1 + +;session.cookie_secure = + +; This option enables administrators to make their users invulnerable to +; attacks which involve passing session ids in URLs; defaults to 0. +; session.use_only_cookies = 1 + +; Name of the session (used as cookie name). +session.name = PHPSESSID + +; Initialize session on request startup. +session.auto_start = 0 + +; Lifetime in seconds of cookie or, if 0, until browser is restarted. +session.cookie_lifetime = 28800 + +; The path for which the cookie is valid. +session.cookie_path = / + +; The domain for which the cookie is valid. +session.cookie_domain = + +; Whether or not to add the httpOnly flag to the cookie, which makes it inaccessible to browser scripting languages such as JavaScript. +session.cookie_httponly = + +; Handler used to serialize data. php is the standard serializer of PHP. +session.serialize_handler = php + +; Define the probability that the 'garbage collection' process is started +; on every session initialization. +; The probability is calculated by using gc_probability/gc_divisor, +; e.g. 1/100 means there is a 1% chance that the GC process starts +; on each request. + +session.gc_probability = 1 +session.gc_divisor = 1000 + +; After this number of seconds, stored data will be seen as 'garbage' and +; cleaned up by the garbage collection process. +session.gc_maxlifetime = 1440 + +; NOTE: If you are using the subdirectory option for storing session files +; (see session.save_path above), then garbage collection does *not* +; happen automatically. You will need to do your own garbage +; collection through a shell script, cron entry, or some other method. +; For example, the following script would is the equivalent of +; setting session.gc_maxlifetime to 1440 (1440 seconds = 24 minutes): +; cd /path/to/sessions; find -cmin +24 | xargs rm + +; PHP 4.2 and less have an undocumented feature/bug that allows you to +; to initialize a session variable in the global scope, albeit register_globals +; is disabled. PHP 4.3 and later will warn you, if this feature is used. +; You can disable the feature and the warning separately. At this time, +; the warning is only displayed, if bug_compat_42 is enabled. + +session.bug_compat_42 = 0 +session.bug_compat_warn = 1 + +; Check HTTP Referer to invalidate externally stored URLs containing ids. +; HTTP_REFERER has to contain this substring for the session to be +; considered as valid. +session.referer_check = + +; How many bytes to read from the file. +session.entropy_length = 0 + +; Specified here to create the session id. +session.entropy_file = + +;session.entropy_length = 16 + +;session.entropy_file = /dev/urandom + +; Set to {nocache,private,public,} to determine HTTP caching aspects +; or leave this empty to avoid sending anti-caching headers. +session.cache_limiter = nocache + +; Document expires after n minutes. +session.cache_expire = 180 + +; trans sid support is disabled by default. +; Use of trans sid may risk your users security. +; Use this option with caution. +; - User may send URL contains active session ID +; to other person via. email/irc/etc. +; - URL that contains active session ID may be stored +; in publically accessible computer. +; - User may access your site with the same session ID +; always using URL stored in browser's history or bookmarks. +session.use_trans_sid = 0 + +; Select a hash function +; 0: MD5 (128 bits) +; 1: SHA-1 (160 bits) +session.hash_function = 0 + +; Define how many bits are stored in each character when converting +; the binary hash data to something readable. +; +; 4 bits: 0-9, a-f +; 5 bits: 0-9, a-v +; 6 bits: 0-9, a-z, A-Z, "-", "," +session.hash_bits_per_character = 5 + +; The URL rewriter will look for URLs in a defined set of HTML tags. +; form/fieldset are special; if you include them here, the rewriter will +; add a hidden field with the info which is otherwise appended +; to URLs. If you want XHTML conformity, remove the form entry. +; Note that all valid entries require a "=", even if no value follows. +url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry" + +[MSSQL] +; Allow or prevent persistent links. +mssql.allow_persistent = On + +; Maximum number of persistent links. -1 means no limit. +mssql.max_persistent = -1 + +; Maximum number of links (persistent+non persistent). -1 means no limit. +mssql.max_links = -1 + +; Minimum error severity to display. +mssql.min_error_severity = 10 + +; Minimum message severity to display. +mssql.min_message_severity = 10 + +; Compatibility mode with old versions of PHP 3.0. +mssql.compatability_mode = Off + +; Connect timeout +;mssql.connect_timeout = 5 + +; Query timeout +;mssql.timeout = 60 + +; Valid range 0 - 2147483647. Default = 4096. +;mssql.textlimit = 4096 + +; Valid range 0 - 2147483647. Default = 4096. +;mssql.textsize = 4096 + +; Limits the number of records in each batch. 0 = all records in one batch. +;mssql.batchsize = 0 + +; Specify how datetime and datetim4 columns are returned +; On => Returns data converted to SQL server settings +; Off => Returns values as YYYY-MM-DD hh:mm:ss +;mssql.datetimeconvert = On + +; Use NT authentication when connecting to the server +mssql.secure_connection = Off + +; Specify max number of processes. -1 = library default +; msdlib defaults to 25 +; FreeTDS defaults to 4096 +;mssql.max_procs = -1 + +; Specify client character set. +; If empty or not set the client charset from freetds.comf is used +; This is only used when compiled with FreeTDS +;mssql.charset = "ISO-8859-1" + +[Assertion] +; Assert(expr); active by default. +;assert.active = On + +; Issue a PHP warning for each failed assertion. +;assert.warning = On + +; Don't bail out by default. +;assert.bail = Off + +; User-function to be called if an assertion fails. +;assert.callback = 0 + +; Eval the expression with current error_reporting(). Set to true if you want +; error_reporting(0) around the eval(). +;assert.quiet_eval = 0 + +[COM] +; path to a file containing GUIDs, IIDs or filenames of files with TypeLibs +;com.typelib_file = +; allow Distributed-COM calls +;com.allow_dcom = true +; autoregister constants of a components typlib on com_load() +;com.autoregister_typelib = true +; register constants casesensitive +;com.autoregister_casesensitive = false +; show warnings on duplicate constant registrations +;com.autoregister_verbose = true + +[mbstring] +; language for internal character representation. +;mbstring.language = Japanese + +; internal/script encoding. +; Some encoding cannot work as internal encoding. +; (e.g. SJIS, BIG5, ISO-2022-*) +;mbstring.internal_encoding = EUC-JP + +; http input encoding. +;mbstring.http_input = auto + +; http output encoding. mb_output_handler must be +; registered as output buffer to function +;mbstring.http_output = SJIS + +; enable automatic encoding translation according to +; mbstring.internal_encoding setting. Input chars are +; converted to internal encoding by setting this to On. +; Note: Do _not_ use automatic encoding translation for +; portable libs/applications. +;mbstring.encoding_translation = Off + +; automatic encoding detection order. +; auto means +;mbstring.detect_order = auto + +; substitute_character used when character cannot be converted +; one from another +;mbstring.substitute_character = none; + +; overload(replace) single byte functions by mbstring functions. +; mail(), ereg(), etc are overloaded by mb_send_mail(), mb_ereg(), +; etc. Possible values are 0,1,2,4 or combination of them. +; For example, 7 for overload everything. +; 0: No overload +; 1: Overload mail() function +; 2: Overload str*() functions +; 4: Overload ereg*() functions +;mbstring.func_overload = 0 + +; enable strict encoding detection. +;mbstring.strict_detection = Off + +[FrontBase] +;fbsql.allow_persistent = On +;fbsql.autocommit = On +;fbsql.show_timestamp_decimals = Off +;fbsql.default_database = +;fbsql.default_database_password = +;fbsql.default_host = +;fbsql.default_password = +;fbsql.default_user = "_SYSTEM" +;fbsql.generate_warnings = Off +;fbsql.max_connections = 128 +;fbsql.max_links = 128 +;fbsql.max_persistent = -1 +;fbsql.max_results = 128 + +[gd] +; Tell the jpeg decode to libjpeg warnings and try to create +; a gd image. The warning will then be displayed as notices +; disabled by default +;gd.jpeg_ignore_warning = 0 + +[exif] +; Exif UNICODE user comments are handled as UCS-2BE/UCS-2LE and JIS as JIS. +; With mbstring support this will automatically be converted into the encoding +; given by corresponding encode setting. When empty mbstring.internal_encoding +; is used. For the decode settings you can distinguish between motorola and +; intel byte order. A decode setting cannot be empty. +;exif.encode_unicode = ISO-8859-15 +;exif.decode_unicode_motorola = UCS-2BE +;exif.decode_unicode_intel = UCS-2LE +;exif.encode_jis = +;exif.decode_jis_motorola = JIS +;exif.decode_jis_intel = JIS + +[Tidy] +; The path to a default tidy configuration file to use when using tidy +;tidy.default_config = /usr/local/lib/php/default.tcfg + +; Should tidy clean and repair output automatically? +; WARNING: Do not use this option if you are generating non-html content +; such as dynamic images +tidy.clean_output = Off + +[soap] +; Enables or disables WSDL caching feature. +soap.wsdl_cache_enabled=1 +; Sets the directory name where SOAP extension will put cache files. +soap.wsdl_cache_dir="/tmp" +; (time to live) Sets the number of second while cached file will be used +; instead of original one. +soap.wsdl_cache_ttl=86400 + +; Local Variables: +; tab-width: 4 +; End: \ No newline at end of file diff --git a/vendor/phpstan/phpstan/README.md b/vendor/phpstan/phpstan/README.md index a1e47fdb9..e4953b4a4 100644 --- a/vendor/phpstan/phpstan/README.md +++ b/vendor/phpstan/phpstan/README.md @@ -5,7 +5,7 @@

- Build Status + Build Status Latest Stable Version Total Downloads License @@ -26,13 +26,13 @@ can be checked before you run the actual line. TheCodingMachine     -Private Packagist +Private Packagist
Musement     Blackfire.io
-iO +Intracto     TicketSwap
@@ -40,9 +40,9 @@ can be checked before you run the actual line.     Togetter
-RightCapital +RightCapital     -ContentKing +ContentKing
ZOL     @@ -53,14 +53,6 @@ can be checked before you run the actual line. Craft CMS
Worksome -    -campoint AG -
-Crisp.nl -    -Inviqa -
-Psyonix [**You can now sponsor my open-source work on PHPStan through GitHub Sponsors.**](https://github.com/sponsors/ondrejmirtes) @@ -77,7 +69,6 @@ All the documentation lives on the [phpstan.org website](https://phpstan.org/): * [PHPDocs Basics](https://phpstan.org/writing-php-code/phpdocs-basics) & [PHPDoc Types](https://phpstan.org/writing-php-code/phpdoc-types) * [Extension Library](https://phpstan.org/user-guide/extension-library) * [Developing Extensions](https://phpstan.org/developing-extensions/extension-types) -* [API Reference](https://apiref.phpstan.org/) ## PHPStan Pro diff --git a/vendor/phpstan/phpstan/composer.json b/vendor/phpstan/phpstan/composer.json index 498cc3816..2c9e27962 100644 --- a/vendor/phpstan/phpstan/composer.json +++ b/vendor/phpstan/phpstan/composer.json @@ -3,7 +3,7 @@ "description": "PHPStan - PHP Static Analysis Tool", "license": ["MIT"], "require": { - "php": "^7.2|^8.0" + "php": "^7.1|^8.0" }, "conflict": { "phpstan/phpstan-shim": "*" @@ -12,6 +12,11 @@ "phpstan", "phpstan.phar" ], + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, "autoload": { "files": ["bootstrap.php"] } diff --git a/vendor/phpstan/phpstan/phpstan.phar b/vendor/phpstan/phpstan/phpstan.phar index 34f9e46ce..306020e3a 100755 Binary files a/vendor/phpstan/phpstan/phpstan.phar and b/vendor/phpstan/phpstan/phpstan.phar differ diff --git a/vendor/phpstan/phpstan/phpstan.phar.asc b/vendor/phpstan/phpstan/phpstan.phar.asc index 2c3f9b152..9110c4aa3 100644 --- a/vendor/phpstan/phpstan/phpstan.phar.asc +++ b/vendor/phpstan/phpstan/phpstan.phar.asc @@ -1,16 +1,16 @@ -----BEGIN PGP SIGNATURE----- -iQIzBAABCgAdFiEE0yaA1ZV9xxFr4pwUzxoQjQ565yAFAmLNnFgACgkQzxoQjQ56 -5yBvLA//Y9vKwT9O1c1dWc/vEs2qCRedQLuFYJTJKbwTvqNJwJN5GT1umpsi7KCN -MCoDzfutVkITEVZAYmlEUKowi0U+STYSs52guw6VoepC0eTW+b8VLOREo1UpAASb -VrCvEsRf6xrfslKqWnbl1RNNhBHpn7+UMloZcawEy7Jpp5G7JIGRhmBGQOVkvymA -0+UDw/UiWr+rZFbO5h3JlwFkwRjgzcCVZeNeyrd2oIFKgp8DmN9Kwq6tulGD3V1j -oJJh/8liFQrj3DFUz6yIczZcuTtbGcWmIhTQxtlJJczZyGXlK8aXIqac3/YbBIqo -4tvCgpLJjGQ8WouVUURGy/AXiUJulnBpDGUAmbdWrwDE3oxx2IPJ+OrmtZVcK2Q1 -30+jLvdb5NasGTRV84aB7lLKrifde6qFWaXh+s1b/A8znnjHdFMTvYn2F6/xFWdO -u0GU5wIcLrWMvmQNA7mRPiV8e7KtOoCggCm923TDJ9Ov56ZL5N+iPCW+7TZWOuM9 -L2JLhN26WCZzVn/ODuxpIKzz07UGCTcaKzNFYL/V/+Oly7JEub6nNI90SNHRcOt4 -Iq+EoO8/jW2WZsnBHqP8o88ii9I+DEOYt60csVGVp4sZ3RDgSwXiC5eV0rDvz/0F -32oPtYAe5cRIwVriKhGlLM74eozaLmENgtMLePkclpNarFtdwFg= -=AySM +iQIzBAABCgAdFiEE0yaA1ZV9xxFr4pwUzxoQjQ565yAFAmGKbGQACgkQzxoQjQ56 +5yAy7BAAgT9+V81RuOMz6F16uqm4gXH1ebioWokEvVb6ZR2fk7p3/m14STmmRkwe +MIkxzWKtx/wSC6VafqAtkBPNxpo2j5QU0pmfMAvkPHh79d2lWmUaJmF71I/DCNnh +pcZNJLe5x+YTDKU6NnwMlyZEvdaWmyJ2MCf2apBZIJ7axefEJRVVin2pshhXwbtN +dHhrT9yFYe/vqOkOLtGDWw+yT1I6he7IpoYZUTyO9b7eadC0ga6Bet7jibNL8JBE +cGcB2MFg9bvif0PgIOio0jQXAWjf0ZBXPvoOwTRCqq/UOPTL8SRtiflAFiFOAzk/ +FRQVC0+26NsGx7R8kS5FZNOHYTIElY1ElyzFk8HWgqrYIvzDNLtkJ68178rDJ29f +GyAax4P+gN13biyXQycQHhXDfHN1UytopldiRkitXVFGq92sz6BFgQDLF9yxQOm1 +iL5oxWSVf6rM8AOc3DV9Aa1kCpG6FrZPJ66NBgJLzTpKARzt7CM+M8VQNA/KnHB3 +8Mt0WmAeRORSnBWQksOlnA4VUkxWDGkZGVBWMRist7gghfG7n7HxTAUAk1oo7j2b +/gTwbeOjv/330uZG31e+hCcaj/EcocHvglegWCPMmIhpXqn25TC+87QkGt2wb6z6 +dpzTdy3Pimr5BK2YrN1+Le33CYeHKlc+6XL34BEVebAQ/A9OB/M= +=k3NZ -----END PGP SIGNATURE-----