• Какую программу использовать для простенького 3D моделирования?

    Blender
    Плюс, Blend4Web для публикации всего действа в виде красивой презентации.
    Ответ написан
    1 комментарий
  • Как исправить проблему с регистрацией и службой поддержки на хабре?

    Boomburum
    @Boomburum Куратор тега Хабр
    Местный
    Проверьте, чтобы у вас в браузере корректно работали всякие там JS, рефереры, куки итд, чтобы ничего не мешало — тогда всё должно получиться.
    Ответ написан
    1 комментарий
  • Что я делаю не так в открытии порта?

    Jump
    @Jump Куратор тега Windows
    Системный администратор со стажем.
    Подскажите что я упустил, или что я делал не так?
    Похоже вы пропустили главное.
    Чтобы получить доступ к своему компьютеру из интернета нужно иметь белый IP адрес.
    Если он есть, тогда можно пробрасывать порты с роутера, которому присвоен белый адрес, на компьютер.
    Если его нет - что толку пробрасывать? Доступа все равно не будет.

    Похоже у вас банально нет белого(реального) IP адреса.
    Вот и все.
    Ответ написан
  • Как правильно выводить информацию из QVector?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Откройте для себя Model/View в Qt. В частности, ваша задачка с каталогами описана здесь.

    Вкратце: у вас есть модель, в котором вы связываете ваш способ хранения (QVector в вашем случае) со стандарным интерфейсомQAbstractItemModel (или его потомки QAbstractListModel, QAbstractTableModel или QAbstractTreeModel), который можно передать в один из стандартных вью-виджетов (QListView, QTableView, QTreeView). Реализовав интерфейс (переопределив виртуальные методы data и setData для role==Qt::DisplayRole и Qt::EditRole), вы можете просто изменять состояние модели, а вью-виджеты подхватят изменения автоматически.

    Кроме того, есть еще такая штука - QDataWidgetMapper. Он умеет привязывать виджеты (даже обычные, не View) к определенным полям в модели.
    Пример

    Пример объемный, но минимально полный, содержащий всю необходимую инфраструктуру. Допустим, мы хотим создать редактор для некоторых статей (блога?). Нам нужен простой класс Article, чтобы собрать в кучу данные о каждой отдельной статье:

    class Article
    {
    public:
        Article(int id, const QString& title, const QString& content) 
            : _id(id), _title(title), _content(content) {}
    
        int id() const { return _id; } 
        void setId(int id) { _id = id; }
    
        QString title() const { return _title; } 
        void setTitle(const QString& title) { _title = title; }
    
        QString content() const { return _content; }
        void setContent(const QString& content) { _content = content; }
    
    private:
        int     _id;
        QString _title;
        QString _content;
    };

    Для него напишем модель хранения этих статей - ArticlesModel, содержащей массив статей и методы для их добавления/удаления. Кроме того, для нее мы реализуем стандартный интерфейс QAbstractTableModel (методы rowCount, columnCount, data и setData), чтобы виджеты знали, как оттуда брать и как обновлять данные.

    class ArticlesModel :
            public QAbstractTableModel
    {
    public:
        ArticlesModel(QObject *parent=nullptr);
    
        void addArticle(const Article& art);
        void removeArticle(int id);
    
        //QAbstractTableModel interface implamentation
        int rowCount(const QModelIndex &/*parent*/) const override;
        int columnCount(const QModelIndex &/*parent*/) const override;
    
        bool data(QModelIndex& index, const QVariant &value, int role) const override;
        QVariant setData(QModelIndex& index, int role) override;
        
    private:
        std::vector<Article> _articles;
    };
    
    // =================================================================
    
    ArticlesModel(QObject *parent/*=nullptr*/) 
        : QAbstractTableModel(parent)
    {
    }
    
    void ArticlesModel::addArticle(const Article& art) {
        _articles.push_back(art);
    }
    void ArticlesModel::removeArticle(int id) {
        auto found = std::find_if(begin(_articles), end(_articles), 
                                [id](const Article& art) {
                                    art.id() == id;
                                });
        if (found != std::end(_articles)) {
            _articles.erase(artIt);
        }
    }
    
    
    int ArticlesModel::rowCount(const QModelIndex &/*parent*/) const override {
        return _articles.size();
    }
    int ArticlesModel::columnCount(const QModelIndex &/*parent*/) const override {
        return 2;
    }
    
    bool ArticlesModel::data(QModelIndex& index, const QVariant &value, int role) const override {
        if (!index.isValid) return QVariant();
    
        if (role == Qt::EditRole) {
            switch (column) {
                case 0: 
                    QVariant(_articles[index.row()].setTitle(value.toString()));
                    return true; 
                case 1:
                    QVariant(_articles[index.row()].setContent(value.toString()));
                    return true; 
            }
        }
        return false;
    }
    
    QVariant ArticlesModel::setData(QModelIndex& index, int role) override {
        if (!index.isValid) return QVariant();
    
        if (role == Qt::DisplayRole || role == Qt::EditRole) {
            switch (column) {
                case 0: return QVariant(_articles[index.row()].title()); 
                case 1: return QVariant(_articles[index.row()].content());
            }
        }
        return QVariant();
    }


    Тогда можно сделать так:

    // this - это какой-то родительский виджет
    
    auto titleEditor = new QLineEdit(this);
    auto contentEditor = new QTextEdit(this);
    
    QAbstractTableModel *model = new ArticlesModel(this);
    model->addArticle(Article(1, "Hello title", "Hello content"));
    model->addArticle(Article(2, "Another title", "Another content"));
    
    auto mapper = new QDataWidgetMapper(this);
    mapper->setModel(model);
    mapper->addMapping(titleEditor, 0);
    mapper->addMapping(contentEditor, 1);
    mapper->toFirst(); // Переключаемся на первый элемент модели


    Теперь мы можем добавлять/удалять статьи в model->add/removeArticle(const Article&), переходить с заметки на заметку с помощью mapper->setCurrentIndex(int index), менять содержимое заметок в редакторе.

    Можно добавить QListView, так же передать туда модель через setModel() и связать сигнал изменения текущего элемента списка с тем же действием mapper, добавить пару кнопок для добавления/удаления заметок и мы получим полноценный редактор.
    Ответ написан
    Комментировать
  • Как бороться с плагиатом мобильного приложения?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    Почему люди уходят на чужой клиент? Чем он лучше? Изучи, подлатай свой.

    Если не можешь сделать лучше, а приложение пользуется таким спросом, что появляется много сторонних клиентов, это можно даже монетизировать, сделав отдельный девелоперский API с авторизацией и предоставляя его для авторов сторонних клиентов за определенный $$. Этот способ нам в свое время оказался более удобным, чем активно развивать свой клиент.
    Тем более, что крупные разработчики будут с тобой сотрудничать, и стараться соблюдать договоренность по искользованию API, а мелким делать в обычном API делать подлянки, они устанут и выйдут из конкурса.
    Ответ написан
    Комментировать
  • Почему использование ssh-ключей лучше простой аутентификации по паролю?

    zooks
    @zooks
    Frontend
    Обычные пароли хуже по следующим причинам:
    1. Их можно подобрать перебором
    2. Нужно каждый раз вводить

    Лично я перевел все свои сервера на ключи когда увидел сколько китайских IP пытаются законнектиться по паролю.
    Ответ написан
    Комментировать
  • Прокси-сервер для windows сети. На Linux. Что сейчас модно?

    Black_beard_ast
    @Black_beard_ast
    Sysadmin/Ops engineer.
    Используем pfsense. Все умеет, построен на фряхе+сквид.
    Ответ написан
    4 комментария
  • Прокси-сервер для windows сети. На Linux. Что сейчас модно?

    @silverjoe
    Squid настолько банален и затерт до дыр, что найти пару годных статей по его настпойке и интеграции с AD не состаивит никаких усилий. На том же хабре про него есть интересные статьи.
    Ответ написан
    8 комментариев
  • Как быстро и дешево создать mesh-сеть?

    @Fixid
    ESP8266 вам в помощь, есть готовые реализации. Цена точки с полной обвязкой выйдет 200-400р в зависимости от желаемой автономности
    Ответ написан
  • Доступ в интернет по 2 каналам. Возможно-ли?

    Jump
    @Jump
    Системный администратор со стажем.
    Да запросто -
    Самое простое раскидать пользователей по каналам.
    Чуть сложнее раскидать разные виды трафика по каналам.
    Главное следить за тем чтобы ответ шел по тому же каналу что и запрос.
    Из оборудования - микротик вполне подойдет.
    Ответ написан
    Комментировать
  • Есть ли в stl такой мьютекс, который можно разблокировать из другого потока?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Если тебе надо заблокировать один поток (или несколько, поставив их в очередь блокировки) до события в другом потоке, то тебе хорошо подойдет std::condition_variable.

    На основе этой сущности можно реализовать механику "wait() -> notify/notifyall()" из pthread_monitor или из Java.
    Ответ написан
    2 комментария
  • Почему в С++ не работает цикл for?

    @khrisanfov
    Программист
    Потому что там не запятая нужна, а точка с запятой
    for(int a=0; a <= 10; a++) {}
    Ответ написан
    7 комментариев
  • При попытке обновить FreePBX выдает ошибку связанную с правами доступа, как исправить?

    jamakasi666
    @jamakasi666 Куратор тега Linux
    Просто IT'шник.
    Мой совет на собственном опыте, не стоит обновлять FreePBX\Elastix и любые другие сборки с вебмордами. В большинстве случаев они больше поломают конфигурацию чем привнесут исправления или новые фичи.
    Практика показывает что если поставил, то все стоп, все обновления выключить и жить до победного на этой версии, лечить ручками глюки которые досаждают и не ждать чудес что вот обнова и все будет хорошо.
    Ответ написан
    7 комментариев
  • Что за меню я случайно открыла при загрузке планшета?

    15432
    @15432
    Системный программист ^_^
    Включение с удерживанием кнопки громкости - стандартная комбинация для входа в recovery меню андроид устройства. В нём можно сбросить настройки, обновить прошивку. Вот рут доступа в них не видел. Может вы неправильно прочитали пункт меню. А может и действительно всё так просто. Рут доступ пользователю не дают, чтобы он не навредил себе (с рутом можно модифицировать системные файлы так, что устройство перестанет запускаться). Например, на системе MIUI включение рут доступа находится в одном из меню стандартных настроек. В общем, кому нужно - рут получит.

    И нет, вы не взломали планшет. Под взломом обычно подразумевают получение несанкционированного доступа к данным или функциям устройства в обход стандартных систем защиты. Вы же воспользовались встроенным функционалом.
    Ответ написан
    1 комментарий
  • Как взять данные из таблицы с названием, которое хранится в поле другой таблицы?

    @saltydogd
    Как-то нетрадиционно неправильно хранить название таблиц в таблице, ибо все это и так лежит в системных таблицах, по разному у каждой СУБД. Вы во главу поставили закладки, а надо просто разбросать и нормализовать пары сущность-таблица и делать запрос с джойном по ID - вы это и так делаете. Вы не можете часом унифицировать (неизвестно что вы храните в каждой из новостей/комментариев/юзеров, но если это просто аннотация с урлом, то это будет решением) закладки в единую таблицу, с полем тип, который вынесен в отдельную таблицу? Потом выбор сущности по типу.
    Ответ написан
    2 комментария
  • Где найти честного программиста на почасовую оплату?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Можно ли найти человека на почасовую оплату на таких условиях? И где можно найти, чтобы работала делалась добросовестно?
    Встречные вопросы:
    1. Можно ли найти работодателя, который платил бы за сделанную работу вовремя и без дополнительных просьб и задач?
    2. Который всегда бы держал договорённости и никогда не изменял бы их в любой удобный момент в выгодную для себя сторону?
    3. Который гарантировал бы исполнение договорённостей сделки со своей стороны максимально эффективно и чётко?

    Почитайте:
    1. https://sitecoder.blogspot.ru/2016/09/comfortable-...
    2. https://sitecoder.blogspot.ru/2015/12/cost-calcula...
    Ответ написан
    8 комментариев
  • Где найти честного программиста на почасовую оплату?

    borisdenis
    @borisdenis
    Ленив и вреден...
    Программиста с почасовой оплатой без траты ни минуты учтенного времени на "чай" Вы никогда не найдете, на условия с тотальным контролем никто за обычную плату не согласится, только с хорошей наценкой и то маловероятно.
    Вам наверное лучше четко обговаривать сроки выполнения и отдельно оговорить что в случае превышения сроков уменьшать итоговую сумму оплаты допустим на 5% за каждый день просрочки по вине исполнителя. Ну и само собой в ТЗ должны быть оговорены все требования к продукту и используемые технологии. В случае дополнительного "хочу вот эту плюшку" с Вашей стороны срок обговаривается заново.
    Ответ написан
    4 комментария
  • Почему этот код возвращает такой странный ответ?

    Godless
    @Godless
    я подозреваю нужно вернуть не key, а min. И вообще зачем key? Или нужен индекс минимального? Тогда инициализацию не забудьте как уже выше указали.

    И цикл надо с 1 начинать.
    Ответ написан
    3 комментария
  • Почему этот код возвращает такой странный ответ?

    15432
    @15432
    Системный программист ^_^
    Вы не инициализировали key
    int key = 0;
    Ответ написан
    4 комментария