retire ofswiki
authorIan Kelling <iank@fsf.org>
Tue, 6 Aug 2019 03:40:25 +0000 (23:40 -0400)
committerIan Kelling <iank@fsf.org>
Tue, 6 Aug 2019 03:40:25 +0000 (23:40 -0400)
_site/technical-notes.html [new file with mode: 0644]
_site/technical-notes/router-arris-sb8200-source-code.html [new file with mode: 0644]
_site/technical-notes/setup.py-uninstall.html [new file with mode: 0644]
about-me.html
b.rb
blog/2014-08-01-publishing-my-technical-notes.md
blog/2014-08-07-python-uninstall.md
build.rb
index.html
technical-notes/router-arris-sb8200-source-code.md [new file with mode: 0644]
technical-notes/setup.py-uninstall.md [new file with mode: 0644]

diff --git a/_site/technical-notes.html b/_site/technical-notes.html
new file mode 100644 (file)
index 0000000..282a861
--- /dev/null
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html lang="en-US">
+  <head>
+    <meta charset="utf-8">
+    <title>iankelling/technical-notes</title>
+    <link rel="stylesheet" href="/css/main.css">
+    <link rel="shortcut icon" href="/assets/favicon.png" />
+    <meta name="description" content="Ian Kelling's personal site and blog on software">
+<link rel="canonical" href="https://iankelling.org/technical-notes.html">
+
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+  </head>
+  <body>
+    <header class="page_header">
+      <h3><a href="/">iankelling.org</a> / <a href="/technical-notes.html">technical-notes</a></h3>
+    </header>
+    <div class="main-content-stripe">
+      <div class="content">
+        <ul class="site-nav-list">
+  <li><a href="/technical-notes/router-arris-sb8200-source-code.html">router arris sb8200 source code</a></li>
+<li><a href="/technical-notes/setup.py-uninstall.html">setup.py uninstall</a></li>
+</ul>
+
+      </div>
+    </div>
+    <div class="comment-stripe">
+
+    </div>
+    <footer>
+
+      <p>Sources in <a href="/git/?p=iankelling.org;a=summary">git</a>. Mostly markdown files. Default is <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"><img class="cc-by-sa" alt="Creative Commons License" src="/assets/cc-by-sa-4.0-80x15.png" /></a></p>
+      <p><address><a href="mailto:ian@iankelling.org">ian@iankelling.org</a> let me know what you think</address></p>
+    </footer>
+  </body>
+</html>
diff --git a/_site/technical-notes/router-arris-sb8200-source-code.html b/_site/technical-notes/router-arris-sb8200-source-code.html
new file mode 100644 (file)
index 0000000..67f7923
--- /dev/null
@@ -0,0 +1,127 @@
+<!DOCTYPE html>
+<html lang="en-US">
+  <head>
+    <meta charset="utf-8">
+    <title>router arris sb8200 source code</title>
+    <link rel="stylesheet" href="/css/main.css">
+    <link rel="shortcut icon" href="/assets/favicon.png" />
+    <meta name="description" content="Ian Kelling's personal site and blog on software">
+<link rel="canonical" href="https://iankelling.org//technical-notes/router-arris-sb8200-source-code.html">
+
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+  </head>
+  <body>
+    <header class="page_header">
+      <h3><a href="/">iankelling.org</a> / <a href="/technical-notes.html">technical notes</a> /</h3>
+    </header>
+    <div class="main-content-stripe">
+      <div class="prose">
+        <h1>router arris sb8200 source code</h1><b>Contents</b><p>The arris sb8200 source code is not on sourceforge with the rest of
+their products as of July 2017 to August 2019. This model only came out
+in 2017. I&#39;ve copied this from the web interface of the modem and
+publishing it here since I do not see it anywhere else online. At the
+bottom, there are a bunch of license texts and copyright holder notices
+that I&#39;ve omitted.</p>
+<div class="highlight"><pre>Open Source Software Information
+
+For instructions on how to obtain a copy of any source code being made publicly available by ARRIS related to software used in this ARRIS product you may send your request in writing to:
+
+   ARRIS
+   Software Pedigree Operations
+   2450 Walsh Avenue
+   Santa Clara, CA 95051
+   USA
+
+The ARRIS website opensource.arris.com also contains information regarding ARRIS&#39;s use of open source. ARRIS has created the opensource.arris.com to serve as a portal for interaction with the software community-at-large.
+This document contains additional information regarding licenses, acknowledgements and required copyright notices for open source packages used in this ARRIS product.
+
+
+
+
+
+Component   Version     License
+BSOpen Source Components Included in the BFC/CXC Packages
+OpenSSH     4.0p1   BSD Style (OpenSSH) License
+eCos    2.0     eCos License
+Kerberos    V5 Rel 1.5.1    MIT License
+Mongoose Web Server     3.0     MIT License
+dygraphs    1.2     MIT License
+EXPAT   1.95.8  MIT License
+aRes DNS    1.1.0   MIT License
+NetSNMP     5.0.9   NetSNMP License
+OpenSSL     1.0.1k  OpenSSL License and the original SSLeay License
+MD5 Message-Digest Algorithm    N/A     RSA MD5 License
+Fast CRC32  N/A     Richard Black Fast CRC32 License
+SFL - The Standard Function Library     N/A     SFL iMatix License
+nameser.h   8.1     The Regents of the University of California
+regex   N/A     University of Toronto License
+STUN Client and Server Library  0.96    Vovida Software License 1.0
+KAME IPv6 Stack     N/A     WIDE Project License
+traceroute  N/A     WIDE Project License
+traceroute6     1.42    WIDE Project License
+TinyXML     N/A     zlib License
+List of Open Source Included in the Linux eRouter and Residential Gateway
+axis2/c     1.6.0   Apache License 2.0
+base64  0.00.00B    base64 License
+map (Yyatta ASAMAP)     3/14/2014   BEER-WARE License
+YUI Compressor  2.4.7   BSD License
+tcpdump     3.9     BSD License
+Dropbear sshd   0.46    Dropbear License
+gptfdisk    0.8.7   GPL
+ifenslave   1.1.0   GPL
+bridge-utils    1.2     GPLv2
+conntrack-tools Includes:libnetfilter,libnetflink   0.9.14  GPLv2
+dbus    1.4.14  GPLv2 or The Academic Free License version 2.1
+ebtables    2.0.10-4    GPLv2
+iproute2    iproute2-ss140804   GPLv2
+udhcp   0.9.6   GPLv2
+zebra   0.93    GPLv2
+binutils    2.23    GPLv2
+cortex  0.1     GPLv2
+sqlite3     8.6     GPLv2
+e2fsprogs   1.41.14     GPLv2
+mtdutils    1.0     GPLv2
+ethtool     3.15    GPLv2
+bash    3.2     GPLv2
+busybox     1.21.1  GPLv2
+eglibc  2.18    GPLv2
+Linux   3.14    GPLv2
+iptables    1.6.0   GPLv2e
+iperf   2.0.0   iperf License
+avahi   0.6.30  LGPLv2.1
+libdaemon   0.14    LGPLv2.1
+dnsmasq     1.8     LGPLv2
+procps  3.2.7   LGPLv2
+i2c-tools   3.1.1   LGPLv2
+wdmd    2.2     LGPLv2
+libxml2     N/A     MIT License
+jsonc   0.12    MIT License
+jquery  v1.10.2     MIT license
+jQuery Color Animations     v2.1.2  MIT license
+Sizzle CSS Selector Engine  v1.10.2     MIT License
+expat   2.0.1   MIT/X Consortium license
+Net SNMP    5.7.2   NetSNMP License
+nodejs  v0.10.12    Node&#39;s license
+openssl     1.0.1j  OpenSSL License and the original SSLeay license
+radvd   1.0     radvd License
+strace  4.5.20  strace License
+portmap     1.6     The Regents of the University of California.
+DHCPv6  1.2     WIDE Project License
+
+
+
+
+License     License Text
+</pre></div>
+      </div>
+    </div>
+    <div class="comment-stripe">
+
+    </div>
+    <footer>
+
+      <p>Sources in <a href="/git/?p=iankelling.org;a=summary">git</a>. Mostly markdown files. Default is <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"><img class="cc-by-sa" alt="Creative Commons License" src="/assets/cc-by-sa-4.0-80x15.png" /></a></p>
+      <p><address><a href="mailto:ian@iankelling.org">ian@iankelling.org</a> let me know what you think</address></p>
+    </footer>
+  </body>
+</html>
diff --git a/_site/technical-notes/setup.py-uninstall.html b/_site/technical-notes/setup.py-uninstall.html
new file mode 100644 (file)
index 0000000..5c87018
--- /dev/null
@@ -0,0 +1,84 @@
+<!DOCTYPE html>
+<html lang="en-US">
+  <head>
+    <meta charset="utf-8">
+    <title>setup.py uninstall</title>
+    <link rel="stylesheet" href="/css/main.css">
+    <link rel="shortcut icon" href="/assets/favicon.png" />
+    <meta name="description" content="Ian Kelling's personal site and blog on software">
+<link rel="canonical" href="https://iankelling.org//technical-notes/setup.py-uninstall.html">
+
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+  </head>
+  <body>
+    <header class="page_header">
+      <h3><a href="/">iankelling.org</a> / <a href="/technical-notes.html">technical notes</a> /</h3>
+    </header>
+    <div class="main-content-stripe">
+      <div class="prose">
+        <h1>setup.py uninstall</h1><b>Contents</b><ul>
+<li>
+<a href="#unix-like">Unix-like</a>
+</li>
+<li>
+<a href="#windows">Windows</a>
+</li>
+<li>
+<a href="#use-other-methods-which-fully-support-uninstall-when-available">Use other methods which fully support uninstall when available</a>
+</li>
+</ul>
+<h2 id="unix-like">Unix-like</h2>
+
+<p>Install over the existing installation with the same sources, recording installed files, then delete them.</p>
+<div class="highlight"><pre>sudo python setup.py install --record files.txt
+<span class="c1"># inspect files.txt to make sure it looks ok. Then in bash:</span>
+tr <span class="s1">&#39;\n&#39;</span> <span class="s1">&#39;\0&#39;</span> &lt; files.txt <span class="p">|</span> xargs -0 sudo rm -f --
+</pre></div>
+<h2 id="windows">Windows</h2>
+
+<p>Install on top of the existing installation with a windows installer, then add-remove programs to uninstall.</p>
+<div class="highlight"><pre>python setup.py bdist_wininst
+dist/foo-1.0.win32.exe
+</pre></div>
+<h2 id="use-other-methods-which-fully-support-uninstall-when-available">Use other methods which fully support uninstall when available</h2>
+
+<p>Uninstalling setup.py install has some <em>inherent problems</em>, which usually aren&#39;t a problem:</p>
+
+<ul>
+<li>Files which a different package also depends on will be removed by uninstall</li>
+<li>Can&#39;t remove installed directories. --record only records non-directory files.</li>
+<li>If a file is installed which includes a newline, the command this page
+recommends will fail. This won&#39;t happen except for a rare bug or a
+malicious program. We could overcome this by using bdist_dumb, then
+removing the files found in the archive which that command
+builds. However, I&#39;m no more confident of that command not having a
+bug or edge case in which it would produce different files than a
+normal install than I am of a package having a file with a newline in
+it.</li>
+</ul>
+
+<h3 id="alternatives">Alternatives</h3>
+
+<ul>
+<li>pip</li>
+<li>python setup.py install bdist_rpm</li>
+<li>python setup.py bdist_wininst</li>
+<li><a href="https://packaging.python.org/">official python recommendations</a></li>
+</ul>
+
+<p>This page is also at <a href="http://stackoverflow.com/a/25209129/14456">stackoverflow answer</a>.</p>
+
+<p>TODO: contribute this under https://wiki.python.org/moin/Distutils/Cookbook.</p>
+
+      </div>
+    </div>
+    <div class="comment-stripe">
+
+    </div>
+    <footer>
+
+      <p>Sources in <a href="/git/?p=iankelling.org;a=summary">git</a>. Mostly markdown files. Default is <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"><img class="cc-by-sa" alt="Creative Commons License" src="/assets/cc-by-sa-4.0-80x15.png" /></a></p>
+      <p><address><a href="mailto:ian@iankelling.org">ian@iankelling.org</a> let me know what you think</address></p>
+    </footer>
+  </body>
+</html>
index 786a96f8931da8d41805bbf32e352fd13d8b55bf..d0b94cea33f81ad31cba0a9b5c29e560d4d94003 100644 (file)
@@ -11,7 +11,6 @@
 
 <h4>Other online activities</h4>
 <ul>
