Задать вопрос
  • Какие диаграммы нужны для полноценного документирования программного проекта?

    @ned4ded
    Верстка, Фронтенд
    Добрый день!

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

    Теперь немного тезисно по вашей информации:
    1) Диаграмма - способ представить информацию, любую диаграмму можно описать словами.
    2) Диаграмма - инструмент для выявления новой информации о системе.
    3) Впервые слышу про диаграмму бизнес-объектов: может это что-то крайне редкое (крайне специализированное), но с высокой долей вероятности, это вам не потребуется.
    4) UML - язык, а не гайдлан по документированию ПО, сл-но в книгах с аббревиатурой UML вы не найдете нормального руководства по документированию.

    Вывод из этого следующий: диаграмма используется как подкрепление к документации, как инструмент проектирования ПО (для выявления зависимостей и новых сущностей). В обоих случаях набор нотаций будет зависеть от требований, предъявляемых к таким документам.

    Если вам интересно документирование ПО, то гуглите: техническая документация, техническое задание, ГОСТ 34, ГОСТ 19, SRS, хорошая статья на хабре про это.

    Если вам интересно именно полноценное описание проекта, то гуглите: методологии разработки программного обеспечения, управление проектами, pmi, pmbok, agile.

    Теперь пройдемся по диаграммам в зависимости от назначения. Я сейчас могу выделить несколько направлений (не претендуя на полноту):
    1) уровень бизнеса (любые части системы, находящиеся вне ПО per se)
    2) уровень программного обеспечения (системные модули, компоненты системы уже реализованные на уровне ПО)
    3) уровень данных (структура данных, описание типов данных и т.д.)
    4) уровень hardware (например, топология сети)

    На уровне бизнеса обычно описываются бизнес-процессы (idf0, idf3, aris, bpmn, dfd), воркфлоу, юзкейсы, маиндмапы и проч. - это все идет сюда. На этом уровне выделяются основные процессы, выполняемые внешними относительно системы акторами, выявляются точки их взаимодействия с системой. На основе этого проектируются основные модули системы, исполняемые ими функции и их взаимодействие. Взаимодействие системы с внешней средой.

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

    На уровне данных обычно делается схема бд. Собственно, схема бд строится на основе описанных сущностный из предыдущего уровня.

    Уровень hardware я лично всегда рассматривал редко, но он строится на основе требований бизнеса, требований к программному обеспечению, требований к обработке, хранению данных.

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

    ps на небольших и средних проекта я стараюсь прибегать к одной из нотаций бизнес-процессов, если требуется что-то автоматизировать (idf или bpmn), юзкейсам для выявления интеракций пользователя с приложением; для подготовки к написанию ПО - сущность-связь, иногда алгоритмы.
    Ответ написан
    Комментировать
  • Что почитать по архитектуре или правильном программировании?

    Jeer
    @Jeer
    уверенный пользователь
    О, я так и думал, что будет много советов читать книги по архитектуре. С ними такая подстава, на уровне джуна ты не будешь понимать, о чём вообще говорится в этих книгах. Или будешь понимать, и такой, даа, автор жжёт, правильные вещи говорит, а вот что делать с этим дальше - не в курсе, так как практики нет. А вот когда дорастёшь до какого-нибудь ведущего, тогда будешь перечитывать еще раз с мыслью "аа, так вот что он имел в виду". И вот именно из-за этого, многие на начальном этапе не осиливают такие книги, поэтому, если есть лишнее время, можно почитать.
    Что нужно делать: идёшь в энтерпрайз. Да или просто в компанию, которая пилит 1-4 продукта с разными командами. В команде должно быть по нескольку человек. И постоянно достаёшь более опытных разрабов с вопросами почему сделано именно так. Плюс должно быть код ревью, чтобы более опытные тебе постоянно указывали на твои ошибки, что вот так делать не надо.
    Через год меняешь контору, но чтоб тоже сложные проекты были и были команды, и так же достаёшь вопросами почему сделано так, а не иначе.
    Тогда и придёт понимание как делать удобнее и правильнее. Вот тогда и можешь почитать книги по архитектуре, чтобы еще больше пришло познание.
    Избегай контор, в которых будешь работать один или двое, это болото, которое не даст тебе такого мощного проф развития.
    Касательно написания более понятного и чистого кода, этот вопрос не относится к архитектуре. Это всё тоже придёт с практикой и с код ревью. Как вариант, чтобы усилить, можно посмотреть паттерны, вот есть крутой сайтец с приятными картинками, лёгкое чтиво (естественно, достаточно того, что в открытом доступе):
    https://refactoring.guru/
    Ответ написан
  • Почему разрывается соединение МТС GPRS в Ubuntu?

    @imz
    (Вынесу из комментов, потому что это тоже возможный ответ на вопрос в определённой ситуации.)

    Похожим образом могут проявляться "особенности" модема "Билайн".

    (Вставил сим-карту МТС и я-то думал: раз интернет совершенно нормальный 2.3 минуты, то нет у модема какого-то beeline lock-in, ну и МТСу, конечно, всё равно, какой модем, потому что мобильных устройств-то куча разных).

    А вот пишут в homenet.beeline.ru/index.php?s=8e6979064f9c64a4156... :

    Билайновское ПО каждые две минуты посылает модему AT-команду,если модем её не получил происходит дисконнект.Об этом на форуме писалось не однократно.


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

    Вот как это бывает устроено в модемах "Билайн" -- alexkuklin.livejournal.com/820953.html?thread=5839... :

    Ну, гентушники - они вроде не так подвежены ФГМ, как бубунтушники - читай ru.gentoo-wiki.com/wiki/MF626
    Там есть еще круче, про вычисляемый код.

    В новой версии программы команды чуть другие и простым AT+ZOPERTE="beeline" не обойтись.
    Code:

    OUT: AT+CPBS="SM"\r\n
    OUT: AT+CPMS="SM","SM",""\r\n
    OUT: AT+ZOPRT=6\r\n
    ^^^^^ остановка цикла
    OUT: AT+ZOPRT=5\r\n
    ^^^^^ запуск нового цикла
    OUT: AT+ZSTART\r\n
    ^^^^^ судя по всему уже не обязателен
    IN: +ZOPERTER: 0,XXXXXXXXXXXXXXXX\r\n
    ^^^^^ запрос от модема. на этот запрос и нужно отвечать
    OUT: AT+ZOPERTE=1,YYYYYYYY\r\n
    ^^^^^ а это наш ответ
    IN: +ZOPERTE: 1,1
    ^^^^^ а это модем сказал что мы угадали
    (или 1,0 если не угадали. в этом случае модем краснеет
    и перестает работать до следующего перезапуска цикла)
    IN: +ZOPERTER: 1,XXXXXXXXXXXXXXXX\r\n
    ^^^^^ через ~2-3 минуты модем снова задает вопрос

    Если правильно и быстро (на это есть около 20 секунд) отвечать на все +ZOPERTER: то модем исправно работает, если не отвечать вообще, то модем работает около 3х минут, задает второй вопрос(первый он задает сразу при запуске цикла), ждет 20 секунд ответа, а потом краснеет, рвет соединение и все.

    А вот теперь самое главное: алгоритм по которому вычисляется это самое YYYYYYYY. Алгоритм есть. Неделя истязаний дизассемблером нового exe'шника от Beeline принесла свои плоды. Код пока очень сырой, т.к. является прямым преобразованием из ASM в C++ (чуть более 1000 строк) :) так что как доведу до ума, куда-нить выложу. Пока модем пашет уже около часа и все ОК. Если есть пожелания пишите на alexunnamed.tomsk.ru.


    Не знаю пока, есть ли этот код.

    URL упомянутой wiki сменился; см. gentoo-wiki.vfose.ru/wiki/MF626 :

    Неделя истязаний дизассемблером нового exe'шника от Beeline принесла свои плоды. Код пока очень сырой, т.к. является прямым преобразованием из ASM в C++ (чуть более 1000 строк) :) так что как доведу до ума, куда-нить выложу. Пока модем пашет уже около часа и все ОК. Если есть пожелания пишите на alexunnamed.tomsk.ru. Утилита для работы под Linux выложена здесь www.altcomtsk.info/index.php?option=com_content&vi...


    Эту программу с секретом на просторах интернета удалось скачать только по ссылке с yanex.org/beeline-zte-mf170-v-linux (в остальных местах протухло). У людей оно вроде как даже работало (запускаем одновременно mf626-b09 и звонилку/pppd; например, в моём ALT; вообще, по запросу "mf626-b09" в google много примеров её использования).

    Могу подтвердить: эта программа общается с модемом и не даёт ему отвалиться через 2 минуты (видно по зелёному индикатору, который раньше становился красным), т.е. секрет разгадан верно.

    Но в моей системе pppd (под управлением звонилки) не может работать с устройством /dev/ttyUSB32 одновременно с этой программой (возможно, в более старых linux это было возможно и у людей работало): Resource temporarily unavailable.

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

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

    О! Это NetworkManager оказался капризным (хотя я вроде видел, что люди писали, что можно его использовть). Я вручную запустил pppd (подсмотрел в /proc/NNNN/cmdline , как это делал NetworkManager):

    /usr/sbin/pppd nodetach lock nodefaultroute ipv6 , user mts ttyUSB34 noipdefault noauth usepeerdns lcp-echo-failure 0 lcp-echo-interval 0 ipparam /org/freedesktop/NetworkManager/PPP/5 plugin /usr/lib64/pppd/2.4.5/nm-pppd-plugin.so

    и пришлось ещё сделать (видимо, NetworkManager сам добавляет маршрут, а я не сообразил сразу, что в команде pppd этого нет):

    ip route add to default via 10.64.64.64 dev ppp0

    И вот, интернет работает, пишу через него.
    Ответ написан
    2 комментария
  • Как быстро изучить jira и agile?

    @KalabinDmitriy
    Занимаюсь внедрением JIRA в нашей компании, сам инструмент не сложный. Использую последнюю версию 7.3.6, в ней Agile уже встроен, главное понять что Agile доски это лишь отображение информации по этапам процесса т.е. сначала надо сделать процесс для задач, потом просто настроить отображение этапов на каждой колонки доски.
    Мы делаем следующим образом Epic - это что-то крупное, некая большая задача которая может растянуться на несколько спринтов, Story это как раз пользовательская история которую пишут Product owner, далее уже для разработчиков создаем task-и, и через link привязываем к Story, для просмотра статуса и фильтров. А Story уже привязан к Epic. В принципе для старта можно использовать базовые настройки, включить Progress на задачах на досках и вести Log work по каждой задаче, также поле Story points надо сделать активным, если оно не отображается.
    JIRa достаточно простой инструмент и гибко позволяет создавать новые поля и формы и привязывать их к переходам между состояниями бизнес процесс. Плюс очень много форумов и сайтов.
    Я бы посоветовал начать с бизнес процесса который вам нужен, а потом уже от него идти, и по этапно решать возникающие вопросы - новые поля, права доступа, формы, уведомления и т.д.
    Ответ написан
    Комментировать
  • Как деплоить сайт на хостинг правильно, быстро и удобно?

    toxicmt
    @toxicmt
    кофаундер Хекслета
    > Но такой способ мне не очень удобный показался. Как делать хот-фиксы тогда? Изменение одной буквы в коде — целый процесс.

    В хорошем процессе это не проблема. Если изменение критичное вы просто деплоите старую версию (не откат, а именно деплой старой). Хот фиксы это уход от проблемы, а нее решение.

    > В сети прочитал, что нужно использовать CI/CD, который будет скачивать последнюю версию из гита, устанавливать зависимости, тесты, перекачивать на сервер, разархивировать в отдельную папку, тесты, и в конце концов переключить симлинк вебрута на эту папку

    У наиболее продвинутых ребят вся эта история уже делается (и довольно давно) используя docker. Вы можете хотя бы немного познакомиться с ним здесь guides.hexlet.io/docker/. Если докер для вас пока рано, то можно реализовать процесс используя Ansible и его специальный модуль docs.ansible.com/ansible/latest/deploy_helper_modu...

    Там вы заодно увидите ответ на вопрос "что делать с состоянием".

    > Что делать с БД? Что делать с загруженными файлами от пользователей? Копировать из предыдущей версии?

    Состояние никак не связано с деплоем, оно должно быть шареное. Если у вас есть файлы от пользователей, то возможно вы захотите использовать aws s3. Как минимум про него надо знать.

    Рекомендую заодно посмотреть вебинар про stateless vs statefull чтобы немного понимать эту тему: https://www.youtube.com/watch?v=WPCz_U7D8PI
    Ответ написан
    2 комментария
  • Существует ли "карта программиста"? Что и за чем учить?

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    Нет одинаково эффективного пути для всех и каждого.

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

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

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

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

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

    На первых порах, тестирование будет занимать до 99% времени и сил. Заодно подтягивается синтаксис используемых языков (вообще не важно каких), вырабатывается внимательность, концентрация, тренируется память и пр.

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

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

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

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

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

    Ах да, обложись справочниками по любому инструменту и научись быстро вникать и подхватывать необходимый минимум. Обычно достаточно на 20% владеть инструментом, чтобы решать 80% задач.

    В любом случае я за критерий истины держу платежеспособный спрос.
    Ответ написан
    3 комментария
  • Необходимые знания JavaScipt?

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    Идешь на сайт Кантора и штудируешь все подряд. Так же находишь на ютубе Зоракса и штудируешь все подряд. Если владеешь английским, можно еще проштудировать курс JavaScript Weird Parts. потом просто ходишь на собесы, делаешь тестовые. Поначалу все собесы будешь сливать, это нормально. После каждого слива делаешь разбор полётов и пристально изучаешь то, на чем завалился. Вангую что тебе 10 заваленных собесов хватит за глаза, чтобы выкачать всю базу. Поэтому поначалу ходи на собесы туда, где не жалко слить.

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

    В общем 5% теории и 95% практики, очень много упорства, и ты в строю через пару лет. Возможно и через годик, если будешь реально фигачить по 8 часов в день.
    Ответ написан
    Комментировать
  • И снова курсы веб разработки?

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    В конце 2015 года я задумался о том, чтобы свалить со стека php+jquery на что-то более адекватное современным реалиям. Т.к. года с 2011 ajax/spa неумолимо все больше доминирует над старомодным рендерингом средствами php, мой выбор пал на клиентсайд с JS.

    До того времени (начало 2016 года) я к JS относился весьма скептически, т.к. еще свежи были впечатления от нездоровых приключений с js3 vs ie6 и иже. Тем не менее проштудировав материалы JavaScript Weird Parts и ролики Зоракса я, внезапно, понял, простил и полюбил JS.

    По мере же погружения в прелести ES6+ я стал фанатом JS.

    Моё стремление в сторону JS крепчало.

    Из фреймворков я сначала позарился на Ember.JS, но что-то путное на нем слепить с наскоку оказалось задачей непосильной, хотя он, безусловно, крут.

    Angular v1 мне сразу не понравился чисто интуитивно, как оказалось, это решение было верным.

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

    Параллельно, впервые за 20 лет практики, я внезапно стал дистанционно "ходить" по собесам, и .... круто обламываться. Особо больно было в первые 2-3 раза. Сказались дурные привычки юности - стремление изучать только то, что конкретно приносит пользу здесь и сейчас, игнорируя "тупую", "бесполезную" теорию. Сыпался на таких мелочах, что стыдно вспомнить...

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

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

    Так вот, чтобы переформатировать мозги с пыхи на JS мне нужно было попрактиковаться несколько сотен часов. Я весьма ленив, поэтому сам себе задачки придумывать бросил сразу после школы и школьных олимпиад - наигрался. Тем не менее без практики никуда, поэтому я пошел на кодварс (пруф: https://www.codewars.com/users/iCoderXXI) и стал решать там всё подряд. Поначалу код был ужасен, но работал, постепенно мозг привык и качество кода стало расти. Параллельно стало сложно писать на пыхе, ибо кода получается существенно больше при аналогичном выхлопе. Подобный инцидент у меня случился году в 2006, когда я с клиппера мигрировал на пыху, потом было сложно писать на клиппере, ибо он убог. Пока я не знал пыхи, клиппер мне казался весьма недурным языком. :)

    В общем материалов и приёмов пришлось освоить массу, на все про все у меня ушло более 1.5 лет в режиме 2-4+ часа ежедневных занятий. За это время я умудрился завалить порядка 10 собесов, пока, наконец, не выстрелило.

    Тем не менее мне еще очень многому предстоит научиться, т.к., по сути, мой потенциал - это матёрый сеньёр/архитектор, а реально я пока мидл по части фронтенда. :) Рассчитываю за следующие пару лет устранить этот досадный разрыв.

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

    В общем я настоятельно рекомендую упор делать в JS/HTML5+/CSS3+ и React/Vue (хотя тут по вкусу, но на эти два "фреймворка" приходится существенная доля вакансий и заказов).

    ВАЖНО! Если раньше не доводилось программировать, то в обязательном порядке параллельно с JS нужно освоить базовые знания/навыки в алгоритмах и структурах данных, а, так же, базовый уровень в информационных технологиях, иначе многое будет просто непонятно, будешь буксовать часами и днями на всяких глупостях.

    P.S.: На htmlacademy курс мне нравится (я там подрабатываю наставником). Однако мне очень хочется, чтобы курсанты приходили несколько более подготовленные по части алгоритмов и структур данных.
    Ответ написан
    2 комментария
  • Как стилизовать select средствами bootstrap?

    @vylegzhanin
    Добавь <select class="form-control">
    Ответ написан
    Комментировать
  • Для чего нужен 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 как раз используется один и тот же образ.

    Основная идея - что тестировали, ровно то и запускаем на боевом сервере. Один-в-один, включая те же самые файлы (не такие же, а именно те же самые).
    Ответ написан
    16 комментариев
  • Как сформулировать подключение socket.io по https и http на примере?

    @de1m
    На одном порту работать не будет, надо два порта.
    Я поменял пример, но этот у меня точно работает, всего на двух портах
    var express = require('express');  
    var app = express();  
    var server = require('http').createServer(app);  
    var io = require('socket.io')(server);
    var fs = require('fs');
    var https = require('https');
    
    app.set('views', __dirname + '/views')
    app.set('view engine', 'pug')
    app.use(express.static(__dirname + '/public'))
    
    server.listen(5000, function () {
      console.log('Server listening at port %d', 5000);
    });
    
    const opts = {
      key: fs.readFileSync('privateKey.key'),
      cert: fs.readFileSync('certificate.crt')
    }
    
    var httpsServer = https.createServer(opts, app);
    httpsServer.listen(5001, function(){
      console.log("HTTPS on port " + 5001);
    })
    
    app.get('/', function (req, res) {
      res.render('index');
    })
    
    io.attach(httpsServer);
    io.attach(server);
    
    io.on('connection', function(client) {  
        console.log('Client connected...');
        client.on('click', function(data){
          console.log(JSON.parse(data));
            setTimeout(function() {
              client.emit("ok", "data");
            }, 3000);
        })
    });


    Со стороны клиента надо добавить проверку http или https.
    if (window.location.protocol != "https:"){
            var socket = io.connect('https://localhost:5001');    
        } else {
            var socket = io.connect('http://localhost:5000');
        }
    Ответ написан
    8 комментариев