site

my website
git clone https://xfnw.ttm.sh/git/site.git
Log | Files | Refs

commit 4371d8e5b218a33b95599c547206bb2a0a48c470
Author: xfnw <xfnw@ttm.sh>
Date:   Thu, 22 Oct 2020 11:39:08 -0400

track website with git

Diffstat:
Aassets/xfnw.css | 57+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aavatar.png | 0
Abadge/s.php | 26++++++++++++++++++++++++++
Acountdown.html | 156+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aindex.html | 50++++++++++++++++++++++++++++++++++++++++++++++++++
Aproof.txt | 9+++++++++
Aproof.txt.sig | 11+++++++++++
Assh.txt | 31+++++++++++++++++++++++++++++++
Aweather/index.html | 149+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
9 files changed, 489 insertions(+), 0 deletions(-)

diff --git a/assets/xfnw.css b/assets/xfnw.css @@ -0,0 +1,57 @@ +/* ~xfnw's css! */ +/* gpl affero v3 */ +body { +background: #141415; +font-family: sans-serif; +color: #cdcdcd; +} + +h1, h2, h3, h4, h5 { + font-weight: 100; +} + +div { +border: 1px solid #cdcdcd; +border-left: 3px solid #cdcdcd; +padding: 10px; +border-radius: 0px 15px 15px 0px; +margin-top: 5px; +} + +html { +width: 700px; +margin: 0 auto; +} + +a { +text-decoration: none; +color: #acc; +} + +a:hover { +text-decoration: underline; +} + + +code, kbd, pre { +background: #555; +color: #eee; +} + +pre { +padding: 10px; +border-radius: 0px 10px 10px 0px; +border: 1px solid #cdcdcd; +border-left: 3px solid #cdcdcd; +overflow:auto; +} + + +@media screen and (max-width:700px) { +html { +width: 100%; +} +} + + + diff --git a/avatar.png b/avatar.png Binary files differ. diff --git a/badge/s.php b/badge/s.php @@ -0,0 +1,26 @@ +<?php +if (isset($_GET['t']) && isset($_GET['c'])) { +$title = $_GET['t']; +$content = $_GET['c']; +$len = (strlen($title . $content)*9)+20; +$offset = (strlen($title)*9)+10; + +// Set the content-type +header('Content-type: image/png'); + +$img = imagecreate($len, 30); + + $textbgcolor = imagecolorallocate($img, 30, 30, 32); + $textcolor = imagecolorallocate($img, 70, 255, 155); + +imagestring($img, 5, 5, 5, $title, $textcolor); +imagefilledrectangle( $img, $offset, 0, 2000, 30, $textcolor ); +imagestring($img, 5, $offset + 5, 5, $content, $textbgcolor); + + ob_start(); + imagepng($img); +} else { +echo "error<br>"; +echo "please set the `t` and `c` query perams to use this"; +} +?> diff --git a/countdown.html b/countdown.html @@ -0,0 +1,156 @@ + +<!DOCTYPE HTML> +<html> +<head> +<meta name="viewport" content="width=device-width, initial-scale=1"> +<style> +h1, h2 { + font-weight: 100 +} +h1 { + text-align: center; + font-size: 110px; + margin:0; + margin-top: 50px; + margin-bottom: 0px; + font-family: monospace; + color: #0f0; +} +h2 { + text-align: center; + font-family: monospace; + color: #0f0; + font-size: 40px; + margin:0; + margin-top: 60px; +} +body { + background-image: url('https://xfnw.ttm.sh/avatar.png'); + background-color: black; + background-size:256px; + border-radius:32px; + background-repeat: no-repeat; + background-attachment: fixed; + background-position: center; + overflow: hidden; + margin:0; + padding:0; +} + + +.blur { + -webkit-filter: url(#blur-filter); + filter: url(#blur-filter); + filter: blur(10px); + animation: blur 2s linear infinite; + } +.blur-svg { + display: none; + } +@keyframes blur { + 50% { filter: blur(0px) } + } + + + +.blink { + //animation: blinker 2s linear infinite; + position: fixed; + width: 100%; + opacity: 1; + } + @keyframes blinker { + 0% {transform: translateX(100%);} + 50% { opacity: 1; } + 100% {transform: translateX(-100%);} + } + +.blinkb { + background: black; + animation: blinkers 2s linear infinite; + position: fixed; + margin: 0px; + top: 0px; + left: 0px; + width: 100%; + height: 100%; + opacity: 1; + z-index: 1; + } + @keyframes blinkers { + 50% { opacity: 0; } + } + + +</style> + +<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="blur-svg"> + <defs> + <filter id="blur-filter"> + <feGaussianBlur stdDeviation="3"></feGaussianBlur> + </filter> + </defs> +</svg> + +</head> +<body> + +<h1 id="timer" class="blink"></h1> +<h2 id="message"></h2> + +<div class="blinkb"></div> + +<script> +// get the query string +function getQueryVariable(variable) { + var query = window.location.search.substring(1); + var vars = query.split("&"); + for (var i=0;i<vars.length;i++) { + var pair = vars[i].split("="); + if(pair[0] == variable){return pair[1];} + } + return(false); +} + +// better replacing +String.prototype.replaceAll = function(search, replacement) { + var target = this; + return target.replace(new RegExp(search, 'g'), replacement); +}; + +// Set the date were counting down to +var countDownDate = new Date(decodeURI(getQueryVariable("time"))).getTime(); + +// set the text +document.getElementById('message').innerHTML = getQueryVariable("text").replaceAll("%20", " "); + +// Update the count down every 1 second +var x = setInterval(function() { + + // Get todays date and time + var now = new Date().getTime(); + + // Find the distance between now and the count down date + var distance = countDownDate - now; + + // Time calculations for days, hours, minutes and seconds + var days = Math.floor(distance / (1000 * 60 * 60 * 24)); + var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); + var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60)); + var seconds = Math.floor((distance % (1000 * 60)) / 1000); + + // Output the result in an element with id="demo" + document.getElementById("timer").innerHTML = days + "d " + hours + "h " + + minutes + "m " + seconds + "s "; + + // If the count down is over, write some text + if (distance < 0) { + clearInterval(x); + document.getElementById("timer").innerHTML = "Stream Starting... Please Wait..."; + } +}, 1000); +</script> + +</body> +</html> + diff --git a/index.html b/index.html @@ -0,0 +1,50 @@ +<!DOCTYPE html> +<html> +<head> + <title>xfnw</title> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <link rel="stylesheet" href="assets/xfnw.css"> +</head> +<body> + <h1>xfnw</h1> + <div> + <a href="https://tildegit.org/xfnw">(tilde)</a><a href="https://xfnw.ttm.sh/git">git</a><a href="https://github.com/xfnw">(hub)</a> + <a href="https://twitch.tv/xfnw">Twitch</a> + <a href="mailto:xfnw+does+not+like+spam@ttm.sh">Email</a> + <a href="https://tilde.zone/@xfnw" rel="me">Fedi</a> + </div> + + <h1>About me</h1> + <p> + hey, im owen. im a student interested in open-source, linux, and software stuff in general. + when not doing this i enjoy amateur radio, reading, biking, building slightly unsafe + things with old computer parts and <a href="https://tilde.chat">going on irc</a>. + </p> + <p> + im a quite quiet person so dont be offended if i "ignore" you if we meet in person + </p> + + <h2>Feast your eyes on</h2> + <a href="https://xfnw.ttm.sh/blog">my blog</a> + or + <a href="https://xfnw.ttm.sh/xfwc">these images</a> + + <h2>i use lots of irc</h2> + <ul> + <li>freenode ##xfnw - freenode channel</li> + <li>tilde.chat #xfnw - tilde channel</li> + <li>irc.wppnx.pii.at #xfnw - channel on my weird testnet (<a href="https://jucelo.de">jucelo</a> want to peer with it?)</li> + </ul> + + <h1>public keys</h1> + <a href="proof.txt">proof</a> + <ul> + <li><b>tox:</b> 5EC5998A3EFC0663A5D2EDAF822A14FCA7AB11931A95CEF409CF6EB32E8EE4128D34CC31AFC7</li> + <li><b>age:</b> age15nwugsw8hdf20edhvmkpx357jvhq843k7vkp56fz5td8wnd6susqdt093l</li> + <li><b>signify:</b> RWQkR1Es1uIhT2VZdWpaITfS9bDh+uJiEEIOo1SrZltgRwBWdi3+ejSe</li> + <li><b>pgp:</b> <a href="gpg-armor.txt">AFC2DBC06ADB4DF6353C2F396DD55FE390CCCC7C</a></li> + <li><b>ssh:</b> <a href="ssh.txt">too many</a></li> + </ul> + +</body> diff --git a/proof.txt b/proof.txt @@ -0,0 +1,9 @@ +# proofs +go verify it at https://xfnw.ttm.sh/proof.txt.sig + - **age**: age15nwugsw8hdf20edhvmkpx357jvhq843k7vkp56fz5td8wnd6susqdt093l + - **signify**: RWQkR1Es1uIhT2VZdWpaITfS9bDh+uJiEEIOo1SrZltgRwBWdi3+ejSe + - **gpg**: AFC2DBC06ADB4DF6353C2F396DD55FE390CCCC7C + +This document will expire on 2021-01-01 and will need to be re-signed. +If that does not happen i probably forgot but it might be an imposter! + diff --git a/proof.txt.sig b/proof.txt.sig @@ -0,0 +1,11 @@ +untrusted comment: verify with xfnw.pub +RWQkR1Es1uIhT3aUptrc/RtzNDOwZ+c92luTWtiVqqFlCXY+XZaK6SVVIrFe9LFT3nOYTuPT5xFBmnJ7yau4KkpWwQiFDcaqsgw= +# proofs +go verify it at https://xfnw.ttm.sh/proof.txt.sig + - **age**: age15nwugsw8hdf20edhvmkpx357jvhq843k7vkp56fz5td8wnd6susqdt093l + - **signify**: RWQkR1Es1uIhT2VZdWpaITfS9bDh+uJiEEIOo1SrZltgRwBWdi3+ejSe + - **gpg**: AFC2DBC06ADB4DF6353C2F396DD55FE390CCCC7C + +This document will expire on 2021-01-01 and will need to be re-signed. +If that does not happen i probably forgot but it might be an imposter! + diff --git a/ssh.txt b/ssh.txt @@ -0,0 +1,31 @@ +ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGWrzyntW1bgfQ10SBIOMR0ZBkLVtBL1OAGzC2nmUGds ltc@cbarchbtw + +# i really need to get rid of these useless rsa keys lol +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDal1r7GYcDarvsNBV+0ZHM4968MLvzzzeMVYfF5VwFB6sAlrNUu0hAN9Y7Mdsq5aXbz4SIcMPfe6N6tHsCNct+8djuVP1VZBdPGcjjCXAHZIIFdYLfK3JprtiSQZ0Es0PJGYsimXWQNzqztSqevd0RA64kPY/G5VOGCB+JtHM2iwg29BWk4K4CRHpsrhf4M8LiYx0cZUcJoOoz4MHz1O4LMIR4I3FKndIDkosacEDthe6LUhLC0C7nXLb+G8hlZfWpCEUstsjCe85aMyJ1W/6C0JeUgg4SV+ka5ZFwPhZfELwYjhPUpKhyqw4EKpewr2P1gYOVxCiU8LDD2gNaYQ1pai5d125vII56qIcoFWNfb5eptF3ZVfZns4eCfgZx/E5BL9u3nu4qvdqoSs0RSeVTOcQ9T1ZL889OVJyeNMzRQ7KaDI5sGVecomILuPeV55OhP2IZ1UtMP8X+u0CDqNgLRwTGHxQhrqDkTmwV9SlaxxaFhIfA8y7U2/DKpnjm+BhAz3rqgCitNxG625m7uwfRsPsV41SBCHKYIYtB6k6IdgXwvFxOimO2Pq5VphtkTT5lQ6KRSfzStxLzOhbeSGx8OaUqR4RIWfQd8lpBXVxVk8p70lgqCKdfHH+Sh4URFoFhzx2EKA/myR6YO60n5I8s6pgvleA141N37Mv3lFHAVQ== lickthecheese@linuxmail.org + +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDal1r7GYcDarvsNBV+0ZHM4968MLvzzzeMVYfF5VwFB6sAlrNUu0hAN9Y7Mdsq5aXbz4SIcMPfe6N6tHsCNct+8djuVP1VZBdPGcjjCXAHZIIFdYLfK3JprtiSQZ0Es0PJGYsimXWQNzqztSqevd0RA64kPY/G5VOGCB+JtHM2iwg29BWk4K4CRHpsrhf4M8LiYx0cZUcJoOoz4MHz1O4LMIR4I3FKndIDkosacEDthe6LUhLC0C7nXLb+G8hlZfWpCEUstsjCe85aMyJ1W/6C0JeUgg4SV+ka5ZFwPhZfELwYjhPUpKhyqw4EKpewr2P1gYOVxCiU8LDD2gNaYQ1pai5d125vII56qIcoFWNfb5eptF3ZVfZns4eCfgZx/E5BL9u3nu4qvdqoSs0RSeVTOcQ9T1ZL889OVJyeNMzRQ7KaDI5sGVecomILuPeV55OhP2IZ1UtMP8X+u0CDqNgLRwTGHxQhrqDkTmwV9SlaxxaFhIfA8y7U2/DKpnjm+BhAz3rqgCitNxG625m7uwfRsPsV41SBCHKYIYtB6k6IdgXwvFxOimO2Pq5VphtkTT5lQ6KRSfzStxLzOhbeSGx8OaUqR4RIWfQd8lpBXVxVk8p70lgqCKdfHH+Sh4URFoFhzx2EKA/myR6YO60n5I8s6pgvleA141N37Mv3lFHAVQ== pi@raspberrypi + +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD0/8zzLzI5l11zjAiUAUUIv6ysiYki62BAN4xac2ILtvWA9P+aSfAiJnnSmSKfKoWqaOJpE8S3ZGsmwS12WhXcT6Bt9dnqwZLMai0IrDmai9Wewwb9q7uIKIwlYEs+I1AjSnb22YL24rQag37Rf8D6F2xKD1W8U9qOK0MUepoNyapUHmNkdBBhhQwmwdfU5dF6KU6mibtZAcze3flEzEa0Epk8CYPR2R66R9Cz3gCfqIV2GwW+JTgvzZLu6+Z2CnkGhYozl74do2VNukZcymNx5vdnpkxCHt19F0vj+9gS73XHp2Hid+q75i96UDKJjp2ldl26uSiWGqwOjkQDipzn owen@falcon + +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDYLISO6NsUGVM7kpncANYlBw0GwN7d+beDsE+L2bOwvvPqs/otCin2TGwXQrWusnSSGQW0q9E61NFkYMGf70DTyeat6RN/mg0zXeY7iK/mCo9mpT5/w3jHsS2MmEj+Q19gr58rnXx0NabLj8LZEmAj3CG8RKHu33xTy6BKkN2pMNpn9Bu329EkGUoHBbDTj6jk19YCCn81c7aYfvEYweD1rc6Z6AZdIQ9jqn0MRAdWy1K2MzOp3fz38bDB1D1qw5E70BgZYXa9klL3mVEGK1DNrA1tRYZrrqVJhXQ6Peo3BIXshJ+eK5y7EBlhKkRrW8bf3bwtMlZj4dCYWztU2EFgESBXoc/XxCSiH92iSflrSUM2v8onFo4t06KGFS71ojiTHG/IHS+oHHlfGx0D2wEQcC1EHgHlHxz/n7ba4tGZG9+gC5kJzdbskHc/tsKlwwt7ilqUrprWOOVL9v06F8WOz9pza7KWFo8X18k/FvluWflEkL55dOxQzIPGHHaG0OyW+zx1DpP02fswbZfd2pPIlN7Lsc/d8/l7n9c36o4yoXAjKyb/7zw+itG5t41CtSiYrGYKvSfdB21eU4hdZZa2GGlSSwzEBJN3rjm5WDYJU7zAz2QwfQsImsESQ4IRHlxriyDejc/noldmdMnds//keOyFgPpaYpV6bzuUOp0K8Q== pythonpro55@gmail.com + +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC+lT2t47JkogjVVuIi3dYsUl+4RLtr5v74kFGvwHx8J7ijj2KWLhyYEF0KvW3GcbtlqtMhvZVuBh/lWtsvTN4hVCcRkesZbGVA+795HFtOMKoeQCuM+kzGG5KcGZISLdY8SLlhxrPdZbJDHZQ/V1IbH7El6wd0nAl9FyC3XcgCp26AcKcbwtOIXpAzNc/bQyY9bc5eC4FLnSGUzRrrsotE6uQGm+sq4va89wqH12TimqbRK/bAhKtde2eoUif7vPs+OW+H566zni1jCZfoifpc+2RX5XZPkm4HapYI2vTL5kInv/pRilVk7Y+McYzNXGJLqRO04VMLDbzTLCzzhUzx JuiceSSH + +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC74Zn0IBK+WSVglutuuQuH6vJSvi5DPR8fLw61lh/6r1RCcEkNdrPU3LpKXLVEFKVo52n1ww6JtijRbOsbwBrvBrXJ5H0Jx21btqmjdiIRC7IB6Tqo0D+ee7OJ9Ir0wDjvgMSkPmzdKe8YL+uovypQQBS2MAw/dSKhkGVKiqgFs+wq3yHf5Sl18xTeeTO7RQw74lX1JPFQtJmvMT/AwcZUWZcsbFDveJQ5oZjPCrLZebEj+FWgis2rFDOVyiiiqCLiD8HK3SyONc3Ue0tqwziz0fn+s2OFJ7abOqvQIRbmeN2mWqxGOjeoMIjXHPh5GurPQi3auB7eSPxzgLKosPXD root@localhost + + +# ah yes the nice and small curve 25519 owo +ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGWrzyntW1bgfQ10SBIOMR0ZBkLVtBL1OAGzC2nmUGds ltc@cbarchbtw + +ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEEzpEn2Mrl2eYaL4eoyTHuvtFc+at2lpf+2J5SrpxGI lickthecheese@ltcboot + +ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINOc3Tszy1sVU59fNsnpQ2Ze065Mo2qY2tA3KUlWTkW3 xfnw@tilde + + + +ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIg4oINXfoka5d5WrjClwSOV8BT54pjjYWu5hKgSXwG+ xfnw@sparrow +ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIImbwvjTzjkeLJapFt9s1QiCBF8a16OmYgQR1irlFqP9 xfnw@rawtext.club + +ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIP63ZNgCwRQXWUo4f2gKSItRWjN7IfvlAwqK/VTioQHh xfnw@shadow + + diff --git a/weather/index.html b/weather/index.html @@ -0,0 +1,149 @@ +<!DOCTYPE html> +<html> +<head> + <title>xfnw's weather radar</title> + + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + + <link rel="stylesheet" href="https://unpkg.com/leaflet@1.5.1/dist/leaflet.css"/> + <script src="https://unpkg.com/leaflet@1.5.1/dist/leaflet.js"></script> +</head> +<body> + <div style="text-align:center; position: absolute;bottom: 0px; left: 0; right: 0; height: 80px;color:white;font-family: mono,monospace,fixed-width;z-index:10000"><span id="timestamp"></span><br>Radar data &copy; RainViewer, Map data &copy; Carto CC BY 3.0 and OpenStreetMap</div> + +<input style="position: absolute;bottom:10px;right: 10px;z-index:10000;background-color:black;font-family:mono,monospace,fixed-width;color:white;border:1px solid white" type="button" onclick="playStop();" value="Play" /> + + +<div id="mapid" style="position: absolute; top: 0px; left: 0; bottom: 0; right: 0;background-color: black"></div> + +<script> + + var map = L.map('mapid').setView([39.132190775931036, -77.19543457031251], 9); +/* + L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { + attributions: 'Map data © <a href="https://openstreetmap.org">OpenStreetMap</a> contributors' + }).addTo(map); +*/ + + + L.tileLayer('https://cartodb-basemaps-{s}.global.ssl.fastly.net/dark_all/{z}/{x}/{y}.png', { + attributions: 'Map data © Carto CC BY 3.0 and <a href="https://openstreetmap.org">OpenStreetMap</a> contributors' + }).addTo(map); + + /** + * RainViewer radar animation part + * @type {number[]} + */ + var timestamps = []; + var radarLayers = []; + + var animationPosition = 0; + var animationTimer = false; + + /** + * Load actual radar animation frames timestamps from RainViewer API + */ + var apiRequest = new XMLHttpRequest(); + apiRequest.open("GET", "https://api.rainviewer.com/public/maps.json", true); + apiRequest.onload = function(e) { + + // save available timestamps and show the latest frame: "-1" means "timestamp.lenght - 1" + timestamps = JSON.parse(apiRequest.response); + showFrame(-1); + }; + apiRequest.send(); + + /** + * Animation functions + * @param ts + */ + function addLayer(ts) { + if (!radarLayers[ts]) { + radarLayers[ts] = new L.TileLayer('https://tilecache.rainviewer.com/v2/radar/' + ts + '/256/{z}/{x}/{y}/2/1_1.png', { + tileSize: 256, + opacity: 0.01, + zIndex: ts + }); + } + if (!map.hasLayer(radarLayers[ts])) { + map.addLayer(radarLayers[ts]); + } + } + + /** + * Display particular frame of animation for the @position + * If preloadOnly parameter is set to true, the frame layer only adds for the tiles preloading purpose + * @param position + * @param preloadOnly + */ + function changeRadarPosition(position, preloadOnly) { + while (position >= timestamps.length) { + position -= timestamps.length; + } + while (position < 0) { + position += timestamps.length; + } + + var currentTimestamp = timestamps[animationPosition]; + var nextTimestamp = timestamps[position]; + + addLayer(nextTimestamp); + + if (preloadOnly) { + return; + } + + animationPosition = position; + + if (radarLayers[currentTimestamp]) { + radarLayers[currentTimestamp].setOpacity(0); + } + radarLayers[nextTimestamp].setOpacity(0.3); + + document.getElementById("timestamp").innerHTML = (new Date(nextTimestamp * 1000)).toString(); + } + + /** + * Check avialability and show particular frame position from the timestamps list + */ + function showFrame(nextPosition) { + var preloadingDirection = nextPosition - animationPosition > 0 ? 1 : -1; + + changeRadarPosition(nextPosition); + + // preload next next frame (typically, +1 frame) + // if don't do that, the animation will be blinking at the first loop + changeRadarPosition(nextPosition + preloadingDirection, true); + } + + /** + * Stop the animation + * Check if the animation timeout is set and clear it. + */ + function stop() { + if (animationTimer) { + clearTimeout(animationTimer); + animationTimer = false; + return true; + } + return false; + } + + function play() { + showFrame(animationPosition + 1); + + // Main animation driver. Run this function every 500 ms + animationTimer = setTimeout(play, 500); + } + + function playStop() { + if (!stop()) { + play(); + } + } +</script> + +</body> +</html> + +