mirror of
https://gitlab.com/news-flash/article_scraper.git
synced 2025-07-07 16:15:32 +02:00
lots of fixes
This commit is contained in:
parent
11d9657bdd
commit
603b373e0d
15 changed files with 660 additions and 63 deletions
|
@ -27,11 +27,11 @@
|
|||
<p>The most useful, high-level part of the Fetch API is the <code>fetch()</code> function.
|
||||
In its simplest form it takes a URL and returns a promise that resolves
|
||||
to the response. The response is captured as a <code>Response</code> object.</p>
|
||||
<div><table><tbody><tr><td><pre>fetch<span>(</span><span>"/data.json"</span><span>)</span>.<span>then</span><span>(</span><span>function</span><span>(</span>res<span>)</span><span>{</span><span>// res instanceof Response == true.</span><span>if</span><span>(</span>res.<span>ok</span><span>)</span><span>{</span>
|
||||
<div><DIV><pre>fetch<span>(</span><span>"/data.json"</span><span>)</span>.<span>then</span><span>(</span><span>function</span><span>(</span>res<span>)</span><span>{</span><span>// res instanceof Response == true.</span><span>if</span><span>(</span>res.<span>ok</span><span>)</span><span>{</span>
|
||||
res.<span>json</span><span>(</span><span>)</span>.<span>then</span><span>(</span><span>function</span><span>(</span>data<span>)</span><span>{</span>
|
||||
console.<span>log</span><span>(</span>data.<span>entries</span><span>)</span><span>;</span><span>}</span><span>)</span><span>;</span><span>}</span><span>else</span><span>{</span>
|
||||
console.<span>log</span><span>(</span><span>"Looks like the response wasn't perfect, got status"</span><span>,</span> res.<span>status</span><span>)</span><span>;</span><span>}</span><span>}</span><span>,</span><span>function</span><span>(</span>e<span>)</span><span>{</span>
|
||||
console.<span>log</span><span>(</span><span>"Fetch failed!"</span><span>,</span> e<span>)</span><span>;</span><span>}</span><span>)</span><span>;</span></pre></td></tr></tbody></table></div>
|
||||
console.<span>log</span><span>(</span><span>"Fetch failed!"</span><span>,</span> e<span>)</span><span>;</span><span>}</span><span>)</span><span>;</span></pre></DIV></div>
|
||||
<p>Submitting some parameters, it would look like this:</p>
|
||||
<div><table><tbody><tr><td><pre>fetch<span>(</span><span>"http://www.example.org/submit.php"</span><span>,</span><span>{</span>
|
||||
method<span>:</span><span>"POST"</span><span>,</span>
|
||||
|
|
|
@ -65,4 +65,7 @@
|
|||
"Jsme na děleném třetím místě. Lidé se před sezonou hodně ptali, zda to můžeme dokázat znovu. Ukázali jsme, že ano. Ale musíme pokračovat. Tohle musí být náš standard. Nesmíme polevit, pokud chceme být velkým týmem," zdůrazňuje Rice.
|
||||
</p>
|
||||
</div>
|
||||
<p>
|
||||
Pokud jste v článku zaznamenali chybu nebo překlep, dejte nám, prosím, vědět prostřednictvím <a href="https://ankety.aktualne.cz/s3/00310d93156a?utm_source=aktualne.cz&utm_medium=upozorneni&from=https%3A%2F%2Fsport.aktualne.cz%2Ffotbal%2Fzahranici%2Fwest-ham-hrozi-gigantum-okouzlil-i-linekera-souckovu-praci-j%2Fr~8fa032ba3add11ec8a900cc47ab5f122%2F" target="_blank">kontaktního formuláře</a>. Děkujeme!
|
||||
</p>
|
||||
</DIV></article>
|
||||
|
|
|
@ -4,8 +4,7 @@
|
|||
</h4>
|
||||
<h2 itemprop="description">
|
||||
Two-year-old bug exposes thousands of servers to crippling attack.
|
||||
</h2>
|
||||
<section></section></header><section><div itemprop="articleBody">
|
||||
</h2></header><div itemprop="articleBody">
|
||||
<figure><img src="https://cdn.arstechnica.net/wp-content/uploads/2015/04/server-crash-640x426.jpg" alt="Just-released Minecraft exploit makes it easy to crash game servers"><figcaption></figcaption></figure><p>
|
||||
A flaw in the wildly popular online game <em>Minecraft</em> 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.
|
||||
</p>
|
||||
|
@ -48,5 +47,5 @@
|
|||
<p>
|
||||
Ars is asking Mojang for comment and will update this post if company officials respond.
|
||||
</p>
|
||||
</div></section>
|
||||
</div>
|
||||
</div></article>
|
||||
|
|
|
@ -7,9 +7,9 @@
|
|||
<h3></h3>
|
||||
<div>
|
||||
<div><p><img src="https://static.independent.co.uk/s3fs-public/styles/story_medium/public/thumbnails/image/2014/03/18/10/bandb2.jpg" alt="bandb2.jpg" title="bandb2.jpg" width="564" height="423"></p></div>
|
||||
<div><p>Even posh hotels might not wash a blanket in between stays
|
||||
<p>Even posh hotels might not wash a blanket in between stays
|
||||
|
||||
</p></div>
|
||||
</p>
|
||||
</div>
|
||||
<p>1. Take any blankets or duvets off the bed</p>
|
||||
<p>Forrest Jones said that anything that comes into contact with any of the previous guest’s skin should be taken out and washed every time the room is made, but that even the fanciest hotels don’t always do so. "Hotels are getting away from comforters. Blankets are here to stay, however. But some hotels are still hesitant about washing them every day if they think they can get out of it," he said.</p>
|
||||
|
@ -17,22 +17,27 @@
|
|||
<h3></h3>
|
||||
<div>
|
||||
<div><p><img src="https://static.independent.co.uk/s3fs-public/styles/story_medium/public/thumbnails/image/2015/05/26/11/hotel-door-getty.jpg" alt="hotel-door-getty.jpg" title="hotel-door-getty.jpg" width="564" height="423"></p></div>
|
||||
<div><p>Forrest Jones advised stuffing the peep hole with a strip of rolled up notepaper when not in use.
|
||||
<p>Forrest Jones advised stuffing the peep hole with a strip of rolled up notepaper when not in use.
|
||||
|
||||
</p></div>
|
||||
</p>
|
||||
</div>
|
||||
<p>2. Check the peep hole has not been tampered with</p>
|
||||
<p>This is not common, but can happen, Forrest Jones said. He advised stuffing the peep hole with a strip of rolled up notepaper when not in use. When someone knocks on the door, the paper can be removed to check who is there. If no one is visible, he recommends calling the front desk immediately. “I look forward to the day when I can tell you to choose only hotels where every employee who has access to guestroom keys is subjected to a complete public records background check, prior to hire, and every year or two thereafter. But for now, I can't,” he said.</p>
|
||||
<h3></h3>
|
||||
<div><div><p><img src="https://static.independent.co.uk/s3fs-public/styles/story_medium/public/thumbnails/image/2013/07/31/15/luggage-3.jpg" alt="luggage-3.jpg" title="luggage-3.jpg" width="564" height="423"></p></div></div>
|
||||
<div>
|
||||
<div><p><img src="https://static.independent.co.uk/s3fs-public/styles/story_medium/public/thumbnails/image/2013/07/31/15/luggage-3.jpg" alt="luggage-3.jpg" title="luggage-3.jpg" width="564" height="423"></p></div>
|
||||
<p>Put luggage on the floor
|
||||
|
||||
</p>
|
||||
</div>
|
||||
<p>3. Don’t use a wooden luggage rack</p>
|
||||
<p>Bedbugs love wood. Even though a wooden luggage rack might look nicer and more expensive than a metal one, it’s a breeding ground for bugs. Forrest Jones says guests should put the items they plan to take from bags on other pieces of furniture and leave the bag on the floor.</p>
|
||||
<h3></h3>
|
||||
<div>
|
||||
<div><p><img src="https://static.independent.co.uk/s3fs-public/styles/story_medium/public/thumbnails/image/2015/04/13/11/Lifestyle-hotels.jpg" alt="Lifestyle-hotels.jpg" title="Lifestyle-hotels.jpg" width="564" height="423"></p></div>
|
||||
<div><p>The old rule of thumb is that for every 00 invested in a room, the hotel should charge in average daily rate
|
||||
<p>The old rule of thumb is that for every 00 invested in a room, the hotel should charge in average daily rate
|
||||
|
||||
</p></div>
|
||||
</p>
|
||||
</div>
|
||||
<p>4. Hotel rooms are priced according to how expensive they were to build</p>
|
||||
<p>Zeev Sharon said that the old rule of thumb is that for every $1000 invested in a room, the hotel should charge $1 in average daily rate. So a room that cost $300,000 to build, should sell on average for $300/night.</p>
|
||||
|
@ -44,9 +49,9 @@
|
|||
<h3></h3>
|
||||
<div>
|
||||
<div><p><img src="https://static.independent.co.uk/s3fs-public/styles/story_medium/public/thumbnails/image/2014/03/13/16/agenda7.jpg" alt="agenda7.jpg" title="agenda7.jpg" width="564" height="423"></p></div>
|
||||
<div><p>Towels should always be cleaned between stays
|
||||
<p>Towels should always be cleaned between stays
|
||||
|
||||
</p></div>
|
||||
</p>
|
||||
</div>
|
||||
<p>7. Always made sure the hand towels are clean when you arrive</p>
|
||||
<p>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.</p>
|
||||
|
|
|
@ -10,10 +10,20 @@
|
|||
<p>“She was literally burning up from within.”</p>
|
||||
<p>She added: “They never stood a chance of saving her. She burned and crashed.”</p>
|
||||
</div>
|
||||
<div id="superlist_3758406_5547140" rel:buzz_num="3"><div>
|
||||
<div><div><p><img src="http://ak-hdl.buzzfed.com/static/2015-04/21/5/enhanced/webdr12/grid-cell-2501-1429608056-15.jpg" rel:bf_image_src="http://ak-hdl.buzzfed.com/static/2015-04/21/5/enhanced/webdr12/grid-cell-2501-1429608056-15.jpg" height="412" width="203"></p></div></div>
|
||||
<div><div><p><img src="http://ak-hdl.buzzfed.com/static/2015-04/21/5/enhanced/webdr12/grid-cell-2501-1429608057-18.jpg" rel:bf_image_src="http://ak-hdl.buzzfed.com/static/2015-04/21/5/enhanced/webdr12/grid-cell-2501-1429608057-18.jpg" height="412" width="412"></p></div></div>
|
||||
</div></div>
|
||||
<div rel:buzz_num="3" id="superlist_3758406_5547140">
|
||||
<div>
|
||||
<div><p><img src="http://ak-hdl.buzzfed.com/static/2015-04/21/5/enhanced/webdr12/grid-cell-2501-1429608056-15.jpg" rel:bf_image_src="http://ak-hdl.buzzfed.com/static/2015-04/21/5/enhanced/webdr12/grid-cell-2501-1429608056-15.jpg" height="412" width="203"></p></div>
|
||||
<p>Facebook</p>
|
||||
</div>
|
||||
<div>
|
||||
<div>
|
||||
<p><img src="http://ak-hdl.buzzfed.com/static/2015-04/21/5/enhanced/webdr12/grid-cell-2501-1429608057-18.jpg" rel:bf_image_src="http://ak-hdl.buzzfed.com/static/2015-04/21/5/enhanced/webdr12/grid-cell-2501-1429608057-18.jpg" height="412" width="412"></p>
|
||||
<p><a href="javascript:;" rel:gt_act="share/pinterest/pin/list-item:2" rel:bf_bucket_data="{'pin-share':{'id':'3758406_5547140','not_a_sub':true}}" rel:sub_title="" target="_blank"><span></span></a></p>
|
||||
</div>
|
||||
<p>Facebook</p>
|
||||
</div>
|
||||
<P></P>
|
||||
</div>
|
||||
<div id="superlist_3758406_5547284" rel:buzz_num="4">
|
||||
<p>West Mercia police <a href="https://www.westmercia.police.uk/article/9500/Warning-Issued-As-Shrewsbury-Woman-Dies-After-Taking-Suspected-Diet-Pills" target="_blank">said the tablets were believed to contain dinitrophenol</a>, known as DNP, which is a highly toxic industrial chemical. </p>
|
||||
<p>“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.</p>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<article><DIV id="readability-page-1"><td>
|
||||
<article><DIV id="readability-page-1"><DIV>
|
||||
<h3>Study Webtext</h3>
|
||||
<h2>
|
||||
<span face="Lucida Handwriting " color="Maroon
|
||||
|
@ -1366,4 +1366,4 @@
|
|||
errands of life, these letters speed to death.</a></p>
|
||||
<p><a href="javascript:void(0);" onmouseout="nd();" target="_blank">Ah
|
||||
Bartleby! Ah humanity</a>!</p>
|
||||
</td></DIV></article>
|
||||
</DIV></DIV></article>
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -2,9 +2,9 @@
|
|||
<h2>The U.S. has long been heralded as a land of opportunity -- a place where anyone can succeed regardless of the economic class they were born into.</h2>
|
||||
<p> But a new report released on Monday by <a href="http://web.stanford.edu/group/scspi-dev/cgi-bin/" target="_blank">Stanford University's Center on Poverty and Inequality</a> calls that into question. </p>
|
||||
<p> The report assessed poverty levels, income and wealth inequality, economic mobility and unemployment levels among 10 wealthy countries with social welfare programs. </p>
|
||||
<div id="smartassetcontainer"><div><div><div id="smartasset-article"><div><p>
|
||||
<div id="smartassetcontainer"><p>
|
||||
Powered by SmartAsset.com
|
||||
</p></div></div></div></div></div>
|
||||
</p></div>
|
||||
<p> Among its key findings: the class you're born into matters much more in the U.S. than many of the other countries. </p>
|
||||
<p> As the <a href="http://web.stanford.edu/group/scspi-dev/cgi-bin/publications/state-union-report" target="_blank">report states</a>: "[T]he birth lottery matters more in the U.S. than in most well-off countries." </p>
|
||||
<p> But this wasn't the only finding that suggests the U.S. isn't quite living up to its reputation as a country where everyone has an equal chance to get ahead through sheer will and hard work. </p>
|
||||
|
@ -15,5 +15,5 @@
|
|||
<p> The low ranking the U.S. received was due to its extreme levels of wealth and income inequality and the ineffectiveness of its "safety net" -- social programs aimed at reducing poverty. </p>
|
||||
<p><a href="http://money.cnn.com/2016/01/05/news/economy/chicago-segregated/index.html?iid=EL" target="_blank"><span>Related: Chicago is America's most segregated city</span></a></p>
|
||||
<p> The report concluded that the American safety net was ineffective because it provides only half the financial help people need. Additionally, the levels of assistance in the U.S. are generally lower than in other countries. </p>
|
||||
<div><p><span> CNNMoney (New York) </span><span>First published February 1, 2016: 1:28 AM ET</span></p></div>
|
||||
<p><span> CNNMoney (New York) </span><span>First published February 1, 2016: 1:28 AM ET</span></p>
|
||||
</div></article>
|
||||
|
|
|
@ -91,9 +91,9 @@
|
|||
<div><P id="architecture"><h2>
|
||||
Architecture
|
||||
</h2></P></div>
|
||||
<div><div><figure><img src="http://fakehost/cms/content/dam/dropbox/tech-blog/en-us/2020/11/atf/diagrams/Techblog-ATF-720x844px-1.png" aria-hidden="false" alt="Async Task Framework (ATF) [Fig 1]" height="1688" width="1440"><figcaption>
|
||||
<div><figure><img src="http://fakehost/cms/content/dam/dropbox/tech-blog/en-us/2020/11/atf/diagrams/Techblog-ATF-720x844px-1.png" aria-hidden="false" alt="Async Task Framework (ATF) [Fig 1]" height="1688" width="1440"><figcaption>
|
||||
Async Task Framework (ATF) [Fig 1]
|
||||
</figcaption></figure></div></div>
|
||||
</figcaption></figure></div>
|
||||
<div>
|
||||
<p>
|
||||
In this section, we describe the high-level architecture of ATF and give brief description of its different components. (See Fig. 1 above.) In this section, we describe the high-level architecture of ATF and give brief description of its different components. (See Fig. 1 above.) Dropbox <a href="https://dropbox.tech/infrastructure/courier-dropbox-migration-to-grpc" target="_blank">uses gRPC</a> for remote calls and our in-house <a href="https://dropbox.tech/infrastructure/reintroducing-edgestore" target="_blank">Edgestore</a> to store tasks.
|
||||
|
@ -270,7 +270,7 @@
|
|||
<p>
|
||||
Below is the state machine that defines task state transitions: <br></p>
|
||||
</div>
|
||||
<div><div><figure><img src="http://fakehost/cms/content/dam/dropbox/tech-blog/en-us/2020/11/atf/diagrams/Techblog-ATF-720x225px-2.png" aria-hidden="false" alt="Task State Transitions [Fig 2]" height="450" width="1440"></figure></div></div>
|
||||
<div><figure><img src="http://fakehost/cms/content/dam/dropbox/tech-blog/en-us/2020/11/atf/diagrams/Techblog-ATF-720x225px-2.png" aria-hidden="false" alt="Task State Transitions [Fig 2]" height="450" width="1440"></figure></div>
|
||||
<div><P id="-achieving-guarantees"><h2>
|
||||
Achieving guarantees
|
||||
</h2></P></div>
|
||||
|
@ -292,9 +292,9 @@
|
|||
<div><P id="ownership-model"><h2>
|
||||
Ownership model
|
||||
</h2></P></div>
|
||||
<div><p>
|
||||
<p>
|
||||
ATF is designed to be a self-serve framework for developers at Dropbox. The design is very intentional in driving an ownership model where lambda owners own all aspects of their lambdas’ operations. To promote this, all lambda worker clusters are owned by the lambda owners. They have full control over operations on these clusters, including code deployments and capacity management. Each executor process is bound to one lambda. Owners have the option of deploying multiple lambdas on their worker clusters simply by spawning new executor processes on their hosts.
|
||||
</p></div>
|
||||
</p>
|
||||
<div><P id="-extending-atf"><h2>
|
||||
Extending ATF
|
||||
</h2></P></div>
|
||||
|
@ -314,6 +314,6 @@
|
|||
<div><P id="conclusion"><h2>
|
||||
Conclusion
|
||||
</h2></P></div>
|
||||
<div><p>
|
||||
We hope this post helps engineers elsewhere to develop better async task frameworks of their own. Many thanks to everyone who worked on this project: Anirudh Jayakumar, Deepak Gupta, Dmitry Kopytkov, Koundinya Muppalla, Peng Kang, Rajiv Desai, Ryan Armstrong, Steve Rodrigues, Thomissa Comellas, Xiaonan Zhang and Yuhuan Du.<br></p></div>
|
||||
<p>
|
||||
We hope this post helps engineers elsewhere to develop better async task frameworks of their own. Many thanks to everyone who worked on this project: Anirudh Jayakumar, Deepak Gupta, Dmitry Kopytkov, Koundinya Muppalla, Peng Kang, Rajiv Desai, Ryan Armstrong, Steve Rodrigues, Thomissa Comellas, Xiaonan Zhang and Yuhuan Du.<br></p>
|
||||
</div></article>
|
||||
|
|
50
resources/tests/readability/ebb-org/expected.html
Normal file
50
resources/tests/readability/ebb-org/expected.html
Normal file
File diff suppressed because one or more lines are too long
485
resources/tests/readability/ebb-org/source.html
Normal file
485
resources/tests/readability/ebb-org/source.html
Normal file
|
@ -0,0 +1,485 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en-US" xml:lang="en-US" xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
|
||||
<title>
|
||||
On Recent Controversial Events - Bradley M. Kuhn ( Brad ) ( bkuhn )
|
||||
</title>
|
||||
<meta content="Bradley M. Kuhn (http://ebb.org/bkuhn/)" name="author" />
|
||||
<link href="http://ebb.org/bkuhn/rss.xml" rel="alternate" title="Whole Website RSS for Bradley M. Kuhn" type="application/rss+xml" />
|
||||
<link href="http://ebb.org/bkuhn/blog/rss.xml" rel="alternate" title="Blog RSS for Bradley M. Kuhn" type="application/rss+xml" />
|
||||
<link href="http://ebb.org/bkuhn/blog/rss.xml" rel="alternate" title="Articles / Interviews RSS for Bradley M. Kuhn" type="application/rss+xml" />
|
||||
<link href="/css/screen.css" rel="stylesheet" type="text/css" />
|
||||
<link href="mailto:bkuhn@ebb.org" rel="made" />
|
||||
<meta content="kuhn, brad, bradley, bkuhn, hacker, gnu, free, software, linux, unix, perl, liberal, pgp, gpg, geek, system, administrator, network, free software, developer, new york, NY, computer, open source, hacker, software, freedom, software freedom" http-equiv="Keywords" name="Keywords" />
|
||||
<meta content="The website of Bradley M. Kuhn, aka Brad, aka bkuhn. This site includes his GPG keys, resume, blog, projects list, software, interviews, speeches and writing." http-equiv="Description" name="Description" />
|
||||
</head>
|
||||
<body>
|
||||
<div id="site">
|
||||
<div id="sidebar">
|
||||
<div id="title">
|
||||
<p>
|
||||
<a href="/bkuhn">Bradley M. Kuhn</a> <a href="http://ebb.org/bkuhn/rss.xml"><img alt="[RSS of Whole Site]" border="0" src="/images/feed-icon-14x14.png" /></a>
|
||||
</p>
|
||||
</div>
|
||||
<div id="menu">
|
||||
<ul>
|
||||
<li>
|
||||
<a href="/bkuhn/contact">Contact</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/bkuhn/blog">Blog</a>   <a href="http://ebb.org/bkuhn/blog/rss.xml"><img alt="[RSS of Blog]" border="0" src="/images/feed-icon-14x14.png" /></a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="http://identi.ca/bkuhn/">Pump.io Social Network</a>
|
||||
</li><!-- %li= link_to("About", "/bkuhn/about") -->
|
||||
<!-- %li= link_to("Speeches / Talks", "/bkuhn/speeches/") -->
|
||||
<li>
|
||||
<a href="/bkuhn/articles">Interviews / Articles</a>   <a href="http://ebb.org/bkuhn/articles/rss.xml"><img alt="[RSS of Articles]" border="0" src="/images/feed-icon-14x14.png" /></a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/bkuhn/code/">Software</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/bkuhn/resume">Résumé</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<h2>
|
||||
<a href="/bkuhn/tags">Tag</a> Cloud
|
||||
</h2>
|
||||
<ol id="tag-cloud">
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#accounting">accounting</a>
|
||||
</li>
|
||||
<li class="tier-4" title="24 posts">
|
||||
<a href="/bkuhn/tags.html#advocacy">advocacy</a>
|
||||
</li>
|
||||
<li class="tier-4" title="16 posts">
|
||||
<a href="/bkuhn/tags.html#agpl">agpl</a>
|
||||
</li>
|
||||
<li class="tier-3" title="6 posts">
|
||||
<a href="/bkuhn/tags.html#android">android</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#apache">apache</a>
|
||||
</li>
|
||||
<li class="tier-2" title="3 posts">
|
||||
<a href="/bkuhn/tags.html#apple">apple</a>
|
||||
</li>
|
||||
<li class="tier-2" title="3 posts">
|
||||
<a href="/bkuhn/tags.html#apt">apt</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#artistic">artistic</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#asterisk">asterisk</a>
|
||||
</li>
|
||||
<li class="tier-2" title="2 posts">
|
||||
<a href="/bkuhn/tags.html#automotive">automotive</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#autonomous">autonomous</a>
|
||||
</li>
|
||||
<li class="tier-2" title="2 posts">
|
||||
<a href="/bkuhn/tags.html#award">award</a>
|
||||
</li>
|
||||
<li class="tier-2" title="2 posts">
|
||||
<a href="/bkuhn/tags.html#bilski">bilski</a>
|
||||
</li>
|
||||
<li class="tier-2" title="2 posts">
|
||||
<a href="/bkuhn/tags.html#canonical">canonical</a>
|
||||
</li>
|
||||
<li class="tier-3" title="7 posts">
|
||||
<a href="/bkuhn/tags.html#cla">cla</a>
|
||||
</li>
|
||||
<li class="tier-5" title="39 posts">
|
||||
<a href="/bkuhn/tags.html#community">community</a>
|
||||
</li>
|
||||
<li class="tier-3" title="6 posts">
|
||||
<a href="/bkuhn/tags.html#compliance">compliance</a>
|
||||
</li>
|
||||
<li class="tier-4" title="15 posts">
|
||||
<a href="/bkuhn/tags.html#conferences">conferences</a>
|
||||
</li>
|
||||
<li class="tier-5" title="37 posts">
|
||||
<a href="/bkuhn/tags.html#conservancy">conservancy</a>
|
||||
</li>
|
||||
<li class="tier-3" title="8 posts">
|
||||
<a href="/bkuhn/tags.html#copyleft">copyleft</a>
|
||||
</li>
|
||||
<li class="tier-5" title="56 posts">
|
||||
<a href="/bkuhn/tags.html#copyright">copyright</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#cow-orking">cow-orking</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#cpp">cpp</a>
|
||||
</li>
|
||||
<li class="tier-3" title="9 posts">
|
||||
<a href="/bkuhn/tags.html#debian">debian</a>
|
||||
</li>
|
||||
<li class="tier-2" title="3 posts">
|
||||
<a href="/bkuhn/tags.html#denounce">denounce</a>
|
||||
</li>
|
||||
<li class="tier-2" title="4 posts">
|
||||
<a href="/bkuhn/tags.html#development">development</a>
|
||||
</li>
|
||||
<li class="tier-2" title="2 posts">
|
||||
<a href="/bkuhn/tags.html#diversity">diversity</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#emacs">emacs</a>
|
||||
</li>
|
||||
<li class="tier-2" title="4 posts">
|
||||
<a href="/bkuhn/tags.html#encryption">encryption</a>
|
||||
</li>
|
||||
<li class="tier-3" title="10 posts">
|
||||
<a href="/bkuhn/tags.html#enforcement">enforcement</a>
|
||||
</li>
|
||||
<li class="tier-2" title="2 posts">
|
||||
<a href="/bkuhn/tags.html#exceptions">exceptions</a>
|
||||
</li>
|
||||
<li class="tier-2" title="3 posts">
|
||||
<a href="/bkuhn/tags.html#faif">faif</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#fdl">fdl</a>
|
||||
</li>
|
||||
<li class="tier-4" title="11 posts">
|
||||
<a href="/bkuhn/tags.html#for-profit">for-profit</a>
|
||||
</li>
|
||||
<li class="tier-2" title="3 posts">
|
||||
<a href="/bkuhn/tags.html#fosdem">fosdem</a>
|
||||
</li>
|
||||
<li class="tier-4" title="13 posts">
|
||||
<a href="/bkuhn/tags.html#fsf">fsf</a>
|
||||
</li>
|
||||
<li class="tier-2" title="4 posts">
|
||||
<a href="/bkuhn/tags.html#gcc">gcc</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#git">git</a>
|
||||
</li>
|
||||
<li class="tier-4" title="13 posts">
|
||||
<a href="/bkuhn/tags.html#gnome">gnome</a>
|
||||
</li>
|
||||
<li class="tier-3" title="6 posts">
|
||||
<a href="/bkuhn/tags.html#gnu">gnu</a>
|
||||
</li>
|
||||
<li class="tier-2" title="4 posts">
|
||||
<a href="/bkuhn/tags.html#google">google</a>
|
||||
</li>
|
||||
<li class="tier-6" title="107 posts">
|
||||
<a href="/bkuhn/tags.html#gpl">gpl</a>
|
||||
</li>
|
||||
<li class="tier-2" title="2 posts">
|
||||
<a href="/bkuhn/tags.html#gpl-compatibility">gpl-compatibility</a>
|
||||
</li>
|
||||
<li class="tier-5" title="47 posts">
|
||||
<a href="/bkuhn/tags.html#gpl-enforcement">gpl-enforcement</a>
|
||||
</li>
|
||||
<li class="tier-2" title="4 posts">
|
||||
<a href="/bkuhn/tags.html#gplv3">gplv3</a>
|
||||
</li>
|
||||
<li class="tier-2" title="3 posts">
|
||||
<a href="/bkuhn/tags.html#guadec">guadec</a>
|
||||
</li>
|
||||
<li class="tier-2" title="2 posts">
|
||||
<a href="/bkuhn/tags.html#identica">identica</a>
|
||||
</li>
|
||||
<li class="tier-4" title="17 posts">
|
||||
<a href="/bkuhn/tags.html#infringement">infringement</a>
|
||||
</li>
|
||||
<li class="tier-2" title="2 posts">
|
||||
<a href="/bkuhn/tags.html#java">java</a>
|
||||
</li>
|
||||
<li class="tier-2" title="3 posts">
|
||||
<a href="/bkuhn/tags.html#javascript">javascript</a>
|
||||
</li>
|
||||
<li class="tier-2" title="4 posts">
|
||||
<a href="/bkuhn/tags.html#jvm">jvm</a>
|
||||
</li>
|
||||
<li class="tier-2" title="2 posts">
|
||||
<a href="/bkuhn/tags.html#launchpad">launchpad</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#ldap">ldap</a>
|
||||
</li>
|
||||
<li class="tier-2" title="3 posts">
|
||||
<a href="/bkuhn/tags.html#lgpl">lgpl</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#libreoffice">libreoffice</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#libreplanet">libreplanet</a>
|
||||
</li>
|
||||
<li class="tier-6" title="72 posts">
|
||||
<a href="/bkuhn/tags.html#licensing">licensing</a>
|
||||
</li>
|
||||
<li class="tier-2" title="3 posts">
|
||||
<a href="/bkuhn/tags.html#lindows">lindows</a>
|
||||
</li>
|
||||
<li class="tier-4" title="11 posts">
|
||||
<a href="/bkuhn/tags.html#linux">linux</a>
|
||||
</li>
|
||||
<li class="tier-2" title="2 posts">
|
||||
<a href="/bkuhn/tags.html#maemo">maemo</a>
|
||||
</li>
|
||||
<li class="tier-2" title="2 posts">
|
||||
<a href="/bkuhn/tags.html#mail">mail</a>
|
||||
</li>
|
||||
<li class="tier-2" title="2 posts">
|
||||
<a href="/bkuhn/tags.html#meego">meego</a>
|
||||
</li>
|
||||
<li class="tier-4" title="17 posts">
|
||||
<a href="/bkuhn/tags.html#microsoft">microsoft</a>
|
||||
</li>
|
||||
<li class="tier-3" title="6 posts">
|
||||
<a href="/bkuhn/tags.html#mobile">mobile</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#moblin">moblin</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#mono">mono</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#motorola">motorola</a>
|
||||
</li>
|
||||
<li class="tier-2" title="2 posts">
|
||||
<a href="/bkuhn/tags.html#mta">mta</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#mysql">mysql</a>
|
||||
</li>
|
||||
<li class="tier-4" title="13 posts">
|
||||
<a href="/bkuhn/tags.html#net-services">net-services</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#nlp">nlp</a>
|
||||
</li>
|
||||
<li class="tier-2" title="2 posts">
|
||||
<a href="/bkuhn/tags.html#nokia">nokia</a>
|
||||
</li>
|
||||
<li class="tier-4" title="23 posts">
|
||||
<a href="/bkuhn/tags.html#non-profit">non-profit</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#np-complete">np-complete</a>
|
||||
</li>
|
||||
<li class="tier-3" title="7 posts">
|
||||
<a href="/bkuhn/tags.html#open-core">open-core</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#open-foam">open-foam</a>
|
||||
</li>
|
||||
<li class="tier-2" title="4 posts">
|
||||
<a href="/bkuhn/tags.html#oracle">oracle</a>
|
||||
</li>
|
||||
<li class="tier-2" title="4 posts">
|
||||
<a href="/bkuhn/tags.html#parrot">parrot</a>
|
||||
</li>
|
||||
<li class="tier-4" title="16 posts">
|
||||
<a href="/bkuhn/tags.html#patents">patents</a>
|
||||
</li>
|
||||
<li class="tier-3" title="6 posts">
|
||||
<a href="/bkuhn/tags.html#perl">perl</a>
|
||||
</li>
|
||||
<li class="tier-3" title="6 posts">
|
||||
<a href="/bkuhn/tags.html#perljvm">perljvm</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#permissive-license">permissive-license</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#piracy">piracy</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#podcast">podcast</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#podjango">podjango</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#poker">poker</a>
|
||||
</li>
|
||||
<li class="tier-4" title="14 posts">
|
||||
<a href="/bkuhn/tags.html#politics">politics</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#postfix">postfix</a>
|
||||
</li>
|
||||
<li class="tier-4" title="13 posts">
|
||||
<a href="/bkuhn/tags.html#proprietary">proprietary</a>
|
||||
</li>
|
||||
<li class="tier-2" title="3 posts">
|
||||
<a href="/bkuhn/tags.html#qt">qt</a>
|
||||
</li>
|
||||
<li class="tier-2" title="4 posts">
|
||||
<a href="/bkuhn/tags.html#replicant">replicant</a>
|
||||
</li>
|
||||
<li class="tier-2" title="3 posts">
|
||||
<a href="/bkuhn/tags.html#requiem">requiem</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#rtlinux">rtlinux</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#scale">SCALE</a>
|
||||
</li>
|
||||
<li class="tier-3" title="6 posts">
|
||||
<a href="/bkuhn/tags.html#sco">sco</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#scotus">scotus</a>
|
||||
</li>
|
||||
<li class="tier-3" title="5 posts">
|
||||
<a href="/bkuhn/tags.html#security">security</a>
|
||||
</li>
|
||||
<li class="tier-3" title="6 posts">
|
||||
<a href="/bkuhn/tags.html#sexism">sexism</a>
|
||||
</li>
|
||||
<li class="tier-2" title="4 posts">
|
||||
<a href="/bkuhn/tags.html#sflc">sflc</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#slicing">slicing</a>
|
||||
</li>
|
||||
<li class="tier-3" title="7 posts">
|
||||
<a href="/bkuhn/tags.html#social-justice">social-justice</a>
|
||||
</li>
|
||||
<li class="tier-3" title="6 posts">
|
||||
<a href="/bkuhn/tags.html#software">software</a>
|
||||
</li>
|
||||
<li class="tier-6" title="108 posts">
|
||||
<a href="/bkuhn/tags.html#software-freedom">software-freedom</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#speeches">speeches</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#stet">stet</a>
|
||||
</li>
|
||||
<li class="tier-2" title="4 posts">
|
||||
<a href="/bkuhn/tags.html#talks">talks</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#tcl">tcl</a>
|
||||
</li>
|
||||
<li class="tier-2" title="2 posts">
|
||||
<a href="/bkuhn/tags.html#teaching">teaching</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#tech-press">tech-press</a>
|
||||
</li>
|
||||
<li class="tier-5" title="35 posts">
|
||||
<a href="/bkuhn/tags.html#technology">technology</a>
|
||||
</li>
|
||||
<li class="tier-2" title="2 posts">
|
||||
<a href="/bkuhn/tags.html#thesis">thesis</a>
|
||||
</li>
|
||||
<li class="tier-3" title="5 posts">
|
||||
<a href="/bkuhn/tags.html#trademarks">trademarks</a>
|
||||
</li>
|
||||
<li class="tier-3" title="10 posts">
|
||||
<a href="/bkuhn/tags.html#ubuntu">ubuntu</a>
|
||||
</li>
|
||||
<li class="tier-1" title="1 post">
|
||||
<a href="/bkuhn/tags.html#voip">voip</a>
|
||||
</li>
|
||||
<li class="tier-2" title="3 posts">
|
||||
<a href="/bkuhn/tags.html#xen">xen</a>
|
||||
</li>
|
||||
</ol>
|
||||
<h2>
|
||||
Powered by
|
||||
</h2><a href="https://gitorious.org/bkuhn/jekyll/source/HEAD:">A Very Old Fork of Jekyll</a> <a href="https://gitorious.org/bkuhn/website/source/HEAD:">"Source Code" for this site</a>
|
||||
</div>
|
||||
<div id="contentWithSidebar">
|
||||
<div id="post">
|
||||
<h1>
|
||||
On Recent Controversial Events
|
||||
</h1>
|
||||
<p class="topAttributionWithDate">
|
||||
Tuesday 15 October 2019 by Bradley M. Kuhn
|
||||
</p>
|
||||
<p>
|
||||
The last 33 days have been unprecedentedly difficult for the software freedom community and for me personally. Folks have been emailing, phoning, texting, tagging me on social media (— the last of which has been funny, because all my social media accounts are placeholder accounts). But, just about everyone has urged me to comment on the serious issues that the software freedom community now faces. Until now, I have stayed silent regarding all these current topics: from Richard M. Stallman (RMS)'s public statements, to <a href="https://www.fsf.org/news/richard-m-stallman-resigns">his resignation from the Free Software Foundation (FSF)</a>, to the Epstein scandal and its connection to MIT. I've also avoided generally commenting on software freedom organizational governance during this period. I did this for good reason, which is explained below. However, in this blog post, I now share my primary comments on the matters that seem to currently be of the utmost attention of the Open Source and Free Software communities.
|
||||
</p>
|
||||
<p>
|
||||
I have been silent the last month because, until two days ago, I was an at-large member of <a href="https://www.fsf.org/about/staff-and-board">FSF's Board of Directors</a>, and a <a href="https://static.fsf.org/nosvn/fsf-amended-bylaws-current.pdf">Voting Member</a> of the FSF. As a member of FSF's two leadership bodies, I was abiding by a reasonable request from the FSF management and my duty to the organization. Specifically, the FSF asked that all communication during the crisis <a href="https://www.fsf.org/news/richard-m-stallman-resigns">come</a> <a href="https://www.fsf.org/news/fsf-and-gnu">directly</a> from FSF officers and not from at-large directors and/or Voting Members. Furthermore, the FSF management asked all Directors and Voting Members to remain silent on this entire matter — even on issues only tangentially related to the current situation, and even when speaking in our own capacity (e.g., on our own blogs like this one). The FSF is an important organization, and I take any request from the FSF seriously — so I abided fully with their request.
|
||||
</p>
|
||||
<p>
|
||||
The situation was further complicated because folks at my employer, Software Freedom Conservancy (where I also serve on the <a href="https://sfconservancy.org/about/board/#bkuhn">Board of Directors</a>) had strong opinions about this matter as well. Fortunately, the FSF and Conservancy both had already created clear protocols for what I should do if ever there was a disagreement or divergence of views between Conservancy and FSF. I therefore was recused fully from the planning, drafting, and timing of Conservancy's statement on this matter. I thank my colleagues at the Conservancy for working so carefully to keep me entirely outside the loop on their statement and to diligently assure that it was straight-forward for me to manage any potential organizational disagreements. I also thank those at the FSF who outlined clear protocols (ahead of time, back in March 2019) in case a situation like this ever came up. I also know my colleagues at Conservancy care deeply, as I do, about the health and welfare of the FSF and its mission of fighting for universal software freedom for all. None of us want, nor have, any substantive disagreement over software freedom issues.
|
||||
</p>
|
||||
<p>
|
||||
I take very seriously my duty to the various organizations where I have (or have had) affiliations. More generally, I champion non-profit organizational transparency. Unfortunately, the current crisis left me in a quandary between the overarching goal of community transparency and abiding by FSF management's directives. Now that I've left the FSF Board of Directors, FSF's Voting Membership, and all my FSF volunteer roles (which ends my 22-year uninterrupted affiliation with the FSF), I can now comment on the substantive issues that face not just the FSF, but the Free Software community as a whole, while continuing to adhere to my past duty of acting in FSF's best interest. In other words, my affiliation with the FSF has come to an end for many good and useful reasons. The end to this affiliation allows me to speak directly about the core issues at the heart of the community's current crisis.
|
||||
</p>
|
||||
<p>
|
||||
Firstly, all these events — from RMS' public comments on the MIT mailing list, to RMS' resignation from the FSF to RMS' discussions about the next steps for the GNU project — <em>seem</em> to many to have happened ridiculously quickly. But it wasn't actually fast at all. In fact, these events were culmination of issues that were slowly growing in concern to many people, including me.
|
||||
</p>
|
||||
<p>
|
||||
For the last two years, I had been a loud internal voice in the FSF leadership regarding RMS' Free-Software-unrelated public statements; I felt strongly that it was in the best interest of the FSF to actively seek to limit such statements, and that it was my duty to FSF to speak out about this within the organization. Those who only learned of this story in the last month (understandably) believed <a href="https://medium.com/@selamjie/remove-richard-stallman-fec6ec210794">Selam G.'s Medium post</a> raised an entirely new issue. <a href="https://web.archive.org/web/20161107050933/https://www.stallman.org/archives/2016-jul-oct.html#31_October_2016_(Down's_syndrome)">In</a> <a href="https://web.archive.org/web/20170202025227/https://www.stallman.org/archives/2016-nov-feb.html#14_December_2016_(Campaign_of_bull-headed_prudery)">fact</a>, <a href="https://web.archive.org/web/20170224174306/https://www.stallman.org/archives/2016-nov-feb.html#23_February_2017_(A_violent_sex_offender)">RMS'</a> <a href="https://web.archive.org/web/20170612074722/http://stallman.org/archives/2017-mar-jun.html#26_May_2017_(Prudish_ignorantism)">views</a> <a href="https://web.archive.org/web/20170616044924/https://www.stallman.org/archives/2017-mar-jun.html#13_June_2017_(Sex_offender_registry)">and</a> <a href="https://web.archive.org/web/20171020041022/http://stallman.org/archives/2017-jul-oct.html#10_October_2017_(Laws_against_having_sex_with_an_animal)">statements</a> <a href="https://web.archive.org/web/20180131020215/https://stallman.org/archives/2017-jul-oct.html#29_October_2017_(Pestering_women)">posted</a> <a href="https://web.archive.org/web/20180104112431/https://www.stallman.org/archives/2017-nov-feb.html#27_November_2017_(Roy_Moore's_relationships)">on</a> <a href="https://web.archive.org/web/20180509120046/https://stallman.org/archives/2018-mar-jun.html#30_April_2018_(UN_peacekeepers_in_South_Sudan)">stallman.org</a> <a href="https://web.archive.org/web/20180911075211/https://www.stallman.org/archives/2018-jul-oct.html#17_July_2018_(The_bullshitter's_flirting)">about</a> <a href="https://web.archive.org/web/20180911075211/https://www.stallman.org/archives/2018-jul-oct.html#21_August_2018_(Age_and_attraction)">sexual</a> <a href="https://web.archive.org/web/20180924231708/https://stallman.org/archives/2018-jul-oct.html#23_September_2018_(Cody_Wilson)">morality</a> <a href="https://web.archive.org/web/20180919100154/https://stallman.org/antiglossary.html#assult">escalated</a> <a href="https://web.archive.org/web/20181113161736/https://www.stallman.org/archives/2018-sep-dec.html#6_November_2018_(Sex_according_to_porn)">for</a> <a href="https://web.archive.org/web/20190325024048/https://stallman.org/archives/2019-jan-apr.html#14_February_2019_(Respecting_peoples_right_to_say_no)">the</a> <a href="https://www.stallman.org/archives/2019-may-aug.html#11_June_2019_(Stretching_meaning_of_terms)">worse</a> <a href="https://web.archive.org/web/20190801201704/https://stallman.org/archives/2019-may-aug.html#12_June_2019_(Declining_sex_rates)">over</a> <a href="https://web.archive.org/web/20190801201704/https://stallman.org/archives/2019-may-aug.html#30_July_2019_(Al_Franken)">the</a> <a href="https://web.archive.org/web/20190903050208/https://stallman.org/archives/2019-jul-oct.html#27_August_2019_(Me-too_frenzy)">last</a> <a href="https://web.archive.org/web/20191011023557/https://stallman.org/archives/2019-jul-oct.html#21_September_2019_(Sex_workers)">few</a> <a href="https://web.archive.org/web/20180924231708/https://stallman.org/archives/2018-jul-oct.html#23_September_2018_(Cody_Wilson)">years</a>. When the escalation started, I still considered RMS both a friend and colleague, and I attempted to argue with him at length to convince him that some of his positions were harmful to sexual assault survivors and those who are sex trafficked, and to the people who devote their lives in service to such individuals. More importantly to the FSF, I attempted to persuade RMS that launching a controversial campaign on sexual behavior and morality was counter to his and FSF's mission to advance software freedom, and told RMS that my duty as an FSF Director was to assure the best outcome for the FSF, which <acronym title="in my opinion">IMO</acronym> didn't include having a leader who made such statements. Not only is human sexual behavior not a topic on which RMS has adequate academic expertise, but also his positions appear to ignore significant research and widely available information on the subject. Many of his comments, while occasionally politically intriguing, lack empathy for people who experienced trauma.
|
||||
</p>
|
||||
<p>
|
||||
IMO, this is not and has never been a Free Speech issue. I do believe freedom of speech links directly to software freedom: indeed, I see the freedom to publish software under Free licenses as almost a corollary to the freedom of speech. However, we do not need to follow leadership from those whose views we fundamentally disagree. Moreover, organizations need not and should not elevate spokespeople and leaders who speak regularly on unrelated issues that organizations find do not advance their mission, and/or that alienate important constituents. I, like many other software freedom leaders, curtail my public comments on issues not related to <acronym title="Free and Open Source Software">FOSS</acronym>. (Indeed, I would not even be commenting on <em>this issue</em> if it had not become a central issue of concern to the software freedom community.) Leaders have power, and they must exercise the power of their words with <a href="https://lwn.net/Articles/770966/">restraint, not with impunity</a>.
|
||||
</p>
|
||||
<p>
|
||||
RMS has consistently argued that there was a campaign of “prudish intimidation” — seeking to keep him quiet about his views on sexuality. After years of conversing with RMS about how his non-software-freedom views were a distraction, an indulgence, and downright problematic, his general response was to make even more public comments of this nature. The issue is not about RMS' right to say what he believes, nor is it even about whether or not you agree or disagree with RMS' statements. The question is whether an organization should have a designated leader who is on a sustained, public campaign advocating about an unrelated issue that many consider controversial. It really doesn't matter what your view about the controversial issue is; a leader who refuses to stop talking loudly about unrelated issues eventually creates an untenable distraction from the radical activism you're actively trying to advance. The message of universal software freedom is a radical cause; it's basically impossible for one individual to effectively push forward two unrelated controversial agendas at once. In short, the radical message of software freedom became overshadowed by RMS' radical views about sexual morality.
|
||||
</p>
|
||||
<p>
|
||||
And here is where I say the thing that may infuriate many but it's what I believe: I think RMS took a useful step by resigning some of his leadership roles at the FSF. I thank RMS for taking that step, and I wish the FSF Directors well in their efforts to assure that the FSF becomes a welcoming organization to all who care about universal software freedom. The <a href="https://www.fsf.org/about/">FSF's mission</a> is essential to our technological future, and we should all support that mission. I care deeply about that mission myself and have worked and will continue to work in our community in the best interest of the mission.
|
||||
</p>
|
||||
<p>
|
||||
I'm admittedly struggling to find a way to work again with RMS, given his views on sexual morality and his behaviors stemming from those views. I explicitly do not agree with <a href="https://web.archive.org/web/20180919100154/https://stallman.org/antiglossary.html#assult">this “(re-)definition” of sexual assault</a>. Furthermore, I believe uninformed statements about sexual assault are irresponsible and cause harm to victims. #MeToo is <strong><a href="https://web.archive.org/web/20190903050208/https://stallman.org/archives/2019-jul-oct.html#27_August_2019_(Me-too_frenzy)">not a “frenzy”</a></strong>; it is a global movement by individuals who have been harmed seeking to hold both bad actors <em>and</em> society-at-large accountable for ignoring systemic wrongs. Nevertheless, I still am proud of the <a href="https://www.gnu.org/philosophy/freedom-or-power.en.html">essay that I co-wrote with RMS</a> and still find <a href="https://www.gnu.org/gnu/manifesto.en.html">many</a> <a href="https://www.gnu.org/philosophy/free-sw.html">of</a> <a href="https://www.gnu.org/philosophy/why-free.html">RMS'</a> <a href="https://www.gnu.org/philosophy/pragmatic.html">other</a> <a href="https://www.gnu.org/philosophy/microsoft-old.html">essays</a> <a href="https://www.gnu.org/philosophy/gpl-american-way.html">compelling</a>, <a href="https://www.gnu.org/licenses/why-not-lgpl.html">important</a>, <a href="https://www.gnu.org/philosophy/stallman-kth.en.html">and</a> <a href="https://www.gnu.org/philosophy/who-does-that-server-really-serve.en.html">relevant</a>.
|
||||
</p>
|
||||
<p>
|
||||
I want the FSF to succeed in its mission and enter a new era of accomplishments. I've spent the last 22 years, without a break, dedicating substantial time, effort, care and loyalty to the various FSF roles that I've had: including employee, volunteer, at-large Director, and Voting Member. Even though my duties to the FSF are done, and my relationship with the FSF is no longer formal, I still think the FSF is a valuable institution worth helping and saving, specifically because the FSF was founded for a mission that I deeply support. And we should also realize that RMS — a human being (who is flawed like the rest of us) — invented that mission.
|
||||
</p>
|
||||
<p>
|
||||
As culture change becomes more rapid, I hope we can find reasonable nuance and moderation on our complex analysis about people and their disparate views, while we also hold individuals fully accountable for their actions. That's the difficulty we face in the post-post-modern culture of the early twenty-first century. Most importantly, I believe we must find a way to stand firm for software freedom while also making a safe environment for victims of sexual assault, sexual abuse, gaslighting, and other deplorable actions.
|
||||
</p>
|
||||
<p class="bottomAttributionWithDate">
|
||||
Posted on Tuesday 15 October 2019 at 09:11 by Bradley M. Kuhn.
|
||||
</p>
|
||||
<p class="comments">
|
||||
Submit comments on this post to <a href="mailto:bkuhn@ebb.org"><bkuhn@ebb.org></a>.
|
||||
</p>
|
||||
<div id="prevlink">
|
||||
<a class="previous" href="/bkuhn/blog/2019/05/23/github-sponsors.html">← <strong>Previous</strong>: Chasing Quick Fixes To Sustainability</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<p id="footer"></p>
|
||||
<hr />
|
||||
<br />
|
||||
<p>
|
||||
<a href="http://creativecommons.org/licenses/by-sa/3.0/us/" rel="license"><img alt="Creative Commons License" src="http://i.creativecommons.org/l/by-sa/3.0/us/88x31.png" style="border-width:10" /></a> This website and all documents on it are licensed under a <a href="http://creativecommons.org/licenses/by-sa/3.0/us/" rel="license">Creative Commons Attribution-Share Alike 3.0 United States License</a> .
|
||||
</p>
|
||||
<hr />
|
||||
<p>
|
||||
<code>#include <std/disclaimer.h></code><br />
|
||||
<code>use Standard::Disclaimer;</code><br />
|
||||
<code>from standard import disclaimer</code><br />
|
||||
<code>SELECT full_text FROM standard WHERE type = 'disclaimer';</code>
|
||||
</p>
|
||||
<p>
|
||||
Both previously and presently, I have been employed by and/or done work for various organizations that also have views on Free, Libre, and Open Source Software. As should be blatantly obvious, this is my website, not theirs, so please do not assume views and opinions here belong to any such organization. Since I do co-own ebb.org with my wife, it may not be so obvious that these aren't her views and opinions, either.
|
||||
</p>
|
||||
<p align="right">
|
||||
— bkuhn
|
||||
</p>
|
||||
<hr />
|
||||
<p>
|
||||
ebb <sup>℠</sup> is a service mark of Bradley M. Kuhn.
|
||||
</p>
|
||||
<address>
|
||||
<a href="http://ebb.org/bkuhn/">Bradley M. Kuhn</a> <a href="mailto:bkuhn@ebb.org"><bkuhn@ebb.org></a>
|
||||
</address>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
|
@ -857,11 +857,46 @@ impl FullTextParser {
|
|||
Self::simplify_nested_elements(&mut root)?;
|
||||
|
||||
Self::remove_extra_p_and_div(&mut root);
|
||||
Self::remove_single_cell_tables(&mut root);
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn remove_single_cell_tables(root: &mut Node) {
|
||||
let mut node_iter = Some(root.clone());
|
||||
|
||||
while let Some(node) = node_iter {
|
||||
let tag_name = node.get_name().to_uppercase();
|
||||
if tag_name == "TABLE" {
|
||||
|
||||
let t_body = if Util::has_single_tag_inside_element(&node, "TBODY") { node.get_child_elements().drain(..).next().unwrap() } else { node.clone() };
|
||||
if Util::has_single_tag_inside_element(&t_body, "TR") {
|
||||
let row = t_body.get_child_elements().first().cloned();
|
||||
if let Some(row) = row {
|
||||
if Util::has_single_tag_inside_element(&row, "TD") {
|
||||
let cell = row.get_child_elements().first().cloned();
|
||||
if let Some(mut cell) = cell {
|
||||
let all_phrasing_content = cell.get_child_elements()
|
||||
.into_iter()
|
||||
.all(|child| Util::is_phrasing_content(&child));
|
||||
cell.set_name(if all_phrasing_content { "P" } else { "DIV" }).unwrap();
|
||||
if let Some(mut parent) = node.get_parent() {
|
||||
node_iter = Util::next_node(&node, false);
|
||||
parent.replace_child_node(cell, node.clone()).unwrap();
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
node_iter = Util::next_node(&node, false);
|
||||
}
|
||||
}
|
||||
|
||||
fn remove_extra_p_and_div(root: &mut Node) {
|
||||
let mut node_iter = Some(root.clone());
|
||||
|
||||
|
@ -948,6 +983,9 @@ impl FullTextParser {
|
|||
log::error!("{e}");
|
||||
FullTextParserError::Xml
|
||||
})?;
|
||||
|
||||
node_iter = Util::next_node(&parent, false);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@ mod tests;
|
|||
|
||||
use std::cmp::Ordering;
|
||||
|
||||
use libxml::tree::{Document, Node, NodeType};
|
||||
use libxml::tree::{Document, Node};
|
||||
|
||||
use self::state::State;
|
||||
use super::error::FullTextParserError;
|
||||
|
@ -121,7 +121,7 @@ impl Readability {
|
|||
// Put phrasing content into paragraphs.
|
||||
let mut p: Option<Node> = None;
|
||||
for mut child in node_ref.get_child_nodes().into_iter() {
|
||||
if Self::is_phrasing_content(&child) {
|
||||
if Util::is_phrasing_content(&child) {
|
||||
if let Some(p) = p.as_mut() {
|
||||
child.unlink();
|
||||
p.add_child(&mut child).map_err(|error| {
|
||||
|
@ -165,7 +165,7 @@ impl Readability {
|
|||
if Util::has_single_tag_inside_element(node_ref, "P")
|
||||
&& Util::get_link_density(node_ref) < 0.25
|
||||
{
|
||||
if let Some(new_node) = node_ref.get_child_nodes().first() {
|
||||
if let Some(new_node) = node_ref.get_first_element_child() {
|
||||
if let Some(mut parent) = node_ref.get_parent() {
|
||||
parent
|
||||
.replace_child_node(new_node.clone(), node_ref.clone())
|
||||
|
@ -188,6 +188,18 @@ impl Readability {
|
|||
node = Util::next_node(node_ref, false);
|
||||
}
|
||||
|
||||
let html = document.to_string_with_options(libxml::tree::SaveOptions {
|
||||
format: true,
|
||||
no_declaration: false,
|
||||
no_empty_tags: true,
|
||||
no_xhtml: false,
|
||||
xhtml: false,
|
||||
as_xml: false,
|
||||
as_html: true,
|
||||
non_significant_whitespace: false,
|
||||
});
|
||||
std::fs::write("debug.html", &html).unwrap();
|
||||
|
||||
let mut candidates = Vec::new();
|
||||
// Loop through all paragraphs, and assign a score to them based on how content-y they look.
|
||||
// Then add their score to their parent node.
|
||||
|
@ -340,18 +352,6 @@ impl Readability {
|
|||
let mut parent_of_top_candidate = top_candidate.get_parent();
|
||||
let mut last_score = Self::get_content_score(&top_candidate).unwrap_or(0.0);
|
||||
|
||||
// let html = document.to_string_with_options(libxml::tree::SaveOptions {
|
||||
// format: true,
|
||||
// no_declaration: false,
|
||||
// no_empty_tags: true,
|
||||
// no_xhtml: false,
|
||||
// xhtml: false,
|
||||
// as_xml: false,
|
||||
// as_html: true,
|
||||
// non_significant_whitespace: false,
|
||||
// });
|
||||
// std::fs::write("doc.html", &html).unwrap();
|
||||
|
||||
// The scores shouldn't get too low.
|
||||
let score_threshold = last_score / 3.0;
|
||||
|
||||
|
@ -647,19 +647,6 @@ impl Readability {
|
|||
}
|
||||
}
|
||||
|
||||
fn is_phrasing_content(node: &Node) -> bool {
|
||||
let tag_name = node.get_name().to_uppercase();
|
||||
let is_text_node = node
|
||||
.get_type()
|
||||
.map(|t| t == NodeType::TextNode)
|
||||
.unwrap_or(false);
|
||||
|
||||
is_text_node
|
||||
|| constants::PHRASING_ELEMS.contains(&tag_name.as_str())
|
||||
|| ((tag_name == "A" || tag_name == "DEL" || tag_name == "INS")
|
||||
&& node.get_child_nodes().iter().all(Self::is_phrasing_content))
|
||||
}
|
||||
|
||||
// Initialize a node with the readability object. Also checks the
|
||||
// className/id for special names to add to its score.
|
||||
fn initialize_node(node: &mut Node, state: &State) -> Result<(), FullTextParserError> {
|
||||
|
|
|
@ -171,6 +171,11 @@ async fn dropbox_blog() {
|
|||
run_test("dropbox-blog").await
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn ebbb_org() {
|
||||
run_test("ebb-org").await
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn webmd_1() {
|
||||
run_test("webmd-1").await
|
||||
|
|
17
src/util.rs
17
src/util.rs
|
@ -381,9 +381,9 @@ impl Util {
|
|||
|
||||
pub fn has_single_tag_inside_element(node: &Node, tag: &str) -> bool {
|
||||
// There should be exactly 1 element child with given tag
|
||||
if node.get_child_nodes().len() != 1
|
||||
if node.get_child_elements().len() != 1
|
||||
|| node
|
||||
.get_child_nodes()
|
||||
.get_child_elements()
|
||||
.first()
|
||||
.map(|n| n.get_name().to_uppercase() != tag)
|
||||
.unwrap_or(false)
|
||||
|
@ -774,4 +774,17 @@ impl Util {
|
|||
|
||||
(rows, columns)
|
||||
}
|
||||
|
||||
pub fn is_phrasing_content(node: &Node) -> bool {
|
||||
let tag_name = node.get_name().to_uppercase();
|
||||
let is_text_node = node
|
||||
.get_type()
|
||||
.map(|t| t == NodeType::TextNode)
|
||||
.unwrap_or(false);
|
||||
|
||||
is_text_node
|
||||
|| constants::PHRASING_ELEMS.contains(&tag_name.as_str())
|
||||
|| ((tag_name == "A" || tag_name == "DEL" || tag_name == "INS")
|
||||
&& node.get_child_nodes().iter().all(Self::is_phrasing_content))
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue