Вячеслав Скоблей

Вячеслав Скоблей
Рейтинг
109
Регистрация
31.07.2012
Должность
Типичный интернетчик
Вячеслав Скоблей (ака FILES) - типичный интернетчик
yandrey #:

7 или 9 лет значительная разница? 

Новый скафандр NASA разрабатывает с 2016 года и в 2019 году он был уже фактически готов! Практически в той же конфигурации он полетит на Луну в 2028 году! Откуда вы берете цифру 9 и 7? 
юни #:
Американцы не умеют жить без желудочно-кишечных подробностей
Не читайте советских газет, товарищ
yandrey #:
первый прототип представлен в 2019, значит начали работу не сильно позже старта программы 😀

В том и дело, что скафандр был разработан в 2019 и в этом году утвержден для полета (а не разрабатывался с тех лет )) Ракета для старта уже была готова (до старта программы), а вот посадочный модуль еще в стадии разработки.

Такое ощущение, что вам заблокировали ютубе, а интернет доступен по заранее подготовленным спискам.

yandrey #:

2017 год старт программы, Артемида-4 2028 цель - Посадка на Луну с экипажем.

крайние испытания скафандра были в феврале

Так а информация про 9 лет разработки скафандра откуда? И при чем здесь старт программы? Это не так работает ))

yandrey #:
Посадка на луну через 1-2 года, а скафандр xEMU разрабатывается 9 лет и всё ещё не готов 😀
Откуда вы взяли эту информацию: про 9 лет и все еще не готов ? Просто интересно
yodda #:

Странно, как луна может так ярко освещать? Ведь ночью не так ярко

Снято на зеркалку Nikon D5 с ISO 51200, поэтому кажется что снято днем )). На самом деле, там действительно темно (для человеческого глаза) 

Вспомнилось, что полеты Аполлонов не транслировались в СССР! Весь мир следил за полетами американцев, а советскому человеку стыдно было это показывать! Все повторяется?

  • На заблокированном ютубе комментировали полет Артемиды-2 какие-то иноагенты, без синхронного перевода
  • В прессе только ехидность и желчь (про сломанный туалет на первых полосах, сгорят при возвращении, издеваются с космонавтов, решили повторить то, что уже 50 лет назад было сделано и т.д.)
  • Из новых учебников астрономии исчезли все упоминания про посадки американцев на Луну (школьнику теперь легче поверить в "лунную аферу", чем интересоваться достижениями "Артемиды")
Артемида-2 - большое и важное событие, но очень маленькое в череде множества последующих! Они не летят к Луне делать селфи и доказывать миру, что США сильные! Они летят туда строить базы и плацдарм для последующих полетев на Марс! Кто-бы это ни был в будущем, пожелаем им удачи! Ведь колонизация других небесных тел - едиенственный шанс для человечества обрести бессмертие (в рамках изолированной Земли, мы все, к сожалению, обречены на погибель)

Я использую такой простейший анализатор access.log файлов, для выявления проблемных UА і IP (более 200 запросов в минуту - можно уменьшить под себя). Может кому пригодиться.



Сохраняем файл, например, index.html и запускаем в своем браузере

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Log Dashboard (Drag & Drop)</title>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<style>
body {font-family:Arial; background:#f4f6f9; padding:20px;}
.dropzone {
    border:2px dashed #aaa;
    padding:40px;
    text-align:center;
    border-radius:12px;
    background:#fff;
    cursor:pointer;
    transition:0.3s;
}
.dropzone.dragover {
    border-color:#4361ee;
    background:#eef2ff;
}
.card {background:#fff; padding:20px; border-radius:12px; margin-top:20px;}
.grid-2 {display:grid; grid-template-columns:1fr 1fr; gap:20px;}
.grid-3 {display:grid; grid-template-columns:1fr 1fr 1fr 1fr; gap:20px;}
table {width:100%; border-collapse:collapse;}
th,td {padding:8px; border-bottom:1px solid #ddd; font-size:13px;}
textarea {width:100%; height:120px;}
</style>
</head>

<body>
<div class="dropzone" id="dropzone">
    📂 Перетащи сюда access.log или кликни
    <input type="file" id="fileInput" hidden>
</div>

<div id="app" style="display:none;">

<div class="grid-2">
    <div class="card">
        <h3>Status Codes</h3>
        <canvas id="statusChart"></canvas>
    </div>
<div class="card">
        <h3>Total Requests: <span id="total"></span></h3>
        <canvas id="hourChart"></canvas>
        <h3>🚨 Burst IP (200+ req/min)</h3>
        <textarea id="burstBox"></textarea>
    </div>
</div>
<div class="grid-3">
    <div class="card"><h3>Top IP</h3><table id="ipTable"></table></div>
    <div class="card"><h3>Top Agents</h3><table id="agentTable"></table></div>
    <div class="card"><h3>Top URL</h3><table id="urlTable"></table></div>
    <div class="card"><h3>Top 404</h3><table id="errTable"></table></div>
</div>
</div>
<script>
const dropzone = document.getElementById('dropzone');
const fileInput = document.getElementById('fileInput');
dropzone.addEventListener('click', () => fileInput.click());
dropzone.addEventListener('dragover', e => {
    e.preventDefault();
    dropzone.classList.add('dragover');
});

dropzone.addEventListener('dragleave', () => {
    dropzone.classList.remove('dragover');
});

dropzone.addEventListener('drop', e => {
    e.preventDefault();
    dropzone.classList.remove('dragover');
    handleFile(e.dataTransfer.files[0]);
});

fileInput.addEventListener('change', e => {
    handleFile(e.target.files[0]);
});

function handleFile(file){
    const reader = new FileReader();

    reader.onload = function(){
        const lines = reader.result.split('\n');
        const pattern = /^(\S+) \S+ \S+ \[([^\]]+)\] "(\S+) (\S+) (\S+)" (\d{3}) .* "([^"]*)"$/;
        let logs = [];
        lines.forEach(line=>{
            let m = line.match(pattern);
            if(m){
                logs.push({
                    ip: m[1],
                    datetime: m[2],
                    url: m[4],
                    status: m[6],
                    agent: m[7]
                });
            }
        });
        process(logs);
        document.getElementById('app').style.display = 'block';
    };

    reader.readAsText(file);
}

