• Смена имени папки в связи со сменной имени пользователя, как сделать?

    @abcd0x00
    Чтобы переименовать домашний каталог можешь просто его переименовать, а потом владельца и группу владельцев поменять с помощью рекурсивного chown.
    chown -R новое_имя:новая_группа новый_каталог
    Ответ написан
    Комментировать
  • Как правильно организовать структуру в классе?

    @abcd0x00
    Нужно создать программу, которая будет служить эмулятором кассового аппарата.

    Ты должен сначала описать наружнюю составляющую этого аппарата.

    Типа
    начать работу
    нажать кнопку один
    нажать кнопку два
    повернуть ручку такую-то
    повернуть ручку другую-то
    показать на экране текущее состояние
    кончить работу

    Это внешнее описание аппарата.

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

    Введённые продукты добавляются в список продуктов, который скрыт от наружнего наблюдателя, но который виден внутри аппарата. Всё управление аппаратом происходит через его внешние методы (через интерфейс).
    Ответ написан
    Комментировать
  • В чем разница между примерами приведенными ниже?

    @abcd0x00
    В первом случае arr - это указатель. Указатель - это переменная, хранящая какой-то адрес каких-то данных определённого размера. Указатель можно менять, присваивая ему новые значения. Его можно сдвигать вправо (arr++) и влево (arr--) или вообще переставлять на какие-то другие данные в другом месте (arr = новый адрес). Так указатель можно поставить на начало массива, а можно на середину массива, а можно на конец массива и потом через него читать или менять массив в том месте.

    Во втором случае arr - это массив. Каким ты его создал, таким он и остаётся до конца.
    Ответ написан
    Комментировать
  • Какую книгу можно использовать по языку C, чтобы получить базовые познания в CS?

    @abcd0x00
    Язык программирования C (K&R2)
    www.ozon.ru/context/detail/id/2480925

    Язык программирования C. Лекции и упражнения. (Стивен Прата)
    www.ozon.ru/context/detail/id/31649671
    Ответ написан
    Комментировать
  • Как сэкономить место если в каталогах есть одинаковые файлы?

    @abcd0x00
    Нужно сделать хранилище для всех файлов. А в папках хранить симлинки. Есть там и жёсткие ссылки - это когда на один файл ссылаются два имени или больше. С жёсткими ссылками система будет думать, что это файл, а не ссылка (иногда надо такое).
    Ответ написан
    Комментировать
  • Как записать список с целыми числами в файл с помощью writelines() (Python)?

    @abcd0x00
    >>> lst = [1, 2, 3, 4, 5, 6]
    >>> 
    >>> with open('file.txt', 'w', encoding='utf-8') as fout:
    ...     print('\n'.join(map(str, lst)), file=fout)
    ... 
    >>>
    Ответ написан
    Комментировать
  • Как вернуться к началу строки?

    @abcd0x00
    Пример кода с циклической строкой
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    {
        const char *s, *start, *end, *cur;
        int n, i;
    
        if (argc == 3) {
            s = argv[1];
            n = atoi(argv[2]);
        } else {
            s = "12345";
            n = 50;
        }
    
        start = end = s;
        if (*end)
            while (*(end + 1))
                end++;
    
        cur = start;
        for (i = 0; i < n; i++) {
            putchar(*cur);
            cur = (cur < end) ? cur + 1 : start;
        }
        putchar('\n');
    
        return 0;
    }


    Вывод
    [guest@localhost c]$ .ansi t.c -o t
    [guest@localhost c]$ ./t
    12345123451234512345123451234512345123451234512345
    [guest@localhost c]$ ./t abc 80
    abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcab
    [guest@localhost c]$ ./t a 10
    aaaaaaaaaa
    [guest@localhost c]$ ./t ab 10
    ababababab
    [guest@localhost c]$ ./t abc 10
    abcabcabca
    [guest@localhost c]$
    Ответ написан
    Комментировать
  • Как вывести элементы списков, вложенных в список?

    @abcd0x00
    >>> ' '.join(sum([['foo'], ['bar']], []))
    'foo bar'
    >>>
    Ответ написан
    Комментировать
  • Используете ли Вы онлайн площадки, как например "coding ground", есть похожие?

    @abcd0x00
    Попробуй https://ideone.com , для демонстраций кому-нибудь чего-нибудь годится.
    Ответ написан
    Комментировать
  • Как правильно экранировать строку для sed?

    @abcd0x00
    [guest@localhost ~]$ s='hello allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> hello'
    [guest@localhost ~]$ 
    [guest@localhost ~]$ src='allow="127\\\.\\d+\\\.\\d+\\\.\\d+|::1|0:0:0:0:0:0:0:1" />'
    [guest@localhost ~]$ dst='allow="^.\\*$" />'
    [guest@localhost ~]$ 
    [guest@localhost ~]$ echo "$s"
    hello allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> hello
    [guest@localhost ~]$ 
    [guest@localhost ~]$ echo "$src"
    allow="127\\\.\\d+\\\.\\d+\\\.\\d+|::1|0:0:0:0:0:0:0:1" />
    [guest@localhost ~]$ 
    [guest@localhost ~]$ echo "$dst"
    allow="^.\\*$" />
    [guest@localhost ~]$
    [guest@localhost ~]$ echo "$s" | sed "s%$src%$dst%g"
    hello allow="^.\*$" /> hello
    [guest@localhost ~]$
    Ответ написан
    Комментировать
  • Проблемы с mv, вызываемым из скрипта?

    @abcd0x00
    Вот тебе пример, как это делается обычно.

    Находишь нужные файлы, а потом sed'ом составляешь команду (одну или несколько) с ними. Когда команда готова, передаёшь её по каналу на sh.
    Код
    [guest@localhost t]$ ll
    итого 4
    -rw-rw-r--. 1 guest guest    0 сен 30 13:08 a a.txt
    -rw-rw-r--. 1 guest guest    0 сен 30 13:06 a.txt
    -rw-rw-r--. 1 guest guest    0 сен 30 13:06 b.txt
    -rw-rw-r--. 1 guest guest    0 сен 30 13:06 c.txt
    drwxrwxr-x. 2 guest guest 4096 сен 30 13:19 d
    [guest@localhost t]$
    [guest@localhost t]$ ls
    a a.txt  a.txt  b.txt  c.txt  d
    [guest@localhost t]$ 
    [guest@localhost t]$ files=$(find -name '*.txt')
    [guest@localhost t]$ 
    [guest@localhost t]$ echo "$files" | sed 's/.*/mv "&" d/'
    mv "./b.txt" d
    mv "./a.txt" d
    mv "./c.txt" d
    mv "./a a.txt" d
    [guest@localhost t]$ 
    [guest@localhost t]$ echo "$files" | sed 's/.*/mv "&" d/' | sh
    [guest@localhost t]$ 
    [guest@localhost t]$ ls
    d
    [guest@localhost t]$ ls d
    a a.txt  a.txt  b.txt  c.txt
    [guest@localhost t]$
    [guest@localhost t]$ ll d
    итого 0
    -rw-rw-r--. 1 guest guest 0 сен 30 13:08 a a.txt
    -rw-rw-r--. 1 guest guest 0 сен 30 13:06 a.txt
    -rw-rw-r--. 1 guest guest 0 сен 30 13:06 b.txt
    -rw-rw-r--. 1 guest guest 0 сен 30 13:06 c.txt
    [guest@localhost t]$

    Ответ написан
    Комментировать
  • Как сократить код?

    @abcd0x00
    >>> d = {'aaa': 1, 'bbb': 2}
    >>> 
    >>> if set(d) & {'aaa', 'ccc'}:
    ...     print('yes')
    ... else:
    ...     print('no')
    ... 
    yes
    >>> 
    >>> if set(d) & {'ddd', 'ccc'}:
    ...     print('yes')
    ... else:
    ...     print('no')
    ... 
    no
    >>>
    Ответ написан
    Комментировать
  • Как вывести строку после определенного знака?

    @abcd0x00
    sed -n 's/ncore=//p' /opt/aliases.conf
    Ответ написан
    Комментировать
  • Первый проект чтобы научиться?

    @abcd0x00
    На мой субъективный взгляд это не выглядит слишком сложным.

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

    Просто представь ситуацию: ты идёшь продавцом куда-нибудь и думаешь подзаработать, но у тебя нет опыта. Ты думаешь "ну и что, что там сложного, продавать - дал товар, взял деньги и всё". Вот ты стоишь за прилавком, открывается дверь и забегает собака. Прыг-скок такая смешная, прыг-скок и прыг и лапой задевает банку какую-то и та разбивается. Ты к собаке (найти владельца) - она на улицу, убежала. И вот ты заходишь и читаешь на банке этой "огурцы мадагаскарские, тушёные в соусе чаппа, цена - 5000 рублей за штучку". И ты стоишь и думаешь "какой же я дурак был, что банку не убрал в недоступное место, мало ли кто её может так разбить".

    Вот это - отсутствие опыта и заодно его приобретение.
    Ответ написан
    2 комментария
  • Как дописать сравнение на bash?

    @abcd0x00
    Надо понимать, что это вызов программы, а не просто конструкция
    [ 0E48-D3D6 == "$UUID" ]

    Если разложить на составляющие, получится
    [ - программа
    0E48-D3D6 - первый аргумент
    == - второй аргумент
    "$UUID" - третий аргумент
    ] - четвёртый аргумент

    Получится
    [ "0E48-D3D6" "==" "$UUID" "]"
    Ответ написан
    7 комментариев
  • Как правильно распарсить xml?

    @abcd0x00
    >>> import xml.etree.ElementTree as etree
    >>> import csv
    >>> import sys
    >>> 
    >>> text = """\
    ... <Root>
    ...   <SubRoot>
    ...     <Level1>A</Level1>
    ...     <Level2>B</Level2>
    ...     <Level3>C</Level3>
    ...     <Level4>D</Level4>
    ...   </SubRoot>
    ... 
    ...   <SubRoot>
    ...     <Level1>1</Level1>
    ...     <Level2>2</Level2>
    ...     <Level3>3</Level3>
    ...   </SubRoot>
    ... </Root>
    ... """
    >>> 
    >>> root = etree.fromstring(text)
    >>> 
    >>> out = [[i.text for i in node] for node in root]
    >>> out
    [['A', 'B', 'C', 'D'], ['1', '2', '3']]
    >>> 
    >>> out = [(i + [None] * (4 - len(i))) for i in out]
    >>> out
    [['A', 'B', 'C', 'D'], ['1', '2', '3', None]]
    >>> 
    >>> writer = csv.writer(sys.stdout)
    >>> writer.writerows(out)
    A,B,C,D
    1,2,3,
    >>>
    Ответ написан
    Комментировать
  • Как разбить большую функцию на несколько мелких?

    @abcd0x00
    У тебя неправильный подход. Ты сначала делаешь какую-то большую функцию, а потом хочешь её разбивать. Так вот эта большая функция твоя - это полное фуфло. Вот в чём дело. Потому что ты её уже неправильно сделал.

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

    Например, ты хочешь вывести строку "hello" в C.
    Код
    #include <stdio.h>
    
    int main(void)
    {
        printf("hello\n");
        puts("hello");
        fputs("hello\n", stdout);
        fprintf(stdout, "hello\n");
        fwrite("hello\n", 1, 6, stdout);
        return 0;
    }

    Вывод
    [guest@localhost c]$ .ansi t.c -o t
    [guest@localhost c]$ ./t
    hello
    hello
    hello
    hello
    hello
    [guest@localhost c]$


    Вот это уже готовые функции, их уже когда-то написали. И они решают твою задачу. Причём они для этого изначально вообще не предназначались. Многие из них не используются для таких задач, но они могут быть использованы. Они просто что-то делают с тем, что в них подают. А что в них подают и предназначались ли они для этого изначально - это неважно.

    А вот та же задача, но перечисленные функции использовать запрещено. Что делать?
    Можно написать функцию вместо них.
    Код
    #include <stdio.h>
    
    void f1(void)
    {
        putchar('h');
        putchar('e');
        putchar('l');
        putchar('l');
        putchar('o');
        putchar('\n');
    }
    
    void f2(char c)
    {
        putchar(c);
        putchar('e');
        putchar('l');
        putchar('l');
        putchar('o');
        putchar('\n');
    }
    
    void f3(char c)
    {
        int i;
        
        putchar('h');
        putchar('e');
        for (i = 0; i < 2; i++)
            putchar(c);
        putchar('o');
        putchar('\n');
    }
    
    int main(void)
    {
        f1();
        f2('h');
        f3('l');
        return 0;
    }

    Вывод
    [guest@localhost c]$ .ansi t.c -o t
    [guest@localhost c]$ ./t
    hello
    hello
    hello
    [guest@localhost c]$


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

    А вот теперь давай подумаем, как так получилось, что функция printf(), написанная десятки лет назад, решила нашу задачу и тысячи других задач, а свои функции f1(), f2() и f3() могут решить только нашу задачу, но кроме неё не могут решить и десятка других задач?

    В чём разница между printf() и f1()? В том, что в printf() строка "hello" передаётся через параметр (то есть выводимый текст параметризован), тогда как в f1() строки вообще нет, она образуется из символов, которые даже не параметризованы. А что у нас с f2(), ведь там есть параметр? А в f2() выводимый текст параметризован недостаточно, так же как и в f3().

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

    Вот таким образом и пишется функция: ты должен ставить задачу и решать её вызовом какой-то функции. А если функции не существует, то ты всё равно должен её вызывать, но потом дописывать её содержимое. И вот дописывая функцию, внутри неё ты делаешь то же самое - ставишь задачу и решаешь её вызовом какой-то функции.

    В примере выше ты решаешь задачу вывода строки "hello" функцией f1(), а внутри функции f1() ты решаешь задачу вывода символа на экран функцией putchar(). (Благо putchar() готова уже и хорошо параметризована. Но если не готова, то ты так же её вызываешь, а потом дописываешь её внутренность, в которой всё повторяется - задача и вызов.)
    Ответ написан
    Комментировать
  • Нужно ли изучать автоматизацию сборки?

    @abcd0x00
    Если сейчас все так просто, то нужно разбираться в make/cmake?

    Вообще, make - это старое, проверенное средство, которое везде есть. И практика показывает, что когда у тебя есть проект, его надо не только компилировать, но и всячески обслуживать (запускать тесты, чистить ненужные файлы, устанавливать, деустанавливать). И для всего этого может быть сделан всего один Makefile, так как в нём не только сборку можно делать, но и задавать серии команд.
    Пример самодельного Makefile
    # Build section
    
    CC = gcc
    CFLAGS = -ansi -pedantic -Wall
    
    TARGET = ntow
    OBJS = main.o noun.o triple.o number.o cmdline.o errors.o input.o
    
    BASEDIR = .
    TESTDIR = $(BASEDIR)/tests
    
    # Install section
    
    prefix = /usr/local
    
    PREFIX = $(prefix)
    BINDIR = $(PREFIX)/bin
    
    # Rules
    
    all: $(TARGET)
    
    $(TARGET): $(OBJS)
    	@$(CC) $(CFLAGS) $^ -o $@ && echo "$(TARGET) has built"
    
    main.o: cmdline.h number.h input.h errors.h
    triple.o: triple.h
    number.o: number.h
    cmdline.o: cmdline.h errors.h
    
    # Commands
    
    help:
    	@echo "usage: make [ test | install | uninstall | clean | cleanall ]" 1>&2
    
    test: $(TARGET)
    	@$(MAKE) -C $(TESTDIR) run
    
    clean:
    	@rm -f $(OBJS) $(TARGET) && echo "$(TARGET) cleaned"
    
    cleanall: clean
    	@$(MAKE) -C $(TESTDIR) clean
    
    install:
    	install -d $(BINDIR)
    	install $(TARGET) $(BINDIR)/$(TARGET)
    
    uninstall:
    	rm -f $(BINDIR)/$(TARGET)
    
    .PHONY: help all test clean cleanall install uninstall

    Ответ написан
    Комментировать
  • Что означают в пути числа начинающиеся с символа решётки?

    @abcd0x00
    >>> b'\320\237\321\200\320\260\320\262\320\276\320\262\321\213\320\265'.decode('utf-8')
    'Правовые'
    >>>
    Ответ написан
    5 комментариев