• Возможно, удостоверяющий центр компании Тензор компрометирует приватные ключи клиентов
    –1
    После появления сертифицированной версии КриптоПро CSP 5.0 мы получили обращения от клиентов, что при использовании некоторых носителей КриптоПро CSP “зависает” примерно на 30 секунд в процессе поиска и перечисления присутствующих контейнеров.

    Мы обратились в службу технической поддержки КриптоПро с данной проблемой, которая дала рекомендацию отключить работу КриптоПро CSP 5.0 с активными носителями путем создания параметра в реестре.

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

    В итоге мы сами нашли иное решение, не мешающие другим программам использовать КриптоПро CSP.

    Этот параметр никаким образом не влиял на безопасность закрытого ключа и возможность его копирования. Тип ключа — экспортируемый или неэкспортируемый определяет его владелец в момент формирования запроса на сертификат.

    Предположение о том, что закрытый ключ куда-то копируется является не более чем домыслом.
  • Опыт построения логов на Postgres
    0
    Нет, ClickHouse не подымали через ZooKeper. Сначала сделали кластер из двух узлов, потом отдельно к каждому узлу обращались. Вариант с кластером был медленнее.
    А почему должен помочь индекс включающий больше колонок?
    Если мне нужно выбрать по датевремени и названию запроса, или по датевремени и названию сервиса, то очевидно тут разные индексы нужны. Ибо в этом случае индекс из трех колонок:
    сервис, название запроса, дата время
    будет точно работать неэффективно для запросов обоих видов.
  • Вся боль p2p разработки
    0
    А нам в радость рассказать об этом. В ближайшее время удаленный помощник портируется на linux и os x системы. Дальнейшее развитие проекта еще на стадии обсуждения.
    Про СБИС Плагин — это, конечно, не по теме статьи, однако могу лишь намекнуть, что разрабатывается его новая реализация. Надеюсь, вы оцените! ;)
  • Вся боль p2p разработки
    0
    К сожалению, до полноценного TCP дойти точно не удастся, т.к. вся нагрузка по гарантии доставки и очередности сборки пакетов лежит все-таки на приложении, а не драйвере.
  • Вся боль p2p разработки
    –1
    Бенчмарки чего? Самой системы управления? Или установки соединения? Если вопрос касается только установки соединения — не более пары секунд, в зависимости от канала.
    Если говорить о качестве самой работы, то очень многое зависит от клиентского аппаратного обеспечения. Но в среднем достаточно комфортно.
  • Вся боль p2p разработки
    0
    Если я не ошибаюсь, сеть DHT подразумевает наличие постоянно запущенного приложения. В наших реалиях — средство управление запускается по мере необходимости оказать или получить помощь.
    Плюс торрентоподобные сети подразумевают возможность ретрансляции трафика через других участников сетей. Уверен клиентам это понравилось бы.
    Ну и да, как отметили чуть выше, STUN или аналогичный способ определения своего внешнего IP все же необходим.
  • Опыт построения логов на Postgres
    0
    Да, не написал, но в сравнении с CPU и RAM, место хранения все таки дороже стоит, поэтому сделал упор на нем.
  • Юнит-тесты. Быстрый старт – эффективный результат (с примерами на C++)
    0
    Спасибо за комментарий. Конечно, юнит-тесты не являются серебряной пулей, способной излечить все проблемы проекта. Но их использование в процессе разработки способствует созданию прочного фундамента, позволяющего поддерживать и развивать долгосрочные проекты. А тестирование совместной работы модулей, как вы справедливо заметили, это уже задача следующего уровня — интеграционных, нагрузочных, функциональных и прочих-прочих-прочих тестов :)
  • Юнит-тесты. Быстрый старт – эффективный результат (с примерами на C++)
    0
    В принципе, в приведенном примере так, конечно, сделать можно. Но в этом случае, при работе над реальным проектом в перспективе может возникнуть ряд сложностей, связанных с поддержкой тестов, а также читабельностью кода боевого класса.
    Немножко поутрирую. Например, пусть у нас есть класс, обладающий внешними зависимостями в количестве 100 штук, а для создания боевой версии объекта используется конструктор с 5 параметрами, часть из которых также задается по умолчанию. В таком случае, человеку, который разбирается с нашим кодом, придется потратить определенное количество времени, чтобы понять, какие из 105 параметров нужны для боевой версии, а какие — для тестирования. А если сроки горят, то все совсем нехорошо складывается. Так вот, чтобы избежать потенциальной агрессии с его стороны, все-таки рекомендуется разграничивать предназначения конструкторов, что и было сделано в указанном примере)
  • Юнит-тесты. Быстрый старт – эффективный результат (с примерами на C++)
    0
    Спасибо за комментарии. Вы правы, можно применять GoogleMock для автоматизированного создания Mock-объектов. Но, как было сказано ранее, к числу важнейших характеристик хорошего юнит-теста следует отнести его читабельность, а также легкость его дальнейшей модификации и поддержки. Возможно, с помощью GoogleMock Mock-объекты можно быстрее создавать, но в дальнейшем, по моему опыту, тесты, их использующие, сложнее читать и тем более поддерживать.
    Таким образом, в примерах, представленных в статье, GoogleMock намеренно не использовался, чтобы не усложнять рассказ о принципах создания тестируемого кода.

    Касательно применения EXPECT_XXX и ASSERT_XXX. Как было сказано в статье, одна из рекомендаций заключается в том, чтобы использовать в каждом тесте только один assert. В этом случае, если сработал assert, то можно однозначно определить root case — найти причину его непрохождения.
  • Юнит-тесты. Быстрый старт – эффективный результат (с примерами на C++)
    0
    Спасибо за отклик на статью. Вы правы, можно сделать проще. Но при написании тестов и соответствующего тестируемого кода нельзя выделить один путь, который является единственно верным. Как правильно, на мой взгляд, в своей книге отметил Roy Osherove, написание юнит-тестов — это есть искусство. Следует развивать умение чувствовать в каком случае и как лучше поступить. Возвращаясь к статье, мне хотелось показать основные принципы работы с fake-объектами, поэтому и был приведен указанный вами тест.
  • Юнит-тесты. Быстрый старт – эффективный результат (с примерами на C++)
    0
    Спасибо за комментарии к приведенным примерам. Насчет указанных Вами замечаний хотел бы сказать следующее.
    1. Вы правы, что крайне желательно писать тесты, которые понятны для чтения и прозрачны для понимания.
    Однако при написании тестируемого кода мы, по сути, создаем его для еще одного пользователя — наших тестов. В указанном вами примере всю ответственность за создание необходимых для выполнения программы объектов мы возлагаем на фабрику. Это позволяет разграничить нам зоны ответственности классов. Но в этом случае для написания теста нам следует привести тестируемые объекты в требуемое состояния, что и является целью выполнения этапа Arrange.
    2. В зависимости от особенностей архитектуры тестируемого класса, описанная вами ситуация потенциально, конечно, может возникнуть. Но если вы знаете такие архитектурные особенности, то целиком в вашей власти разорвать в тестируемом классе зависимость от БД полностью. В противном случае, как вы справедливо заметили, написанный тест будет взаимодействовать с реальной БД, что не даст ему права являться хорошим юнит-тестом.
  • Юнит-тесты. Быстрый старт – эффективный результат (с примерами на C++)
    0
    Спасибо за положительный отзыв! Очень рад, что вы нашли статью для себя полезной. Действительно, и я тоже на это надеюсь, она способна развить желание писать надежный тестируемый код.
  • Опыт построения логов на Postgres
    0
    Отсутствие серьезного выигрыша по месту хранения, устроило бы >50%. На самом деле мы еще не оставили до конца опыты с ClickHouse, но с ним мы все-таки несколько в тупике.
  • Опыт построения логов на Postgres
    0
    В чем же меньше-то? Памяти и CPU подавай больше для того же Elastic, а размер для места хранения примерно одинаковый.
  • Опыт построения логов на Postgres
    0
    Там конечно не 32 Тб текста. 32Тб это данные + индексы. Индексы это где-то 50%. Т.е. на данные 16Тб. Из них текст составляет около 40% от других данных, т.е. на него тратится < 8Тб. Без текста трассировка была бы бесполезна, поиск по части текста довольно распространенное явление.
  • Опыт построения логов на Postgres
    0
    Насчет удобства в сравнении с другими системами — наша очевидно удобнее в плане интерфейса чем GrayLog2. Имею счастье пользоваться обеими.И наша существенно сильнее заточена на нашу специфику.
  • Опыт построения логов на Postgres
    0
    Ошибся в сообщении, последнюю строку надо читать как: «Это основная причина почему мы на него пока НЕ стремимся перейти».
  • Опыт построения логов на Postgres
    0
    Да, фактически для логов мы Postgres не используем как SQL базу. Но меня, например, поразило, что он существенно менее требователен к памяти, чем Elastic и ClickHouse.
  • Опыт построения логов на Postgres
    0
    С Elastic нам все понравилось, он тратит меньше IOPs на запись, несколько побыстрее отдает ответ, но как написано в статье, не устроило, что он выигрыш по месту хранения дал маленький. Это основная причина почему мы на него пока стремимся перейти.
  • Опыт построения логов на Postgres
    0
    Elastic стал продвигаться примерно с 12 го года, мы же первую версию логов делали в начале 12 — го. Делали как прототип, а потом оказалось, что с него не так то просто слезть, когда у тебя уже все налажено и работает. У нас используется GrayLog2 для сбора логов с nginx, так что мы можем примерно сравнивать его и нашу систему.
  • Сложно о простом: как измерить время открытия страницы и не нажить себе врагов
    0
    Согласны, чем ближе к реальности тестирование тем лучше, т.к. вылезают такие кейсы, про которые никто и никогда заранее не подумал бы. Правда, с таким подходом тоже свои огрехи есть. Например, нельзя изменять характеристики канала, нет контроля и точной воспроизводимости результата (в зависимости от расстояния и железа результаты могут сильно колебаться). Ну и если у вас сотрудники раскиданы по всей стране и даже в одном здании на разных этажах сидят — массово такое не организуешь.
  • Приглашаем на VeloCPPed Meetup в Тензор
    +1
    Добрый день! Выложили видео и презентации, о которых вы спрашивали.
    Управление сторонними зависимостями в C++
    Облако в штанах
    Конструктор для взрослых
    Ссылки на соответствующие презентации — под каждым видео.
  • Как мы учились обновлять 5 000 серверов компании Тензор
    0
    .
  • Как мы учились обновлять 5 000 серверов компании Тензор
    0
    Спасибо. Да, сами. Идеями для них сыпал сам автор)
  • Приглашаем на VeloCPPed Meetup в Тензор
    0
    Обязательно выложим видео на нашем канале Youtube. Там же дадим ссылку на презентацию.
  • Как сделать свой С++ код кроссплатформенным?
    +1
    Выбрать подходящую имплементацию во время сборки можно по сути только двумя способами:

    1. через ifdef, например:

    #ifdef LINUX
    #  include <my_class_linux_impl.h>
    #elif defined WIN32
    #  include <my_class_win32_impl.h>
    ...
    

    2. В сборочном скрипте, например, в cmake как-то так:

    if (LINUX_OS)
       SET(IMPL_FILES my_class_lunux_impl.cpp)
    elseif (WIN32_OS)
       SET(IMPL_FILES my_class_win32_impl.cpp)
    ...
    endif ()
    add_library(TestLibrary ${IMPL_FILES} another_file1.cpp another_file2.cpp)
    

    Не понятно, как вам поможет идиома pimpl для выбора в compile time необходимой реализации. Все равно вам придется выбрать на этапе сборки одну из реализаций, подходящую под целевую систему, одним из вышеперечисленных способов.
    Более того, не вижу противоречий в тексте статьи, ведь никто не предлагает писать вот такой вот плохокод:

    void some_function()
    {
    #ifdef WIN32
    CallWinAPIMethod();
    #elif defined POSIX
    CallPOSIXMethod()
    #endif
    CallAnotherMethod();
    #ifdef WIN32
    CallAnotherWinAPIMethod();
    #elif defined POSIX
    CallAnotherPOSIXMethod()
    #endif
    }
    

    Мы знаем и активно используем паттерны проектирования (в том числе и pimpl). ifdef'ы используем только для выбора подходящей имплементации.
  • Как сделать свой С++ код кроссплатформенным?
    +1
    Не соглашусь с вами. Все правила в Стандарте С++ формулируются в терминах абстрактной виртуальной машины, нигде не фигурируют завязки на конкретную программную или аппаратную платформу, то есть формально он является кроссплатформенным. Да и исторически С++ изначально проектировался переносимым, об этом пишет Страуструп в своей книге «Дизайн и эволюция С++» (глава 3.2 «Цели С++»):

    … необходимо было дать ответ на несколько ключевых вопросов:
    * кто будет пользоваться языком?
    * на каких системах будут работать пользователи?

    Чтобы ответить на второй вопрос, я просто огляделся по сторонам — на каких системах реально использовался C with Classes? Практически на любых: таких маленьких, что на них и компилятор-то не мог работать, до мейнфреймов и супер-компьютеров. Среди ОС были и такие, о которых я даже не слыхивал. Отсюда следовали выводы, что высокая степень переносимости и возможность выполнять кросс-компиляцию абсолютно необходимы…
  • Как сделать свой С++ код кроссплатформенным?
    +1
    Да, программа, которая работает хотя бы на одной современной POSIX-совместимой системе относительно просто переносится на другие POSIX-совместимые системы. Но рынок диктует свои требования и отказаться от поддержки Windows зачастую невозможно.
    А в нашем случае ситуация была еще сложнее — у нас были большие Windows-приложения и нам нужно было портировать их под POSIX. Огромный объем кодовой базы не позволял нам переписать все за раз — это был длительный итеративный процесс, параллельно с которым шло активное развитие этих продуктов. Как минимум из-за этого нельзя было «сжигать» мосты и переходить на POSIX, отказавшись от WinAPI (иначе на какой-то период сломалась бы сборка на MSVS и работа наших коллег бы встала).
    MinGW не решает проблему — он использует WinAPI, ровно как MSVS (сейчас, кстати, мы перешли на него, отказавшись от MSVS). Вы, наверное, имели ввиду cygwin, в котором WinAPI завернут внутрь POSIX-совместимого API.
  • Как сделать свой С++ код кроссплатформенным?
    0
    Нет, в жизни это не так. Все компиляторы перекодируют «широкие» строки, а некоторые — даже «узкие». Чтобы убедиться в этом, можете взять MSVC 2010 и провести опыт: скомпилировать в ней один и тот же файл, закодированный в кодировки UTF-8, UTF-8+BOM и Win1251:

     #include <stdio.h>
    int main()
    {
       printf( "%hhu\n", static_cast<unsigned char>( 'я' ) );
       printf( "%hu\n", static_cast<unsigned short>( L'я' ) );
    }
    


    В случае с Win1251 вы получите ожидаемый результат, который никак не противоречит вашей гипотезе:
    255 (это код символа 'я' в Win1251)
    1103 (это код символа 'я' в UTF-16, которой представлен wchar_t на Win)

    В случае UTF-8 вы получите:
    143 (это один из двух байт UTF-8 представления символа 'я' — подходит под вашу гипотезу)
    1057 (а это ошибка! компилятор неправильно закодировал L'я', так как неправильно воспринял исходник и сделал перекодировку win1251->utf16 вместо utf8->utf16)

    В случае с UTF-8 с заголовком BOM мы имеем результат, идентичный первому варианту:
    255
    1103
    И этот случай противоречит вашей гипотезе — компилятор представил «узкую» строку в 1251, несмотря на то что она была в исходнике в UTF-8.

    Таким образом, не все компиляторы берут строки как есть из файла, они их иногда перекодируют.
  • Как сделать свой С++ код кроссплатформенным?
    0
    Спасибо. Поправили.
  • Как сделать свой С++ код кроссплатформенным?
    +1
    Мобильные приложения СБИС сделаны на нашей платформе

    https://play.google.com/store/apps/details?id=ru.tensor.sbis.droid

    https://itunes.apple.com/ru/app/%D1%81%D0%B1%D0%B8%D1%81/id1156518720

    Остальное — облачные решения;
    Облако sbis.ru построено на платформе
  • Как сделать свой С++ код кроссплатформенным?
    0
    Изначально СБИС — Система бухгалтерского и складского учета. Название осталось прежнее, а система выросла. Поэтому СБИС мы не расшифровываем. Что такое СБИС, и какие представляет сервисы, можно посмотреть на сайте системы
  • Как сделать свой С++ код кроссплатформенным?
    +1
    Спасибо, исправили ошибку
  • Здравствуй, Хабр
    0
    Уточнили — уполномочку в онлайне мы уже делаем.
  • Здравствуй, Хабр
    –1
    Уточним, конечно, но по нашим сведениям все очень давно сделано и работает.
  • Здравствуй, Хабр
    0
    Перестать кататься с актами через всю Москву и Питер по 10 раз! Пусть сами катаются, а когда надоест — перейдут на ЭДО)
    Получение документов для клиентов бесплатно, не требует установки дополнительного ПО, по времени не отнимает больше пары минут. Но люди с трудом отказываются от привычного уклада. Так что немного терпения, и все будет.
  • Здравствуй, Хабр
    0
    Да, действительно СБИС начинался с «толстого» клиента с присущими этой технологии проблемами обновления. Чтобы раз и навсегда забыть про эти проблемы переходите в «облако». Оно уже давно по функционалу обогнало «толстый клиент».
  • Здравствуй, Хабр
    0
    А есть что-то, что прям вот хотелось бы почитать? У человека, работавшего у нас, это спросить актуальнее всего.
  • Здравствуй, Хабр
    +1
    Спасибо. Проблема обозначена. Раздали пилы, ушли допиливать.
    А если серьезно — что именно вас смущает в онлайне?