-    <li><a href="https://ofswiki.org">ofswiki.org (wiki I run, mostly covering mediawiki admin)</a></li>
     <li><a href="https://github.com/ian-kelling/">GitHub profile</a></li>
     <li><a href="https://gitlab.com/iankelling">GitLab profile</a></li>
     <li><a href="https://directory.fsf.org/wiki/User:IanK">Free Software
diff --git a/b.rb b/b.rb
index 4bd8f96d0c187dbe365073f90ccad5a9b544c5e4..10006899d147b963817a1b36450da7af066aef9c 100644 (file)
--- a/b.rb
+++ b/b.rb
@@ -95,7 +95,7 @@ EOF
     </div>
     <footer>
 #{o[:footer]}
-      <p>This site has a <a href="/git/?p=iankelling.org;a=summary">git repo</a>. Unless stated otherwise, <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"><img class="cc-by-sa" alt="Creative Commons License" src="/assets/cc-by-sa-4.0-80x15.png" /></a></p>
+      <p>Sources in <a href="/git/?p=iankelling.org;a=summary">git</a>. Mostly markdown files. Default is <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"><img class="cc-by-sa" alt="Creative Commons License" src="/assets/cc-by-sa-4.0-80x15.png" /></a></p>
       <p><address><a href="mailto:ian@iankelling.org">ian@iankelling.org</a> let me know what you think</address></p>
     </footer>
   </body>
