• Анонимный Дед Мороз 2019-2020: пост хвастовства новогодними подарками
    +12
    Я в этом году прощелкал сообщение от Снегурочки, но подарок все равно ко мне приехал:)
    Хватаюсь —
    вот он:
    image

    Большое спасибо! Всех с наступающим!
  • 5 распространенных ошибок начинающих программистов на Python
    +1
    Я, конечно, фантазирую, но допускаю ситуации вида:
    keys = read_keys_from_json_from_other_service() #[0, 1, True, 2]
    res = dict()
    for key in keys:
        value = str(key)
        # Some additional code
        res[key] = value

    В результате получим, что в res будет {0: '0', 1: 'True', 2: '2'}

  • 5 распространенных ошибок начинающих программистов на Python
    +1
    Речь идет только про параметры по умолчанию. Если внутри функции создается локальный объект, то при следующем вызове он создастся вновь. Вот пример:
    def get_lst(a):
        lst = []
        lst.append(a)
        return lst
    get_lst(1)
    [1]
    get_lst(2)
    [2]
    

    Вы же про это спрашивали, верно?
  • 5 распространенных ошибок начинающих программистов на Python
    0
    del.
  • Анонимный Дед Мороз 2018-2019: пост хвастовства новогодними подарками
    +6
    Наконец-то и я получил свой подарок от Дедушки из Зеленограда — будем играть теперь зимними вечерами!
    Спасибо!
    Открытка и настолочка

  • Знакомство с Тестированием в Python. Ч. 2
    –1
    Вот как выглядит разделение интеграционных и модульных тестов в вашей статье:
    Неправильная картинка


    А вот как в оригинальной:
    Правильная картинка
    image

    Разница принципиальная, не так ли?
  • Знакомство с тестированием в Python. Ч.1
    +3
    1) Вывод unittest:
    Заголовок спойлера
    $ python test_sum_unittest.py
    .F
    ======================================================================
    FAIL: test_sum_tuple (__main__.TestSum)
    — Traceback (most recent call last):
    File «test_sum_unittest.py», line 9, in test_sum_tuple
    self.assertEqual(sum((1, 2, 2)), 6, «Should be 6»)
    AssertionError: Should be 6

    — Ran 2 tests in 0.001s

    FAILED (failures=1)



    2) Вывод nose2:
    Заголовок спойлера
    $ python -m nose2
    .F
    ======================================================================
    FAIL: test_sum_tuple (__main__.TestSum)
    — Traceback (most recent call last):
    File «test_sum_unittest.py», line 9, in test_sum_tuple
    self.assertEqual(sum((1, 2, 2)), 6, «Should be 6»)
    AssertionError: Should be 6

    — Ran 2 tests in 0.001s

    FAILED (failures=1)



    При этом говорится, что
    становится все сложнее понимать и использовать данные вывода unittest

    Из примеров в статье не видно, в чем разница в выводе.
  • Управление окружением Python c Pipenv
    0
    Понял, спасибо!
  • Управление окружением Python c Pipenv
    +2
    В статье сравнивается работа pip и pipenv на двух примерах. pip:
    $ virtualenv venv
    $ source venv/bin/activte
    $ pip install Flask gunicorn
    pipenv:
    $ pipenv install Flask gunicorn

    А почему pipenv показан не так?
    $ pip install pipenv
    $ pipenv shell
    $ pip install Flask gunicorn

    Я pipenv не использовал и предубеждений против него не имею, просто любопытно.
  • 15 советов по работе с Github
    0
    Когда-то использовал Sourcetree — было вполне себе неплохо.
  • Как создавать 3d модели с помощью Python
    0
    Спасибо, я без подсказки не въехал:)
  • Релиз YouTrack 2017.4: отчет об оценке времени, поддержка Markdown и многое другое
    0
    Как я понял, речь не про SpentTime, а про Estimation — оценку времени задачи.
  • Дубль два: русский интернет-магазин с ценами AliExpress снова зовёт тестеров и раздает дорогие подарки
    +12
    «В любой непонятной ситуации предлагай вибраторы»
  • Обнаружение дефектов кода типа «Expression Issues» (CWE-569)
    0
    Скажите, пожалуйста, а удалось ли исправить проблему из комментария?
    Сейчас я дополнил код, теперь он выглядит
    так:
    bool CheckPointer(int value)
    {
       int* intPtr(new int(value));
       std::cout << std::endl << *intPtr << std::endl;
       return true;
    }
    class A {
            int x;
            public:
                void bar() {
                    std::cout << x << "Test!\n";
                }
    };
    
    int main()
    {
        CheckPointer(5);
        A* a;
        a->bar();
    
        int adminPassword(123456);
        int currentUserPassword(123);
        if (currentUserPassword = adminPassword)
        {
            std::cout << "You are admin";
        }
        else
        {
            std::cout << "You are not admin";
        }
        return 0;
    }
    
    Дефект CWE-481 AppChecker обнаруживает, но никаких других проблем он не видит. Но и мой древний компилятор выдает warning: suggest parentheses around assignment used as truth value

    P.S. Было бы интересно почитать о том, как именно находить такие дефекты в коде и как устроена иерархия ошибок CWE: сначала ожидал, что анализатор найдет CWE-569, а потом уже понял, что CWE-481 является частным случаем CWE-480, а CWE-480, в свою очередь, дочерний дефект от CWE-569.

  • Обнаружение в коде дефекта «разыменование нулевого указателя»
    0
    Поддержка CI (Jenkins, TeamCity) также есть, но в альфа-версии

    Я не заметил этот комментарий от разработчиков, а сейчас AppChecker на такое не очень способен (по крайней мере, доступная для скачивания версия).
  • Обнаружение в коде дефекта «разыменование нулевого указателя»
    +4
    А как аудит кода проводят вышеозначенные специалисты?
    Насколько я понимаю, им тоже придется запустить сборку проекта, чтобы гарантировать соответствие исходников и бинарных файлов. Или там другие продукты используются?
  • Обнаружение в коде дефекта «разыменование нулевого указателя»
    +2
    Да, я сам удивился, что дефект не найден — и поэтому решил сделать специальный пример. Удалось ли проверить этот тест из комментария выше?
    Я работаю из под QtCreator, pro-файл имеет
    следующий вид:
    TEMPLATE = app
    CONFIG += console
    CONFIG -= app_bundle
    CONFIG -= qt
    
    SOURCES += main.cpp
    

    Собирается MinGw, версия Qt: 4.6.2
    И CppCheck, и PVS-Studio на нем отработали достойно, а AppChecker почему-то ничего не нашел. Хотя в логах разбор cpp-файла присутствовал.
    Спрашиваю это потому, что остальные проекты собираются схожим образом, и без примера нет смысла говорить о проверке реального кода.
  • Обнаружение в коде дефекта «разыменование нулевого указателя»
    +3
    Вы правы, CppCheck всё нашел. Было уже поздно и я проверял файл, в котором этих ошибок еще не было:( В этом плюс AppChecker'а и PVS-Studio: там что ты компилируешь, то и проверяешь.
    Тем не менее, AppChecker ничего подозрительного не нашел в этом коде.
  • Обнаружение в коде дефекта «разыменование нулевого указателя»
    +13
    Попробовал и понял, что сравнение в пользу PVS-Studio.
    Проверял я на standalone-приложении. Отпишу кратко впечатления от первого запуска. При первом запуске увидел отличную
    картинку:

    Проверил на двух машинах, проблема воспроизводится. Но на дальнейшую работоспособность никак не влияет, кажется.
    Отличие от AppChecker'а — наличие удобного standalone-приложения: тоже приходится запускать мониторинг вызовов компилятора, но делается это из нормального графического интерфейса, а не из консольной утилиты. Результаты работа мониторинга никуда передавать не надо, они сразу отображаются в окне приложения PVS-Studio Standalone.

    Проект с Qt и сторонними библиотеками вполне себе проверился. Ничего критичного там, к счастью, не нашлось, но пару членов класса мы инициализировать забываем:(
    Древний проект на Си с классами тоже прошел сканирование: 120 ошибок высокой важности, 168 — средней, 870 — низкой. Примеры ошибок:
    V570 The 'Parabola' variable is assigned to itself. SomeFileName.cpp 287
     Parabola      =Parabola ;

    V522 Dereferencing of the null pointer 'SetterGetter' might take place. OtherFileName.cpp 305
    if ( SetterGetter==0 )
    	{
    		SetterGetter->set(false) ;
    	}

    При проверке старых проектов увидел странные дефекты:
    V546 Member of a class is initialized by itself: 'd(d)'. qsharedpointer_impl.h 561
    inline QWeakPointer(X *ptr) : d(ptr ? d->getAndRef(ptr) : 0), value(ptr)
        { }


    V672 There is probably no need in creating the new 'stream' variable here. One of the function's arguments possesses the same name and this argument is a reference. Check lines: 8, 17. entityhelper.cpp 17
    void PrintEntityParams(QDebug& stream, const paramsMap_t& parameters)  // 8 строка
    {
        if (parameters.isEmpty())
        {
            return;
        }
    
        if (!SingletonDataProvider::GetInstance().IsInitialized())
        {
            LOG_ERROR("SingletonDataProviderне инициализирован"); // 17 строка
            return;
        }
        const SingletonDataProviderне& storage = SingletonDataProviderне::GetInstance();
        stream << ". Параметры:";
        for (paramsMap_t::const_iterator it = parameters.constBegin(); it != parameters.constEnd(); ++it)
        {
            stream << storage.GetAttributeName(it.key()) << '='
                << SomeHelper::GetInstance().ToString(it.value()) << ';';
        }
    }
    Выяснилось, что макрос LOG_ERROR при разворачивании создает переменную с названием 'stream'. Если я правильно помню описание работы PVS-Studio на хабре, то с такими ложными срабатываниями можно бороться. В рамках быстрого ознакомления этого делать не стал, нет необходимости.
    У PVS-Studio Standalone в контекстном меню найденных ошибок есть пункт «Add TODO comments for selected messages» — удобная вещь для накопления технического долга:)
    Оказалось, что легко и даже приятно исключать директории из сканирования — в частности, ошибки в Qt я предпочел больше не искать.

    Ну и на закуску я решил проверить анализаторы на
    синтаксическом примере:
    
    bool CheckPointer(int value)
    {
       int* intPtr(new int(value));
       std::cout << std::endl << *intPtr << std::endl;
       return true;
    }
    class A {
            int x;
            public:
                void bar() {
                    std::cout << x << "Test!\n";
                }
    };
    
    int main()
    {
        CheckPointer(5);
        A* a;
        a->bar();
    
        return 0;
    }


    PVS-Studio нашла две ошибки:
    • V773 The function was exited without releasing the 'intPtr' pointer. A memory leak is possible. main.cpp 224
    • V614 Uninitialized pointer 'a' used. main.cpp 238

    AppChecker: В проекте не обнаружены потенциальные уязвимости и дефекты
    CppCheck тоже говорит, что ошибок не найдено.

    В целом — AppChecker'у есть куда расти как в части удобства, так и в части функциональности анализа. Пока что складывается ощущение, что сделать хотели много (и отчеты, и сравнение результатов сканирования), а получилось — не очень. Но я уверен, что разработчики компании «Эшелон» быстро исправятся и смогут составить достойную конкуренцию на рынке статических анализаторов и в статьях хабра!
    И еще пару слов: наша небольшая команда разработчиков использует обязательное ревью всего кода, часть кода покрыта тестами, флаги компилятора включены по максимуму. И это все равно не избавляет нас от ошибок в коде — при запуске я был неприятно удивлен количеством срабатываний анализатора. Я думаю, что и синтаксический анализ не сможет полностью избавить от ошибок, но уменьшить их количество он сможет наверняка. Поэтому — рекомендую.
  • Обнаружение в коде дефекта «разыменование нулевого указателя»
    +6
    Спасибо за еще один продукт синтаксического анализа! Я опробовал его, кратко поделюсь впечатлениями.
    User Interface: красиво:) Запускаешь серверную часть, идешь в браузер — создаешь проект. И тут — неудобство:
    Для С/C++ проектов требуется дополнительная конфигурация.
    Я понимаю, почему это сделано, но запускать утилиту, которая мониторит системные вызовы — не всегда удобно.
    На большом проекте, использующем Qt и сторонние библиотеки, утилита сдохла. bad_alloc и падение без каких-либо полезных результатов. Уже минус, т.к. проверять планировал именно его.
    Открыт древний и большой проект, не использующий ничего и написанный на Си с классами:)
    Продукт нашел всего 4 дефекта трех типов, которые, признаюсь, действительно выглядят странно:
    • присвоение переменной самой себе
      tmp = tmp;
    • всегда истинное выражение
      if ( arr[i]!='+' || arr[i]!=' ' )
    • неконтролируемая рекурсия
      ISuperStringStream& MySuperStringStream::operator<<(signed char v)
      {
      	return operator<<((char)v) ;
      }


    При этом параллельно работал CppCheck, который одних только ошибок нашел 37 штук, варнинги и прочие стилистические сообщения я отключил. При этом в коде есть вещи, которые явно указывают на ошибку:
    void nps::MyClassEvent::getTextData(MyElement& el) const 
    {
    	el.doSmth();
    	MyAttributes* attr = new MyAttributes() ;
    	attr->insert("t0") ;
    }

    У меня есть подозрение, что AppChecker анализирует не все файлы и файл с проектом сформировался криво, но как это быстро проверить и исправить, я не знаю.
    Возможно, я что-то делаю не так, однако для быстрой проверки CppCheck и прочие Clang Static Analyzer'ы лично мне подходят удобнее.
    Я допускаю, что ваш продукт можно правильно настроить и он будет работать превосходно, но, например, ручное формирование и загрузка специально сохраненного файла — как-то это долго и лениво.

  • Разработчики в край обленились?
    +6
    Сразу вспомнилась целая книга — "Софт — отстой! И что с этим делать?".
    И как я в процессе написании рецензии на эту книгу увидел чудное сообщение 7-zipa:
    Посмотреть картинку
    image

    А хотел всего лишь сохранить настройки.
  • 4 инструмента по полочкам. Управление проектами с WBS, Диаграммой Ганта, CPM и Time-Cost
    0
    Для начального ознакомления с этими понятиями советую курс на Универсариуме — Основы проектного управления.
    Мне он нравится тем, вместе с теорией идет неплохая практика в ProjectLibre: например, разбираются практические задания построения иерархической структуры работ.
    И бесполезный риторический вопрос — как правильно: диаграмма Ганта или Гантта? Даже википедия неоднозначна в этом вопросе:)
  • Анонимный Дед Мороз 2015-2016 — Пост хвастовства новогодними подарками
    +5
    Спасибо большое Деду Морозу из Екатеринбурга за самодельное поздравление и bluetooth-спикер!
    Мои подарки, фотографировал на утюг
    самодельное поздравление и bluetooth-спикер
  • Установка и настройка генерации тайлов на основе OSM данных под Windows
    0
    Спасибо!
    А не могли бы вы поделиться результатами, что получается при отрисовке России, например, в разных вариантах масштаба?
  • Документируем ошибки в Doxygen
    +6
    Последний коммит в репозиторий доксигена: «Fixed various issues found by PVS-Studio.» — работа проделана не зря!
  • Умный интернет вещей — кто он и с чем его едят?
    0
    Спасибо!
    С «умным домом» я в чем-то с Вами согласен: для частного пользования это пока что не «средство передвижения», а роскошь. Но, возможно, с развитием IoT появятся и новые ниши для «умных домов». Экономия электроэнергия может быть полезна и нам, тем более экономить же можно не только ее: водопровод, газ и отопление. Контроль протечек с возможностью их устранения перекрыванием вентиля — тоже полезно же?
    Продать клиенту умный кондиционер — наверное, сложно, я не продажник. Но и Bentley продать сложно, я думаю — в покупке такого автомобиля тоже больше роскоши и статуса, нежели функциональности, ИМХО

    А вот с постскриптумом я не соглашусь: PLM/ERP/MES могут и должны быть тесно связаны с интернетом вещей, т.к. именно там value резко возрастает и экономия видна сразу, и полезность увеличивается.
  • Умный интернет вещей — кто он и с чем его едят?
    0
    Да, эмерджентность — это важное свойство сложных систем (а интернет вещей к таковым относится) и если оно будет проявляться (пусть и в других, более простых сценариях), то будет очень-очень хорошо.
  • Умный интернет вещей — кто он и с чем его едят?
    0
    Все изложенное в статье — лишь концепции, на тщательную и детальную проработку всего я не покушался.
    Но на вопросы попробую ответить — сразу признаюсь, что это исключительно первое видение, которое может быть ошибочным.
    Только что появившееся устройство может бродкастом найти интересных ему соседей, или тем же бродкастом определить, где находится некий агент желтых страниц (в мультиагентной платформе Jade для этого есть специальный агент — directory facilitation)
    Определив, кто есть в системе и с кем можно общаться для достижения определенных целей (для этого использовав онтологии), устройство начинает общение.
    Если у агента кондиционера есть потребность в обслуживании, то он определяет, кто может эту потребность удовлетворить. Если он сам имеет право на выбор фирмы, то примет решение на основании ряда критериев (цена, репутация фирмы, сроки ремонта), если же нет, то отдаст сигнал наверх, пользователю — «нужен ремонт!»

    Допустим, изначально термометра не было, появился умный кондиционер. Он будет использовать данные метеослужбы, которые часто отличаются от реальности. Пользователь может захотеть повысить точность определения текущей температуры — и для этого приобретет термометр.

    Я не претендую на идеальность модели. Я целиком и полностью за дальнейшие доработки, которые смогут сделать нашу жизнь лучше.
  • Умный интернет вещей — кто он и с чем его едят?
    +1
    Спасибо!
    Проблема в том, что возможности IoT не раскрыты до конца, да и описанное в статье — это по большей части концепции и идеи. Но реализация концепций — это вопрос времени, и чем раньше производители приступят к ней, тем больший профит они получат, как мне кажется.
  • Умный интернет вещей — кто он и с чем его едят?
    0
    Кратко изложу свое видение по этим вопросам.
    Отказоустойчивость — высокая, т.к. выход одного узла из строя минимально влияет на остальные. Ну потеряют они источники информации — попробуют найти себе другие. Если же других поставщиков данных нет, то интернет вещей не спасет — то же самое и в обычном АСУ-подходе.
    Изменение топологии — хочется на лету. Я что-то похожее описал — появляется агент, ищет поставщиков информации. Если эти поставщики вдруг отвалятся, то попробует установить связь с другими.

    По поводу других концепций — очень много говорится про машинное обучение. Описанное в статье этому не противоречит, просто в этой теме я не так силен.
    По поводу безопасности — мне нравится картинка из "Компьютер пресс":
    Посмотреть картинку
    image
    Т.е. системы безопасности должны охватывать все — и, возможно, быть такими же участниками сетецентрического интернета вещей.

    Буду рад, если кто-то добавит о концепциях IoT.
  • Умный интернет вещей — кто он и с чем его едят?
    0
    Значит, я не совсем верно понял комментарий, прошу прощения.
    Хотелось бы, чтобы решение противоречий как динамический процесс все же дало в результате некие стандарты и принципы — достигнув тем самым состояние равновесия. И, разумеется, стандарты эти должны быть расширяемыми и адаптируемыми — то есть равновесие будет неустойчивым.
  • Умный интернет вещей — кто он и с чем его едят?
    0
    Общества, отрасли и занятия — разве человек ни к чему из перечисленного отношения не имеет?
    Война — нет, большинству людей она не нужна. Но можно пытаться снизить человеческие потери на войне, а можно пытаться убеждать всех, что воевать — нехорошо, и одно другому не мешает.
    Практически любая технология может быть обращена во вред, если постараться, но вряд ли из-за этого нужно запрещать прогресс.
  • Инструменты руководителя проекта
    +4
    Если уж вести речь о Jira, то и про Youtrack можно вспомнить — там тоже есть настраиваемый workflow, для гибкой разработки этот продукт подходит вполне.
  • Уменьшаем количество ошибок с помощью чек-листа Code Review
    0
    Там не очень хорошее качество перевода. В комментариях справедливо указали на это, и я спрятал статью в черновики, чтобы отредактировать ее когда-нибудь. Это «когда-нибудь» так и не наступило, к сожалению — так что я вытащил статью из черновика в том же состоянии, как и спрятал ее туда.
  • Эффективные ревью кода: 9 советов от исправившегося скептика
    0
    Число 400 — это просто усредненная оценка, ведь на практике количество «разумно просматриваемых» строк зависит от состояния просматривающего, от качества кода и решаемых им задач. Можно же на каком-нибудь хаскеле (здесь можно вставить любой другой сложный для восприятия язык) написать несколько строк, но вот понять их будет сложнее.
    Суть в том, что качество ревью зависит от объема кода.
  • Уменьшаем количество ошибок с помощью чек-листа Code Review
    0
    Проверка форматирования на стандарт команды может быть и централизованной: например, «плохой» с точки зрения форматирования коммит просто не пройдет в систему управления версиями. Но от странного названия функции это вряд ли спасет.
  • Уменьшаем количество ошибок с помощью чек-листа Code Review
    0
    Ну вот, чеклист уже можно оптимизировать:) Если на проекте используется автоматизированная проверка форматирования, то как минимум проверку скобок и отступов можно убрать. Но если включить в стиль названия переменных и функций, то автоматизировать это вряд ли удастся: вряд ли инструмент сможет распознать непонятное название переменной.
  • Уменьшаем количество ошибок с помощью чек-листа Code Review
    +1
    Спасибо, я поправил перевод. В оригинале вообще про выходные данные говорится. Здесь речь может идти о том, что данные могут быть получены неизвестно откуда, и их нельзя отдавать в оригинальном виде. Пример: защита от XSS в случае веб-разработки. Но я от этой темы далек, так что буду рад, если кто-то сможет уточнить понятнее и точнее.
  • Давай поиграем в игру
    0
    Круто, спасибо!
    А нет ли у вас на сайте отображения количества обнаруженных ошибок разного типа? Хотя бы проверенных вами — это позволит вести интересную статистику: где на Си/С++ ошибаются чаще всего.
  • Давай поиграем в игру
    +2
    Большая часть задач действительно на внимательность: трудно найти опечатку в куче плохоотформатированного кода. Считаю, что часть таких ошибок (но ни в коем случае не все!) лечится продуманным стилем написания кода.
    Часть задач — чистой воды Си, тут внимательностью не обойдешься, надо еще и язык знать.
    Я не увидел, есть ли какие-то чисто плюсовые ошибки: вызов виртуального метода в конструкторе, обращение к итератору после erase, etc?
    Или в общей массе таких ошибок мало?