You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spark.apache.org by ho...@apache.org on 2017/10/25 08:01:23 UTC

spark-website git commit: Remove use of s3 cloudfront mirror for downloads; other minor fixes

Repository: spark-website
Updated Branches:
  refs/heads/asf-site bdb87e97c -> 853627da6


Remove use of s3 cloudfront mirror for downloads; other minor fixes


Project: http://git-wip-us.apache.org/repos/asf/spark-website/repo
Commit: http://git-wip-us.apache.org/repos/asf/spark-website/commit/853627da
Tree: http://git-wip-us.apache.org/repos/asf/spark-website/tree/853627da
Diff: http://git-wip-us.apache.org/repos/asf/spark-website/diff/853627da

Branch: refs/heads/asf-site
Commit: 853627da67322b6b57d7c3b8ddc9fc150576a4fc
Parents: bdb87e9
Author: Sean Owen <so...@cloudera.com>
Authored: Tue Oct 24 10:57:20 2017 +0100
Committer: Holden Karau <ho...@us.ibm.com>
Committed: Wed Oct 25 00:58:53 2017 -0700

----------------------------------------------------------------------
 downloads.md              |  9 ++---
 js/downloads.js           | 81 ++++++++++--------------------------------
 site/downloads.html       |  6 +---
 site/js/downloads.js      | 81 ++++++++++--------------------------------
 site/release-process.html | 28 ++++++++++-----
 5 files changed, 60 insertions(+), 145 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/spark-website/blob/853627da/downloads.md
