Задать вопрос
  • Быть разработчиком веб-сайтов невыгодно?

    AngryYumy
    @AngryYumy
    Заплати фрилансеру чеканой монетой
    Боже сижу на тостере уже 2 год, но ласт полгода не заходил , но список топ вопрос так не изменится.
    Аля хочу стать "вставь свою профу" - я чел идейный , я люблю эту профессию, но вот как-то нету миллионов которые мне тот мужик на курсах обещал. А есть только лендосы за 500, которые с правками делаются месяц(((
    И ты глянь вроде полно разрабов - а работать то некому, а почему - да все просто ибо рынок переполнен людьми с курсов которые готовы работать за 500р но ничего толком не умеют. А с чего такие выводы? Да все просто не раз уже приходят - сколько стоит Х проект ты говоришь Х₽ и Х дней, и ответ - оооо нет мне там вон Вася за сутки и 500р сделает , ну окей идите. Через две недели приходит тот же человек и говорит , ну тут Василий все сделал - но потом немного правок (правок больше чем тз сайта) , а он пропал можете доделать за 500р. Или пример вон знакомый в скилл боксе полгода учился, насколько знаю обучение там не дёшево, а итог попросил его сверстать лендос (у самого времени не было) так он дата атрибут не умеет прописывать (реальная история).
    А к чему эта простыня текста? Да к тому, что если ты реально что-то умеешь - то ты не будешь работать за 10к/2 месяца
    Ответ написан
    1 комментарий
  • Какую нишу IT лучше занять?

    @dimoff66
    Кратко о себе: Я есть
    Мне 20 лет, заканчиваю в след. году колледж со специальностью «информационные системы»


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

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Сборщики мусора (далее GC) бывают разные, в том же v8 используется сразу 3 типа GC в зависимости от поколения объектов (упрощенно молодое, старое и сложные случаи), но в большинстве своем принцип работы сводится к просчету достижимости из некоторого корня в дереве объектов (например глобального объекта, но не только его). v8 не является исключением, и его GC содержит C++ api для создания таких корней. Из JS мы данным api можем воспользоваться лишь косвенно, через сущности языка предоставляемые либо самим v8 либо платформой (браузером, node.js, deno и т.д.)
    Чтоб было понятно давайте рассмотрим простой пример:
    const h = 'Hello world!';
    const n = 'nothing';
    setTimeout(() => {
      console.log(h);
    }, 1000);
    У нас есть строковые переменные h и n. Переменная n нигде больше не используется и ее память очистится при ближайшей работе GC. А вот переменная h оказалась в замыкании созданном стрелочной функцией. И хотя в JS мы не можем достучаться до h имея ссылку на эту функцию, сама функция все таки имеет ссылку на h, а значит h не может быть уничтожена пока не будет уничтожена сама функция. В терминах GC ссылка на h будет серой, то есть сама ссылка на h недоступна из корня напрямую, но сейчас мы проверяем объекты, которые на нее ссылаются и истина будет зависеть от них (подробнее можете погуглить "mark black white and gray memory in gc").
    Давайте посмотрим на саму стрелочную функцию, которая держит h в замыкании. Из кода видно, что мы ее передаем в функцию setTimeout, о которой известно, что это api предоставленное платформой (а значит вероятно какая-то часть написана на C++), а так же, что она асинхронная. Платформе реализующей setTimeout наша функция понадобится после асинхронного ожидания и никто платформе не сможет гарантировать, что во время этого ожидания не будет работы GC, поэтому ей ничего не остается, кроме как запросить у v8 создание нового корневого дерева объектов, в которое и будет положена ссылка на данную функцию.
    После же выполнения таймаута платформе больше не нужна наша функция, поэтому ссылка на нее будет удалена из дерева объектов. А так как других ссылок на функцию нет, и она больше не доступна ни из одного корня - GC удалит из памяти и функцию и строку связанную h, которая так же стала недоступна из корня.

    Посмотрим на пример из вопроса. У нас есть стрелочная функция, которая удерживает на себе инстанс компонента через this ссылку (так как стрелочные функции замыкают this). Саму функцию в памяти удерживает промис порожденный вызовом loader('url'), так как мы отдали её в метод then. Других ссылок на данную функцию нет, а значит и сама функция и ее замыкание (инстанс компонента) будут "жить" не менее "жизни" промиса.
    Скажем был отправлен запрос на сервер, но потом компонент в котором был объявлен промис и колбек был удален.
    И после удаления приходит ответ от сервера, и он выполнит колбек. Это значит что колбек остался в памяти со всеми переменными контекста
    Если других ссылок не осталось, то инстанс компонента будет удерживаться от очистки через промис.

    Теперь стоит разобраться с самим промисом. У него может быть 3 состояния - pending, resolved или rejected. После перехода в состояния resolved или rejected промис может выполнить сохраненные колбэки в ближайшем микротаске, а после он удалит на них ссылки из себя, в следствии чего, память удерживаемая замыканием колбэка может быть очищена (при отсутствии на нее других ссылок, достижимых из какого-либо корня).
    В состоянии pending промис может потенциально находится бесконечно долго, при этом ссылаясь на все колбэки переданные ему в методы then, catch или finally, а значит так же косвенно ссылаясь на их замыкания. И тут все зависит от того, кто ссылается на данный промис, и достижим ли он из корня. И да, промис вполне может быть удален из памяти так и не дождавшись своего завершения.
    интересное умозаключение
    Если Promise - это обещание, то в данном случае оно будет нарушено?


    В комментах к вопросу есть еще один интересный пример:
    function getSomething(){
      return new Promise((resolve, reject)=>{
        if(sys_condition){
           resolve();
        } 
      })
    }
    
    function testPromise(){
      let config = {....}
      getSomething().then(()=>{
         #use config
         goOn(...config)
      })
    }
    
    testPromise();
    У нас есть вызванная 1 раз функция testPromise, которая получает из функции getSomething промис, в который с помощью метода then сохраняет колбэк, удерживающий в замыкании переменную config. Сам промис она нигде не сохраняет, что здесь очень важно.
    В функции getSomething мы просто возвращаем промис созданный через его конструктор, который как мы уже знаем нигде больше не сохраняется. И на этом могло бы все и закончится, без вызова колбэка независимо ни от чего. Но конструктор промиса выполняет свой колбэк синхронно, а кроме того он передает в него 2 функции - resolve и reject, которые в своем замыкании ссылаются на только что созданный промис (а это уже 2 ссылки на него, хотя мы то его никуда не сохраняли). Переменная reject никак не используется, а значит спокойно может быть удалена после завершения колбэка. Переменная resolve просто вызывается как функция внутри условия, но более тоже никак не используется и никуда не сохраняется, а значит так же может быть удалена.
    В этом примере. если sys_condition = false и resolve не вызовется, это значит что создается утечка памяти
    Нет, утечки памяти не будет. Колбэк созданный в testPromise будет удален вместе с замыканием, так и не вызвавшись ни разу.
    Ответ написан
    3 комментария
  • Как устроить склонение произвольных русских слов по падежам на php?

    Не будет рекламой если моя библиотека делает то, что нужно?
    morphos.io/try/numerals?number=&word=%D0%BF%D0%B8%...
    Ответ написан
    Комментировать
  • Git есть ли способы без болезненного решения конфликтов?

    DevMan
    @DevMan
    а какая там боль вообще? разрулил конфликты - и всех делов. даже автоматом, если уверен.

    а не хочешь конфликтов - комить чаще.
    Ответ написан
    Комментировать
  • Почему в Linux приложение может удалить само себя, а в Windows нет?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    Когда процесс открывает файл, он открывает дескриптор на определенную структуру данных. Эта структура содержит аттрибуты файла, права доступа, информацию о том, где хранятся данные файла и так далее.

    В Win и *nix эта информация хранится в разных местах, и соответственно лок происходит по-разному.

    В POSIX системах (unix, linux, etc.) информация о файле хранится iNode, а имя файла уже ссылается на iNode.

    В Windows и DOS изначально информация о файле хранилась в структуре которая называется Directory Entry. В NTFS это немного изменилось, но подход они не меняли либо для обратной совместимости, либо не видели в этом нужды.

    Собственно отсюда исторически и выросло, что в *nix при открытии файла дескриптор указывает на iNode, а само имя файла можно при этом свободно удалять, или делать несколько имен ссылающихся на одну iNode (hard link), которые можно произвольно менять, пока "файл открыт".

    В Windows лочится непосредственно Directory Entry (или ее аналог в NTFS), следовательно его модифицировать в этот момент нельзя.

    У обоих подходов есть свои плюсы и минусы и история. Пока нет предпосылок к тому, что на Windows захотят изменить подход.
    Ответ написан
    Комментировать
  • Кем можно работать?

    php666
    @php666
    PHP-макака
    Кем можно работать?
    Курьером

    Уже на стадии завершения
    на стадии завершения изучения html/css ты будешь примерно лет через 5-7 реальной практики.
    Ответ написан
    Комментировать
  • Что считается уровнем Advanced? И в каких "вещах" должен разбираться специаист, чтобы считаться сциалистом высокого уровня?

    @deliro
    Чтобы выгодно отличаться от javascript-разработчиков, нужно быть не только javascript-разработчиком, но и разработчиком.

    Это единственное и самое важное.
    Ответ написан
    2 комментария
  • Как защитить JS код?

    yarkov
    @yarkov Куратор тега JavaScript
    Помог ответ? Отметь решением.
    Спрятать не выйдет, а вот затруднить немного чтение вполне. Например с помощью обфускации. Но будьте готовы к увеличению объёма кода.
    Например console.log('Лол, кек, чебурек'); превратиться в
    var _0xac52=["\u041B\u043E\u043B\x2C\x20\u043A\u0435\u043A\x2C\x20\u0447\u0435\u0431\u0443\u0440\u0435\u043A","\x6C\x6F\x67"];console[_0xac52[1]](_0xac52[0])
    . Оно вам надо? ИМХО всё это детский сад.
    Ответ написан
    5 комментариев
  • VS Code в autocomplete не отображает методы и функции из lib.dom для this...?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Главное что нужно понять, что из коробки в VSCode подсказки в JS основаны на TypeScript, их можно расширить плагинами, но основа все равно останется именно такой.
    Так как в JS статических типов нет, VSCode пытается вывести тип с помощью TypeScript, но TypeScript делает это далеко не идеально.

    В случаеconst cnt = document.querySelector('.container')тип можно вывести однозначно - это тип Element, а все потому, что TS знает, что значение в const точно не изменится и просто берет возвращаемый тип для document.querySelector и выводит подсказки для него.

    В случае же с this.$element значение может поменяться, в том числе где-то из вне, и JS вполне позволяет изменить его на что угодно, поэтому выводится тип any, для которого подсказок нет.

    Я не буду Вас агитировать перейти на TypeScript, как и расписывать, насколько он экономит время при разработке чего-либо сложнее 10-20 строчек кода. Я просто подскажу, что TS в VSCode можно врубить и для обычных JS файлов, даже не имея tsconfig.json, достаточно просто добавить комментарий // @ts-checkв начало файла, и Вы получите сразу и больше подсказок, и некоторый контроль типов. Так же добавлю, что в js файлах можно аннотировать типы через jsdoc:
    // @ts-check
    export class Page {
        constructor(selector, options) {
            /** @type Element */    
            this.$element = document.querySelector(selector)
            this.$element // тут работают подсказки после точки для типа Element
        }
    }
    Ответ написан
    1 комментарий
  • Джун - это обязательный стаж, или хватит навыков и знаний которые присуще джуну?

    aRegius
    @aRegius
    Python Enthusiast
    Если серьезно - вы забиваете себе голову мусором, который вам самому же и мешает/будет мешать. Чтобы устроиться на работу (вне зависимости от ваших стартовых данных), нужно контактировать с потенциальными работодателями и ходить на собеседования. Это все.
    Ответ написан
    Комментировать
  • Как сделать звонок с сайта на laravel?

    anton_reut
    @anton_reut
    Начинающий веб-разработчик
    <a href="tel:+79110000000">Позвонить!</a>
    :)
    Ответ написан
    Комментировать
  • Разработчик недисциплинированно трекает время. Что делать?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    А зачем вообще трекать время? Уложился в дедлайн - молодец. Не уложился - разбор полётов. Хронически не укладывается - понижение грейда или увольнение.
    Ответ написан
    21 комментарий
  • Какие есть best practices при смешивании вёрстки с php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Оооо, я в свое время заморачивался этим вопросом страшно, чтобы отрендереный хтмл выглядел аккуратно.
    И даже придумал вариант всегда начинать теги РНР в начале строки, а отступы похапешные делать внутри этой строки.

    <div blabla>
    <?php foreahch(): ?>
        <div blah>
    <?php    if(): ?>
            <table>
    <?php        foreach(): ?>
                <tr>

    Получилось в теории ровно но на практике еще более уродливо.
    А потом стал пользоваться шаблонизаторами и забыл про все эти куличики в песчнице
    Ответ написан
    2 комментария
  • Как сверстать подобные блоки?

    aliencash
    @aliencash
    Партизан
    Дизайнера на кол. Картинками делайте.
    Ответ написан
    4 комментария
  • Почему хром жрет время процессора?

    Jump
    @Jump
    Системный администратор со стажем.
    Почему хром жрет время процессора?
    Потому что может.
    Ответ написан
    Комментировать
  • Одобрите/покритикуйте выбор PHP для Fullstack Web разработчика в 2020 году?

    Adamos
    @Adamos
    Когда ты что-то берешь и учишь - у тебя есть шанс.
    Когда ты сидишь и опрашиваешь болтунов на Тостере - шанса нет.
    На такие вопросы здесь (да и где угодно) никогда не будет ни одного правильного ответа, кроме - кончай заниматься ерундой, занимайся изучением хоть чего-нибудь.
    Ответ написан
    2 комментария
  • Должен ли UX/UI дизайнер знать компоненты React/Vue?

    @vladdimir
    Верстальщик
    Реакт, Вью и прочие инструменты - это не Лпгенератор или Тильда)) Там компонент это абстракция, а не какая-то конкретная свистелка, поэтому хоть календарь с закгругленными углами, хоть с острыми - творите на здоровье)
    Нет разницы, что под реакт макет, что под вью, что под ваниллу.джэс.

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

    Другое дело, если вам самим хочется погрузиться в разработку. Если так, то думаю это перспективный вектор развития.
    Ответ написан
    Комментировать
  • Почему не работает AJAX?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    type: 'POST',
    Как вы тупите все, где вы берете этот код то? Метод, это МЕТОД ПОСТ, тип это тип возвращаемого ответа.
    data: new FormData(this),
    здесь контекст this уже совсем другой, учите основы, до аякса создайте переменную и ей присвойте $(this).serialize();
    Ответ написан
    Комментировать