@@ -128,7 +128,7 @@ EOF
     # I tried putting the time,  %I:%M %p UTC, but it looks kinda
     # clunky, going against my simple theme.
     user_input = Redcarpet::Markdown.new(Redcarpet::Render::Safe,
-                                   fenced_code_blocks: true).render(comment)
+                                         fenced_code_blocks: true).render(comment)
     <<EOF
 <div class="comment">
   #{user_input}
@@ -137,6 +137,31 @@ EOF
 EOF
   end
 
+
+  def techpost(file)
+
+    b = File.basename(file,'.md')
+    # double dash for one dash, single dash for space
+    title = b.gsub(/--|-/, '--' => '-', '-' => ' ')
+
+    md = File.read(file)
+    page_html = "<h1>#{title}</h1><b>Contents</b>"
+    renderer = Redcarpet::Render::HTML_TOC.new(nesting_level: 2)
+    page_html += Redcarpet::Markdown.new(renderer, fenced_code_blocks: true).render(md)
+
+    renderer = HTMLwithPygments.new(with_toc_data: true)
+    page_html += Redcarpet::Markdown.new(renderer, fenced_code_blocks: true).render(md)
+
+    header_rel = ' / <a href="/technical-notes.html">technical notes</a> /'
+    fskel("/technical-notes/#{b}.html", title, page_html,
+          header: header_rel,
+          prose: true)
+
+    technotes_index_entry = "<li><a href=\"/technical-notes/#{b}.html\">#{title}</a></li>"
+    return technotes_index_entry
+
+  end
+
   def post(file, build_time=false)
     content = File.read(file)
     content =~ %r{\A(---\s*\n.*?\n?)^((---)\s*$\n?)}m # yaml front matter
