1. Куча / Говнокод #27242

    0

    1. 1
    Объясните, зачем нужен docker-compose

    Есть же Dockerfile, туда можно поставить всё, что нужно сразу, а не плодить кучу контейнеров, которые нужно связать

    Запостил: Крендель, 09 Февраля 2021

    Комментарии (99) RSS

    • Ого какой олдфаг
      Ответить
    • Еще через полгода обнаружится парадигма "один контейнер - один процесс"*

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

        Как что-то хорошее. Один хер большая часть функционала ляжет если каждого сервиса по одной штуке.
        Ответить
        • Меньше времени уйдёт на поиск неисправности.
          Ответить
          • Да я бы не сказал... Обновлять и перезапускать по частям удобнее, да.
            Ответить
    • Просто докер так спроектирован, что проще описать и поднять десяток мелких контейнеров, чем ебаться с одним большим франкенштейном.
      Ответить
      • обоснуйте!!!!!
        Ответить
        • Удобные иструменты для работы с кучей контейнеров завезли, а инструменты для упихивания кучи говна в один -- нет.

          Получается недовиртуалка с недопрыщами.
          Ответить
          • 1) чем всякие апт инсталлы в виртуалке отличаются от апт инсталлов при сборке образа?
            2) не завезли - я хз в каком вы там году https://www.packer.io/docs/builders/docker
            Ответить
            • Основная прыщепроблема fat образов (и виртуалок и физических машин тоже, само собой) в том, что ты можешь ставить только те версии софта, которые предусмотрел мейнтейнер дистриба. Если ты хочешь придержать что-то более старое или накатить что-то более современное -- готовься к ёбле.

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

                    вообще смотря что надо. докер легковесней, из виртуалки сложней выпругнуть и никакой ебли с зашаренными ресурсами (хоть dentries вспомнить)
                    Ответить
                    • ну и ещё докер небезопасный (очень аккуратно нужно чекать зависимости и фиксировать версии), но типа смузихлёбский.
                      Ответить
        • надокерхаб
          FROM суперговно:1.0

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

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

          Вывод: четыре контейнера с докерфайлами в одну строчку лучше, чем один с докерфайлом в километр (зависимости, хуё-моё, не дай бог make прямо там же)

          Если нужно зеркалить все зависимости для продакшена, то можно и поебаться, но имхо даже если всё вручную собирать, всё равно лучше побить на контейнеры, /green модульность — это всегда хорошо.
          Ответить
          • > Если нужно зеркалить все зависимости для продакшена

            Увы, но иначе никак. Что ты там с хаба качаешь - хуй знает, выдал ты dnsmasq cap net admin, а там жук усатый весь твой нетворк слушает, таракан-оборотень.

            Впрочем, с виртуалками ровно та же история.
            Ответить
            • Но в этом смысле может даже оказаться, что собрать один раз образ и запушить себе в локальный хаб (а докер даёт такую возможность), будет опять же надёжнее, чем с виртуалкой. И ебаться с безопасностью только когда понадобилось сделать ещё один build, то есть при обновлении приложения, а не постоянно.
              Ответить
              • Да все равно надо постоянно пересобирать из-за секьюрити патчей

                Короче, говно, блядь, нельзя без ебли короче, мартин алексеевич, заводим говнодевопс.ру
                Ответить
    • Объясните лучше вот что: http://cpp.sh/6txwm

      Почему при второй конкатенации программа не падает?
      Я же из скоупа main передал объект в другой скоуп, и переместил его, почему уник_указатель sn продолжает держать объект, ведь я его обратно не вернул? По идее же move конструктор должен очистить его.
      Ответить
      • Точнее, должна была вызваться во второй раз make_unique.
        И вывелось бы:
        1
        2
        Ответить
      • Это с собеседования задачка, да?
        Ответить
        • Нет, просто упрощенный пример реальной задачи.
          Ответить
      • Дык ты не мувал ничего, вот оно и не мувнулось.

        Не забывай, что std::move() нихуя не делает. Это просто каст такой.
        Ответить
        • Ну да std::move просто в rvalue ссылку преобразует.
          Ну так у меня что получается, два уникальных указателя на один объект в какой то промежуток времени ссылаются?
          Ответить
          • Почему два то? Один, который sn в main'е. А sp в concat это rvalue ссылка на него же.

            З.Ы. Не пойму зачем тебе тут rvalue ссылка, обычная точно так же отработала бы.
            Ответить
            • Ну и как тогда определить, когда по && вызывается move конструктор, а когда это просто ссылка?
              Наверное, когда сами вызываем конструктор или оператор призваивания?
              Ответить
              • У меня в Cи по && никаких конструкторов не вызывается, именно поэтому я за Си.
                Ответить
              • Никак. Вызывающему коду должно быть похуй на состояние объекта после такого вызова. Объект окажется в каком-то состоянии, пригодном для разрушения. К примеру, в том же самом, что и до вызова, лол.

                Если вызывающему коду не похуй и он продолжает дёргать методы -- код написан криво.
                std::string s;
                test(std::move(s));
                // теперь s находится в неопределённом состоянии, пригодном для разрушения
                // больше юзать его нельзя
                Ответить
                • Rust какой-то!
                  Ответить
                  • Ну да, только питушня по рукам бьёт, если продолжаешь юзать. А крестам как всегда похуй.
                    Ответить
                • З.Ы. Я не совсем правильно написал:

                  - неопределённом состоянии, пригодном для разрушения
                  + неопределённом но валидном состоянии

                  Т.е. таки можно туда что-то потом присвоить или позвать reset. Но на то, что там лежит до этого момента, корректной проге должно быть похуй.
                  Ответить
                • То ли дело Rust:
                  https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html

                  > In languages with pointers, it’s easy to erroneously create a dangling pointer, a pointer that references a location in memory that may have been given to someone else, by freeing some memory while preserving a pointer to that memory. In Rust, by contrast, the compiler guarantees that references will never be dangling references: if you have a reference to some data, the compiler will ensure that the data will not go out of scope before the reference to the data does.
                  Ответить
                  • Ну в этом случае нету ни утечек ни крашей. Просто функция не воспользовалась своим правом на мув. Её право.
                    Ответить
                    • У меня в Си у функций нет никаких "прав на мув", я просто явно аллоцирую/освобождаю память и переприсваиваю указатели. А то вот понапридумывали какие-то права на мув, совсем уже охуели, может там функции еще забастовку или митинг могут устроить?
                      Ответить
                      • > я просто явно аллоцирую/освобождаю память и переприсваиваю указатели
                        - внутри каждой функции?
                        Ответить
                      • Ой да ладно. Один фиг в сишке приходится как-то пояснять читателю где функция принимает аргумент "на посмотреть", а где "владение передали".

                        Тут попытались это немного формализовать.
                        Ответить
                      • я вообще не понимаю, нахуй все эти типы? зачем эта сложность? просто берешь, выделяешь восемь байт на стеке и опкоды вызываешь, понапридумывали, блядь
                        Ответить
                        • Так-то оно так, но на самом-то деле опкоды тоже хуйня. Надо чтоб переконфигурируемая ПЛИС, и чтоб бинарники были байтстримом для FPGA. Например, захотел ты запустить условный Word - прошиваешь часть своей FPGA этим вордом и используешь. А то вот современные процессоры с фиксированным набором всяких там говноинструкций это хуйня какая-то
                          Ответить
                          • > ПЛИС

                            Там же куча оверхеда и фиксированный набор ячеек... Остаётся ждать пока появится дешёвая технология для печати ASIC'ов.
                            Ответить
                            • Да, в компьютере держать мини-заводик по изготовлению ASIC-ов, и при запуске какой-то новой проги чтоб он собирался этим заводиком и вставлялся в слот на материнке. А так можно иметь набор готовых асиков и просто переподключать их особым встроенным механизмом, как картриджи в приставках когда-то
                              Ответить
                              • > при запуске

                                При установке же. И потом можно реюзать пока не выбросишь.
                                Ответить
                      • FLM
                        Ответить
                  • Тут, конечно, немного наврано.

                    В С++ создать указывающую ни на что ссылку тоже нельзя: ссылок на nullptr не бывает. А указатель бывает, конечно.
                    В расте указатели бывают только в unsafe коде, а в обычном есть только ссылки.

                    Правда, в плюсах ты можешь почистить память, и получить болтающуюуся ссылку, а в расте тебе не дадут так сделать
                    Ответить
    • Иметь сервисы в отдельных контейнерах и систему оркестрации для них позволяет сделать несколько хуйнь, которые нужны редко и не всем, ну например несколько инстансов приложения или одного сервиса внутри приложения, и распределение между ними. Живое обновление приложение без даунтайма (подняли рядом новый инстанс, только потом уронили старый). Кроме того, а схуяли это всё в один докерфайл пихать? А может мне нужно разное окружение для сервисов. Например одному элементу стека нужна либа другой версии. Сделать другой контейнер проще, чем запихивать еблю с разруливанием всего этого в докерфайл. Или, вдруг ты решил, что теперь у тебя база не на одной машине с приложением, а лежит в датацентре в цюрихе. Твои действия, если у тебя до этого она лежала в одном докерфайле с аппликейшеном? А если была отдельным контейнером — то переписать один урл в конфиге.
      Ответить
    • кто-то шарит, в чём был прикол bink video?
      Ответить
      • пирфоманс на компах, слишком слабых чтобы проиграть
        *ta-daaa*
        rotoeb gaming
        you play for what you pay

        в нормальном формате
        Ответить
    • пыхеры такие дебилы смешные, бивис с баттхедом просто
      https://www.php.net/manual/ru/ds-priorityqueue.jsonserialize.php
      Ответить
      • Потому что это реализация интерфейса JsonSerializaбля, который дёргает функция json_encode. Вот эту функцию и надо вызывать напрямую.
        Ответить
        • Нахуя дебилы в класс для представления коллекции вшили знание про json?
          Ответить
          • Глобальная функция json_encode сериализует произвольную питушню в JSON. Для этого она у своего аргумента вызывает метод JsonSerialize, если этот аргумент является объектом, поддерживающим интерфейс JsonSerializable.

            Т. е. при добавлении нового класса в проект тебе не нужно переписывать функцию json_encode.
            Ответить
            • Почему JSON? Почему не XML или не TOML? Слышал про SRP?

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

                Почему он сейчас повсюду?
                Ответить
                • Понятия не имею. Потому что дебилы. https://flatbuffers.dev/flatbuffers_benchmarks.html

                  JSON имеет смысл только в одном случае: когда ты пишшеь на JavaScript, и у тебя и так всё тормозит и тебе пофиг.
                  Ответить
                  • если у тебя тормозит json, то и xml тормозить будет

                    или ты мне щас опять будешь рассказывать про непревзойдённые бинарные протоколы?
                    Ответить
                    • Причем тут XML? Хотя XML лучше тем, что к нему есть официально поддерживаемые схемы, и язык запросов.

                      >непревзойдённые
                      Ну да, всего в 5К раз разница. Копейки. Пренебречь. Вальсируем
                      Ответить
                      • что причём? ты ж спрашиваешь сам:
                        > Почему не XML или не TOML?

                        > в 5К раз разница
                        – citation needed
                        Ответить
                        • Попробуй почитать тред с самого начала.

                          Питухи впиндюрили в класс для коллекции метод для сериализации в JSON. Я и спрашиваю: почему в JSON-то? Перформанс тут не причем, это чисто вопрос говнокода.

                          >– citation needed
                          Я там дал ссылочку сверху, посмотри
                          Ответить
                          • https://github.com/google/flatbuffers/issues

                            Incorrect Java code generation. uint8 generates int instead of byte

                            Incorrect type returned from table string getter

                            flat_buffers.dart putFloat64 is wrong

                            Flatbuffer typescript ulong types are wrong

                            [Dart, master] Enum named "value" causes variable name conflict

                            CMake build error in win10 WSL

                            flatc does not like quoted strings for paths that include spaces etc. that then end in a \

                            ЗАТО БЫСТРО
                            Ответить
                            • >java
                              >быстро
                              ну ты понел.

                              >typescript
                              >быстро
                              слушайте, ну прекращайте давайте

                              >dart
                              ого! А с поддержкой эйфории как там дела??
                              Ответить
                              • о чём и речь. если ты не входишь в 1% счастливчиков, у которых сериализация жсона это бутылочное горлышко, то смысл запариваться с педоформатами, которым ещё и тулзы нужны какие-то?
                                Ответить
                                • >1%

                                  откуда цифры?

                                  >запариваться

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

                                    приведи десять реальных примеров проектов, где жсон это боттлнек

                                    > вручную парсить
                                    – не знаю, у меня всё машина парсит, попробуй себе компьютер купить

                                    ты как обычно из всех проблем в computer science выбрал едва ли не самую незначительную и доебался, как дон кихот. поражаюсь этой твоей способности! энергию бы да в правильное русло
                                    Ответить
                                    • >>приведи десять реальных примеров проектов, где жсон это боттлнек

                                      Приведи пять реальных примеров когда пузырёк тормозит.

                                      >>– не знаю, у меня всё машина парсит, попробуй себе компьютер купить
                                      Ты троллишь, или ты реально не понял, чем
                                      foo.getString("bar")

                                      хуже чем
                                      foo.bar

                                      ?
                                      Ответить
                                      • > Приведи
                                         – ясно, слился, ну

                                        > foo.getString("bar")
                                        – это в какой хуйне так писать-то надо? у нормальных людей жсон тоже сразу в модели маппится
                                        Ответить
                                        • >> – ясно, слился, ну

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

                                          > нормальных людей жсон тоже сразу в модели маппится
                                          А откуда эти модели берутся?
                                          Ответить
                                          • это ты задал тупой вопрос про один процент, а потом усрался как урсус на рассвете, уж признай, пожалуйста

                                            > А откуда эти модели берутся?
                                            – угадай.

                                            кстати, возможно ты не в курсе о существовании swagger...
                                            Ответить
                                            • Ты сделал высосанное из пальца утверждение про 1 процент. С таким же успехом я могу утверждать, что скорость сортировки влияет на 1%, и потому всем хватит пузырька.

                                              >кстати, возможно ты не в курсе о существовании swagger...
                                              вот этот https://github.com/swagger-api/swagger-core/issues ?
                                              То-есть мне нужны какие-то дополнительные тулы? и чем это лучше protobuf кроме того, то тормозит?
                                              Ответить
                                              • > высосанное из пальца утверждение
                                                – которое ты при этом не в состоянии опровергнуть, хе-хе

                                                > мне нужны какие-то дополнительные тулы?
                                                – нет, не нужны, но ты можешь их использовать. в отличие от протобафа, трифта, авро, графкл, где, что повар дал, то и кушайте

                                                ладно, заебал. давай лучше вот это обсирать:

                                                https://www.apollographql.com/docs/apollo-server/performance/apq
                                                Ответить
                                                • >– которое ты при этом не в состоянии опровергнуть, хе-хе


                                                  Бремя доказательства лежит на утверждающем

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

                                                  >лучше вот это обсирать:
                                                  давай, начинай

                                                  я всегда готов что угодно обосрать
                                                  Ответить
                                                  • > Бремя доказательства лежит на утверждающем
                                                    – угу, бремя доказательства, что json это боттлнек

                                                    > начинай
                                                    – ребята поняли, что жсон в жсон это не очень обезжиренный творог, и придумали кэширование через хэширование
                                                    Ответить
                                                  • Сможет обосрать vistefana?
                                                    Ответить
                                          • Какой хороший прыщетред.

                                            Смотри, если у меня алгоритм за O(n^3), то пузырьковая сортировка какого-то говна до или после сложность не изменит. Если поменяешь пузырька на qsort, то говно так и останется за O(n^3). Так зачем заморачиваться, и переписывать?

                                            А если у меня алго за O(n*log(n)), то пузырёк катастрофически всё испортит. Здесь имеет смысл использовать быструю сортировку. А ещё, может быть, упороться в структуре хранения (например, по возможности, сортировать инты вместо строк), если это будет заметно на общем перформансе.

                                            Так же и с JS-оном. Зачем что-то оптимизировать, если трансфер через него занимает меньше 1% процессорного времени?
                                            Конечно, если это ядро прыщей, то этот 1% стоит свеч. Но в большинстве случаев — нет.
                                            Ответить
                                  • > вылизанные
                                    – 775 открытых issues на гх. ещё вылизывать и вылизывать.

                                    не, я понимаю, что в произвольном парсере жсона тоже можно говна найти (привет, яббл), но не в такой же БЛЯДЬ концентрации
                                    Ответить
                                    • >– 775 открытых issues на гх. ещё вылизывать и вылизывать.

                                      ты тличашеь protobuf от flatbuffers?
                                      Ответить
                                      • ты меня на понт взять хочешь, демон?

                                        https://github.com/protocolbuffers/protobuf/issues
                                        Ответить
                                        • Хз, ни разу не натыкался на какие-то мажорные иссуе. Вероятно там какие-то говнохотелки
                                          Ответить
                                  • > бессхемное говно

                                    В том и преимущество JSON, что для него не обязательна схема (кроме go).
                                    Хочешь — хуярь схему и автогенерацию классов. Хочешь хуярь говно на JS, PHP, Python.

                                    Зачем мне схема, если мне нужно отправить в запросе JSON определенного формата? Мне даже не нужно его парсить.

                                    Я всеми руками за Protobuf, если что. Но не все его используют.
                                    Ответить
                                    • если хочется жсон и схему, то можно взять графкл

                                      получится, правда, жсон в жсоне, но зато цель же достигнута, правда?
                                      Ответить
                              • > эйфории
                                – кстати, на твоём месте я бы вкусил REBOL-а
                                Ответить
            • а это что такое
              https://www.php.net/manual/ru/ds-set.sum.php ?

              итераторы и лямбды не осилили?
              Ответить
              • Есть всё. Если класс реализует интерфейс Iterable или ArrayAccess, то по нему можно гонять циклы, как по массиву. Например, можно использовать функции для массивов и писать в функциональном стиле.
                Ответить
                • Тогда на кой чорт все это toJson и find это вдруг методы сета?
                  Почему в плюсах еще двадцать пять лет назад сделали итераторы у вектора и листа и всякие `std::accumulate`?

                  Мы как-бы выносим за скобки зачем вообще такой вербозный монстр скриптоговну
                  Ответить
                  • > сделали итераторы у вектора и листа и всякие `std::accumulate`?
                    ...и все двадцать пять лет плюются от этой монструозной, неудобной и невыносимо вербозной поебени.
                    Настолько плюются, что аж придумали целую новую стандартную либу «ranges», которая вроде как решает проблемы старых алгоритмов на итераторах, но всё ещё пиздец какая недоделанная хрень.

                    > find это вдруг методы сета?
                    Справедливости ради, переопределять «find» для сета богоугодно, чтобы искать за логарифм/константу, а не обобщённо за линейное время.
                    Ответить
                    • ranges лучше итераторов, но однозначно хуже ручной реализации "sum" вкаждой коллекции отдельно
                      что ты скажешь про
                      https://www.php.net/manual/ru/ds-set.sum.php
                      ?
                      Ответить
          • Помнишь в JS метод toString? Вот тут похожая конь-цепция.
            Ответить
            • Гнилая концепция совершенно, равно как и wait, hashCode и пр.

              Подобные петушни нужно реализовывать явно. По уму это сделано в C++ и Rust.
              Мыхомакаки копируют глупости из ЯЖИ
              Ответить
              • > По уму это сделано в C++ и Rust.
                По уму это сделано в нормальных языках (см. «Haskell typeclasses») и пародиях на нормальные языки (см. «Scala implicits», «Scala typeclasses»). В ржавом трейты тоже вроде нормально сделали, но я не вникал; а вот в крестах это хоть и терпимо (точно лучше, чем ебучий Object с пачкой методов), но всё равно вербозно и криво.
                Ответить
                • Я может не в курсе, но в С++ каждая структура из коробки автоматом реализует методы для превращения в строку, в JSON, в монитор синхронизации, в сообщение в ВК итд?
                  Ответить
                  • В «C++» трейты/тайпклассы/как хочешь называй:
                    1) Не имеют нормальных требований, прописанных в коде. Какие методы нужно реализовать для компаратора в std::sort? Догадайся, ёпта! Тебе даже код стандартной либы мало поможет, потому что в самом std::sort там просто «class _Pr», а копаться дальше — занятие не для слабонервных.
                    2) Передаются строго вручную. И создаются тоже.
                    3) Никак не стандартизированы и не посыпаны никаким сахаром, так что каждый либодел придумывает что-то своё.

                    По сравнению с нормальными языками — это срань и каменный век (но, конечно, не настолько срань, как методы в Object и/или говноIJsonSerializable).
                    Ответить
                    • Ах да, и никакого «derive»: всё пиши вручную.
                      Ответить
                    • > Догадайся, ёпта!
                      Да не, в стандарте можно посмотреть, он же так легко читается. И стоит всего 23к рублей.
                      Ответить
                    • Отсутствие статичечких трейтов (как в расте) это плохо. Случайно в одном классе чото не то сделал, и у него поломался копирующий питух, и он перестал влазить в вектора, и компилятор сообщил тебе об этом стеной текста шириной в три экрана и высотой в пять с цитатами из реализации стандартной библиотекти (напоминает питонячью утку с его string-like)

                      >но, конечно, не настолько срань, как методы в Object и/или говноIJsonSerializable
                      ну так))))) А я о чем
                      Ответить
                      • > Случайно в одном классе чото не то сделал, и у него поломался копирующий питух
                        Вот в этом и проблема, да. В классе должно быть только то, что необходимо классу для выполнения его задачи (единственной). Всяческие конструкторы копирования, операторы сравнения, hashCode, wait и прочая срань — это грубейшее нарушение «SRP» и говнокод. В нормальных языках такого нет (таки почитай про тайпклассы в «Хаскелле» — это как раз то, с чего обезьяны слизывают трейты/имплиситы/etc.). Любая функциональность, выходящая за рамки единственной ответственности типа, выносится в отдельный тайпкласс — тоже имеющий свою единственную ответственность.

                        При этом примечательно, что больше всех орут про «SOLID» люди, у которых любой объект обязан реализовывать в себе hashCode() и прочую срань.
                        Ответить
                        • я думал, форсить хаскель на гк стало неприлично ещё лет десять назад...

                          /green
                          Ответить
                        • В общем иерархия качества языков такая

                          Сначала Хаскелль
                          Потом Плюсы (ну и Раст)
                          Потом долго-долго никого нет
                          Потом Джава
                          Потом мужики коробочки клеют
                          Потом "ПХП"
                          Ответить

    Добавить комментарий