Кто создал vector

Обновлено: 04.07.2024

Российская вакцина от ВИЧ показала свою 100% эффективность. Россия может стать первой в мире страной, победившей не только COVID-19, но и ВИЧ.

Созданная в России вакцина от вируса иммунодефицита человека (ВИЧ) показала эффективность 100%. Подробностями разработки поделились разработчики сыворотки из научного центра Роспотребнадзора "Вектор".

Сообщается, что речь идёт о первой фазе клинических испытаний вакцины "КомбиВИЧвак". В ходе тестов у 100% добровольцев появились антитела к ВИЧ. Испытания проводились на 240 добровольцах в двух медицинских организациях в Новосибирской области.

"ВИЧ-специфические антитела и цитотоксические Т-лимфоциты после двукратной вакцинации были зафиксированы у 100% добровольцев, антитела, нейтрализующие ВИЧ-псевдовирусы, - у 80%", - сообщили в центре "Вектор".

Отмечается, что впервые вакцина от ВИЧ была испытана в 2011 году. Тогда она называлась "КомбиВИЧвак". Исследования показали, что сыворотка является безопасной, не вызывает побочных эффектов и индуцирует ВИЧ-специфический гуморальный и клеточный ответ. Испытания эффективности вакцины будут продолжаться до конца 2021 года.

Кроме того, в центре "Вектор" сообщили, что уже создали улучшенную версию вакцины под названием "КомбиВИЧвак-Ново". Однако ей ещё только предстоят испытания на эффективность.

Напомним, что Россия уже является первой страной в мире, где создали эффективную вакцину от коронавирусной инфекции COVID-19. В следующем году наша страна может стать ещё и первой, кто создал вакцину от ВИЧ, являющегося одной из главных болезней современной эпохи.

Аналог std::vector из C++11 на чистом C89 и как я его писал

image


Жилой массив людей. Нет, серьёзно.

Холивары между ценителями Си и приверженцами его ублюдка сына в лице C++ начались ещё до моего рождения и прекратятся разве что после смерти обоих этих языков и меня заодно.

Адепты великого творения Кернигана-Ритчи до последней секунды рабочего дня готовы доказывать приспешникам Страуструпа аксиомы про вечность Си и его невероятную гибкость.
Те в ответ по-свойски советуют им лучше порадоваться рабочему дню, ведь он вот-вот окажется последним – двадцать первому веку кроссплатформенный ассемблер не нужен.
Распаляясь, сторонники Си приводят миллионы давно прошедших через голову навылет тезисов "почему Си лучше C++", при этом каждый раз подчёркивая, что второй все достоинства первого растерял ещё будучи в отцовской утробе, попутно утратив лик человеческий.
Обвиняемая сторона в обиде не остаётся и.

а хотя постойте, о чём это я.

Я люблю Си, уважаю C++ и не переношу холивары (честно). При этом я осознаю, что в Си действительно не хватает многого, и яркий тому пример – отсутствие удобной работы с данными. В C++ эту проблему во многом решает STL и свойства самого языка. На мой студенческий взгляд, здесь особо отличается всем знакомый std::vector . Если стало интересно, как я реализовал его аналог средствами C89 – прошу под кат.

Предыстория

Вообще, с вышеописанной проблемой наверняка сталкивается каждый, кто переходит на Си с языка чуть более высокого уровня (в моём случае это были FreeBASIC и Free Pascal). Проблема отсутствия давно полюбившихся Redim и SetLength() вначале решается "в лоб кувалдой" при помощи realloc() . Потом приходят знания в обнимку с опытом, и вместо этого уже используется простенький самописный динамический массив.

Однако необходимость дублировать его код для каждого отдельно взятого типа данных с каждым разом всё сильнее вызывает раздражение. Туда же альтернативный вариант – использование указателей, требующее разыменований и приведений типов. А затем человеку попадает в руки C++ (или его аналог) и человек видит STL (или его аналог). Дальше можно прочитать в любом бульварном романе.

