Задать вопрос
  • Компьютер для веб дизайна?

    be_a_dancer
    @be_a_dancer
    Backend/Fullstack Developer
    Итак. По порядку. Задача: иметь возможность установить и одновременно запустить PS и AI + Figma.
    Первые две - крайне требовательны к памяти. Бюджет - до 30 тысяч.

    Решение - отказываемся от Intel, так как в производственных задачах (не в играх) они хуже на условные 10-12%. Берем AMD. Ввиду вашего отказа от видеокарты, стоит выбор между процессорами с встроенным видеоядром.
    Ryzen 3 или Ryzen 5.
    Ryzen 5 лучше тройки благодаря следующим параметрам: частота турбобуста на 200 единиц больше, плюс 8 потоков, вместо четырех на процессоре предыдущего поколения.
    Цена при этом больше на 3 тысячи рублей. Полагаю, что стоит взять Ryzen 5.
    Далее.
    К процессору Ryzen нужно брать обязательно 2 плашки памяти. Можно взять 1 на восемь и докупить через месяц еще одну такую же. Это увеличит производительность на 8-30% в зависимости от задачи благодаря (из-за) шине Infinity Fabric (которая, несмотря ни на что, кривая).

    Итого, я бы взял:
    Ryzen 5 2400G BOX
    8 GB Samsung DDR4 2400MHz.
    ASRock AB350M-HDV
    Chieftec TPS-500S / Thermaltake TR2-S 500W
    1 TB HDD
    Корпус на сдачу, например, от Accord.

    Дальнейшие улучшения: первым делом докупаем еще одну плашку памяти. Абсолютно такую же, как и первая. Далее - SSD, на который ставим систему и программы. После всего - видеокарту. Предел - GTX 1060.
    Итого. Данная конфигурация вытянет на начальном этапе все программы, если докупить еще памяти и SSD - получишь неплохую конфигурацию, которой хватит для работы еще лет на 5-6.
    Докупишь видеокарту - будет возможность играть в любой AAA проект в FullHD не менее, чем на средних настройках графики ближайшие два-три года.
    Ответ написан
    Комментировать
  • Как сделать чтобы Tooltip в select option вмещался?

    webinar
    @webinar
    Учим yii: https://youtu.be/-WRMlGHLgRg
    Tooltip в select option не умещается?

    это очевидно глядя на скриншот. Есть другие вопросы? Что бы их сократить, скажу сразу, что тултип черный, текст белый.
    Ответ написан
    4 комментария
  • Есть ли официальная документация по JavaScript?

    Stalker_RED
    @Stalker_RED
    Javascript - это одна из реализаций ECMA-262. Если вам нужно именно "официально-стандартно" - вам именно сюда.
    Обратите внимание, это девятая редакция, которая вышла в июле. В следующем году скорее всего выйдет новая редакция. Ну и в этом СТАНДАРТЕ вы не найдете всяких новых экспериментальных штук. Экспериментальные штуки обычно описаны в черновиках.

    BOM и DOM - это на самом деле не часть javascript, это API браузеров.

    В 99% случаев вам будет удобнее всего ориентироваться на MDN, там все неплохо структурировано, и поддерживается в довольно актуальном состоянии.
    Ответ написан
    1 комментарий
  • Как правильно реализовать удаление элемента в дочернем компоненте?

    0xD34F
    @0xD34F
    Почему удаление элемента осуществляется в дочернем компоненте, который ни про какую collection знать не знает? Почему в родительском компоненте в качестве обработчика события указывается несуществующий метод?

    Наверное, метод removePost из дочернего компонента надо разделить на два: removePost в дочернем компоненте эмитит id элемента, а removePost в родительском компоненте по этому id осуществляет удаление элемента из массива. Т.е., в дочернем:

    removePost(picId: number) {
      this.remove.emit(picId);
    }

    В родительском:

    removePost(picId: number) {
      this.collection = this.collection.filter(p => p.id !== picId);
    }
    Ответ написан
    Комментировать
  • Зачем передавать event в компонент Vue?

    0xD34F
    @0xD34F Куратор тега Vue.js
    зачем передавать: @my-event="myEvent" ?

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

    Итак, зачем назначать обработчик события? Вообще - это вам виднее, надо или не надо обрабатывать событие, и если надо, то как именно. А в данном конкретном случае - чтобы обновить значение свойства родительского компонента, отвечающего за состояние диалогового окна.

    Кстати,в явном виде делать это совсем не обязательно.

    Первый вариант - можно использовать модификатор sync при привязке значения параметра aa:

    <modal-notifications :aa.sync="isActive" :message="message"></modal-notifications>

    Метод закрытия в компоненте окна в этом случае станет выглядеть так:

    closeModalWindow() {
      this.$emit('update:aa', false);
    },

    Второй вариант - управлять состоянием окна посредством директивы v-model. Надо будет заменить имя параметра с aa на value (ну или настроить model):

    props: ['aa', 'message'], ---> props: [ 'value', 'message' ],
    :class="{'is-active': aa}" ---> :class="{ 'is-active': value }"

    Переписать метод закрытия окна:

    closeModalWindow() {
      this.$emit('input', false);
    },

    Ну а в родительском компоненте станет так:

    <modal-notifications v-model="isActive" :message="message"></modal-notifications>



    Я же делаю из потомка this.$emit('my-event', this.isActive) которое слушает родитель.

    Никто ничего просто так не "слушает". Чтобы "слушать", надо назначить обработчик соответствующего события. Что и происходит посредством @my-event="myEvent".

    эмит выше вроде бы не нужен, но без него не работает

    Чё? Какой ещё "эмит"? Нет "выше" никакого "эмита". Вы в родителе событие обрабатываете, а не порождаете.

    И еще вопрос. Что делает:
    myEvent: function(isActive) {
      this.isActive = isActive
    }

    Почему оно должно что-то принимать? Можно же просто значение из data взять.

    "Значение из data" брать бессмысленно - это и есть this.isActive. Который вам обновить надо. Обновить значением, которое присылает диалоговое окно. Значением, которое передаётся в (т.е., которое принимает) обработчик события.
    Ответ написан
    Комментировать
  • Как еще можно оптимизировать js код?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Исправил синтаксические ошибки.

    Ага, на пять с плюсом.

    • Пропущен if или условие лишнее:

      } else (date.getDay() == 0) {

      } else (a < 1) {

    • Лишнее : после ?:

      this.updateTime.getMonth() > 9 ? : '0'

    • Перед методом renderItems стоит лишняя фигурная скобка, а после метода createPeriod такой скобки не хватает.


    И это только синтаксические. Есть ещё ворох иных.

    • Имена свойств, содержащих обработчики событий, состоят из букв только в нижнем регистре, тут должно было быть input.onchange:

      this.input.onChange = this.onChange;

    • Какое там первое слово в имени базового класса должно быть - date или data? Вы бы определились:

      class dateInput {

      class dateRange extends dataInput {

    • В конструкторе dateRange отсутствует вызов конструктора базового класса - не хватает super(); перед this.container = ...:

      constructor() {
       this.container = document.querySelector('.containerForLastUpdateRecordAndPeriodItems');

    • Это ещё что за на хрен:

      period = `${date.toLocaleDateString()} - {date.setHours(168).toLocaleDateString()}`;

      Во-первых - не указан индекс, и вместо собираемого массива используется объект, переданный в функцию, вместо period должно быть periods[i].
      Во-вторых- метод setHours возвращает число, а не объект даты, так вызвать toLocaleDateString не получится.
      В-третьих - отсутствует $ перед фигурной скобкой при подстановке второй даты.

    • Присваивание значений необъявленным переменным:

      b = false;

      element = document.createElement('div')

      Никогда так больше не делайте. Ну и бегом гуглить, почему это плохо.

    • Неправильно пытаетесь вызывать метод renderItems - не хватает this.:

      onChange() {
       renderItems(this.createItems(this.createPeriod(this.inputValue)));

      Кроме того, this тут будет вовсе не экземпляром класса - надо привязывать контекст при установке этого метода в качестве обработчика события (this.onChange.bind(this) - это в конструкторе dateInput). А ещё, поскольку метод переопределён, надо не забыть вызвать метод базового класса, иначе не будет установлено значение свойства inputValue:

      onChange(e) {
        super.onChange(e);
        this.renderItems(...

    • Можете хоть из кожи вон вылезти, но константа своего значения не изменит, а вот TypeError при попытке выполнить хотя бы одну итерацию подобного цикла получите обязательно:

      for (const i = 0; i < n-a; i++) {

    • Что принимает document.createElement в качестве параметров? Откройте документацию и разберитесь, чтобы такую чушь больше не сочинять:

      const element = document.createElement('div', {textContent: item});

    • Опять проблемы со значением this:

      this.container.appendChild(element);

      Поскольку данная строка находится внутри коллбека forEach, который представлен обычной функцией, то экземпляр класса оказывается недоступен. Или замените обычную функцию на стрелочную, или передайте this в forEach третьим параметром.

    • Это ещё что за на хрен №2:

      createPeriod(date) {
       var newDate = date;
        newDate.year = newDate.year + 1;

      Во-первых - в метод передаётся строка, а не дата.
      Во-вторых - будь там дата, скопировать с помощью оператора присваивания её бы не получилось, для объектов копируются ссылки, а не значения.
      В-третьих - год получается и устанавливается совсем не так, для этого есть методы:

      createPeriod(dateStr) {
        const start = new Date(dateStr);
        const end = new Date(dateStr);
        end.setFullYear(end.getFullYear() + 1);
        return { start, end };
      }

    • Это ещё что за на хрен №3:

      const range = Object.create(dateRange.prototype); 
      range.constructor = range.constructor.bind(range); 
      range.constructor();

      Во-первых, без new конструктор вызывать нельзя.
      Во-вторых - к чему такие сложности? - достаточно new dateRange;.


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

    Подскажите, как еще можно оптимизировать(зарефакторить) данный js код?

    А зачем? Лучшее, что тут можно сделать - выбросить всё на хрен и попробовать написать заново, предварительно подумав, на этот раз головой вместо задницы. Не стыдно подобный мусор показывать?

    Но окей, окей - метод createItems, например:

    • Странные непонятные числа, встречающиеся в коде - такого не надо, определяем константы, имена которых будут указывать, что это за значения:

      const MS_IN_HOUR = 3600000;
      const HOURS = 168;

    • Вместо двух циклов сделайте один - промежуточный массив dates не нужен:

      for (let i = +period.start; i < +period.end; i += MS_IN_HOUR * HOURS) {
        const date = new Date(i);

    • "Оптимизируйте" if-else-if-... - складываем нижние значения часов в массив (тоже бы неплохо определить его отдельно, дав осмысленное имя), извлекаем их используя день недели как индекс, верхнее значение получаем добавляя сколько там надо (я так понял, разница везде одинаковая между нижним и верхним):

      const hours = [ -120, 0, -24, -48, -48, -72, -96 ][date.getDay()];
      periods.push([ hours, hours + HOURS ]
        .map(n => (date.setHours(n), date.toLocaleDateString()))
        .join(' - ')
      );

    • Для обмена значениями дополнительная переменная не нужна:

      [ periods[i + a], periods[i] ] = [ periods[i], periods[i + a] ];



    Или, renderItems:

    Четыре обращения к свойству updateTime - как-то многовато, достаточно одного, чтобы запомнить значение под коротким именем:

    const ut = this.updateTime;

    Вместо отдельных элементов можно вставлять разметку:

    this.container.insertAdjacentHTML('beforeend',
      `<div>Последнее изменение: ${ut.getDate()}.${`${ut.getMonth()}`.padStart(2, 0)}</div>` +
      items.map(n => `<div>${n}</div>`).join('')
    );
    Ответ написан
    3 комментария
  • Как задать ширину svg при помощи переменной?

    0xD34F
    @0xD34F
    Во-первых - вы явно путаете ширину с высотой. Во-вторых - [attr.viewBox]="'0 0 100 ' + bla".
    Ответ написан
    Комментировать
  • Как проверить наличие класса у одного из блоков div?

    space2pacman
    @space2pacman
    Просто царь.
    document.querySelector(".my").classList.contains("on") // true/false
    Ответ написан
    Комментировать
  • Пример архитектуры хорошего Golang веб-приложения?

    @alexkdev
    Сам нахожусь в поисках идеального ответа на ваш вопрос, но кое что есть для размышления по этому поводу:
    1. https://github.com/gothinkster/realworld (тут не только Golang)
    2. https://github.com/golang-standards/project-layout
    Ответ написан
    Комментировать
  • Как запретить windows 10 переключать вид папки с Detail на Large Icon, в которой находятся TypeScript файлы?

    Francyz
    @Francyz
    Photographer & SysAdmin
    Чуть ниже вашей стрелочки стоит "чекбокс" в котором написано "Применить шаблон ко всем подпапкам. Выставляете нужный вид ставите галочку и жмете применить. И все.
    P.S. чтобы не было эскизов, выбираете шаблон "Общие элементы".
    Ответ написан
    2 комментария
  • Чем отличается junior от middle? а Senior?

    pi314
    @pi314
    Президент Солнечной системы и окрестностей
    Вот как это выглядит с т.з. работодателя

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

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

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

    streetflush
    @streetflush
    https://angular.io/guide/router

    ngOnInit() {
      this.hero$ = this.route.paramMap.pipe(
        switchMap((params: ParamMap) =>
          this.service.getHero(params.get('id')))
      );
    }


    Все предельно прозрачно
    Ответ написан
    1 комментарий
  • Округление чисел, например 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 комментария
  • Как мотивировать верстальщика перейти с Ps на Figma?

    @dsmaslov
    1. Не нужно оплачивать подписку, как на PS.
    2. Быстрый экспорт графики, в том числе в размере x2 для ретины.
    3. Можно делать импорт файлов из Sketch.

    Вообще это дело привычки самого верстальщика, возможно, что он уже оптимизировал PS под себя так, что другие инструменты и фишки ему попросту не нужны или не так хороши как то, что он использует сейчас.
    Ответ написан
    2 комментария
  • SASS - LESS - Stylus что выбрать?

    bingo347
    @bingo347
    Crazy on performance...
    Вопрос конечно больше вкуса, но все же SASS в синтаксисе SCSS
    Из плюсов могу сказать:
    - Самый богатый функционал (ИМХО)
    - CSS - это валидный SCSS
    - Многие библиотеки написаны сегодня на нем, что позволяет подгружать их по частям или использовать на уровне миксинов и функций
    - Возможность переопределить загрузку import'ов
    - Возможность писать функции на языке сборки - в большинстве случаев не надо, но все же полезно
    - Единое ядро на C и байндинги ко множеству языков
    Ответ написан
    4 комментария
  • E.relatedTarget = e.fromElement и e.relatedTarget = e.toElement; для чего?

    rockon404
    @rockon404
    Frontend Developer
    Вы попробуйте хотя бы прочитать статью из которой скриншот делали.

    spoiler

    Бесполезная функция, бесполезные знания. IE8 мертв.
    Ответ написан
    Комментировать
  • Нужна ли вышка для веб-разработчика?

    0xD34F
    @0xD34F
    Ответ написан
    Комментировать
  • Как позволить набирать input только числа и "+"?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Замените текущее регулярное выражение на /[^+\d]/g.

    Ну а вообще, как я понял, вы хотите реализовать ввод телефона. Рекомендую посмотреть в сторону таких вещей как inputmask, например.
    Ответ написан
    Комментировать
  • Как из массива объектов получить массив уникальных значений определённого свойства?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Как делать надо: [...new Set(arr.map(n => n.id))].

    И как не надо:

    Object.values(arr.reduce((acc, n) => (acc[n.id] = n.id, acc), {}))
    
    // или
    
    Array.from(new Map(arr.map(({ id }) => [ id, id ])).values())
    
    // или
    
    arr.map(n => n.id).filter((n, i, a) => i === a.indexOf(n))
    
    // или
    
    arr.reduce((acc, n) => (acc.includes(n.id) || acc.push(n.id), acc), [])
    Ответ написан
    Комментировать