• Как сделать так, чтобы бот с кнопками при перезагрузке реагировал на прошлые сообщения?

    @antares4045
    Соглашусь, с ораторами, рекомендующими сменить хостинг, но можно прикрутить бд (ну или просто файл) и сохранять контекст в неё (при помощи например pickle) и при заргрузке соответственно проверять на наличие сохранённого контекста. С ботскими api у меня такой необходимости, признаться, ни разу не возникало -- возможно вылезет какая-нибудь специфика, но при доработке напильником оно точно обязано взлететь.
    Ответ написан
    Комментировать
  • Где найти актуальный package.json и package-lock.json для сборки react + webpack?

    @antares4045
    Технически, настоятельно советую не страдать фигнёй, и использовать react-scripts (ну и react-scripts eject если ооочень нужно ручки под капот запустить), но пару месяцев назад в образовательных целях делал себе такую сборку:
    {
      "name": "react-empty-template",
      "private": true,
      "dependencies": {
        "react": "^17.0.2",
        "react-dom": "^17.0.2"
      },
      "scripts": {
        "start": "cross-env NODE_ENV=development webpack serve --mode=development --hot",
        "build": "cross-env NODE_ENV=production webpack --mode=production",
        "build:watch": "cross-env NODE_ENV=development webpack --mode=development --watch",
        "build:dev": "cross-env NODE_ENV=development webpack --mode=development"
      },
      "presets": [
        "@babel/preset-env",
        "@babel/preset-react"
      ],
      "devDependencies": {
        "@babel/core": "^7.13.16",
        "@babel/polyfill": "^7.12.1",
        "@babel/preset-env": "^7.13.15",
        "@babel/preset-react": "^7.13.13",
        "babel-loader": "^8.2.2",
        "clean-webpack-plugin": "^4.0.0-alpha.0",
        "copy-webpack-plugin": "^8.1.1",
        "cross-env": "^7.0.3",
        "css-loader": "^5.2.4",
        "file-loader": "^6.2.0",
        "html-webpack-plugin": "^5.3.1",
        "mini-css-extract-plugin": "^1.5.0",
        "node-sass": "^5.0.0",
        "optimize-css-assets-webpack-plugin": "^5.0.4",
        "sass-loader": "^11.0.1",
        "style-loader": "^2.0.0",
        "terser-webpack-plugin": "^5.1.1",
        "webpack": "^5.35.1",
        "webpack-cli": "^4.6.0",
        "webpack-dev-server": "^3.11.2"
      }
    }
    Ответ написан
  • Хай, как мне разделить строчку из файла с разделением; на переменные на питоне?

    @antares4045
    зависит от очень могих факторов:
    если вы заранее знаете количество переменных, то достаточно

    with open('test.txt', 'r') as file:
        v1, v2 = file.readline().split(';')
    print(v1, v2)


    В противном случае всё повеселее

    with open('test.txt', 'r') as file:
        lineindex = 0
        for line in file:
            values = line.split(';')
            for colindex in range(len(values)):
                globals()[f'v_{lineindex}_{colindex}'] = values[colindex]
            lineindex += 1
    
    print(v_0_0, v_0_1)


    но возможно на глобальные переменные бить не надо, если достаточно просто сложить в список, то
    with open('test.txt', 'r') as file:
        acc = []
        for line in file:
            acc.append(line.split(';'))
    
    print(acc)
    Ответ написан
    Комментировать
  • Как обновлять дату каждые n-дней, статический сайт?

    @antares4045
    Кроме как через JS на сегодняшний момент опций соверменный веб не предоставляет (кроме совсем экзотичных вариантов вроде открытия айфрейма на сервис, который вычисляет необходимую дату).

    Идея с массивом была мыслью в веронм направлении, но массив конечен. здесь нужно деление без остатка.

    <span class="myDate"></span>
    
    
        <script>
    const startDate = new Date('2021-08-06')  //устанавливаем дату начала интервала 
    const now = new Date() //определяем текущую дату
    const delta = Math.trunc((+now - +startDate) / 3 / 24 / 3600 / 1000); // вычисляем количество трёхдневных интервалов которые прошли с момента startDate
    
    const resDate = startDate
    resDate.setDate(resDate.getDate() + delta * 3) 
    //итоговая дата -- это стартовая дата + количево вычислиных трёхдневных интервалов, вычисленных на предыдущем шаге, умноженые на 3
    
    const dateTag = document.querySelector('.myDate') //находим тег, в котором должна оказаться новая дата
    dateTag.textContent = resDate.toLocaleString('ru', {day : '2-digit', month : 'long'})
    //устанавливаем дату в соответствии с форматом DD MMMM (можете подобрать любой другой) 
        </script>


    теперь при каждом обновлении страницы дата в поле будет соответствовать требованиям
    с точки зрения ux я бы порекомендовал прикрутить здесь ещё интервал, чтобы дата обновлялась сама по себе раз в 10 минут и без перезагрузки

    <span class="myDate"></span>
    
    
        <script>
    
    function updateDate(){
        const startDate = new Date('2021-08-06')
        const delta = Math.trunc((+new Date() - +startDate) / 3 / 24 / 3600 / 1000);
        startDate.setDate(startDate.getDate() + delta * 3)
        document.querySelector('.myDate').textContent = startDate.toLocaleString('ru', {day : '2-digit', month : 'long'})
    }   
    
    updateDate() //обновляем дату при загрузке станицы
    setInterval(updateDate, 10 * 60 * 1000) //затем обновляем данные каждые 10 минут
    
        </script>
    Ответ написан
    Комментировать
  • Почему не работает btoa('кириллица')?

    @antares4045
    Только что сам столкнулся с аналогичной проблемой для basicAuth после пары экспериментов пришёл к выводу что для unicode строк используется композиция
    btoa(unescape(encodeURIComponent(`${login}:${password}`)))

    логином вида
    :✓Сейчас будет кириллица в пароле: покайся, god damn!☸☹☺☻☼☾☿:
    проблем не возникло (браузеры генерят тот же токен, что и этот код)
    Ответ написан
    Комментировать
  • В чем преимущество функций-конструкторов?

    @antares4045
    Разница в механике наследования: первый вариант можно унаследовать, и ему в прототип можно добавлять методы.

    в первом случае, если вы захотите добавить метод, который выводит имя в консоль, то вам будет достаточно
    написать
    Func.prototype.printName = function(){
      console.log(this.name)
    }


    и затем можете обращаться к методу
    a.printName() // выведет в консоль Victoria
    При всём при том, не зависимо от того, сколько экземпляров класса Func вы наплодите метод printName в памяти будет храниться один.

    Во втором случае вы также при помощи несложных манипуляций сможете добиться похожего поведения, но там всегда будут подводные камни, например скорее всего у вас не получится создать наследника для func
    Ответ написан
    Комментировать
  • Где узнать версию хромиума, на которой основан браузер?

    @antares4045
    Сегодня столкнулся с аналогичным вопросом и нигде адекватного ответа на заданный вопрос не увидел, но после небольшого исследования понял почему: в данном случае фраза "основан на" и "использует" не синонимична. В 2008 году инженеры гугла взяли исходный код браузера progect chromium и начали поверх него строить свой и как следствие chromium не какой-нибудь подключаемый модуль в google chrome (и всех, кто пошёл по его стопам), который может независимо обновиться а скорее идейный вдохновитель от которого унаследована исходная архитектура, некоторые визуальные решения и часть кодовой базы. На сегодняшний день различия настолько сильно накопились что сравнивать доступность использования по исходной версии chromium... как минимум оптимистично.

    Тем не менее общий независимый модуль у всех chromum наследников есть -- webkit и он как раз выполняет основную работу в разрезе вопроса про CanIUse. Версию webkit я в настройках google chrome так и не нашёл, но он включен User Agent, так что достаточно открыть хедеры любого исходящего запроса или открыть страницу chrome://version/ (ну или аналогичную для любого другого браузера) и напротив надписи User Agent должно быть что то вроде Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36 где AppleWebKit/537.36 и есть интересующая нас цифра.

    На исследование вопроса потратил минут 15 поэтому возможно что-то понял не верно.

    P.S. технически ваш проект можно прогнать через webpack+babel с максимально жестокой полиморфизацией и указать в списке поддерживаемых браузеров: все.
    Ответ написан
    Комментировать
  • Как правильно создавать интерактивные геометрические фигуры?

    @antares4045
    Если сдюжите при помощи чистого css -- это будет сильная победа, ибо css всё-таки про создание стилей а не отрисовку с нуля, но наверное, в вебе всё, что сделано на нём без серьёзных огрехов -- самое производительное. Но признаться честно, я вообще не представляю себе небходимого инструментария в css;
    Канвас многим хорош, но он хочет чтобы вы решили много проблем, прочитали его мануалы и тогда будет вам счастье. Раз вместо того, чтобы гуглить правила ресайза для него, вы пошли писать на форум -- это тоже врядли ваш путь (без претензии: это нормально);
    Осталось svg. Для того чтобы он работал, тоже надо учиться, но всевозможных материалов по нему максимальное количество. Суть вашей анимации я, признаться честно, не понял, но вероятно, проблема в том, что анимация по умолчанию идёт в режиме ускорение-замедление, и если вы скажете ей проходить по линейной временной функции, главная ваша проблема отпадёт. И да, svg лучше всего подходит для наведения интерактива. Скорее всего вам стоит разобраться как работает svg сам по себе и не пользоваться сторонними фреймворками, т.к. высока вероятность, что выбранный вами действительно кушает ощутимую производительность.
    Ответ написан
  • Какие компоненты мне необходимо приобрести для проекта?

    @antares4045
    С одной стороны одной Ардуины мега должно хватить за глаза (посмотрите её характеристики: лет пятнадцать назад у телефонов не было такой производительности), с другой же подключать десяток датчиков на одну ардуину -- занятие не слишком благодарное. Но синхронить общение с кучей независимых устройств, как по мне, ещё геморойней. Так что тут смотрите: хотите поковыряться в железках -- берите одну ардуину, а если хотите хардкорно попрогать -- берите несколько.

    Подключить несколько контроллеров к одному эзернету наверняка возможно, но лично я бы не взялся, делать же несколько эзернетов на один контроллер явно бессмысленно, так что по поводу числа эзернетов мой совет -- ровно столько, сколько ардуин. Только надо держать в голове, что все эти эзернеты должны куда-то идти, и если запланированный вами "сервер" на самом деле какой-нибудь старенький ноут, то, в случае, если ардуин будет много, надо озаботится покупкой хаба.

    По поводу датчиков вы сами всё чётко расписали, отмечу разве что, что ваша радение за отказоустойчивость хоть и делает вам честь, но скорее всего несколько избыточна: поломка датчика это всё-таки нонсенс, и вряд ли вам это действительно необходимо. Но тут на самом деле На ваше усмотрение.

    По поводу расходников отмечу, что мне во времена, когда я делал подобный проект, сильно не хватало разнообразия проводков (как по цвету, так и по длине), но возможно это исключительно моя проблема.
    Ответ написан
    4 комментария
  • Как сформулировать запрос?

    @antares4045
    Маркировать начала пропусков можно при помощи выбора всех дат, для которых дата + минута не существует. Затем оберните это в подзапрос для запроса ищущего ближайшую минимальную дату, большую для каждой даты из подзапроса, так вы найдёте концы интервалов пропусков.

    UPD:

    Признаться честно, полностью воссоздавать тест мне в лом, но для базы
    CREATE TABLE nums (num INTEGER)
    INSERT INTO nums (num) VALUES (1),(2),(4),(5),(10),(11)

    запрос отработал верно
    SELECT mins.num + 1 startInterval, MIN(maxs.num) -1 endInterval
    FROM (SELECT num
          FROM nums outerRequest 
          WHERE NOT EXISTS (SELECT num 
                            FROM nums innerRequest 
                            WHERE innerRequest.num = outerRequest.num + 1)) mins,
         (SELECT num 
          FROM nums maxs) maxs
    WHERE maxs.num > mins.num
    GROUP BY mins.num
    Ответ написан
    Комментировать
  • Как вызывать по одной строке из txt?

    @antares4045
    Вы же ищите метод readline?
    P.S. Только помните о наличии \n и/или \r в конце возвращаемой им строки
    P.P.S Хотя для наибольшей чистоты, решение заданного вами вопроса должно выглядеть как-нибудь вот так.
    А в идеале, сразу "дружите" с sqlite.
    Ответ написан
  • Есть ли хороший учебник по Haskell для начинающих?

    @antares4045
    Всё очень сильно зависит от вашего изначального уровня: хаскель исторически в большей мере эзотерический язык, в который ходят либо ради интереса или в поисках просветления (что бы вам яростные фанаты хаскеля ни говорили), потому хорошо структурированной литературы и вправду маловато.

    • Если вы имеете некий минимальный опыт и хотите "просто посмотреть", то вам нужен"о хаскеле по-человечески"
      Материал здесь представлен в наиболее удобоваримом формате во всём рунете, как по мне, но книга и близко не закончена и концентрируется в большей мере на адаптации людей весьма поверхностно знакомых с программированием в целом;

    • Когда речь заходит о учебнике для хаскеля почти всегда всплывает "Изучай хаскель во имя добра"
      О ней говорят что предельно простая и понятная, и что по ней можно учить дошкольников. Лично я прочитав пару глав сложил мнение, что у человека "не в теме" может появиться большое множество вопросов, но если у вас на расстоянии вытянутой руки есть человек, которому можно их задать, то это действительно пожалуй лучший вариант;

    • Периодически возвращаясь к хаселю я каждый раз пытаюсь прочесть книгу Александро Серано Мена, но времена уже не такие беззаботные как в детстве, и времени нет штудировать многосотстрочные талмуды.
      Автор в большей степени концентрируется на принципах работы языка "под капотом" что очень здорово для понимания языка, но сама книга явно ожидает от читателя многолетнего опыта в программировании в целом и в функциональной парадигме в частности, и без должной подготовки туда лучше не лезть.

    Ответ написан
    Комментировать
  • Перебор массива?

    @antares4045
    Ваша задача называется "стемминг" решений у неё много, причём преимущественно плохих, но для русского языка есть например яндексовский mystem, имеющий отличную точность и скорость, при всём этом ещё и почти не требовательный к ресурсам. Но я, признаться честно, не помню как у него с лицензией на коммерческое использование. Как бы то не было, узнав правильное название вашей задачи, я надеюсь, вы быстро выгуглите решение.
    Ответ написан
    Комментировать