Тем не менее, влюбляются в тело, но любят душу. Если человек долгое время был в счастливых отношениях с Си, если в них уже появились проекты, то человеку вполне естественно хотеть сделать объект своей любви лучше – к обоюдной пользе. А человек в совершенствовании всегда на что-то ориентируется.

Короче говоря, это история о том, как любовь к Си заставила меня привнести в неё (него?) пресловутый std::vector – то, что мне нравилось в C++, которым (которой?) я в одно время увлёкся.

До нас хоть потоп

Уже было отмечено, что проблема отсутствия в Си встроенного динамического массива для произвольных типов не нова и по-разному решалась немало раз.
Вот те варианты реализации вектора, которые я нашёл буквально за пять минут в Google:

Все эти решения имеют как минимум один из следующих фатальных недостатков:

Реализация макросами конкретных функций управления.
Использовать макросы в качестве inline-функций – затея плохая. Об этом говорилось много раз, но разве мы устанем повторять?
Во-первых, при использовании макросов-функций тяжелее отслеживать и отлаживать ошибки, возникающие из-за неправильных типов аргументов.
Во-вторых, макросы-функции не умеют ничего возвращать, если не брать во внимание извращения с comma-оператором или отдельным аргументом под имя переменной для хранения результата.
В-третьих, из-за постоянных подстановок кода из макросов-функций, которые и на inline-то мало похожи, разбухает размер единицы трансляции. Отсюда следует увеличение размера выходного исполняемого файла и прочие радости жизни.
В-четвёртых, на макрос-функцию нельзя взять указатель.

Дублирование общих для любых векторов функций.
Например, разные функции освобождения для вектора int 'ов и вектора char 'ов. Под капотом они будут представлять собой всего-навсего вызов функции free() , глубоко безразличной к тому, что хранится в уничтожаемом буфере, равно как и к типу указателя на него.
Это опять же провоцирует увеличение объёма единиц трансляции, дублирование кода, а заодно и замусоривание пространства имён.

