Задать вопрос
  • Python - кодировка cp866?

    @abcd0x00
    >>> "’®ав ЋЎ¦®аЄ  Љ®а®«м ‹Ґў".encode('cp1251').decode('cp866')
    'Торт Обжорк  Король Лев'
    >>>
    Ответ написан
    Комментировать
  • Как выкачать сайт с видео?

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

    @abcd0x00
    Возможно, сервер модерируется, бывает такое на github'е, например. А если в общем, то проверь, закоммитил ли ты изменения. Потом проверь, в ту ли ветку отправил. Потом проверь, ту ли ветку скачивает тот.
    Ответ написан
    Комментировать
  • Как остановить вывод команды через BASH?

    @abcd0x00
    [guest@localhost ~]$ func() { while true; do echo a; echo b; sleep 5; done; }
    [guest@localhost ~]$ func | head -2
    a
    b
    [guest@localhost ~]$
    Ответ написан
    Комментировать
  • Конечный автомат (распознавание идентификаторов) как нарисовать универсальный?

    @abcd0x00
    Надо тебе получить эквивалентную грамматику сначала (порождающую тот же самый язык), пригодную для построения конечного автомата. Обычно для этого вводят дополнительный нетерминал.

    Вот к этому мужику зайдёшь, посмотришь
    проблема
    https://www.youtube.com/watch?v=XbihuriQ8p8&t=1h5m30s
    решение
    https://www.youtube.com/watch?v=wH4l8WvGPFE&t=1m20s
    Ответ написан
    Комментировать
  • Из сетевика в программисты, какое направление выбрать?

    @abcd0x00
    Подскажите пожалуйста в каком направлении смотреть, где с моим опытом будет проще, где будет возможность срезать углы?

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

    Напиши программу cat или ls. Просто берёшь, смотришь на поведение программы и пишешь свою программу, которая делает всё то же самое. Вот это простые программы, но ты их не напишешь. И все об этом знают.

    Почему ты не напишешь их? Потому что тебе кажется, что ты там что-то знаешь, а на самом деле ты не знаешь ничего, потому что ничего не изучал.

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

    Имею 10 лет в телекоме. Знания на уровне CCNP с просроченным CCNP R&S. Cisco, и ему подобное сетевое железо, jun'ы. Linux(RedHat,Debian), Freebsd, на уровне среднего и ниже админа.

    Ну вот, напиши cat. Как это тебе поможет? man cat только нужно и всё, чтобы все фичи узнать.
    Ответ написан
    Комментировать
  • Как отсортировать большое количество фотографий?

    @abcd0x00
    Как это будет лучше реализовать, можно ли оптимизировать алгоритм?

    Лучше написать несколько разных скриптов. Один скрипт должен принимать каталог и с ним проделывать свои действия. А потом пишется скрипт, который соединяет эти независимые скрипты в одну систему.

    1. Найти все jpg в выбранной папке.

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


    2. Для каждого jpg проверить заголовки (могу ошибаться, но они вроде есть в jpg) на целостность (мало ли файл повреждён или файл не является фотографией, а просто файлом с расширением jpg).

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


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

    Третий скрипт принимает папку и пишет информацию о файлах в ней в csv-файл.
    Скрипт принимает имя папки, искомое расширение файлов и имя файла для сохранения.


    4.Найти дубликаты и применить фильтры (допустим - должны быть все exif тэги).

    Четвёртый скрипт принимает папку, ищет дубликаты и удаляет их.
    Пятый скрипт принимает папку и применяет фильтры к файлам в ней.
    (Надеюсь, ты понял, что их нельзя объединять в один скрипт.)

    5.Скопировать/переместить оставшиеся файлы в заданную структуру папок.

    Шестой скрипт принимает папку и перемещает файлы из неё в структуру папок.
    Скрипт принимает имя папки и имя новой папки для сохранения.

    Вот, и в конце ты пишешь седьмой скрипт, управляющий этими скриптами, который знает, куда и какую папку подавать на каждом этапе.
    Ответ написан
    Комментировать
  • Чем удалить дубликаты строки в большом списке файлов?

    @abcd0x00
    Надо написать функцию, в которую ты подаёшь пути к двум файлам и номер строки и она сравнивает эти файлы по этой строке и возвращает true/false (равны по строке, не равны по строке). А потом, когда у тебя есть эта функция, ты просто берёшь каждую пару файлов и подаёшь их в эту функцию. Если она вернула true, удаляешь второй файл и подставляешь следующий для проверки.

    Вызовы будут так выглядеть:

    Для файлов file1.txt file2.txt file3.txt file4.txt

    func(file1.txt, file2.txt, 3)
    func(file1.txt, file3.txt, 3)
    func(file1.txt, file4.txt, 3)
    func(file2.txt, file3.txt, 3)
    func(file2.txt, file4.txt, 3)
    func(file3.txt, file4.txt, 3)

    Там у тебя получится цикл в цикле. Внешний цикл перебирает левые файлы. Внутренний цикл перебирает правые файлы. И вот правые файлы удаляются, если в них дубликат.

    Конечно, там получится заморочка: если файл уже удалился как правый, то его не нужно проверять уже как левый файл с другими правыми файлами. Поэтому, чтобы не путаться, ты можешь не удалять правые файлы, а просто записывать пути к ним куда-нибудь. А уже потом, после всего, ты можешь эти пути взять и по ним удалить файлы.
    Ответ написан
    Комментировать
  • Стоит ли учить программировать по старинке?

    @abcd0x00
    И ещё актуален ли Си как язык программирования в 21 веке, или даже ОС пишут на чем-нибудь повыше?

    На нескольких языках пишется проект одновременно. Если пишешь что-то, то надо сами файлы проекта обслуживать.
    Например:
    • удалить пробелы на концах строк во всех исходниках
    • генерировать новый файл с исходным кодом определённого вида
    • записывать комментарий с именем файла и датой в определённые исходные файлы
    • копировать файлы в специальный каталог, если в них есть строка с именем пользователя
    • найти все непрокоментированные функции в коде и добавить их в файл с задачами
    • вычислить покрытие кода тестами в процентах и вывести это в html-страницу

    Да там много всяких действий надо делать. Основной принцип: если ты что-то сделал второй раз, напиши скрипт, который будет делать это в следующий раз. Так вот, для таких дейсвий C не подойдёт, потому что он под это не заточен, нужен специальный язык. В итоге у тебя сам проект на C, куски кода для проекта генерирует скрипт на shell'е, тестирование проекта выполняется скриптом на питоне. А потом тебе, например, надо сгенерировать набор подобных скриптов для любого нового проекта - и ты на shell'е пишешь скрипт, который создаёт shell-скрипты, python-скрипты и базовый исходник на C. Написать программу на C, которая создаёт исходники на C для написания другой программы, - милое дело, а может и несколько программ написать.

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

    У меня вообще первые программы были на QBasic'е, и они делали своё дело - добывали мне текстовые данные из бинарников, которые я брал из программы одной. Но это было давно, но я до сих пор помню, сколько я данных ими добыл. Вот для чего нужны программы. У тебя их никто не будет покупать, ты их делаешь для того, чтобы они работали и давали результат, который вручную не получишь, потому что это долго или невозможно вообще (100 часов надо).
    Ответ написан
    Комментировать
  • В файл1 удалить строки из файл2?

    @abcd0x00
    Как в файл1 содержащим строки вида почта:имя:фамилия:возраст удалить те строки которые содержатся в файл2 где указана просто почта

    grep -f file2.txt -v file1.txt >output.txt
    Ответ написан
    Комментировать
  • Как сделать выборку, со строгим GREP по нескольким линиям?

    @abcd0x00
    Здесь делал то же самое
    Как правильно написать скрипт на Bash?

    text="\
    1 London Paris |I am the Rock|
    2 Moscow Kyiv |I am the Cena|
    3 Kharkiv Dnepr |I am the CM Punk|
    4 Ottava Amsterdam |I am the Rock|
    5 Oslo New-Yourk |I am the Rock|
    6 Lviv Varshava |I am the Cena|
    7 Berlin Rome |I am the CM Punk|
    8 Moscow Oslo |I am the Cena|
    9 Kharkiv Kyiv |I am the Brock Lesnar|
    "
    
    
    fsm()
    {
        awk '{
            switch (state) {
            case 0:
                if (/Rock/) {
                    out = $0
                    state = 1
                }
                break
            case 1:
                if (/Rock/) {
                    out = $0;
                } else if (/Cena/) {
                    out = out"\n"$0
                    state = 2
                } else {
                    out = ""
                    state = 0
                }
                break
            case 2:
                if (/Punk/) {
                    out = out"\n"$0
                    print out
                    out = ""
                    state = 0
                } else {
                    out = ""
                    state = 0
                }
                break
            }
        }'
    }
    
    echo "$text" | fsm


    Вывод
    [guest@localhost tmp]$ echo "$text" | fsm
    1 London Paris |I am the Rock|
    2 Moscow Kyiv |I am the Cena|
    3 Kharkiv Dnepr |I am the CM Punk|
    5 Oslo New-Yourk |I am the Rock|
    6 Lviv Varshava |I am the Cena|
    7 Berlin Rome |I am the CM Punk|
    [guest@localhost tmp]$
    Ответ написан
    Комментировать
  • Как правильно написать скрипт на Bash?

    @abcd0x00
    Через конечный автомат
    text="\
    abc1
    abc2
    Mon, 1 Aug 2012 00:15:00 +0200|1.1.1.1|dnepr1| - |user logged in| -
    Mon, 1 Aug 2012 00:15:00 +0200|1.1.1.1|dnepr1| - |user changed password| -
    Mon, 1 Aug 2012 00:15:00 +0200|1.1.1.1|dnepr1| - |user logged off| -
    def1
    def2
    Mon, 1 Aug 2012 00:15:00 +xxxx|1.1.1.1|dnepr2| - |user logged in| -
    Mon, 1 Aug 2012 00:15:00 +0200|1.1.1.1|dnepr2| - |user logged in| -
    Mon, 1 Aug 2012 00:15:00 +0200|1.1.1.1|dnepr2| - |user changed password| -
    Mon, 1 Aug 2012 00:15:00 +0200|1.1.1.1|dnepr2| - |user logged off| -
    ghi1
    ghi2
    "
    
    fsm()
    {
        awk '{
            switch (state) {
            case 0:
                if (/user logged in/) {
                    out = $0
                    state = 1
                }
                break
            case 1:
                if (/user logged in/) {
                    out = $0;
                } else if (/user changed password/) {
                    out = out"\n"$0
                    state = 2
                } else {
                    out = ""
                    state = 0
                }
                break
            case 2:
                if (/user logged off/) {
                    out = out"\n"$0
                    print out
                    out = ""
                    state = 0
                } else {
                    out = ""
                    state = 0
                }
                break
            }
        }'
    }
    
    echo "$text" | fsm


    Вывод
    [guest@localhost tmp]$ echo "$text" | fsm
    Mon, 1 Aug 2012 00:15:00 +0200|1.1.1.1|dnepr1| - |user logged in| -
    Mon, 1 Aug 2012 00:15:00 +0200|1.1.1.1|dnepr1| - |user changed password| -
    Mon, 1 Aug 2012 00:15:00 +0200|1.1.1.1|dnepr1| - |user logged off| -
    Mon, 1 Aug 2012 00:15:00 +0200|1.1.1.1|dnepr2| - |user logged in| -
    Mon, 1 Aug 2012 00:15:00 +0200|1.1.1.1|dnepr2| - |user changed password| -
    Mon, 1 Aug 2012 00:15:00 +0200|1.1.1.1|dnepr2| - |user logged off| -
    [guest@localhost tmp]$
    Ответ написан
    Комментировать
  • В чём разница операторы присваивания оператор равенства?

    @abcd0x00
    Я не понимаю чем и как отличаются операторы присваения от оператора равенства

    Это совсем разные операции. Операция присваивания записывает какое-то значение в переменную. Операция сравнения сравнивает значения, чтобы можно было знать, равны они или нет.

    Операция присваивания в if'е (в условии) не используется никогда, но она может там случайно появиться из-за опечатки в операции сравнения. И при появлении об этом никак не будет сообщено, потому что синтаксически такая запись не считается неправильной. Поэтому такая опечатка может приводить к незаметной ошибке в программе, так как программа будет просто потихой неправильно работать.
    Ответ написан
    Комментировать
  • Как проверить на C++ создался ли файл?

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

    @abcd0x00
    Они там сами потом освобождаются (для этого ты их и привязываешь к родителям). Поэтому если ты привяжешь к чему-нибудь элемент, для которого не выделялась динамическая память, то эта освобождалка всё равно будет его освобождать, что и даст выпадение программы. Так что делай, как все делают - выделяй память и привязывай.
    Ответ написан
  • Есть ли разница между char* и char[число] при передаче аргументов функции?

    @abcd0x00
    Разницы нет. Вообще, принято скобки писать просто пустыми, без числа. Но в идеале, чисто стилистически для повышения читаемости, когда передаётся указатель, пишется указатель, а когда передаётся массив, пишется массив.

    Вот пример:
    Обычно пишут так
    int main(int argc, char *argv[])
    Но это можно записать и так
    int main(int argc, char **argv)
    Так как разницы нет.
    Но пишут первым способом, чтобы подчеркнуть для читателя исходника, что там массив указателей, а не просто указатель на указатель какой-то непонятный (можно его двигать, или нельзя его двигать - неясно). А в первом варианте читателю сразу понятно, что там можно применять argv++, так как движение по массиву происходит.
    Ответ написан
    Комментировать
  • Продолжать обучение?

    @abcd0x00
    Пройдя этот курс в голове по-любому останется хоть какая-то база по С++, но будут ли базовые знания Си? Или всё же Си надо изучать отдельно?

    У них разые стили при написании программ. C++ стремится к одному, оттуда и стиль свой. C стремится к другому, оттуда и стиль свой. То есть ты не только будешь напарываться на различия в синтаксисе (которые есть), но и писать на C неправильным стилем, делая всякие избыточные и ненужные вещи. Программы на C получаются намного короче аналогичных (эквивалентных) программ на C++.

    Для примера тебе:
    В C++, если есть приведение типа, оно делается явно, причём с выбором правильной операции приведения типа (кастования).
    В C то же самое пишется просто без каких-либо операций, потому что существует неявное приведение типа (по стандарту), про которое ты знаешь, а потому и писать ничего не надо.
    То есть уже минус одна заморочка, которая в C++ жрёт текст исходника, а в C она вообще не используется, оставляя исходник чистым и кратким.
    Ответ написан
    Комментировать
  • Массив uint8_t [8] на переменную uint64_t?

    @abcd0x00
    Собственно, имеется динамический массив uint8_t[8], который нужно заменять на переменную uint64_t, введенную пользователем.

    Нужно написать функцию упаковщик. Там есть проблемы с эндианством, ты можешь просто получить неявную логическую ошибку, если не будешь учитывать эндианство. В идеале, нужно приводить всегда к одному эндианству, а для этого надо его сначала определить на данной системе. Вот для этого всего и нужна функция, которая всё правильно определит и запакует. Так просто через union нельзя делать.
    Ответ написан
  • Что за конфигурация emacs?

    @abcd0x00
    Она вроде бы одна из самых популярных, и ее называют самой удобной, универсальной и продвинутой.

    Вообще это здесь
    ergoemacs.org/emacs/emacs_keys_index.html

    Насчёт самой удобной - не факт, что это самый удобный вариант. Я, например, вообще без изменений работаю, чтобы на любом компе с дефолтным Emacs'ом без всяких дополнительных настроек быстро в нём ориентироваться. А он (Xah) там предлагает клавиши вставки из буфера менять на Ctrl-C/Ctrl-V, что-то дописывать в плане функций и подобные вещи. Из-за этого на абсолютно голом Emacs'е ты просто будешь сидеть и пялиться в монитор мелкими шагами, потому что привык работать с доп. настройками, а без них ты связан.
    Ответ написан
    Комментировать
  • Как работать с клонированным шаблоном?

    @abcd0x00
    Совсем не обязательно всё это в одном репозитории хранить. Можешь сделать репозиторий шаблона, а к нему прицепить репозиторий своего проекта прямо на диске. Во внешнем источнике своего проекта просто пишешь путь к соседней папке, где шаблон лежит со всеми своими коммитами. В итоге у тебя будет два репозитория, но зато не будет свалки из коммитов шаблона и комитов своего проекта.
    Ответ написан
    Комментировать