Занимаясь разработкой алгоритмов, постоянно одергиваю себя, а вдруг изменения, которые работают на небольшом примере, привнесут разброд и шатание в результаты на других, больших данных. Тогда мне на помощь приходит командная строка. Самое ужасное, что каждый раз реализовывать парсер аргументов уже надоело, а значит, не последним средством для C++ программиста оказывается пакет program_options из библиотеки boost.
User
Изолируем демоны с systemd или «вам не нужен Docker для этого!»
9 min
50KВ последнее время я вижу, как довольно большое количество людей применяет контейнерную виртуализацию только для того, чтобы запереть потенциально небезопасное приложение внутри контейнера. Как правило, используют для этого Docker из-за его распространенности, и не знают ничего лучше. Действительно, многие демоны первоначально запускаются от имени root, а далее либо понижают свои привилегии, либо master-процесс порождает обрабатывающие процессы с пониженными привилегиями. А есть и такие, которые работают исключительно от root. Если в демоне обнаружат уязвимость, которая позволяет получить доступ с максимальными привилегиями, будет не очень приятно обнаружить злоумышленников, уже успевших скачать все данные и оставить вирусов.
Контейнеризация, предоставляемая Docker и другим подобным ПО, действительно спасает от этой проблемы, но также и привносит новые: необходимо создавать контейнер для каждого демона, заботиться о сохранности измененных файлов, обновлять базовый образ, да и сами контейнеры часто основаны на разных ОС, которые необходимо хранить на диске, хотя они вам, в общем-то, и не особо нужны. Что делать, если вам не нужны контейнеры как таковые, в Docker Hub приложение собрано не так, как нужно вам, да и версия устарела, SELinux и AppArmor кажутся вам слишком сложными, а вам бы хотелось запускать его в вашем окружении, но используя такую же изоляцию, которую использует Docker?
Получить список установленных capabilities файла можно командой
Флаг p здесь означает permitted, т.е. у приложения есть возможность использовать заданную capability, e значит effective — приложение будет ее использовать, и есть еще флаг i — inheritable, что дает возможность сохранять список capabilities при вызове функции
Capabilities можно задать как на уровне ФС, так и просто у отдельного потока программы. Получить capability, которая не была доступна с момента запуска, нельзя, т.е. привилегии можно только понижать, но не повышать.
Также существуют биты безопасности (Secure Bits), их три: KEEP_CAPS позволяет сохранить capability при вызове setuid, NO_SETUID_FIXUP отключает перенастройку capability при вызове setuid, и NOROOT запрещает выдачу дополнительных привилегий при запуске suid-программ.
Контейнеризация, предоставляемая Docker и другим подобным ПО, действительно спасает от этой проблемы, но также и привносит новые: необходимо создавать контейнер для каждого демона, заботиться о сохранности измененных файлов, обновлять базовый образ, да и сами контейнеры часто основаны на разных ОС, которые необходимо хранить на диске, хотя они вам, в общем-то, и не особо нужны. Что делать, если вам не нужны контейнеры как таковые, в Docker Hub приложение собрано не так, как нужно вам, да и версия устарела, SELinux и AppArmor кажутся вам слишком сложными, а вам бы хотелось запускать его в вашем окружении, но используя такую же изоляцию, которую использует Docker?
Capabilities
В чем отличие обычного пользователя от root? Почему root может управлять сетью, загружать модули ядра, монтировать файловые системы, убивать процессы любых пользователей, а обычный пользователь лишен таких возможностей? Все дело в capabilities — средстве для управления привилегиями. Все эти привилегии даются пользователю с UID 0 (т.е. root) по умолчанию, а у обычного пользователя нет ни одного из них. Привилегии можно как дать, так и отобрать. Так, например, привычная команда ping требует создания RAW-сокета, что невозможно сделать от имени обычного пользователя. Исторически, на ping ставили SUID-флаг, который просто запускал программу от имени суперпользователя, но сейчас все современные дистрибутивы выставляют CAP_NET_RAW capability, которая позволяет запускать ping из-под любого аккаунта.Получить список установленных capabilities файла можно командой
getcap
из состава libcap.% getcap $(which ping)
/usr/bin/ping = cap_net_raw+ep
Флаг p здесь означает permitted, т.е. у приложения есть возможность использовать заданную capability, e значит effective — приложение будет ее использовать, и есть еще флаг i — inheritable, что дает возможность сохранять список capabilities при вызове функции
execve()
.Capabilities можно задать как на уровне ФС, так и просто у отдельного потока программы. Получить capability, которая не была доступна с момента запуска, нельзя, т.е. привилегии можно только понижать, но не повышать.
Также существуют биты безопасности (Secure Bits), их три: KEEP_CAPS позволяет сохранить capability при вызове setuid, NO_SETUID_FIXUP отключает перенастройку capability при вызове setuid, и NOROOT запрещает выдачу дополнительных привилегий при запуске suid-программ.
+68
Разработка power bank для ноутбука. От макета к готовому изделию. Часть первая
10 min
51KСделать себе внешний аккумулятор для ноутбука я хотел уже давно, 3-4 года назад для работы в парке. Хоть и мечта рисовать схемы и трассировать платы в парке Горького или Битцевском лесу так и не реализовались (пока), но внешний аккумулятор (назовем его по-современному — PowerBank) я таки сделал. О том как это устройство проходило путь от макета до конечного изделия и почему я делал то, что уже есть на рынке, под катом.
![](https://habrastorage.org/files/420/e68/56d/420e6856df5a40de8a10c07a32d91245.png)
![](https://habrastorage.org/files/420/e68/56d/420e6856df5a40de8a10c07a32d91245.png)
+44
Практическое применение преобразования Фурье для анализа сигналов. Введение для начинающих
9 min
283KRecovery Mode
1. Преобразование Фурье и спектр сигнала
Во многих случаях задача получения (вычисления) спектра сигнала выглядит следующим образом. Имеется АЦП, который с частотой дискретизации Fd преобразует непрерывный сигнал, поступающий на его вход в течение времени Т, в цифровые отсчеты — N штук. Далее массив отсчетов подается в некую программку, которая выдает N/2 каких-то числовых значений (программист, который
Чтобы проверить, правильно ли работает программа, сформируем массив отсчетов как сумму двух синусоид sin(10*2*pi*x)+0,5*sin(5*2*pi*x) и подсунем программке. Программа нарисовала следующее:
![image](https://habrastorage.org/files/5b5/de8/ac2/5b5de8ac23a944929a543bef65b42e34.png)
рис.1 График временной функции сигнала
![image](https://habrastorage.org/files/031/a6b/da0/031a6bda00ec44e6ab113a893fe250c7.png)
рис.2 График спектра сигнала
На графике спектра имеется две палки (гармоники) 5 Гц с амплитудой 0.5 В и 10 Гц — с амплитудой 1 В, все как в формуле исходного сигнала. Все отлично, программист молодец! Программа работает правильно.
Это значит, что если мы подадим на вход АЦП реальный сигнал из смеси двух синусоид, то мы получим аналогичный спектр, состоящий из двух гармоник.
Итого, наш реальный измеренный сигнал, длительностью 5 сек, оцифрованный АЦП, то есть представленный дискретными отсчетами, имеет дискретный непериодический спектр.
С математической точки зрения — сколько ошибок в этой фразе?
Теперь
+41
Разноцветные терминалы
4 min
85K![](https://habrastorage.org/files/0ba/d03/648/0bad03648fd646ccb06a74a71be41aa8.png)
В этой публикации я расскажу о некоторых трюках, которые украсят будни любого системного администратора Linux (и не только). Все они связаны с переменной PS1 оболочки bash. Переменная PS1 определяет, как будет выглядеть приглашение для ввода новых команд. И каждый пользователь может переопределять её как пожелает, например, в файле ~/.bashrc (который выполняется при запуске bash и используется для в том числе для конфигурации).
Для начала рассмотрим простой вариант, мой любимый формат командной строки.
+32
Автоматическая генерация программного кода микроконтроллера на основе событийно-ориентированной модели
4 min
16KTutorial
Постановка задачи:
Создание сложной автоматизированной системы на основе контроллера для управления различной периферией (электронные замки, двигатели, светодиодные ленты и прочая электроника).
Создание данной системы потребовалась для квест комнаты, подобной этой, но в городе Хабаровск.
Наш квест в ином сеттинге, но в целом имеет примерно тот же набор исполнительных механизмов: реле, замки, ленты, герконы и т.д.
Основные требования к системе:
![image](https://habrastorage.org/getpro/habr/post_images/f8b/de4/970/f8bde49705cb630ec0ee5b53086aa5b4.png)
Создание сложной автоматизированной системы на основе контроллера для управления различной периферией (электронные замки, двигатели, светодиодные ленты и прочая электроника).
Создание данной системы потребовалась для квест комнаты, подобной этой, но в городе Хабаровск.
Наш квест в ином сеттинге, но в целом имеет примерно тот же набор исполнительных механизмов: реле, замки, ленты, герконы и т.д.
Основные требования к системе:
- Надежность — при разработке сложных систем высока вероятность допустить трудно уловимые ошибки, чем больше код тем больше шанс пропустить ошибку и тем больше времени нужно на отладку, необходимо свести к минимуму вероятность некорректной работы.
- Гибкость — возможность с минимальными временными затратами изменить логику работы
- Функциональность — управление любым оборудованием и подключение любых сенсоров
![image](https://habrastorage.org/getpro/habr/post_images/f8b/de4/970/f8bde49705cb630ec0ee5b53086aa5b4.png)
+10
Система непересекающихся множеств и её применения
10 min
73KДобрый день, Хабрахабр. Это еще один пост в рамках моей программы по обогащению базы данных крупнейшего IT-ресурса информацией по алгоритмам и структурам данных. Как показывает практика, этой информации многим не хватает, а необходимость встречается в самых разнообразных сферах программистской жизни.
Я продолжаю преимущественно выбирать те алгоритмы/структуры, которые легко понимаются и для которых не требуется много кода — а вот практическое значение сложно недооценить. В прошлый раз это было декартово дерево. В этот раз — система непересекающихся множеств. Она же известна под названиями disjoint set union (DSU) или Union-Find.
Поставим перед собой следующую задачу. Пускай мы оперируем элементами N видов (для простоты, здесь и далее — числами от 0 до N-1). Некоторые группы чисел объединены в множества. Также мы можем добавить в структуру новый элемент, он тем самым образует множество размера 1 из самого себя. И наконец, периодически некоторые два множества нам потребуется сливать в одно.
Формализируем задачу: создать быструю структуру, которая поддерживает следующие операции:
MakeSet(X) — внести в структуру новый элемент X, создать для него множество размера 1 из самого себя.
Find(X) — возвратить идентификатор множества, которому принадлежит элемент X. В качестве идентификатора мы будем выбирать один элемент из этого множества — представителя множества. Гарантируется, что для одного и того же множества представитель будет возвращаться один и тот же, иначе невозможно будет работать со структурой: не будет корректной даже проверка принадлежности двух элементов одному множеству
Unite(X, Y) — объединить два множества, в которых лежат элементы X и Y, в одно новое.
На рисунке я продемонстрирую работу такой гипотетической структуры.
![](https://habrastorage.org/storage/6cf7f9c4/e6848578/0bf0505b/5d3ded44.png)
Я продолжаю преимущественно выбирать те алгоритмы/структуры, которые легко понимаются и для которых не требуется много кода — а вот практическое значение сложно недооценить. В прошлый раз это было декартово дерево. В этот раз — система непересекающихся множеств. Она же известна под названиями disjoint set union (DSU) или Union-Find.
Условие
Поставим перед собой следующую задачу. Пускай мы оперируем элементами N видов (для простоты, здесь и далее — числами от 0 до N-1). Некоторые группы чисел объединены в множества. Также мы можем добавить в структуру новый элемент, он тем самым образует множество размера 1 из самого себя. И наконец, периодически некоторые два множества нам потребуется сливать в одно.
Формализируем задачу: создать быструю структуру, которая поддерживает следующие операции:
MakeSet(X) — внести в структуру новый элемент X, создать для него множество размера 1 из самого себя.
Find(X) — возвратить идентификатор множества, которому принадлежит элемент X. В качестве идентификатора мы будем выбирать один элемент из этого множества — представителя множества. Гарантируется, что для одного и того же множества представитель будет возвращаться один и тот же, иначе невозможно будет работать со структурой: не будет корректной даже проверка принадлежности двух элементов одному множеству
if (Find(X) == Find(Y))
.Unite(X, Y) — объединить два множества, в которых лежат элементы X и Y, в одно новое.
На рисунке я продемонстрирую работу такой гипотетической структуры.
![](https://habrastorage.org/storage/6cf7f9c4/e6848578/0bf0505b/5d3ded44.png)
+104
Лазерная локация, доплеровские изображения и синтез апертуры
6 min
11KУгловая разрешающая способность – важнейшая характеристика любой телескопической системы. Оптика утверждает, что это разрешение однозначно связано с длиной волны, на которой осуществляется наблюдение, и с диаметром входной апертуры телескопа. С большими диаметрами, как известно, большая проблема. Вряд ли когда-нибудь будет построен телескоп больше этого.
Одним из способов значительного увеличения разрешающей способности является применяемый в радиоастрономии и радиолокации метод синтезирования больших и сверхбольших апертур. В миллиметровом диапазоне самую большую апертуру — 14 км — обещают формировать 66-ю антеннами проекта ALMA в Чили.
![](https://habrastorage.org/files/d07/921/661/d07921661c91442ca1270814ec417699.jpg)
Перенос методов апертурного синтеза в оптическую область, где длины волн на несколько порядков меньше, чем у радиолокаторов, связан с развитием техники лазерного гетеродинирования.
Одним из способов значительного увеличения разрешающей способности является применяемый в радиоастрономии и радиолокации метод синтезирования больших и сверхбольших апертур. В миллиметровом диапазоне самую большую апертуру — 14 км — обещают формировать 66-ю антеннами проекта ALMA в Чили.
![](https://habrastorage.org/files/d07/921/661/d07921661c91442ca1270814ec417699.jpg)
Перенос методов апертурного синтеза в оптическую область, где длины волн на несколько порядков меньше, чем у радиолокаторов, связан с развитием техники лазерного гетеродинирования.
+15
Бинарные деревья поиска и рекурсия – это просто
8 min
603KСуществует множество книг и статей по данной теме. В этой статье я попробую понятно рассказать самое основное.
Бинарное дерево — это иерархическая структура данных, в которой каждый узел имеет значение (оно же является в данном случае и ключом) и ссылки на левого и правого потомка. Узел, находящийся на самом верхнем уровне (не являющийся чьим либо потомком) называется корнем. Узлы, не имеющие потомков (оба потомка которых равны NULL) называются листьями.
![image](https://habrastorage.org/files/772/ac8/a1e/772ac8a1ed9c4abb862c036a2113a196.png)
Рис. 1 Бинарное дерево
Бинарное дерево — это иерархическая структура данных, в которой каждый узел имеет значение (оно же является в данном случае и ключом) и ссылки на левого и правого потомка. Узел, находящийся на самом верхнем уровне (не являющийся чьим либо потомком) называется корнем. Узлы, не имеющие потомков (оба потомка которых равны NULL) называются листьями.
![image](https://habrastorage.org/files/772/ac8/a1e/772ac8a1ed9c4abb862c036a2113a196.png)
Рис. 1 Бинарное дерево
+21
Как распознать кракозябры?
1 min
427KВ комментариях к предыдущему посту про иероглифы сказали, что хорошо бы иметь такую же блок-схему для кракозябр.
Итак, вуаля!
![](https://habrastorage.org/storage2/61b/e7a/455/61be7a4552a6650bd19b526db63d4779.png)
За источник информации была взята статья из вики. В блок-схеме «UTF-16 → CP 866» означает, что исходная кодировка была «UTF-16», а распозналась она как «CP 866».
Как всегда — кликабельно. Исходник в .docx: здесь.
Итак, вуаля!
![](https://habrastorage.org/storage2/61b/e7a/455/61be7a4552a6650bd19b526db63d4779.png)
За источник информации была взята статья из вики. В блок-схеме «UTF-16 → CP 866» означает, что исходная кодировка была «UTF-16», а распозналась она как «CP 866».
Как всегда — кликабельно. Исходник в .docx: здесь.
+407
Первые советские транзисторы работают
2 min
113K![image](https://habrastorage.org/getpro/habr/post_images/8ac/041/f7f/8ac041f7fff87df10ddd8e6381f07e5c.jpg)
+66
Умный квест в реальности: демоны и проводки
12 min
39KМногие слышали про квесты в реальности — перенесенные в наш мир игры жанра escape the room. Решаешь головоломки, получаешь ответы, проходишь на следующий этап. Закончить нужно за час, в итоге открывается дверь на выход. Но немногие знают, как они устроены внутри. В этой статье мы заглянем за кулисы одного из таких квестов, а также сравним его с другими в техническом плане.
Как разработчик эскейп-румов, я видел реализации некоторых из них. Обычно квест делится на никак не связанные блоки, которые вместе реализуют возможность прохождения. Тем не менее, для нашего квеста мы использовали централизованную архитектуру. Постараюсь рассказать, какие плюсы и минусы этих подходов, а также опишу, какие задачи решает «техник», создающий квесты в реальности, т.к. эта тема не очень хорошо раскрыта в Интернете.
![](https://habrastorage.org/files/280/5c2/bad/2805c2badad14a41b59bd8dfd69799b7.png)
Как разработчик эскейп-румов, я видел реализации некоторых из них. Обычно квест делится на никак не связанные блоки, которые вместе реализуют возможность прохождения. Тем не менее, для нашего квеста мы использовали централизованную архитектуру. Постараюсь рассказать, какие плюсы и минусы этих подходов, а также опишу, какие задачи решает «техник», создающий квесты в реальности, т.к. эта тема не очень хорошо раскрыта в Интернете.
![](https://habrastorage.org/files/280/5c2/bad/2805c2badad14a41b59bd8dfd69799b7.png)
+33
Когда не помогает ЦАП. Цифровые потенциометры в деталях. Часть первая
9 min
126K![](https://habrastorage.org/files/b4b/604/9c2/b4b6049c223a4475a464ec18543fbddd.jpg)
Прогресс не обошёл стороной не только велосипед. Сегодня традиционные переменные и подстроечные резисторы в очень многих приложениях уступают место цифровым сопротивлениям. В англоязычных источниках их называют digital potentiometer, RDAC или digiPOT. Область применения этих устройств гораздо шире регулировки уровня звукового сигнала. В частности они приходят на помощь в очень многих случаях, когда требуется изменять параметры обратной связи, что трудно реализовать с помощью традиционных ЦАП.
Особенно эффективно их применение в связке с операционными усилителями. Так можно получить регулируемые усилительные каскады, преобразователи разного рода величин, фильтры, интеграторы, источники напряжения и тока и многое многое другое. Словом эти очень недорогие и компактные устройства могут быть полезными каждому разработчику электроники и радиолюбителю…
Изначально я хотел написать краткую статью, но в результате углубленного изучения темы материал с трудом уместился в две части. Сегодня я постараюсь рассказать об архитектуре данных устройств, их возможностях, ограничениях использования и тенденциях развития. В заключении вскользь затрону тему областей применения, поскольку конкретные примеры практической реализации схем на их основе будут рассмотрены во второй части. МНОГО примеров!
Лично я за последние пять лет с успехом применял цифровые сопротивления в нескольких своих разработках, надеюсь что данный цикл статей окажется полезным для многих и поможет вам решать многие задачи более изящно и просто, чем сегодня. Людям, далёким от разработки электроники данная статья может просто расширить кругозор, показав как эволюционируют под натиском цифровых технологий даже такие простейшие вещи, как переменные резисторы.
P.S.Так получилось, что уже вышла ещё одна статья из этой серии и в ней пример всего один, зато подробно разобранный. Для остальных обещанных примеров придётся писать третью.
+53
LFS: Темная сторона Силы. Часть 1
21 min
72KTutorial
Предисловие
Для того чтобы установить на свой компьютер Linux и начать его использовать для конкретных задач существует масса способов. Выбор дистрибутивов чрезвычайно широк, на любой вкус и цвет — и «для домохозяек» и для продвинутых пользвателей, допускающие любой уровень кастомизации, в том числе и сборку из исходников под конкретное железо. Установка системы в принципе доступна любому, мало-мальски грамотному пользователю ПК. И, если не погружаться в популярные по сей дей холивары на тему «Linux vs Другая ОС», то и спользование данной системы не требует знаний, которые были обязательными для новоиспеченного линуксоида скажем десять лет назад. С моей, глубоко субъективной точки зрения, за более чем десять лет, которые я наблюдаю за развитием этой системы, линукс стал более дружественен к новичкам и избавился от многих проблем, присущих ему в прошлом. И это хорошо.
Пингвины ручной сборки...
![](https://habrastorage.org/files/523/9a2/feb/5239a2febf22468fa4042a832747232e.jpg)
На Хабре уже мелькала пара статей на тему LFS, например эта, или вот эта. Комментарии к последней наводят на закономерную мысль — если набор возможностей для установки Linux и его изучения и так исчерпывающе широк, зачем нужен LFS?
Не буду витеивато излагать истории о том «как космические корабли бороздят… и когда Земля была огненным шаром...». Я отвечу на поставленный вопрос исходя из своей позиции — я собираю LFS потому, что мне просто интересно это сделать. Я вижу в этом процессе хорошую возможность заглянуть «под капот» системы. Допускаю, что этот путь сложно назвать оптимальным. Тем не менее, данная статья, и последующие за ней будут посвящены процессу ручной сборки Linux-системы. Данные статьи не будут переводом документации по сборке — в этом нет особой нужды. Акценты будут расставлены на специфике и ньюансах процесса, с которыми пришлось столкнуться автору лично. Будем считать этот цикл чем-то вроде дневника неофита.
+18
Читаем QR код
5 min
1.1MTutorial
![](https://habrastorage.org/storage1/82ec194d/82c86917/c2d44992/6a420214.png)
В статье рассмотрены базовые особенности QR кодов и методика дешифрирования информации без использования вычислительных машин.
Иллюстраций: 14, символов: 8 510.
+605
Мифы нашего времени: генетически модифицированные организмы. Так ли страшен черт?
21 min
573KЧеловеку давно свойственно интересоваться окружающим миром и находить объяснения тому окружающим вещам и событиям. Собственно, без этого человек не стал бы человеком. На базе верований, мифов развивалась сначала религия, а потом — и современная наука, которая уже весьма успешно объясняет окружающий мир от очень малых до впечатляющих масштабов. Но всегда оставались люди, которые противились прогрессу и распространяли устоявшиеся мифы, уверяя, что они отвечают на все вопросы и незачем двигаться дальше. Гром гремит — это Перун-громовержец злится; кто-то заболел — это Бог его наказывает, вот тебе объяснения, отстань, не задавай вопросов, а лучше помолись.
Современные мифы более глубоки и обычно связаны с наукой. Причины понятна — наука развилась (особенно в последнее время) до такой степени, что часто нужен колоссальный объем знаний, чтобы просто понять, о чем вообще идет речь. У многих людей этого объема нет или безвозвратно потерян, что и снижает их сопротивляемость к разного рода мифам нашего времени. Миф про вредность пищевых добавок Exxx; миф про полезность натурального и вредность «химии»; миф про врачей-убийц, травящих людей прививками; миф про настолько страшное ГМО, что наклейки с надписью «без ГМО» надо клеить даже на салфетки и на пачки с солью.
![Как вы думаете, что заставило лягушку вырастить лишние ноги? Картинка для привлечения внимания](https://habrastorage.org/getpro/geektimes/post_images/db3/5c7/696/db35c7696d6455947d1483ae172ae964.png)
Что такое ГМО? Зачем они нужны? Как велика опасность и польза от их использования? Есть ли доказательства безопасности этих организмов?
Современные мифы более глубоки и обычно связаны с наукой. Причины понятна — наука развилась (особенно в последнее время) до такой степени, что часто нужен колоссальный объем знаний, чтобы просто понять, о чем вообще идет речь. У многих людей этого объема нет или безвозвратно потерян, что и снижает их сопротивляемость к разного рода мифам нашего времени. Миф про вредность пищевых добавок Exxx; миф про полезность натурального и вредность «химии»; миф про врачей-убийц, травящих людей прививками; миф про настолько страшное ГМО, что наклейки с надписью «без ГМО» надо клеить даже на салфетки и на пачки с солью.
![Как вы думаете, что заставило лягушку вырастить лишние ноги? Картинка для привлечения внимания](https://habrastorage.org/getpro/geektimes/post_images/db3/5c7/696/db35c7696d6455947d1483ae172ae964.png)
Что такое ГМО? Зачем они нужны? Как велика опасность и польза от их использования? Есть ли доказательства безопасности этих организмов?
+263
Насколько медленны iostreams?
7 min
79KПотоки ввода-вывода в стандартной библиотеке C++ просты в использовании, типобезопасны, устойчивы к утечке ресурсов, и позволяют простую обработку ошибок. Однако, за ними закрепилась репутация «медленных». Этому есть несколько причин, таких как широкое использование динамической аллокации и виртуальных функций. Вообще, потоки — одна из самых древних частей стандартной библиотеки (они начали использоваться примерно в 1988 году), и многие решения в них сейчас воспринимаются как «спорные». Тем не менее, они широко используются, особенно когда надо написать какую-то простую программу, работающую с текстовыми данными.
Вопрос производительности iostreams не праздный. В частности, с проблемой производительности консольного ввода-вывода можно столкнуться в системах спортивного программирования, где даже применив хороший алгоритм, можно не пройти по времени только из-за ввода-вывода. Я также встречался с этой проблемой при обработке научных данных в текстовом формате.
Сегодня в комментариях у посту возникло обсуждение о медленности iostreams. В частности, freopen пишет
а aesamson даёт такую рекомендацию
В этом посте я развею и подтвержу некоторые мифы и дам пару рекомендаций.
Вопрос производительности iostreams не праздный. В частности, с проблемой производительности консольного ввода-вывода можно столкнуться в системах спортивного программирования, где даже применив хороший алгоритм, можно не пройти по времени только из-за ввода-вывода. Я также встречался с этой проблемой при обработке научных данных в текстовом формате.
Сегодня в комментариях у посту возникло обсуждение о медленности iostreams. В частности, freopen пишет
Забавно смотреть на ваши оптимизации, расположенные по соседству со считыванием через cin :)
а aesamson даёт такую рекомендацию
Можно заменить на getchar_unlocked() для *nix или getchar() для всех остальных.
getchar_unlocked > getchar > scanf > cin, где ">" означает быстрее.
В этом посте я развею и подтвержу некоторые мифы и дам пару рекомендаций.
+86
Распознавание некоторых современных CAPTCHA
15 min
79KИменно так называлась работа, представленная мной на Балтийском научно-инженерном конкурсе, и принёсшая мне очаровательную бумажку с римской единичкой, а также новенький ноутбук.
Работа заключалась в распознавании CAPTCHA, используемых крупными операторами сотовой связи в формах отправки SMS, и демонстрации недостаточной эффективности применяемого ими подхода. Чтобы не задевать ничью гордость, будем называть этих операторов иносказательно: красный, жёлтый, зелёный и синий.
Работа заключалась в распознавании CAPTCHA, используемых крупными операторами сотовой связи в формах отправки SMS, и демонстрации недостаточной эффективности применяемого ими подхода. Чтобы не задевать ничью гордость, будем называть этих операторов иносказательно: красный, жёлтый, зелёный и синий.
+307
SoftEther VPN — продвинутый мультипротокольный VPN-сервер и клиент
3 min
391KКак скоро я смогу вас заинтересовать, если скажу, что в этой статье речь пойдет о VPN-сервере, который может поднимать L2TP/IPsec, OpenVPN, MS-SSTP, L2TPv3, EtherIP-серверы, а также имеет свой собственный протокол «SSL-VPN», который неотличим от обычного HTTPS-трафика (чего не скажешь про OpenVPN handshake, например), может работать не только через TCP/UDP, но и через ICMP (подобно pingtunnel, hanstunnel) и DNS (подобно iodine), работает быстрее (по заверению разработчиков) текущих имплементаций, строит L2 и L3 туннели, имеет встроенный DHCP-сервер, поддерживает как kernel-mode, так и user-mode NAT, IPv6, шейпинг, QoS, кластеризацию, load balancing и fault tolerance, может быть запущен под Windows, Linux, Mac OS, FreeBSD и Solaris и является Open-Source проектом под GPLv2?
То-то и оно. Такое пропустить нельзя.
![](https://habrastorage.org/getpro/habr/post_images/818/8e7/c64/8188e7c648197526d22a0ec431a5d43d.jpg)
То-то и оно. Такое пропустить нельзя.
![](https://habrastorage.org/getpro/habr/post_images/818/8e7/c64/8188e7c648197526d22a0ec431a5d43d.jpg)
+115
Кручу-верчу, запутать хочу. Разбираемся в линейках HDD
11 min
239K![](https://habrastorage.org/files/60f/8e8/9c9/60f8e89c999441fabc09f297e8a3f72e.png)
Сегодня у нас необычный материал, статья-ликбез: выбираем правильные HDD в зависимости от предполагаемых сценариев использования. Дело в том, что производители наплодили целую кучу разных линеек, и, если не следить за темой регулярно, через год-полтора можно легко забыть, какая серия к чему относится, зачем нужна и чем отличается.
+55
Information
- Rating
- Does not participate
- Location
- Москва, Москва и Московская обл., Россия
- Date of birth
- Registered
- Activity