• Где можно узнавать о новых технологиях и разработках?

    Stalker_RED
    @Stalker_RED
    Вот смотри, собралась команда, и придумывает какую-то новую штуку.
    Сначала только они сами о ней что-то знают.

    Затем они решают, что пора ее показать миру. Ну или к ним проникает шпион, и подглядывает.

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

    В любом случае, "обычные люди" не следят за этим всем бедламом. Ну за редким исключением, когда человек немного сумасшедший по поводу новостей, или если у него работа такая.

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

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

    В таком подходе есть одна проблема: новостей будет столько, что не будешь успевать их читать. И не все из них будут интересными.
    Ответ написан
    Комментировать
  • Понятный ли backend Javascript?

    tsepen
    @tsepen
    Frontend developer
    Плохо, 8000 строк кода в 1 файле без комментариев - как тут что то можно оценить?)
    Ответ написан
    3 комментария
  • Как реализовать отзывы на лендинге без бэкенда?

    copist
    @copist
    Empower people to give
    Попробуй backendless архитектуру - храни отзывы в специальном сервисе, сохраняй и получай через AJAX
    https://habr.com/ru/company/backendless/blog/180367/

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

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

    Вдруг они вместо отзыва вопрос зададут? Как написать им в ответ?
    Вдруг отзыв будет жалобой? Как потом пометить отзыв как "проблема решена"?

    Более чем уверен, понадобится админка для всех этих отзывов. Не такая уж и сложная.
    Ответ написан
    4 комментария
  • Проверка браузера, если IE или Edge код должен работать иначе нет, как сделать?

    kshshe
    @kshshe
    Frontend developer
    if (browser == 'Edge' || browser == 'Internet Explorer') {

    или

    if (['Edge' , 'Internet Explorer'].includes(browser)) {
    Ответ написан
    1 комментарий
  • $() функция не работает JQUERY, что не так?

    Vlad_IT
    @Vlad_IT Куратор тега JavaScript
    Front-end разработчик
    Вот эта строка у вас должна вызывать подозрения
    <script> src="slick/slick.js"</script>
    смотрите, как вы подключаете jquery и как этот slick.js
    Еще вот это. Закройте фигурную скобку и обычную сразу за ней.
    <script>
        $( "div.foo" ).click(function() {
    </script>
    Ответ написан
    2 комментария
  • Как реализовать это?

    @modeusweb
    front-end developer
    Комментировать
  • Как полностью написать сайт с нуля, если ты знаешь только frontend?

    Если вашему сайту не понадобится работа с БД, то вы можете просто закинуть статику на хостинг и ваш сайт будет нормально работать
    Ответ написан
  • Как сделать эффект перелистывания как на руофе Lineage?

    iiiBird
    @iiiBird Куратор тега CSS
    Пока ты спишь - твой конкурент совершенствуется
    накидал. есть пару косяков. дальше сам давай:
    https://jsfiddle.net/n6of70wk/
    Ответ написан
    Комментировать
  • Как сделать простой счетчик на JS?

    Vlad_IT
    @Vlad_IT Куратор тега JavaScript
    Front-end разработчик
    Берете стартовое время, с которого начинается подсчет заказов, например
    let startDate = new Date(2019, 0, 28, 12, 0);
    устанавливаете стартовое кол-во заказов
    let startCountOrders = 100;
    находите разницу между текущим временем и стартовым в миллисекундах.
    let diffMS = Date.now() - startDate;
    преобразуете эту разницу с миллисекунд, в минуты
    let diffMinutes = diffMS / 1000 / 60;
    и в итоге считаете кол-во заказов
    let ordersCount = ~~(diffMinutes / (60 / countOfHour)) + startCountOrders;


    Полный код

    let startDate = new Date(2019, 0, 28, 12, 0)
    let startCountOrders = 100;
    let countOfHour = 2;
    
    let diffMS = Date.now() - startDate;
    let diffMinutes = diffMS / 1000 / 60;
    let ordersCount = ~~(diffMinutes / (60 / countOfHour)) + startCountOrders;
    alert(`Кол-во заказов ${ordersCount}`);

    PS: чтобы не привязываться к часовому поясу пользователя, используйте https://developer.mozilla.org/ru/docs/Web/JavaScri...
    Ответ написан
    Комментировать
  • Какой серверный js-фреймворк перспективнее adonis.js или hapi.js?

    tsepen
    @tsepen
    Frontend developer
    По мне так express рулит в nodejs, про этих двух ничего не могу сказать, но если нет желания экспрeсс - можно попробовать KOA, он вроде даже быстрее
    Ответ написан
    3 комментария
  • Как запретить копировать (сохранять) файлы с сайта?

    Isolution666
    @Isolution666
    Full-Stack Developer
    Лучше всего установить бэкдор. Если заказчик свалит с сайтом без оплаты, то вы сможете откатывать всё до нужной версии, то есть, если заказчик посмотрел и исчез без оплаты, сматывайте проект до той версии, где к примеру неправильные ссылки на скрипты и стили. Кто бы не внёс правки, вы снова откатываете сайт через бэкдор и там нихера не работает.
    Хороший урок для тех кто хочет на халяву получить чужой труд. Проблема копипаста из интернета уже стара как мир, опытные программисты прячут репозиторий от исходного проекта как могут, чтобы после скачивания ничего не отображалось, но есть и те, кто может посмотреть "Sourcer" в инспекторе кода, и благополучно всё скачать. Есть ещё один способ, спасёт только от шоколаты, которая ещё не шарит в этом, программист это обойдёт:
    window.onload = function() {
        document.addEventListener("contextmenu", function(e){
            e.preventDefault();
        }, false);
    document.addEventListener("keydown", function(e) {
        if (e.ctrlKey && e.shiftKey && e.keyCode == 73) {
            disabledEvent(e);
        }
        if (e.ctrlKey && e.shiftKey && e.keyCode == 74) {
            disabledEvent(e);
        }
        if (e.keyCode == 83 && (navigator.platform.match("Mac") ? e.metaKey : e.ctrlKey)) {
            disabledEvent(e);
        }
        if (e.ctrlKey && e.keyCode == 85) {
            disabledEvent(e);
        }
        if (event.keyCode == 123) {
            disabledEvent(e);
        }
    }, false);
        function disabledEvent(e){
            if (e.stopPropagation){
                e.stopPropagation();
            } else if (window.event){
                window.event.cancelBubble = true;
            }
            e.preventDefault();
            return false;
        }
    };

    Не хотите чтобы стащили из интернета, не выкладывайте. Делайте сайты на локальном сервере. Показывайте к примеру через "скайп" или "тимвивер" - последнее подойдёт если заказчик хочет "пощупать" сайт, ну вы поняли. А вообще, если к этому подходить без шуток, делайте себе лицензию, открывайте ИП, заключайте договор с заказчиком, и тогда правда будет на вашей стороне. Выбор конечно за вами. Либо оставаться в пролёте, пытаясь заработать копейки на фрилансе, либо иметь юридическую силу, на тот случай если вас нагло поимели по проекту. С последним конечно движухи лишней больше, но зато деньги всегда есть. Успехов вам.
    Ответ написан
    Комментировать
  • Как запретить копировать (сохранять) файлы с сайта?

    @webenbond
    Нельзя запретить, усложнить можно... но тот кто хочет, все равно получит.
    Ответ написан
    Комментировать
  • Как запретить копировать (сохранять) файлы с сайта?

    amark
    @amark
    rush less, feel more
    Для чего вам это? Вы разработали новую инновационную систему, у которой нет аналогов? И вам кажется, что ваш гениальный скрипт кто-то украдет и наживется на этом?

    Если да, то сделайте тройную обфускацию скриптов; а всё, что можно выполнить на сервере, вытаскивайте из скриптов и передавайте в работу на сервер.

    Однако, что-то мне подсказывает, что вам просто показалось, что кому-то есть дело до ваших скриптов и стилей. Так может лучше потратить своё время на что-то более приятное? Выучить новый язык или фреймворк, например))
    Ответ написан
    10 комментариев
  • Какие языки выбрать для разработки сайтов, мобильных приложений/игр и как подрабатывать во время обучения?

    Первый язык - Английский. Приоритеты неправильные, сначала попробуй можешь ли разрабатывать, а потом подумаешь как зарабатывать. Хороший Software Developer работу найдет всегда, но далеко не каждый может им стать.
    Ответ написан
    3 комментария
  • Чем заменить функцию .map() в моем случае?

    @askhat
    На вопрос ответил автор вопроса, я в свою очередь попытаюсь объяснить что произошло.

    Рендер в реакте всегда идёт по наименее трудозатратному пути, а именно вычисляет дельту (разницу) между новым стейтом и предыдущим, если таковой имеется. Например:

    class TodoList extends React.Component {
      state = {
        todos: [
          'Commit',
          'Push'
        ]
      }
      render() {
        return <ul>
          {this.state.todos.map(item => {
            return <li>{ todo }</li>
          }
        </ul>
      }
    }


    Если стейт компонента изменится, скажем при добавление элемента в начало списка todos, так что он станет таким:

    const todos = [
      'Init',
      'Commit',
      'Push'
    ]


    Реакт вычислит два древа VirtualDOM:

    // Начальный стейт
    <ul>
      <li>Commit</li>
      <li>Push</li>
    </ul>
    // Добавлен элемент
    <ul>
      <li>Init</li> // <- разница начинается здесь и до конца древа
      <li>Commit</li>
      <li>Push</li>
    </ul>


    Здесь выполняется работа которой можно было бы избежать. К примеру если бы элемент был добавлен в конец списка:

    const todos = [
      'Commit',
      'Push',
      'Merge'
    ]


    То реакт получил бы на сравнение другие два древа элементов:

    // Начальный стейт
    <ul>
      <li>Commit</li>
      <li>Push</li>
    </ul>
    // Добавлен элемент
    <ul>
      <li>Commit</li>
      <li>Push</li>
      <li>Merge</li> <- разница начинается здесь, от начала и до сих по ничего не менялось
    </ul>


    Дельта этих двух списков меньше, а значит и работы нужно сделать меньше.

    Совершенно очевидно что <li>Commit</li> и <li>Push</li> не менялись, однако реакт недостаточно умён чтобы это понять. Чтобы помочь ему следует воспользоваться специальным пропом key={}. Он может быть значением любого типа, единственно требование — значение должно стабильно идентифицировать соответствующие данные.

    Если бы компонент выглядел так:

    class TodoList extends React.Component {
      state = {
        todos: [
          { id: 0, text: 'Commit' },
          { id: 1, text: 'Push' }
        ]
      }
      render() {
        return <ul>
          {this.state.todos.map(item => {
            return <li key={todo.id}>{ todo.text }</li>
          }
        </ul>
      }
    }


    То добавление элемента в начало массива, породило бы следующий стейт:

    const todos = [
      { id: 2, text: 'Init' },
      { id: 0, text: 'Commit' },
      { id: 1, text: 'Push' }
    ]


    И, снова, два древа элементов:

    // Начальный стейт
    <ul>
      <li>Commit</li> // id 0
      <li>Push</li> // id 1
    </ul>
    // Добавлен элемент
    <ul>
      <li>Init</li> // id 2 новый элемент отобразится в начале
      <li>Commit</li> // id 0
      <li>Push</li> // id 1 
    </ul>


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

    Таким образом использовать индекс в массиве в качестве ключа — не лучшая идея, особенно если массив будет меняться. По той же причине не следует использовать Math.random() в качестве ключа, так вы почти гарантировано будете всегда получать нестабильные идентификаторы.

    Подробнее об этом можно почитать здесь — Reconciliation.
    Ответ написан
    5 комментариев
  • На Тостере слово "гомосексуалист" подвержено цензуре и за него банят?

    TosterModerator
    @TosterModerator Куратор тега Тостер
    Модератор Хабр Q&A
    1. Пункт 5.1. правил Сервиса гласит:
    Любые оскорбительные формулировки запрещены. Даже в том случае, если наличествуют неопровержимые доказательства того, что в указанных оскорблениях имеется доля правды.
    В этом пункте отсутствуют какие либо ограничения по составу субъектов. Т.е. оскорбительные формулировки запрещены в принципе, а не только в отношении пользователей Сервиса.

    3. Ваше высказывание было сформулировало таким образом, что под него подпадали все участники процесса разработки, а не отдельно взятая личность:
    5beaa2d529f9e352851147.png

    Это далеко не первое употребление оскорбительных формулировок с вашей стороны. Пожалуйста, будьте более сдержанны и корректны, в противном случае ваш доступ к Сервису будет ограничен перманентно.
    Ответ написан
    6 комментариев
  • Как сделать одновременно несколько запросов в Vue+Axios?

    tsepen
    @tsepen
    Frontend developer
    Несколько одновременных запросов можно сделать при помощи axios.all

    function getUserAccount() {
      return axios.get('/user/12345');
    }
    
    function getUserPermissions() {
      return axios.get('/user/12345/permissions');
    }
    
    axios.all([getUserAccount(), getUserPermissions()])
      .then(axios.spread(function (acct, perms) {
        // Both requests are now complete
      }));
    Ответ написан
    2 комментария
  • Какие причины долгой загрузки сайта?

    @SpideR-KOSS
    Картинки по 1,5Мб никуда не годится. Пережимайте через сервисы или уменьшайте разрешение картинок.

    И jquery.coookie.js пути проверьте, он должен открываться по пути сайт/js/jquery.cookie.js.
    Ответ написан
    Комментировать