• Могу ли я заниматься коммерческой разработкой (backend с php) на Windows 10?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Очередной дурацкий вопрос.
    И дело даже не в том что линукс действительно на первых порах не нужен.

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

    Что - уже все основы выучил? Теперь на перепутье стоишь, уже идти устраиваться или линукс мучать? Какой там линукс? Базовые операторы, основы БД, отладку, обработку ошибок, разделение кода и представления, основы НТТР, основы безопасности уже выучил? Нет? Ну так надо садиться и учить то что и на винде прекрасно учится. И задавать вопросы если что-то непонятно. Для этого тостер придуман.
    А не ковырять в носу мечтательно, "все у нас хорошо, только линукса не хватает!".

    Надо меньше мечтать и больше работать. И задавать вопросы по ходу дела. Тогда станешь программистом.
    А с таким подходом дальше дивана не продвинешься.
    Ответ написан
    11 комментариев
  • Incorrect number of bindings supplied. The current statement uses 3, and there are 1 supplied. Как решить проблему?

    @o5a
    Ошибка говорит о том, что в качестве параметра execute передается несоответствующее запросу число данных.

    В 'INSERT INTO post VALUES (?, ?, ?)' предполагается 3 значения, а tuple(data.values()) содержит только одно, т.е. в словаре только 1 ключ. Проверяйте, что туда пишете и что хотите взять.
    Ответ написан
    Комментировать
  • Как сделать так чтобы бот отправлял 1 сообщение в чат и еще одно в группе/чате из конфига?

    @DTPlayer
    def ban1(message):
      ban = message.text
      try:
        int(ban)
        func.ban(ban)
        bot.send_message(message.chat.id, '✅ Человек успешно забанен!', )
        bot.send_message(chat_id=f'-100{CHANNEL_ID}',  f'✅ Человек успешно забанен!\n\n')
      except:
        bot.send_message(message.chat.id,text=canel_operation)

    Разметка у вас скосилась
    Ответ написан
    1 комментарий
  • Устарел ли getElementsBy* и чем лучше querrySelector?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Вот народ ушел в спор о производительности, но никто даже не попытался разобраться, а что под капотом... Производительность ведь искусственными бенчмарками меряют, ага...
    Что ж, времена сейчас такие
    многие на работу кодеров берут, которые даже интереса не имеют в глубь копать. Инженеров брать... - это устаревший подход, как выразился автор "популярного сайта", который прочел автор вопроса. Инженеры они дорогие, и найти их сложно, лучше кодер, пусть и не желающий на работе мозг включать, не говоря уж о желании в устройстве инструментов разбираться.

    Говорить о том, что некие фичи устарели - крайне глупо, если знать, что они ведут себя иначе, чем более модные альтернативы. Предлагаю немного разобраться и начать с того что на поверхности:
    - getElementById и querySelector возвращают конкретную ноду в единственном экземпляре
    - querySelectorAll и getElementsByName возвращает статичную коллекцию NodeList
    - getElementsByClassName, getElementsByTagName и getElementsByTagNameNS возвращают динамическую коллекцию HTMLCollection
    Как видим результат у разного апи различен, а значит и говорить, что некоторые из них устарели - глупо.
    Правда тут есть забавный момент
    в спеке HTMLCollection отмечен как "исторический артефакт", который не стоит использовать при проектировании нового апи. Но заметка эта не для веб-разработчиков, а для тех кто проектирует новое DOM апи.

    С устареванием вроде разобрались, но в вопросе еще есть часть "чем лучше". И тут есть теория, что getElementsBy* быстрее querySelector*. Чисто теоретически звучит логично, querySelector* должен делать полный поиск по дереву со сложностью O(n), а getElementsBy* могут использовать индексы на базе HashMap и получать данные со сложностью O(1), тут и особенности HTMLCollection будут кстати, так как можно не копировать коллекцию, а отдавать одну и ту же (и браузеры действительно так делают). Но без пруфов теория так и останется теорией.
    И бенчмарки - так себе пруф
    Хотя направлять инвесторов в нужную сторону - самое то. Проблема бенчмарков, что можно написать их так, что любая из сравниваемых сторон заметно обгонит другую. Дело техники. Например BubbleSort с O(n2) при определенных условиях в чистую уделывает MergeSort и QuickSort с их O(n×log2n), а именно при n=20 или меньше, 400 простых memswap в наглую рвут 87 рекурсивных операций с memcpy внутри
    Гораздо лучше тут выглядят исходники. И я выбрал исходники chromium, как самого распространенного:
    - getElementsBy* методы все как один обращаются к некой шаблонной функции EnsureCachedCollection, которая в свою очередь обращается к некоему NodeLists кэшу, устроенному внутри действительно как HashMap или что-то наподобие. Никакого поиска тут нет, просто берутся готовые значения, сложность у всего этого действительно константная O(1).
    - querySelector* используют абстракцию SelectorQuery, которая и в самом деле делает поиск по DOM. Но данный поиск неплохо оптимизирован и обвешан кэшами. Притом CSSOM использует абсолютно тот же алгоритм поиска DOM нод для каждого селектора в css.
    Для примера
    в подключенных на странице этого вопроса стилях более 1600 правил (некоторые из которых потенциально могут содержать несколько селекторов), полная обработка стилей из этого файла заняла на моей машине (Ryzen 3600 в стоке) чуть больше 9 мс. Если все это немного округлить, то понадобится 15000 querySelectorAll подряд, притом с разными селекторами, чтоб был промах кэша, дабы я ощутил заметную глазу задержку в ~100мс


    На этом спор думаю можно закрыть. querySelector* методы действительно могут быть медленнее, но чтоб убить ими производительность, нужно очень постараться. На фоне того, что пишут кривые ручки среднестатистического дешевого js-кодера это будет незначительной потерей измеряемой в наносекундах. Используйте то что удобнее в каждой конкретной ситуации.
    Ответ написан
    1 комментарий
  • Как получить значение параметра "photo_130"?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Что-то типа:

    data = '{"count": 33562, "items": [{"id": 10266265, ...'
    
    for item in data['items']:
      for attach in item['attachments']:
        value = attach["photo_130"]
        print (f"{value}")


    Переберёт все items и в них attachments.
    Ответ написан
    3 комментария