• Как вывести рекурсивно?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Кристина, выкладываю на Ваш суд мою попытку объяснить суть рекурсии. Код имеет комментарии.
    сам код с пояснениями
    // итак, пусть будет задан некий абстрактный массив 
    // с произвольной глубиной вложенности
    // при этом элементами массива могут быть
    // строки и вложенные массивы
    const arr = [
      "string 1",
      "string 2",
      [
        "string 3.1",
        "string 3.2",
        [
          "string 3.3.1",
          [
            "string 3.3.2.1",
            "string 3.3.2.2"
          ],
          "string 3.3.3",
        ]
      ],
      "string 4",
      [
        "string 5.1",
        [
          "string 5.2.1",
          [
            "string 5.2.2.1",
            "string 5.2.2.2"
          ],
          "string 5.2.3"
        ]
      ]
    ];
    
    // так как глубина вложенности произвольная
    // для обхода всех элементов оптимальным
    // будет использовать рекурсивную функцию
    function parseArray(data) {
      let retstr = '';
      if(typeof data === "string"){
        // если строка, то выводим ее 
        // содержимое как элемент текущего списка
        retstr += '<li>'+data+'</li>';
      }else if(Array.isArray(data) ){
        // если массив, то создаем влеженный список
        retstr += '<ul>';
        // и каждый элемент массива отдаем на обработку
        // нашей функции, вызывая ее из нееже (это и есть рекурсия)
        // таким образом мы обеспечиваем обход
        // всех элементов нашей древовидной структуры
        // независимо от ее глубины вложенности и порядка
        // следования элементов
        data.forEach(value=>{
          retstr += parseArray(value);
        });
        // после прохода всех элементов внутри текущего
        // массива закрываем текущий список
        retstr += `</ul>`;
      }
      return retstr;
    }
    
    
    let wrap = document.querySelector('.wrap');
    wrap.innerHTML = parseArray(arr);

    Ответ написан
    2 комментария
  • Не работают стили и js на html странице возвращенной с node.js сервера. Что делать?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Есть похожий вопрос на тостере: Как в Node.js отдавать статику без Express.js?

    Также Вы можете вместо модуля http использовать более высокоуровневый фреймворк Express.

    установка
    простейший web сервер
    раздача статических файлов

    пример Express приложения раздающего статику
    var express = require('express');
    var app = express();
    var port = 3000;
    
    // тут надо отметить что роутеры в Express выполняются последовательно 
    // и каждый из них имеет возможность прекратить дальнейшую обработку запроса последующими роутерами. 
    // express.static в случае нахождения запрашиваемого файла так и поступит.
    
    // любой запрос к http://вашдомен_или_IP/public будет восприниматься как запрос статики
    app.use('/public', express.static(__dirname + '/public'));
    
    // любой запрос будет восприниматься как запрос статики.
    app.use(express.static(__dirname + '/public'));
    
    
    app.use((err, request, response, next) => {
        // логирование ошибки, пока просто console.log
        console.log(err)
        response.status(500).send(‘Something broke!’)
    })
    
    app.listen(port, function () {
      console.log('Example app listening on port '+port+'!');
    });


    Ответ написан
    3 комментария
  • Как открыть веб-сервер на Node.js для доступа из Интернета?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Как вариант для экспериментов и хомяков:
    1. Купить доменное имя (например тут, хотя выбор конечно за вами. В зоне .ru примерно 600 руб в год)
    2. Получить статический IP (купить у провайдера, примерно 50р в месяц), либо настроить чтото типа ddns (умеют почти все современные роутеры через свою вэбку).
    3. В случае статического IP настроить привязку купленного доменного имени к вашему статическому IP. Для этого порывшись по сайту конторы, продавшей вам доменное имя найти сервис DNS для их клиентов. У большинства пользование таким сервисом бесплатно.
    В случае ddns и ему подобных настроить привязку купленного доменного имени к вашей учетке в сервисе ddns
    4. Купить что то типа raspbery PI или orange PI, установить на него чтото типа armbian, nodejs, подключить к роутеру, настроить IP в локалке (пункт не обязательный, но удобства неоспоримы, висит себе бесшумно на стене возле роутера, прибитый гвоздем и раздает ваши сайты в нет :).
    5. Прокинуть необходимые порты в роутере на IP вашего сервера (raspbery PI или orange PI) (учтите что внешний порт будет 80 а внутренний на сервере скорее всего 3000. Номер внутреннего порта зависит только от того на каком порту вы запустите ваше nodejs приложение)
    6. Профит!!! Как только обновятся DNS записи (от пары минут до суток, в зависимости от выбранного DNS сервиса) вы, и весь мир вместе с вами сможет посетить ваше nodejs приложение по адресу http://ваш_домен.зона/

    PS: Далее вам останется только:
    1. Озаботится https (Let's Encrypt вам в помощь)
    2. Зарегать в вашем домене несколько поддоменов (например forum.ваш_домен.зона, game.ваш_домен.зона, chat.ваш_домен.зона, cloud.ваш_домен.зона). Хорошая новость в том, что у большинства сервисов, содержание вашего доменного имени и регистрация поддоменов бесплатны (если конечно вы их клиент - купили доменное имя у них)
    3. Установить на серв nginx и настроить его, чтобы перекидывал http запросы на https, сам проверял сертификаты и чтобы раскидывал входящие запросы по соответствующим сервисам уже в локалке и через http. (можно конечно озадачится чтобы сервисы на node сами свои сертификаты проверяли, но на мой взгляд это бессмысленно, потому что если кто взломает ваш сервер, ему будет глубоко наплевать зашифрованными или нет ходят пакеты между вашим nginx и сервисами на ноде через lo0.
    Ответ написан
    2 комментария
  • Возможно ли создать скругленный navbar?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    4 комментария
  • Как использовать source в handlebars из внешнего файла, а не из инлайн код (чтобы добавить css, js и изменять title)?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Можно сделать так:
    var fs = require('fs');
    
    var source = fs.readFileSync('./template.html', 'utf8');
    
    var template = handlebars.compile(source);
    var html = template(data);
    console.log(html);


    Также, неплохой идеей было бы делать это асинхронно:
    var fs = require('fs');
    
    fs.readFile('./template.html', 'utf8', function(err, source) {
      var template = handlebars.compile(source);
      var html = template(data);
      console.log(html);
    });
    Ответ написан
    Комментировать
  • Как сделать телеграм-бота с подключаемыми операторами?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Сделать это не сложно, но по сути вы просите написать за Вас код такого бота.

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


    Алгоритм работы примерно такой:
    1. при поступлении обращения, запрос онлайн-оператора у планировщика;
    2. передача вопроса клиент выбранному планировщиком оператору;
    3. по запросу оператора передача истории общения клиента;
    4. трансляция сообщений между клиентом и выбранным оператором и их сохранение в истории. Процесс продолжается тех пор пока (тут вы решаете сами что будет являться признаком окончания беседы. как вариант, команда от оператора и/или клиента.);
    5. сообщить планировщику об освобождении оператора;
    6. cохранить в истории отметку о том был ли решен вопрос а также uuid пользователя и оператора.


    Реализация данной схемы даст минимальный необходимый функционал, который в последствии может быть расширен при необходимости
    Ответ написан
    Комментировать
  • Будет ли интересен скрипт на perl производящий голосовой обзвон (оповещение) через usb модем huawei e1550?

    lastuniverse
    @lastuniverse Автор вопроса
    Всегда вокруг да около IT тем
    Спасибо за проявленный интерес. Выложил статью habrahabr.ru/post/192930/
    Ответ написан
    Комментировать