Задать вопрос
  • Программирования учат или применяют?

    Newto
    @Newto
    Добрый день. Я перечитал все ответы выше, а так же комментарии к ним. Решил прокомментировать, с точки зрения своего опыта(я занимаюсь разработкой уже более 15-ти лет). Для удобства чтения я буду писать по пунктам.

    1) Зубрёжка. Каждого из нас, кто ходил в школу, заставляли зубрить таблицу умножения. И, в конце-концов, это помогало в последующем обучении математики, не правда ли? В программировании есть такие же вещи, которые называются "стандарты". Вот эти стандарты и нужно, для начала, зазубрить. А позже и вникнуть, зачем они придуманы.

    2) Методика "объяснение и практика". Вы пишете, что "при таком способе мне приходится одно и тоже глазами несколько раз пробегать чтобы запомнить". Это, с моей точки зрения, в корне не верно. Ибо то, что вам объясняют, не нужно "пробегать глазами" несколько раз, что бы запомнить. Это вообще не нужно запоминать если это не те самые "стандарты"; это нужно осмыслить и понять. После того, как к вам придёт понимание как это работает, зачем и почему это надо -- вы сможете это использовать, осмысленно, в собственном коде.

    3) Платные курсы. Курсы ныне очень разные. Кто-то просто, простите, гребёт бабло на этом всём. А кто-то преподаёт с душой, хорошо и понятно рассказывая. Поэтому платный курс -- это хорошо, но только тогда, простите за тавтологию, когда это хороший курс. Читайте отзывы о курсе, советуйтесь с теми кто его уже прошёл(в идеале) и тогда уже решайте, тот ли этот курс, что даст вам необходимые знания.

    4) ВУЗ. Более 10-ти лет назад, у меня в подчинении, в вебстудии, работал PHP джун. Он доучивался в МГТУ имени Баумана. И он не знал ничего. Совсем. Мне приходилось объяснять ему простейшие вещи, типа что значит иструкция "$a += $b;". Сам же я учился в ВУЗе малоизвестном, на факультете "прикладная информатика в экономике" и наш преподаватель информатики, на первом курсе, на вопрос что значит в коде программы на языке C++ инструкция "с++" ответил, что это "так язык называется". Однако, вскоре ко мне начали ходить сокурсники, с просьбами "а напиши программку". И происходило это потому что я сам загорелся программированием, купил книжки, установил всё что нужно было установить на компьютер и начал "творить волшебство", как это мне тогда виделось, с горящими глазами. Короче говоря не нас учат ВУЗы, а мы учимся в ВУЗах или учимся без них. Тут уж как пойдёт.

    5) Ну и последний, самый важный, с моей точки зрения, пункт. Это Интерес. Если вам интересно программирование, вам нравится разбираться, что-то делать самостоятельно, а не только тогда когда кто-то поставил задачу, то у вас все получится. И как именно это всё учить у вас вопроса, в конце концов, не возникнет. Разбирайтесь, ковыряйте, вникайте и всё будет. Единственное что -- очень желательно, что бы перед вашими глазами были хорошие примеры. Потому что я, в свое время, тоже разбирался, учился и вникал, "гладили по голове", как писали выше в комментариях к одному из ответов, меня уже мои наниматели, потому что я все делал быстро и без ошибок, т.е. работало все так, как было нужно клиентам веб-студии, собеседование в которую я тогда прошел без каких-то проблем. Но вот мой код тогда был, откровенно говоря, тем, что сейчас называется "говнокодом". Потому что некому было мне показать как писать есть хорошо, а как есть плохо.

    Подыдожу -- ключи к быстрейшему развитию в деле разработки это ваш интерес к этому делу, желание им заниматься и примеры хорошего, качественного кода перед глазами. А так же кто-то, кто сможет технически оценить вашу работу и, без агра, с конструктивом, показать и рассказать что вы сделали не так.
    Ответ написан
    25 комментариев
  • Почему функция возвращает undefined?

    Alexandroppolus
    @Alexandroppolus
    кодир
    твоя задача - хороший пример, где не надо в рекурсию. Можно легко переписать на цикл:

    const removeParenthesesNR=(s)=>{
        let len = -1;
        while(len !== s.length) {
            len = s.length;
            s = s.replace(/\([^()]*\)/g, "");
        }
        return s;
    }


    но даже в этом варианте очень медленно работает на строках с большой глубиной вложенности скобок.

    вот, более быстрый способ:
    function removeParentheses(str) {
        const arr = [];
        let idx = 0, depth;
        while (idx < str.length) {
            const newIdx = str.indexOf('(', idx);
            if (newIdx < 0) {
                break;
            }
            arr.push(str.substring(idx, newIdx));
            
            for (depth = 1, idx = newIdx + 1; idx < str.length && depth; ++idx) {
                const c = str[idx];
                depth = depth + (c === ')' ? -1 : c === '(' ? 1 : 0);
            }
        }
        return arr.join('') + str.substr(idx);
    }


    если сравнивать на строках вида "(((((...)))))", то для глубины 100000 разница в скорости просто гигантская
    Ответ написан
    Комментировать
  • Насколько долгосрочна в обучении мотивация знать чего-то такое, чего не умеют другие?

    paran0id
    @paran0id
    Умный, но ленивый
    Знаете, поначалу многие хотят странного. Освоить FreeBSD, с нуля стать хакером, написать социальную сеть на ассемблере, первым автомобилем взять дедову Победу, научиться играть Цоя на гитаре, но чтоб на десятиструнной и без ладов.

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

    Знания "не для всех" придут с опытом. Кстати, совсем не обязательно, что эти знания будут ценными и полезными. Вы вполне можете слить лет пять на доскональное изучение какой-то местечковой фигни, которая нигде и никому больше не нужна.
    Ответ написан
    8 комментариев
  • Как повторно инициализировать форму?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Вообще инициализация формы проходит один раз.
    Я конечно не проверял, но гипотетически, если вы сохраните ссылку на event.detail.object, то вы в любой момент после инициализации сможете динамически их менять. Но это не точно.
    Ответ написан
    1 комментарий
  • Стоимость рефакторинга?

    Jeer
    @Jeer
    уверенный пользователь
    ну, вначале делается так называемый "аудит", смотрят, что есть. Далее принимается решение, можно ли это поддерживать и писать дальше. Насколько я понимаю, аудит уже проведен, предыдущий код летит в помойку. Обычно говорят что-то осмысленное, а не просто "разводят руками". Если доводы пролетают мимо ушей, тогда печально, сверху коммуникация с заказчиком не будет нормальной.
    А дальше с чистого листа, есть ТЗ, его оценивают по временнЫм трудозатратам, умножают на почасовую ставку - вот и цена
    Если вопрос именно "как технически оценить кодовую базу", по простому, должно быть удобно работать: дописывать новый код, менять старый, логи/метрики, стандартные технологии, соблюдение каких-то общепризнанных практик, кодстайла, выстроенные процессы сборки и публикации.
    Прям какой-то чеклист вряд ли сходу найдется, скорее всего они есть прям в каких-то специализированных аутсорсинговых конторах, но сомневаюсь, что это нужно
    Ответ написан
    Комментировать
  • Вопроса нет, и все?

    ThunderCat
    @ThunderCat
    {PHP, MySql, HTML, JS, CSS} developer
    Uncaught SyntaxError: Unexpected token < in JSON at position 0
    Читаем. Переводим.
    Открываем инструменты разработчика, вкладку нетворк. Отправляем наш гениальный запрос - смотрим в неменее гениальный ответ от сервера, в котором наверняка что-то типа "ой-вей, ваш пхп код полный шлак, в котором ошибок больше чем на помойной кошке блох". Исправляем ошибки, и - о чудо! Все заработало!
    Ответ написан
    Комментировать
  • Подработка программированием без диплома учебного заведения/сертификата о прохождении курса: возможно ли это?

    ThunderCat
    @ThunderCat
    {PHP, MySql, HTML, JS, CSS} developer
    Реально ли на первое время подрабатывать на небольшие суммы разработчиком какого-либо языка, самообучившись по книгам, видео-курсам и т.д. и создав портфолио с готовыми работами
    Сложно, не невозможно, но очень маловероятно. Чисто логически представьте себе такого работодателя, которому нужен малоопытный недоджун, работающий по пару часов в день. Что ему можно поручить такого, с чем бы опытный не справился за время в 10 раз меньше? Ну и в целом джунов/трейни берут с перспективой вырастить своего недорогого спеца, в вашем случае это со стороны нанимателя просто не перспективно.

    при этом не имея на руках никаких документов о получении специальности/квалификации? Или в любом случае необходим сертификат или СПО/ВПО?
    90% нанимателей чхать хотели на ваши сертификаты или дипломы, если вы умеете в продакшн. Программирование не является сертифицированным видом деятельности (то есть для выполнения работ работник не обязан иметь сертификат, как нарпимер в медицине), и в вашем случае это самое последнее что должно вас волновать.
    Ответ написан
    9 комментариев
  • После добавения нового элемента не работает событие onClick?

    Le_Traceur_Snork
    @Le_Traceur_Snork
    PHP-программист | Wordpress
    $(selector).click(); работает только на элементы, физически присутствующие в DOM на момент навешивания обработчика. Чтобы на динамически появляющихся тоже отрабатывало, нужно поставить обработчик таким образом:
    $(document).on('click', $(selector), function(){/* code here */});
    Ответ написан
    Комментировать
  • Как разбить текст на теги?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    можно создать временный элемент <template>, вставить в него этот HTML,
    и забрать из него DocumentFragment

    Фрагмент — это примерно как DOM-документ, его можно рекурсивно обойти через свойство children

    Например, в строке содержится такой HTML:
    <div>
      <p>Text</p>
      <ul>
        <li>Apple</li>
        <li>Banana</li>
      </ul>
    </div>
    И примерно такой код:
    const tmpl = document.createElement('template');
    tmpl.innerHTML = msg; // строка с HTML
    const df = tmpl.content; // DocumentFragment
    
    df.children // массив из одного элемента: наружний div
    df.children[0].children // массив с двумя эл.: параграфом и списком
    df.children[0].children[1].children[1].textContent // "Banana"
    Ответ написан
    2 комментария
  • Не работате .on('change') на добавленный через append input?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Надо «делегировать» — слушать события на общем родителе. Тогда свеже-созданные элементы тоже попадут в обработку – события на них «пузырьком» поднимаются вверх, там-то их и поймают.

    $('.table_body').on('change', '.input_ptp_tema', function() {


    См. Direct and delegated event handlers в документации к .on()
    Ответ написан
    1 комментарий
  • Как работает этот код? Почему у функции появляется метод?

    @LJ322
    const cancelable = fn => { // Создаётся функция cancelable, которая принимает функцию и сохраняет в переменную fn
      const wrapper = (...args) =>{ // Создаётся функция-обёртка, которая принимает любой набор аргументов
        if(fn) return fn(...args) // Если в cancelable была передана функция, то вызывает её с необходимыми аргументами
      }
    
      wrapper.cancel = () => fn = null // Добавляет свойство во wrapper для очистки переменной fn 
    
      return wrapper // Возвращает обёртку
    }
    
    const fn = par =>{ // Функция, которая оборачивается в декоратор со своим аргументом
      console.log('Function called, par:',par)
    }
    
    const f = cancelable(fn) // Создаёт обёртку вокруг fn
    
    f('first') // Function called, par: first
    f.cancel() // fn является переменной внутри cancelable, здесь мы её обнуляем
    f('second') // Ничего не выводит, потому что условие у wrapper отрабатывает, только если функция есть
    Ответ написан
    Комментировать
  • Tilda как получить название товара по клику на кнопку?

    @Asokr
    $(this).closest('.t-store__card__wrap_txt-and-btns').find('.t-store__card__title').text();

    Нет?
    Ответ написан
    6 комментариев
  • Куда нужно прописывать @import в gulp 4,чтобы установить библиотеку?

    max_samusevich
    @max_samusevich
    Email and web development, UX/UI design
    По поводу самой директивы @import в main.scss: сейчас рекомендуется использовать вместо неё @use, общий смысл остаётся тем же. Подробнее можете прочитать на официальном сайте.

    Для подключения стилей библиотеки нужно прописать правильный путь до файла относительно того файла, в который подключаете, main.scss в вашем случае. Где у вас лежит библиотека, в node_modules? Относительный путь выглядит, например, так: ../../node_modules/tippy.js/dist/tippy.css: это значит выйти на один уровень папок выше два раза (две точки), затем зайти в несколько папок вглубь и выбрать нужный файл. Я думаю, вас запутал путь до CSS файла, указанный в описании пакета npm, там путь указывается для импорта с помощью ES modules в js файл, чтобы потом собирать с помощью бандлеров типа Webpack. Вы хотите подключить CSS файл в SCSS, так что попробуйте прописать путь, как я описал.

    Для подключения JS части библиотеки потребуется import в ваш main.js или index.js с помощью ES modules, как описано на странице пакета библиотеки. В идеале потом, чтобы бандлер обработал Js: собрать в один файл, Babel, минификация и другие операции с JS кодом. Можно, конечно, и с помощью Gulp сконкатенировать все JS файлы без бандлеров, но нужно следить за порядком конкатенации, есть и другие нюансы, и это в целом неудобно. Я использую связку Gulp для всего кроме JS, а Webpack — для JS, соединяются они через webpack-stream.

    Чтобы заработали ES modules, добавьте "type": "module" в ваш package.json.

    Удачи)
    Ответ написан
    Комментировать
  • Как сделать анимацию js автоматической в мобильной версии?

    SPART4K
    @SPART4K
    Middle Front-end Developer (Vue.js/Nuxt.js)
    Можете в js написать функцию которая будет вызываться при открытии страницы и в ней возвращать Window.innerWidth
    Например:
    fucntion isMobile() {
    return Window.innerWidth < 768
    }


    Или же через проверку на устройство
    window.mobileCheck = function() {
      let check = false;
      (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) check = true;})(navigator.userAgent||navigator.vendor||window.opera);
      return check;
    };


    Далее добавляйте класс к нужному блоку с анимацией и она будет проигрываться
    Ответ написан
    3 комментария
  • Где можно собрать команду для разработки игры?

    Jacen11
    @Jacen11
    чтобы все на энтузиазме работали

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

    evnuh
    @evnuh
    Поиск Гугл помог мне, впусти и ты его в свой дом
    Ну типа жил был транзистор значит. И он был такой весь из себя крайне радикальный - не было у него по жизни других настроений, кроме двух - либо он говорил всем "да" и пропускал через себя всё, что в одно ухо (левая дырка) влетело, то из другого (правая дырка) сразу вылетало. Либо же настроение его могло поменяться, тогда он становился крайне негативным и переставал пропускать себя любую информацию - замыкался в себе, думал о главном.
    А настроение его зависело от того, насколько хорошо он питался. Суёшь ты ему в рот (третья дырка) нормальное питание - он добрый, на всё согласен, информацию через себя пропускает. Чуть только начинаешь его кормить меньше, чем он хочет (есть у него определённый уровен неообходимого питания) - он тут же отключался от мира и ни на что не реагировал, пока снова не пихнёшь ему в рот достаточноого питания. Так и получилось, что аналоговый уровень питания, то есть количество еды, которое ты ему кладёшь в рот, в итоге превращается в бинарное значение - 0 или 1 на правом ухе.

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

    И вот в современных процессорах миллионы этих транзисторов (если быть точнее, то на текущий момент около 1,400,000,000) спаяны вместе. чтобы распознавать входные команды и выдавать результат по заданной схеме.

    Ты спросишь, мой маленький друг, как же розетка соединяется с процессором? Как эти 220В превращаются в 0 и 1 на моём мониторе?. А всё дело в том, что блок питания преобразует переменный ток в постоянный, который потом подаётся на процессор. Блок питания совсем не мудрёный - пара диодов и трансформатор, можешь даже собрать его сам дома из говна и палок. А интересное дальше.
    Но если подать ток на схему из транзисторов - то они застынут в одном положении, заданном схемой, и ничего происходить не будет? Да, ты прав, чтобы компьютер считал, необходимо менять ток на его входных ножках, тем самым отдавая ему разные команды. Но тут возникает проблема синхронизации - поменять напряжение одномоментно невозможно (физика, типа, химия там, электроны бегают, заряд меняется, дырки должны образоваться успеть) - нужно определённое время. Поэтому придумали "частоту". Рядом с транзисторами сидит важный кристалик, который генерирует ток по синусоиде с равномерной частотой. Эта синусоида немного рихтуется, превращаясь в бесконечный поток "есть питание" и "нет питания" меняющийся с одинаковой частотой. На графике это выглядит как пила, примерно. И вот все договорились, что будут засекать момент, в котором "всё готово", все транзисторы заняли своё положение и всё устаканилось и наконец можно считать выходной результат, например, на верхушке зубчика пилы, то есть когда генератор частоты дал 1. И вот совремменные процессоры делают это с частотой 2 гигагерца, то есть 2 миллиарда раз в секунду все транзисторы в процессоре меняют своё состояние.

    P.S. Я сделал небольшое допущение. На самом деле в правом ухе не 1 и 0, а точно такое же напряжение, которое ты подал на левое ухо, если транзистор включён, либо никакого, если выключен. Но чаще всего это потсоянный небольшой ток. Благодаря уровню необходимого питания на ртах у транзисторов, этот небольшой ток может быть либо меньше необходимого (0), либо больше, при котором транзистор включается(1). Это всё зависит от того, из чего сделан транзистор. Это уже химия, дружок. Сплавы всякие, металлов. Они ещё полупроводники называются, потому что до конца не определились, готовы они всегда пропускать ток, или никогда. Этим тохитрые людишки и воспользовались, заставляя полупроводники менять своё настроение и позволять тебе играть в майнкрафт.
    Ответ написан
    5 комментариев
  • Как переместить ось Y chart.js в другую сторону?

    Fragster
    @Fragster
    помогло? отметь решением!
    https://www.chartjs.org/docs/latest/axes/cartesian...

    const config = {
      type: 'bar',
      data: data,
      options: {
        scales: {
          y: {
            beginAtZero: true,
            position: 'right'
            
          }
        }
      },
    };
    Ответ написан
    Комментировать
  • Как практиковаться в программировании?

    CityCat4
    @CityCat4
    //COPY01 EXEC PGM=IEBGENER
    Обычно с помощью рук и головы :) В полном соответстии с принципом антиэнтропийности - циклический процесс, в котором при каждом следующем заходе все больше порядка и меньше хаоса :)
    Ответ написан
    Комментировать