Yandex offerlib что это
Лекция о двух библиотеках Яндекса для работы с большими данными
Пару недель назад в Яндексе прошла встреча PyData, посвящённая анализу больших данных с использованием Python. В том числе на этой встрече выступил Василий Агапитов — руководитель группы разработки инструментов аналитики Яндекса. Он рассказал о двух наших библиотеках: для описания и запуска расчетов на MapReduce и для извлечения информации из логов.
Под катом — расшифровка и часть слайдов.
Меня зовут Агапитов Василий, я представляю команду интеллектуального анализа данных.
В Яндексе мы выполняем расчеты по большим данным, в частности по данным, лежащим на кластерах MapReduce. В основном это анонимизированные логи сервисов и приложений. Кроме того, мы предоставляем наши инструменты по обработке больших данных другим командам. Наши основные потребители — команды аналитиков-разработчиков. Для простоты я буду называть их аналитиками.
Хочу рассказать о двух инструментах, библиотеках, истории их появления, и том, как мир Hadoop оказал влияние на их появление.
Давайте синхронизируем некоторое представление о терминах. Источники данных. Мы будем говорить исключительно о логах, поэтому для примера давайте рассмотрим какой-нибудь лог доступа к сервисам.
У нас по горизонтали располагаются записи этого лога, каждая запись имеет поля: vhost — идентификатор хоста, yandexuid — идентификатор посетителя, iso_eventtime — дата и время обращения, request — сам запрос и многие другие поля.
Данные из некоторых полей уже можно использовать в расчетах. Из других полей данные сначала надо извлечь и нормализовать. Например, в поле request содержатся параметры запроса. У каждого сервиса такие параметры свои. Для поиска наиболее используемым является параметр text. После того, как мы извлечем его из поля request, нам надо его нормализовать, поскольку он может быть очень большим или иметь какую-то странную кодировку.
Во-вторых, мы будем рассматривать наши расчеты в части расчетов на кластерах MapReduсe. Как вы знаете, MapReduсe — технология изготовления сэндвичей. На самом деле нет, это технология обработки больших данных. Если вы с ней не знакомы, то для текущего доклада вам надо знать, что она предполагает обработку данных с использованием двух операций — Map и Reduce.
Задача аналитика в том, чтобы построить расчет по событиям лога с учетом некоторой бизнес-логики. С какими трудности может столкнуться аналитик, решая свою задачу на кластерах MapReduсe без использования каких-либо библиотек? Во-первых, ему придется реализовывать бизнес-логику на базе операций MapReduсe. Такой подход добавляет в расчет код, не относящийся к бизнес-логике этого расчета, что существенно ухудшает его читаемость и поддержку. Во-вторых, нам надо данные из логов сначала извлечь и нормализовать — например, параметр text из поля request.
Как принято решать первую проблему? Очевидно, нам нужна какая-то библиотека, которая упростит доступ пользователя к кластеру и взаимодействие с ним.
В мире Hadoop к таким библиотекам можно отнести Pig, Hive, Cascading и некоторые другие.
В Яндексе используется собственная реализация MapReduсe, называемая YT, о преимуществах которой вы можете почитать в статье на Хабре и которая предоставляет для обработки данных базовые операции MapReduсe. Но, к сожалению, YT не имела аналогов библиотек из мира Hadoop. Нам пришлось это исправить.
В самом начале, когда мы столкнулись с этой проблемой, мы действительно при каждом расчете отдельно описывали Map-стадии, отдельно — Reduce-стадии, и отдельно — связь между этими стадиями для запуска расчета на кластере.
Более того, у каждого был собственный запускатор. Поддерживать такой зоопарк очень дорого. Решением для нас стала библиотека Nile, библиотека для описания и запуска расчетов на кластере. При ее создании мы взяли идею Сascading из мира Hadoop и реализовали ее на языке Python — во многом потому, что Python использует аналитики для локальной обработки данных, а использовать один язык для расчетов на кластере и для локальной обработки данных очень удобно.
Если вы знаете Cascading, то процесс обработки данных на Nile вам также покажется знакомым. Мы создаем поток из таблиц на кластере, модифицируем его, группируем, например, считаем какие-то агрегаты, разбиваем поток на несколько потоков, объединяем несколько потоков в один поток, производим другие действия, после чего полученный поток с нужными данными сохраняем обратно в таблицу на кластер.
Какие у Nile есть операции модификации потока? Их очень много, здесь представлены наиболее часто используемые. Project, чтобы получить список нужных нам полей. Filter, чтобы отфильтровать, оставив только нужные нам записи. Groupby + aggregate, чтобы сгруппировать поток по заданному набору полей и посчитать некоторые агрегаты. Unique, random и take, чтобы построить выборки уникальную, случайную и с заданным числом записи. Join, чтобы объединить два потока по равенству заданного набора полей. Split, чтобы разбить поток на несколько потоков по некоторому правилу с дальнейшей индивидуальной обработкой каждого из них. Sort, чтобы отсортировать. Put, чтобы положить таблицу на кластер.
Операции Map и Reduce также доступны, но требуются крайне редко, когда нужно сделать что-то действительно нестандартное и сложное.
Давайте посмотрим на инициализацию Nile. Она довольно проста. После импорта мы создаем два объекта — cluster и job. Cluster требуется, чтобы указать, на каком кластере мы хотим запускаться и прочее примерное окружение. Job — чтобы описать процесс модификации потока.
Как создать поток? Поток можно создать двумя путями: из таблицы на кластере или из существующих потоков. Первые два примера показывают, как создать поток из таблицы на кластере. В качестве аргумента передан путь до таблицы на кластере. Последний пример показывает, как нам создать поток из двух существующих потоков путем их слияния.
Давайте рассмотрим какой-то пример реализации задачи на Nile.
По логам доступа нужно посчитать число посетителей на хосте yandex.com.tr. Вспомним, как выглядят наш логи доступа. Из всего множества представленных полей нас будут интересовать поля vhost, чтобы отфильтровать и оставить только записи, относящиеся к хосту yandex.com.tr, и yandexuid, чтобы посчитать число посетителей.
Сам код на Nile для этой задачи будет иметь следующий вид.
Тут мы создаем поток из таблицы на кластере, получаем поля vhost и yandexuid. Оставляем только записи со значением поля vhost, равным yandex.com.tr, и считаем число уникальных значений поля yandexuid, после чего сохраняем поток в таблицу на кластере. Job.run() запустит нас расчет.
Перед запуском расчета на кластере Nile переведет наш расчет в набор MapReduсe-операций. Слева граф преобразования потока в терминах Nile, справа — в терминах MapReduсe-операций. Кроме того, Nile автоматически оптимизирует наш расчет, а именно, если у нас есть несколько Map-операций, идущих подряд, то Nile может их склеить в одну Map-операцию, выполняемую на кластере. Мы видим, что так и произошло. Это довольно простая задача, и код для нее будет сравнительно просто выглядеть на любом языке программирования.
Чтобы рассмотреть что-то более сложное, давайте вспомним о второй проблеме, с которой сталкиваются аналитики: данные из логов нужно извлечь и нормализовать.
Как принято решать эту проблему? Обычно для решения этой проблемы используют ETL. Кто знает, что это? Процентов 30 знает. Кто не знает или знал, но забыл: ETL предполагает, что у нас есть сырые необработанные данные, мы из них производим извлечение нужных нам записей, полей и прочего, модифицируем их с учетом некоторой бизнес-логики и загружаем в хранилище. В дальнейшем мы будем производить все расчеты по данным из хранилища, то есть по нормализованным данным.
Мы выбрали другой путь. Мы храним сырые данные и выполняем расчеты по ним, а процесс извлечения и нормализации данных происходит в каждом расчете.
Почему мы выбрали такой путь? Предположим, в процессе извлечения и нормализации полей используется внешняя библиотека, и в этой библиотеке была бага. После того, как мы багу исправим, нам надо будет пересчитать расчеты за прошлое. В нашем подходе мы просто запускаем расчеты за прошлое и получаем верные результаты. В случае ETL — если эта библиотека использовалась в процессе — нам придется сначала данные заново извлечь, обработать этой библиотекой, положить в хранилище и только потом выполнить расчеты.
Хороший вариант, если вы можете хранить как сырые данные, так и нормализованные. У нас, к сожалению, из-за большого объема данных такой возможности нет.
Вначале мы для каждого расчета выполняли извлечение и нормализацию данных индивидуально. Затем мы заметили, что для одних и тех же логов мы часто достаем похожие поля примерно одним и тем же образом, и мы объединили эти правила в одну библиотеку QB2. Сами правила назвали экстракторами, наборы таких правил для логов — деревьями разбора.
Итак, сейчас библиотека QB2 предоставляет абстрактный интерфейс к сырым логам и знает про деревья разбора.
Давайте познакомимся с деревом разбора. Это дерево разбора для логов мобильных приложений Яндекса. Не присматривайтесь, это глобальная карта.
В самом верху запись лога. Все остальные цветные прямоугольники — это виртуальные поля. Связи — это экстракторы. Таким образом, пользователь без библиотеки QB2 может обращаться только к полям лога. Пользователь, использующий библиотеку QB2, может использовать как поля лога, так и поля, предоставляемые библиотекой QB2 для данного лога.
Давайте рассмотрим преимущества этой библиотеки на конкретном примере. Рассмотрим задачу. Пусть у нас есть некоторое мобильное приложение Яндекса, идентифицируемое значением поля API_key, равным 10321. Мы знаем, что оно пишет логи в поля, в частности в поле event_value, содержащее словарь в виде JSON-объекта. Нас будет интересовать значение ключа stage этого словаря.
Нам надо посчитать число посетителей для каждого stage в разбивке по дате события. Какие поля нам для этого предоставляет библиотека QB2? Во-первых, API_key, идентификатор приложения. Во-вторых, device_id, идентификатор пользователя. И наконец event_date, дата события, которая получена не непосредственно из записи лога, а путем довольно большого числа преобразований. Без использования библиотеки QB2 нам бы пришлось в каждом расчете, где требуется это поле, выполнять преобразования вручную. Согласитесь, это неудобно.
Кроме того, нам нужны поля event_value и значение stage. Их в нашем дереве разбора нет, и это логично, потому что они пишутся только для одного конкретного приложения.
Нам придется дополнить наше дерево разбора до следующего вида путем применения экстракторов. Как поменяется инициализация для данной задачи? Мы дополнительно импортируем экстракторы и фильтры. Экстракторы потребуются, чтобы получить значения полей event_value и stage. Фильтры — чтобы отфильтровать записи, оставив только нужные.
Вы можете задаться вопросом: почему в данном примере мы использовали фильтрацию из библиотеки QB2, хотя в предыдущем использовали фильтрацию из Nile? QB2, как и Nile, старается оптимизировать ваш расчет, а именно она пытается получить значения для полей, используемых в фильтрациях, как можно раньше. Раньше, чем значения для остальных виртуальных полей.
Зачем это сделано? Чтобы мы не получали значения для остальных виртуальных полей, если наша запись не проходит по каким-то условиям фильтрации. Тем самым мы сильно экономим вычислительные ресурсы и ускоряем расчет на кластере.
Сам код расчета будет иметь следующий вид. Мы тут точно так же создаем поток из таблицы на кластере и модифицируем его оператором QB2, который инициализируем следующими вещами: именем дерева разбора, которое в нашем случае совпадает с именем лога, а также набором полей и фильтров.
В полях мы перечисляем поля API_key, device_id и event_date по их именам, потому что библиотека QB2 уже знает, как доставать эти поля.
Для извлечения поля event_value воспользуемся стандартным экстрактором json_log_field. Что он делает? По переданному ему имени он получает значение из соответствующего поля лога и загружает его как JSON-объект. Это загруженное значение мы сохраняем в поле event_value.
Чтобы получить значение stage, мы используем другой стандартный экстрактор — dictItem. По переданному ему имени ключа и имени поля он извлекает соответствующее значение из этого поля для этого ключа.
Про фильтрации. Нас будут интересовать только записи, у которых определено значение поля device_id и которые относятся к нашему приложению, то есть значение поля api_key у них равно 10321. После применения оператора QB2 наш поток будет иметь следующие поля: api_key, device_id, event_date, event_value и stage.
Модифицируем полученный поток следующим образом. Сгруппируем по паре полей event_date и stage и посчитаем число уникальных значений device_id. Это значение мы положим в поле users, после чего полученный поток сохраним на кластер. Job.run() запустит расчет.
После окончания расчета на кластере будет таблица следующего вида: для каждой пары полей event_date и stage в поле users будет лежать число уникальных значений пользователей. Таким образом, интеграция библиотек QB2 и Nile решает обе проблемы, которые я озвучил. Спасибо за внимание.
Обзор «Яндекс»: диверсифицирующийся технологический гигант
Yandex N. V. (NASDAQ, MCX: YNDX) — нидерландский холдинг, головная компания международного технологического гиганта с российскими корнями — «Яндекса».
Что тут происходит
Читатели давно просили нас начать разбирать отчетность и фундамент бизнеса российских эмитентов. Идею сделать обзор «Яндекса» предложил наш читатель Alex Freeman в комментариях к обзору IPO Fix Price. Предлагайте в комментариях компании, разбор которых вам хотелось бы прочитать.
О компании
«Яндекс» — крупная международная технологическая компания с российскими корнями. Ведет бизнес как в России, так и еще в 21 стране. Бизнес-модель компании не подразумевает разработку программного обеспечения на заказ или прямую продажу его клиентам — компания делает упор именно на создании и развитии полноценных пользовательских сервисов на основе произведенного компанией программного обеспечения. Многие сервисы компании — это фактически агрегаторы, многие бесплатны для широкого круга клиентов.
«Яндекс» считает началом своей истории 1990 год, когда начинали разрабатываться первые продукты компании в рамках компаний Arcadia и CompTek. В виде отдельного юридического лица компания появилась в 2000 году, а в 2007 появилась головная нидерландская компания Yandex N. V.
В первые годы существования были созданы: поисковый алгоритм, давший также название одноименному поисковому порталу, рекламный движок, прочие сервисы типа почты, карт. В первой половине 2010-х компания начала путь к активному расширению и диверсификации бизнеса — можно сказать, что она вышла в офлайн — стала производить товары и начала заниматься цифровизацией традиционных офлайн-бизнесов.
Сейчас у «Яндекса» не просто диверсифицированный бизнес. «Яндекс» — один из ведущих игроков, организовавших свою экосистему — большое количество разнообразных сервисов, пытающихся удовлетворить максимальное количество повседневных потребностей пользователя в одном месте. Экосистемность удобна самому «Яндексу» еще и потому, что новые экспериментальные сервисы могут использовать существующие наработки и сервисы как свою инфраструктуру, создавая синергию.
Компания выделяет шесть операционных сегментов бизнеса, в каждом — по несколько сервисов.
Поиск и портал. В данный сегмент входят довольно разнородные сервисы:
На заработки от рекламы значительно влияет объем рынка онлайн-рекламы — и с ним все хорошо: он растет, перетекая из менее эффективного офлайна. Несмотря на обилие сервисов, основным все равно остается поиск, так что компании очень важно сохранять свою лидирующую позицию в рунете, что непросто, так как главным соперником выступает мировой поисковый гегемон — Google. Пока получается.
Такси. Здесь объединены офлайн-бизнесы компании, связанные с мобильностью:
В разделе такси компания заняла уже значительную долю рынка, так что ФАС даже заблокировала покупку «Везет», посчитав, что тогда «Яндекс-такси» может занять 70% российского рынка агрегаторов такси. Остальные сервисы также растут хорошими темпами. В 2020 году компания выпустила единое суперприложение «Яндекс Go», объединяющее все сервисы в одном месте.
Как победить выгорание
«Яндекс-маркет». Мультикатегорийный маркетплейс и сервис сравнения цен. Он недавно снова стал полноценной частью «Яндекса». С точки зрения бизнеса это конкурент Ozon, в статье про который мы подробно рассматривали данный бизнес-сегмент и его перспективы. Количество товарных позиций, продающихся на «Яндекс-маркете», превысило два миллиона, количество продавцов — 8 тысяч. У компании есть 4 фулфилмент-центра: три в Москве и один в Ростове-на-Дону, — 8 сортировочных центров, 632 пункта самовывоза и 1187 пунктов выдачи. Компания активно использует курьерскую службу «Яндекс-лавки».
Медиасервисы. Сюда входят сервисы, связанные с развлечениями:
Вертикали. Сюда входят различные сервисы объявлений:
В данном сегменте компания зарабатывает на комиссиях за поднятие объявлений и дополнительные услуги, на рекламе.
Другие бизнес-юниты и инициативы. Сюда входят остальные сервисы компании — не подходящие под тематику остальных операционных сегментов или те, что числятся экспериментальными и которые компания не готова выделить в отдельные бизнес-юниты:
«Яндекс» гибко подходит к операционным сегментам, периодически перемещая сервисы из одного в другой. Например, «Яндекс-драйв» только недавно вошел в сегмент «Такси», а начиная с 2021 года «Яндекс-услуги» и «Товары» переместили в «Другие сервисы и эксперименты», которые вместе с тем переименовали в «Другие бизнес-юниты и инициативы», а геосервисы перешли в «Поиск и портал».
Также стоит упомянуть, что «Яндекс» не только самостоятельно разрабатывает новые сервисы с нуля, но и периодически не чурается покупать их для последующего встраивания в свою экосистему. Приобретаются как целые большие сервисы, которые так и остаются заметными частями экосистемы, такие как «Кинопоиск» и «Авто-ру», так и более мелкие активы — например, «Партия еды» и часть активов «Везет».
Offer library container что это
Наверняка после установки и определенного времени работы за компьютером мы замечали, что он стал работать медленнее, и хотели бы вернуть его в первоначальное состояние. Но как это сделать? В подавляющем большинстве случаев причина одна – слишком много программ в автозагрузке, которые включаются при старте Windows и висят в системе, занимая ресурсы и замедляя процесс загрузки компьютера (см. также «Как определить программу, которая тормозит работу компьютера«).
Чтобы значительно разгрузить систему от автоматически запускаемых приложений, необходимо отключить все лишнее и ненужное в настоящий момент. Сказать легче, чем сделать. Потому для многих является большой проблемой найти в списке автоматически запускаемых программ те самые ненужные элементы. Чтобы упростить задачу, представляю вашему вниманию 8 программ, которые можно смело отключить в автозагрузке, чтобы ускорить свою систему.
1. iTunes Helper
Наверняка, эта программа будет в списке у тех, кто использует iTunes для прослушивания музыки и/или синхронизации своих гаджетов от компании Apple. Данная программа сидит постоянно в памяти компьютера и ждет, пока подключат iДевайс. Как только это происходит, она запускает iTunes. Собственно, это все, на что она нужна.
Фишка в том, что запустить iTunes можно вручную при подключении устройства. Если же устройства нет, то данная программа вообще не нужна. В обоих случаях ее можно отключить.
2. QuickTime
Это модуль мультимедийного проигрывателя, который может понадобиться для воспроизведения некоторых форматов видео. Но зачем он в автозагрузке? Можно отключить.
3. Apple Push
Продукт также принадлежит яблочной компании и служит для отправки уведомлений для запуска других программ от Apple, которые установлены в системе. По сути, он позволяет взаимодействовать между устройством и приложениями типа iCloud на компьютере. Но опыт показывает, что если отключить данную запись, то синхронизация данных все равно производится. Так что можно отключить.
4. Adobe Reader
Конечно, все знают самую популярную программу для чтения PDF. Если эта программа не используется, то совершенно не нужно держать ее автозагрузке, впустую занимая ресурсы. Можно отключить.
5. Skype
Без общения в Skype многие просто не могут жить. Кто-то делает это постоянно и на протяжении всего дня общается с коллегами по работе. А кто-то общается дома с дальними родственниками раз в несколько дней. Но правда такова, что при установке Skype автоматически прописывается в автозагрузке и включается каждый раз вместе с системой, что также замедляет другие процесс автозагрузки, которые происходят параллельно, так как сам по себе Skype далеко не «легкое» приложение. Можно запускать его вручную по мере необходимости и после запуска системы.
6. Google Chrome
Самый популярный браузер тоже любит посидеть в автозагрузке, прописав туда модули проверки обновлений. Такие модули как Google Update и Google Installer (Установщик Google) можно отключить. При этом браузер Chrome все равно будет сам обновляться.
7. Evernote Clipper
Являясь большим поклонником Evernote, я все же отключил Clipper. И при этом не испытываю никаких неудобств работы с ним на протяжении уже многих лет.
8. Microsoft Office
Офисный пакет от Microsoft весьма хорош и является стандартом почти везде. Но какой толк от него в автозагрузке? Ведь и без автоматического запуска можно открыть любой файл в любой офисной программе. Отключаем.
В большинстве случаев причиной медленной работы ПК является его захламленность различными приложениями, которыми мы пользуемся время от времени, но которые запускаются при каждом включении и компьютера и съедают ресурсы ПК в процессе ожидания, когда же ей воспользуются. Часто в этом просто нет необходимости и такие приложения можно запускать вручную по мере необходимости, не забирая у компьютера ресурсы лишь для того, чтобы какая-то программа ожидала вас в памяти.
Отключать автозагрузку у программ лучше всего в их настройках. Но если таковых нет, то можно воспользоваться утилитой msconfig в Windows XP-7 или Диспетчером задач в Windows 8-10.
А вы знаете, что время перехода операционной системы в рабочее состояние можно сократить до пары секунд? Подробнее об этом я писал в статье «Почему не нужно выключать компьютер».
Если вы отключили какие-то программы в автозагрузке и хотите поделиться ими с читателями, то расскажите об этом в комментариях и я дополню список выше.
Стандартная библиотека предоставляет различные типобезопасные контейнеры для хранения коллекций связанных объектов. The Standard Library provides various type-safe containers for storing collections of related objects. Контейнеры — это шаблоны классов. При объявлении переменной контейнера указывается тип элементов, которые будет содержать контейнер. The containers are class templates; when you declare a container variable, you specify the type of the elements that the container will hold. Контейнеры могут создаваться с использованием списков инициализаторов. Containers can be constructed with initializer lists. Они содержат функции-члены для добавления и удаления элементов и выполнения других операций. They have member functions for adding and removing elements and performing other operations.
Итерация элементов в контейнере и доступ к отдельным элементам осуществляются с помощью итераторов. You iterate over the elements in a container, and access the individual elements by using iterators. Вы можете использовать итераторы явно, с помощью их функций-членов и операторов, а также глобальных функций. You can use iterators explicitly by using their member functions and operators as well as global functions. Вы можете также использовать их неявно, например с помощью цикла range-for. You can also use them implicitly, for example by using a range-for loop. Итераторы для всех контейнеров стандартной библиотеки C++ имеют общий интерфейс, но каждый контейнер определяет собственные специализированные итераторы. Iterators for all C++ Standard Library containers have a common interface but each container defines its own specialized iterators.
Контейнеры можно разделить на три категории: последовательные контейнеры, ассоциативные контейнеры и контейнеры-адаптеры. Containers can be divided into three categories: sequence containers, associative containers, and container adapters.
Последовательные контейнеры Sequence Containers
Последовательные контейнеры поддерживают указанный пользователем порядок вставляемых элементов. Sequence containers maintain the ordering of inserted elements that you specify.
Контейнер vector ведет себя как массив, но может автоматически увеличиваться по мере необходимости. A vector container behaves like an array, but can automatically grow as required. Он поддерживает прямой доступ и связанное хранение и имеет очень гибкую длину. It is random access and contiguously stored, and length is highly flexible. По этим и многим другим причинам контейнер vector является наиболее предпочтительным последовательным контейнером для большинства областей применения. For these reasons and more, vector is the preferred sequence container for most applications. Если вы сомневаетесь в выборе вида последовательного контейнера, начните с использования вектора. When in doubt as to what kind of sequence container to use, start by using a vector! Дополнительные сведения см. в разделе Класс vector. For more information, see vector Class.
Контейнер list — это двунаправленный список, который обеспечивает двунаправленный доступ, быструю вставку и удаления в любом месте контейнера, но не поддерживает прямой доступ к элементам контейнера. A list container is a doubly linked list that enables bidirectional access, fast insertions, and fast deletions anywhere in the container, but you cannot randomly access an element in the container. Дополнительные сведения см. в разделе Класс list. For more information, see list Class.
Ассоциативные контейнеры Associative Containers
В ассоциативных контейнерах элементы вставляются в предварительно определенном порядке — например, с сортировкой по возрастанию. In associative containers, elements are inserted in a pre-defined order—for example, as sorted ascending. Также доступны неупорядоченные ассоциативные контейнеры. Unordered associative containers are also available. Ассоциативные контейнеры можно объединить в два подмножества: сопоставления (set) и наборы (map). The associative containers can be grouped into two subsets: maps and sets.
Упорядоченные контейнеры map и set поддерживают двунаправленные итераторы, а их неупорядоченный аналоги — итераторы с перебором в прямом направлении. Ordered maps and sets support bi-directional iterators, and their unordered counterparts support forward iterators. Дополнительные сведения см. в разделе Итераторы. For more information, see Iterators.
Разнородный поиск в ассоциативных контейнерах (C++ 14) Heterogeneous Lookup in Associative Containers (C++14)
Разнородный поиск включается дополнительно, когда указывается средство сравнения «ромбовидный функтор» std::less<> или std::greater<> при объявлении переменной контейнера, как показано ниже: Heterogenous lookup is enabled on an opt-in basis when you specify the std::less<> or std::greater<> «diamond functor» comparator when declaring the container variable, as shown here:
Если используется средство сравнения, заданное по умолчанию, контейнер ведет себя точно так же, как в C++ 11 и более ранних версиях. If you use the default comparator, then the container behaves exactly as it did in C++11 and earlier.
Следующие функции-члены в контейнерах «сопоставление», «мультиотображение», «набор» и «мультинабор» были перегружены для поддержки разнородного поиска: The following member functions in map, multimap, set and multiset have been overloaded to support heterogeneous lookup:
Контейнеры-адаптеры Container Adapters
Контейнер-адаптер — это разновидность последовательного или ассоциативного контейнера, который ограничивает интерфейс для простоты и ясности. A container adapter is a variation of a sequence or associative container that restricts the interface for simplicity and clarity. Контейнеры-адаптеры не поддерживают итераторы. Container adapters do not support iterators.
Контейнер queue соответствует семантике FIFO (первым поступил — первым обслужен). A queue container follows FIFO (first in, first out) semantics. Первый элемент, который отправляется, то есть вставляется, в очередь, должен быть первым элементом, извлекаемым из очереди. The first element pushed—that is, inserted into the queue—is the first to be popped—that is, removed from the queue. Дополнительные сведения см. в разделе Класс queue. For more information, see queue Class.
Контейнер priority_queue упорядочен таким образом, что первым в очереди всегда оказывается элемент с наибольшим значением. A priority_queue container is organized such that the element that has the highest value is always first in the queue. Дополнительные сведения см. в разделе Класс priority_queue. For more information, see priority_queue Class.
Контейнер stack соответствует семантике LIFO (последним поступил — первым обслужен). A stack container follows LIFO (last in, first out) semantics. Последний элемент, отправленный в стек, становится первым извлекаемым элементом. The last element pushed on the stack is the first element popped. Дополнительные сведения см. в разделе Класс stack. For more information, see stack Class.
Поскольку контейнеры-адаптеры не поддерживают итераторы, их невозможно использовать в алгоритмах стандартной библиотеки C++. Because container adapters do not support iterators, they cannot be used with the C++ Standard Library algorithms. Дополнительные сведения см. в разделе Алгоритмы. For more information, see Algorithms.
Требования для элементов контейнеров Requirements for Container Elements
Деструктору не разрешено вызывать исключение. The destructor is not permitted to throw an exception.
Для некоторых операций в контейнерах может также потребоваться открытый конструктор по умолчанию и открытый оператор равенства. Some operations on containers might also require a public default constructor and a public equivalence operator. Например, неупорядоченным ассоциативным контейнерам требуется поддержка сравнения на равенство и хэширования. For example, the unordered associative containers require support for equality and hashing.
Доступ к элементам контейнера Accessing Container Elements
Доступ к элементам контейнеров осуществляется с помощью итераторов. The elements of containers are accessed by using iterators. Дополнительные сведения см. в разделе Итераторы. For more information, see Iterators.
Для перебора коллекций стандартной библиотеки C++ можно также использовать циклы for на основе диапазонов. You can also use range-based for loops to iterate over C++ Standard Library collections.
Сравнение контейнеров Comparing containers
Сравнение контейнеров разного типа (C++ 14) Comparing dissimilar containers (C++14)
Все эти Яндекс-, Рамблер-, Маил.ру- и т.д. бары как венерические заболевания: один раз во время установки не убрал галочку в нужном месте — всё, мучайся, лечи, удаляй.
Если у Вас при входе в интернет выскакивает табличка «Ого, в настройках интернета что-то поменялось!» или похожая, Вы не можете изменить стартовую страницу, изменился поиск по умолчанию, в браузере появились новые панели инструментов, при загрузке компьютера выскакивают неведомые окна, начинают сканировать компьютер и рапортовать о существовании кучи проблем — у Вас завелись программы-паразиты. В этой статье я расскажу что это такое, откуда они берутся и как от них избавиться.
По официальной классификации их ещё называют ПНП (Потенциально нежелательные программы) (англ. — Potentially Unwanted Programs (PUPs)).
Чем они нам грозят?
1. Панели инструментов (toolbars) занимают полезное пространство окна браузера, препятствуя свободному доступу к нужной и полезной информации.
2. Занимают оперативную память и ресурсы процессора и, в зависимости от их количества, могут существенно замедлить работу компьютера.
3. Практически всегда запускаются вместе с операционной системой а также с браузеом тем самым существенно увеличивают время их загрузки.
4. Могут проводить за спиной у пользователя какую-то свою «недокументированную» деятельность: собирать и передавать своим хозяевам историю посещения интернета, персональную информацию, пароли, модифицировать веб-страницы, поисковую выдачу, перенаправлять на другие ресурсы.
5. Ведя свою «деятельность» могут сильно понизить скорость Интернета.
6. «Халявные» улучшальщики, чистильщики, обновляльщики и оптимизаторы редко бывают полезны, а часто — наоборот.
7. Не всегда качественно написанные и оттестированные программистами, могут быть причиной самых разнообразных иных «глюков» компьютера.
От куда они берутся?
В отличие от заразы, называемой «hijack startpage» вроде webalta.ru apeha.ru, www.ctel.ru, www.smaxi.net, mygame.com.ua в появлении данных проблем пользователь виноват частично сам. Обычно эти программы честно предупреждают пользователя о том, что они будут устанавливаться (хотя может не всегда так явно, как хотелось бы).
Практически все бесплатные программы, игры, а так же и некоторые платные имеют этот «халявный довесок»:
При установке ICQ «довески» прячутся в пункте «Настройка установки»
При обновлении программ, плагинов:
При обновлении Adobe Flash Player не пропустите установку McAfee Security Scan Plus!
При скачивании файлов из файлообменников:
При загрузке файлов из интернета не пропустите «предложение» установить какой-нибудь Яндекс.Бар
При установке игр, если не обращать внимание на настройку параметров, установится куча ненужных опций
Оказывается, что при установке платных программ (например антивирус NOD32) также нужно быть внимательным чтобы не «подхватить» какой-то Яндекс.бар вместе с сервисом хранения фотографий «всего лишь за 590 руб на 1 год»:
По-моему, встраивать в платные программы рекламные материалы — это уже жлобство!
Был приятно удивлён, что при установке антивируса Avira его SearchFree Toolbar НЕ ОТМЕЧЕН галочками по умолчанию
Что получаем?
В результате наших невнимательных действий получим такие или похожие всплывающие окна, невозможность изменить стартовую страницу, тулбар в браузер, новую иконку в трей и в автозапуске:
Mail.ru: Управление настройками интернета: «Ого, в настройках интернета что-то поменялось!»
Как с этим бороться?
Лучше этого конечно не допускать, но если уж такое произошло необходимо зайти в «Установку и удаление программ» и подчистую поудалять программы-паразиты, которые мы по неосторожности впустили в наш компьютер. Вот список из таких программ (будет постоянно пополняться), которые в последнее время наиболее часто встречаются:
Ask Toolbar
Ask Toolbar Updater
AlterGeo Magic Scanner
Avira SearchFree Toolbar
Bing Bar
Carambis Driver Updater
DAEMON Tools Toolbar
Google Toolbar
Guard@Mail.Ru
Hamster Free ZIP Arhiver
Hamster Lite Arhiver
ICQ Toolbar
livetools
McAfee Security Scan
McAfee SiteAdvisor
Norton Security Scan
Rambler-Ассистент
Skype Click to Call
Skype Toolbars
Ticno multibar
Ticno Indexator
Ticno Tabs
Uniblue DriverScanner
Vpets
Windows iLivid Toolbar
Яндекс.Бар
Mail.Ru Спутник
При удалении Guard.mail.ru сопротивляется и нагло врёт о том, что он «охраняет компьютер от вредоносных программ». На самом деле он охраняет только службы Mail.ru (стартовую страницу, поиск и т.д.)
Ещё лучше воспользоваться какой-то продвинутой программой-деинсталлятором. Например Revouninstaller, чтобы она поподчищала за этимими программами все возможные «хвосты», которые остаются в системе после обычной деинсталяции:
Программа-деинсталятор Revouninstaller после удаления Яндекс.Бара стандартными средствами находит и удаляет от него ещё много «хвостов» как в реестре, так и на жёстком диске
После удаления этой гадости необходимо вручную поисправлять в браузерах стартовые страницы, поиск по умолчанию, поудалять ненужные дополнения. Хотя, иногда и этого бывает недостаточно: оно иногда так глубоко прописывается в браузере, что искоренить его полностью не представляется возможным.
После удаления Яндекс.Бара в браузере иногда остаются непонятные глюки
В таком случае проще и быстрее их также попереустнавливать при помощи программы деинсталяции (но не забывайте что в таком случае могут пропасть закладки, сохранённые пароли, история посещений и нужные дополнения!).
Удачи всем вам, будьте внимательны и не попадайтесь!
На десерт
Сборник народной мудрости от цитатника рунета:
«А я маленькая программка управления фотоаппаратом, и я боюсь что ты меня никогда не увидишь, поэтому вот тебе мой тулбар в браузер, иконка в трей, автозапуск со сплешскрином, стартовая страница и поиск по умолчанию…»
Отзыв о программе Yahoo Toolbar:
— КАК Б**** УДАЛИТЬ ЭТУ Х****.
XXX: Переставлял винду у себя на машине вместе со всем софтом. Надо быть очень внимательным человеком, чтобы не поставить себе yandex bar.
Я бы проголосовал на выборах за того кто пообещал бы законодательно запретить встраивать яндекс.бар в инсталляторы.
Из истории развития Вселенной, хронология большого взрыва:
В: Почему ребёнок кричит при рождении?
О: Ему предлагают сразу проставить Яндекс.Бар.
Если вечером пьяным зайти в интернет, то на утро обнаружишь установленный в браузере Яндекс-бар.
ScayTrase: Долбаный Яндекс.Бар скоро приучит всех человеков читать лицензии, и смотреть на кнопочки при установке.
1: есть даже люди, которые добровольно яндекс.бар устанавливают
2: о_О О_О О_о
1: убери свой танк с моей территории
Вилка: Сегодня впервые устанавливала виндовс 7. Почему-то казалось, что на последней минуте спросит «Установить яндекс.бар?» ))
В: все эти яндекс.бары лишь портят удовольствие от установки программ по типу «далее, далее, далее, готово»
xxx: да гугл давно всякие програмульки выпускает
ууу: херня все это, вот если бы они сделали програмульку которая сносит всякие гварды мейл ру и ставит во все браузеры поиск по умолчанию гугл, ее бы без включения в софт качали на ура.
>Сегодня чуть было не поставил себе яндекс бар вместе с юторрентом…
>Теряю сноровку 🙁
Сейчас обновлял какую-то прогу и убирая галочки с ненависного Яндекс-бара подумал, что однажды они изменят формулировку фразы «Я хочу сделать Яндекс стартовой страницей» и «Я хочу установить Яндекс-бар» на «я НЕ хочу …» и миллионы, миллионы юзеров, по привычке убрав галочки…
В этот день Яндекс-бар побьёт все мировые рекорды по количеству установок программы в один день.
Давно мечтаю о приложении, которое бы блокировало любые попытки этого бара пролезть в систему. На самом деле не так-то это просто. Одно невнимательное действие, одна забытая неприметная галочка при обновлении очередной полезной софтины и враг у вас дома шарится по холодильнику в ваших любимых тапочках.
ххх: блин, надо сделать что-то необычное, что еще никто ни разу не делал!
ууу: скачай и установи яндекс.бар