Работа со значениями через нетипизированные указатели.
Это обязывает всегда брать указатель на значение для добавления его даже в простой вектор примитивных типов (например int 'ов). А также не забываем о приведении типов и разыменованиях. Ну и о том, что в такой вектор можно потенциально засунуть значения разных типов, и никто нас об этом не предупредит.

Обозначение типа вектора как структуры.
Самый большой недостаток, при наличии одного которого даже полное отсутствие других уже не играет роли.
Во-первых, обращение к элементам вектора происходит через поле структуры. Для одномерного вектора это уже неудобно – стоит ли говорить о многомерных.
Во-вторых, все поля структуры, даже технические, свободно доступны пользователю.
Во-третьих, практически полная несовместимость между векторами разных типов.
В-четвёртых, для создания и удаления вектора требуется 2 вызова malloc() / free() соответственно – один на структуру и один на сам буфер вектора. Как нетрудно догадаться, для вектора размерности вызовов будет уже .
В-пятых, передать такой вектор в свою функцию можно только по указателю на структуру, поэтому синтаксис обращения к нему в функции будет слегка другим ( -> вместо . и всё такое прочее).

Таким образом, вырисовывается задача создания вектора, специализируемого для любых типов данных Си и обладающего следующими возможностями:

  1. Доступ к элементам вектора как к элементам обычного массива, вне зависимости от его размерности: vec[k] , vec[i][j] и т.д.
  2. Управление вектором с помощью обычных функций, обладающих типизированными аргументами и возвращаемым значением, в отличие от макросов.
  3. Отсутствие дублирующегося кода благодаря специализации только тех функций, которые принимают и/или возвращают значения пользовательского типа.
  4. Отсутствие у пользователя прямого доступа к технической информации вектора.
  5. Совместимость между векторами разных типов на уровне присваивания одного другому.
  6. Возможность пользователю при специализации вектора указать способ передачи и возврата значений: по значению или по ссылке (через указатель).
  7. Максимальная схожесть интерфейса вектора с таковым у std::vector из C++11.

Dive into C89

Заранее отвечу на вопрос, почему C89, а не хотя бы C99. Во-первых, это даёт поддержку компилятора из Visual Studio (хоть он мне и не нравится). Во-вторых, я сам очень люблю C99, но в данном случае почувствовал, что поставленную задачу можно решить и в более жёстких условиях. Как-никак, публикацию в "ненормальном программировании" надо оправдывать.

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

Однако потом мне на глаза попалась библиотека динамических строк для Си под названием Simple Dynamic Strings, написанная в своё время для Redis. Она использует другой подход: техническая информация о векторе хранится не в структуре вместе с указателем на него, а в виде заголовка прямо перед самим буфером вектора в памяти. Это позволяет оперировать вектором напрямую через типизированный указатель, при этом размещение технической информации всегда достоверно известно.

image

Напомню, что типизированный указатель даёт возможность обращаться к элементам вектора через оператор индексации, как в обычном массиве. А расположение технической информации прямо перед самим вектором лишает пользователя прямого доступа к ней – для этого ему придётся манипулировать указателями. В случае же структуры как указатель на вектор, так и техническая информация являются её полями, доступ к которым одинаков.

Таким образом мы реализовали возможности (1) и (4). Идём дальше.

Так как теперь вектор – это просто типизированный указатель, то мы, казалось бы, уже можем обобщить для разных типов векторов такие функции как, например, функцию освобождения, просто обозначив аргумент "указатель на освобождаемый вектор" как void* . Общеизвестно, что в void* можно неявно преобразовать любой другой указатель, равно как и наоборот.

Однако можем ли мы это проделать для других функций? Как ни странно, но да. У нас нет функций, оперирующих непосредственно с самими хранимыми значениями – их изначально предполагалось специализировать отдельно для каждого типа вектора. По сути мы оперируем лишь местами хранения значений, но не самими значениями. Следовательно, нам достаточно знать только размер одного элемента, который можно хранить в технической информации вектора и заполнять в функции его создания путём передачи соответствующего аргумента. Такой трюк позволяет нам обобщить для разных типов векторов вообще все функции, а специализировать на их основе только те, которые принимают и/или возвращают значения пользовательского типа.

Пункты (2) и (3) реализованы. А так как в Си нет объектов и любое значение может быть переприсвоено другой переменной буквально копированием памяти, то реализован и пункт (5). Продолжаем в том же духе.

По сути, все специализируемые функции оперируют со значениями пользовательского типа одним из двух способов:

  • присвоение указанным элементам вектора переданного значения;
  • возврат значения указанного элемента.

Известно, что значение может передаваться в функцию или возвращаться из неё либо по значению (пардон за каламбур), либо по ссылке. Для примитивных типов предпочтительнее первый вариант, тогда как для сложных структур – второй.
Ссылок а-ля C++ в Си конечно же нет, но их заменят нам указатели.

Устали от текста? вопрос риторический.
Тогда приведу для наглядности определения вариантов одних и тех же функций, принимающих/возвращающих переменные по значению и по ссылке соответственно.

Видно, что в обоих случаях отличие лишь в одном символе.

Уже в C89 оператор присваивания доступен для всех типов, а не только для примитивных. Это позволяет передачу и возврат по ссылке или по значению в специализируемых функциях указывать аргументами макроса-специализатора. Правда возникает резонный вопрос: а почему не указывать это одним аргументом сразу для передачи и возврата одновременно? А очень просто: возврат по значению удобнее и быстрее в случае примитивных типов, но значение может быть не определено в случае отсутствия в векторе запрошенного элемента. При возврате по ссылке в таком случае мы можем просто вернуть NULL . Короче говоря, это оставлено на усмотрение самого программиста.

В итоге реализован пункт (6). Пункт (7) можно также считать реализованным по совокупности всех предыдущих.

Заключение

Итоговая реализация библиотеки вектора на C89, готовая к практическому применению, находится здесь:

Простейший пример использования приведён в ReadMe.

Конечно, статья не освещает некоторые другие, менее сложные но не менее интересные аспекты реализации, на описание которых у меня не хватило лаконичности и красноречия. Также опущены разглагольствования по поводу решений, оказавшихся в итоге неудачными, и их переосмысления. Но я уверен, что ответы по первому можно получить из кода и ReadMe в репозитории, а по второму – из истории коммитов.

Это первая моя статья на Хабре, поэтому прошу судить как можно строже. За косноязычие – особенно.

Кто создал vector

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

Вектор относительно новое математическое понятие. Сам термин «вектор» впервые появился в 1845 году у ирландского математика и астронома Уильяма Гамильтона (1805 – 1865) в работах по построению числовых систем, обобщающих комплексные числа. Гамильтону принадлежат и термин «скаляр», «скалярное произведение», «векторное произведение». Почти одновременно с ним исследования в том же направлении, но с другой точки зрения вёл немецкий математик Герман Грассман (1809 – 1877). Англичанин Уильям Клиффорд (1845 – 1879) сумел объединить два подхода в рамках общей теории, включающий в себя и обычное векторное исчисление. А окончательный вид оно приняло в трудах американского физика и математика Джозайи Уилларда Гиббса (1839 – 1903), который в 1901 году опубликовал обширный учебник по векторному анализу.

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

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

Вакцина «ЭпиВакКорона» прославила «Вектор»: История и достижения научного центра

ФБУН «Государственный научный центр вирусологии и биотехнологии «Вектор» – это один из самых крупных научных и вирусологических и биотехнологических центров в стране. Его базовое назначение заключается в том, чтобы обеспечивать научное и практическое противодействие глобальным инфекционным угрозам. Центр стал особо известен благодаря созданию второй в стране вакцины от ковида «ЭпиВакКорона».

Также в центр «Вектор» включается бердский филиал – Институт медицинской биотехнологии.

XX век

Всесоюзный научно-исследовательский институт молекулярной биологии был основан около 45 лет назад, в 1974 году в р.п. Кольцово.

На базе института спустя примерно 10 лет, в 1985 году, создали НПО «Вектор-м», которым руководил Лев Степанович Сандахчиев (1937-2006). Журналист из США Дэвид Хоффман, который ранее руководил столичным бюро издания Washington Post, утверждал, что основной целью объединения было создание наступательного биологического оружия. Это было бы нарушением международной конвенции о запрещении биологического и токсинного оружия (была открыта для подписания в 1972 году, вступила в силу в 1975 году), которую также подписал СССР.

Возведение лабораторных корпусов и подготовка к функционированию НПО начались в середине 70-х годов, за длительное время до официального объявления об открытии. Л.С. Сандахчиев рассказывал, что центр к созданию биологического оружия никакого отношения не имеет. Но в 1999 году глава управления по биологической защите Министерства обороны РФ В. Евстигнеев сказал, что предположение американского журналиста было верным, уточнив, что на заре своей деятельности объединение занималось созданием средств защиты от патогенной начинки биологического вооружения возможного противника, но в конце 80-х годов НПО стало рассматриваться в качестве «промышленной базы для производства наступательных биологических препаратов».

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

Труды, которые имели отношение к военному использованию вирусов, свернули в 1992 году, вскоре после распада СССР.

В 1994 году организации присвоили статус государственного научного центра РФ. 3 года спустя, на базе «Вектора» создали один из двух на планете взаимодействующих центров ВОЗ по диагностике ортопоксвирусных инфекций и музея штаммов и ДНК вируса оспы.

«Авария» в 1988 году

В центре прекрасно помнят трагедию, произошедшую в апреле 1988 года. Начальник лаборатории по работе с вирусом Марбург Николай Устинов (1943-1988), изучая очень опасную инфекцию, поранился иголкой от шприца и умер в тяжёлых муках в возрасте 44 лет. Он успел достигнуть результатов в изучении опаснейшей заразы.

Коллега вирусолога Александр Чепурнов рассказывал журналистам, что в день инцидента он и его лаборант проводили сложнейшую процедуру: делали забор крови у морской свинки, заражённой вирусом Марбург. Предположительно проявив неосторожность, лаборант проткнул животное насквозь иглой от шприца, и та же игла прошла сквозь 2 слоя защитных резиновых перчаток и оцарапала Устинову руку. Тогда была только одна защита от инфекций в лаборатории – костюм «Антибелок-5». Это был стандартный «инфекционный скафандр» с окошком, однако у него было уязвимое место – эластичные резиновые перчатки, для которых не было альтернативного варианта. В связи с «аварией» (таким образом в центре называются лабораторные случаи инфицирования) вирусолог был помещён в изолятор, который располагался в центре, где вскоре скончался, пытаясь одновременно записывать в дневник данные о том, что ощущает человек, погибающий от Марбурга.

Добавим, что Устинов начал здесь работать в 1983 году, когда создавалась лаборатория, и шёл набор молодых учёных для прорывной борьбы с опасными вирусами. Он был протеже «томской плеяды» (куда входили Ю.Н. Рассадкин и Н.Б. Чёрный). Учёные стали одними из первых исследователей по вирусам Марбург и Эбола. На сегодняшний день труды этой тройки – фундамент для исследования опасных вирусов, именно эти специалисты сделали первые шаги в изучении этих вирусов, пишет КП-Новосибирск.

С 1982 по 2005 годы руководил центром Л.С. Сандахчиев.

XXI век

Одну-единственную в стране лабораторию, которая занимается вирусами Эболы и Марбурга ликвидировали в 2004 году, также уволили её начальника Александра Чепурнова. В то же время к юбилею организации (тогда центру исполнилось 30 лет) подготовили документальный фильм.

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

В 2009 году ВОЗ объявила пандемию гриппа H5N1, учреждение назначили как один из центров, которые несут ответственность за противостояние пандемии в РФ.

К 2014 году к функционалу центра относили создание методов профилактики, диагностики и лечения инфекционных заболеваний, создание средств противодействия инфекционным патогенам.

Уже немалое количество лет в учреждении функционируют Этический (открыт в 2000 году) и Биоэтический комитеты, их базовая задача направление на проведение экспертиз международных и отечественных биомедицинских научных исследований, чтобы защищать права граждан, которые добровольно участвуют в данных исследованиях.

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

Учреждение гордится своим персоналом с высокой квалификацией и лабораторно-экспериментальной базой. В штате работает 1 614 человек, в частности свыше ста докторов и кандидатов наук. Исследования организации существенно влияют на научную политику в стране в сфере контроля за инфекционными болезнями, сообщается на сайте учреждения, где можно узнать дополнительные подробности.

После ухода с поста руководителя Л.С. Сандахчиева в организации несколько раз менялось руководство (И.Г Дроздов, Е.А. Ставский, А.Н Сергеев, В.Н. Михеев). С 2016 года гендиректором учреждения является Р.А. Максютов (родился в 1982 году).

Другие инциденты

В 1990 году младший научный сотрудник центра Сергей Визунов заразился вирусом Марбург. Тогда он оказался спустя несколько недель почти при смерти с очень высокой температурой. На короткое время помогла процедура плазмофереза, потом её нужно было повторить ещё раз. Когда казалось, что Визунов поправляется, и его можно выписывать, его внезапно накрыла вторая волна заболевания. Таким образом, он пробыл в стационаре около шести месяцев, сообщает издание «Московский комсомолец».

Весной 2004 года лаборант Антонина Преснякова из-за несчастного случая инфицировалась вирусом Эбола. Ей пытались оказать медицинскую помощь эксперты, однако она умерла в возрасте 46 лет спустя две недели после заражения. В день инцидента ей как высококвалифицированному профессионалу доверили отбор крови из сердца морской свинки. Она взяла в руки шприц, который пытались использовать для совершения этой процедуры, но потом Преснякова выяснила, что игла затромбирована, и поместила шприц в ёмкость с хлорамином. С помощью нового шприца она осуществила эту манипуляцию по забору крови, и передала её в работу. После этого начала убираться на рабочем месте, убрав животных и замочив в хлорамине этот новый шприц, которым она успешно осуществила процедуру. Она планировала закрыть защитным колпачком тот самый затромбированный шприц. Преснякова извлекла его из хлорамина, начала вдевать иглу, но сделала промашку и уколола руку. Антонину Преснякову пришлось поместить в изолятор.

Возлагались большие надежды на плазмоферез, однако это не помогло, как и ввод иммуноглобулина. Врачи-специалисты всеми силами пытались спасти женщину, в частности общались с медиком из Африки, который имел опыт работы с пациентами с вирусом Эбола. Было сделано всё возможное, были применены все рекомендации специалиста, однако это не помогало. После первой недели болезни Пресняковой стало лучше, но для этого заболевания как раз характерно временное облегчение, спустя ещё несколько дней она скончалась.

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

Коронавирус. Создание «ЭпиВакКороны»

К концу января минувшего года в центре создали, а к середине февраля зарегистрировали тест-систему на выявление РНК коронавируса COVID-19 с помощью метода ПЦР. Спустя примерно месяц в учреждении начали тестировать вакцину от данного вируса на животных.

Первые две фазы клинических исследований показали, что иммунологическая эффективность препарата составляет 100%.

Стоит добавить, что препарат ещё не прошёл III фазу клинических испытаний. Её целью является получение дополнительных сведений о безопасности и эффективности препарата, в частности протективной эффективности, сообщается на официальном сайте Роспотребнадзора, где также можно узнать детали о «ЭпиВакКороне» по состоянию на 2 февраля 2021 года.

Пострегистрационные исследования вакцины начались в конце прошлого года, они продолжатся 6 месяцев после вакцинации последнего участника, четверть (750 из трёх тысяч) добровольцев получит плацебо.

Таким образом, в ноябре минувшего года начались клинические испытания в восьми медцентрах пяти субъектов страны на трёх тысячах участниках, а также на ста участниках в возрасте 14-17 лет и 150 добровольцах старше 60 лет.

В декабре прошедшего года вакцину выпустили в гражданский оборот. С нынешнего месяца, с февраля текущего года, планируется широкомасштабный выпуск препарата.

Также отметим, что в ноябре прошлого года в «Векторе» рассказали, что идёт работа над разработкой ещё трёх вакцин против ковида, кроме «ЭпиВакКороны».

Ранее Царьград писал, что премьер-министром РФ Михаилом Мишустиным было подписано постановление о выделении «Вектору» почти 2,09 млрд рублей для производства «ЭпиВакКороны». Как отмечается в документе, этих средств хватит на производство и доставку в регионы страны примерно 2,15 миллионов доз вакцины. Контроль за эффективным использованием средств будет осуществлять Роспотребнадзор. Отмечалось, что в Новосибирской области многие хотят привиться именно вакциной «Вектора», но пока не могут по причине ее отсутствия в медучреждениях.

Также напомним, что до этого вирусолог Алексей Аграновский сравнил две российские вакцины от ковида. «ЭпиВакКорона» является более безопасной, чем «Спутник V» от Центра им. Гамалеи. Как пояснил эксперт, для однокомпонентного препарата «ЭпиВакКорона» не важна иммунная история пациента. Дело в том, что данная вакцина содержит лишь фрагмент вируса.

Читайте также: