Help
RSS
API
Feed
Maltego
Contact
Domain > jnomar.com
×
Welcome!
Right click nodes and scroll the mouse to navigate the graph.
×
More information on this domain is in
AlienVault OTX
Is this malicious?
Yes
No
DNS Resolutions
Date
IP Address
2025-09-06
3.5.164.64
(
ClassC
)
2025-09-26
3.5.167.219
(
ClassC
)
2025-09-29
3.5.165.22
(
ClassC
)
2026-01-19
3.5.169.159
(
ClassC
)
Port 80
HTTP/1.1 200 OKx-amz-id-2: 1/TjT7OVWFwhCjhl/zh41uXgEhDGRSB2+tIyreKBBHeIyMB5G6oVxbb6eu7J77w+5dWqrq6HF/Ax-amz-request-id: D22KA5X2D53TMQ2CDate: Mon, 19 Jan 2026 12:17:03 GMTLast-Modified: Tue, 26 Aug 2025 06:44:12 GMTETag: 946420d6de09084a2bff9ad6d3f0b580Content-Type: text/htmlContent-Length: 8462Server: AmazonS3 !DOCTYPE html>html langen>head>meta charsetUTF-8>title>Guitar String Note Trainer/title>style> :root { --bg-color: #1f1f1f; --text-color: #eee; --accent-color: #00ffff; /* modern cyan */ --secondary-color: #ff9800; --answer-color: limegreen; --sidebar-bg: #2a2a2a; --input-bg: #333; --input-hover: #444; --button-bg: #444; --button-hover: #555; } body { font-family: Segoe UI, Tahoma, Geneva, Verdana, sans-serif; background-color: var(--bg-color); color: var(--text-color); margin: 0; display: flex; height: 100vh; } .sidebar { width: 280px; background-color: var(--sidebar-bg); padding: 20px; box-sizing: border-box; overflow-y: auto; } .sidebar h2 { margin-top: 0; color: var(--accent-color); font-size: 1.6em; text-align: center; margin-bottom: 20px; } label { display: block; margin-top: 10px; margin-bottom: 5px; font-weight: bold; } inputtypenumber, select, .custom-time { width: 100%; padding: 6px 10px; background: var(--input-bg); border: none; color: var(--text-color); border-radius: 6px; font-size: 1em; margin-bottom: 10px; box-sizing: border-box; appearance: none; } inputtypenumber:hover, select:hover, .custom-time:hover { background: var(--input-hover); } select { cursor: pointer; } .inline { display: flex; align-items: center; justify-content: space-between; } .inline label { margin: 0; flex: 1; } .inline input, .inline select { flex: 1; margin-left: 10px; } .main { flex: 1; display: flex; flex-direction: column; justify-content: center; align-items: center; padding: 20px; } .title { font-size: 3em; font-weight: bold; color: var(--accent-color); margin-bottom: 20px; text-align: center; } .note, .answer { font-size: 2.5em; margin: 15px 0; min-height: 1.2em; } .note.active { color: var(--accent-color); font-weight: bold; } .answer { font-size: 1.3em; } .timer { font-size: 1.2em; margin-top: 10px; } #toggleBtn { background-color: var(--button-bg); border: none; color: var(--text-color); padding: 10px 25px; font-size: 1.2em; cursor: pointer; margin-top: 15px; border-radius: 6px; transition: background-color 0.2s ease; } #toggleBtn:hover { background-color: var(--button-hover); } /* Custom dropdown style */ select { -webkit-appearance: none; -moz-appearance: none; appearance: none; background: var(--input-bg) url(data:image/svg+xml;charsetUS-ASCII,svg xmlnshttp://www.w3.org/2000/svg width20 height20 fill%23eee>polygon points0,0 20,0 10,10/>/svg>) no-repeat right 10px center; background-size: 12px; }/style>/head>body>div classsidebar> h2>Settings/h2> label forstringSelect>String:/label> select idstringSelect> option valueE_low>Low E (6th)/option> option valueA>A (5th)/option> option valueD>D (4th)/option> option valueG>G (3rd)/option> option valueB selected>B (2nd)/option> option valueE_high>High E (1st)/option> /select> label fortimeInput>Time per question (seconds):/label> input typenumber idtimeInput value10 min1> label foranswerTimeInput>Time to show answer (seconds):/label> input typenumber idanswerTimeInput value2 min0.5 step0.5> label>Total run time:/label> div classinline> select idtotalMinutes> ${Array.from({length:11},(_,i)>`option value${i}>${i} min/option>`).join()} /select> select idtotalSeconds> ${Array.from({length:13},(_,i)>i*5).map(v>`option value${v}>${v} s/option>`).join()} /select> /div> label forcustomTime>Or custom time:/label> input typetext idcustomTime classcustom-time placeholder5m20s or 180s>/div>div classmain> div classtitle>🎸 Guitar String Note Trainer 🎶/div> div classnote idnoteDisplay>/div> div classanswer idanswerDisplay>/div> div classtimer idtimerDisplay>/div> button idtoggleBtn>Start/button>/div>script>(function() { const notes A, A#, B, C, C#, D, D#, E, F, F#, G, G#; function generatePositions(openNote) { let positions {}; let startIndex notes.indexOf(openNote); for (let fret 0; fret 23; fret++) { let noteName notes(startIndex + fret) % notes.length; if (!positionsnoteName) positionsnoteName ; positionsnoteName.push(fret); } return positions; } const stringTunings { E_low: E, A: A, D: D, G: G, B: B, E_high: E }; const fretMaps {}; for (let key in stringTunings) { fretMapskey generatePositions(stringTuningskey); } let timer null; let timeLeft 0; let running false; let currentNote null; let lastNote null; let showingAnswer false; let totalTimeLeft 0; const noteDisplay document.getElementById(noteDisplay); const answerDisplay document.getElementById(answerDisplay); const timerDisplay document.getElementById(timerDisplay); const timeInput document.getElementById(timeInput); const answerTimeInput document.getElementById(answerTimeInput); const totalMinutesInput document.getElementById(totalMinutes); const totalSecondsInput document.getElementById(totalSeconds); const customTimeInput document.getElementById(customTime); const stringSelect document.getElementById(stringSelect); const toggleBtn document.getElementById(toggleBtn); function parseCustomTime(str){ str str.trim().toLowerCase(); if(!str) return null; if(str.endsWith(s)) return parseInt(str) || null; const m str.match(/(\d+)m(\d*)s?/); if(m){ let minutes parseInt(m1); let seconds m2? parseInt(m2) : 0; return minutes*60 + seconds; } const n parseInt(str); if(!isNaN(n)) return n; return null; } function pickRandomNote() { let newNote; do { newNote notesMath.floor(Math.random() * notes.length); } while (newNote lastNote); lastNote newNote; return newNote; } function nextNote() { if (!running) return; if (answerDisplay.textContent) answerDisplay.style.color #ff9800; showingAnswer false; currentNote pickRandomNote(); noteDisplay.textContent currentNote; noteDisplay.style.visibility visible; noteDisplay.classList.add(active); timeLeft parseInt(timeInput.value,10); updateTimerDisplay(); clearInterval(timer); timer setInterval(countDown,1000); } function countDown(){ timeLeft--; totalTimeLeft--; updateTimerDisplay(); if(timeLeft 0){ clearInterval(timer); if(!showingAnswer) showAnswer(); else if(totalTimeLeft>0) nextNote(); else stopQuiz(); } if(totalTimeLeft0) stopQuiz(); } function updateTimerDisplay(){ timerDisplay.textContent `Time left: ${Math.floor(totalTimeLeft/60)}:${(0+(totalTimeLeft%60)).slice(-2)}s`; } function showAnswer(){ const selectedString stringSelect.value; const frets fretMapsselectedStringcurrentNote; answerDisplay.textContent `${currentNote} → frets ${frets.join( and )}`; answerDisplay.style.color limegreen; noteDisplay.style.visibility hidden; noteDisplay.classList.remove(active); showingAnswer true; timeLeft parseFloat(answerTimeInput.value); timer setInterval(countDown,1000); } function stopQuiz(){ runningfalse; clearInterval(timer); toggleBtn.textContentStart; } toggleBtn.addEventListener(click,function(){ if(!running){ let total parseCustomTime(customTimeInput.value); if(totalnull){ const mins parseInt(totalMinutesInput.value)||0; const secs parseInt(totalSecondsInput.value)||0; total mins*60 + secs; } totalTimeLeft total>0?total:300; running true; toggleBtn.textContentStop; nextNote(); } else stopQuiz(); });})();/script>/body>/html>
View on OTX
|
View on ThreatMiner
Please enable JavaScript to view the
comments powered by Disqus.
Data with thanks to
AlienVault OTX
,
VirusTotal
,
Malwr
and
others
. [
Sitemap
]