• Не могу понять в чем проблема?

    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 комментариев
  • Как написать bash скрипт, который будет запускать файл, который поддерживает аргументы командной строки?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    #!/bin/bash
    python3 get-movies.py "$@"


    Тут запись "$@" означает передать все аргументы скрипта как они есть, причём с правильным экранированием, то есть "Termninator 2" будет передано как "Terminator 2", а не "Terminator" "2".

    upd: Ещё добавлю, что для такого простого случая может больше подойти другой подход: передача интерпретатора через шебанг. Надо первой строкой файла get-movies.py указать:

    #!/usr/bin/env python3

    В этом случае запуск скрипта будет приводить к вызову /usr/bin/env python3 get-movies.py со всеми остальными параметрами.
    Ответ написан
    Комментировать
  • Как вывести строку по id php ?id=1?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Вопрос хороший, но здесь мы упираемся в главную беду пхп - ВСЕ учебники в интернете, и особенно видео - показывают как писать адов говнокод из прошлого века.

    1. Получение значения из адресной строки

    Чтобы получить значение переменной, которую передали в строке запроса (это то что после знака вопроса), надо обратиться к переменной $_GET

    То есть в данном случае можно написать $id = $_GET['id']. Имя получаемой переменной ($id) может быть любым и не обязательно совпадать с переданным значением. А вот в индекс массива $_GET разумеется надо писать именно то имя, которое в адресной строке. То есть если site.com/?id=1 то в $_GET['id'] будет значение 1.

    2. Валидация данных

    Далее очень желательно проверить, что мы в переменной получили то что хотели, а так же что мы вообще хоть что-то получили.

    Сначала надо проверить наличие в массиве $_GET нужного ключа. В данном случае это можно сделать с помощью оператора isset() (хотя вообще она для проверки наличия ключей в массивах не рекомендуется)
    Если для показа информации используем отдельную, специальную страницу, которая только занимается показом данных по айди, то после проверки на существование надо выдать ошибку.

    Затем, поскольку id может быть только целым числом больше нуля, то лучше проверить и это тоже и тоже выдать ошибку.

    3. Соединение с БД.

    в "config.php" должно быть написано не то что там сейчас а вот это (со своими параметрами подключения разумеется)
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $link = mysqli_connect($host, $user, $pass, $db_name);
    $link->set_charset("utf8mb4");


    4. SQL

    Запрос, который нам нужен, выглядит так:
    SELECT * FROM `product` WHERE id=1

    5. Выполнение запроса в РНР

    Но разумеется вместо 1 надо подставить значение переменной.
    Это самое сложное. Но надо один раз выучить и потом везде применять

    Важно, чтобы данные в БД всегда попадали отдельно от самого запроса. Это непреложное правило, которое надо соблюдать всегда.
    Для этого надо
    1. Заменить все переменные в запросе на специальные маркеры, которые называются плейсхолдеры или параметры, а по сути - просто знаки вопроса
    2. Подготовить запрос к исполнению с помощью функции prepare(). Эта функция принимает строку запроса и возвращает экземпляр специального класса stmt, с которым в дальнейшем и производятся все манипуляции
    3. Привязать переменные к запросу.
    4. Выполнить подготовленный ранее запрос с помощью с помощью execute()
    5. Получить результат запроса через get_result()
    6. и дальше конкретную строку из БД с помощью уже знакомой fetch_assoc


    В коде это будет так
    $sql = "SELECT * FROM `product` WHERE id=?";
    $stmt = $link->prepare($sql);
    $stmt->bind_param("s", $id);
    $stmt->execute();
    $result = $stmt->get_result();
    $row = $result->fetch_assoc();


    bind_param() принимает в качестве параметров все переменные, которые должны попасть в запрос, в том же самом порядке, в котором стоят плейсхолдеры в запросе. Но кроме того, сначала в этой функции должны быть указаны типы для всех переменных, в виде строки, где тип переменной обозначается одной буквой. То есть букв в этой строке должно быть ровно столько, сколько дальше будет переменных. К счастью, можно особо не париться с типами и для всех переменных указывать тип "s".

    6. Вывод данных.

    Важно понимать, что в момент вывода данных никакой работы с БД уже быть не должно!
    Должны быть только переменные РНР с уже полученными данными.
    Ответ написан
    1 комментарий
  • Как исправить сортировку в MySql?

    Yunique33
    @Yunique33
    SELECT CAST(SUBSTRING_INDEX(column, 'D', -1) as UNSIGNED) AS col
    FROM table
    ORDER BY col;
    Ответ написан
    5 комментариев
  • Как разрабатывать оконные приложения на С++ в Visual Studio 2019?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Самым простым решением для разработки GUI-приложений в среде MSVS2019 будет использование Qt. Собственно, для этого тебе потребуется Qt. Но разработку вести ты cможешь в VS.

    Вторым решением будет чуть более сложное: использование C++/CX вместе с UWP / Windows Forms.

    Третьим решением, еще более сложным, будет использование уже чистого C++ при поддержке MFC или WTL.

    И самым сложным решением будет прямое использование WinAPI.

    Помимо всего этого еще можно воспользоваться библиотекой wxWidgets и на ее базе разработать GUI для своего приложения.
    Ответ написан
    1 комментарий
  • Ошибка: Could not find or load main class. В чем проблема?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    java -cp out com.person.TestPerson
    Ответ написан
    3 комментария
  • Не знаю как вызвать метод из другого класса?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    Arithmetic.check(new int[] { 4 });

    Вам бы учебник почитать.
    Ответ написан
    2 комментария
  • Не могу понять работу метода .map?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    function camelize(str) { // на вход приходит строка
       return str      // вот тут пока ещё строка
         .split('-')   // здесь из этой строки сделали массив, разбив её по символу дефиса
                       // ниже пошёл массив ["lol", "kek", "cheburek"]
         .map((word, index) => index == 0 ? word : word[0].toUpperCase() + word.slice(1)) // что-то сделали с каждым элементом массива
         .join(''); // соединяет ['my', 'Long', 'Word'] в 'myLongWord'
     }


    Теперь упростим непонятную строку.
    К ней пришёл массив, у которого вызывается метод map() – он просто применит функцию в нём к каждому элементу массива. На выходе получится новый массив.
    .map((word, index) => index == 0 ? word : word[0].toUpperCase() + word.slice(1)) //**
    
    // то же самое, что:
    .map(
      function(word, index) {
         return index == 0 ? word : word[0].toUpperCase() + word.slice(1);
      }
    )
    
    // то же самое, что:
    .map(
      function(word, index) {
        if (index == 0) {
          return word;
        } else {
          return word[0].toUpperCase() + word.slice(1);
        }
      }
    )


    Метод массива .map() вызывает функцию, которая в нём аргументом, для каждого элемента массива и передёт в неё следующие три параметра:
    1. Текущий обрабатываемый элемент массива.
    2. Индекс текущего обрабатываемого элемента в массиве.
    3. Массив, по которому осуществляется проход.
    Ответ написан
    1 комментарий
  • Что значит звёздочка после типа указателя?

    myjcom
    @myjcom
    что значить Звёздочка после типа?

    https://en.cppreference.com/w/c/language/pointer

    Для чего после double стоит *, ведь это символ разыменования, а что мы разыменуем?

    В данном случае звездочка не является оператором а относится к типу.

    Зачем перед malloc стоит (double*)

    https://en.cppreference.com/w/c/memory/malloc

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

    N.B. В современном Си такой необходимости нет.


    приведение к типу (double*) сообщает компилятору, что вы хотите.
    Ответ написан
    2 комментария
  • Зачем нужен @classmethod?

    longclaps
    @longclaps
    Но почему я не могу написать метод from_string так:
    cls вместо явного Date позволит наследнику Date (напр. AztecaDate - дата по календарю ацтеков) порождать именно AztecaDate.
    Кстати, есть одна тонкость, связанная с реализацией ООП на разных языках. C++ позволяет реализовать несколько разных, но одноимённых конструкторов класса с разной сигнатурой (набором аргументов), например, можно сделать так:
    Date(1, 1, 2019) # конструктор с сигнатурой (int, int, int)
    Date("1.1.2019") # другой конструктор с сигнатурой (str)
    В питоне можно добиться подобного, но ручками, анализируя состав аргументов Date.__init__, что неудобно, громоздко и нунафиг. Уж лучше забабахать Date.from_string. Но это неизбежно в динамическом языке - ведь C++ должен знать всё про аргументы конкретных вызовов конструкторов на этапе компиляции, а мы можем в рантайм творить что угодно )))

    для чего нужен staticmethod, если это уже не метод, а просто функция, и я могу вынести ее из класса.
    Да, можете. Я думаю, тут действует логика лучшей читаемости и логика экономии пространства имён:
    • Date._статикметод1 хоть и неочевидно что делает, но точно имеет отношение к Date
    • При импорте from date import * вы не получите охапку непонятных имён.

    Кстати, это не бесплатно - обращение к квалифицированному имени каждый раз создаёт дополнительный опкод LOAD_ATTR. Поэтому любители выжать максимум производительности (ну бывает полезно в глубоком цикле) используют такой трюк:
    # медленно
    l = []
    for i in range(100500):
        l.append(i)
    # чуть быстрее )))
    push = l.append
    for i in range(100500):
        push(i)
    Ответ написан
    2 комментария
  • Почему не работает ALT-CTRL-Fx?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Захожу в консоль по SSH через Putty. Хочу переключиться к примеру на TTY2. Нажимаю CTRL+ALT+F2, но в консоли только [12~
    Что я делаю не так?

    ctrl-alt-f2 -- это сочетание клавиш для драйвера виртуального терминала. Соответственно, оно работает только при вводе через виртуальный терминал.

    Под простым юзером ввожу chvt 2:
    Если под рутом, то команда выполняется и всё
    Что я делаю не так?

    В графической консоли вводишь? С помощью strace легко понять что происходит:
    от простого юзера:
    $ strace -iv chvt 2
    ...
    [00007f96b99d56f0] open("/proc/self/fd/0", O_RDWR) = 3
    [00007f96b99da80a] ioctl(3, TCGETS, {c_iflags=0x5500, c_oflags=0x5, c_cflags=0xbf, c_lflags=0x8a3b, c_line=0, c_cc="\x03\x1c\x7f\x15\x04\x00\x01\x00\x11\x13\x1a\x00\x12\x0f\x17\x16\x00\x00\x00"}) = 0
    [00007f96b99db017] ioctl(3, KDGKBTYPE, 0x7fff06db6d67) = -1 ENOTTY (Inappropriate ioctl for device)
    [00007f96b99d5f30] close(3)             = 0
    [00007f96b99d56f0] open("/dev/tty", O_RDWR) = 3
    [00007f96b99da80a] ioctl(3, TCGETS, {c_iflags=0x5500, c_oflags=0x5, c_cflags=0xbf, c_lflags=0x8a3b, c_line=0, c_cc="\x03\x1c\x7f\x15\x04\x00\x01\x00\x11\x13\x1a\x00\x12\x0f\x17\x16\x00\x00\x00"}) = 0
    [00007f96b99db017] ioctl(3, KDGKBTYPE, 0x7fff06db6d67) = -1 ENOTTY (Inappropriate ioctl for device)
    [00007f96b99d5f30] close(3)             = 0
    [00007f96b99d56f0] open("/dev/tty0", O_RDWR) = -1 EACCES (Permission denied)
    ...

    Т..е. stdin и /dev/tty не поддерживают ioctl переключающий терминал (вернее, до него даже не доходит), потому что твоя консоль -- это псевдотерминал, а открыть /dev/tty0 не хватает привилегий.
    А от рута:
    $ sudo strace chvt 2
    ...
    [00007f591848c6f0] open("/proc/self/fd/0", O_RDWR) = 3
    [00007f591849180a] ioctl(3, TCGETS, {c_iflags=0x5500, c_oflags=0x5, c_cflags=0xbf, c_lflags=0x8a3b, c_line=0, c_cc="\x03\x1c\x7f\x15\x04\x00\x01\x00\x11\x13\x1a\x00\x12\x0f\x17\x16\x00\x00\x00"}) = 0
    [00007f5918492017] ioctl(3, KDGKBTYPE, 0x7fffe5e72d17) = -1 ENOTTY (Inappropriate ioctl for device)
    [00007f591848cf30] close(3)             = 0
    [00007f591848c6f0] open("/dev/tty", O_RDWR) = 3
    [00007f591849180a] ioctl(3, TCGETS, {c_iflags=0x5500, c_oflags=0x5, c_cflags=0xbf, c_lflags=0x8a3b, c_line=0, c_cc="\x03\x1c\x7f\x15\x04\x00\x01\x00\x11\x13\x1a\x00\x12\x0f\x17\x16\x00\x00\x00"}) = 0
    [00007f5918492017] ioctl(3, KDGKBTYPE, 0x7fffe5e72d17) = -1 ENOTTY (Inappropriate ioctl for device)
    [00007f591848cf30] close(3)             = 0
    [00007f591848c6f0] open("/dev/tty0", O_RDWR) = 3
    [00007f591849180a] ioctl(3, TCGETS, {c_iflags=0x5, c_oflags=0, c_cflags=0xbf, c_lflags=0, c_line=0, c_cc[VMIN]=1, c_cc[VTIME]=0, c_cc="\x03\x1c\x7f\x15\x04\x00\x01\x00\x11\x13\x1a\x00\x12\x0f\x17\x16\x00\x00\x00"}) = 0
    [00007f5918492017] ioctl(3, KDGKBTYPE, 0x7fffe5e72d17) = 0
    [00007f5918492017] ioctl(3, VT_ACTIVATE, 0x2) = 0
    [00007f5918492017] ioctl(3, VT_WAITACTIVE, 0x2) = 0
    ...

    Т.е. stdin и /dev/tty -- то же самое, но /dev/tty0 открывается и ioctl VT_ACTIVATE проходит.
    Ответ написан
    Комментировать
  • Есть ли у bootstrap следующая возможность?

    alams_stoyne
    @alams_stoyne
    Full Stack Developer - #PHP #CSS #JS #DB
    У bootstrap - НЕТ но написать такое дело 3 минут.

    $(document).on("click","[data-triger-class]",function(e){
            e.preventDefault();
            let target = $(this).data('triger-class');
            $('.'+target).addClass('new_class');
        });
    Ответ написан
    6 комментариев
  • В чем смысл быть гуру тостера?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    1. Работа над личным брендом: Высокая репутация в профессиональных сообществах повышает привлекательность для нанимателей.
    2. Улучшение существующих знаний: Хочешь что-то понять, объясни другому.
    3. Приобретение новых знаний: Специализация замыкает в узком спектре задач и проблем, а Q&A-сервисы - это источник задач и проблем из самых разных областей и иногда под самыми неожиданными углами.
    4. Альтруизм: Большинству из нас кто-то помогал в начале пути, пришло время возвращать долг и делать свой скромный вклад в рост кадров.

    Ещё бывают поклонники какой-то технологии, которые делают вклад в её развитие, продвижение и популяризацию, помогая другим с ней разобраться. Но лично я за это пока не брался, хотя мысли есть.

    Для чего просиживаете на тостере по 5-6 часов в день?

    Я в среднем раз в полчаса-час заглядываю. Если находится интересный вопрос, могу потратить на него минут 10. Некоторые на перекуры больше времени тратят.
    Ответ написан
    7 комментариев
  • Как получить строки из таблицы MySQL?

    Если быстро и в лоб, то можно так: www.sqlfiddle.com/#!9/dbe43b/2/0
    Ответ написан
    Комментировать
  • Как вырезать подстроку из строки с помощью sed | awk?

    DevMan
    @DevMan
    почему все пытаются заюзать регэкспы там, где это не нужно...

    поставьте себе https://stedolan.github.io/jq/
    Ответ написан
    3 комментария
  • Какой url лучше для SEO?

    AndrewMn
    @AndrewMn
    Эксперт в SEO (с 2006 года)
    Если выбирать из двух предложенных вариантов, то лучше двигаться "от общего к частному" т.е. blog/{blog_title}/{blog_id} . Т.к. получаем структуру, рекомендуемую Яндексом для вебмастеров и по опыту - она будет более полезной для пользователей. Пункт 4 https://yandex.ru/support/webmaster/recommendation... .
    Ответ написан
    2 комментария
  • Как сравнить два предложения?

    @siptik
    php developer, freelancer, Web-studio owner
    in_array($word, ['WD Jorgname 10','WD1012'])
    или сделать заменy одного слова на дрyгое и потом сравнивать.
    Ответ написан
    6 комментариев
  • Как запустить файл не заходя на флешку?

    @res2001
    Developer, ex-admin
    Ошибка означает не то что нет файла f:\usbst.vbs, она означает то, что скрипт не может найти файл к которому он пытается обратится.
    Скорее всего скрипт открывает файл, находящийся в текущем каталоге. Но когда вы запускаете его не из f:\, то текущим каталогом является какой угодно каталог, но не f:\, поэтому файл не может быть найден.
    Нужно использовать абсолютные пути. В скрипте определите путь где находится сам скрипт и по этому пути открывайте нужный файл.
    Ответ написан
    1 комментарий
  • Как запретить кеширование игры?

    flapflapjack
    @flapflapjack
    на треть я прав
    Пробовал много различных методов, но они почему-то не работают


    Покажите, раз пробовали. Я не вижу что вы пробовали. Может я то же самое предложу.

    какой-нибудь способ запретить кеширование ?


    Да знаю. Например.

    1) header
    header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Date in the past
    header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // always modified
    header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
    header("Pragma: no-cache"); // HTTP/1.0

    2) meta
    <meta http-equiv="Cache-Control" content="no-cache" />

    3) динамические ссылки на подгружаемые скрипты, стили, картинки

    <script src="/script.js?<?php echo rand(0,99999999);?>">"></script>
    Ответ написан
  • Как переименовать файлы с помощью bat-файла?

    axifive
    @axifive
    Software Engineer
    forfiles /S /M index.txt /C "cmd /c rename @file content.txt"
    Ответ написан
    Комментировать