• Зачем нужны шаблонизаторы в Node.js?

    gscraft
    @gscraft
    Программист, философ
    Это классический подход для любых серверных технологий на PHP, NodeJS, Python, Go, C#, Java и т.д.. По сути есть всего-лишь три варианта для работы веб-приложения: 1) статические данные, когда нечто выдается 1 в 1, HTML, JS, медиа-содержимое 2) динамические данные, когда они формируются стороной сервера и 3) клиентские приложения, когда сервер выдает данные, а формирование отображения и интерфейса происходит на клиенте. Есть так же гибридный подход, когда страницы подгружаются кусками или часть отображения формируется на клиенте.

    Первый подход можно не рассматривать, он сосуществует, а второй — наиболее распространен. Поскольку большая часть сайтов имеют динамическое содержимое, будь то форум, лента новостей, магазин и т.д., все формируется из базы данных и на сервере. Третий подход все больше распространяется, во-первых, потому что нагрузка на сервер ниже, ниже объем передаваемых данных, во-вторых, потому что как правило клиентское приложение быстрее, но такой подход имеет много ограничений и в общем случае слабо совместим банально с поисковыми машинами. Поэтому использование шаблонизаторов, как способа формировать HTML (и другие вещи) на стороне сервера пока еще основной подход в вебе. Попробуйте хотя бы вывести ленту новостей на главную страницу, обойдясь без этого.
    Ответ написан
    Комментировать
  • Почему moment выводит год неправильно?

    gscraft
    @gscraft
    Программист, философ
    moment для инициализации через "конструктор" moment(...), как и Date в JS, использует метку времени с миллисекундами, чтобы получить объект из unix-метки с секундами, используйте moment.unix(...), этот нюанс стоит учитывать при работе с API, убедиться, какую возвращаете метку.
    Ответ написан
    Комментировать
  • Почему ругается Undefined offset: 18145?

    gscraft
    @gscraft
    Программист, философ
    Вы пытаетесь сделать ++ к несуществующему элементу в массиве $companyStatistics. Сначала проверьте, существует ли элемент.
    UPD немного запутался в Ваших квадратных скобках
    Ответ написан
  • Как сделать переход на другую страницу если имя и пароль верно?

    gscraft
    @gscraft
    Программист, философ
    На какую страницу и зачем хотите перейти? Логин и пароль не собираетесь отправлять на сервер? Я почему уточняю, если дело в этом, то нужно форме добавить атрибут action="/login-form/handler/url" и, по всей видимости, method="post". Ну или перехватить обработку формы / нажатия на произвольную кнопку и отправить данные через AJAX. Если же ничего делать с логином и паролем не собираетесь, то в JS это window.location.href='новый адрес';
    Ответ написан
    2 комментария
  • Буду ли я кому то нужен, зная только python, django и основы верстки сайтов?

    gscraft
    @gscraft
    Программист, философ
    Расширяйте кругозор, изучайте теорию программирования ("Алгоритмы: построение и анализ", "Совершенный код", "Чистый код" и т.д.) и другие платформы, языки и СУБД, тот же JavaScript, а с ним его версии, нужно понимать обязательно, а отсюда и до NodeJS рукой подать. Необходимо уметь работать с контролем версий, с тестированием, знать основы разных окружений, будь то Linux или Docker. Сделайте несколько реальных проектов, если есть возможность — кому-то на заказ или для себя (тот же блог, и не просто блог, а с интересными, сложными решениями, скажем, со ссылками комментариев и пользователей в них между собой, рейтингом материалов; ну или интернет-магазин с нуля), более того, пусть будут и приложения для рабочего стола, а не только веб, навскидку, сделайте приложение на .NET или Qt. Пройдите гайды Go, почитайте уроки .NET Core в официальной документации. Я не думаю, что бывают хорошие программисты, замкнувшиеся в одной технологии. Нужно уметь учиться, разбираться по ходу дела и иметь представление о том, что происходит в мире IT. Будете ли кому-то нужны, это вопрос не по адресу. Возможно уже сейчас сможете устроиться в какую-то небольшую веб-студию, а может быть и нет.
    Ответ написан
    2 комментария
  • Как поправить setInterval в javascript?

    gscraft
    @gscraft
    Программист, философ
    Так Вы, похоже, не делаете clearInterval(countInterval); когда выполняется условие по счетчику? И потом, если используете jQuery, анимировать можно и без таймера, навскидку:
    const animate = ($elements, index) => {
      if (index < $elements.length)
        $elements.eq(index).animate({...}, {...}, () => animate($elements, index+1));
    }
    animate($(selector), 0);

    — jQuery сам анимирует, а по завершению цикла анимации вызовет обработчик, куда передаем следующий шаг (который можно сформировать любым удобным образом, в данном случае некая условная анимация элементов по списку), а когда индекс выйдет за границы селектора — вызова не будет, выполнение завершится.
    Ответ написан
    3 комментария
  • Как правильно сформировать RewriteCond в hcaccsess на определённую папку?

    gscraft
    @gscraft
    Программист, философ
    У Вас явно лишнее: dbtest/REQUEST_FILENAME
    Попробуйте .htaccess в папке dbtest (будет для всех ссылок от dbtest):
    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^ blog.php [L]
    </IfModule>
    Ответ написан
  • Обратный отсчет до определенной даты?

    gscraft
    @gscraft
    Программист, философ
    Ну, очень удобно пользоваться библиотеками вроде moment, luxon, в плане сравнения, API итерации дней и т.д., но можно воспользоваться и стандартным Date, в стандартной библиотеке JS класс даты-времени классный : ) В качестве примера:
    let source = new Date('2020-09-06 07:02:00');
    let current = new Date();
    while (source.getTime() > current.getTime())
       current.setDate(current.getDate() + 1); // просто добавляем дни

    — считать можно в обе стороны и в любой момент получить любые части даты.

    Если Вам нужно вывести что-то в духе "осталось столько-то дней":
    let source = new Date('2020-09-06 07:02:00');
    let current = new Date();
    let diff = new Date(source.getTime() - current.getTime());
    let empty = new Date(0);
    console.log('Months remains:', diff.getMonth() - empty.getMonth());
    let days = diff.getDate() - empty.getDate();
    let hours = diff.getHours() - empty.getHours();
    console.log('Days remains:', hours < 0 ? days - 1: days); // это справедливо и для месяцев, дней
    console.log('Hours remains:', hours < 0 ? 24 + hours : hours);

    — это решение придумал на ходу, возможно предложат эффективнее.
    Ответ написан
    2 комментария
  • Как такое сверстать?

    gscraft
    @gscraft
    Программист, философ
    А в чем проблема-то? Верстайте отдельные блоки, в которых полоса и круг по центру, сверху требуемый текст, и т.д., задайте блоку разные CSS-состояния, .step-completed, .step-selected, .step.-empty, .step-hidden, .step-first, .step-last и т.д., немного напишите на JS, чтобы при клике менять классы.

    Чтобы блоки прокручивались по необходимости, их нужно завернуть в еще один блок, которому задать свойство: overflow: visible (потомкам inline-block или с flex-column & flex-wrap: nowrap), а его завернуть в еще один, которому ограничить ширину и задать свойство overflow-x: auto, это классический подход.

    Тут просто рутина, какие-то под-задачи может вызовут вопросы, но если что, пишите в комментарии.
    Ответ написан
    Комментировать
  • С какого дистрибутива Linux начать?

    gscraft
    @gscraft
    Программист, философ
    Без разницы. Важно не узнать конкретный дистрибутив, а освоить *unix в целом. Вы можете делать это даже на подсистеме Linux в Вашей Windows, в какой-то степени (хотя лучше, все же, Ubuntu). Важно понять командную строку, ходовые утилиты и man, систему разделения прав, подходы к монтированию и разделам дисков, устройство файловой системы, основные настройки, пакетные менеджеры deb / rpm (если он еще жив), /etc, system.d и наверное что-то еще, увы, такой список минимума надо отдельно составлять. А дальше упрется в конкретику: настройки отдельного ПО, как то ssh или iptables.

    В качестве лирического дополнения. По моему опыту первым дистрибутивом "Linux" был FreeBSD, я тогда не понимал разницы, во времена, когда еще не было широкополосного Интернета, брал диск на радио-рынке. Случайно снес все содержимое своего Win-диска, выбрав установку по-умолчанию и сильно расстроился, не сумев завести графическую оболочку. Я даже не уверен, что она была в том CD-дистрибутиве. Но несколько дней веселья оно подарило. Затем был Gentoo Linux, который качали знакомые на 4 DVD, и неделя, убитая на сборку-пересборку. Потом Suse Linux, 9 или 10, вроде бы. Все это отняло уйму времени в сумме, но так, не прочитав ни одной специализированной книги, начал понимать. Хотя, были отдельные статьи, вроде того, как пересобрать ядро (я где-то читал тогда, что с этим система еще быстрее, хотя оно и не нужно было).

    Еще один момент, в Linux сейчас ничего сложного нет. Такая же ОС, автоматизированный процесс установки и основной слой покрыт графическими конфигураторами.

    Еще важный момент, не учитесь по роликам. Берите хардкорную литературу, читайте статьи, да и сам Linux тоже неплохо задокументирован.
    Ответ написан
    Комментировать
  • Как сделать сортировку массива объектов по имени(name)?

    gscraft
    @gscraft
    Программист, философ
    Используйте https://developer.mozilla.org/ru/docs/Web/JavaScri... (на правах примера):
    let array = []; // Ваш JSON, полученный через Ваше API
    array.sort(function compare(a, b) {
      if (a.name === b.name) return 0;
      return a.name < b.name ? -1 : 1;
    });
    Ответ написан
    Комментировать
  • Как сделать редирект после заполнения формы?

    gscraft
    @gscraft
    Программист, философ
    Редирект делает браузер, Вам нужно отправить заголовок Location: header("Location: /{$url}", true, $status); — однако, стоит учитывать, что это может не сработать с некоторыми ajax-библиотеками, там уж смотрите по обстоятельствам.
    Ответ написан
    Комментировать
  • Как подобное можно сверстать?

    gscraft
    @gscraft
    Программист, философ
    Самостоятельно вряд ли напишете, берите любой физический движок и разбирайтесь с ним, например: https://github.com/wellcaffeinated/PhysicsJS или https://brm.io/matter-js/ — там есть демки с подобной функциональностью. Вес решений не берусь оценивать, думаю, можно найти и более минималистичные или позволяющие дробить функционал.
    Ответ написан
    Комментировать
  • Как найти похожее решение по якорной ссылке?

    gscraft
    @gscraft
    Программист, философ
    А почему ищете на codepen? Вам нужно найти "back to top js", например, банально в Google. Скажем, https://www.w3schools.com/howto/howto_js_scroll_to...
    Ответ написан
    Комментировать
  • Почему VSCode стал неправильно определять файлы .js?

    gscraft
    @gscraft
    Программист, философ
    Судя по всему дело в опции: "javascript.implicitProjectConfig.checkJs": true , можете проверить, отключив ее или добавив в начало файла // @ts-check
    Ответ написан
  • Запрет определённого тел номера в input?

    gscraft
    @gscraft
    Программист, философ
    Хотя в этом и нет смысла — решений множество, как и масса вопросов к конкретному окружению. Разумеется, надежнее проверять на стороне сервера: очистите строку номера от всех знаков, кроме цифр, можно отбросить начальные 7/8, и сравните:
    if ( strpos(preg_replace('/[^0-9]+/', '', '+7 999 111-22-33'), '9991112233') !== false ) // ...

    Ультимативным решением будет использование сторонней библиотеки, например —https://packagist.org/packages/giggsey/libphonenum...

    PS разумеется, это может быть решено с помощью JS:
    document.getElementById('input-id').addEventListener(function (event) {
      if (event.target.value.replace(/[^0-9]+/, '').indexOf('9991112233') >= 0)
        event.target.value = '';
    });
    Ответ написан
    Комментировать
  • Как начать карьеру C++ разработчика?

    gscraft
    @gscraft
    Программист, философ
    Увы, никто не скажет, насколько это реально. У меня был опыт, когда без портфеля с С++ устраивался в контору, где разрабатывали софт для лабораторных хим.приборов. Но это везение, проводившие собеседование люди были благосклонны, не дали сложных проверочных заданий и взяли больше за настрой. Тут же может сложиться так, что не подвернется ни одной подходящей вакансии и спрашивать будут по полной, и с опытом в пару лет будет не пройти. Но, да, за 6 месяцев более чем реально хорошо освоить практически любую технологию. Все будет зависеть от рынка труда в Вашем городе. Совета тут два: учитесь как никогда и смотрите уже сейчас вакансии, изучайте их каждый день — какие требования, какие задачи, да собственно уже можете попытаться с кем-то пообщаться на тему трудоустройства, будьте откровенны, а за спрос не бьют.
    Ответ написан
    2 комментария
  • Почему дублируется пустая таблица?

    gscraft
    @gscraft
    Программист, философ
    А каким фреймворком пользуетесь? Очень похоже на то, что возвращается HTML с макетом всей страницы. Кстати, если уж пользуетесь JS / Ajax, почему бы не использовать какой-то движок таблицы? Например, datatables.net (тяжеловат, но можно найти аналоги легче). Другой вариант, использовать что-нибудь вроде vue, хотя все это займет время. Ajax-таблицы позволят разгрузить вывод, ведь можно будет вернуть json.

    С пагинацией, первое, просто переписать в духе того, как формируется таблица:
    $pagination = '';
    if ($page != 1) {
        $pagination .= "<a class=\"page\" href=\"/app/index?page={$prev}\"></a>";
    }
    // ...

    Ну или начать использовать шаблонизатор, например (но подозреваю, что он уже есть, т.к. что-то тащит за собой весь макет (layout) страницы).

    ЗЫ так же событие клика может происходить дважды, попробуйте в инструментах разработчика (ctrl + shift + i), поставить точку остановки на строке 'let column_name = '.
    Ответ написан
  • Почему self не вызывается?

    gscraft
    @gscraft
    Программист, философ
    А что у вас self делает в def end(self, lang=self.lang) , это так не работает, нельзя в определении метода передать self в качестве значения по умолчанию. К слову, у Вас в конструкторе self.lang = "en", игнорируется lang. В методе end у Вас уже есть self внутри метода и переменная lang. Сравнение должно быть внутри (например):
    class X:
        def __init__(self, lang=None):
            self.lang = lang
    
        def end(self, lang=None):
            if not lang:
                 lang = self.lang

    — хотя в этом нет особого смысла.
    Ответ написан
    Комментировать
  • Как реализовать итератор анонимным классом?

    gscraft
    @gscraft
    Программист, философ
    $o = new class ([1, 2, 3]) implements \Iterator {
        protected array $data;
        protected int $position;
        public function __construct(array $data) { $this->data = $data; $this->position = 0; }
        public function current () { return $this->data[$this->position]; }
        public function key () { return $this->position; }
        public function next () { ++$this->position; }
        public function rewind () { $this->position = 0; }
        public function valid () { return isset($this->data[$this->position]); }
    };
    
    foreach ($o as $i => $v) echo "$i => $v", PHP_EOL;
    Ответ написан