----------------------------------------------------------------------
diff --git a/downloads.md b/downloads.md
index bf96c5e..df2ad9d 100644
--- a/downloads.md
+++ b/downloads.md
@@ -22,12 +22,9 @@ $(document).ready(function() {
 2. Choose a package type:
   <select id="sparkPackageSelect" onChange="javascript:onPackageSelect();"></select><br>
 
-3. Choose a download type:
-  <select id="sparkDownloadSelect" onChange="javascript:onDownloadSelect()"></select><br>
+3. Download Spark: <span id="spanDownloadLink"></span>
 
-4. Download Spark: <span id="spanDownloadLink"></span>
-
-5. Verify this release using the <span id="sparkDownloadVerify"></span> and [project release KEYS](https://www.apache.org/dist/spark/KEYS).
+4. Verify this release using the <span id="sparkDownloadVerify"></span> and [project release KEYS](https://www.apache.org/dist/spark/KEYS).
 
 _Note: Starting version 2.0, Spark is built with Scala 2.11 by default.
 Scala 2.10 users should download the Spark source package and build
@@ -62,7 +59,7 @@ If you are interested in working with the newest under-development code or contr
     # Master development branch
     git clone git://github.com/apache/spark.git
 
-    # 2.1 maintenance branch with stability fixes on top of Spark 2.2.0
+    # Maintenance branch with stability fixes on top of Spark 2.2.0
     git clone git://github.com/apache/spark.git -b branch-2.2
 
 Once you've downloaded Spark, you can find instructions for installing and building it on the <a href="{{site.baseurl}}/documentation.html">documentation page</a>.

http://git-wip-us.apache.org/repos/asf/spark-website/blob/853627da/js/downloads.js
----------------------------------------------------------------------
diff --git a/js/downloads.js b/js/downloads.js
index 3b9a81d..675d24c 100644
--- a/js/downloads.js
+++ b/js/downloads.js
@@ -11,7 +11,7 @@ var sources = {pretty: "Source Code", tag: "sources"};
 var hadoopFree = {pretty: "Pre-build with user-provided Apache Hadoop", tag: "without-hadoop"};
 var hadoop1 = {pretty: "Pre-built for Apache Hadoop 1.X", tag: "hadoop1"};
 var cdh4 = {pretty: "Pre-built for CDH 4", tag: "cdh4"};
-var hadoop2 = {pretty: "Pre-built for Apache Hadoop 2.2", tag: "hadoop2"};
+//var hadoop2 = {pretty: "Pre-built for Apache Hadoop 2.2", tag: "hadoop2"};
 var hadoop2p3 = {pretty: "Pre-built for Apache Hadoop 2.3", tag: "hadoop2.3"};
 var hadoop2p4 = {pretty: "Pre-built for Apache Hadoop 2.4", tag: "hadoop2.4"};
 var hadoop2p6 = {pretty: "Pre-built for Apache Hadoop 2.6", tag: "hadoop2.6"};
@@ -24,10 +24,6 @@ var packagesV7 = [hadoop2p7, hadoop2p6, hadoop2p4, hadoop2p3, hadoopFree, source
 // 2.2.0+
 var packagesV8 = [hadoop2p7, hadoop2p6, hadoopFree, sources]
 
-// addRelease("2.0.0-preview", new Date("05/24/2016"), sources.concat(packagesV7), true, false);
-
-//addRelease("2.2.0", new Date("x/x/2017"), packagesV8, true);
-
 addRelease("2.2.0", new Date("07/11/2017"), packagesV8, true);
 addRelease("2.1.2", new Date("10/09/2017"), packagesV7, true);
 addRelease("2.1.1", new Date("05/02/2017"), packagesV7, true);
@@ -35,33 +31,16 @@ addRelease("2.1.0", new Date("12/28/2016"), packagesV7, true);
 addRelease("2.0.2", new Date("11/14/2016"), packagesV7, true);
 addRelease("2.0.1", new Date("10/03/2016"), packagesV7, true);
 addRelease("2.0.0", new Date("07/26/2016"), packagesV7, true);
+//addRelease("2.0.0-preview", new Date("05/24/2016"), sources.concat(packagesV7), true, false);
 addRelease("1.6.3", new Date("11/07/2016"), packagesV6, true);
 addRelease("1.6.2", new Date("06/25/2016"), packagesV6, true);
 addRelease("1.6.1", new Date("03/09/2016"), packagesV6, true);
 addRelease("1.6.0", new Date("01/04/2016"), packagesV6, true);
-addRelease("1.5.2", new Date("11/09/2015"), packagesV6, true);
-addRelease("1.5.1", new Date("10/02/2015"), packagesV6, true);
-addRelease("1.5.0", new Date("9/09/2015"), packagesV6, true);
-addRelease("1.4.1", new Date("7/15/2015"), packagesV6, true);
-addRelease("1.4.0", new Date("6/11/2015"), packagesV6, true);
-// addRelease("1.3.1", new Date("4/17/2015"), packagesV5, true, true);
-// addRelease("1.3.0", new Date("3/13/2015"), packagesV4, true, true);
-// addRelease("1.2.2", new Date("4/17/2015"), packagesV4, true, true);
-// addRelease("1.2.1", new Date("2/9/2015"), packagesV4, true, true);
-// addRelease("1.2.0", new Date("12/18/2014"), packagesV4, true, true);
-// addRelease("1.1.1", new Date("11/26/2014"), packagesV4, true, true);
-// addRelease("1.1.0", new Date("9/11/2014"), packagesV4, true, true);
-// addRelease("1.0.2", new Date("8/5/2014"), packagesV3, true, true);
-// addRelease("1.0.1", new Date("7/11/2014"), packagesV3, false, true);
-// addRelease("1.0.0", new Date("5/30/2014"), packagesV2, false, true);
-// addRelease("0.9.2", new Date("7/23/2014"), packagesV2, true, true);
-// addRelease("0.9.1", new Date("4/9/2014"), packagesV2, false, true);
-// addRelease("0.9.0-incubating", new Date("2/2/2014"), packagesV2, false, true);
-// addRelease("0.8.1-incubating", new Date("12/19/2013"), packagesV2, true, true);
-// addRelease("0.8.0-incubating", new Date("9/25/2013"), packagesV1, true, true);
-// addRelease("0.7.3", new Date("7/16/2013"), packagesV1, true, true);
-// addRelease("0.7.2", new Date("2/6/2013"), packagesV1, false, true);
-// addRelease("0.7.0", new Date("2/27/2013"), [sources], false, true);
+//addRelease("1.5.2", new Date("11/09/2015"), packagesV6, true);
+//addRelease("1.5.1", new Date("10/02/2015"), packagesV6, true);
+//addRelease("1.5.0", new Date("9/09/2015"), packagesV6, true);
+//addRelease("1.4.1", new Date("7/15/2015"), packagesV6, true);
+//addRelease("1.4.0", new Date("6/11/2015"), packagesV6, true);
 
 function append(el, contents) {
   el.innerHTML += contents;
@@ -137,69 +116,45 @@ function onVersionSelect() {
     append(packageSelect, option);
   }
 
-  var href = "https://www.apache.org/dist/spark/spark-" + version + "/";
+  var href = "https://archive.apache.org/dist/spark/spark-" + version + "/";
   var link = "<a href=\"" + href + "\">" + versionShort(version) + " signatures and checksums</a>";
   append(verifyLink, link);
 
   // Populate releases
-  onPackageSelect();
-  updateDownloadLink();
-}
-
-function onPackageSelect() {
-  var downloadSelect = document.getElementById("sparkDownloadSelect");
-  var packageSelect = document.getElementById("sparkPackageSelect");
-
-  empty(downloadSelect);
-
-  var pkg = getSelectedValue(packageSelect);
-
-  append(downloadSelect, "<option value='direct'>Direct Download</option>");
-  append(downloadSelect, "<option value='apache'>Select Apache Mirror</option>");
-  updateDownloadLink();
-}
-
-function onDownloadSelect() {
   updateDownloadLink();
 }
 
 function updateDownloadLink() {
   var versionSelect = document.getElementById("sparkVersionSelect");
   var packageSelect = document.getElementById("sparkPackageSelect");
-  var downloadSelect = document.getElementById("sparkDownloadSelect");
   var downloadLink = document.getElementById("spanDownloadLink");
 
   empty(downloadLink);
 
   var version = getSelectedValue(versionSelect);
   var pkg = getSelectedValue(packageSelect);
-  var download = getSelectedValue(downloadSelect);
-
 
   var artifactName = "spark-$ver-bin-$pkg.tgz"
     .replace(/\$ver/g, version)
     .replace(/\$pkg/g, pkg)
     .replace(/-bin-sources/, ""); // special case for source packages
 
-  var link = "https://d3kbcqa49mib13.cloudfront.net/$artifact";
-  if (download == "apache") {
-    if (version < "1.6.3" ||
-        (version >= "2.0.0" && version <= "2.0.1") ||
-        (version >= "2.1.0" && version <= "2.1.0")) {
-      link = "https://archive.apache.org/dist/spark/spark-$ver/$artifact";
-    } else {
-      link = "https://www.apache.org/dyn/closer.lua/spark/spark-$ver/$artifact";
-    }
+  var link = "";
+  if (version < "1.6.3" ||
+      (version >= "2.0.0" && version <= "2.0.1") ||
+      (version >= "2.1.0" && version <= "2.1.1")) {
+    link = "https://archive.apache.org/dist/spark/spark-$ver/$artifact";
+  } else {
+    link = "https://www.apache.org/dyn/closer.lua/spark/spark-$ver/$artifact";
   }
   link = link
     .replace(/\$ver/, version)
     .replace(/\$artifact/, artifactName);
   var text = link.split("/").reverse()[0];
 
-  var onClick = "trackOutboundLink(this, 'Release Download Links', " +
-    "'$download_$artifact'); return false;"
-      .replace(/\$download/, download)
-      .replace(/\$artifact/, artifactName);
+  var onClick =
+    "trackOutboundLink(this, 'Release Download Links', 'apache_$artifact'); return false;"
+    .replace(/\$artifact/, artifactName);
 
   var contents = "<a href=\"" + link + "\" onClick=\"" + onClick + "\">" + text + "</a>";
   append(downloadLink, contents);

http://git-wip-us.apache.org/repos/asf/spark-website/blob/853627da/site/downloads.html
----------------------------------------------------------------------
diff --git a/site/downloads.html b/site/downloads.html
index 3f919b3..c8bb6c3 100644
--- a/site/downloads.html
+++ b/site/downloads.html
@@ -213,10 +213,6 @@ $(document).ready(function() {
   <select id="sparkPackageSelect" onchange="javascript:onPackageSelect();"></select><br /></p>
   </li>
   <li>
-    <p>Choose a download type:
-  <select id="sparkDownloadSelect" onchange="javascript:onDownloadSelect()"></select><br /></p>
-  </li>
-  <li>
     <p>Download Spark: <span id="spanDownloadLink"></span></p>
   </li>
   <li>
@@ -258,7 +254,7 @@ version: 2.2.0
 <pre><code># Master development branch
 git clone git://github.com/apache/spark.git
 
-# 2.1 maintenance branch with stability fixes on top of Spark 2.2.0
+# Maintenance branch with stability fixes on top of Spark 2.2.0
 git clone git://github.com/apache/spark.git -b branch-2.2
 </code></pre>
 

http://git-wip-us.apache.org/repos/asf/spark-website/blob/853627da/site/js/downloads.js
----------------------------------------------------------------------
diff --git a/site/js/downloads.js b/site/js/downloads.js
index 3b9a81d..675d24c 100644
--- a/site/js/downloads.js
+++ b/site/js/downloads.js
@@ -11,7 +11,7 @@ var sources = {pretty: "Source Code", tag: "sources"};
 var hadoopFree = {pretty: "Pre-build with user-provided Apache Hadoop", tag: "without-hadoop"};
 var hadoop1 = {pretty: "Pre-built for Apache Hadoop 1.X", tag: "hadoop1"};
 var cdh4 = {pretty: "Pre-built for CDH 4", tag: "cdh4"};
-var hadoop2 = {pretty: "Pre-built for Apache Hadoop 2.2", tag: "hadoop2"};
+//var hadoop2 = {pretty: "Pre-built for Apache Hadoop 2.2", tag: "hadoop2"};
 var hadoop2p3 = {pretty: "Pre-built for Apache Hadoop 2.3", tag: "hadoop2.3"};
 var hadoop2p4 = {pretty: "Pre-built for Apache Hadoop 2.4", tag: "hadoop2.4"};
 var hadoop2p6 = {pretty: "Pre-built for Apache Hadoop 2.6", tag: "hadoop2.6"};
@@ -24,10 +24,6 @@ var packagesV7 = [hadoop2p7, hadoop2p6, hadoop2p4, hadoop2p3, hadoopFree, source
 // 2.2.0+
 var packagesV8 = [hadoop2p7, hadoop2p6, hadoopFree, sources]
 
-// addRelease("2.0.0-preview", new Date("05/24/2016"), sources.concat(packagesV7), true, false);
-
-//addRelease("2.2.0", new Date("x/x/2017"), packagesV8, true);
-
 addRelease("2.2.0", new Date("07/11/2017"), packagesV8, true);
 addRelease("2.1.2", new Date("10/09/2017"), packagesV7, true);
 addRelease("2.1.1", new Date("05/02/2017"), packagesV7, true);
@@ -35,33 +31,16 @@ addRelease("2.1.0", new Date("12/28/2016"), packagesV7, true);
 addRelease("2.0.2", new Date("11/14/2016"), packagesV7, true);
 addRelease("2.0.1", new Date("10/03/2016"), packagesV7, true);
 addRelease("2.0.0", new Date("07/26/2016"), packagesV7, true);
+//addRelease("2.0.0-preview", new Date("05/24/2016"), sources.concat(packagesV7), true, false);
 addRelease("1.6.3", new Date("11/07/2016"), packagesV6, true);
 addRelease("1.6.2", new Date("06/25/2016"), packagesV6, true);
 addRelease("1.6.1", new Date("03/09/2016"), packagesV6, true);
 addRelease("1.6.0", new Date("01/04/2016"), packagesV6, true);
-addRelease("1.5.2", new Date("11/09/2015"), packagesV6, true);
-addRelease("1.5.1", new Date("10/02/2015"), packagesV6, true);
-addRelease("1.5.0", new Date("9/09/2015"), packagesV6, true);
-addRelease("1.4.1", new Date("7/15/2015"), packagesV6, true);
-addRelease("1.4.0", new Date("6/11/2015"), packagesV6, true);
-// addRelease("1.3.1", new Date("4/17/2015"), packagesV5, true, true);
-// addRelease("1.3.0", new Date("3/13/2015"), packagesV4, true, true);
-// addRelease("1.2.2", new Date("4/17/2015"), packagesV4, true, true);
-// addRelease("1.2.1", new Date("2/9/2015"), packagesV4, true, true);
-// addRelease("1.2.0", new Date("12/18/2014"), packagesV4, true, true);
-// addRelease("1.1.1", new Date("11/26/2014"), packagesV4, true, true);
-// addRelease("1.1.0", new Date("9/11/2014"), packagesV4, true, true);
-// addRelease("1.0.2", new Date("8/5/2014"), packagesV3, true, true);
-// addRelease("1.0.1", new Date("7/11/2014"), packagesV3, false, true);
-// addRelease("1.0.0", new Date("5/30/2014"), packagesV2, false, true);
-// addRelease("0.9.2", new Date("7/23/2014"), packagesV2, true, true);
-// addRelease("0.9.1", new Date("4/9/2014"), packagesV2, false, true);
-// addRelease("0.9.0-incubating", new Date("2/2/2014"), packagesV2, false, true);
-// addRelease("0.8.1-incubating", new Date("12/19/2013"), packagesV2, true, true);
-// addRelease("0.8.0-incubating", new Date("9/25/2013"), packagesV1, true, true);
-// addRelease("0.7.3", new Date("7/16/2013"), packagesV1, true, true);
-// addRelease("0.7.2", new Date("2/6/2013"), packagesV1, false, true);
-// addRelease("0.7.0", new Date("2/27/2013"), [sources], false, true);
+//addRelease("1.5.2", new Date("11/09/2015"), packagesV6, true);
+//addRelease("1.5.1", new Date("10/02/2015"), packagesV6, true);
+//addRelease("1.5.0", new Date("9/09/2015"), packagesV6, true);
+//addRelease("1.4.1", new Date("7/15/2015"), packagesV6, true);
+//addRelease("1.4.0", new Date("6/11/2015"), packagesV6, true);
 
 function append(el, contents) {
   el.innerHTML += contents;
@@ -137,69 +116,45 @@ function onVersionSelect() {
     append(packageSelect, option);
   }
 
-  var href = "https://www.apache.org/dist/spark/spark-" + version + "/";
+  var href = "https://archive.apache.org/dist/spark/spark-" + version + "/";
   var link = "<a href=\"" + href + "\">" + versionShort(version) + " signatures and checksums</a>";
   append(verifyLink, link);
 
   // Populate releases
-  onPackageSelect();
-  updateDownloadLink();
-}
-
-function onPackageSelect() {
-  var downloadSelect = document.getElementById("sparkDownloadSelect");
-  var packageSelect = document.getElementById("sparkPackageSelect");
-
-  empty(downloadSelect);
-
-  var pkg = getSelectedValue(packageSelect);
-
-  append(downloadSelect, "<option value='direct'>Direct Download</option>");
-  append(downloadSelect, "<option value='apache'>Select Apache Mirror</option>");
-  updateDownloadLink();
-}
-
-function onDownloadSelect() {
   updateDownloadLink();
 }
 
 function updateDownloadLink() {
   var versionSelect = document.getElementById("sparkVersionSelect");
   var packageSelect = document.getElementById("sparkPackageSelect");
-  var downloadSelect = document.getElementById("sparkDownloadSelect");
   var downloadLink = document.getElementById("spanDownloadLink");
 
   empty(downloadLink);
 
   var version = getSelectedValue(versionSelect);
   var pkg = getSelectedValue(packageSelect);
-  var download = getSelectedValue(downloadSelect);
-
 
   var artifactName = "spark-$ver-bin-$pkg.tgz"
     .replace(/\$ver/g, version)
     .replace(/\$pkg/g, pkg)
     .replace(/-bin-sources/, ""); // special case for source packages
 
-  var link = "https://d3kbcqa49mib13.cloudfront.net/$artifact";
-  if (download == "apache") {
-    if (version < "1.6.3" ||
-        (version >= "2.0.0" && version <= "2.0.1") ||
-        (version >= "2.1.0" && version <= "2.1.0")) {
-      link = "https://archive.apache.org/dist/spark/spark-$ver/$artifact";
-    } else {
-      link = "https://www.apache.org/dyn/closer.lua/spark/spark-$ver/$artifact";
-    }
+  var link = "";
+  if (version < "1.6.3" ||
+      (version >= "2.0.0" && version <= "2.0.1") ||
+      (version >= "2.1.0" && version <= "2.1.1")) {
+    link = "https://archive.apache.org/dist/spark/spark-$ver/$artifact";
+  } else {
+    link = "https://www.apache.org/dyn/closer.lua/spark/spark-$ver/$artifact";
   }
   link = link
     .replace(/\$ver/, version)
     .replace(/\$artifact/, artifactName);
   var text = link.split("/").reverse()[0];
 
-  var onClick = "trackOutboundLink(this, 'Release Download Links', " +
-    "'$download_$artifact'); return false;"
-      .replace(/\$download/, download)
-      .replace(/\$artifact/, artifactName);
+  var onClick =
+    "trackOutboundLink(this, 'Release Download Links', 'apache_$artifact'); return false;"
+    .replace(/\$artifact/, artifactName);
 
   var contents = "<a href=\"" + link + "\" onClick=\"" + onClick + "\">" + text + "</a>";
   append(downloadLink, contents);

http://git-wip-us.apache.org/repos/asf/spark-website/blob/853627da/site/release-process.html
----------------------------------------------------------------------
diff --git a/site/release-process.html b/site/release-process.html
index 537ae47..0f05574 100644
--- a/site/release-process.html
+++ b/site/release-process.html
@@ -416,15 +416,27 @@ $ rm latest
 $ ln -s 1.1.1 latest
 </code></pre>
 
-<p>Next, update the rest of the Spark website. See how the previous releases are documented. 
-In particular, have a look at the changes to the <code>*.md</code> files in this commit (all the HTML 
-file changes are generated by <code>jekyll</code>).</p>
+<p>Next, update the rest of the Spark website. See how the previous releases are documented 
+(all the HTML file changes are generated by <code>jekyll</code>). 
+In particular, update <code>documentation.md</code> to add link to <code>docs</code> for the previous release. Add 
+the new release to <code>js/downloads.js</code>. Check <code>security.md</code> for anything to update.</p>
 
 <pre><code>$ git add 1.1.1
 $ git commit -m "Add docs for Spark 1.1.1" 
 </code></pre>
 
-<p>Then, create the release notes. The contributors list can be automatically generated through 
+<p>Then, create the release notes. Go to the 
+<a href="https://issues.apache.org/jira/projects/SPARK?selectedItem=com.atlassian.jira.jira-projects-plugin:release-page">release page in JIRA</a>, 
+pick the release version from the list, then click on &#8220;Release Notes&#8221;. Copy this URL and then make a short URL on 
+<a href="https://s.apache.org/">s.apache.org</a>, sign in to your Apache account, and pick the ID as something like 
+<code>spark-2.1.2</code>. Create a new release post under <code>releases/_posts</code> to include this short URL.</p>
+
+<p>Then run <code>jekyll build</code> to update the <code>site</code> directory.</p>
+
+<p>On a related note, make sure the version is marked as released on JIRA. Go find the release page as above, eg., 
+<code>https://issues.apache.org/jira/projects/SPARK/versions/12340295</code>, and click the &#8220;Release&#8221; button on the right and enter the release date.</p>
+
+<p>(Generally, this is only for major and minor, but not patch releases) The contributors list can be automatically generated through 
 <a href="https://github.com/apache/spark/blob/branch-1.1/dev/create-release/generate-contributors.py">this script</a>.
 It accepts the tag that corresponds to the current release and another tag that 
 corresponds to the previous (not including maintenance release). For instance, if you are 
@@ -465,13 +477,13 @@ $ git shortlog v1.1.1 --grep "$EXPR" &gt; contrib.txt
 $ git log v1.1.1 --grep "$expr" --shortstat --oneline | grep -B 1 -e "[3-9][0-9][0-9] insert" -e "[1-9][1-9][1-9][1-9] insert" | grep SPARK &gt; large-patches.txt
 </code></pre>
 
-<p>Then, update the downloads page, and then the main page with a news item.</p>
-
 <h4>Create an Announcement</h4>
 
 <p>Once everything is working (website docs, website changes) create an announcement on the website 
-and then send an e-mail to the mailing list. Enjoy an adult beverage of your choice, and 
-congratulations on making a Spark release.</p>
+and then send an e-mail to the mailing list. To create an announcement, create a post under 
+<code>news/_posts</code> and then run <code>jekyll build</code>.</p>
+
+<p>Enjoy an adult beverage of your choice, and congratulations on making a Spark release.</p>
 
   </div>
 </div>


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@spark.apache.org
For additional commands, e-mail: commits-help@spark.apache.org