• Headerless cms на базе Laravel можно/нужно?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    С технической точки зрения ларка безусловно поможет сделать cms.
    С бизнес точки зрения вы точно должны понимать, почему существующие решения вам не подходят. Если этого понимания нет, есть очень большая вероятность того, что вы напшете оередной никому не нужный велосипед
    Ответ написан
    Комментировать
  • Какую базу данных использовать для такого проекта?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Ну, на основной вопрос уже ответили, а я освещу отдельную проблему, которая очень часто волнует умы юных падаванов.

    когда лучше реляционную и нереляционную использовать?

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

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

    Если вдруг проект пройдет стадию "неясные идеи", и выльется во что-то практическое, и даже появится какая-то нагрузка, то можно будет начать думать про использование одного или нескольких подсобных хранилищ в дополнение к базе данных.
    Ответ написан
    2 комментария
  • Как происходит исполнение кода в Event Loop и управление потоками для веб приложений?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    1. Как происходит связь между кодом js, c++. На самом гитхабе Nodejs можно открыть папки с функциями, которые я импортирую в коде. А также их реализации в файлах .cc расширения. Но не могли бы подробнее описать механизм, которые позволяет 2 разных языка использовать.
    JS движок (например V8) предоставляет платформе (Node.js) некоторый C++ api, через который платформа может движком управлять. Например через это api можно дать движку строчку с JS кодом и попросить его выполнить, а в ответ получить указатель на результат выполнения (V8 например возвращает результат последнего выражения в коде). Так же, если у нас есть указатель на JS функцию, можно попросить движок ее выполнить с определенными аргументами и this, а в ответ получить результат этого выполнения (функция что-то вернула или бросила исключение). Ну и наконец, мы можем дать этому api указатель на C/C++ функцию, а движок сделает из нее JS функцию и вернет указатель на нее, когда JS функция вызывается движок вызовет нашу C/C++ функцию и даст ей на вход контекст выполнения, из которого можно извлечь this и аргументы функции, так же через контекст можно установить результат выполнения JS функции, указав что JS функция должна вернуть некоторое JS значение или бросить некоторое исключение.

    2. V8 - движок для исполнения JS кода, то есть превращения его в машинный код для исполнения комманд. Libuv написана на с++. Они же не работают в паре? Я так понимаю, что часть кода исполняется на движке v8, а различные асинхронные вызовы, которые через Nodejs api делегируются библиотеке Libuv - уже от неё превращаются в низкоуровневый машинный код, который исполняется компьютеров?Можете чуть пролить свет на исполнения уже между этими компонентами Libuv, V8.
    V8 ничего не знает о libuv, как и libuv ничего не знает о V8.
    V8 занимается компиляцией/интерпретацией/выполнением JS кода, управлением JS памятью и некоторыми другими связанными с JS вещами. В V8 нет никаких event loop и чего-то подобного, он запускает JS код только когда ему об этом скажет платформа (например Node.js).
    Libuv занимается асинхронными операциями. Что-то переадресует операционной системе, например сетевые сокеты можно собрать в пачку и отдать в epoll в Linux или kqueue в MacOS, заблокировав лишь один поток сразу на тысячи сокетов. А что-то просто блокируется на фоновых потоках, например обращения к файловой системе. Event loop нет и здесь, но зато есть очередь задач, которые потенциально готовы.
    Ну и наконец сама платформа (Node.js) реализует event loop (по сути просто бесконечный цикл), в котором получает потенциально готовые задачи от libuv и раскладывает по своим очередям готовые, а неготовые планирует в libuv, спрашивает у V8 не хочет ли он сделать сборку мусора, ну и наконец говорит V8 вызвать некоторые JS функции.

    3. После того, как Nodejs передает асинхронный вызов Libuv на исполнение. То callback функция помещается позже в стэк для исполнения, а исполнятся начинается после того, как система просигнализирует о завершении процесса, например считывания файла. Или вначале считывается файл, а потом система об этом сигнализирует и помещается callback функция в стэк Event Loop'a для исполнения?
    Выше уже расписал как Node.js взаимодействует с libuv в теле event loop, так же расписал как JS код может вызвать C++ функцию. Рассмотрим на сильно упрощенном примере, что происходит когда в JS коде на Node.js мы вызываем fs.readFile(filepath, callback):
    1. fs.readFile - это обычная JS функция, но внутри она вызывает некоторую C++ функцию из Node.js, которая получает указатель на строку filepath и указатель на JS функцию callback, но эта C++ функция будет запущена на том же потоке где и event loop (по сути где-то внутри цикла), а блокировать нам нельзя. Поэтому она просто планирует вызов другой C++ функции на фоновых потоках и завершается, возвращая тем самым управление JS коду.
    2. В какой-то момент до запланированной C++ функции дойдет очередь на выполнение на одном из фоновых потоков, она прочитает файл в память и добавит в очередь готовых задач некоторый объект, который является результатом операции чтения из файла, этот объект будет хранить в себе указатель на прочитанные данные и указатель на JS функцию callback.
    3. Еще через некоторое время поток с event loop извлечет из очереди этот объект результат и скажет V8 вызвать функцию callback с данными из файла.

    4. Можете более подробней рассказать про исполнение кода на инстансах приложения в зависимости от количества ядер процессора и управления потоками:

    4.1 Есть к примеру приложений на Nodejs. На компьютере 4 ядра. Я на каждом ядре могу запустить инстанс этого приложения. И у каждого инстанса в pool thread'e будет по 4 потока дополнительных, которые создаются по умолчанию?
    Каждый инстанс Node.js - это отдельный процесс операционной системы. У каждого процесса своя изолированная память. И да, каждый может запускать несколько потоков (у Node.js кстати 4 потока - это минимум, при большой нагрузке она может добавить в пул до 128 потоков), но в случае с Node.js большая часть потоков почти всегда что-то ждут (пока тот же файл прочитается например) и почти не тратят ресурсы CPU, а активно работает лишь один - тот в котором event loop.

    4.2 Если отойти от ноды и запустить приложение на php фреймворке на Apache и этот сервер выделяет под каждый запрос свой поток.В данном случае - это такой же условно поток, который может выделяться и библиотекой Libuv или это абсолютно разные понятия? И сколько инстансов php приложения запущено, когда Apache под каждый создает свой поток? Как соотносится поток с инстансом приложения на php.
    С точки зрения операционной системы - да, это такие же потоки. Разница заключается в том, что в этих потоках происходит. В php только 1 поток, который то что-то полезное делает, то ждет ответа от БД/файловой системы/еще чего-то. А в Node.js это разделено, 1 поток занят только полезной работой (выполнением JS кода) и несколько только ждут ответа.
    Насчет какие там лимиты на количество инстансов php у Apache я не скажу, но они точно не бесконечные, а значит если лимит будет исчерпан, то клиенты (браузер) будут ждать пока какой-то из инстансов php не завершит свою работу полностью. А в node.js мы на одном инстансе можем обслуживать сразу множество клиентов, выполняя задачи для каждого по чуть-чуть, пока для одного клиента ждем ответ из БД можем заняться обработкой запроса от другого клиента.

    4.3 Может в дополнение расскажите про потоки в системе, их ограничения и т.д
    Тут целую лекцию можно читать. Думаю это стоит вынести в отдельный вопрос.
    Ответ написан
    3 комментария
  • Как реализовать запись аудио через микрофон и отправка на бэкэнд в реальном времени?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Просто берёшь пример из документации и меняешь строку chunks.push(e.data) на отправку blob'а в web-socket.
    Ответ написан
    1 комментарий
  • Онлайн-школа или личный ментор?

    saboteur_kiev
    @saboteur_kiev Куратор тега IT-образование
    software engineer
    На обучение денег не жалко, главное, чтобы был результат.


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

    Тем более, что вы уже делали какие-то попытки и начнете не с нуля.
    Пишешь много кода, парралельно читаешь что-нибудь системное (один учебник).
    И нет смысла искать самый-самый лучший. Ну вот вообще.
    Если бы был какой-то самый лучший учебник, он бы уже был единственным путем в мир разработчиков.
    А на деле - можно научиться разными способами.

    Лучше за то же время прочитать два любых из гугловского топ-10 и написать кучу кода своими руками.
    Ответ написан
    Комментировать
  • Какие стратегии повышения зарплаты существуют?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Центральный показатель для бизнеса, а следовательно и руководителей, как людей представляющих интересы этого самого бизнеса - это коэффициент возврата инвестиций (ROI). Соответственно, сотрудник должен приносить компании больше денег, чем потребляет. Естественно, что чем выше разрыв между затратами и прибылью, тем лучше, поэтому фонд оплаты труда руководитель должен держать на том минимальном уровне, который гарантирует бесперебойную работу сотрудников. Один из факторов этой бесперебойности - низкая текучка. Сотрудников терять нежелательно. И чем ценнее для компании сотрудник, чем более он профессионален и/или чем больше на него завязано, тем дороже обходится его потеря. Натурально в деньгах. Придётся затратить больше, чем обычно, денег на поддержание работы без него. Придётся затратить деньги и время (те же деньги) на поиск, найм, введение в работу, возможно, обучение нового сотрудника. При этом он может оказаться совсем неподходящих и цикл придётся повторить. Или может оказаться просто хуже прошлого и эффективность отдела снизится. Поэтому, когда сотрудник приходит просить прибавку, руководитель оценивает может ли этот сотрудник уйти или только блефует, насколько легко его будет заменить, какой урон компании будет нанесён его уходом. Потом руководитель оценивает стоимость расширения ФОТ - есть ли резервы, какой сейчас ROI, будет ли больший ROI от реинвестиции этих средств во что-то другое? Если уход сотрудника будет стоить меньше, чем увеличение ФОТа, сотруднику откажут.

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

    Из этого вывод, стратегия проста - увеличивайте собственный профессиональный уровень на столько, чтобы свободно менять компанию, как только вас что-то перестало устраивать.
    Ответ написан
    4 комментария
  • Как следить за версионностью в клиент-серверном приложении, в выпускаемых фичах продукта?

    Вы пытаетесь решить несуществующую проблему.
    1. Нет никакой проблемы в том что два разных приложения (клиент и сервер) имеют разную нумерацию.
    2. semver нужен только если у тебя есть какой-то контракт, который тебе нужно соблюдать. Если контракта нет - можно использовать просто номера релизов.
    Ответ написан
    3 комментария
  • Как организовать хранение своих наработок и полезных кусков кода, инструкций?

    akelsey
    @akelsey
    Использую joplin, есть на всех платформах, работает без сервера, один бинарь, локально либо синхронизироваться в облака, использует markdown, поиск.
    Ответ написан
    Комментировать
  • Топовый вуз или средний со свободным временем и самообразованием?

    BasiC2k
    @BasiC2k
    .NET developer (open to job offers)
    Если по завершении ВУЗа, Вы будете иметь опыт работы, это будет более ценно, чем диплом из топового ВУЗа.
    Ответ написан
    3 комментария
  • Как фрилансеры хостят проекты?

    @archelon
    Проект размещается на хостинге заказчика.
    Если клиент не знает как, фрилансер консультирует и помогает зарегистрировать домен и хостинг.
    Заодно можно получить небольшой пассивный доход от реферальной программы.
    Ответ написан
    Комментировать
  • Где верстать email html?

    MrDecoy
    @MrDecoy
    Верставший фронтендер
    Фрэймворк:
    https://mjml.io/

    Расширение для vscode где можно сразу live превью смотреть результата и компилировать в html
    https://marketplace.visualstudio.com/items?itemNam...
    Ответ написан
    Комментировать
  • Является ли сообщение, отправленное по Viber, SMS-сообщением?

    @rPman
    определения нужно искать не на вики а в rfc5724
    гугл показывает это, как я понял тут обсуждение ведется и трекается история

    Там в т.ч. четко определен и формат и способ передачи и прочее прочее

    Viber сообщение под это не поподают
    Ответ написан
    Комментировать
  • Является ли сообщение, отправленное по Viber, SMS-сообщением?

    @Drno
    нет
    Ответ написан
    Комментировать
  • Какую альтернативу взять место MongoDB?


    а её заблокировали в России

    Только облачный Mongodb Atlas.

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

    MySQL радикально отличается от mongodb как языком запросов, так и парадигмой.
    GraphQL - вообще даже не база данных, а только лишь протокол
    Ответ написан
    Комментировать
  • Можно ли разместить тег div внутри table?

    MrDecoy
    @MrDecoy Куратор тега HTML
    Верставший фронтендер
    Можно. Но только внутри td.
    https://caninclude.glitch.me/caninclude?child=div&...
    Ответ написан
    Комментировать
  • Как в :hover сделать инструкцию менять цвет БУКВЫ, а не всего текста?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Обернуть каждую букву в отдельный span.
    Ответ написан
    Комментировать
  • Стоит ли тратить время на самописный клиент/sdk для какого то (rest) api?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Основной минус кодогенераторов в том что они за тебя думают. На типовых задачах все хорошо, но "внезапно" MS сменила механизм получения токена, и ты перед разбитым корытом. Из личного опыта.
    Ответ написан
    Комментировать
  • Как запустить цикл each для каждого ключа json?

    0xD34F
    @0xD34F Куратор тега JavaScript
    $.each($.parseJSON(response), (k, v) => $(`.${k}`).text(v));

    или

    for (const [ k, v ] of Object.entries(JSON.parse(response))) {
      document.querySelector(`.${k}`).innerText = v;
    }
    Ответ написан
    1 комментарий
  • Как сделать чтобы бот при рассылке первий написал юзеру?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    почему то не может написать

    Потому что телеграм не дает возможности спамить всем подряд в лс, так что никак (спасибо)
    Ответ написан
    3 комментария
  • Как отсортировать сегменты маршрута в порядке их прохождения?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Собираем начальные и конечные точки сегментов маршрута (объекты вида { точка: сегмент }). Находим начальный сегмент маршрута - такой, начальная точка которого не является ничьей конечной. Следующий сегмент маршрута - такой, начальная точка которого является конечной точкой текущего сегмента. Ну и крутим цикл до тех пор, пока текущий сегмент маршрута существует, не забывая сохранять его в результирующий массив:

    function sort(route) {
      const pointsFrom = Object.fromEntries(route.map(n => [ n.from, n ]));
      const pointsTo = Object.fromEntries(route.map(n => [ n.to, n ]));
      const sorted = [];
    
      for (
        let segment = route.find(n => !pointsTo[n.from]);
        segment;
        segment = pointsFrom[segment.to]
      ) {
        sorted.push(segment);
      }
    
      return sorted;
    }
    Ответ написан
    Комментировать