function process(logs){
    let statusStats={}, ipStats={}, agentStats={}, urlStats={}, err404={}, hourStats=Array(24).fill(0), minuteStats={};
    logs.forEach(l=>{
        statusStats[l.status]=(statusStats[l.status]||0)+1;
        ipStats[l.ip]=(ipStats[l.ip]||0)+1;
        agentStats[l.agent]=(agentStats[l.agent]||0)+1;
        urlStats[l.url]=(urlStats[l.url]||0)+1;

        if(l.status==404) err404[l.url]=(err404[l.url]||0)+1;

        let h=l.datetime.match(/:(\d{2}):/);
        if(h) hourStats[+h[1]]++;

        let m=l.datetime.match(/:(\d{2}:\d{2}):/);
        if(m){
            let minute=m[1];
            if(!minuteStats[minute]) minuteStats[minute]={};
            minuteStats[minute][l.ip]=(minuteStats[minute][l.ip]||0)+1;
        }
    });

let burstSet = new Set();
for(let minute in minuteStats){
    for(let ip in minuteStats[minute]){
        if(minuteStats[minute][ip] >= 200){
            burstSet.add(ip);
        }
    }
}
let burst = Array.from(burstSet);

    document.getElementById('burstBox').value =
        burst.map(ip=>"Deny from "+ip).join("\n");

    document.getElementById('total').innerText = logs.length;

    new Chart(statusChart, {
        type:'pie',
        data:{labels:Object.keys(statusStats), datasets:[{data:Object.values(statusStats)}]}
    });

    new Chart(hourChart, {
        type:'bar',
        data:{labels:[...Array(24).keys()], datasets:[{data:hourStats}]}
    });

function fill(el, data, type){
    let html = "";

    Object.entries(sort(data)).slice(0,30).forEach(([k,v]) => {

        let key = k;
        // 🔴 подсветка burst IP
        if(type === 'ip' && burstSet.has(k)){
            key = `<span style="color:red;font-weight:bold">${k}</span>`;
        }
        if(type === 'ip'){
            key = `<a href="https://ipinfo.io/${encodeURIComponent(k)}" target="_blank" rel="noopener noreferrer">${key}</a>`;
        }
        html += `<tr><td>${key}</td><td>${v}</td></tr>`;
    });
    el.innerHTML = html;
}
fill(ipTable, ipStats, 'ip');
fill(agentTable, agentStats);
fill(urlTable, urlStats);
fill(errTable, err404);
}
function sort(obj){
    return Object.fromEntries(
        Object.entries(obj).sort((a,b)=>b[1]-a[1])
    );
}
</script></body></html>
vovchansky #:

что-то ИИшка говорит что вообще никаких компов для этого не нужно... может мы о разных вещах говорим?

там типа достаточно одного домена и всё если ты владелец домена - то уже можешь майнить

Вот вы и подвели плавно к "майнингу на доменах" - в этом майнинге действительно необходимо лишь подтвердить право владения доменом через TXT запись в DNS.

В основе этой затеи лежит токен Domain (DMN) с нулевой капитализацией.  Соответственно. и платить за такой "майнинг" нечем. 

У меня реализовано так. В блоке стоит код рекламы и если по какой-то причине рекламы нет (высота контейнера = 0), то показываю свой баннер:

<script>
setTimeout(function () {
    var container = document.querySelector("#blok");

    if (container.clientHeight == 0) {

//если в контейнере ничего нет, то делаете то, что вам нужно

         }

}, 2000);
</script>
Всего: 148