• Как научиться писать эффективно и без ошибок работающие программы?

    @Sh0ttky
    1) автотесты, которые покрывают всё и вся
    2) самопроверки в коде.

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

    @Sh0ttky
    если написать в командной строке windows например:
    dir | find "exe"
    , это будет фактически то, что вы хотите
    есть процесс dir, он пишет в "буфер" stdout
    есть процесс find, он пишет из "буфера" stdin
    sdtout dir соединён с stdin find пайпом.

    Короче, читайте, что такое pipe (лучше в юниксе)
    Ответ написан
    Комментировать
  • Стоит ли учить программировать по старинке?

    @Sh0ttky
    1) ООП - это АБСТРАКЦИЯ, и сказать что в С++ есть ООП, а в си нет - это некорректно. Всё равно, что сказать, что в c++ есть кнопки, а в си нет. Посмотрите код любого хорошего проекта, и увидите огромное кол-во ООП.
    2) актуален ли си сегодня? Однозначно да. Но нужно знать и С++. Точно так же С++снику обязательно нужно знать си. Сегодня вакансии именно такие.
    Ответ написан
    Комментировать
  • Что положить в портфолио программиста на Си?

    @Sh0ttky
    1. Что касается портфолио. Если нет формального опыта работы на си, то на должность выше среднего рассчитывать в принципе не придётся. Опять же, если этого опыта нет, то шансов написать годное портфолио тоже мало. Лучше вообще код не показывать, пока не попросят.
    2. Если хочется посмотреть, как выглядит хороший современный код на си - рекомендую почитать исходники популярного открытого проекта. В зависимости от удобной специфики. Например: ffmpeg , openssl, openvpn, qemu. Там же можно посмотреть, как организована система сборки/автоматического тестирования.
    Исходники лучше всего читать в процессе отладки (gdb). Тут порог вхождения несколько высокий, т.к. придётся искать IDE. Я пользуюсь emacs.
    3. Из собственного опыта, даже крутые крупные компании готовы брать сишника, лишь бы он был готов стараться. Не стесняйтесь предлагать свои услуги.
    4. Чем хорош п.2 , так это тем, что знание популярных открытых фреймворков - это + к резюме.
    5. Удобнее будет под линуксом.
    Ответ написан
    1 комментарий
  • С или С++ для микроконтроллеров. Почему С?

    @Sh0ttky
    Как на мой взгляд, си вообще лучше в принципе. Просто на микроконтроллерах это становится сильнее заметно.
    Ответ написан
    Комментировать
  • Как вывести в терминал состояние кодирования ffmpeg если процесс запущен в фоне?

    @Sh0ttky
    Когда программа "выводит что-то в терминал", технически это означает, что она пишет в соответствующие файлы tty. FFmpeg выводит своё состояние в stderr. Номера дескрипторов stdout и stderr - 1 и 2 соответственно.
    Можно перенаправить его вывод stderr в файл:
    ffmpeg -i myfile.avi result.avi 2>/tmp/ffmpeg-log.log

    в приведённом примере файл будет перезаписываться при каждом новом вызове.

    Вывести в текущий терминал состояние = прочитать последнюю строку лога
    cat /tmp/ffmpeg-log.log | tail -n 1

    Если беспокоит нагрузка на жёсткий диск: /tmp обычно монтируется в оперативной памяти.
    Ответ написан
    2 комментария
  • Как определить, содержит ли закрытая программа свободный код?

    @Sh0ttky Автор вопроса
    Предполагаю что, основным механизмом здесь являются сотрудники укравшей компании. Если программист узнает, что компания, где он работает использует код под GPL, он имеет полное право потребовать от неё открытия кода, и будет юридически защищён. У него будут непосредственные док-ва как у свидетеля.
    Ответ написан
  • Допустимо ли проприетарному приложению запускать бинарник под GPL?

    @Sh0ttky Автор вопроса
    Спасибо, похоже я нашёл ответ на свой вопрос в GNU ЧаВо :
    Если я пишу внешний модуль для применения с программой, выпущенной под GPL, какие требования это налагает на лицензии, под которыми я могу распространять свой модуль? (#GPLAndPlugins)
    Это зависит от того, как программа задействует свои внешние модули. Если программа пользуется для этого вызовами fork или exec, то модули — это отдельные программы, так что лицензия главной программы не предъявляет к ним никаких требований.

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

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

    @Sh0ttky
    Завёл себе репозиторий, чтобы записывать туда сишные трюки.

    https://sourceforge.net/p/c-is-freedom/code/ci/mas...

    Сейчас там есть шаблоны на си в двух вариантах. Кстати более гибкие и понятные чем с++ шаблоны.
    https://sourceforge.net/p/c-is-freedom/code/ci/mas...

    Был бы очень рад, если кто-то предложит туда мерж со своими трюками.
    ( fork -> затем закоммитить в форк своё -> merge reguest )

    Вот ещё трюк:
    /* 
       USAGE: 
       int64_t m = supermax(1, 234234, 35423523, 777); // m = 35423523
    */
    
    #include "stdint.h"
    #include "limits.h"
    
    #define NUM_OF_ARGS(...) (sizeof((int64_t[]){__VA_ARGS__})/sizeof(int64_t))
    
    #define supermax(...) _supermax((int64_t[]){__VA_ARGS__}, NUM_OF_ARGS(__VA_ARGS__))
    int64_t _supermax(int64_t arr[], int size)
    {
        int64_t max = arr[0];
    
        int i = 0;
        while (i < size) {
            if (arr[i] > max)
                max = arr[i];
            i++;
        }
        return max;
    }
    
    
    #include "stdio.h"
    
    int main()
    {
        int64_t x = supermax(1,2,3,4,5);
        printf("%lld\n", x);
    }
    Ответ написан
    Комментировать