[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[or-cvs] [metrics-web/master] Make all servlets and JSPs produce valid HTML.
Author: Karsten Loesing <karsten.loesing@xxxxxxx>
Date: Mon, 11 Oct 2010 11:34:31 +0200
Subject: Make all servlets and JSPs produce valid HTML.
Commit: 4a86da5d98a4a4180302fb2e5d03f25a4cee244c
---
.../torproject/ernie/web/ExoneraTorServlet.java | 91 ++++----
.../torproject/ernie/web/RelaySearchServlet.java | 53 ++--
templates/banner.tpl.jsp | 65 +++---
templates/graphs.tpl.jsp | 36 ++--
templates/graphs_network.tpl.jsp | 152 ++++++-------
templates/graphs_packages.tpl.jsp | 43 ++--
templates/graphs_performance.tpl.jsp | 47 ++--
templates/graphs_users.tpl.jsp | 254 ++++++++++----------
templates/index.tpl.jsp | 4 +-
templates/main.tpl.jsp | 40 ++--
templates/research.tpl.jsp | 2 +-
templates/research_data.tpl.jsp | 44 ++--
templates/research_papers.tpl.jsp | 14 +-
templates/research_tools.tpl.jsp | 46 ++--
templates/status.tpl.jsp | 2 +-
15 files changed, 435 insertions(+), 458 deletions(-)
diff --git a/src/org/torproject/ernie/web/ExoneraTorServlet.java b/src/org/torproject/ernie/web/ExoneraTorServlet.java
index f1efeb0..38ec171 100644
--- a/src/org/torproject/ernie/web/ExoneraTorServlet.java
+++ b/src/org/torproject/ernie/web/ExoneraTorServlet.java
@@ -13,20 +13,17 @@ import org.apache.commons.codec.binary.*;
public class ExoneraTorServlet extends HttpServlet {
private void writeHeader(PrintWriter out) throws IOException {
- out.println("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 "
- + "Transitional//EN\"\n"
- + "\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n"
- + "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n"
+ out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
+ + "Transitional//EN\">\n"
+ + "<html>\n"
+ " <head>\n"
- + " <meta content=\"text/html; charset=ISO-8859-1\"\n"
- + " http-equiv=\"content-type\" />\n"
+ " <title>ExoneraTor</title>\n"
- + " <meta http-equiv=Content-Type content=\"text/html; "
- + "charset=iso-8859-1\">\n"
- + " <link href=\"/css/stylesheet-ltr.css\" type=text/css "
- + "rel=stylesheet>\n"
+ + " <meta http-equiv=\"content-type\" content=\"text/html; "
+ + "charset=ISO-8859-1\">\n"
+ + " <link href=\"/css/stylesheet-ltr.css\" type=\"text/css\" "
+ + "rel=\"stylesheet\">\n"
+ " <link href=\"/images/favicon.ico\" "
- + "type=image/x-icon rel=\"shortcut icon\">\n"
+ + "type=\"image/x-icon\" rel=\"shortcut icon\">\n"
+ " </head>\n"
+ " <body>\n"
+ " <div class=\"center\">\n"
@@ -42,7 +39,7 @@ public class ExoneraTorServlet extends HttpServlet {
+ " <a href=\"graphs.html\">Graphs</a>\n"
+ " <a href=\"research.html\">Research</a>\n"
+ " <a href=\"status.html\">Status</a>\n"
- + " <br/>\n"
+ + " <br>\n"
+ " <font size=\"2\">\n"
+ " <a class=\"current\">ExoneraTor</a>\n"
+ " <a href=\"relay-search.html\">Relay Search</a>\n"
@@ -64,8 +61,8 @@ public class ExoneraTorServlet extends HttpServlet {
+ "to a given server and/or TCP port. ExoneraTor learns about "
+ "these facts from parsing the public relay lists and relay "
+ "descriptors that are collected from the Tor directory "
- + "authorities.\n"
- + " <br/>\n"
+ + "authorities.</p>\n"
+ + " <br>\n"
+ " <p><font color=\"red\"><b>Notice:</b> Note that the "
+ "information you are providing below may be leaked to anyone "
+ "who can read the network traffic between you and this web "
@@ -74,11 +71,11 @@ public class ExoneraTorServlet extends HttpServlet {
+ "should download the <a href=\"tools.html#exonerator\">Java "
+ "or Python version of ExoneraTor</a> and run it on your "
+ "local machine.</font></p>\n"
- + " <br/>\n");
+ + " <br>\n");
}
private void writeFooter(PrintWriter out) throws IOException {
- out.println(" <br/>\n"
+ out.println(" <br>\n"
+ " </div>\n"
+ " </div>\n"
+ " <div class=\"bottom\" id=\"bottom\">\n"
@@ -159,7 +156,7 @@ public class ExoneraTorServlet extends HttpServlet {
lastConsensus = lastConsensus.substring(0, 10) + " "
+ lastConsensus.substring(11, 13) + ":00";
- out.println("<a id=\"relay\"/><h3>Was there a Tor relay running on "
+ out.println("<a name=\"relay\"></a><h3>Was there a Tor relay running on "
+ "this IP address?</h3>");
/* Parse IP parameter. */
@@ -279,18 +276,18 @@ public class ExoneraTorServlet extends HttpServlet {
out.println(" <form action=\"exonerator.html#relay\">\n"
+ " <input type=\"hidden\" name=\"targetaddr\" "
+ (targetIP.length() > 0 ? " value=\"" + targetIP + "\"" : "")
- + "/>\n"
+ + ">\n"
+ " <input type=\"hidden\" name=\"targetPort\""
+ (targetPort.length() > 0 ? " value=\"" + targetPort + "\"" : "")
- + "/>\n"
+ + ">\n"
+ " <table>\n"
+ " <tr>\n"
+ " <td align=\"right\">IP address in question:</td>\n"
+ " <td><input type=\"text\" name=\"ip\""
+ (relayIP.length() > 0 ? " value=\"" + relayIP + "\"" :
(TEST_MODE ? " value=\"209.17.171.104\"" : ""))
- + "\"/>"
- + (ipWarning.length() > 0 ? "<br/><font color=\"red\">"
+ + ">"
+ + (ipWarning.length() > 0 ? "<br><font color=\"red\">"
+ ipWarning + "</font>" : "")
+ "</td>\n"
+ " <td><i>(Ex.: 1.2.3.4)</i></td>\n"
@@ -300,19 +297,19 @@ public class ExoneraTorServlet extends HttpServlet {
+ " <td><input type=\"text\" name=\"timestamp\""
+ (timestampStr.length() > 0 ? " value=\"" + timestampStr + "\"" :
(TEST_MODE ? " value=\"2009-08-15 16:05\"" : ""))
- + "\"/>"
- + (timestampWarning.length() > 0 ? "<br/><font color=\"red\">"
+ + ">"
+ + (timestampWarning.length() > 0 ? "<br><font color=\"red\">"
+ timestampWarning + "</font>" : "")
+ "</td>\n"
+ " <td><i>(Ex.: 2010-01-01 12:00)</i></td>\n"
+ " </tr>\n"
+ " <tr>\n"
- + " <td/>\n"
+ + " <td></td>\n"
+ " <td>\n"
+ " <input type=\"submit\">\n"
+ " <input type=\"reset\">\n"
+ " </td>\n"
- + " <td/>\n"
+ + " <td></td>\n"
+ " </tr>\n"
+ " </table>\n"
+ " </form>\n");
@@ -341,7 +338,7 @@ public class ExoneraTorServlet extends HttpServlet {
+ "select relays for their paths and build circuits using them. "
+ "You may follow the links to relay lists and relay descriptors "
+ "to grep for the lines printed below and confirm that results "
- + "are correct.<br/>", relayIP, calFrom, calFrom, timestampStr);
+ + "are correct.<br>", relayIP, calFrom, calFrom, timestampStr);
SimpleDateFormat consensusTimeFormat = new SimpleDateFormat(
"yyyy-MM-dd-HH-mm-ss");
consensusTimeFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
@@ -435,10 +432,10 @@ public class ExoneraTorServlet extends HttpServlet {
long validAfterTime = validAfterDate.getTime();
String validAfterDatetime = validAfterTimeFormat.format(
validAfterTime);
- out.println(" <br/><tt>valid-after <b>"
+ out.println(" <br><tt>valid-after <b>"
+ "<a href=\"consensus?valid-after="
+ validAfterString + "\" target=\"_blank\">"
- + validAfterDatetime + "</b></a></tt><br/>");
+ + validAfterDatetime + "</b></a></tt><br>");
}
BufferedReader br = new BufferedReader(new FileReader(consensus));
String line;
@@ -459,7 +456,7 @@ public class ExoneraTorServlet extends HttpServlet {
+ "<a href=\"serverdesc?desc-id=" + hex + "\" "
+ "target=\"_blank\">" + parts[3] + "</a> " + parts[4]
+ " " + parts[5] + " <b>" + parts[6] + "</b> " + parts[7]
- + " " + parts[8] + "</tt><br/>");
+ + " " + parts[8] + "</tt><br>");
}
} else {
if (relayIP.startsWith(address.substring(0,
@@ -556,7 +553,7 @@ public class ExoneraTorServlet extends HttpServlet {
}
/* Second part: target */
- out.println("<br/><a id=\"exit\"/><h3>Was this relay configured to "
+ out.println("<br><a name=\"exit\"></a><h3>Was this relay configured to "
+ "permit exiting to a given target?</h3>");
File serverDescriptorDirectory =
@@ -583,17 +580,17 @@ public class ExoneraTorServlet extends HttpServlet {
out.println(" <form action=\"exonerator.html#exit\">\n"
+ " <input type=\"hidden\" name=\"timestamp\"\n"
- + " value=\"" + timestampStr + "\"/>\n"
+ + " value=\"" + timestampStr + "\">\n"
+ " <input type=\"hidden\" name=\"ip\" "
- + "value=\"" + relayIP + "\"/>\n"
+ + "value=\"" + relayIP + "\">\n"
+ " <table>\n"
+ " <tr>\n"
+ " <td align=\"right\">Target address:</td>\n"
+ " <td><input type=\"text\" name=\"targetaddr\""
+ (targetIP.length() > 0 ? " value=\"" + targetIP + "\"" :
(TEST_MODE ? " value=\"209.85.129.104\"" : ""))
- + "\"/>"
- + (targetAddrWarning.length() > 0 ? "<br/><font color=\"red\">"
+ + "\">"
+ + (targetAddrWarning.length() > 0 ? "<br><font color=\"red\">"
+ targetAddrWarning + "</font>" : "")
+ "</td>\n"
+ " <td><i>(Ex.: 4.3.2.1)</i></td>\n"
@@ -603,19 +600,19 @@ public class ExoneraTorServlet extends HttpServlet {
+ " <td><input type=\"text\" name=\"targetport\""
+ (targetPort.length() > 0 ? " value=\"" + targetPort + "\"" :
(TEST_MODE ? " value=\"80\"" : ""))
- + "/>"
- + (targetPortWarning.length() > 0 ? "<br/><font color=\"red\">"
+ + ">"
+ + (targetPortWarning.length() > 0 ? "<br><font color=\"red\">"
+ targetPortWarning + "</font>" : "")
+ "</td>\n"
+ " <td><i>(Ex.: 80)</i></td>\n"
+ " </tr>\n"
+ " <tr>\n"
- + " <td/>\n"
+ + " <td></td>\n"
+ " <td>\n"
+ " <input type=\"submit\">\n"
+ " <input type=\"reset\">\n"
+ " </td>\n"
- + " <td/>\n"
+ + " <td></td>\n"
+ " </tr>\n"
+ " </table>\n"
+ " </form>\n");
@@ -659,7 +656,7 @@ public class ExoneraTorServlet extends HttpServlet {
} else if (line.startsWith("reject ") ||
line.startsWith("accept ")) {
if (foundMatch) {
- out.println("<tt> " + line + "</tt><br/>");
+ out.println("<tt> " + line + "</tt><br>");
continue;
}
boolean ruleAccept = line.split(" ")[0].equals("accept");
@@ -667,7 +664,7 @@ public class ExoneraTorServlet extends HttpServlet {
if (!ruleAddress.equals("*")) {
if (!ruleAddress.contains("/") &&
!ruleAddress.equals(targetIP)) {
- acceptRejectLines.append("<tt> " + line + "</tt><br/>\n");
+ acceptRejectLines.append("<tt> " + line + "</tt><br>\n");
continue; // IP address does not match
}
String[] ruleIPParts = ruleAddress.split("/")[0].
@@ -693,21 +690,21 @@ public class ExoneraTorServlet extends HttpServlet {
}
}
if (ruleNetwork > 0) {
- acceptRejectLines.append("<tt> " + line + "</tt><br/>\n");
+ acceptRejectLines.append("<tt> " + line + "</tt><br>\n");
continue; // IP address does not match
}
}
String rulePort = line.split(" ")[1].split(":")[1];
if (targetPort.length() < 1 && !ruleAccept &&
!rulePort.equals("*")) {
- acceptRejectLines.append("<tt> " + line + "</tt><br/>\n");
+ acceptRejectLines.append("<tt> " + line + "</tt><br>\n");
continue; // with no port given, we only consider
// reject :* rules as matching
}
if (targetPort.length() > 0) {
if (!rulePort.equals("*") &&
!targetPort.equals(rulePort)) {
- acceptRejectLines.append("<tt> " + line + "</tt><br/>\n");
+ acceptRejectLines.append("<tt> " + line + "</tt><br>\n");
continue; // ports do not match
}
}
@@ -717,16 +714,16 @@ public class ExoneraTorServlet extends HttpServlet {
relevantMatch = true;
if (relevantMatch) {
String[] routerParts = routerLine.split(" ");
- out.println("<br/><tt>" + routerParts[0] + " "
+ out.println("<br><tt>" + routerParts[0] + " "
+ routerParts[1] + " <b>" + routerParts[2] + "</b> "
+ routerParts[3] + " " + routerParts[4] + " "
- + routerParts[5] + "</tt><br/>");
+ + routerParts[5] + "</tt><br>");
String[] publishedParts = publishedLine.split(" ");
out.println("<tt>" + publishedParts[0] + " <b>"
+ publishedParts[1] + " " + publishedParts[2]
- + "</b></tt><br/>");
+ + "</b></tt><br>");
out.println(acceptRejectLines.toString());
- out.println("<tt><b>" + line + "</b></tt><br/>");
+ out.println("<tt><b>" + line + "</b></tt><br>");
foundMatch = true;
}
if (ruleAccept) {
diff --git a/src/org/torproject/ernie/web/RelaySearchServlet.java b/src/org/torproject/ernie/web/RelaySearchServlet.java
index ac2ced8..c171391 100644
--- a/src/org/torproject/ernie/web/RelaySearchServlet.java
+++ b/src/org/torproject/ernie/web/RelaySearchServlet.java
@@ -84,20 +84,19 @@ public class RelaySearchServlet extends HttpServlet {
}
private void writeHeader(PrintWriter out) throws IOException {
- out.println("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 "
- + "Transitional//EN\"\n"
- + "\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n"
- + "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n"
+
+
+ out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
+ + "Transitional//EN\">\n"
+ + "<html>\n"
+ " <head>\n"
- + " <meta content=\"text/html; charset=ISO-8859-1\"\n"
- + " http-equiv=\"content-type\" />\n"
+ " <title>Relay Search</title>\n"
- + " <meta http-equiv=Content-Type content=\"text/html; "
- + "charset=iso-8859-1\">\n"
- + " <link href=\"/css/stylesheet-ltr.css\" type=text/css "
- + "rel=stylesheet>\n"
+ + " <meta http-equiv=\"content-type\" content=\"text/html; "
+ + "charset=ISO-8859-1\">\n"
+ + " <link href=\"/css/stylesheet-ltr.css\" type=\"text/css\" "
+ + "rel=\"stylesheet\">\n"
+ " <link href=\"/images/favicon.ico\" "
- + "type=image/x-icon rel=\"shortcut icon\">\n"
+ + "type=\"image/x-icon\" rel=\"shortcut icon\">\n"
+ " </head>\n"
+ " <body>\n"
+ " <div class=\"center\">\n"
@@ -113,7 +112,7 @@ public class RelaySearchServlet extends HttpServlet {
+ " <a href=\"graphs.html\">Graphs</a>\n"
+ " <a href=\"research.html\">Research</a>\n"
+ " <a href=\"status.html\">Status</a>\n"
- + " <br/>\n"
+ + " <br>\n"
+ " <font size=\"2\">\n"
+ " <a href=\"exonerator.html\">ExoneraTor</a>\n"
+ " <a class=\"current\">Relay Search</a>\n"
@@ -130,7 +129,7 @@ public class RelaySearchServlet extends HttpServlet {
}
private void writeFooter(PrintWriter out) throws IOException {
- out.println(" <br/>\n"
+ out.println(" <br>\n"
+ " </div>\n"
+ " </div>\n"
+ " <div class=\"bottom\" id=\"bottom\">\n"
@@ -211,19 +210,19 @@ public class RelaySearchServlet extends HttpServlet {
+ "(yyyy-mm-dd)</b> in the following search field and "
+ "clicking Search. The search will stop after 30 hits or, "
+ "unless you provide a month or a day, after parsing the last "
- + "30 days of relay lists.</p><br/>\n"
+ + "30 days of relay lists.</p><br>\n"
+ " <form action=\"relay-search.html\">\n"
+ " <table>\n"
+ " <tr>\n"
+ " <td><input type=\"text\" name=\"search\""
+ (searchParameter.length() > 0 ? " value=\"" + searchParameter
- + "\"" : "") + "/></td>\n"
- + " <td><input type=\"submit\" value=\"Search\"/>"
+ + "\"" : "") + "></td>\n"
+ + " <td><input type=\"submit\" value=\"Search\">"
+ "</td>\n"
+ " </tr>\n"
+ " </table>\n"
+ " </form>\n"
- + " <br/>\n");
+ + " <br>\n");
/* No search parameter? We're done here. */
if (searchParameter.length() == 0) {
@@ -516,10 +515,10 @@ public class RelaySearchServlet extends HttpServlet {
String validAfter = rs.getTimestamp(1).toString().
substring(0, 19);
if (!validAfter.equals(lastValidAfter)) {
- out.println(" <br/><tt>valid-after "
+ out.println(" <br><tt>valid-after "
+ "<a href=\"consensus?valid-after="
+ validAfter.replaceAll(":", "-").replaceAll(" ", "-")
- + "\" target=\"_blank\">" + validAfter + "</a></tt><br/>");
+ + "\" target=\"_blank\">" + validAfter + "</a></tt><br>");
lastValidAfter = validAfter;
out.flush();
}
@@ -538,12 +537,12 @@ public class RelaySearchServlet extends HttpServlet {
+ "<a href=\"descriptor.html?desc-id=" + descriptor
+ "\" target=\"_blank\">" + parts[3] + "</a> "
+ parts[4] + " " + parts[5] + " " + parts[6] + " "
- + parts[7] + " " + parts[8] + "</tt><br/>");
+ + parts[7] + " " + parts[8] + "</tt><br>");
} else {
- out.println(" <tt>" + line + "</tt><br/>");
+ out.println(" <tt>" + line + "</tt><br>");
}
}
- out.println(" <br/>");
+ out.println(" <br>");
out.flush();
} catch (UnsupportedEncodingException e) {
/* This shouldn't happen, because we know that ASCII is
@@ -565,7 +564,7 @@ public class RelaySearchServlet extends HttpServlet {
/* Display total search time on the results page. */
long searchTime = System.currentTimeMillis() - started;
long queryTime = System.currentTimeMillis() - startedQuery;
- out.write(" <br/><p>Found " + (matches > 30 ? "more than 30"
+ out.write(" <br><p>Found " + (matches > 30 ? "more than 30"
: "" + matches) + " relays " + (matches > 30 ?
"(displaying only the first 30 hits) " : "") + "in "
+ String.format("%d.%03d", searchTime / 1000, searchTime % 1000)
@@ -732,13 +731,13 @@ public class RelaySearchServlet extends HttpServlet {
* first match in this consensus, print the valid-after
* line. */
if (validAfterLine != null) {
- out.println(" <br/><tt>valid-after "
+ out.println(" <br><tt>valid-after "
+ "<a href=\"consensus?valid-after="
+ validAfterLine.substring("valid-after ".length()).
replaceAll(":", "-").replaceAll(" ", "-")
+ "\" target=\"_blank\">"
+ validAfterLine.substring("valid-after ".length())
- + "</a></tt><br/>");
+ + "</a></tt><br>");
validAfterLine = null;
}
@@ -749,7 +748,7 @@ public class RelaySearchServlet extends HttpServlet {
+ "<a href=\"descriptor.html?desc-id=" + descriptor
+ "\" " + "target=\"_blank\">" + parts[3] + "</a> "
+ parts[4] + " " + parts[5] + " " + parts[6] + " "
- + parts[7] + " " + parts[8] + "</tt><br/>");
+ + parts[7] + " " + parts[8] + "</tt><br>");
matches++;
}
} else if (line.startsWith("valid-after ")) {
@@ -768,7 +767,7 @@ public class RelaySearchServlet extends HttpServlet {
/* Display total search time on the results page. */
long searchTime = System.currentTimeMillis() - started;
- out.write(" <br/><p>Found " + matches + " relays in the last "
+ out.write(" <br><p>Found " + matches + " relays in the last "
+ consensusesParsed + " known consensuses in "
+ String.format("%d.%03d", searchTime / 1000, searchTime % 1000)
+ " seconds.</p>\n");
diff --git a/templates/banner.tpl.jsp b/templates/banner.tpl.jsp
index bb29789..4710ad9 100644
--- a/templates/banner.tpl.jsp
+++ b/templates/banner.tpl.jsp
@@ -5,48 +5,51 @@
<td class="banner-left">
<a href="/index.html">
<img src="/images/top-left.png" alt="Click to go to home page"
- width="193" heigth="79"></a></td>
+ width="193" height="79"></a></td>
<td class="banner-middle">
- <a <% if (template.getTemplateName().equals("index")) {%>
- class="current" <%} else {%> href="/index.html" <%}%>>Home</a>
- <a <% if (template.getTemplateName().equals("graphs")) {%>
- class="current" <%} else {%> href="/graphs.html" <%}%>>Graphs</a>
- <a <% if (template.getTemplateName().equals("research")) {%>
- class="current" <%} else {%> href="/research.html" <%}%>>Research</a>
- <a <% if (template.getTemplateName().equals("status")) {%>
- class="current" <%} else {%> href="/status.html" <%}%>>Status</a>
- <%if (template.getTemplateName().startsWith("graphs")) {%>
- <br/>
+ <a <% if (template.getTemplateName().equals("index")) {
+ %>class="current" <%} else {%>href="/index.html"<%}%>>Home</a>
+ <a <% if (template.getTemplateName().equals("graphs")) {
+ %>class="current" <%} else {%>href="/graphs.html"<%}%>>Graphs</a>
+ <a <% if (template.getTemplateName().equals("research")) {
+ %>class="current" <%} else {%>href="/research.html"<%}%>>Research</a>
+ <a <% if (template.getTemplateName().equals("status")) {
+ %>class="current" <%} else {%>href="/status.html"<%}%>>Status</a>
+ <%if (template.getTemplateName().startsWith("graphs")) {
+ %><br>
<font size="2">
- <a <%if (template.getTemplateName().contains("network")){%>
- class="current" <%} else {%>
- href="/network.html"<%}%>>Network</a>
- <a <%if (template.getTemplateName().contains("users")) {%>
- class="current" <%} else {%>
- href="/users.html"<%}%>>Users</a>
- <a <%if (template.getTemplateName().contains("packages")) {%>
- class="current" <%} else {%>
- href="/packages.html"<%}%>>Packages</a>
- <a <%if (template.getTemplateName().contains("performance")) {%>
- class="current" <%} else {%>
- href="/performance.html"<%}%>>Performance</a>
+ <a <%if (template.getTemplateName().contains("network")){
+ %>class="current"<%} else {%>href="/network.html"<%}
+ %>>Network</a>
+ <a <%if (template.getTemplateName().contains("users")) {
+ %>class="current"<%} else {%>href="/users.html"<%}
+ %>>Users</a>
+ <a <%if (template.getTemplateName().contains("packages")) {
+ %>class="current"<%} else {%>href="/packages.html"<%}
+ %>>Packages</a>
+ <a <%if (template.getTemplateName().contains("performance")) {
+ %>class="current"<%} else {%>href="/performance.html"<%}
+ %>>Performance</a>
</font>
<%} else if (template.getTemplateName().startsWith("status")) {%>
- <br/>
+ <br>
<font size="2">
<a href="/exonerator.html">ExoneraTor</a>
<a href="/relay-search.html">Relay Search</a>
<a href="/consensus-health.html">Consensus Health</a>
</font>
<%} else if (template.getTemplateName().startsWith("research")) { %>
- <br/>
+ <br>
<font size="2">
- <a <%if (template.getTemplateName().contains("papers")) {%>
- class="current" <%} else {%> href="/papers.html"<%}%>>Papers</a>
- <a <%if (template.getTemplateName().contains("data")) {%>
- class="current" <%} else {%> href="/data.html"<%}%>>Data</a>
- <a <%if (template.getTemplateName().contains("tools")) {%>
- class="current" <%} else {%> href="/tools.html"<%}%>>Tools</a>
+ <a <%if (template.getTemplateName().contains("papers")) {
+ %>class="current"<%} else {%> href="/papers.html"<%}
+ %>>Papers</a>
+ <a <%if (template.getTemplateName().contains("data")) {
+ %>class="current"<%} else {%> href="/data.html"<%}
+ %>>Data</a>
+ <a <%if (template.getTemplateName().contains("tools")) {
+ %>class="current"<%} else {%> href="/tools.html"<%}
+ %>>Tools</a>
</font>
<%}%>
</td>
diff --git a/templates/graphs.tpl.jsp b/templates/graphs.tpl.jsp
index f6a4647..5884b23 100644
--- a/templates/graphs.tpl.jsp
+++ b/templates/graphs.tpl.jsp
@@ -1,18 +1,18 @@
- <h2>Tor Metrics Portal: Graphs</h2>
- <br/>
- <p>The graphs on this page visualize a small portion of the data
- gathered in the Tor Metrics Project. The following graphs are
- available:</p>
- <ul>
- <li>The <a href="network.html">Network page</a> has numerous
- statistics on the network of relays and bridges.</li>
- <li>The <a href="users.html">Users page</a> attempts to estimate
- the number of users in the network.</li>
- <li>There are numerous ways to download the Tor software. The
- <a href="packages.html">Packages page</a> has statistics on the
- number of packages requested from GetTor.</li>
- <li>There are active and passive performance measurements of the
- Tor network available on the
- <a href="performance.html">Performance page</a>.</li>
- </ul>
- <br/>
+ <h2>Tor Metrics Portal: Graphs</h2>
+ <br>
+ <p>The graphs on this page visualize a small portion of the data
+ gathered in the Tor Metrics Project. The following graphs are
+ available:</p>
+ <ul>
+ <li>The <a href="network.html">Network page</a> has numerous
+ statistics on the network of relays and bridges.</li>
+ <li>The <a href="users.html">Users page</a> attempts to estimate
+ the number of users in the network.</li>
+ <li>There are numerous ways to download the Tor software. The
+ <a href="packages.html">Packages page</a> has statistics on the
+ number of packages requested from GetTor.</li>
+ <li>There are active and passive performance measurements of the
+ Tor network available on the
+ <a href="performance.html">Performance page</a>.</li>
+ </ul>
+ <br>
diff --git a/templates/graphs_network.tpl.jsp b/templates/graphs_network.tpl.jsp
index 88f7087..965deed 100644
--- a/templates/graphs_network.tpl.jsp
+++ b/templates/graphs_network.tpl.jsp
@@ -1,11 +1,11 @@
<%@page import="java.util.*" %>
<h2>Tor Metrics Portal: Network</h2>
-<br/>
+<br>
<h3>Relays and bridges in the network</h3>
-<br/>
+<br>
<p>The following graph shows the average daily number of relays and
bridges in the network.</p>
-<a id="networksize" />
+<a name="networksize"></a>
<%
StringBuilder networksizeUrl = new StringBuilder("networksize.png");
if ("networksize".equals(request.getParameter("graph"))) {
@@ -29,37 +29,35 @@ if ("networksize".equals(request.getParameter("graph"))) {
}
}
out.println("<img src=\"" + networksizeUrl.toString() + "\" width=\"576\" "
- + "height=\"360\" />");
-%>
-</p>
-<form action="network.html#networksize">
+ + "height=\"360\" alt=\"Network size graph\">");
+%><form action="network.html#networksize">
<div class="formrow">
- <input type="hidden" name="graph" value="networksize"/>
+ <input type="hidden" name="graph" value="networksize">
<p>
- <label class="startend" for="start">Start date (yyyy-mm-dd):</label>
- <input type="text" name="start" id="start" size="10"
+ <label>Start date (yyyy-mm-dd):</label>
+ <input type="text" name="start" size="10"
value="<%=("networksize".equals(request.getParameter("graph")) &&
request.getParameter("start") != null) ?
- request.getParameter("start") : ""%>"/>
- <label class="startend" for="end">End date (yyyy-mm-dd):</label>
- <input type="text" name="end" id="end" size="10"
+ request.getParameter("start") : ""%>">
+ <label>End date (yyyy-mm-dd):</label>
+ <input type="text" name="end" size="10"
value="<%=("networksize".equals(request.getParameter("graph")) &&
request.getParameter("end") != null) ?
- request.getParameter("end") : ""%>"/>
+ request.getParameter("end") : ""%>">
</p><p>
- <input class="submit" type="submit" value="Update graph"/>
+ <input class="submit" type="submit" value="Update graph">
</p>
</div>
</form>
<p><a href="csv/networksize.csv">CSV</a> file containing all data.</p>
-<br/>
+<br>
<h3>Relays with Exit, Fast, Guard, and Stable flags</h3>
-<br/>
+<br>
<p>The directory authorities assign certain flags to relays that clients
use for their path selection decisions. The following graph shows the
average number of relays with these flags assigned.</p>
-<a id="relayflags" />
+<a name="relayflags"></a>
<%
StringBuilder relayflagsUrl = new StringBuilder("relayflags.png");
if ("relayflags".equals(request.getParameter("graph"))) {
@@ -91,43 +89,41 @@ if ("relayflags".equals(request.getParameter("graph"))) {
}
}
out.println("<img src=\"" + relayflagsUrl.toString() + "\" width=\"576\" "
- + "height=\"360\" />");
-%>
-</p>
-<form action="network.html#relayflags">
+ + "height=\"360\" alt=\"Relay flags graph\">");
+%><form action="network.html#relayflags">
<div class="formrow">
- <input type="hidden" name="graph" value="relayflags"/>
+ <input type="hidden" name="graph" value="relayflags">
<p>
- <label class="startend" for="start">Start date (yyyy-mm-dd):</label>
- <input type="text" name="start" id="start" size="10"
+ <label>Start date (yyyy-mm-dd):</label>
+ <input type="text" name="start" size="10"
value="<%=("relayflags".equals(request.getParameter("graph")) &&
request.getParameter("start") != null) ?
- request.getParameter("start") : ""%>"/>
- <label class="startend" for="end">End date (yyyy-mm-dd):</label>
- <input type="text" name="end" id="end" size="10"
+ request.getParameter("start") : ""%>">
+ <label>End date (yyyy-mm-dd):</label>
+ <input type="text" name="end" size="10"
value="<%=("relayflags".equals(request.getParameter("graph")) &&
request.getParameter("end") != null) ?
- request.getParameter("end") : ""%>"/>
+ request.getParameter("end") : ""%>">
</p><p>
<label>Relay flags: </label>
- <input type="checkbox" name="flag" value="Running"> Running</input>
- <input type="checkbox" name="flag" value="Exit"> Exit</input>
- <input type="checkbox" name="flag" value="Fast"> Fast</input>
- <input type="checkbox" name="flag" value="Guard"> Guard</input>
- <input type="checkbox" name="flag" value="Stable"> Stable</input>
+ <input type="checkbox" name="flag" value="Running"> Running
+ <input type="checkbox" name="flag" value="Exit"> Exit
+ <input type="checkbox" name="flag" value="Fast"> Fast
+ <input type="checkbox" name="flag" value="Guard"> Guard
+ <input type="checkbox" name="flag" value="Stable"> Stable
</p><p>
- <input class="submit" type="submit" value="Update graph"/>
+ <input class="submit" type="submit" value="Update graph">
</p>
</div>
</form>
-<br/>
+<br>
<h3>Relays by version</h3>
-<br/>
+<br>
<p>Relays report the Tor version that they are running to the directory
authorities. The following graph shows the number of relays by
version.</p>
-<a id="versions" />
+<a name="versions"></a>
<%
StringBuilder versionsUrl = new StringBuilder("versions.png");
if ("versions".equals(request.getParameter("graph"))) {
@@ -151,36 +147,34 @@ if ("versions".equals(request.getParameter("graph"))) {
}
}
out.println("<img src=\"" + versionsUrl.toString() + "\" width=\"576\" "
- + "height=\"360\" />");
-%>
-</p>
-<form action="network.html#versions">
+ + "height=\"360\" alt=\"Relay versions graph\">");
+%><form action="network.html#versions">
<div class="formrow">
- <input type="hidden" name="graph" value="versions"/>
+ <input type="hidden" name="graph" value="versions">
<p>
- <label class="startend" for="start">Start date (yyyy-mm-dd):</label>
- <input type="text" name="start" id="start" size="10"
+ <label>Start date (yyyy-mm-dd):</label>
+ <input type="text" name="start" size="10"
value="<%=("versions".equals(request.getParameter("graph")) &&
request.getParameter("start") != null) ?
- request.getParameter("start") : ""%>"/>
- <label class="startend" for="end">End date (yyyy-mm-dd):</label>
- <input type="text" name="end" id="end" size="10"
+ request.getParameter("start") : ""%>">
+ <label>End date (yyyy-mm-dd):</label>
+ <input type="text" name="end" size="10"
value="<%=("versions".equals(request.getParameter("graph")) &&
request.getParameter("end") != null) ?
- request.getParameter("end") : ""%>"/>
+ request.getParameter("end") : ""%>">
</p><p>
- <input class="submit" type="submit" value="Update graph"/>
+ <input class="submit" type="submit" value="Update graph">
</p>
</div>
</form>
-<br/>
+<br>
<h3>Relays by platform</h3>
-<br/>
+<br>
<p>Relays report the operating system they are running to the directory
authorities. The following graph shows the number of relays by
platform.</p>
-<a id="platforms" />
+<a name="platforms"></a>
<%
StringBuilder platformsUrl = new StringBuilder("platforms.png");
if ("platforms".equals(request.getParameter("graph"))) {
@@ -204,37 +198,35 @@ if ("platforms".equals(request.getParameter("graph"))) {
}
}
out.println("<img src=\"" + platformsUrl.toString() + "\" width=\"576\" "
- + "height=\"360\" />");
-%>
-</p>
-<form action="network.html#platforms">
+ + "height=\"360\" alt=\"Relay platforms graph\">");
+%><form action="network.html#platforms">
<div class="formrow">
- <input type="hidden" name="graph" value="platforms"/>
+ <input type="hidden" name="graph" value="platforms">
<p>
- <label class="startend" for="start">Start date (yyyy-mm-dd):</label>
- <input type="text" name="start" id="start" size="10"
+ <label>Start date (yyyy-mm-dd):</label>
+ <input type="text" name="start" size="10"
value="<%=("platforms".equals(request.getParameter("graph")) &&
request.getParameter("start") != null) ?
- request.getParameter("start") : ""%>"/>
- <label class="startend" for="end">End date (yyyy-mm-dd):</label>
- <input type="text" name="end" id="end" size="10"
+ request.getParameter("start") : ""%>">
+ <label>End date (yyyy-mm-dd):</label>
+ <input type="text" name="end" size="10"
value="<%=("platforms".equals(request.getParameter("graph")) &&
request.getParameter("end") != null) ?
- request.getParameter("end") : ""%>"/>
+ request.getParameter("end") : ""%>">
</p><p>
- <input class="submit" type="submit" value="Update graph"/>
+ <input class="submit" type="submit" value="Update graph">
</p>
</div>
</form>
-<br/>
+<br>
<h3>Total relay bandwidth in the network</h3>
-<br/>
+<br>
<p>Relays report how much bandwidth they are willing to contribute and how
many bytes they have read and written in the past 24 hours. The following
graph shows total advertised bandwidth and bandwidth history of all relays
in the network.</p>
-<a id="bandwidth" />
+<a name="bandwidth"></a>
<%
StringBuilder bandwidthUrl = new StringBuilder("bandwidth.png");
if ("bandwidth".equals(request.getParameter("graph"))) {
@@ -258,27 +250,25 @@ if ("bandwidth".equals(request.getParameter("graph"))) {
}
}
out.println("<img src=\"" + bandwidthUrl.toString() + "\" width=\"576\" "
- + "height=\"360\" />");
-%>
-</p>
-<form action="network.html#bandwidth">
+ + "height=\"360\" alt=\"Relay bandwidth graph\">");
+%><form action="network.html#bandwidth">
<div class="formrow">
- <input type="hidden" name="graph" value="bandwidth"/>
+ <input type="hidden" name="graph" value="bandwidth">
<p>
- <label class="startend" for="start">Start date (yyyy-mm-dd):</label>
- <input type="text" name="start" id="start" size="10"
+ <label>Start date (yyyy-mm-dd):</label>
+ <input type="text" name="start" size="10"
value="<%=("bandwidth".equals(request.getParameter("graph")) &&
request.getParameter("start") != null) ?
- request.getParameter("start") : ""%>"/>
- <label class="startend" for="end">End date (yyyy-mm-dd):</label>
- <input type="text" name="end" id="end" size="10"
+ request.getParameter("start") : ""%>">
+ <label>End date (yyyy-mm-dd):</label>
+ <input type="text" name="end" size="10"
value="<%=("bandwidth".equals(request.getParameter("graph")) &&
request.getParameter("end") != null) ?
- request.getParameter("end") : ""%>"/>
+ request.getParameter("end") : ""%>">
</p><p>
- <input class="submit" type="submit" value="Update graph"/>
+ <input class="submit" type="submit" value="Update graph">
</p>
</div>
</form>
-<br/>
+<br>
diff --git a/templates/graphs_packages.tpl.jsp b/templates/graphs_packages.tpl.jsp
index 704dcc8..cfa04f1 100644
--- a/templates/graphs_packages.tpl.jsp
+++ b/templates/graphs_packages.tpl.jsp
@@ -1,12 +1,12 @@
<%@page import="java.util.*" %>
<h2>Tor Metrics Portal: Downloaded Packages</h2>
-<br/>
+<br>
<h3>Packages requested from GetTor</h3>
-<br/>
+<br>
<p>GetTor allows users to fetch the Tor software via email. The following
graph shows the number of packages requested from GetTor per day.</p>
<p>
-<a id="gettor" />
+<a name="gettor"></a>
<%
if ("gettor".equals(request.getParameter("graph"))) {
List<String> parameters = new ArrayList<String>();
@@ -33,39 +33,36 @@ if ("gettor".equals(request.getParameter("graph"))) {
}
}
out.println("<img src=\"" + url.toString() + "\" width=\"576\" "
- + "height=\"360\" />");
+ + "height=\"360\" alt=\"GetTor graph\">");
} else {%>
- <img src="gettor.png" width="576" height="360" />
+ <img src="gettor.png" width="576" height="360" alt="GetTor graph">
<%
}
-%>
-</p>
-
-<form action="packages.html#gettor">
+%><form action="packages.html#gettor">
<div class="formrow">
- <input type="hidden" name="graph" value="gettor"/>
+ <input type="hidden" name="graph" value="gettor">
<p>
- <label class="startend" for="start">Start date (yyyy-mm-dd):</label>
- <input type="text" name="start" id="start" size="10"
+ <label>Start date (yyyy-mm-dd):</label>
+ <input type="text" name="start" size="10"
value="<%=("gettor".equals(request.getParameter("graph")) &&
request.getParameter("start") != null) ?
- request.getParameter("start") : ""%>"/>
- <label class="startend" for="end">End date (yyyy-mm-dd):</label>
- <input type="text" name="end" id="end" size="10"
+ request.getParameter("start") : ""%>">
+ <label>End date (yyyy-mm-dd):</label>
+ <input type="text" name="end" size="10"
value="<%=("gettor".equals(request.getParameter("graph")) &&
request.getParameter("end") != null) ?
- request.getParameter("end") : ""%>"/>
+ request.getParameter("end") : ""%>">
</p><p>
- <label>Packages: </label>
- <input type="radio" name="bundle" value="all"> Total packages</input>
- <input type="radio" name="bundle" value="en"> TBB (en)</input>
- <input type="radio" name="bundle" value="zh_CN"> TBB (zh_CN)</input>
- <input type="radio" name="bundle" value="fa"> TBB (fa)</input>
+ Packages:
+ <input type="radio" name="bundle" value="all"> Total packages
+ <input type="radio" name="bundle" value="en"> TBB (en)
+ <input type="radio" name="bundle" value="zh_CN"> TBB (zh_CN)
+ <input type="radio" name="bundle" value="fa"> TBB (fa)
</p><p>
- <input class="submit" type="submit" value="Update graph"/>
+ <input class="submit" type="submit" value="Update graph">
</p>
</div>
</form>
<p><a href="csv/gettor.csv">CSV</a> file containing all data.</p>
-<br/>
+<br>
diff --git a/templates/graphs_performance.tpl.jsp b/templates/graphs_performance.tpl.jsp
index 862b435..830e71f 100644
--- a/templates/graphs_performance.tpl.jsp
+++ b/templates/graphs_performance.tpl.jsp
@@ -1,13 +1,13 @@
<%@page import="java.util.*" %>
<h2>Tor Metrics Portal: Performance</h2>
-<br/>
+<br>
<h3>Time to download files over Tor</h3>
-<br/>
+<br>
<p>The following graphs show the performance of the Tor network as
experienced by its users. The graphs contain the average (median) time to
request files of three different sizes over Tor as well as first and third
quartile of request times.</p>
-<a id="torperf" />
+<a name="torperf"></a>
<%
if ("torperf".equals(request.getParameter("graph"))) {
List<String> parameters = new ArrayList<String>();
@@ -38,43 +38,40 @@ if ("torperf".equals(request.getParameter("graph"))) {
}
}
out.println("<img src=\"" + url.toString() + "\" width=\"576\" "
- + "height=\"360\" />");
+ + "height=\"360\" alt=\"Torperf graph\">");
} else {%>
- <img src="torperf.png" width="576" height="360" />
+ <img src="torperf.png" width="576" height="360" alt="Torperf graph">
<%
}
-%>
-
-</p>
-<form action="performance.html#torperf">
+%><form action="performance.html#torperf">
<div class="formrow">
- <input type="hidden" name="graph" value="torperf"/>
+ <input type="hidden" name="graph" value="torperf">
<p>
- <label class="startend" for="start">Start date (yyyy-mm-dd):</label>
- <input type="text" name="start" id="start" size="10"
+ <label>Start date (yyyy-mm-dd):</label>
+ <input type="text" name="start" size="10"
value="<%=("torperf".equals(request.getParameter("graph")) &&
request.getParameter("start") != null) ?
- request.getParameter("start") : ""%>"/>
- <label class="startend" for="end">End date (yyyy-mm-dd):</label>
- <input type="text" name="end" id="end" size="10"
+ request.getParameter("start") : ""%>">
+ <label>End date (yyyy-mm-dd):</label>
+ <input type="text" name="end" size="10"
value="<%=("torperf".equals(request.getParameter("graph")) &&
request.getParameter("end") != null) ?
- request.getParameter("end") : ""%>"/>
+ request.getParameter("end") : ""%>">
</p><p>
- <label>Source: </label>
- <input type="radio" name="source" value="torperf"> torperf</input>
- <input type="radio" name="source" value="moria"> moria</input>
- <input type="radio" name="source" value="siv"> siv</input>
+ Source:
+ <input type="radio" name="source" value="torperf"> torperf
+ <input type="radio" name="source" value="moria"> moria
+ <input type="radio" name="source" value="siv"> siv
</p><p>
<label>File size: </label>
- <input type="radio" name="filesize" value="50kb"> 50 KiB</input>
- <input type="radio" name="filesize" value="1mb"> 1 MiB</input>
- <input type="radio" name="filesize" value="5mb"> 5 MiB</input>
+ <input type="radio" name="filesize" value="50kb"> 50 KiB
+ <input type="radio" name="filesize" value="1mb"> 1 MiB
+ <input type="radio" name="filesize" value="5mb"> 5 MiB
</p><p>
- <input class="submit" type="submit" value="Update graph"/>
+ <input class="submit" type="submit" value="Update graph">
</p>
</div>
</form>
<p><a href="csv/torperf.csv">CSV</a> file containing all data.</p>
-<br/>
+<br>
diff --git a/templates/graphs_users.tpl.jsp b/templates/graphs_users.tpl.jsp
index d8ea449..25bef9d 100644
--- a/templates/graphs_users.tpl.jsp
+++ b/templates/graphs_users.tpl.jsp
@@ -1,8 +1,8 @@
<%@page import="java.util.*" %>
<h2>Tor Metrics Portal: Users</h2>
-<br/>
+<br>
<h3>New or returning, directly connecting Tor users</h3>
-<br/>
+<br>
<p>Users connecting to the Tor network for the first time request a list
of running relays from one of currently seven directory authorities.
Likewise, returning users whose network information is out of date connect
@@ -10,7 +10,7 @@ to one of the directory authorities to download a fresh list of relays.
The following graphs display an estimate of new or returning Tor users
based on the requests as seen by gabelmoo, one of the directory
authorities.</p>
-<a id="new-users" />
+<a name="new-users"></a>
<%
StringBuilder newUsersUrl = new StringBuilder("new-users.png");
if ("new-users".equals(request.getParameter("graph"))) {
@@ -42,69 +42,67 @@ if ("new-users".equals(request.getParameter("graph"))) {
}
}
out.println("<img src=\"" + newUsersUrl.toString() + "\" width=\"576\" "
- + "height=\"360\" />");
-%>
-</p>
-<form action="users.html#new-users">
+ + "height=\"360\" alt=\"New users graph\">");
+%><form action="users.html#new-users">
<div class="formrow">
- <input type="hidden" name="graph" value="new-users"/>
+ <input type="hidden" name="graph" value="new-users">
<p>
- <label class="startend" for="start">Start date (yyyy-mm-dd):</label>
- <input type="text" name="start" id="start" size="10"
+ <label>Start date (yyyy-mm-dd):</label>
+ <input type="text" name="start" size="10"
value="<%=("new-users".equals(request.getParameter("graph")) &&
request.getParameter("start") != null) ?
- request.getParameter("start") : ""%>"/>
- <label class="startend" for="end">End date (yyyy-mm-dd):</label>
- <input type="text" name="end" id="end" size="10"
+ request.getParameter("start") : ""%>">
+ <label>End date (yyyy-mm-dd):</label>
+ <input type="text" name="end" size="10"
value="<%=("new-users".equals(request.getParameter("graph")) &&
request.getParameter("end") != null) ?
- request.getParameter("end") : ""%>"/>
+ request.getParameter("end") : ""%>">
</p><p>
- <label>Source: </label>
- <input type="radio" name="country" value="all">All users</input>
- <input type="radio" name="country" value="au">Australia</input>
- <input type="radio" name="country" value="bh">Bahrain</input>
- <input type="radio" name="country" value="br">Brazil</input>
- <input type="radio" name="country" value="ca">Canada</input>
- <input type="radio" name="country" value="cn">China</input>
- <input type="radio" name="country" value="cu">Cuba</input>
- <input type="radio" name="country" value="de">Germany</input>
- <input type="radio" name="country" value="et">Ethiopia</input>
- <input type="radio" name="country" value="fr">France</input>
- <input type="radio" name="country" value="gb">U.K.</input>
- <input type="radio" name="country" value="ir">Iran</input>
- <input type="radio" name="country" value="it">Italy</input>
- <input type="radio" name="country" value="jp">Japan</input>
- <input type="radio" name="country" value="kr">South Korea</input>
- <input type="radio" name="country" value="mm">Burma</input>
- <input type="radio" name="country" value="pl">Poland</input>
- <input type="radio" name="country" value="ru">Russia</input>
- <input type="radio" name="country" value="sa">Saudi Arabia</input>
- <input type="radio" name="country" value="se">Sweden</input>
- <input type="radio" name="country" value="sy">Syria</input>
- <input type="radio" name="country" value="tn">Tunisia</input>
- <input type="radio" name="country" value="tm">Turkmenistan</input>
- <input type="radio" name="country" value="us">U.S.A.</input>
- <input type="radio" name="country" value="uz">Uzbekistan</input>
- <input type="radio" name="country" value="vn">Vietnam</input>
- <input type="radio" name="country" value="ye">Yemen</input>
+ Source:
+ <input type="radio" name="country" value="all">All users
+ <input type="radio" name="country" value="au">Australia
+ <input type="radio" name="country" value="bh">Bahrain
+ <input type="radio" name="country" value="br">Brazil
+ <input type="radio" name="country" value="ca">Canada
+ <input type="radio" name="country" value="cn">China
+ <input type="radio" name="country" value="cu">Cuba
+ <input type="radio" name="country" value="de">Germany
+ <input type="radio" name="country" value="et">Ethiopia
+ <input type="radio" name="country" value="fr">France
+ <input type="radio" name="country" value="gb">U.K.
+ <input type="radio" name="country" value="ir">Iran
+ <input type="radio" name="country" value="it">Italy
+ <input type="radio" name="country" value="jp">Japan
+ <input type="radio" name="country" value="kr">South Korea
+ <input type="radio" name="country" value="mm">Burma
+ <input type="radio" name="country" value="pl">Poland
+ <input type="radio" name="country" value="ru">Russia
+ <input type="radio" name="country" value="sa">Saudi Arabia
+ <input type="radio" name="country" value="se">Sweden
+ <input type="radio" name="country" value="sy">Syria
+ <input type="radio" name="country" value="tn">Tunisia
+ <input type="radio" name="country" value="tm">Turkmenistan
+ <input type="radio" name="country" value="us">U.S.A.
+ <input type="radio" name="country" value="uz">Uzbekistan
+ <input type="radio" name="country" value="vn">Vietnam
+ <input type="radio" name="country" value="ye">Yemen
</p><p>
- <input class="submit" type="submit" value="Update graph"/>
+ <input class="submit" type="submit" value="Update graph">
</p>
</div>
</form>
<p><a href="csv/new-users.csv">CSV</a> file containing all data.</p>
-<br/>
+<br>
<h3>Recurring, directly connecting Tor users</h3>
-<br/>
+<br>
<p>After being connected to the Tor network, users need to refresh their
list of running relays on a regular basis. They send their requests to one
out of a few hundred directory mirrors to save bandwidth of the directory
authorities. The following graphs show an estimate of recurring Tor users
based on the requests as seen by trusted, a particularly fast directory
mirror.</p>
-<a id="direct-users" />
+<a name="direct-users"></a>
<%
StringBuilder directUsersUrl = new StringBuilder("direct-users.png");
if ("direct-users".equals(request.getParameter("graph"))) {
@@ -136,54 +134,52 @@ if ("direct-users".equals(request.getParameter("graph"))) {
}
}
out.println("<img src=\"" + directUsersUrl.toString() + "\" width=\"576\" "
- + "height=\"360\" />");
-%>
-</p>
-<form action="users.html#direct-users">
+ + "height=\"360\" alt=\"Recurring users graph\">");
+%><form action="users.html#direct-users">
<div class="formrow">
- <input type="hidden" name="graph" value="direct-users"/>
+ <input type="hidden" name="graph" value="direct-users">
<p>
- <label class="startend" for="start">Start date (yyyy-mm-dd):</label>
- <input type="text" name="start" id="start" size="10"
+ <label>Start date (yyyy-mm-dd):</label>
+ <input type="text" name="start" size="10"
value="<%=("direct-users".equals(request.getParameter("graph")) &&
request.getParameter("start") != null) ?
- request.getParameter("start") : ""%>"/>
- <label class="startend" for="end">End date (yyyy-mm-dd):</label>
- <input type="text" name="end" id="end" size="10"
+ request.getParameter("start") : ""%>">
+ <label>End date (yyyy-mm-dd):</label>
+ <input type="text" name="end" size="10"
value="<%=("direct-users".equals(request.getParameter("graph")) &&
request.getParameter("end") != null) ?
- request.getParameter("end") : ""%>"/>
+ request.getParameter("end") : ""%>">
</p><p>
- <label>Source: </label>
- <input type="radio" name="country" value="all">All users</input>
- <input type="radio" name="country" value="au">Australia</input>
- <input type="radio" name="country" value="bh">Bahrain</input>
- <input type="radio" name="country" value="br">Brazil</input>
- <input type="radio" name="country" value="ca">Canada</input>
- <input type="radio" name="country" value="cn">China</input>
- <input type="radio" name="country" value="cu">Cuba</input>
- <input type="radio" name="country" value="de">Germany</input>
- <input type="radio" name="country" value="et">Ethiopia</input>
- <input type="radio" name="country" value="fr">France</input>
- <input type="radio" name="country" value="gb">U.K.</input>
- <input type="radio" name="country" value="ir">Iran</input>
- <input type="radio" name="country" value="it">Italy</input>
- <input type="radio" name="country" value="jp">Japan</input>
- <input type="radio" name="country" value="kr">South Korea</input>
- <input type="radio" name="country" value="mm">Burma</input>
- <input type="radio" name="country" value="pl">Poland</input>
- <input type="radio" name="country" value="ru">Russia</input>
- <input type="radio" name="country" value="sa">Saudi Arabia</input>
- <input type="radio" name="country" value="se">Sweden</input>
- <input type="radio" name="country" value="sy">Syria</input>
- <input type="radio" name="country" value="tn">Tunisia</input>
- <input type="radio" name="country" value="tm">Turkmenistan</input>
- <input type="radio" name="country" value="us">U.S.A.</input>
- <input type="radio" name="country" value="uz">Uzbekistan</input>
- <input type="radio" name="country" value="vn">Vietnam</input>
- <input type="radio" name="country" value="ye">Yemen</input>
+ Source:
+ <input type="radio" name="country" value="all">All users
+ <input type="radio" name="country" value="au">Australia
+ <input type="radio" name="country" value="bh">Bahrain
+ <input type="radio" name="country" value="br">Brazil
+ <input type="radio" name="country" value="ca">Canada
+ <input type="radio" name="country" value="cn">China
+ <input type="radio" name="country" value="cu">Cuba
+ <input type="radio" name="country" value="de">Germany
+ <input type="radio" name="country" value="et">Ethiopia
+ <input type="radio" name="country" value="fr">France
+ <input type="radio" name="country" value="gb">U.K.
+ <input type="radio" name="country" value="ir">Iran
+ <input type="radio" name="country" value="it">Italy
+ <input type="radio" name="country" value="jp">Japan
+ <input type="radio" name="country" value="kr">South Korea
+ <input type="radio" name="country" value="mm">Burma
+ <input type="radio" name="country" value="pl">Poland
+ <input type="radio" name="country" value="ru">Russia
+ <input type="radio" name="country" value="sa">Saudi Arabia
+ <input type="radio" name="country" value="se">Sweden
+ <input type="radio" name="country" value="sy">Syria
+ <input type="radio" name="country" value="tn">Tunisia
+ <input type="radio" name="country" value="tm">Turkmenistan
+ <input type="radio" name="country" value="us">U.S.A.
+ <input type="radio" name="country" value="uz">Uzbekistan
+ <input type="radio" name="country" value="vn">Vietnam
+ <input type="radio" name="country" value="ye">Yemen
</p><p>
- <input class="submit" type="submit" value="Update graph"/>
+ <input class="submit" type="submit" value="Update graph">
</p>
</div>
</form>
@@ -192,15 +188,15 @@ out.println("<img src=\"" + directUsersUrl.toString() + "\" width=\"576\" "
Tor users (recurring and bridge) per month by country.</p>
<p><a href="csv/monthly-users-average.csv">CSV</a> file containing average
daily Tor users (recurring and bridge) per month by country.</p>
-<br/>
+<br>
<h3>Tor users via bridges</h3>
-<br/>
+<br>
<p>Users who cannot connect directly to the Tor network instead connect
via bridges, which are non-public relays. The following graphs display an
estimate of Tor users via bridges based on the unique IP addresses as seen
by a few hundred bridges.</p>
-<a id="bridge-users" />
+<a name="bridge-users"></a>
<%
StringBuilder bridgeUsersUrl = new StringBuilder("bridge-users.png");
if ("bridge-users".equals(request.getParameter("graph"))) {
@@ -232,54 +228,52 @@ if ("bridge-users".equals(request.getParameter("graph"))) {
}
}
out.println("<img src=\"" + bridgeUsersUrl.toString() + "\" width=\"576\" "
- + "height=\"360\" />");
-%>
-</p>
-<form action="users.html#bridge-users">
+ + "height=\"360\" alt=\"Bridge users graph\">");
+%><form action="users.html#bridge-users">
<div class="formrow">
- <input type="hidden" name="graph" value="bridge-users"/>
+ <input type="hidden" name="graph" value="bridge-users">
<p>
- <label class="startend" for="start">Start date (yyyy-mm-dd):</label>
- <input type="text" name="start" id="start" size="10"
+ <label>Start date (yyyy-mm-dd):</label>
+ <input type="text" name="start" size="10"
value="<%=("bridge-users".equals(request.getParameter("graph")) &&
request.getParameter("start") != null) ?
- request.getParameter("start") : ""%>"/>
- <label class="startend" for="end">End date (yyyy-mm-dd):</label>
- <input type="text" name="end" id="end" size="10"
+ request.getParameter("start") : ""%>">
+ <label>End date (yyyy-mm-dd):</label>
+ <input type="text" name="end" size="10"
value="<%=("bridge-users".equals(request.getParameter("graph")) &&
request.getParameter("end") != null) ?
- request.getParameter("end") : ""%>"/>
+ request.getParameter("end") : ""%>">
</p><p>
- <label>Source: </label>
- <input type="radio" name="country" value="all">All users</input>
- <input type="radio" name="country" value="au">Australia</input>
- <input type="radio" name="country" value="bh">Bahrain</input>
- <input type="radio" name="country" value="br">Brazil</input>
- <input type="radio" name="country" value="ca">Canada</input>
- <input type="radio" name="country" value="cn">China</input>
- <input type="radio" name="country" value="cu">Cuba</input>
- <input type="radio" name="country" value="de">Germany</input>
- <input type="radio" name="country" value="et">Ethiopia</input>
- <input type="radio" name="country" value="fr">France</input>
- <input type="radio" name="country" value="gb">U.K.</input>
- <input type="radio" name="country" value="ir">Iran</input>
- <input type="radio" name="country" value="it">Italy</input>
- <input type="radio" name="country" value="jp">Japan</input>
- <input type="radio" name="country" value="kr">South Korea</input>
- <input type="radio" name="country" value="mm">Burma</input>
- <input type="radio" name="country" value="pl">Poland</input>
- <input type="radio" name="country" value="ru">Russia</input>
- <input type="radio" name="country" value="sa">Saudi Arabia</input>
- <input type="radio" name="country" value="se">Sweden</input>
- <input type="radio" name="country" value="sy">Syria</input>
- <input type="radio" name="country" value="tn">Tunisia</input>
- <input type="radio" name="country" value="tm">Turkmenistan</input>
- <input type="radio" name="country" value="us">U.S.A.</input>
- <input type="radio" name="country" value="uz">Uzbekistan</input>
- <input type="radio" name="country" value="vn">Vietnam</input>
- <input type="radio" name="country" value="ye">Yemen</input>
+ Source:
+ <input type="radio" name="country" value="all">All users
+ <input type="radio" name="country" value="au">Australia
+ <input type="radio" name="country" value="bh">Bahrain
+ <input type="radio" name="country" value="br">Brazil
+ <input type="radio" name="country" value="ca">Canada
+ <input type="radio" name="country" value="cn">China
+ <input type="radio" name="country" value="cu">Cuba
+ <input type="radio" name="country" value="de">Germany
+ <input type="radio" name="country" value="et">Ethiopia
+ <input type="radio" name="country" value="fr">France
+ <input type="radio" name="country" value="gb">U.K.
+ <input type="radio" name="country" value="ir">Iran
+ <input type="radio" name="country" value="it">Italy
+ <input type="radio" name="country" value="jp">Japan
+ <input type="radio" name="country" value="kr">South Korea
+ <input type="radio" name="country" value="mm">Burma
+ <input type="radio" name="country" value="pl">Poland
+ <input type="radio" name="country" value="ru">Russia
+ <input type="radio" name="country" value="sa">Saudi Arabia
+ <input type="radio" name="country" value="se">Sweden
+ <input type="radio" name="country" value="sy">Syria
+ <input type="radio" name="country" value="tn">Tunisia
+ <input type="radio" name="country" value="tm">Turkmenistan
+ <input type="radio" name="country" value="us">U.S.A.
+ <input type="radio" name="country" value="uz">Uzbekistan
+ <input type="radio" name="country" value="vn">Vietnam
+ <input type="radio" name="country" value="ye">Yemen
</p><p>
- <input class="submit" type="submit" value="Update graph"/>
+ <input class="submit" type="submit" value="Update graph">
</p>
</div>
</form>
@@ -288,5 +282,5 @@ out.println("<img src=\"" + bridgeUsersUrl.toString() + "\" width=\"576\" "
Tor users (recurring and bridge) per month by country.</p>
<p><a href="csv/monthly-users-average.csv">CSV</a> file containing average
daily Tor users (recurring and bridge) per month by country.</p>
-<br/>
+<br>
diff --git a/templates/index.tpl.jsp b/templates/index.tpl.jsp
index f3c5472..d7e74f4 100644
--- a/templates/index.tpl.jsp
+++ b/templates/index.tpl.jsp
@@ -1,5 +1,5 @@
<h2>Tor Metrics Portal</h2>
- <br/>
+ <br>
<p>The Tor Metrics Portal aggregates all kinds of interesting
data about the Tor network and visualizes them in graphs and
reports. This portal also provides easy access to the underlying
@@ -17,7 +17,7 @@
<li>Try out the <a href="tools.html">tools</a> to parse and
evaluate the metrics data</li>
</ul>
- <br/>
+ <br>
<h3>News</h3>
<ul>
<li>October 7, 2010: Custom graphs are now available for all
diff --git a/templates/main.tpl.jsp b/templates/main.tpl.jsp
index 33dadc7..129022e 100644
--- a/templates/main.tpl.jsp
+++ b/templates/main.tpl.jsp
@@ -1,20 +1,20 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
-<head>
- <title><jsp:getProperty name="template" property="title"/></title>
- <meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
- <link href="/css/stylesheet-ltr.css" type=text/css rel=stylesheet>
- <link href="/images/favicon.ico" type=image/x-icon rel="shortcut icon">
-</head>
-<body>
- <div class="center">
- <jsp:include page='/WEB-INF/templates/banner.tpl.jsp' />
- <div class="main-column">
- <jsp:include page='<%=template.getTemplate()%>' />
- </div>
- </div>
- <div class="bottom" id="bottom">
- <jsp:include page='/WEB-INF/templates/footer.tpl.jsp' />
- </div>
-</body>
-</html>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+ <title><jsp:getProperty name="template" property="title"/></title>
+ <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+ <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet">
+ <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon">
+</head>
+<body>
+ <div class="center">
+ <jsp:include page='/WEB-INF/templates/banner.tpl.jsp' />
+ <div class="main-column">
+ <jsp:include page='<%=template.getTemplate()%>' />
+ </div>
+ </div>
+ <div class="bottom" id="bottom">
+ <jsp:include page='/WEB-INF/templates/footer.tpl.jsp' />
+ </div>
+</body>
+</html>
diff --git a/templates/research.tpl.jsp b/templates/research.tpl.jsp
index 7cefddc..d1e6cc0 100644
--- a/templates/research.tpl.jsp
+++ b/templates/research.tpl.jsp
@@ -1,5 +1,5 @@
<h2>Tor Metrics Portal: Research</h2>
- <br/>
+ <br>
<p>The Tor Metrics Project aims at supporting privacy enhancing
technologies research by making <a href="papers.html">papers</a>
and technical reports, gathered network
diff --git a/templates/research_data.tpl.jsp b/templates/research_data.tpl.jsp
index 5c72f74..2084e10 100644
--- a/templates/research_data.tpl.jsp
+++ b/templates/research_data.tpl.jsp
@@ -29,7 +29,7 @@
}
%>
<h2>Tor Metrics Portal: Data</h2>
- <br/>
+ <br>
<p>One of the main goals of the Tor Metrics Project is to make all
gathered data available to the public. This approach enables
privacy researchers to perform their own analyses using real data
@@ -46,10 +46,10 @@
<li><a href="#performance">Performance data</a></li>
<li><a href="#exitlist">Exit lists</a></li>
</ul>
- <br/>
- <a id="relaydesc"/>
+ <br>
+ <a name="relaydesc"></a>
<h3>Relay descriptor archives</h3>
- <br/>
+ <br>
<p>The relay descriptor archives contain all documents that the
directory authorities make available about the network of relays.
These documents include network statuses, server (relay)
@@ -112,7 +112,7 @@
out.write("</td>\n");
}
} else {
- out.write(" <td/>\n");
+ out.write(" <td></td>\n");
}
}
out.write(" </tr>\n");
@@ -127,10 +127,10 @@
}
%>
</table>
- <br/>
- <a id="bridgedesc"/>
+ <br>
+ <a name="bridgedesc"></a>
<h3>Bridge descriptor archives</h3>
- <br/>
+ <br>
<p>The bridge descriptor archives contain similar documents as the
relay descriptor archives, but for the non-public bridges. The
descriptors have been sanitized before publication to remove all
@@ -191,11 +191,11 @@
}
%>
</table>
- <p/>
- <br/>
- <a id="stats"/>
+ <p></p>
+ <br>
+ <a name="stats"></a>
<h3>Statistics produced by relays</h3>
- <br/>
+ <br>
<p>Some of the relays are configured to gather statistics on the
number of requests or connecting clients, the number of processed
cells per queue, or the number of exiting bytes per port. Relays
@@ -240,17 +240,17 @@
out.write("</td>\n");
}
} else {
- out.write(" <td/>\n");
+ out.write(" <td></td>\n");
}
}
out.write(" </tr>\n");
}
%>
</table>
- <br/>
- <a id="performance"/>
+ <br>
+ <a name="performance"></a>
<h3>Performance data</h3>
- <br/>
+ <br>
<p>We are measuring the performance of the Tor network by
periodically requesting files of different sizes and recording the
time needed to do so. The files below contain the output of the
@@ -272,7 +272,7 @@
+ "\">50 KiB requests</a></td>\n");
printedFiles.add(file);
} else {
- out.write(" <td/>\n");
+ out.write(" <td></td>\n");
}
file = source + "-1mb.data";
if (allFiles.containsKey(file)) {
@@ -280,7 +280,7 @@
+ "\">1 MiB requests</a></td>\n");
printedFiles.add(file);
} else {
- out.write(" <td/>\n");
+ out.write(" <td></td>\n");
}
file = source + "-5mb.data";
if (allFiles.containsKey(file)) {
@@ -288,16 +288,16 @@
+ "\">5 MiB requests</a></td>\n");
printedFiles.add(file);
} else {
- out.write(" <td/>\n");
+ out.write(" <td></td>\n");
}
out.write(" </tr>\n");
}
%>
</table>
- <br/>
- <a id="exitlist"/>
+ <br>
+ <a name="exitlist"></a>
<h3>Exit lists</h3>
- <br/>
+ <br>
<p>We are archiving the bulk exit lists used by
<a href="https://check.torproject.org/">Tor Check</a> containing
the IP addresses that exit relays exit from:</p>
diff --git a/templates/research_papers.tpl.jsp b/templates/research_papers.tpl.jsp
index d32c91a..7856494 100644
--- a/templates/research_papers.tpl.jsp
+++ b/templates/research_papers.tpl.jsp
@@ -1,13 +1,13 @@
<h2>Tor Metrics Portal: Papers</h2>
- <br/>
+ <br>
<p>The <a href="#papers">papers</a> and
<a href="#techreports">technical reports</a> listed on this page
originate from, or are based on, work performed in the Tor Metrics
Project.</p>
- <br/>
- <a id="papers">
+ <br>
+ <a name="papers"></a>
<h3>Papers</h3>
- <br/>
+ <br>
These papers summarize some of the results of of the Tor Metrics
Project and have been accepted for publication at academic
conferences or workshops.
@@ -22,10 +22,10 @@
Computer Security Research (WECSR 2010), Tenerife, Spain,
January 2010. (<a href="papers/wecsr10.pdf">PDF</a>, 160K)</li>
</ul>
- <br/>
- <a id="techreports">
+ <br>
+ <a name="techreports"></a>
<h3>Technical reports</h3>
- <br/>
+ <br>
The technical reports listed here have been the first place to
publish novel kinds of statistics on the Tor network. Some, but
not all, of the results contained in these technical reports have
diff --git a/templates/research_tools.tpl.jsp b/templates/research_tools.tpl.jsp
index 7d43d72..e04f043 100644
--- a/templates/research_tools.tpl.jsp
+++ b/templates/research_tools.tpl.jsp
@@ -1,5 +1,5 @@
<h2>Tor Metrics Portal: Tools</h2>
- <br/>
+ <br>
<p>This page contains a collection of tools that can be used to
gather statistics as provided on the <a href="data.html">Data</a>
page and to process the resulting files to generate
@@ -13,10 +13,10 @@
<li><a href="#exonerator">ExoneraTor</a></li>
<li><a href="#visitor">VisiTor</a></li>
</ul>
- <br/>
- <a id="metrics-db"/>
+ <br>
+ <a name="metrics-db"></a>
<h3>Metrics database</h3>
- <br/>
+ <br>
<p>The metrics database software is a Java application that parses
Tor's directory data and imports it into a PostgreSQL database.
This database can then be used to look up relays or perform
@@ -28,10 +28,10 @@
repository</a></li>
<li><tt>git clone git://git.torproject.org/metrics-db</tt></li>
</ul>
- <br/>
- <a id="metrics-web"/>
+ <br>
+ <a name="metrics-web"></a>
<h3>Metrics website</h3>
- <br/>
+ <br>
<p>The metrics website software is a Tomcat application that
accesses the metrics database to generate this website. The
metrics website uses R to generate custom graphs on demand.</p>
@@ -41,10 +41,10 @@
repository</a></li>
<li><tt>git clone git://git.torproject.org/metrics-web</tt></li>
</ul>
- <br/>
- <a id="dirarch"/>
+ <br>
+ <a name="dirarch"></a>
<h3>Directory-archive script</h3>
- <br/>
+ <br>
<p>The directory-archive script consists of a bunch of shell
scripts that periodically download relay descriptors, sort them
into a directory structure, and compile monthly tarballs. The
@@ -58,13 +58,13 @@
directory-archive script.</p>
<ul>
<li>Browse the <a href="https://gitweb.torproject.org/tor.git/tree/HEAD:/contrib/directory-archive">contrib/directory-archive/</a>
- subdirectory in the Tor sources</a></li>
+ subdirectory in the Tor sources</li>
<li><tt>git clone git://git.torproject.org/tor</tt></li>
</ul>
- <br/>
- <a id="bridgesan"/>
+ <br>
+ <a name="bridgesan"></a>
<h3>Bridge descriptor sanitizer</h3>
- <br/>
+ <br>
<p>The bridge authority Tonga maintains a list of bridges in order
to serve bridge addresses and descriptors to its clients. Every
half hour, Tonga takes a snapshot of the known bridge descriptors
@@ -85,10 +85,10 @@
<li>Browse the <a href="https://gitweb.torproject.org/metrics-utils.git/tree/HEAD:/bridge-desc-sanitizer">Git repository</a></li>
<li><tt>git clone git://git.torproject.org/metrics-utils</tt></li>
</ul>
- <br/>
- <a id="torperf"/>
+ <br>
+ <a name="torperf"></a>
<h3>Torperf</h3>
- <br/>
+ <br>
<p>Torperf is a little tool that measures Tor's performance as
users experience it. Torperf uses a trivial SOCKS client to
download files of various sizes over the Tor network and notes how
@@ -97,10 +97,10 @@
<li>Browse the <a href="https://gitweb.torproject.org/torperf.git">Git repository</a></li>
<li><tt>git clone git://git.torproject.org/torperf</tt></li>
</ul>
- <br/>
- <a id="exonerator"/>
+ <br>
+ <a name="exonerator"></a>
<h3>ExoneraTor</h3>
- <br/>
+ <br>
<p>ExoneraTor parses the relay descriptor archives to answer the
question whether some IP address was a Tor relay. This script is
available as a Python and a Java version with equivalent
@@ -113,10 +113,10 @@
<li>Browse the <a href="https://gitweb.torproject.org/metrics-utils.git/tree/HEAD:/exonerator">Git repository</a>
<li><tt>git clone git://git.torproject.org/metrics-utils</tt></li>
</ul>
- <br/>
- <a id="visitor"/>
+ <br>
+ <a name="visitor"></a>
<h3>VisiTor</h3>
- <br/>
+ <br>
<p>VisiTor is a script that parses a web server log and the exit
list archives to tell how many of the requests come from Tor
users.</p>
diff --git a/templates/status.tpl.jsp b/templates/status.tpl.jsp
index 760efcf..3be8fcc 100644
--- a/templates/status.tpl.jsp
+++ b/templates/status.tpl.jsp
@@ -1,5 +1,5 @@
<h2>Tor Metrics Portal: Status</h2>
- <br/>
+ <br>
<p>The network data collected by the Tor Metrics Project can be
used to analyze the Tor network status from a few years ago until
an hour ago. There are currently two applications for this data:
--
1.7.1