• Что выбрать: Syncthing vs nextCloud vs Seafile vs OwnCloud vs Другой сервис?

    @Vallefor
    На днях пробовал ownCloud, NextCloud и Seafile.
    ownCloud / Nextcloud:
    Серверная часть написана на PHP + БД (точно умеет работать с mysql и sqlite).
    Для фронтенда обязательно иметь Apache2+php или nginx+php.
    Без настройки redis в помощь - тормозной просто до невозможности. С redis все становится на много лучше. Все операции по сканированию и проверке идут через крон, который по умолчанию запускается раз в 15 минут (кстати, при установке серверной части - не предупреждают о том, что это нужно сделать).

    Все клиенты работают через WebDAV это просто супер-минус:
    Так как при синхронизации клиент сканирует по очереди все серверные папки, отправляя кучу запросов. Каждый файл при загрузке отправляется тоже отдельным запросом со всеми накладными расходами - в результате куча маленьких файлов синхронизируется просто невыносимо долго (10гб мелких файлов на сервер с 1Гбит линком может отправляться 10-20часов). Все это, в случае краша просто останавливается.
    А крашнуться может по разным причинам (перечислю то, что было у нас):
    • При загрузке больших файлов может отвалиться и nginx и php-fpm. Почему они не загружает их по умолчанию частями - это странно. При том, что вебдав это поддерживает.
    • php-fpm может крашуться, если придется отдать очень много файлов в одной папке (так и не получилось вылечить).
    • Крашится из-за ограничений линукс (255 байт на имя файла) - например, на маке файлы могут иметь более длинное имя.
    • От монтирование того же самого WebDAV в finder MacOS можно сразу отказаться, работает очень медленно и нестабильно. При этом при монтировании через Cloudmounter все ок. В Linux с монтированием тоже все ок.


    После каждого краша синхронизатор просто останавливается. Через какое-то время перезапускается, опять доходит до ошибки и опять останавливается. Я конечно понимаю, если нужно каждому юзеру выделить 1-5 гб места, то наверное все ок, но когда дизайнерам надо засинхронизировать 200Гб макетов и программистам по 5-20гб мелких файлов, то это решение можно смело обойти стороной.

    Единственный плюс owncloud/nextcloud это то, что он файлы хранит файлами.

    Интересно то, что не смотря на то, что вроде вся опенсорс тусовка ушла в nextcloud, в owncloud сейчас есть и виртуальная ФС и diff синхронизация, чего все еще нет в nextcloud.

    Seafile
    Разработчики говорят, что ядро сервера написано на C и оно очень быстрое. Остальное похоже написано на питоне. В качестве БД использует MySQL или sqlite.
    Для фронтенда можно использовать apache2 или nginx. А можно подсоединяться по IP.

    Первый день тестируем. Пока вообще все на столько хорошо, что даже не верится. 10Гб мелких файлов засинхронизировал вообще без всяких вопросов и ошибок менее чем за 1 час.

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

    Остановимся пока на Seafile. Скорость и глючность Nextcloud/owncloud своlит все его плюсы на нет.
    Ответ написан
    Комментировать
  • Что выбрать: Syncthing vs nextCloud vs Seafile vs OwnCloud vs Другой сервис?

    @Sing303
    Что именно мешает определиться? Пробовал nextCloud, OwnCloud и Seafile.
    Больше всего понравился Seafile. Показался стабильнее, быстрее, безопаснее (шифрование), ну и в нём нет ничего лишнего.
    Ответ написан
    1 комментарий
  • Что выбрать: Syncthing vs nextCloud vs Seafile vs OwnCloud vs Другой сервис?

    fdroid
    @fdroid
    press any key
    mike153: пробовал все варианты. Nextcloud - это форк Owncloud. По сути, одно и то же, хоть и NC считается более продвинутым и вообще вся опенсорсная тусовка туда ушла. Поэтому пишу о нём. Всё исключительно на правах IMHO. Плюсы:
    - Самый главный - это работа с файлами именно в файловом варианте. То есть, если предположить, что "всё упало", вы можете подключить диск с рухнувшего сервера к любому линуксу и вытащить инфу из /var/www или где она там у вас храниться будет. Также можно подключать внешние хранилища, то есть, предположим, есть у вас на сервере папка с фильмами и музыкой - их можно просто подключить в NC.
    - CardDAV, CalDAV из коробки.
    Минусы:
    - Тормозит всегда, рандомно, в любой момент времени. Независимо от того Apache или Nginx, MySQL или MariaDB, тормозит на любом софте.
    - Интерфейс - УГ, ШГ

    Теперь о Seafile. Плюсы:
    - Турбореактивный просто. Работает очень быстро.
    - Интерфейс очень приятный.
    - Продвинутое версионирование.
    - Умеет открывать docx, odt, xlsx и т.д. без дополнительного софта. Но без редактирования. Если нужно редактирование - нужен отдельный Document Server от Collabora или Onlyoffice.
    - PRO-версия бесплатна для 3-х пользователей, но смысла особого нет, т.к. enterprise-фишки заключаются в 1. полнотекстовому поиску по документам с помощью elasticsearch, у которого просто чудовищное потребление ресурсов 2. двух-факторной авторизации 3. и что-то там ещё, не особо нужное дома
    - Есть клиенты для всех основных платформ
    - Устанавливать можно как вручную по мануалу на сайте, так и воспользовавшись установочным скриптом, который сам всё сделает.
    Минусы:
    - Файлы хранятся в собственном формате, как это правильно называется? - на уровне блоков, что ли. Доступ к инфе только через веб-интерфейс, WebDAV, ну и приложения для синхронизации. То есть, вся информация в Seafile на диске представляет просто кучу мала из папок и файлов, которые нельзя так просто взять и использовать - нужен ещё дамп базы данных. То есть, в случае проблем с системой, достать информацию будет затруднительно. Но выход есть - seaf-cli - это безгуёвый клиент для синхронизации. Смысл в том, что на сервере, на котором крутится Seafile, дополнительно можно установить seaf-cli, натравить его на директорию, и он в эту самую директорию будет складывать синхронизированную копию инфы основной базы Seafile, причём в виде нормальных файлов, которые можно расшаривать как угодно, бэкапить и т.д. Минус решения с seaf-cli в том, что нужно вдвое больше дискового пространства для хранения инфы.
    - Ну и как следствие такой организации файлов - невозможность подключить внешние хранилища, в отличие от тёплого лампового Nextcloud.

    В общем, лично я остановился на Seafile.
    Ответ написан
    Комментировать
  • MariaDB во всём лучше MySQL? Или у MySQL есть какие-то преимущества?

    @drrtuy
    В MariaDB есть много фичей, отсутствующих в MySQL:time versioning, поддержка движков для OLAP и KVS, новые методы доступа к данным и их обработке в плане исполнения, поддержка режима совместимости синтаксиса pl/sql Оракла, поддержка plugable custom data types. Но и в MYSQL есть отличия: data dictionary вместо .frm файлов и метаданных в таблицах myisam. Поддержка синтаксиса операторов для JSON из стандарта. Рекламируемый atomic DDL не фига не atomic правда: базка не заресторит по ROLLBACK колонку потертую с ALTER TABLE DROP COLUMN.
    Поэтому если вам важны добавленные фичи, то используйте MySQL. Если важна производительность, то MDB.
    Да, кстати, Oracle решила порушить систему feature freeze после того как major release стал GA и добавило меняющую поведение фичу в 8.0.

    Percona сейчас это нечто "заимствовающее" коммиты из обоих проектов. Когда-то у них был крутой тулинг и команда хакеров, понимавших в коде ядра СУБД, но времена прошли и, по большому счёту, Percona сейчас это бизнес поддержки - я бы не стал ставить на них.
    Ответ написан
    2 комментария
  • Как ускорить запрос SELECT count?

    Demetriy
    @Demetriy
    веб и мобильная разработка
    Единственный способ ощутимо ускорить COUNT, это не использовать COUNT, для определенных задач есть альтернативы, например если COUNT нужен вам для постраничной навигации, то можно выбирать число страниц больше нужного в n раз + 1 и на основании этого делать пагинацию.

    Пример:
    В таблице 700000 записей, нам нужно вывести десятую страницу с 10 записями с постраничной навигацией: выбираем не 10, а 41 запись (не забываем про офсет), выводим 10, но благодаря тому, что выбралась 31 запись вперед, мы знаем что еще есть как минимум 4 страницы на которые можно отобразить ссылки.
    Ответ написан
    Комментировать
  • DDD Agregate, Entity, Repository понятным языком?

    @miksir
    IT
    Entity - сущность бизнеса. То, что еще называют "моделью", хотя этот термин так засрали, что лучше и не вспоминать про него. С чем работает наша проблемная область? С Клиентом, с менеджером, с заказов, с товаром - это и будут сущности. Важный момент - у сущности есть уникальный идентификатор.

    Репозиторий - это коллекция сущностей, паттерн по управлению сущностями. Из репозитория мы их получаем, в репозиторий отправляем. Конкретная реализация репозитория на persistence уровне уже занимается сохранением и поиском сущностей в базах данных.

    С аггрегатом и просто и сложно. Когда мы проектируем нашу предментую область, мы можем выделить такие сущности, которые не должны использоваться в отрыве от какой-то другой. Например, есть сущности "конкурс" и "фото на конкурс". Последняя не может существовать без конкурса, не может использоваться без него. При этом, именно "конкурс" мы будем спрашивать - сколько фото пришло. Удаляя конкурс - нужно удалить все фото этого конкурса. В таких случаях, мы определяем сводные (aggregate) границы и выделяем главную сущность (aggregate root или сводный корень). Ссылаться "извне", т.е. из других сущностей, не входящий в аггрегат мы можем только на сводный корень. Запрашивать из репозитория можем только сводный корень. И т.п., там много ограничений. Основная идея тут - инкапсулировать взаимодействие связанных сущностей внутри сводных границ, упростив таким образом глобальные взаимодействия.
    Ответ написан
    4 комментария
  • Как в doctrine2 присвоить полю null?

    @tsifra Автор вопроса
    <?php
    
    namespace Backend\WorkorderBundle\Entity;
    use Doctrine\Common\Collections\ArrayCollection;
    use Symfony\Component\Validator\Constraints as Assert;
    
    use Doctrine\ORM\Mapping as ORM;
    
    /**
     * Workorder
     *
     * @ORM\Table(name="workorder")
     * @ORM\Entity(repositoryClass="Backend\WorkorderBundle\Entity\WorkorderRepository")
     */
    class Workorder
    {
    //..
        /**
         * @var integer
         *
         * @ORM\Column(name="locked_by", type="integer", nullable=true)
         */
        private $lockedBy;
    
        /**
         * @var \DateTime
         *
         * @ORM\Column(name="locked_at", type="datetime", nullable=true)
         */
        private $lockedAt;
    //..
        public function __construct()
        {
            //здесь про эти два объекта ничего
        }
    //..
        /**
         * Set lockedBy
         *
         * @param integer $lockedBy
         * @return Workorder
         */
        public function setLockedBy($lockedBy)
        {
            $this->lockedBy = $lockedBy;
        
            return $this;
        }
    
        /**
         * Get lockedBy
         *
         * @return integer 
         */
        public function getLockedBy()
        {
            return $this->lockedBy;
        }
    //..


    если вместо null в этом коде ставить какие-то другие значения то БД без проблем обновляется.

    $object->setLockedBy(null);
    $object->setLockedAt(null);
    Ответ написан
    Комментировать
  • Чем отличается EventListener от Subscriber в Symfony2?

    1. Единственное отличие в том, что Subscriber определяет сразу несколько слушателей.
    2. С помощью Subscriber'а удобно подписываться сразу на несколько событий одного класса. Например, Doctrine - можно сразу подписаться на postPersist и postUpdate и зарегистрировать один Subscriber. Если это же делать через Listener, то придется для каждого события создавать свой Listener и отдельно регистрировать его.
    3. Если вы зарегистрировали Listener/Subscriber через Service Container, то вызывать EventDispatcher вам не нужно. Если же вы хотите подписываться на события в runtime, то тогда да, вам придется вызывать EventDispatcher.
    Ответ написан
    1 комментарий
  • IDE для PostgreSQL?

    mmmaaak
    @mmmaaak
    Ответ написан
    Комментировать
  • Какую книгу или видеокурс посмотреть по php oop, pdo, шаблоны проектирования?

    by25
    @by25
    Веб-разработчик
    1. Мэтт Зандстра "PHP: объекты, шаблоны и методики программирования" - Врубиться в ООП
    2. Эрик Фримэн и ко "Паттерны проектирования" (Head First) - Влюбиться в ООП
    3. Эрик Эванс "Предметно-ориентированное проектирование" - научиться проектировать сложные системы
    4. Крэг Ларман "Применение UML 2.0 и шаблонов проектирования" - про проектирование, глубокое понимание ООП
    Ответ написан
    Комментировать
  • Записная книжка программиста?

    @crast
    Snippets. Удобная штука, пользуюсь давно, нареканий почти нет.

    P.S. А, запись-то древняя... Ну, логично предположить, вы себе что-то таки нашли, расскажите, на чем остановились, плз.
    Ответ написан
    1 комментарий
  • Что изучить первым и выгоднее Angular, Angular 2 или React?

    feligz
    @feligz
    JS/TS developer
    Лихо вы TypeScript в минусы записали ) Статическая типизация сильно повысит надежность вашего кода, сделает его более структурированным и понятным. Многие ошибки будут вываливаться уже на стадии компиляции. Так что TS это большой плюсище.
    Ответ написан
    Комментировать
  • Зачем нужен Dependency Injection в Android разработке?

    artemgapchenko
    @artemgapchenko
    Начать неплохо бы с понимания того, что такое DI. Обратимся к википедии:

    Внедрение зависимости (англ. Dependency injection, DI) — процесс предоставления внешней зависимости программному компоненту.

    Если выражаться не канцеляритом, а обычным русским языком, то DI - это когда вы своему компоненту (например, классу) предоставляете нужные для него зависимости извне, а не создаете их сами в конструкторе, или через инициализацию в месте объявления поля. То есть не так:

    public class Api {
    	....
    	private final HttpClient client = new OkClient();
    }

    А, например, так:

    public class Api {
    	....
    	private final HttpClient client;
    
    	public Api(@NonNull HttpClient client) {
    		this.client = client;
    	}
    }


    И что нам это даёт?

    Ну, очевидно, нам теперь проще менять зависимости. Нужна вам другая реализация абстрактного класса HttpClient - взяли, и передали её через конструктор, или через метод-setter. В случае с первым куском кода, вам пришлось бы ещё и класс Api переписывать, что в случаях, отличных от тривиальных, может привести к ошибкам. Получается, что ваш класс теперь закрыт от изменений (смотрим Open/Closed Principle).

    Окей, а на практике-то какие бенефиты?

    Во-первых, вы теперь можете написать инициализацию вашей программы через конфигурационные файлы. Скажем, на старте будет читаться простенький текстовый файл, который определяет, какой httpclient использовать, какие настройки доступа к бд применять и так далее, и, исходя из этого, будут определяться зависимости.
    Во-вторых, вам теперь существенно проще писать тесты. Написали вы, скажем, какой-нибудь парсер, который принимает InputStream, содержащий в себе данные json-объекта, как-то хитро его парсит, и выдаёт вам объект вашей бизнес-модели. В приложении этот парсер будет принимать на вход реализацию InputStream'а, которая берёт данные из сети, а в тестах - реализацию, которая просто читает файл с диска (потому что тесты должны выполняться часто и быстро, и ваша задача в тесте - протестировать ваш парсер, а не скорость сетевого соединения).

    Вот, в общем-то, и всё. А Dagger - это просто библиотека, которая автоматизирует ручное внедрение зависимостей, равно как и другие DI-библиотеки.

    P.S. В некоторых случаях чрезмерное увлечение DI может привести к нежелательным эффектам, вроде чрезмерного усложнения кода, поэтому внедряйте аккуратно. Понимание приходит с опытом.
    Ответ написан
    Комментировать
  • Проект со сложной логикой на Symfony – как проектировать? Примеры?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Как хранить бизнес-логику чтобы модели не превратились в монстров из десятков тысяч строк?

    Тут не совсем модели. Entity - это просто объект данных, умеет хранить их в себе и бросать исключения, если не правильные данные вставляете, все. Repository - умеет работать со своим Entity И БД.

    БЛ находится в классах сервисах.

    Читал про Command Bus где, если правильно понял, на каждое действие в системе – свой класс?

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

    Как их организуете (их тогда будут сотни)?

    Иерархически. Путь к классу должен быть "понимаем".

    Есть ли смысл выносить каждую доменную модель в модуль/микросервис, хранить всю связанную логику где-то там внутри, а с остальными общаться по внешнему API?

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

    За ответы в клиентскую часть – отдельный сервис-фронтенд?

    Если в "сервис" вы вкладываете понятие простого класса, умеющего форматировать ответы вашего проекта - мысль здравая.
    Если ответы будут асинхронными (от сервера к другому) - имеет смысл выностить в отдельный клиентский класс.

    Каков оверхед?

    Ничтожный.

    Используют ли такое на практике?

    Да

    Какие подводные камни?

    Следствием серьезной декомпозиции в любом случае будут лишние сущности, чем раньше от них будете избавляться - тем лучше.

    Как не превратить кидание/получение событий типа PostBeforeEdit/PostBeforeEditHandler в "callback hell"?

    Если есть возможность отказаться от событийной модели - часто лучше отказаться.
    Листнеры доктрины конечно штука мощная, но работает не всегда очевидно.

    Функционал "PostBeforeEdit/PostBeforeEditHandler" часто дешевле и проще вынести в сервис, но опять же руководствуйтесь здравым смыслом.

    ACL Где храните указанную логику?

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

    Какие структуры для описанного выше – best practice?

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

    В моём понимании это выглядит как куча трёхмерных кубов доступа "crud – group – entity – field", как это сделать более плоским пока только одна идея – делать кучу таблиц many-to-many.

    Гибкая настройка вплоть до каждого поля 90% что не нужна. Если можно свести к понятию скопов прав - сделайте это.
    Структуру можно предлагать только зная ваш проект.

    Версионирование. Как вы версионируете подобные проекты?

    Semver.

    А если нужна "N-1" рабочая версия на продакшене?

    Значит на прод попадает ваша версия с тегом "N-1"))

    Есть ли смысл разделять версии в рамках единой кодовой базы проекта и как (неймспейсы, конфиг, модуль, что-то ещё)?

    Храните яйца в отдельных корзинках. Если модуль развивается полностью отдельно и может быть вынесен как зависимость проекта в vendor - делайте.

    И, самое главное – как всё это совместить?

    • РУКОВОДСТВУЙТЕСЬ ЗДРАВЫМ СМЫСЛОМ
    • Принимаете жесткие соглашения по правилам написания кода, например такие
    • Постарайтесь убедить бизнес в том, что без покрытия кода автотестами будет дороже, нестабильней и дольше. + Пишите тесты. Если объем тестов в 4 раза больше кода, который они тестируют - это норм. У меня бывали случаи, когда для критичного функционала тестов было в ~16 раз больше, чем кода.
    • Жесткие, обязательные кодревью.
    • Если задача крупная - декомпозируйте ее.
    • Технический долг - возвращайте обязательно И как можно скорее.
    • Перед тем как писать код для работы с внешним сервисом - имеет смысл написать его эмулятор.
    • Спешите только в случае серьезных проблем на проде)). Фичи "на вчера" отличаются от фич "на потом" только приоритетом выполнения, более ничем.
    Ответ написан
    6 комментариев
  • Проект со сложной логикой на Symfony – как проектировать? Примеры?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Как их организуете (их тогда будут сотни)?


    Раскидываю по неймспейсам. Скажем все действия относящиеся к юзерам находятся в папке Users.

    Только вы учитывайте что CQRS это прикольно но особо не нужно. К примеру это сразу подразумевает что вы используете UUID вместо автоинкрементов и прочей чуши. Можете сделать хотя бы как Дядя Боб предлагает в своей Clean Architecture. Просто сервис на каждое действие.

    Есть ли смысл выносить каждую доменную модель в модуль/микросервис


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

    Раньше для дополнительных действий мне достаточно было использовать что-то вроде beforeUpdate/afterCreate модели.


    ну а сейчас вы будете эти вещи в сервисы пихать. Причем возможно не в один сервис. Вообще старайтесь не делать "хуков" и не будет с ними проблем. Есть к примеру DomainEvents такая штука, ну и можно все эти "дополнительные действия" в хэндлерах команд делать.

    Как не превратить кидание/получение событий типа PostBeforeEdit/PostBeforeEditHandler в "callback hell"?


    Просто забудьте об этих ивентах.

    ACL. Где храните указанную логику?


    Есть в симфони security vouters, а дальше все зависит от того что вы делаете.

    Как вы версионируете подобные проекты? А если нужна "N-1" рабочая версия на продакшене?


    git + docker теги в мастере. Ветки нужно плодить только тогда, когда у вас система деплоится кастомерам и нужно поддерживать сразу кучу версий. Называется это gitflow.

    На какие проекты (точнее, на код) можете посоветовать посмотреть для лучшего понимания? Ссылки на репозитории?

    На гитхабе катострофически мало примеров хороших приложений на симфони. Да и не только на симфони - в принципе найти в открытом доступе сложный проект - это нереально. NDA и все такое. Такие системы обычно очень дорогие и закрытые со всех сторон.

    p.s. почитайте книжки:

    - Эрик Эванс - Предметно ориентированное проектирование
    - Крэйг Ларман - Применение UML 2.0

    p.p.s. Все ваши загоны не имеют никакого смысла если вы не будете пользоваться практиками вроде Test-Driven-Development, ну или хотя бы покрывать систему интеграционными тестами. Без этого вы не сможете делать частный мелкий рефакторинг, а без этого ваша система быстро превратится в легаси.
    Ответ написан
  • В чем моя причина провала тестового задания Яндекса?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Ну давайте я покритикую:

    возьмем файлик

    1) вы не разобрались как объявлять методы у прототипов с новой нотацией `class`:

    class Travelsort {
        constructor() {}
        sortTickets(tickets) {}
    }


    2) вы не умеете пользоваться исключениями.
    if (!Array.isArray(cards)) {
        throw new ValueError('Wrong input');
    }


    3) использование let там где должен использоваться const

    4) в принципе использование переменных там где их быть не должно

    5) вы зачем-то реализовали свою функцию сортировки, я не увидел в требованиях отсутствия возможности использовать старый добрый Array.prototype.sort

    6) Общие замечания по кодинг стайлу. snake_case там где должен быть camelCase, пишите с большой буквы то что должно быть с маленькой и т.д.

    7) нарушения принципа единой ответственности. У вас объеткт умеет и сортировать и писать куда-то. Это категорически плохо.

    8) Если исправить 7-ой пункт то наш класс превращается просто в функцию.

    Далее... берем следующий файлик

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

    2) вы зачем-то тут в прототип объекта строки впихиваете функции для парсинга CSS. Таким образом мы нарушаем принцип единой ответственности. Да и в целом расширять без надобности прототипы объектов как-то не ок.

    Чуть дальше проскролил - вы пытаетесь расширить прототип строк для того что бы добиться API jquery? ух, батенька.

    3) очень много дублирования.

    4) очень плохо с protected variations.

    Справедливости ради, ваш код входит в категорию ">50% JS кода", так что не расстраивайтесь. Просто для работы в яндексе нужен чуть более высокий уровень и понимание вещей.
    Ответ написан
    17 комментариев
  • Где брать красивые фоны для сайтов?

    https://unsplash.com/ - природа, пейзажи и разные спокойные фото. Изображений очень много и все они высоком разрешении;
    getrefe.tumblr.com - здесь меньше контента, но есть альтернативные категории;
    www.splitshire.com - более серьёзная альтернатива предыдущему сайту;
    https://picjumbo.com/ - кроме кучи качественных фото есть фича встраивания изображения в разные шаблоны для демонстрации. Для веб дизайна и верстки самое оно.
    Ответ написан
    Комментировать
  • Правильно ли я понял философию Docker?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Контейнеры данных


    Они не нужны, используйте named volumes вместо этого (с версии 1.9 докера).

    Исходный код и локальные npm-модули (или лучше это в предыдущий контейнер, и при старте выполнять


    Нет, npm install надо выполнять ДО сборки образа. Когда контейнер стартует - внутри у него уже все должно быть. Опять же я лично против того, что бы выносить исходники проекта в отдельный контейнер-пустышку. У вас есть контейнер с нодой - исходники для ноды должны быть там. Есть некоторые нюансы связанные со сборкой контейнера но это так.

    На файловой системе хоста


    Ничего.

    Логи прокидываются в stdout/stderr контейнера и собираются на хосте через докер любым подходящим драйвером (читаем документацию).

    Конфигурация - все что в конфигах от окружения к окружению меняется - в ENV переменные. Все остальное - не меняется и потому просто вшито внутрь контейнера.
    Ответ написан
    21 комментарий
  • Бесплатный проект для портфолио превратился в бесконечный. Как быть?

    POS_troi
    @POS_troi
    СадоМазо Админ, флудер, троль.
    Вариант 1 - послать и забыть.
    Вариант 2 - переводить из бесплатного в платный.

    Базовый функционал есть? Есть
    Клиент уже доволен? Доволен
    Пора платить деньгу, а так он почувствовал халяву и не слезет с вас.
    Ответ написан
    6 комментариев