• Почему goto зло?

    @iv_k
    goto - тяжелое наследие ассемблерщиков, переходящих на си.
    можно обойтись и без него.
    хотя.. гляньте ядро линукс, там goto полно.
    например вот так
    foo()
    {
       if(..)
       {
            goto err;
       }
       if (...)
       {
          goto err;
       }
        on_success();
        return ok;
    err:
        on_error();
        return error;
    }


    вот тут достаточно просто для понимания
    Ответ написан
    Комментировать
  • Почему goto зло?

    0xcffaedfe
    @0xcffaedfe
    Developer & Reverser
    goto не зло, просто им нужно уметь пользоваться, anyway компиль все равно вставит jmp если нужно. Да и вообще компиляторы нынче шибко умные.
    Оригинал вида:
    #include <iostream>
    void dd();
    
    int main(int argc, const char * argv[]) {
        
    s:
        if(rand() % 100 == 99){
            goto e;
        }
        goto s;
    e:
        return 0;
    }


    Кошерно превращает в обычный цикл:
    int _main(int arg0, int arg1) {
        do {
                rax = rand();
                temp_3 = rax % 0x64;
                if (temp_3 == 0x63) {
                    break;
                }
        } while (true);
        return 0x0;
    }


    ну и на асме.

    _main:
                        push       rbp
                        mov        rbp, rsp
                        sub        rsp, 0x10
                        mov        dword [ss:rbp+var_4], 0x0
                        mov        dword [ss:rbp+var_8], edi
                        mov        qword [ss:rbp+var_10], rsi
    _100000f66:       call       imp___stubs__rand
                        mov        ecx, 0x64
                        cdq        
                        idiv       ecx
                        cmp        edx, 0x63
                        jne        _100000f81
                        jmp        _100000f86
    _100000f81:       jmp        _100000f66
    _100000f86:       xor        eax, eax
                        add        rsp, 0x10
                        pop        rbp
                        ret
    Ответ написан
    9 комментариев
  • Почему goto зло?

    maaGames
    @maaGames
    Погроммирую программы
    Потому что не зло, просто "красивая" легенда.
    Ответ написан
    Комментировать
  • Как без боли собрать Qt проект под Raspberry?

    gbg
    @gbg
    Любые ответы на любые вопросы
    No pain - No Gain. Повышайте квалификацию для того, чтобы сборка не была для вас проблемой.
    Ответ написан
    Комментировать
  • Как освоить низкоуровневое программирование на С для микроконтроллеров?

    @iv_k
    взять отладочную плату, поставить IDE и начать осваивать.
    на сайтах производителей МК есть все, вплоть до видеоуроков.
    Ответ написан
    Комментировать
  • Порекомендуйте книги или журналы по электронике?

    Начните с этой:
    Пауль Хоровиц, Уинфилд Хилл. Искусство схемотехники -- https://ru.wikipedia.org/wiki/%D0%98%D1%81%D0%BA%D...
    Ответ написан
    1 комментарий
  • На чем проще программировать под windows?

    AtomKrieg
    @AtomKrieg
    Давай я поищу в Google за тебя
    Qt подходит по всем пунктам
    Ответ написан
    3 комментария
  • Симистор и постоянный ток?

    gbg
    @gbg Куратор тега Arduino
    Любые ответы на любые вопросы
    Симистор на то и симистор, что закрывает его переменка.
    Не верю, что IGBT на вашу мощность нет.
    Ответ написан
    6 комментариев
  • Книги по созданию приложений на Qt под андроид?

    Zifix
    @Zifix Куратор тега Qt
    Barbatum
    Пишете приложение на C++ и QML, запускаете его на всех платформах.

    Есть ли уже литература по C++ вместе с Qt5, QtQuick, qml всреде QtCreator?
    Ответ написан
    Комментировать
  • Верить ли Макконнелу?

    @cijiw
    Речь о том, что ваш код должен быть понятен другому программисту с ходу, без скрежетания его мозга

    Если ваш код нуждается в подробном комментировании - то это плохой код.
    В больших коллективах при создании сложных проектов есть правило - пиши проще.
    Сервер для многопользовательской игры?

    Я работал с огромным проектом на PHP (один из полусотни разработчиков в компании), и не представляю его даже на экосистемах Python или Ruby. А писать такое на Node.js или Go - это просто самоубийство.
    Кстати, запрещались любые оптимизации кода, которые шли во вред читаемости ;)


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

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

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

    Форматирование обеспечивает привыкание глаза и легкость чтения. Поэтому в крупных конторах даже есть единые правила форматирования когда - когда все обязаны писать одинаково. Это поднимает производительность труда программистов при выполнении code review чужого кода и при поиске какой либо необходимой информации в чужом коде.

    Это настолько важно, что в свежих языках (например, в Go) определенное форматирование кода является общеязыковым стандартом.
    Ответ написан
    Комментировать
  • Верить ли Макконнелу?

    maaGames
    @maaGames
    Погроммирую программы
    Форматирование автоматически обеспечивается IDE. Комментирование в любом случае необходимо в той или иной степени.
    Если при чтении кода+комментариев однозначно понятно что, зачем и как делается, то дополнительно шлифовать не нужно. А если не понятно, то нужно подробнее писать комментарий, переименовывать переменные. Может, вообще код переписать.
    но это не ради абстрактного "совершенства", а чтобы не взорвался мозг при отладке.
    Ответ написан
    Комментировать
  • Можно ли сделать из 24 Вольт - 19.5?

    gbg
    @gbg Куратор тега Электроника
    Любые ответы на любые вопросы
    Вам нужен этот прибор

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

    @Got_Oxidus
    Учусь
    я один пишу ?
    int * name;
    (звёздочка отдельно)
    Ответ написан
    Комментировать
  • Последовательное выполнение условий if в С++?

    Вы действительно не понимаете, что число не может быть одновременно меньше нуля и больше нуля?
    Ответ написан
    2 комментария
  • Какую IDE лучше использовать для разработки графического интерфейса C++?

    RiseOfDeath
    @RiseOfDeath
    Диванный эксперт.
    Лучше всего использовать "Родную" для графической библиотеки IDE. Т.е. если вы будете использовать виндовые формы, то лучше Visual Studio, если Qt - лучше QtCreator (и нет там никаких проблем с компилятором от вижуал студии, просто чтобы он подцепился автоматом при установке, его надо ставить до установки QtCreator, либо придется в ручную настраивать. Это легко, но требует некоторого понимания того, что вообще вы делаете). Если вы делаете андроидовские гуи - используйте андроид студию и т.п.

    Почему так? Ну просто "родной" инструмент, обычно, заточен под "родную" графическую библиотеку/фреймворк.
    Можно и в не родном, но вам потребуется сильнее понимать, как именно библиотека работает (т.к. многие вещи, которые за вас делала "родная" IDE, вам придется делать руками)
    Ответ написан
    Комментировать
  • Что значит открытый коллектор?

    a_volkov1987
    @a_volkov1987
    Инженер-схемотехник
    https://ru.m.wikipedia.org/wiki/%D0%A2%D1%80%D0%B0...
    - открытый коллектор (сток)
    https://ru.m.wikipedia.org/wiki/%D0%92%D1%8B%D1%81...
    - высокоимпедансное состояние
    easyelectronics.ru/avr-uchebnyj-kurs-ustrojstvo-i-...
    - почитайте о назначении подтягивающих резисторов и вообще крайне советую этот сайт для изучения основ.

    Для подключения терморезистора вам надо собрать делитель напряжения на терморезисторе и резисторе известного номинала и измерять выдаваемое этим делителем напряжение с помощью входа, работающего в аналоговом режиме. Данные будут уходить на встроенный АЦП контроллера.
    Чтобы использовать светодиод можно взять выход с открытым стоком и через токоограничительный резистор подключить светодиод. Анодом к положительному полюсу источника питания, катодом - через резистор к выводу микроконтроллера. Установите на выходе 0 - светодиод загорится, 1 - погаснет.
    Ответ написан
    Комментировать
  • Программа или сайт для построения электросхем?

    gbg
    @gbg Куратор тега Arduino
    Любые ответы на любые вопросы
    Программ - великое множество. Начиная от QUCS и заканчивая Proteus и Electronic workbench.

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

    Также имеются САПР вроде Kicad или Eagle. Эти позволяют спроектировать электронную плату, и затем отправить файлы на завод для ее производства. Нужно изучать кипу стандартов, чтобы из производства получилась плата, а не фига.
    Ответ написан
    Комментировать
  • Имеет ли смысл начинать с Си?

    @spotifi
    Изучать следует начинать с языка со статической типизаций.

    В частости С подходит по этому критерию.
    Плюс в изучении С - много литературы и пр. информации.
    Минусы - будете не только язык изучать, а еще и со стандартами и их разной кривости реализациями бороться. То, что работает в реализации Clang на Linux не будет работать в реализации MSVC на Windows и в реализации GCC на FreeBSD. Оно вам надо?
    Плюс в С легко отстрелить себе ногу.
    Плюс реальная польза от Си - это только в слабых микроконтроллерах (мощные модели вполне способны и целые операционные системы запуска), да в написании операционных систем. В других областях или давно перешли или переходят на другие языки.

    Я бы предложил Go.

    Статическая типизация.
    Мощь и простота в одном флаконе.
    Жесткий стандарт - разные версии на разных ОС комилируются запросто.

    Скриптовые динамические языки - PHP, JavaScript, Python, Ruby, Perl, Lua - плохо для начинающего. Прививает нехорошее отношение к переменным.

    Rust, D, Java, Dart - слишком много концепций, не будете знать на чем сосредоточить внимание.

    Haskell, Erlang - функциональные концепции, далеко оторванные от массового программирования, которое в большинстве своем императивное.
    Ответ написан
    108 комментариев
  • Для чего нужен Docker?

    @spotifi
    Внутри Docker только Linux, и, экспериментально, FreeBSD. Запускается нативно под Linux и, экспериментально, под FreeBSD. Под MacOSX, Windows - через виртуальную машину.

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

    Это почти виртуальная машина. Почти, да не совсем.


    Есть такое понятие "ад зависимостей". Любое ПО устанавливаемое на компьютер, тянет за собой зависимости (конфигурационные файлы, статические файлы называемые обычно asset, вспомогательные утилиты/сервисы, библиотеки и пр.). Ряд из этих библиотек/утилит/сервисов несовместим друг с другом. А с учетом того, что каждая из этих библиотек/утилит/сервисов имеет и свои зависимости - ситуация еще хуже.

    Например, мы используем Yandex.Cocaine, которая нормально компилируется только на Ubuntu 14.04 (и, вроде, на Debian 7). Но не под CentOS 6, 7, Debian 8, FreeBSD 9, 10, Ubuntu 15, 16 и пр. - скомпилировать его невозможно. Запускаем в этих операционных системах в Докере.

    С другой стороны, и одновременно с этим, вам необходимо установить другое, более современное ПО. И одновременно более старое. Причем речь даже не идет об серьезно отличающихся версиях Linux. Например, одно ПО требует не менее Ubuntu 14.10, а другое не более Linux 14.04.

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

    Таким образом, мы имеем бинарный файл запускаемый как бы в своей операционной системе.

    Вы можете сказать - ба, да это же давно известная виртуальная машина. Но нет, это не так. Это так называемые контейнера. Никакой виртуальной машиной там и не пахнет. За исключением Windows и MacOSX, где работа без виртуальном машины пока экспериментально возможно только, а нормой в этих ОС является использование Докера внутри полноценной виртуальной машины.

    Но виртуальные машины с Докером используются только для разработки. Для запуска в production виртуальные машины с Докер не используются.

    Докер использует контейнеры операционной системы. LXC в Linux, Jails в FreeBSD. Контейнер - это область операционной системы, изолированная от основной части операционной системы. В контейнере свое дерево каталогов (включая системные /dev, /bin, /sbin и пр.), свои сетевые порты и пр. и пр.

    Но при этом не используется полная виртуализация. Что существенно экономит ресурсы. Запустить 100 полноценных виртуальных машин вряд ли получится даже на мощном сервере. А вот запустить 100 контейнеров Docker даже на слабом домашнем компьютере - возможно.

    Правда использование не полной виртуализации ограничивает использование операционных систем внутри контейнеров. Как правило, это специально подготовленные версии Linux или FreeBSD. Именно специально подготовленные. Windows - в принципе в контейнере запустить невозможно.

    Контейнеры существовали и до Docker. Докер, строго говоря, это всего лишь очень удобный набор инструментов, собранных воедино, для управления контейнерной виртуализацией. Но очень удобный.

    Зачем это используется?

    Ребята из всяческих Dropbox, Facebook и и пр. гигантах, запускающие по 1 млн. различных программ в своих сервисах, столкнулись, что невозможно везде гарантировать идентичные настройки операционной системы. А это критично.

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

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

    Более того - изначально разработчик программного обеспечения тестирует программу в контейнере Докер, с определенными настроками. И в этом же (или с такими же настройками) контейнере Докера программа уезжает на сервер.

    Это позволяет гарантировать гораздо большую идентичность среды разработки и среды исполнения.

    До этого люди мучались, придумывали хитрые инсталяторы...

    Потом плюнули на попытки упорядочить окружение в ОС - и сейчас концепция такова - устанавливать программы на сервера вместе со своими индивидуально настроенными под них операционными системами - то есть внутри контейнеров. 1 контейнер = 1 настройка ОС = 1 программа внутри.

    Другими словами:
    • Докер-контейнер нужно использовать для отладки.
    • Тот же Докер-контейнер нужно использовать и на сервере.


    Это позволяет не трудиться с настройками "под сервер" локально на машине разработчика. Это позволяет разрабатывать на машине разработчика совершенно разные программы одновременно, которые требует несовместимых настроек операционной системы. Это позволяет давать гораздо больше гарантий, что программа на сервере будет вести себя также как и на машине разработчика. Это позволяет разрабатывать под Windows/MacOSX с удобным "прозрачным" тестированием под Linux.

    Докер применим к созданию/настройке только серверного программного обеспечения под Linux (экспериментально под FreeBSD). Не для смартфонов. А если десктопов - то только программное обеспечение без GUI.

    Посколько Докер позволил одним махом упростить работу разработчикам и админам и повысить качество результата - сейчас бум на Докер. Придумано огромная гора инструментов для управления развертыванием приложений созданных с Докером. Если раньше чтобы запустить 10 000 программ на 1000 серверах нужно было как минимум 3 высококвалифицированнейших девопса, которые писали кучу описаний как это сделать на Puppet, Salt, Chef, Ansible, да и то не было гарантий, это все тестилось месяцами. То сейчас с Докер даже один квалифицированных девопс может рулить миллионами программ на десятках тысяч серверов. С куда как большей гарантией, что все это заведется нормально.

    UPD:

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

    Разработчик отдает весь свой результат в систему CI (обычно через git)
    CI на каждый новый коммит делает с помощью Docker образ для тестирования.
    Если тесты проходят успешно, то этот же самый Docker образ, отправляется на развертывание в production.
    Или, чуть иначе в компилируемых системах, где исходники не нужны в production: в Docker производится развертывание среды для компиляции, а для тестирования разворачивается второй образ с уже откомпилированным добром, который уже отправляется в production.

    То есть при правильной огранизации дела разработчик не может/не должен влиять на то, какой будет образ.
    А вот в тестовой среде (запускаемом на сервер, недоступном разработчику в больших командах) и в production как раз используется один и тот же образ.

    Основная идея - что тестировали, ровно то и запускаем на боевом сервере. Один-в-один, включая те же самые файлы (не такие же, а именно те же самые).
    Ответ написан
    18 комментариев
  • Для чего нужен Docker?

    @viiy
    Linux сисадмин \ DevOps
    Представьте что нет никакой ложки докера.

    1) Есть одна физическая машина. Вы устанвливаете софт, разные приложухи, базы, web сервера, заходят тестовые юзеры, что-то запускают. Первая проблема - вы не понимаете кому что надо, кто владелец файлов, приложух, зачем висят демоны и кто за это ответственнен. Как выход, вы решаете это разделить на виртуалки.

    2) У вас есть физическая машина + на ней виртуалки. Вы выделяете под каждую задачу свою виртуалку, там сидят отдельные пользователи, вы навели какой то порядок. Появляется задача - пользователи хотят php 6, а его нет, хотят python3, а его нет, хотят Mongo, а она старой версии. Вы обновляете репозитарии, качаете новые пакеты, ставите, часть пользователей довольны, часть нет - им нужна старая версия какая была. Упс!

    3) Одна физическая машина + еще больше виртуальных машин. Вы разделили всех пользователей так, чтобы никто не дрался за версии софта, если нужен php6 - иди на эту машину, нужен php5 - вот на эту. Все счастливы, но появляются разработчики, которые говорят буквально так - "а у меня на рабочей машине все работает, я перенес все как было на виртуалку, а у меня появляется ошибка missing library libXXX.so.X". И вы понимаете что вам остается только создать полную копию машины разработчика, чтобы софт поехал на этой виртуалке без ошибок... И тут появляется Docker! :)

    4) Docker решает именно эту проблему. Вам не нужно заботится о софте который установлен на сервере/виртуалке. Вы просто берете и переносите софт со всеми "кишками" на другой сервер и он просто работает. Работает за счет того, что все "кишки" это слои файловой системы нанизанные как бисер друг на друга. Дополнительно решается проблема свободного места, т.к слои многократно переиспользуются контейнерами, если вам нужен php + одна библиотека, а другому php + другая библиотека, вы используете (грубо говоря) слой php, а для дополнительной библиотеки делаете отдельный слой, одновременно другой человек делает над php другой слой и вы не деретесь между собой и не видите чужих библиотек. Это грубо и скорее всего ради одной библиотеки никто новый слой не делает, делают слой пожирнее.

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