• Как правильно спроектировать программу?

    @abcd0x00
    Суть программы, удаление определенных файлов, очистка журналов, и сложный перебор ключей в реестре.

    Нужно построить иерархию исполнителей. А для этого нужно знать, что такое исполнитель.

    Как разложить

    Допустим, тебе надо удалять файлы - значит, тебе нужен исполнитель "удаляльщик файлов". Там у него несколько действий есть типа "проверить файл", "удалить файл". То есть удалением файлов занимается только он. Бывает, что при удалении файла, нужно его имя как-то составить, проверить, можно ли его удалять. Вот этим всем занимается этот "удаляльщик".

    Допустим, тебе надо очистить журнал - значит, тебе нужен исполнитель "обработчик журнала". Там у него несколько действий есть типа "найти запись", "добавить запись", "удалить запись". То есть операциями с журналом занимается только он.

    Допустим, тебе надо перебирать ключи в реестре - значит, тебе нужен исполнитель "обработчик реестра". Там у него несколько действий есть типа "найти ключ", "добавить ключ", "удалить ключ", "изменить ключ". То есть операциями с реестром занимается только он.

    И вот этим всем у тебя управляет исполнитель "дирижёр". Там у него несколько действий есть типа "поработать с файлами", "поработать с журналом", "поработать с реестром так", "поработать с реестром сяк". То есть он управляет этими другими исполнителями, каждый из которых умеет делать что-то своё.

    Дальше ты пишешь функцию, которая управляет этим "дирижёром".

    А вообще всё делается наоборот: сначала пишешь функцию управления "дирижёром", потом реализуешь этого "дирижёра" и в его методах реализуешь управление нужными исполнителями, а потом уже реализуешь сами исполнители. Это называется "метод разработки сверху вниз".
    Ответ написан
    Комментировать
  • Как создать списки с динамически изменяющимися именами?

    @abcd0x00
    >>> numbers = (1, 2, 3)
    >>> fnames = ('file{}.txt'.format(i) for i in numbers)
    >>> files = [open(i, 'w', encoding='utf-8') for i in fnames]
    >>> files
    [<_io.TextIOWrapper name='file1.txt' mode='w' encoding='utf-8'>, <_io.TextIOWrapper name='file2.txt' mode='w' encoding='utf-8'>, <_io.TextIOWrapper name='file3.txt' mode='w' encoding='utf-8'>]
    >>> [i.close() for i in files]
    [None, None, None]
    >>>


    [guest@localhost t]$ ls
    file1.txt  file2.txt  file3.txt
    [guest@localhost t]$


    Вообще, файлы принято открывать через with. Если особой необходимости нет для ручного открытия и закрытия, то надо использовать with.
    Ответ написан
    Комментировать
  • Не могу записать в файл. Что делать?

    @abcd0x00
    Запусти в консоли python3 и там выполни help(open).

    Ты написал чушь какую-то, потому что не знаешь, как вызывать open(). Следовательно, не знаешь, как пользоваться документацией к питону. Есть встроенная документация (функция help() ) и есть основная документация https://docs.python.org . Основная документация полнее встроенной.
    Ответ написан
    Комментировать
  • Скрипт бэкапа (файлы + база) для cron?

    @abcd0x00
    Его надо сначала запустить без крона (из той же директории). Если он работает без крона, а в кроне не работает, надо посмотреть лог крона.
    Ответ написан
    Комментировать
  • Как считать данные из файла и записать их в список?

    @abcd0x00
    [guest@localhost py]$ cat file.txt 
    1.5
    2.6
    3.123
    4.56
    [guest@localhost py]$


    >>> with open('file.txt') as fin:
    ...   lst = list(map(float, fin))
    ... 
    >>> lst
    [1.5, 2.6, 3.123, 4.56]
    >>>
    Ответ написан
    Комментировать
  • Как прочесть фрагмент стандарта языка Си?

    @abcd0x00
    Прочитай ещё это, потом пригодится
    rfc. ABNF
    Ответ написан
    Комментировать
  • Почему execl выходит из процесса?

    @abcd0x00
    Просто завершается форкнутый процесс.

    Он не завершается, он заменяется на то, что в execl(), и завершается то, что запустилось там.
    Ответ написан
    Комментировать
  • Как добавить строку в файлы linux скриптом?

    @abcd0x00
    sed -i -s '$a text' *.txt

    Пример
    [guest@localhost t]$ ls
    file1.txt  file2.txt  file3.txt
    [guest@localhost t]$ 
    [guest@localhost t]$ cat file1.txt 
    a
    [guest@localhost t]$ cat file2.txt 
    b
    [guest@localhost t]$ cat file3.txt 
    c
    [guest@localhost t]$ 
    [guest@localhost t]$ sed -i -s '$a text' *.txt
    [guest@localhost t]$ 
    [guest@localhost t]$ cat file1.txt 
    a
    text
    [guest@localhost t]$ cat file2.txt 
    b
    text
    [guest@localhost t]$ cat file3.txt 
    c
    text
    [guest@localhost t]$

    Ответ написан
    1 комментарий
  • Как пользоваться QDataStream?

    @abcd0x00

    1: (это метод добавления одной строки в конец другой, верно?) append() используется таким вот образом:

    В моем же примере из учебника вот так append("Sent:" + dt.toString()); и не ясно что к чему в этом участке кода

    Это разные методы. В твоём примере используется метод append() у QTextEdit, так как от этого класса наследуется твой UdpServer.


    2: Мне не понятно что и как выводит оператор outТ.к если убрать <<dt и вообще исключить из кода, оставив просто out;
    то на выходе будет просто "Sent:". Если я объявляю Qstring str = "123" и пишу out << str , вывод не меняется

    out - это не оператор, а переменная типа QDataStream. У класса QDataStream переопределена (говорят перегружена, но это неправильно) операция побитового сдвига влево.

    Ты бы изучил сначала основы C++, потому что вопросы у тебя именно по ним, а не по Qt. Надо сначала изучить C++, а потом Qt, а не наоборот.

    Ты когда делаешь
    out << x
    переменная x пишется в out, потому что у out запускается метод <<, в который передаётся значение x. И этот метод понимает, как это значение сохранить, и знает, куда его там сохранить.

    QDataStream - это сериализатор, он принимает любые объекты и приводит их к определённому виду, чтобы потом на любой другой системе из этого определённого вида можно было эти объекты обратно прочитать и получить те же самые данные тех же самых типов.

    Почему у тебя что-то куда-то не пишется? Потому что ты не понимаешь, что ты делаешь. Зачем, например, ты наследуешь сервер от текстового окна? Если тебе нужен вывод сервера, сервер должен его передавать в отдельное окно, используя сигнальную систему.
    Ответ написан
  • Как определить суммы левой и правой частей больших чисел?

    @abcd0x00
    >>> import operator
    >>> 
    >>> def split3(x):
    ...     return (x // 100, x // 10 % 10, x % 10)
    ... 
    >>> def split6(x):
    ...     return (x // 1000, x % 1000)
    ... 
    >>> pred = lambda x: operator.eq(*map(sum, map(split3, split6(x))))
    >>> 
    >>> out = list(filter(pred, range(100000, 1000000)))
    >>> out[:10]
    [100001, 100010, 100100, 101002, 101011, 101020, 101101, 101110, 101200, 102003]
    >>>
    Ответ написан
    Комментировать
  • Как правильно читать спецификацию (C/C++)?

    @abcd0x00
    1. Как правильно читать спецификацию? Люди, которые знакомы с ней, непосредственно брали в руки документ и читали его от корки до корки?

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

    Эта тема немного шире, чем просто чтение от корки до корки. Есть первый язык, когда ты не знаешь, что вообще может быть в языке и его библиотеке функций. Так вот первый язык ты изучаешь полностью. Но остальные языки, которые ты изучаешь, содержат похожие элементы или вообще такие же. Поэтому ты, например, прочитал семантику функции split() для строки в первом языке, всю её изучил (написал кучу примеров и запустил их много раз), а потом в остальных языках, которые ты изучаешь, ты видишь ту же функцию и тебе не нужно про неё читать, потому что ты проводишь связи (аналогии) со своей первой функцией split(). Поэтому чем полнее ты прочитал про эту функции где-то в начале, тем меньше тебе остаётся про неё читать потом. Так накапливаются знания. Потом наступает момент, когда ты уже не знаешь, чего ты не знаешь, потому что уже всё знаешь, так как про всё читал.

    Поэтому начинаешь читать по факту что уже знаешь. Как итог трата времени, скука и бросание дела на пол пути.

    Вот если начинаешь читать то, что уже знаешь, надо сменить пластинку. Значит, этот материал для новичков и тебе нужен другой материал, посерьёзнее.
    Ответ написан
    Комментировать
  • Дейтл Пол, C, определите числа, соответствующие символам?

    @abcd0x00
    Изучи данный код. И возьми нормальную книжку сначала (K&R2), где объясняется, почему для символов используется int, а не char.
    Код
    #include <stdio.h>
    
    int main(void)
    {
        int c;
    
        printf("%c %d %x\n", 'a', 'a', 'a');
        printf("%c %d %x\n", 'b', 'b', 'b');
        printf("%c %d %x\n", '$', '$', '$');
    
        c = 'A';
        printf("%c %d %x\n", c, c, c);
        c = '+';
        printf("%c %d %x\n", c, c, c);
        c = '/';
        printf("%c %d %x\n", c, c, c);
    
        return 0;
    }


    Вывод
    [guest@localhost c]$ .ansi t.c -o t
    [guest@localhost c]$ ./t
    a 97 61
    b 98 62
    $ 36 24
    A 65 41
    + 43 2b
    / 47 2f
    [guest@localhost c]$

    Ответ написан
  • Как часть скрипта "выкинуть" или обернуть в скрин?

    @abcd0x00
    Так вот можно ли каким нибудь образом к примеру часть скрипта (его выполнение) обернуть в скрин?

    Можно запустить её в фоновом режиме, добавив амперсанд на конце.
    Пример
    #!/bin/bash
    
    func1()
    {
        for i in {1..5}; do
            echo 1
            sleep 2
        done
    }
    
    
    func2()
    {
        for i in {1..5}; do
            echo 2
            sleep 4
        done
    }
    
    func3()
    {
        echo 3
        func1 &
        sleep 1
        echo 4
        func2 &
        sleep 1
        echo 5
        wait
    }
    
    func3
    
    exit 0

    Вывод
    [guest@localhost sh]$ ./t.sh 
    3
    1
    4
    2
    1
    5
    1
    2
    1
    1
    2
    2
    2
    [guest@localhost sh]$

    Ответ написан
    Комментировать
  • Как в Python делается выравнивание элементов строк при выводе?

    @abcd0x00
    >>> a = ['1', '2', '3333', '4', '5']
    >>> b = ['●', '●', '●', '●', '●']
    >>> align = list(map(len, a))
    >>> 
    >>> def make_line(seq, aligns):
    ...     return ' '.join('{0:>{1}}'.format(i, j) for i, j in zip(seq, aligns))
    ... 
    >>> out = '\n'.join((make_line(a, align), make_line(b, align)))
    >>> print(out)
    1 2 3333 4 5
    ● ●    ● ● ●
    >>>
    Ответ написан
    Комментировать
  • Зачем писать такой большой код?

    @abcd0x00
    Изучи метод разработки "сверху вниз". Если его не освоишь, ничего длиннее ста строк писать не будешь.
    wiki. структурное программирование
    Ответ написан
    Комментировать
  • Как сохранить жизнь переменной стека?

    @abcd0x00
    Во-первых, не надо ставить фигурные скобки в case'ах, выучи основы C++ для начала.
    Во-вторых, то, что ты спрашиваешь, делается с использованием new. Получаешь данные, делаешь под них new, потом сохраняешь данные туда и прицепляешь эту память к структуре.
    Ответ написан
  • Python: Как получить Status Code из urllib2.Request?

    @abcd0x00
    >>> import urllib2
    >>> 
    >>> r = urllib2.Request('http://www.yandex.ru')
    >>> data = urllib2.urlopen(r)
    >>> data.getcode()
    200
    >>>
    Ответ написан
    Комментировать
  • Как быстро разобратся в сишном коде?

    @abcd0x00
    Пошел я значит смотреть как там устроен клиент и обнаружил что заюзали кучу библиотек и зачем я так и не понял.

    Скорее всего, это каша-малаша из разных компонентов, которые надёрганы из разнородных проектов, оттуда и разные библиотеки. А чтобы всё работало, они включены в сам проект.

    А зачем тебе вообще делать этот проект? Кто-то ведь его принимал в таком виде. Пусть он и делает, как он там думает "с нуля" с помощью двух фрилансеров.
    Ответ написан
  • Что нужно изучать, чтобы стать программистом C++?

    @abcd0x00
    Что нужно изучать, чтобы стать системным программистом на С++?

    Нет системных программистов на C++, есть просто системные программисты, и они используют сразу много языков. Для начала тебе нужно понять, при чём тут математика. Вот смотри, есть файловая система на диске. Чтобы эти файлы экономно распределять и работать с ними быстро, алгоритмы работы с файлами оптимизируются. А оптимизируются они как? Правильно, оптимизируют они математически. То есть берётся какая-то математическая теория и из неё делаются выводы, как можно написать программу покороче, как можно сложить данные покомпактнее. Так придумали всякие математические деревья для файловых систем.

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

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

    Если хочешь быть программистом, готовься к тому, что придётся изучать самую обычную математику и самую обычную физику.
    Ответ написан
    Комментировать
  • Обязательно ли знать ассемблер и архитектуру ЕВМ разработчику C++?

    @abcd0x00
    Мне понадобился Asm, когда мне надо было написать программу для игры, чтобы из линукс можно было смотреть количество игроков на сервере (игра под винду).

    История

    Сначала я анализировал сетевые пакеты (через Wireshark), чтобы понять, как виндовый клиент игры взаимодействует с сервером, когда получает от него нужную информацию. Идея была в том, чтобы написать программу, которая делает то же самое, как будто это реальный клиент игры, но это была бы моя программа, которая работает под любой системой.

    Всё было понятно, кроме одного: непонятно было, как клиент игры получает список доступных серверов. Сервер их как-то сжимал или шифровал зачем-то и передавал единственным большим ответом (больше никуда бы они не поместились кроме этого ответа). Такая мелочь всё портила, всё было понятно и до и после кроме того, как получить список серверов, чтобы дальше опрашивать их.

    Вся эта логика по расжатию или расшифровке находилась в одной из dll игры (отвечающей за сеть). То есть её надо было продизассемблировать, найти этот участок кода и понять, что там происходит. А ассемблер я тогда не знал, поэтому даже если бы я смог её продизассемблировать, я бы просто не смог понять результат.

    Вот такая маленькая хрень всё испортила. Кучу времени потратил на сетевой анализ, а запоролося на такой мелочи - не знал ассемблер.

    Так что учи ассемблер, он нужен будет тогда, когда будешь делать что-то реальное (не учебное). Не будешь знать - не будет программы.
    Ответ написан
    Комментировать