• Почему условие не работает?

    keksmen
    @keksmen
    Just a programmer
    Дело в том, что вот этот участок
    for k in 0..z
    определяет итерацию от 0 до z-1. Поэтому, k никогда не равно z.
    Если нужна итерация от 0 до z, вам стоит использовать следующий синтаксис:
    for k in 0..=z
    Ответ написан
    Комментировать
  • Rust, как вернуть struct?

    @forspamonly2
    struct вернуть не проблема - он отдаётся вместе с владением наружу, и всё.

    а проблема тут в том, что конкретно этот xml-парсер позиционируется как zero-allocation, то есть он не занимает лишнюю память, а при получении значений тэгов и атрибутов возвращает слайсы самого исходного текста xml.

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

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

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

    @Hydro
    C#/.NET Developer
    Надеюсь, что правильно понял Ваш вопрос.

    Пример

    Храню в БД фото с марса в формате HD, делаю запрос на 100 фотографии, задача - показать 100 фоток последовательно на экране.

    Стандартный поход: делаю запрос к базе на 100 фотографии, жду 2 секунды, получаю массив из 100 фотографии,
    итератором бегаю по коллекции и показываю картинки на экране
    псевдокод:

    pics = GetPicsFromDatabase();
    foreach(var pic in pics)
      ShowPic(pic)


    Реактивный подход: делаю запрос к базе на 100 фотографии и обработчику запроса задаю коллбек, обрабатывающий следующий элемент коллекции

    псевдокод:
    // somecode
    GetPicsFromDatabaseReactive(NextPictureHandler);
    // somecode
    NextPictureHandler(Image pic)
    {
      ShowPic(pic)
    }

    В первом случае мы сами явно вытягивали следующий элемент списка (pull), а во втором случае - источник данных сам вкидывал нам следующий элемент, когда он был готов (push).
    В первом случае мы ждем, пока сформируется источник данных (как правило занимаем тред) и после этого сами ручками просматриваем результат, во втором случае источник данных сам нас уведомит, когда будет готов.

    Что это нам дает?
    Асинхронность - в UI например это дает отзывчивость)
    Масштабируемость - источник данных (коллекция картинок) и приемник (наш псевдкод, показывающий картинки) не связаны, отсутствие связи дает нам возможность подключить хоть 10 обработчиков картинок (пример один в черно-белом выводит, другой сепию накладывает и т.п.)
    Отказоустойчивость достигается тем, что если сдох первый обработчик, например в его треде вылетел эксепшн, который повалил тред (прошу прощения за грубый пример), то действие выполнится резервным обработчиком (мы же их можем навешивать хоть 10, правда?)
    Ответ написан
    3 комментария
  • Есть ли уже литература по C++ вместе с Qt5, QtQuick, qml всреде QtCreator?

    Zifix
    @Zifix Куратор тега Qt
    Barbatum
    Кончено, можно учить сначала C++, потом Qt5 потом qml, но мне кажется что в одной книге это было бы удобнее.
    Размером такая книга будет с войну и мир, так что не думаю, что она когда-нибудь появится.

    Потому план такой:
    • Берем любую книгу по С++, того же Шилдта например
    • Берем любую книгу по Qt не ниже 4, того же Шлее например
    • Берем примеры программ из стандартной поставки и смотрим их

    Получится правильная общая картина, которая легко дополняется документацией и статьями. Вот еще хороший обзорный мануал: qmlbook.github.io
    Ответ написан
    Комментировать
  • Есть ли уже литература по C++ вместе с Qt5, QtQuick, qml всреде QtCreator?

    Conacry
    @Conacry
    Вот хорошая книга: Шлее М. - "Qt 5.3. Профессиональное программирование на C++".
    Ответ написан
    Комментировать
  • Почему в шаблоне проектирования MVC именно 3 компоненты?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    То что вы описываете - подход с использованием толстых контроллеров. Откройте для себя дивный мир Service-Oriented Architecture. Вообще как, модели, они же доменные модели, это просто представление данных. За сохранение данных и их обработку, валидацию и т.д. отвечают сервисы. Контроллеры так же можно представлять в виде сервисов, и из задача будет только проверка, имеет ли пользователь доступ к данной операции, что собственно нужно сделать и т.д. Таким образом контроллер может вообще не иметь понятия о том, где хранятся данные, как они обрабатываются... Он просто смотрит что пользователь может сохранять данные, передает данные пользователя сервису, тот сохраняет....

    Короче как-то так.

    Пример модели:
    class User
    {
        private $id;
        private $email;
        private $password;
        private $enabled;
    
        public function getId() {...}
        public function getEmail() {...}
        public function setEmail($email) {...}
        public function getPassword() {...}
        // за хэширование пароля отвечает сервис, модель ничего об этом знать не должна.    
        public function setPassword($password) {...} 
        public function isActive() {}
        public function activate() {}
    }


    пример контроллера
    /**
     * @Route("/users")
     * @Method("POST")
     */
    public function createUserAction(Request $request) {
        if (!$this->get('security.context')->isGranted('ROLE_ADMIN')) {
            throw new AccessDeniedException();
        }
    
        $user = new User();
        $form = $this->createForm(new UserForm(), $user);
        $form->bindRequest($request);
        if (!$form->isValid()) {
            // save errors to session, redirect     
            return $this->redirecti(...);
        }
     
        $user = $form->getData();
        $this->get('app.user_manager')->createUser($user);
    
        return $this->redirect();
    }
    Ответ написан
    Комментировать
  • Разъяснить код на Haskell

    @malerix
    Плохо в этом разбираюсь, но всё же попробую прокомментировать:
    Вначале импортируются модули из библиотек:
    conduit - для работы с потоками данных (если я не ошибаюсь, раньше пользовались iteratee для этих целей);
    http-conduit - "расширение" для Network.HTTP для работы с этим conduit;
    Binary, ByteString - думаю, понятно - для преобразований типов данных.

    Создаём менеджер соединений из дефолтных настроек
    manager <- newManager def
    Создаём запрос:
    req <- parseUrl "http://localhost:8080/api/v1.0/streams/counter"

    Затем дополняем заголовки в запросе:
    let headers = requestHeaders req
          req' = req {
              requestHeaders = ("Accept", "application/x-json-stream") :
                               headers
            }

    "Безопасно" (тут я навряд ли смогу точно описать, лучше почитать документацию) "запускается" монада. Что-то вроде try, только с потокобезопасностью и прочим.
    runResourceT $ do
        res <- http req' manager
        responseBody res $$+- CB.lines =$ counterSink

    Здесь вешаем (=$) обработчик "counterSink", который будет ждать получения всех данных ($$+-), причём уже в виде строк (CB.lines).
    Функция counterSink ждёт данные, и, если они пришли, выводит в stdout:
    --------
    <данные>
    Ответ написан
    Комментировать