• Подработка для js разработчика, где искать?

    Zoominger
    @Zoominger
    System Integrator
    Яндекс.Еда - заработаете столько, что JS-фрилансеры будут стоять, открыв рот от зависти.
    Ответ написан
    3 комментария
  • Способы подработки для Десктоп разработчика?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    для начинающего С# разработчика который еще в процессе обучения

    Устроится продавцом-партаймером в магазин бытовой техники или салон сотовой связи.
    Ответ написан
    1 комментарий
  • Должен ли фронтенд разработчик уметь верстать (css)?

    sim3x
    @sim3x
    1. Да, лучше верстальщика
    2. Все детали лучше оговорить до принятия оффера
    Как сформулировать уточнение процесса разработки зависит от того как вам поставили задачу
    Ответ написан
    Комментировать
  • Должен ли фронтенд разработчик уметь верстать (css)?

    @abbrakadabbra
    Фронт-энд разработчик не умеющий верстать, это как сантехник, не умеющий починить кран. CSS - это наверное самое легкое, что есть во фронт-энд, так что учите его, иначе вы не можете претендовать на его звание. Тем более на full-stack.
    Ответ написан
    Комментировать
  • Чем можно заменить Avocode или Photoshop?

    joeberetta
    @joeberetta
    Читай: https://epdf.pub/google-for-dummies.html
    Figma. Советую ее. Очень удобно для совместной работы дизайнера и верстальщка
    Ответ написан
    Комментировать
  • Подойдёт ли bootstrap для такой вёрстки?

    AleksandrB
    @AleksandrB
    Совсем недавно вывел "Hello world"
    Конкретно бутстрап тут не нужен, его сетку можно оставить, а все остальные стили все равно придется переназначать.
    Ответ написан
    Комментировать
  • Можно ли написать функцию, которая проверяет существует ли переменная или нет (js)?

    @Interface
    Дисклеймер: так как вопрос скорее теоретический, я не стараюсь предоставить "адекватное" решение.
    Конечно, все это нельзя использовать в реальном проекте!


    Интересный вопрос.

    Начнем с того, что определимся насколько критично сохранить сигнатуру функции? В зависимости от этого, решения можно поделить на 2 категории:
    - где допускается изменение сигнатуры
    - где сигнатура должна быть строго такой и никакой иначе

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

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


    Сначала рассмотрим несколько решений с изменением сигнатуры: они попроще и в каком-то смысле более логичны.

    есть как минимум 2 категории решений с изменением сигнатуры:
    - функция будет принимать строку
    - функция будет принимать функцию

    При этом проблема того, что все падает до попадания в функцию, пропадает сама собой.

    вот несколько решений:

    1) класс решений построенный на анализе кода в рантайме:
    решение заключается в том, что вызываемая функция анализирует свой код (а также код функции которая вызвала ее и т.д.)
    https://stackoverflow.com/questions/2051678/gettin... вот тут есть частчный разбор такого решения.
    Приводить его в виде кода я не буду :)

    Плюсы:
    - вроде как решает задачу
    - сигнатура изменилась не сильно
    Минусы:
    - крайне жирное решение с точки зрения производительности
    - сигнатура не та, что просили
    - нельзя использовать 'use strict', так как решения возможно будут завязаны на arguments.callee.caller

    Уровень безумия: достаточно безумное

    2) решение построенное на том, что приниматься будет функция:
    isExists(() => someVar); // такая будет сигнатура

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

    Одна из возможных реализаций:
    function isExists(someVarFn){
        try {
            someVarFn();
        } catch(e) {
            if (e instanceof ReferenceError) {
                return false;
            }
            throw e;
        }
        return true;
    }

    Примеры использования:
    function f1() {
        let x;
        console.log(isExists(() => x)); //  => true
        console.log(isExists(() => y)); //  => false
    }
    
    function f2() {
        let x;
        console.log(isExists(() => x)); //  =>  true
        console.log(isExists(() => y)); //  => false
    }
    
    f1();
    f2();


    Плюсы:
    - плюс-минус адекватная производительность
    - довольно компактно
    Минусы:
    - несильно меняется сигнатура функции
    - api получается несколько не очевидным

    Уровень безумия: почти адекватное

    3) решения с использованием eval:
    Суть похожа на решение #2, но с другим api:
    function isExists(varName, fn){
        return fn(`(()=>{
            try {
                const nop = ${varName};
            } catch(e) {
                if (e instanceof ReferenceError) {
                    return false;
                }
                throw e;
            }
            return true;
        })()`);
    }
    
    function f1() {
        let x;
        console.log( isExists('x', c => eval(c)) ); //  => true
        console.log( isExists('y', c => eval(c)) ); //  => false
    }
    
    function f2() {
        let y;
        console.log( isExists('x', c => eval(c)) ); //  =>  false
        console.log( isExists('y', c => eval(c)) ); //  => true
    }
    
    f1();
    f2();


    Плюсы:
    - сложнее чем в №2 передать какую-то фигню
    Минусы:
    - сигнатура отлиается сильнее и уродливей
    - сложнее / жирнее / больше чем №2

    Уровень безумия: безумненько

    Решения с сохранением сигнатуры:

    4) магия es6 Proxies + with
    класс решений строится на стратегии: слушать доступ к глобальному объекту и если он происходит и в нем нет переменной с таким именем - такой переменной нет:
    const pseudoUndefined = {};
    
    const scopeTrap = new Proxy(window, {
        has() {return true},
    
        get(target, prop) {
            if (prop in window) {
                return window[prop];
            } else {
                return pseudoUndefined;
            }
        }
    })
    
    function isExists(someVar) {
        return someVar !== pseudoUndefined;
    }
    
    // весь код использующий функцию должен быть обернут в такой with :(
    with (scopeTrap) {
    
        let y;
        console.log( isExists(x) ); //  =>  false
        console.log( isExists(y) ); //  => true
    
    }


    Плюсы:
    - мы сохранили желаемую сигнатуру! Ура!
    Минусы:
    - теперь вместо исключения будет получаться что-то совсем левое. Хорошего дебагга! :D
    - накладные расходы производительности
    - все нужно обернуть в with
    - необходима поддержка es6+

    Уровень безумия: с точки зрения реализации - задача подъемная. использовать в бою - а вы знаете толк!

    Решения с предобработкой:

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

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

    Плюсы: ...
    Минусы: ...
    (Без комментариев)

    Уровень безумия: я думаю все понятно
    ...

    есть и более сдержанные решения, например, используя compile-time можно оптимизировать предыдущие решения:

    6) можно используя парсер составить дерево областей видимости (хэш-таблица [функция <-> список переменных]), привязать каждую область к функции, через позицию в исходном коде (возможно придется сохранять дополнительную информацию). А дальше все это интегрировать с решением №1.

    В итоге:

    Плюсы относительно (#1):
    - относительно хорошая производительность
    Минусы:
    - сложно
    - дорого
    - требует compile-time

    Уровень безумия: стало еще безумнее, чем было :)

    7) написать (или найти) плагин для babel'я (или чего-то другого), который будет трансформировать доступ к переменным в особую функцию

    Плюсы относительно (#1):
    - достигнут результат
    Минусы:
    - требует поддержки
    - требует compile-time
    - упадет производительность (вероятнее всего существенно)

    Уровень безумия: буднечно безумное
    Ответ написан
    3 комментария
  • Стоит ли хранить frontend 3 внешне похожих проектов в 1 репозитории и как с этим жить?

    Нет, не стоит. Разные проекты - разные репозитории.
    Ответ написан
    Комментировать
  • Как правильно организовать разработку на Laravel + Docker?

    У вас маленький проект и полноценный CI/CD к нему применить сложно - мало смысла в контейниризации, если нет необходимости скейлиться, балансировать и обеспечивать выживаемость сервиса. Разработка должна идти с использованием связки контейнеров с nginx, php-fpm, redis, postgresql и т.д. - при локальной разработке всё помещается в docker-compose.

    В проде - в вашем случае можно обойтись просто docker или с использованием того же docker-compose. В больших проектах на проде будет, например, kubernetes, nomad или docker swarm. Все контейнеры деплоятся и конфигурируются единожды. Ваш CI/CD должен собирать контейнер на основе alpine и php-fpm (для PHP) или nodejs (для nodejs, соответственно) с вашим проектом, желательно в пару стейджей для минимизации размеров окончательного образа, т.к. не нужен вам в проде композер, git, yarn, npm и прочие промежуточные штуки. И уже этот минимальный контейнер уезжает на прод.
    Ответ написан
    5 комментариев
  • Для чего в системе сеток бутсрапа большие отступы?

    profesor08
    @profesor08
    Какая разница, дизайнерам бутстрапа так понравилось больше. А так как там можно поменять размер отступов, то тем более нет никакой разницы, устанавливаешь что нравится и вперед.
    Ответ написан
    Комментировать
  • Где узнать про SCSS больше?

    0xD34F
    @0xD34F
    Ответ написан
    Комментировать
  • Событие нового дня?

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

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

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

    flapflapjack
    @flapflapjack
    на треть я прав
    фронтенд на то и фронтенд, что к любой его части у браузера есть доступ
    Ответ написан
  • Обязательно ли использование бутстрапа?

    rockfeeler
    @rockfeeler
    Фронтендер, дизайнер, верстальщик-перфекционист
    Не стоит. Он излишен, потому что хочет угодить всем. И я еще не встречал в своей практике ни одного проекта, для которого бутстрап был бы достаточен. Как правило, переписывать приходится 80% его кода.
    Бутстрап был актуален, когда не было флекс и грид. Теперь я хочу свою навбар и футер.)
    Ответ написан
    Комментировать
  • Как разрабатывают сервисы?

    Robur
    @Robur
    Знаю больше чем это необходимо
    По разному но вам подойдет OAuth или OpenID.
    Методов авторизации там больше одного, на все случаи жизни.
    Как это все работает - открывайте спеку или посты на эту тему с человеческим языком и читайте.
    Основное и главное - для этого нужен будет сервис который будет выдавать и проверять токены - либо готовый (все в гугле, например Auth0) либо свой (из опенсорса - keycloak вполне неплох)
    Остальные сервисы и приложения работают с этим сервером и доверяют ему больше чем себе. Протоколы стандартные так что библиотеки есть под все популярные языки/фреймворки.
    Правда не очень понятно зачем вам nodejs - токены JWT будет выдавать OAuth сервер. Хотя если он у вас написан на nodejs - то ок.

    Пример:
    пользователи на сайте авторизуются с именем и паролем на identity server (допустим это ваша нода), этот сервер возвращает помимо всего прочего в токене информацию о том что пользователю можно оставлять коменты (например добавлением scope: 'comment')
    php сервер получает запрос с токеном на создание коментария, открывает этот токен, проверяет у вашей ноды что этот токен настоящий (они подписаны) и если настоящий, смотрит, есть ли там scope:'comment' и если да - то создает комментарий.
    У админа будет например еще помимо возможности прокомментировать так же возможность удалить любой комментарий (например scope: 'comment-admin') - этот скоуп будет проверяться при удалении. А так же другие админские права.
    Так же comment-admin можно например дать модератору.
    Ответ написан
    3 комментария
  • Какую сделать весеннюю анимацию на сайте?

    0xD34F
    @0xD34F
    Никакую. Всё это неимоверная мерзость, словами не описать. Перестаньте издеваться над своими посетителями.
    Ответ написан
    1 комментарий
  • Почему не работает label вне формы?

    byte916
    @byte916
    Всё работает
    Единственная ошибка которая есть - в первой строчке не закрыт тег (но вряд ли в этом проблема)
    Напишите конкретнее что именно не работает.

    Других не слушайте, они несут глупости про спецификации. Спецификация (1, 2) не запрещает связывать с формой и при этом помещать label куда угодно на странице. Они даже соответствующий атрибут (form) у label убрали из спецификации за ненадобностью.
    Labels are not themselves directly associated with forms. They are only indirectly associated with forms through the controls with which they're associated.

    The for attribute may be specified to indicate a form control with which the caption is to be associated. If the attribute is specified, the attribute’s value must be the ID of a labelable element in the same Document as the label element.
    Ответ написан
    Комментировать
  • Russian VAT on Upwork - привет, работа в белую?

    angrySCV
    @angrySCV
    machine learning, programming, startuping
    не понимаю почему удалили ответ -> он не нарушает ничьего законодательства.
    Если ты не заводишь деньги обратно в Россию, тогда у тебя нет объекта налогооблажения. Все что нужно это НЕ отправлять деньги в российские банки, а отправлять например себе на карту в payoneer (которая вне российской юрисдикции).
    Так делают все наши богачи и олигархи и это не является нарушением законодательства. Никаких налогов с этого платить не нужно, никаких головняков с отчетностью.
    Ответ написан