• Как побороть сонливость и апатию в течение дня?

    nki
    @nki
    Автоматизация бизнес-процессов.
    Мне помогла ипотека, автокредит, трое детей и неработающая жена.
    Ответ написан
  • Разработчик недисциплинированно трекает время. Что делать?

    php666
    @php666
    PHP-макака
    Упаси бог работать в столь токсичной среде.
    Сидеть и отчитываться за каждую минуту/час.
    Идеальный информационный концлагерь.
    Ответ написан
  • Web, сетка 1344 пт, что это?

    MykolaPetiukh
    @MykolaPetiukh
    Директор кафе
    Вежливо намекни им, что какой будет ширина контентной области решаешь ты.
    Мы, программисты, любим давать советы, когда их не просят
    Ответ написан
  • Как асинхронная программа(event loop) понимает, что пришел ответ от сервера?

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

    Итак, мы пишем на нашем высокоуровневом любимом языке, неважно JS/Rust/C#/Scala/Python или любой другой. В современном мире у нас скорее всего есть какая либо абстракция для работы с асинхронными апи, предоставляемая или стандартной библиотекой языка или сторонними библиотеками. Она может быть примитивной и основанной на колбэках или более продвинутой, вроде Future/Promise/Task или чем-то подобным. Иногда наш язык предоставляет синтаксис наподобие async/await для более простой работы с этими абстракциями, а иногда асинхронная работа может вообще быть скрыта от нас в рантайме языка, например как с горутинами в Go. Но в любом случае где-то под капотом у нас будет event-loop, а иногда и не один, так как никто не запрещает нам писать многопоточку в то же время используя асинхронные вызовы.

    Сам event-loop - это не более чем обычный while(true) или любой другой бесконечный цикл. И внутри этого цикла наша программа имеет доступ на извлечение к некоторой очереди (если не знаете, что это за структура данных, то погуглите), которая содержит в себе результаты уже обработанных задач. Программа берет очередной результат, находит ожидающий ее колбэк/Promise/Future/Task и запускает выполнение ожидающего кода. Очередей опять же может быть несколько и обрабатываться они могут по разному, но это не важно. Важно то, что наш основной поток (или потоки) ничего не знают, о том как выполняются асинхронные задачи. Он лишь смотрит, есть ли в очереди результат, и если есть - обрабатывает его, а если нет, то принимает решение или выйти из цикла (и завершить поток, а иногда и весь процесс) или уснуть пока новых результатов не появится.

    Но откуда же в очереди берутся результаты? Надо понимать, что асинхронная программа почти всегда многопоточная и результат операций попадает в очередь из фоновых потоков, которые просто блокируются в ожидании нужного ресурса (или сразу многих ресурсов, если используют системные апи вроде epoll или kqueue). Как правило такие фоновые потоки большую часть времени находятся в состоянии ожидания, а значит не потребляют ресурсы CPU и не попадают в планировщик ОС. Такая простая модель действительно позволяет сильно экономить ресурсы по сравнению с моделью, где множество потоков выполняют по 1 задаче и самостоятельно ожидают свои запросы.

    Важно отметить, что в современном мире даже на среднеуровневых языках, вроде C или C++, не говоря уже о высокоуровневых, не реализуют асинхронность сами. Во-первых, на разных ОС для этого используются разные апи. Во-вторых, эти апи на разных ОС умеют обрабатывать разные типы ресурсов (с сетью вроде как умеют работать все основные ОС, но помимо сети асинхронно можно работать с пользовательским вводом, диском и периферийными устройствами, вроде сканеров, вебкамер и прочего цепляемого в usb). Наибольшую популярность (ИМХО) имеет кроссплатформенная библиотека libuv, хотя в Rust принято использовать mio (или даже абстракции над ней, вроде tokio), в C# подобные механизмы есть в .NET Core, а в Go оно уже зашито
    в те самые 1.5МБ рантайма, что Go засовывает в каждый бинарь
    (там правда еще и GC, но один фик это много и достойно вынесения в динамическую либу)


    Ок. С прикладным кодом вроде разобрались. А что же происходит в ядре ОС? Ведь, как писалось выше, у нас даже есть апи, чтоб ждать запросы пачкой. Все просто. Ядра ОС стали асинхронными еще до того, как это стало мейнстримом, если мы конечно имеем дело не с ОС реального времени (но у нас же винда/линь/мак/фряха, а не ОС для бортового компа боинга, где это критично). Смотрите, когда что-то происходит на внешней периферии (ну например диск запрошенные данные прочитал или по сети данные пришли, или юзер мышкой дернул), то формируется прерывание. CPU реально прерывает свою текущую работу и бежит смотреть что случилось, точнее вызывает обработчик предоставленный ОС. Но у ОС то есть основная работа, поэтому она скорее старается освободить обработчик и просто скидывает все данные в оперативку, а разбираться будет потом, когда очередь дойдет. Ничего не напоминает? Очень похоже, на то что происходило в event-loop, только вместо фоновых потоков "результаты" попадают в очередь из прерываний. А уже когда-то потом ОС отдаст данные в драйвер устройства, ну и т.д., пока они не дойдут до нашего прикладного приложения. Вот и все, никакой магии.
    Ответ написан
  • Как совместить реляционную модель бд с ООП?

    @FanatPHP
    Чебуратор тега PHP
    Неужели сама идея реляционных бд с ООП несовместима?


    Ты весьма недалёк от истины.
    Некоторые сравнивают эту проблему с проигранной США войной во вьетнаме.

    Решение от Victhor подходит для единичных выборок, но как быть с коллекциями? Люди начинают изобретать разные стратегии подгрузки - lazy loading, eager loading. Вот Елоквент, например, собирает в кубышку все айди загруженных товаров и потом пуляет 1 запрос с IN (...) чтобы получить для них бренды, которые потом в цикле пришпандоривает к товарам.

    Но все это очень быстро начинает сказываться на производительности. И всё дальше затягивает нас в пучину Вьетнамской войны, или другими словами в кроличью нору Object-relational impedance mismatch - как по-научному называется озвученная тобой проблема. Дальше начинается совсем уж треш и угар, типа дико тормозащих коллекций в Доктрине или таких извращений, которыми занимался один мой знакомый - он плодил вьюхи в БД, поскольку его ОРМ умел работать только с одной таблицей.

    Или все же модифицируются в дальнейшем классы, переписыванием кода?


    В одном ты можешь быть уверен: такое легкое отображение, которое рисует тебе воображение при первом знакомстве с ORM - чтобы так хоба-хоба, и у нас записи из БД отобразились в объекты - увы, не существует. Да, приется переписывать, и много. И чем сложнее взаимосвязи, тем хуже будет работать автоматизация.

    И тут на первый план выходит организация ORM и становится очевидной превосходство стратегии Data Mapper, когда слой работы с БД полностью отвязывается от объекта бизнес-логики.

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

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

    И это мы сейчас говорим о read-моделях, и даже не трогали тему write models - то есть сохранения измененного объекта - со всеми гроздьями смежных объектов(!) - в БД!
    Ответ написан
  • Как начать работать без "фонового шума"?

    opium
    @opium
    Просто люблю качественно работать
    Мужик возьми себя в руки ты же не девченка
    Ответ написан
  • Как начать работать без "фонового шума"?

    delphinpro
    @delphinpro
    frontend developer
    Вы пишете какую-то х.ню. Выдумали себе проблему. Если вы хотите избавиться от фонового шума, — вы от него избавляетесь. Если избавиться не получается, — значит вы не хотите от него избавляться. Всё остальное — это отмазки перед самим собой.
    Ответ написан
  • Как сделать так, чтобы linux при установке видел мой ssd?

    Adamos
    @Adamos
    Асер - не только дерьмовый производитель, но и сволочь, залочившая свои ноуты так, чтобы юзеры на них не могли поставить ничего, кроме Окошек. Банальный картельный сговор.
    Фишка в том, что этот SSD подключен как настолько кривой RAID, что его только предварительно предупрежденная винда и понимает.
    Нужно сменить настройку - изменить SATA mode в BIOS.
    Но уроды из Асера подгадили и здесь: эта опция по умолчанию в BIOS не отображается вовсе.
    Нужно зайти в BIOS и в закладке Main нажать Ctrl-S. Только тогда появится возможность открыть этот капкан - и после этого можете ставить на него, что угодно, системы диск увидят.
    Ответ написан
  • Как получить данные отправленные с формы на сервере?

    Lynn
    @Lynn
    nginx, js, css
    Вот тебе полезный ответ.
    Http работает так как написано в стандарте и от твоего хотения он не поменяется.
    Так что используй bodyParser и не выпендривайся.
    Ответ написан
  • Как установить Unity DE на Ubuntu Server?

    Чтобы не тянул всякое г..., ставить надо с mini.iso.
    Голую систему.
    На этапе выбора софта не выбирать ничего.
    После перегруза устанавливаешь ubuntu-unity-desktop и получаешь Ubuntu + LightDM + Unity без вяских Gnome и Gnome Shell (хотя Unity надстройка Gnome и он в урезанном виде присутствовать будет).

    А чтобы Вафля и проводной работали, сначала проверяешь создался ли файл Netplan - 01-netcfg.yaml:
    cd /etc/netplan; ls

    И, если файл 01-netcfg.yaml создался при установке, то выполняем:
    sudo sed -i -e '6,8d' -e 's/networkd/NetworkManager/' /etc/netplan/01-netcfg.yaml; sudo netplan apply; reboot


    или (если вывод ls ничего на дал - т.е. пусто, что означает, что файл после установки не был создан, а такое бывает), то просто создаём этот файл, но уже с др. именем 01-network-manager-all.yaml и ребутимся:

    echo -e '# Let NetworkManager manage all devices on this system\nnetwork:\n  version: 2\n  renderer: NetworkManager'| sudo tee /etc/netplan/01-network-manager-all.yaml > /dev/null; sudo netplan apply; reboot
    Ответ написан
  • Как сказать не падать Dev Server'у Реакта при запуске приложения в режиме разработки?

    @slide13
    frontend/web-developer
    Похоже проблема у webpack на мак и 13й версии node js, вот issue на гитхабе
    В качестве быстрого решения можно попробовать установить 12-ю или 11-ю версию nodejs пока не пофиксят
    Ответ написан
  • Что WEBSTORM тут не нравится?

    wapster92
    @wapster92 Куратор тега HTML
    Люблю трилогию ME
    Это вообще не ошибка. Таким образом он показывает открывающиеся и закрывающиеся теги.
    Ответ написан
  • Знаете готовый видео-плеер с нормальной адаптацией контролов под тач устройства, поддержкой плей-листа и легкой кастомизацией?

    bootd
    @bootd
    Гугли и ты откроешь врата знаний!
    Это videojs то убогий? Вы серьёзно???? Вы хоть в документацию лазили, что бы увидеть, что там можно кастомизировать? По всей видимости нет. Это один из лучших open source плееров. А может вам вообще делать ничего не хочется и вы ждёте от всех готовых решений??? Если вам не нужны своих кастомные контролы, а вам нужен лишь Material дизайн, так идите в файл стилей и просто сверстайте.

    Создать плейлист не составляет особого труда, у него очень лаконичное и простое api. А на главной странице есть пример работы плейлиста

    Не нравится videojs, юзайте стандартный плеер и пишите свой UI.
    Ответ написан