Add fe-map and iss sources, The Shape of Distance as published, contribution guide
- femap/: planar best-effort solver, build, result and page (fe-map.aethercosmology.com) - satellites/: The Sync Test build, ISS elements, SatNOGS timings and page (iss.aethercosmology.com) - src/handoff/The_Shape_of_Distance_PRESENTATION.html: inputs for both - CONTRIBUTING.md; README and LICENSE-DATA cover all four sites; GitHub mirror for issues and pull requests Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -222,7 +222,6 @@ summary{cursor:pointer;font:600 14px var(--display);text-transform:uppercase;let
|
||||
<div class="hero" id="hero">
|
||||
<canvas id="cv" aria-label="Map of measured routes along submarine cables"></canvas>
|
||||
<div class="hud tl">
|
||||
<div class="eyebrow" id="eyeb">16 cities · 608 cables · 4 maps</div>
|
||||
<h1>Cable Latency Survey</h1>
|
||||
<p>Measured round-trip times between cities, compared with the minimum propagation time along submarine-cable routes on four models of the Earth's surface.</p>
|
||||
</div>
|
||||
@@ -328,7 +327,7 @@ summary{cursor:pointer;font:600 14px var(--display);text-transform:uppercase;let
|
||||
|
||||
<section>
|
||||
<h2 class="sec">Code and data</h2>
|
||||
<p class="lede">The code, the raw measurement logs and the derived data are public. Code is released under the MIT licence; the measurements and derived data under CC BY 4.0. Third-party inputs remain under their own terms and are downloaded by a script rather than redistributed.</p>
|
||||
<p class="lede">The code, the raw measurement logs and the derived data are public. Code is released under the MIT licence; the measurements and derived data under CC BY 4.0. Third-party inputs remain under their own terms and are downloaded by a script rather than redistributed. Corrections, new measurements and re-analyses are welcome, including ones that disagree with the results.</p>
|
||||
<div class="dl" id="code"></div>
|
||||
<pre id="repro"></pre>
|
||||
</section>
|
||||
@@ -353,7 +352,7 @@ const MNAME=Object.fromEntries(MODELS),NK={globe:"globe",ae:"ae",dp:"dualpole",m
|
||||
const reduce=matchMedia("(prefers-reduced-motion: reduce)").matches;
|
||||
const S={src:"all",view:"ae",sel:null,hover:null,site:null,onlyBad:false,pulses:!reduce,mode:"cable",tab:"route"};
|
||||
const MODE={cable:"sea-cable route",line:"straight line"};
|
||||
const GIT="https://git.aethercosmology.com/toby/cable-latency-survey",SRCV=GIT+"/src/branch/main/",RAWV=GIT+"/raw/branch/main/";
|
||||
const GH="https://github.com/aetherbird/cable-latency-survey",GIT="https://git.aethercosmology.com/toby/cable-latency-survey",SRCV=GIT+"/src/branch/main/",RAWV=GIT+"/raw/branch/main/";
|
||||
const lnk=(href,t)=>`<a href="${href}" target="_blank" rel="noopener">${t}</a>`;
|
||||
const netName=n=>/^home/.test(n)?"residential connection, Michigan":n.replace(/^our /,"");
|
||||
const fmt=(x,d=1)=>x.toLocaleString("en-US",{minimumFractionDigits:d,maximumFractionDigits:d});
|
||||
@@ -605,8 +604,12 @@ function readout(){
|
||||
function segDist(px,py,a,b){const dx=b[0]-a[0],dy=b[1]-a[1],l=dx*dx+dy*dy;let t=l?((px-a[0])*dx+(py-a[1])*dy)/l:0;t=Math.max(0,Math.min(1,t));return Math.hypot(px-a[0]-t*dx,py-a[1]-t*dy)}
|
||||
function nearest(mx,my){
|
||||
for(const [i,q] of siteHits)if(Math.hypot(q[0]-mx,q[1]-my)<9)return{site:i};
|
||||
let best=null,bd=7;for(const [i,s] of hits)for(let j=1;j<s.length;j++){const d=segDist(mx,my,s[j-1],s[j]);if(d<bd){bd=d;best={pair:i}}}
|
||||
return best;
|
||||
const dm=new Map();for(const [i,s] of hits)for(let j=1;j<s.length;j++){const d=segDist(mx,my,s[j-1],s[j]);if(d<7&&d<(dm.get(i)??1e9))dm.set(i,d)}
|
||||
if(!dm.size)return null;
|
||||
/* routes sharing a cable overlap: take the one drawn on top (selected, then red, orange, cyan) */
|
||||
const m=Math.min(...dm.values());let best=null,bp=-1;
|
||||
for(const [i,d] of dm){if(d>m+1.5)continue;const pr=i===S.sel?9:rt(LP[i]).tier;if(pr>bp||(pr===bp&&d<dm.get(best))){bp=pr;best=i}}
|
||||
return{pair:best};
|
||||
}
|
||||
let drag=null,hoverRAF=false;
|
||||
cv.addEventListener("pointerdown",e=>{drag={x:e.clientX,y:e.clientY,moved:false};cv.setPointerCapture(e.pointerId)});
|
||||
@@ -911,7 +914,8 @@ function renderCode(){
|
||||
["analyze_wn.py","WonderNetwork archive: statistics, mislocated servers"],["cables.py","published cable lengths on each model"],["network.py","cable-and-land routing on each model"],["trace.py","RIPE Atlas sea crossings"],
|
||||
["asmap.py","network attribution from public BGP data"],["pingmap.py","shape fit without positions"],["build.py","this page"],["export.py","JSON data hand-off"]];
|
||||
document.getElementById("code").innerHTML=`
|
||||
<div>Repository</div><div>${lnk(GIT,GIT.replace("https://",""))}</div>
|
||||
<div>Repository</div><div>${lnk(GIT,GIT.replace("https://",""))} · mirror ${lnk(GH,GH.replace("https://",""))}</div>
|
||||
<div>Contribute</div><div>${lnk(GH+"/blob/main/CONTRIBUTING.md","How to contribute")} · ${lnk(GH+"/issues","issues")} · ${lnk(GH+"/pulls","pull requests")}</div>
|
||||
<div>Data hand-off</div><div>${lnk(RAWV+"cable_latency_survey_data_v2.json","cable_latency_survey_data_v2.json")} (every measurement, site, route and cable path) · ${lnk(RAWV+"cable_latency_survey_data.json","version 1")}</div>
|
||||
<div>Globalping</div><div>${gp.map((r,i)=>f(r.file,`run ${i+1}`)).join(" · ")}: raw results; each carries its Globalping measurement ID</div>
|
||||
<div>Vultr servers</div><div>${vps.map(v=>`${v}: ${f(`data/vps/${v}/ping.log`,"ping")}, ${f(`data/vps/${v}/mtr.log`,"traceroute")}`).join(" · ")}</div>
|
||||
@@ -989,7 +993,7 @@ const ia=LS.findIndex(s=>s.name==="Sydney"),ib=LS.findIndex(s=>s.name==="Aucklan
|
||||
S.sel=LP.find(p=>(p.a===ia&&p.b===ib)||(p.a===ib&&p.b===ia)).idx;
|
||||
document.querySelectorAll("#mode button").forEach(b=>b.classList.toggle("on",b.dataset.mode===S.mode));
|
||||
document.getElementById("srcsel").value=S.src;
|
||||
{document.getElementById("eyeb").textContent=`${LS.length} sites · ${Object.keys(D.netlines).length} cables · 4 models`;
|
||||
{
|
||||
document.getElementById("step1").textContent=`Globalping probes, rented Vultr servers and a residential connection measured round-trip times to RIPE Atlas anchors and to each other across ${LS.length} sites. The minimum for each pair is used.`}
|
||||
legend();renderScore();renderLadder();buildSM();renderX();renderNet();byoInit();renderMethod();renderCode();
|
||||
readout();renderCard();resize();renderEx();drawSM();drawSpeed();kick();frame();
|
||||
|
||||
Reference in New Issue
Block a user