@@ -190,7 +215,9 @@ SQL
         # Small enough that it won't happen at my site's scale.
         File.write(File.join(comment_file_dir, c_date.to_s), c)
       end
-      # https://piwik.org/docs/privacy/ says keep logs for 3-6 months
+      # Im slow at updating this site, it gets low traffic,
+      # https://piwik.org/docs/privacy/ suggests 3-6 months, so
+      # this cant be too bad.
       $db.execute("delete from c where date < #{NOW - DAY*180}")
     end
     comments = old_comments + comments
index 7733f3c65a3e1a0cb5d3e9dfab61f8e614e3764e..aab2af0db4d9753de7d446070e4194c27393cdca 100644 (file)
@@ -14,7 +14,8 @@ opinionatedness / style that official documentation does not generally
 afford. One very common and annoying practice of people who do good
 writing on technical topics is to use a blog or site which doesn't
 invite collaboration and improvement by others. So... I've started
-[ofswiki.org](https://ofswiki.org).
+[ofswiki.org](https://ofswiki.org) (update Aug 2019, Ive retired
+it. blog post forthcoming).
 
 It's really easy to setup a basic Mediawiki instance. Of course, I had to geek
 out on it. That process became the [first
index 8564c2ba06267298f9fe3040ffd4828d830bbe30..40bb917cee0685c947901aec769e77379bc0a40d 100644 (file)
@@ -12,4 +12,4 @@ What it doesn't say is that it will silently fail / delete the wrong files when
 
 It’s pretty standard fair: uninstall has spotty support across a great many installation technologies. I won't try to draw some broad conclusion.
 
-Instead, I wrote a [comprehensive wiki page on Uninstalling setup.py install](https://ofswiki.org/wiki/Uninstalling_setup.py_install).
+Instead, I wrote a [comprehensive wiki page on Uninstalling setup.py install](/technical-notes/setup.py-uninstall.html).
index d16f7da91b7beeee11de976b390d3c5dbd986466..4867a2542f3df139f75787e5664aec28bfe29ad5 100755 (executable)
--- a/build.rb
+++ b/build.rb
@@ -58,6 +58,18 @@ FileUtils.mkdir_p('../comments/blog')
 FileUtils.chmod_R(0777, '../comments')
 
 
+technotes_list = []
+Dir.glob('../technical-notes/*.md').sort.each do |file|
+  technotes_list << techpost(file)
+end
+
+stdpage('technical-notes', <<EOF)
+<ul class="site-nav-list">
+  #{technotes_list.join("\n")}
+</ul>
+EOF
+
+
 # main reference doc https://validator.w3.org/feed/docs/atom.html
 # Reference doc says updated  should be last time it changed
 # but jekyll's rss feed just uses current time, which is easier to get,
index 43a44a17a8bdf8afc360aa22a66a7e634b1e552f..c30e7edf8cf3b62eab8d7ef8ad9a0a913ca7dc7e 100644 (file)
@@ -1,4 +1,5 @@
 <ul class="site-nav-list">
+  <li><a href="/technical-notes.html">technical notes</a></li>
   <li><a href="/blog.html">blog</a></li>
   <li><a href="/git">gitweb</a></li>
   <!-- <li><a href="resume.html">resume</a></li> -->
diff --git a/technical-notes/router-arris-sb8200-source-code.md b/technical-notes/router-arris-sb8200-source-code.md
new file mode 100644 (file)
index 0000000..5959274
--- /dev/null
@@ -0,0 +1,102 @@
+The arris sb8200 source code is not on sourceforge with the rest of
+their products as of July 2017 to August 2019. This model only came out
+in 2017. I've copied this from the web interface of the modem and
+publishing it here since I do not see it anywhere else online. At the
+bottom, there are a bunch of license texts and copyright holder notices
+that I've omitted.
+
+
+```
+
+Open Source Software Information
+
+For instructions on how to obtain a copy of any source code being made publicly available by ARRIS related to software used in this ARRIS product you may send your request in writing to:
+
+   ARRIS
+   Software Pedigree Operations
+   2450 Walsh Avenue
+   Santa Clara, CA 95051
+   USA
+
+The ARRIS website opensource.arris.com also contains information regarding ARRIS's use of open source. ARRIS has created the opensource.arris.com to serve as a portal for interaction with the software community-at-large.
+This document contains additional information regarding licenses, acknowledgements and required copyright notices for open source packages used in this ARRIS product.
+
+
+
+
+
+Component      Version         License
+BSOpen Source Components Included in the BFC/CXC Packages
+OpenSSH        4.0p1   BSD Style (OpenSSH) License
+eCos   2.0     eCos License
+Kerberos       V5 Rel 1.5.1    MIT License
+Mongoose Web Server    3.0     MIT License
+dygraphs       1.2     MIT License
+EXPAT  1.95.8  MIT License
+aRes DNS       1.1.0   MIT License
+NetSNMP        5.0.9   NetSNMP License
+OpenSSL        1.0.1k  OpenSSL License and the original SSLeay License
+MD5 Message-Digest Algorithm   N/A     RSA MD5 License
+Fast CRC32     N/A     Richard Black Fast CRC32 License
+SFL - The Standard Function Library    N/A     SFL iMatix License
+nameser.h      8.1     The Regents of the University of California
+regex  N/A     University of Toronto License
+STUN Client and Server Library         0.96    Vovida Software License 1.0
+KAME IPv6 Stack        N/A     WIDE Project License
+traceroute     N/A     WIDE Project License
+traceroute6    1.42    WIDE Project License
+TinyXML        N/A     zlib License
+List of Open Source Included in the Linux eRouter and Residential Gateway
+axis2/c        1.6.0   Apache License 2.0
+base64         0.00.00B        base64 License
+map (Yyatta ASAMAP)    3/14/2014       BEER-WARE License
+YUI Compressor         2.4.7   BSD License
+tcpdump        3.9     BSD License
+Dropbear sshd  0.46    Dropbear License
+gptfdisk       0.8.7   GPL
+ifenslave      1.1.0   GPL
+bridge-utils   1.2     GPLv2
+conntrack-tools Includes:libnetfilter,libnetflink      0.9.14  GPLv2
+dbus   1.4.14  GPLv2 or The Academic Free License version 2.1
+ebtables       2.0.10-4        GPLv2
+iproute2       iproute2-ss140804       GPLv2
+udhcp  0.9.6   GPLv2
+zebra  0.93    GPLv2
+binutils       2.23    GPLv2
+cortex         0.1     GPLv2
+sqlite3        8.6     GPLv2
+e2fsprogs      1.41.14         GPLv2
+mtdutils       1.0     GPLv2
+ethtool        3.15    GPLv2
+bash   3.2     GPLv2
+busybox        1.21.1  GPLv2
+eglibc         2.18    GPLv2
+Linux  3.14    GPLv2
+iptables       1.6.0   GPLv2e
+iperf  2.0.0   iperf License
+avahi  0.6.30  LGPLv2.1
+libdaemon      0.14    LGPLv2.1
+dnsmasq        1.8     LGPLv2
+procps         3.2.7   LGPLv2
+i2c-tools      3.1.1   LGPLv2
+wdmd   2.2     LGPLv2
+libxml2        N/A     MIT License
+jsonc  0.12    MIT License
+jquery         v1.10.2         MIT license
+jQuery Color Animations        v2.1.2  MIT license
+Sizzle CSS Selector Engine     v1.10.2         MIT License
+expat  2.0.1   MIT/X Consortium license
+Net SNMP       5.7.2   NetSNMP License
+nodejs         v0.10.12        Node's license
+openssl        1.0.1j  OpenSSL License and the original SSLeay license
+radvd  1.0     radvd License
+strace         4.5.20  strace License
+portmap        1.6     The Regents of the University of California.
+DHCPv6         1.2     WIDE Project License
+
+
+
+
+License        License Text
+
+```
diff --git a/technical-notes/setup.py-uninstall.md b/technical-notes/setup.py-uninstall.md
new file mode 100644 (file)
index 0000000..dc8d056
--- /dev/null
@@ -0,0 +1,44 @@
+## Unix-like
+
+Install over the existing installation with the same sources, recording installed files, then delete them.
+
+``` sh
+sudo python setup.py install --record files.txt
+# inspect files.txt to make sure it looks ok. Then in bash:
+tr '\n' '\0' < files.txt | xargs -0 sudo rm -f --
+```
+
+## Windows
+
+Install on top of the existing installation with a windows installer, then add-remove programs to uninstall.
+
+``` sh
+python setup.py bdist_wininst
+dist/foo-1.0.win32.exe
+```
+
+## Use other methods which fully support uninstall when available
+
+Uninstalling setup.py install has some *inherent problems*, which usually aren't a problem:
+
+- Files which a different package also depends on will be removed by uninstall
+- Can't remove installed directories. --record only records non-directory files.
+- If a file is installed which includes a newline, the command this page
+  recommends will fail. This won't happen except for a rare bug or a
+  malicious program. We could overcome this by using bdist_dumb, then
+  removing the files found in the archive which that command
+  builds. However, I'm no more confident of that command not having a
+  bug or edge case in which it would produce different files than a
+  normal install than I am of a package having a file with a newline in
+  it.
+
+### Alternatives
+
+* pip
+* python setup.py install bdist_rpm
+* python setup.py bdist_wininst
+* [official python recommendations](https://packaging.python.org/)
+
+This page is also at [stackoverflow answer](http://stackoverflow.com/a/25209129/14456).
+
+TODO: contribute this under https://wiki.python.org/moin/Distutils/Cookbook.