• Что лучше для большого проекта со сложными вычислениями: Node js или PHP?

    @xenm
    Да что тут думать то, вычисления же сложные, напрашивается haskell или erlang, как бы без вариантов
    Ответ написан
    Комментировать
  • Как понять достоин ли ты более лучшей зар.платы или ещё не дорос и не надо высовываться даже?

    opium
    @opium
    Просто люблю качественно работать
    Чувак о каком достоин может быть речь если тебе не хватает грубо говоря на Доширак чтобы не умереть с голоду?
    Тебе повышения зп процентов на 50 чтобы не умереть вот и все, о каком достоинстве может идти речь?
    Или может ты их какого то знатного рода, тогда зачем ты работаешь за еду.
    Я понимаю когда там программист получает 200к и задаётся вопросом может я достоин получать 600к

    В таком случае речь идёт о выживании, либо поднять зп на текущем месте либо устроиться на новую работу и тут думать даже не о чем
    Ответ написан
    21 комментарий
  • Как реализовать распознавание кривых на canvas?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Готовых решений я не знаю, но есть следующие идеи.

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

    Составим функцию ошибки f(x1, y1, x2, y2) = (X(i/n)-x_i)^2+(Y(i/n)-y_i)^2. Тут x_i, y_i - координаты i-ого пикселя в нарисованной кривой, пронумерованные от 0 до n, X(t), Y(t) - координаты точки на кривой Безье - линейные комбинации x1, x2 и y1, y2 с известными вычисляемыми от t коэффициентами. Это фактически сумма квадратов расстояний от каждого пикселя до неизвестной кривой. Ее можно минимизировать подобно методу наименьших квадратов - считайте производную по всем переменным, приравнивайте к 0. Получите 4 неизвестные и 4 линейных уравнения. Можно вообще на бумажке руками методом Краммера решить, а можно алгоритмом Гаусса подсчитать.

    Тут есть допущение, что i-ый пиксель будет аппроксимироваться t=i/n точкой на кривой. Вообще говоря, это не гарантированно, но в качестве некой грубой меры оптимальности подойдет. Может вообще отлично работать будет и так, я не знаю. Поэксперементируйте. Но еще можно потом честно искать ближайшую точку на кривой к заданному пикселю как оптимум полинома 6-ей степени от t, когда все опорные точки кривой фиксированы. Тут надо брать производную, находить ее нули и среди них брать лучшее t. Чтобы найти нули полинома 5-ой степени можно рекурсивно брать производную, находить нули полинома меньшей степени, и потом на каждом монотонном отрезке искать пересечение с OX бинарным поиском. Или использовать метод Ньютона. Это давно решенная задача - должно быть куча готовых решений.

    Когда вы так научились считать расстояние от кучки пикселей до кривой Безье, можно локально градиентным спуском по 4-м координатам x1, x2, y1, y2 улучшать эту правильную метрику с оптимума полученного грубой метрикой.

    Вот мы и умеем аппроксимировать кучку пикселей одной кривой. Заодно мы получаем метрику близости кривой к пикселям. Но надо сделать ее не зависящей от длины - поэтому складывайте квадраты расстояний и делите на количество пикселей.

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

    Это эмпирический алгоритм и он много где жадный. Нет никакой гарантии, что он даст математически оптимальный результат, но есть много шансов, что он даст достаточно хороший результат.
    Ответ написан
    2 комментария
  • Невозможно создать Фейсбук менеджер,выдаёт ошибку или повторите позже и так 4 дня уже,раньше не создавала,в чем может быть дело?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    в чем угодно, аккаунт не подтвержден нпример
    Ответ написан
    Комментировать
  • Как сделать так, чтобы контейнер Docker был запущен постоянно?

    Вот этой командой вы создали контейнер и запустили одновременно.
    docker run -d -p 6000:6000 --name test-php test-php
    Подозреваю, что вы насоздавали уже кучу контейнеров. Команда запускается только один раз.
    Вот эта команда запустит уже созданный контейнер и всё - он работает и работает постоянно, пока его не остановить.
    docker start test-php
    Дальше нам нужно войти в контейнер, чтобы настроить его.
    docker exec -it test-php bin/bash
    Тут у вас не запущен php, нужно было бы по-хорошему добавить в билд автостарт . Если php, то я работаю с nginx, вам нужен апачи и mysql я тоже сюда же вношу, у меня выглядит так, вам немного исправить. Опять же я настраиваю свой докер из под Убунты и не знаю какой образ идет с php:apache, возможно я в корне не прав.
    Это автостарт, его в конце докер-файла прописать:
    RUN touch /start
    RUN chmod +x /start
    RUN echo '#!/bin/bash' >> /start
    RUN echo "service nginx start" >> /start
    RUN echo "service mysql start" >> /start
    RUN echo "service php7.4-fpm start" >> /start


    Можно просто запустить php командой service php7.4-fpm start если у вас 7.4 версия, как в обычной системе, если я правильно всё понимаю. Я не знаю, что у вас за образ, вот в чем дело, не работал никогда с таким, я писал для убунты, команды для нее собственно.
    Ответ написан
    Комментировать
  • Почему многие крупные сайты тормозят по самые помидоры?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Например в Эльдорадо менеджеры повелись на маркетинг 1С и выбрали битрикс, не спросив технарей. В его оптимизацию и заточку под нужды компании грохнули миллионы, но как ни старайся - это битрикс, он будет тормозить и глючить.
    Ответ написан
    5 комментариев
  • Как с помощью HTML кода вывести миниатюру сайта в окошке и кликабельным с переходом на него?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    никак

    но вы пробуйте, может что уже внедрили )))
    Ответ написан
    Комментировать
  • Что делать, если с именем нашего стартапа зарегистрировали торговую марку в США?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    Согласиться с максимальной задержкой по времени передачи сайта и получить деньги.

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

    Все время, пока вы не передадите домен, активно продвигать ваш продукт под новым именем, предупреждая пользователей что текущее имя уходит другому продукту.
    Ответ написан
    Комментировать
  • Какой уровень Python должен быть у начинающего Junior DevOps инженера?

    saboteur_kiev
    @saboteur_kiev Куратор тега Python
    software engineer
    Хочу понять что именно нужно знать и уметь писать на Python чтоб я смог считаться Junior DevOps инженером.

    Можно вообще не знать питон.
    Devops не разработчик на питоне. Это сисадмин в области настройки ci/cd, для чего надо уметь работать с инструментами, которые позволяют в CI/CD, разбираться в том, как разрабатываются сейчас продукты и как они запускаются, разбираться в мониторинге.

    И вообще Junior Devops - это моветон. В девопсы приходят или после опыта системного администрирования или опыта разработки. Ну еще изредка могут из L3 перейти.
    Но никак не с нуля и сразу в девопсы. Исключения крайне редки и чем-то всегда обоснованы.

    Но если хочешь написать что-нить на питоне девопсное - поставь какой-нить прометеус и к нему на питоне напиши скриптик для снятия каких-либо показателей. Добавь в прометеус визуализацию и будешь мониторить какой-нить свой показатель.
    Ответ написан
    Комментировать
  • Как правильно захардкодить запрос с https на http?

    ky0
    @ky0 Куратор тега Nginx
    Миллиардер, филантроп, патологический лгун
    На текущем этапе нет желания переводить scope сервер на https

    Я бы подождал, пока появится желание. Вы зачем-то хотите развернуть вспять процесс эволюции :)
    Ответ написан
    1 комментарий
  • Почему много людей в IT недовольны своей работы?

    У каждого своя причина. Кто-то выгорел, кто-то просто устал. Со временем понимаешь что зп это не главное, да и зарплата в IT не такая уж и большая. И что ты каждый день сидишь по 14, 16 а иногда по 18 часов в день перед монитором. Никакой физической активности. Решаешь какие-то странные хочухи клиентов. Результат твоей деятельности мало кто увидит, большая часть твоего кода уйдет на помойку. Что каждый день выходят новые языки, фреймворки. Что количество данных, которые нужно пропускать через мозг, растет с каждым днем. А мозги только стареют. Помнишь Ваас рассказывал про безумие? Так вот, это оно. Каждый день ты залипаешь перед монитором, пытаясь решать кем то придуманную проблему. У тебя уже искривление позвоночника, зрение -5, туннельный синдром где-то не за горами. А ничего, кроме как пялиться в монитор, ты не умеешь.
    Ответ написан
    31 комментарий
  • Какие книги подробно описывают устройство процессора?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Ответ написан
    Комментировать
  • Как можно сделать такой живой дым на сайте css и js?

    profesor08
    @profesor08 Куратор тега CSS
    Можно попробовать сделать такой дымок AfterEffects, наверняка есть куча туториалов. Потом экспортировать с помощью bodymovin в json формат для lottieweb

    Еще можешь попробовать использовать партиклы и заставить двигаться как надо
    stemkoski.github.io/Three.js/Particle-Engine.html
    squarefeet.github.io/ShaderParticleEngine

    Собственно вот похожее: https://mrdoob.com/#/144/magic_dust
    Ответ написан
    Комментировать
  • Можно ли MongoDB использовать вместо MySql для обычных задач?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    Так что MongoDB перекрывает основные функции MySql?


    Основная функция mysql и всех других реляционных баз данных - реляции.
    То есть работа с множественными таблицами и связями между этими таблицами. Все эти join

    Если вам это не нужно, вы можете придумать свою логику хранения данных и хранить хоть в монго, хоть в csv файле
    Ответ написан
    Комментировать
  • Можно ли настроить передачу SQL запросов через RabbitMQ?

    inoise
    @inoise
    Solution Architect, AWS Certified, Serverless
    Надо писать самостоятельно. И стоит добавить что RabbitMQ не предназначен для данных задач. Задумана какая-то дичь
    Ответ написан
    2 комментария
  • Как правильно делпоить на AWS?

    @rPman
    Имя файла с его хешем или версией - норма! Помимо косяков браузеров, которые в различных граничных ситуациях кешируют то что нельзя, есть еще корявые провайдеры - делающие это кеширование прозрачным.

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

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

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

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

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

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

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    const elementSettings = {
      welcome: {
        placeholder: 'Type welcome message...',
        question: '',
        isDescription: false,
        description: '',
        startButtonText: 'Start',
      },
      checkbox: {
        placeholder: 'Type question or statement...',
        question: '',
        isDescription: false,
        description: '',
        options: [] as string[],
        multiple: false,
      }, 
      dropdown: {
        placeholder: 'Type question here...',
        question: '',
        isDescription: false,
        description: '',
        options: [] as string[],
      },
      rating: {
        placeholder: 'Type question...',
        question: '',
        isDescription: false,
        description: '',
        steps: 10,
        defaultRate: 0,
        shape: 'stars',
      },
      text: {
        placeholder: 'Type question...',
        question: '',
        isDescription: false,
        description: '',
        maxLength: 99999,
      }, 
      slider: {
        placeholder: 'Type question...',
        question: '',
        isDescription: false,
        description: '',
        steps: 10,
      }, 
      thanks: {
        placeholder: 'Type message...',
        question: '',
        isDescription: false,
        description: '',
      }
    } as const;
    
    type Editable<T> = { -readonly [P in keyof T]: T[P]; };
    type ElementSettings = typeof elementSettings;
    
    export function getElementSettings<T extends keyof ElementSettings>(type: T): Editable<ElementSettings[T]> {
      if(type in elementSettings) {
        const settings = {...elementSettings[type]};
        if('options' in settings) {
          (settings as {options: string[]}).options = (settings as {options: string[]}).options.slice();
        }
        return settings;
      }
      throw new Error("element type doesn't match!");
    }
    Ответ написан
    Комментировать
  • Типизация функции, возвращающей разные объекты?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Проще всего сделать так, ts сам подберёт типы:
    const elementDefaults = {
      'welcome': {
        placeholder: 'Type welcome message...',
        question: '',
        isDescription: false,
        description: '',
        startButtonText: 'Start',
      },
      'checkbox': {
        placeholder: 'Type question or statement...',
        question: '',
        isDescription: false,
        description: '',
        options: [] as string[],
        multiple: false,
      }, 
      'dropdown': {
        placeholder: 'Type question here...',
        question: '',
        isDescription: false,
        description: '',
        options: [] as string[],
      },
      'rating': {
        placeholder: 'Type question...',
        question: '',
        isDescription: false,
        description: '',
        steps: 10,
        defaultRate: 0,
        shape: 'stars',
      },
      'text': {
        placeholder: 'Type question...',
        question: '',
        isDescription: false,
        description: '',
        maxLength: 99999,
      }, 
      'slider': {
        placeholder: 'Type question...',
        question: '',
        isDescription: false,
        description: '',
        steps: 10,
      }, 
      'thanks': {
        placeholder: 'Type message...',
        question: '',
        isDescription: false,
        description: '',
      }
    }
    
    
    export function getElementSettings<E extends keyof typeof elementTypes>(type: E) {
      if(!(type in elementDefaults)) throw new Error("element type doesn't match!");
      return elementDefaults[type];
    }

    Но если хочется по правилам, то как-то так:
    type ElementSetting = {
      placeholder: string;
      question: string;
      isDescription: boolean;
      description: string;
    }
    
    type ElementSettings = {
      welcome: ElementSetting & {
        startButtonText: string;
      },
      checkbox: ElementSetting & {
        options: string[];
        multiple: boolean;
      },
      dropdown: ElementSetting & {
        options: string[];
      },
      rating: ElementSetting & {
        steps: number;
        defaultRate: number;
        shape: string;
      },
      text: ElementSetting & {
        maxLength: number;
      },
      slider: ElementSetting & {
        steps: number;
      },
      thanks: ElementSetting
    }
    
    const elementDefaults: ElementSettings = {
      'welcome': {
        placeholder: 'Type welcome message...',
        question: '',
        isDescription: false,
        description: '',
        startButtonText: 'Start',
      },
      'checkbox': {
        placeholder: 'Type question or statement...',
        question: '',
        isDescription: false,
        description: '',
        options: [],
        multiple: false,
      },
      'dropdown': {
        placeholder: 'Type question here...',
        question: '',
        isDescription: false,
        description: '',
        options: [],
      },
      'rating': {
        placeholder: 'Type question...',
        question: '',
        isDescription: false,
        description: '',
        steps: 10,
        defaultRate: 0,
        shape: 'stars',
      },
      'text': {
        placeholder: 'Type question...',
        question: '',
        isDescription: false,
        description: '',
        maxLength: 99999,
      },
      'slider': {
        placeholder: 'Type question...',
        question: '',
        isDescription: false,
        description: '',
        steps: 10,
      },
      'thanks': {
        placeholder: 'Type message...',
        question: '',
        isDescription: false,
        description: '',
      }
    }
    
    
    export function getElementSettings<E extends keyof ElementSettings>(type: E): ElementSettings[E] {
      if(!(type in elementDefaults)) throw new Error("element type doesn't match!");
      return elementDefaults[type];
    }
    Ответ написан
    1 комментарий