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

    @Akela_wolf
    Extreme Programmer
    Самое простое - шифруйте последние 2 цифры номера заказа как копейки в сумме платежа. Или 3 цифры - как последняя цифра рублевой суммы + копейки. Уникальности не будет, но сократить количество кандидатов в 100-1000 раз может оказаться вполне достаточно для вашей задачи.

    Но это такое себе решение. Вообще у наложенного платежа (а бланк наложенного платежа, по идее, готовите вы как отправляющая сторона) есть поле "назначение". И почта обязана вам его отдавать вместе с платежом. Что мешает вписать в назначение номер заказа в вашей системе? "Оплата заказа #XXX-YYY-ZZZZ" или как-то так.
    Ответ написан
    Комментировать
  • Linux Mint простейшее приложение для защиты глаз?

    Adamos
    @Adamos
    Максимально простое приложение для защиты глаз - это приложение к монитору хорошо освещенного листа глянцевого журнала и регулировка яркости и контрастности экрана как можно ближе к этому самому листу.
    Поначалу покажется, что мир потускнел и краски потухли. Потом прекратятся кровавые слезы от того, как те мониторы настраивают для продажи.
    Ответ написан
    Комментировать
  • Не могу понять в чем проблема?

    Vindicar
    @Vindicar
    RTFM!
    description = f"""У тебя , **{ctx.author}** вот столько балов!**{cursor.execute("SELECT cash FROM users WHERE id = {}".format(ctx.author.id)).fetchone()[0]} :polegar_para_cima:**"""

    Вот это - трижды говнокод.
    1. Не засовывай в шаблонные строки ничего сложнее одной арфиметической операции - результат абсолютно нечитаем и неконтролируем (в чем ты убедился).
    Неправильно:
    description = f"""У тебя , **{ctx.author}** вот столько балов!**{cursor.execute("SELECT cash FROM users WHERE id = {}".format(ctx.author.id)).fetchone()[0]} :polegar_para_cima:**"""

    Правильно:
    score = cursor.execute("SELECT cash FROM users WHERE id = {}".format(ctx.author.id)).fetchone()[0]
    description = f"""У тебя , **{ctx.author}** вот столько балов!**{score} :polegar_para_cima:**"""

    2. Никогда не формируй запросы через форматирование строк. Слишком легко словить ошибку, явную или неявную.
    Неправильно:
    score = cursor.execute("SELECT cash FROM users WHERE id = {}".format(ctx.author.id))

    Правильно:
    score = cursor.execute("SELECT cash FROM users WHERE id = ?", (ctx.author.id,) )

    3. Всегда проверяй, что ты получаешь из базы! Нет гарантий, что запись с указанным id и впрямь существует.
    Неправильно:
    score = cursor.execute("SELECT cash FROM users WHERE id = ?", (ctx.author.id,) ).fetchone()[0]
    description = f"""У тебя , **{ctx.author}** вот столько балов!**{score} :polegar_para_cima:**"""

    Правильно:
    score_row = cursor.execute("SELECT cash FROM users WHERE id = ?", (ctx.author.id,) ).fetchone()
    if score_row is not None:
        description = f"""У тебя , **{ctx.author}** вот столько балов!**{score_row[0]} :polegar_para_cima:**"""
    else:
        # что делать, если такого юзера еще нет в базе?
        cursor.execute("INSERT INTO users (id, cash) VALUES (?, 0)", (ctx.author.id,) ) # можно его добавить
        description = f"""У тебя , **{ctx.author}** пока нет ничего! Но скоро будет!"""

    4. БаЛЛов, блин.
    Ответ написан
    5 комментариев
  • Инициализировать параметры в JavaScript?

    Kozack
    @Kozack
    Thinking about a11y
    const args = {slidesToShow: 2}
    
    const defaultValues = {
      container: '.carousel',
      slidesToShow: 4,
      slidesToScroll: 1,
    }
    
    const resolved = Object.assign({}, defaultValues, args)
    //  { container: ".carousel", slidesToShow: 2, slidesToScroll: 1 }
    Ответ написан
    Комментировать
  • А существует ли что-то типа Git для БД (MySQL) - мне нужно понять как скрипт меняет содержимое БД не копаясь в самом скрипте?

    Придется сделать 2 базы - оригинальную и после изменений.

    После этого есть варианты:
    Можно воспользоваться mysqldbcompare в режиме --changes-for

    Или попросту сделать два дампа и сравнить их
    mysqldump --skip-comments --skip-extended-insert -u user database1 > file1.txt
    mysqldump --skip-comments --skip-extended-insert -u user database2 > file2.txt
    diff file1.txt file2.txt


    Ну или включить Audit Log в mysql и посмотреть по нему какие изменения будут вноситься.

    + https://liquibase.org/

    + Здесь в самом вопросе перечислено пяток инструментов https://stackoverflow.com/q/225772

    И кажется Mysql Workbench может сравнивать.
    Ответ написан
    2 комментария
  • Как запитать радиоприёмник от повербанка?

    @VT100
    Embedded hardware & software.
    Можно. 5 В с выхода банка соответствуют разряду элементов питания приёмника до 1,25 В на каждый. А работоспособность должна сохраняться до 4 В. Вероятнее всего - да, чёрный минус и красный плюс.
    Но не нужно, может "забиться" шумом от банка. Лучше - от батареек.
    Ответ написан
    Комментировать
  • Как исправить ошибку Cannot set properties of null (setting 'className')?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Для начала:
    var textel = document.getElementById(id)
    if (!textel) return console.error("HTML id not found:", id);

    А дальше методом исключения пробуй и щупай в консоли.
    Ответ написан
    Комментировать
  • В чем проблема: Fatal error: Uncaught Error: Call to undefined function mysqli_connect() PHP8?

    Ukrainskiy
    @Ukrainskiy
    Посмотрите вывод phpinfo(), вероятно модуль все-таки не установлен.
    Ответ написан
    5 комментариев
  • Кто подскажет менеджер задач?

    @pfg21
    ex-турист
    process explorer by mark russinovich ??
    Ответ написан
    Комментировать
  • Почему селектор в jquery работает имеено так?

    Lynn
    @Lynn
    nginx, js, css
    Потому что .get(0) вернёт DOM-ноду, а не jQuery-объект. https://api.jquery.com/get/
    Используйте, например, .eq(0) https://api.jquery.com/eq/
    Ответ написан
    Комментировать
  • Как сделать глобальный сервер для esp8266?

    2ord
    @2ord
    Нужно начать с того, что каждое устройство должно иметь свой сетевой адрес (IPv4, IPv6) и тогда оно может быть доступно в пределах некоторой подсети. Обычно веб-сайты доступны по имени домена.
    В зависимости от целей можно использовать доступ по HTTP (REST API на PHP, например), MQTT и прочим.
    Ответ написан
    Комментировать
  • Как повторно отправить curl при неудаче?

    Попробуй вместо curl использовать Guzzle - проще будет. (можно даже автоматически ретраи настроить https://github.com/caseyamcl/guzzle_retry_middleware)
    А вообще просто в цикле проверяй статус и отправляй повторно (ну или рекурсией, как ты написал)
    Ответ написан
    Комментировать
  • Не работает цикл?

    Так наоборот же - цикл отлично работает, да так отлично что никогда сам не завершается.

    В вашем коде нет ничего, что способствовало бы окончанию цикла.
    for
    Ответ написан
    Комментировать
  • Почему код не работает?

    А нечего тулить стрелочные функции если не понимаешь как они работают.
    Ответ написан
    Комментировать
  • Какая разница между генераторами и массивами?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ну собственно именно то, что написано.
    "Генератор позволяет" не значит "генератор гарантированно сэкономит память, ужав миллион строк в одну". Это значит, что если есть возможность не создавать массив в памяти перед тем как перебирать его значения, то можно написать функцию-генератор, результат которой будет выглядеть как массив, но при этом будет выдавать по одному значению. Это возможно в таких случаях, как генерация значений на лету или чтение данных из внешнего источника.

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

    То есть надо чётко понимать, что "экономит память" генератор только по сравнению с созданием полноценного массива.

    Там где вместо создания массива можно обойтись циклом, можно использовать и генератор. Но можно и не использовать - код будет прекрасно работать и без него.
    Там, где реально нужен массив, например с произвольным доступом или для накопления результатов вычислений, генератор превращается в тыкву
    Ответ написан
  • Какая разница между генераторами и массивами?

    @alexalexes
    https://www.php.net/manual/ru/language.generators....
    foreach (xrange(1, 9, 2) as $number) {
        echo "$number ";
    }

    Если рассказать простым языком магии, то при таком вызове внутри foreach, функция xrange определяет, что ее результат не собираются записывать в отдельную переменную, а собираются перебирать по элементам.
    Поэтому, когда выполнение интерпретатора php доходит до команды as, функция xrange выполняется до первого попавшегося yield внутри этой функции и возвращает это значение. При этом, контекст функции запоминается, а также внутренний цикл:
    for ($i = $start; $i <= $limit; $i += $step) {
                yield $i;
    }

    засыпает до того момента, пока во внешнем foreach выполнение не пройдет команду as еще раз, тогда произойдет размораживание yield и извлечение следующего значения, чтобы использовать его только как один элемент $number.
    За счет того, что as меняет режим работы вызова функции xrange, получается не извлекать все подряд.
    Ответ написан
    Комментировать
  • На каком я сейчас уровне?

    1. Не умеешь пользоваться гитом, тк загрузил файлы через Upload
    2. Код невозможно проверить, тк ты закинул только cs файлы, но не приложил не менее важный csproj - не разбираешься, как собирается проект.
    3. Про свич кейс тебе уже сказали в комменте.
    Про остальное мало что можно сказать - код самый обычный, на три с минусом, не очень хороший, но и не слишком ужасный.
    С архитектурой плохо, тк детали реализации смешаны с бизнес-правилами.
    По алгоритмам нельзя оценить, тк никаких сложных алгоритмов в твоём проекте нет.

    Уровень, имхо: стажёр/младший разработчик(обязательно под менторством и наблюдением более опытного)
    Ответ написан
    5 комментариев
  • Не работает $_SERVER['HTTP_X_REAL_IP']; $_SERVER['HTTP_X_REAL_IP']; $_SERVER['REMOTE_ADDR'];?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Всем горемыкам посвящается: https://habr.com/ru/post/158417/

    Поскольку там очень много непонятных букв, я напишу здесь короче.
    Добавляя в проверку IP адреса всякую требуху типа X-РИЛИ-АЙПИ-МАМОМ-КЛЯНУС! вы как раз и открываете доступ любому атакующему, начиная с уровня неленивого пионера.

    Проверять надо всегда только REMOTE_ADDR

    Если сайт стоит стоит за проксей, то надо настучать в репу админу этой прокси, чтобы она проксировала и IP адрес тоже, это не так сложно.
    Ответ написан
    8 комментариев
  • Что лучше: map, Object или Array для хранения данных?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    {
     1:  'Вася',
     2:  'Петя',
     3:  'Маша',
    }
    Ответ написан
    Комментировать