• Что отвечает за предотвращение нежелательной записи в text секцию?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Я вижу тут 2 варианта:

    1. Адрес функции не выровнен, это и вызывает SIGBUS
    2. Тут баг с назначением номеров сигналов и на самом деле тебе поступает SIGSEGV, т.к. адрес неверный

    Второе прямо описывается в man'е man 7 signals


    BUGS
    For example, an invalid memory access that causes delivery of SIGSEGV
    on one CPU architecture may cause delivery of SIGBUS on another archi‐
    tecture, or vice versa.


    Отвечая на твой вопрос, что предотвращает запись в секцию .text - флаги секций. У каждой секции есть свои флаги, которые отвечают за возможности работы с этими секциями.
    Для этого можно использовать objdump -h <executable>. В частности, я запустил и вот такой вывод появился для бинарника

    14 .plt.sec      00000020  0000000000001060  0000000000001060  00001060  2**4
                      CONTENTS, ALLOC, LOAD, READONLY, CODE
     15 .text         00000118  0000000000001080  0000000000001080  00001080  2**4
                      CONTENTS, ALLOC, LOAD, READONLY, CODE
     16 .fini         0000000d  0000000000001198  0000000000001198  00001198  2**2
                      CONTENTS, ALLOC, LOAD, READONLY, CODE


    Можешь заметить, что .text помечен как READONLY

    Все-таки можно изменить

    Есть системный вызов ptrace, который вообще-то может изменить секцию кода, но проблема в том, что он работает с инструкциями и работать можно только с дочерним процессом. Грубо говоря, выступешь в роли отладчика.
    Поэтому можешь считать, что .text не изменить
    Ответ написан
  • Почему функция неправильно изменяет динамический массив?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Можете подсказать причину?

    Неправильная работа с указателями. Конкретно:

    void test(char** array){
    	array = malloc(sizeof(char*));
    	array[0] = malloc(255 * sizeof(char));
    	strcpy(array[0], "Hello world!");
    }

    Если имелось в виду выделение и возврат массива строк, то должно быть так:
    void test(char*** array){
    	*array = malloc(sizeof(char*));
    	(*array)[0] = malloc(255 * sizeof(char));
    	strcpy((*array)[0], "Hello world!");
    }


    char** array;
    test(array);

    Здесь должно быть
    char** array;
    test(&array);
    Ответ написан
    3 комментария
  • Что выбрать для старта в Desktop разработке с фронтенд технологиями?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Из рассмотренных мною: Electron, Vue Desktop, WPF + WebView + ASP.Net + Vue.js

    Посмотрите еще на Tauri.
    Ответ написан
    Комментировать
  • Где умные указатели размещают полученные данные?

    vabka
    @vabka Куратор тега Rust
    Cell<T> has the same memory layout and caveats as UnsafeCell<T>. In particular, this means that Cell<T>has the same in-memory representation as its inner type T.


    У остальных нет никаких обязательств о memory representation, но они тоже ничего в куче не выделяют.

    Ну и всегда можно посмотреть на исходники)
    https://doc.rust-lang.org/src/core/cell.rs.html#293
    https://doc.rust-lang.org/src/core/cell.rs.html#2034
    https://doc.rust-lang.org/src/core/cell.rs.html#700
    https://doc.rust-lang.org/src/core/cell/once.rs.html#33
    Ответ написан
    Комментировать
  • Элегантный способ парсинга и обработки ошибок?

    @0x0f80
    Например метод map_err. Статейка
    pub fn build_server_config(&self) -> Result<Config, ConfigError> {
        let socket_addr_v4 = self.socket_addr.parse::<SocketAddrV4>()
            .map_err(ConfigError::WrongSocketAddr)?;
        Ok(Config {
            // инициализация полей Config
        })
    }
    Ответ написан
    1 комментарий
  • Какие есть инструменты для написания интерфейса для терминала?

    C++

    Rust

    Это из того, что у меня в закладках. Так-то ищите по тэгу TUI (text user interface, в оппозицию к GUI) - и будет вам счастье.
    Ответ написан
    Комментировать
  • Какие есть инструменты для написания интерфейса для терминала?

    ky0
    @ky0
    Миллиардер, филантроп, патологический лгун
    Ncurses и остальная компания в помощь.
    Ответ написан
    Комментировать
  • Зачем нужны DTO, когда есть типы и интерфейсы в языках программирования?

    mayton2019
    @mayton2019
    Bigdata Engineer
    DTO объекты часто пересекают границы Языков (Java/JavaScript/GWT) и сетевых протоколов (Rest/Graphql/SOAP/Avro).

    И эти объекты могут нести на себе семантику только чистых данных. Вы не сможете через сеть
    из Java в C# например передать интерфейс или объект с методами.

    И многие фреймворки искусственно ограничивают DTO как раз для того чтобы эти объекты однозначно
    декодировались всеми сторонами-участниками протокола взаимодействия. А фреймворки - обычно
    предоставляют средства кросс-компилляции этих DTO.
    Ответ написан
    Комментировать
  • Как работает запуск корутин в asyncio?

    @kiriharu
    Python backend, Linux enjoyer
    При создании задачи при помощи asyncio.create_task она немедленно (при ближайшем переключении контекста, например при встрече await) начинает выполняться в цикле событий. Именно поэтому у тебя в первом примере сразу же стартанули все указанные задачи.

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

    async def main():
        tasks = []
    
        for _ in range(10):
            task = asyncio.create_task(waste_time()) # создаем задачу
            tasks.append(task)
            await task # ожидаем выполнения
            # итерация завершена, переходим к следующей


    Если хочется запустить сразу все задачи, то тут было бы правильнее воспользоваться asyncio.gather, которая как раз будет ожидать выполнения всех задач:

    import asyncio 
    from time import time, sleep
    
    
    async def waste_time():
        print("Start work...")
        await asyncio.sleep(2)
        print("End work!")
    
    async def main():
        tasks = []
        for _ in range(10):
            task = asyncio.create_task(waste_time())
            tasks.append(task)
        await asyncio.gather(*tasks)
    
    asyncio.run(main())
    Ответ написан
    2 комментария
  • Как вызвать source при выполнении .sh файла?

    CityCat4
    @CityCat4
    //COPY01 EXEC PGM=IEBGENER
    Большая часть кода написана и доработана GPT,

    Поржал. Вот GPT и спрашивайте, почему не так. GPT - огромная библиотека, само оно ни строчки кода написать не может.
    Что хотите сделать?
    Начинаем разбор:
    # Вывели сообщение
    echo "Starting.."
    # Перешли в некий каталог
    cd /home/technocat/PyShell/bin/
    # Ничего не делаем, но видимо пытались вызвать окно терминала, только странно как-то
    #gnome-terminal -e "bash -c \"source activate; exec bash\""
    # Подгружаем скрипт activate из общих путей - такой скрипт существует? Он действительно находится на общих путях?
    source activate 
    # Вызываем вложенный шелл в режиме логина (при этом выполняется .bash_profile, а не только .bashrc)
    exec bash --login

    Вы делаете чушь. Полностью. Как сформулировали задачу?

    И больше не используйте GPT. Никогда Потому что он вам посоветует патч Бармина - тоже установите? :)
    Ответ написан
    2 комментария
  • Простое решение для десктопа?

    GavriKos
    @GavriKos
    есть уже базовые знания python, в программисты не собираюсь вроде бы, но программу сделать самому очень хочется


    Ну значит питон и берите. Есть еще pxWidgets для визуала, если что.
    Ответ написан
    2 комментария
  • Имитация веб-камеры - как автоматизировать на python (linux)?

    Vindicar
    @Vindicar
    RTFM!
    Извини, а у тебя ничего не ёкнуло вот тут?
    sudo apt install v4l2loopback
    pip install v4l2loopback
    Ты понимаешь разницу между этими двумя командами?
    Первая - задействует системный менеджер пакетов для дистрибутивов на базе debian (deb-пакетов).
    Вторая - задействует встроенный менеджер пакетов питона.
    Это совершенно разные вещи, и они работают с совершенно разными репозиториями.
    Установить deb-пакет в систему, на которой будешь тестить, достаточно будет один раз.
    Прописать мод можно в /etc/modules, но можно и тупо делать modprobe при загрузке системы.
    И то и то, я полагаю, можно сделать хоть на живой системе, хоть внутри докера.

    После этого в автотесте запускаешь ffmpeg, можно даже тупо через subprocess вместо питоновских модулей. Сюрприз, сюрприз! Они все, насколько я знаю, именно так и делают под капотом. Я не видел модуля, который бы имел интегрированный ffmpeg.
    Ответ написан
    3 комментария
  • Почему ПК не принимает оперативную память, хотя дожен бы?

    @Drno
    Ну для начала попробуйте запустить всё на авто. А дальше -
    это какой то ноу-нейм китай, хз рабочая она или нет...
    покупать надо лучше нормальную фирменную оперативку - кингстон, hynix, etc...
    Ответ написан
    4 комментария
  • Как преобразовать к строке число "0xFF"?

    Alexandroppolus
    @Alexandroppolus
    кодир
    `0x${value.toString(16).toUpperCase()}`
    Ответ написан
    2 комментария
  • На что проверяет Array.isArray объект, чтобы получить true?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    RTFM

    Возвращает true, если массив создан с помощью литерального синтаксиса, либо конструктором Array.

    Таким образом можно сделать вывод, что создать объект, который пройдет проверку на массив, не получится.
    Ответ написан
    4 комментария
  • Как запускать игры на Fedora?

    GavriKos
    @GavriKos
    и вылетает но при этом не какой ошибки не пишет

    Ну вот осваивайте первый навык линуксоида - как получить логи. Можно например из терминала запустить
    Ответ написан
    3 комментария
  • Как отсортировать в алфавитном порядке результаты log-файла?

    @sand3001
    Всего по немногу
    sudo cat /etc/openvpn/openvpn-status.log | grep 10.10.30.[0-999] | sort -t , -k 2

    Сортировка по разделителю "запятая" по 2-му полю
    Ответ написан
    3 комментария
  • Как в typeScript проверить значения на undefined в объекте?

    Используйте asserts (описание в release notes 3.7):
    function assertNotPartial<T>(entry: Partial<T>): asserts entry is Required<T> {
      if (Object.values(entry).every((value) => value !== undefined)) {
        return;
      }
    
      throw Error('YOUR ERROR MESSAGE');
    }

    и тогда используете следующим образом:
    assertNotPartial(videoInfo);
    
    console.log(videoInfo); // Тут не будет в типе undefined'ов
    Ответ написан
    4 комментария
  • Что означает запись в скобках сразу после инициализации?

    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 то мы получим ошибку.
    Ответ написан
    Комментировать