• Верстка с нуля: какие основные этапы работы?

    Vlad_IT
    @Vlad_IT Куратор тега Вёрстка
    Front-end разработчик
    Использую vscode+webpack+pug+scss+бэм. Из физических инструментов, основной моник: lg ultrawide 29um69g, рядом прикручен моник от ноутбука повешенный вертикально, подключенный через универсальный скаллер.

    0) Запускаю Spotify :-)

    1) Произвожу установку всех необходимых модулей для сборки. В моем случае у меня набор конфигураций для webpack (отдельные файлы для pug, scss, static и.т.д., выбираю что нужно).

    2) Запускаю avocode, загружаю в него макет. Определяю в нем переменные (в то же время записываю их, чтобы сразу кинуть в scss файл) для цветов, размеров шрифтов и.т.д. чтобы при получении кусочков кода из него, он сразу расставлял переменные.

    3) Запускаю VS Code, открываю нужную папку.

    4) Пишу размету на Pug. Пишу с БЭМ, если встречаю повторяющийся блок, то открываю файл _mixins.pug, в который пишу миксины для повторяющихся блоков, например товаров, пунктов меню, каких-то блоков и.т.д. Pug умеет делать циклы, это ускоряет сильно.

    5) Когда HTML готов, начинаю делать каркас. Если дизайн сделан по сетке, определяю контейнеры, колонки, строки в свои классы (не пишу в html тучи классов аля col-md-6, а пишу в SCSS инклуды в нужные мне блоки, типа @include make-col(2) и.т.д.).

    6) Экспортирую картинки из Avocode. Очень делается просто, указываю папку и просто кликаю экспорт и ввожу название файла и расширения. Преимущественно для иконок использую svg, если нет svg, то ищу эту иконку в интернете (дизайнеры редко рисуют иконки сами, но зато любят вставлять их не в векторе). Если иконка простая, могу сам ее в inkscape обвести, ну и если нет, то экспортирую png в размере (благо авокод это позволяет, если конечно дизайнер не вставил в исходном маленьком размере). Когда есть контакт с дизайнером, трясу его, ибо растр это плохо для иконок.

    7) Пишу стили блоков из страницы. На этом этапе можно на втором монике параллельно смотреть футураму или
    Арчера :-) Но чаще на широком монике слева браузер, справа VS Code, а на втором монике Avocode (может меняться местами с браузером). Мысленно нарезаю страницу на блоки. Для каждого блока (БЭМ) создаю отдельный scss файл (кто-то даже для элемента создает, но мне лень), из него сразу выписываю все селекторы. Иногда могу сначала выписать все селекторы со страницы (но так лучше не делать, т.к. во время работы может потребоваться изменить что-то в разметке), но чаще для одного блока выполняю этот пункт и за ним сразу выполняю пункт 8, потом для нового блока опять 7 и 8 и.т.д.

    8) Пишу css код вместе с Avocode, у него беру нужные мне параметры (а он уже подставил в них переменные), и вставляю в мой код. И параллельно сверяю со скрином макета используя вот это расширение https://chrome.google.com/webstore/detail/perfectp...

    9) Пишу адаптив. Я не могу привыкнуть к методологии mobile-first, поэтому пишу всегда сначала полную версию сайта. Я понимаю, что это чревато всякими проблемами и это типа не модно, но мне норм.

    10) Медиа-запросы пишу прямо в блоках, для каждого блока/элемента/модификатора может быть отдельный медиа-запрос. Но для начала определяю breakpoint'ы для разных экранов (чтобы их не было сотни разных), если использую Bootstrap, то беру его breakpoint'ы.

    11) Добавляю анимашки. Даже если заказчик не просил отдельно (и если не указал отдельно, что нельзя), он все равно будет доволен, а с animate.css+onscreen.js это вообще работа 10 минут. Сложные анимации обговариваю отдельно, чтобы не сделать ненужную работу.

    11) Все снова сверяю, пишу скрипты где надо. Для слайдеров в 99% случаев подходит slick (с доработками конечно, но там хорошее API), для других случаев могу написать свой.

    12) Сдаю заказчику и жду ответа сидя на тостере/пикабу.

    Это чисто мой опыт, опыт фрилансера, не знаю, как делают другие и не могу на 100% утверждать что это 100% правильный способ. Я так и не смог заставить свой конфиг webpack правильно вставлять спрайты svg.
    Надеюсь чем-то поможет мой ответ.
    Ответ написан
    7 комментариев
  • Реализация алгоритма нахождения минимальной суммы непрерывной последовательности, есть варианты?

    0xD34F
    @0xD34F
    function getMinSum(arr, n) {
      let sum = 0;
      let minSum = 0
      let index = 0;
    
      for (let i = 0; i < n; sum += arr[i++]) ;
      minSum = sum;
    
      for (let i = n; i < arr.length; i++) {
        sum -= arr[i - n] - arr[i];
        if (sum < minSum) {
          minSum = sum;
          index = i - n + 1;
        }
      }
    
      return {
        sum: minSum,
        seq: arr.slice(index, index + n),
      };
    }
    Ответ написан
    1 комментарий
  • Как убрать квадратную рамку вокруг круглого элемента?

    UnluckySerivelha
    @UnluckySerivelha
    -webkit-tap-highlight-color: rgba(255, 255, 255, 0); 
    -webkit-tap-highlight-color: transparent;
    Ответ написан
    Комментировать
  • Как исправить неправильно отображающийся кастомный курсор в Google Chrome?

    Moskus
    @Moskus
    https://bugs.chromium.org/p/chromium/issues/detail... - давно существующий известный баг. Решение - забить, либо не заниматься ерундой с custom cursor - они только с толку сбивают, как правило.
    Да, и это явление описывается словам "видимый aliasing", а не "неровный" или "пиксельный".
    Ответ написан
    3 комментария
  • Как понимать бинарные файлы?

    reverse_kacejot
    @reverse_kacejot
    Junior C++ Developer, bachelor of Applied Math
    Как гласит страничка википедии для того же формата .3ds - "The first two bytes of the chunk are its ID". У каждого формата - свое бинарное представление со своими чанками. Типичным примером могут быть исполнимые файлы Windows - PE и для Linux - ELF. Для ELF-файлов есть хорошая спецификация, которая объясняет какие чанки бывают, какие у них заголовки, какие поля у заголовков, какой размер у чанком (если он не переменный).
    Еще есть spool файлы принтеров - у них тоже своих заголовки.

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

    Обещанные ссылки на спеки бинарей:
    ELF - Executable and Linkable format
    EMFSPL
    EMF
    PE

    Вот нашел свой парсер секций для Portable Executable
    #include <stdio.h>
    #include <windows.h>
    
    #define RTN_OK 0
    #define RTN_FAILURE 1
    
    const size_t expected_count = 1;
    
    char* read_file_name(int argc, char** argv);
    
    int main(int argc, char** argv)
    {
    	// Parsing command line args
    	char* file_name = read_file_name(argc, argv);
    	
    	// Opening our executable
    	FILE* portable_executable = fopen(file_name, "r");
    
    	// Reading dos header
    	IMAGE_DOS_HEADER dos_header_buffer;
    	fread(&dos_header_buffer, sizeof(IMAGE_DOS_HEADER), expected_count, portable_executable);
    
    	// Setting offset for reading PE header
    	fseek(portable_executable, (long)dos_header_buffer.e_lfanew, SEEK_SET)
    
    	// Reading signature field from PE header
    	DWORD signature = 0;
    	fread(&signature, sizeof(DWORD), expected_count, portable_executable);
    
    	// Reading file header
    	IMAGE_FILE_HEADER file_header_buffer;
    	fread(&file_header_buffer, sizeof(IMAGE_FILE_HEADER), expected_count, portable_executable);
    
    	// Reading optinal header
    	IMAGE_OPTIONAL_HEADER optional_header_buffer;
    	fread(&optional_header_buffer, file_header_buffer.SizeOfOptionalHeader, expected_count, portable_executable);
    
    	// Get info about all the sections
    	for (int i = 0; i < file_header_buffer.NumberOfSections; ++i)
    	{
    		// Reading each section header
    		IMAGE_SECTION_HEADER section_header_buffer;
    		fread(&section_header_buffer, sizeof(IMAGE_SECTION_HEADER), expected_count, portable_executable);
    		
    		printf("Section name: %7s, Raw data size: %10d, Pointer to raw data: %10d\n",
    			section_header_buffer.Name,
    			section_header_buffer.SizeOfRawData,
    			section_header_buffer.PointerToRawData);
    	}
    
    	fclose(portable_executable);
    }
    
    char* read_file_name(int argc, char** argv)
    {
    	if (argc != 2)
    	{
    		return NULL;
    	}
    
    	return argv[1];
    }
    Ответ написан
    Комментировать
  • Какой метод перебора массивов JS использовать и как?

    0xD34F
    @0xD34F Куратор тега JavaScript
    map/filter:

    arr.map((n, i) => n ? i : null).filter(n => n !== null)
    // или
    arr.map((n, i) => n ? i : NaN).filter(n => n === n)
    // или
    arr.map((n, i) => !!n && i).filter(Number.isInteger)
    // или
    arr.map((n, i) => !n || i).filter(n => n !== !0)

    reduce:

    arr.reduce((acc, n, i) => n ? [ ...acc, i ] : acc, [])
    // или
    arr.reduce((acc, n, i) => (n && acc.push(i), acc), [])

    или, если надо изменить текущий массив, а не создавать новый

    for (let i = arr.length; i--; ) {
      if (arr[i]) {
        arr[i] = i;
      } else {
        arr.splice(i, 1);
      }
    }
    
    // или
    
    arr.reduceRight((_, n, i, a) => n ? a[i] = i : a.splice(i, 1), 0);
    
    // или
    
    let count0 = 0;
    
    arr.forEach((n, i, a) => {
      a[i - count0] = i;
      count0 += !n;
    });
    
    arr.length -= count0;
    Ответ написан
    Комментировать
  • Как заменить элементы одного массива элементами другого по заданному правилу?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Забыли .length – вероятно, собирались перебирать i от 0 до длины строки arr1. Тут не массивы, а две строки.

    for (i=0; i<arr1.length; i++) {
        for (j=0; j<arr2.length; j++){


    Вложенный цикл не нужен. Достаточно перебрать каждую цифру входа.

    Чтобы найти соответствующую цифре i букву, достаточно взять i-й элемент строки arr2:
    arr2[ i ];

    Коротко, в одну строку это можно решить через преобразование строки в массив и применение функции к каждому элементу.
    В одну строку
    var arr1 = '3649824598';
    var arr2 ='АБВГДЕЖЗИК';
    
    arr1.split('').map(n => arr2[n]).join('')  // ГЖДКИВДЕКИ

    • split('') сделает из строки массив цифр;
    • map() применит к каждой цифре функцию, которая заменит цифру на соотв. букву из arr2;
    • join('') склеит элементы массива (теперь уже буквы) в одну строку.
    Ответ написан
    Комментировать
  • Как избежать прокрастинации с утра?

    nki
    @nki
    bezkart.ru готовая система лояльности
    Картинку с Темой выложить или сами все знаете?
    Ответ написан
    3 комментария
  • Округление чисел, например 1000 в 1к?

    0xD34F
    @0xD34F Куратор тега JavaScript
    function shortNumber(val) {
      const numSymbol = [ '', 'K', 'M', 'B', 'T' ];
      let symbolIndex = 0;
    
      while (val >= 1000) {
        val = Math.round(val / 1000);
        symbolIndex++;
      }
    
      return val + numSymbol[symbolIndex];
    }
    
    
    shortNumber(96); // 96
    shortNumber(22222); // 22K
    shortNumber(4951476); // 5M
    Ответ написан
    2 комментария
  • Как вставить последнее значение в массив со сложной структурой?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Есть какой нибудь более удобный способ ?

    Под более удобным вы понимаете более короткую запись? Можно заменить обращение к последним элементам массивов на .slice(-1)[0], получится так:

    masMain.slice(-1)[0].mas1.slice(-1)[0].mas2.push(objectDoc);

    UPD. Наконец-то дождались, и трёх лет не прошло: masMain.at(-1).mas1.at(-1).mas2.push(objectDoc);.
    Ответ написан
    Комментировать
  • Как сделать пиксельное свечение для текста?

    ixon
    @ixon
    
    Правильней будет реализовать это через css. Добавить тексту свойства:
    text-shadow: 0px 0px 30px ЦветСвечения;
    text-fill-color: transparent;
    background-clip: text;
    background:url(Изображение из размытых точек)

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

    Ni55aN
    @Ni55aN
    function incrementChar(number){
        let inc = String(number).replace(/\d/g, '0').replace(/(.*)\d/,'$11');
        return Number(number) + Number(inc);
    }
    Ответ написан
    Комментировать
  • Как сделать функцию, которая выполнится только один раз?

    0xD34F
    @0xD34F Куратор тега JavaScript
    function one() {
      console.log('AAAAAAAAAA');
      one = () => {};
    }

    Ну или можно как декоратор это дело оформить:

    function once(f) {
      let called = false;
      return function() {
        if (!called) {
          called = true;
          return f.apply(this, arguments);
        }
      };
    }
    
    const one = once(function() {
      console.log('AAAAAAAAAA');
    });
    Ответ написан
    Комментировать
  • Как правильно переносить git проект на другую машину?

    GavriKos
    @GavriKos
    Правильно - клонировать репозитории, а не страдать ерундой в виде копирования репы с машины на машину со всем мусором и прочим. Склонировать репу - это 1 команда, не представляю что может быть еще проще. Хоть 100 реп - пихаем в батник и все автоматом склонится куда надо.
    Ответ написан
    3 комментария
  • Как правильно учить Javascript?

    IonDen
    @IonDen
    JavaScript developer. IonDen.com
    Вы наверное слышали, что каждый уважающий себя программист обязан написать несколько велосипедов? И JavaScript-программисты тоже так делают и еще как! Так вот в этом нет ничего плохого, это отличное самообучение.

    Для начала заходите на любой каталог плагинов для JavaScript или jQuery. Находите интересный, не очень сложный на вид плагинчик (например карусель, лайтбокс, слайдер и т.п.) и пытаетесь сделать похожий, только лучше. Поначалу будет выходить черти что, но, это будет уже реальная задача, где вы начнете сталкиваться с реальными особенностями языка. Вот тут то знания и начнут обретать какую-то структуру у вас в голове.

    Не пытайтесь брать сразу сложные вещи, начинайте с малого. Как заметили выше, не смотрите пока что на очень сложные книжки, их читать сейчас почти бесполезно.
    Ответ написан
    6 комментариев
  • Ресурс с задачами по JS?

    string15
    @string15
    Учусь верстать руками
    Ответ написан
    Комментировать
  • Как набираться опыта и формировать портфолио?

    Vlad_IT
    @Vlad_IT
    Front-end разработчик
    Итак, я учусь на geekbrains веб-разработке.

    Ошибка номер один. Из всех новичков, что я видел, с гикбрайнса самые слабые. Их не учат учиться, их учат повторять, не давая нормальную теоретическую и практическую базу. Задания очень слабые, а курсы поверхностные.
    статьи и пр. это конечно хорошо, но применять на практике то, что прочитал, это совершенно другое, а особенно в боевых условиях

    Пока не будете читать, так и будете практиковать визуальные эффекты на jQuery. Нужна база. В начале 25% теории 75% практики. Читайте https://css-tricks.com , большую книгу css (она немного устарела, гриды не рассматривают, но основная база очень полезная), смотрите Юрия Артюха (если хотите делать крутые анимации), лазьте по https://www.awwwards.com/ и разбирайтесь, как люди так делают. А также практикуйтесь, сделайте себе сайт, сайт другу, сайт девушке - всем.

    UPD: В чем сложно придумать себе близкую к боевому задачу? Боевую задачу вам вряд-ли кто-то даст, т.к. без опыта боевых задач, вы сделаете не боевое решение. Вот там "боевые" задачи.
    1) Сделайте калькулятор произведения матриц - разминочка.
    2) Сделайте игру арканоид, хоть на дивах (а раньше, когда мы учили программирование, новичков привлекала разработка игр, а сейчас почему-то сайты. Раньше было романтичнее как-то).
    3) Сделайте приложение учета личных финансов, в котором есть такие функции
    - личный счет
    - форма добавления денег в личный счет с комментарием и выбором группы доходов (долг, зп, заказ, подарок и.т.д.).
    - форма снятия денег с личного счета с комментарием и выбором группы расхода (вернул долг, купил домой что-то, купил технику, еду, потратил на женщину и.т.д.)
    - Вывод списка доходов и расходов с фильтром, сортировкой и категориями.
    - создание расписания автоматического пополнения (зп) или снятия (аренда, абонентская плата) средств с личного счета.
    - создание простого графика расходов и доходов. Я бы сюда добавил еще прогнозирование доходов и расходов хотя бы через линейную регрессию (да, я люблю машинное обучение),
    - добавление нескольких счетов
    Эта задача норм, и типа боевая, и для себя пригодится, и на гитхаб можно выложить - красота.
    Ответ написан
    14 комментариев
  • Это вообще люди делают?

    dimovich85
    @dimovich85 Куратор тега CSS
    https://u-academy.net/
    Поделюсь с вами вот такой ссылкой:
    https://www.youtube.com/playlist?list=PLswdBLT9llb...
    Ответ написан
    1 комментарий