?

Log in

No account? Create an account

Предыдущий пост | Следующий пост



Интересную статью представил Самат Кудайбергенов на портале warhead.su. Он утверждает, что ни самая сильная армия в мире, ни штат программистов, ни новейшее вооружение не спасут от смерти, если в дело вмешаются математика и невнимательный кодер! Такая вот математическая оплошность в ЗРК Patriot привела к гибели пятой часть всех погибших американцев за всё время войны в Заливе.

Вот как это было...

Вечером 25 февраля 1991 года, уже под самый конец операции «Буря в пустыне», на американскую авиабазу в саудовском Дахране свалился иракский «Скад». Вот, казалось бы, причём здесь округление дробей?

Ракета разнесла казарму 475-го отряда квартирмейстерской службы армии США, ответственного за очистку воды. Взрыв убил 28 человек — это пятая часть всех погибших американцев за всё время войны в Заливе. Ещё около сотни получили ранения.



Последствия от попадания "скада"


«Скад» был обнаружен радаром дежурной батареи зенитного ракетного комплекса Patriot, прикрывавшей Дахран. Ракету засекли… и ничего не сумели сделать. Осталось только наблюдать, как она валится на казарму.

Как выяснилось, вину за смерть 28 человек взял на себя софт зенитного комплекса.


Давай округлим это по-быстрому

Баг в нём был простой, как кирпич. Не баг даже, а математическая фича: разработчики и военные о ней знали, и все на неё плевали, как на чепуховину ничего не значащую.

Внутренний таймер ЗРК Patriot устроен как счетчик количества интервалов времени, прошедшего с момента включения системы. Длина такого интервала — 0,1 секунды. Чтобы перевести количество этих отрезков в секунды, его, понятное дело, нужно разделить на 10. Что для этого предложили разработчики? Естественно, умножить на 0,1.

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

Теперь вторая часть Марлезонского кодирования. Числа-то двоичные.

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

Поэтому бодрые наследники древнего Вавилона из корпорации Raytheon вместо десятичного 0,1 загнали в систему двоичное число 0,00011001100110011001100. Оно немногим меньше требуемых 0,1 — примерно на одну десятимиллионную. Вот на это число радостно и умножили, полагая, что проблема решена.





Кодеры действительно были правы, когда клеили этот «лейкопластырь». При расчёте параметров движения цели система оперирует близкими значениями времени с единой и очень небольшой систематической погрешностью. Поэтому никаких проблем быть не должно. Ситуацию признали нормальной для использования в реальных условиях — и забили. В таком виде комплекс и приняли на вооружение в 1982 году.


Если вчера война

А дальше? Дальше Саддам Хусейн более не смог выносить собственной крутости в одиночку и решил поделиться ею с окружающими, захватив летом 1990 года Кувейт. Саддам пацан был мутный и дерзкий, но не папуас какой, а вполне упакованный. Имелись у него и оперативно-тактические ракеты, самостоятельно модернизированные, а также химическое оружие.

Весь этот арсенал создавал проблему. Потребовалось срочно переделывать батареи Patriot для Ближнего Востока, чтобы те могли перехватывать баллистические цели, идущие со значительной скоростью — 1700 м/с и больше. А это, считай, гиперзвук; и среди аэродинамических целей, под которые первые версии Patriot рассчитывались, такие скорости не встречаются. Им больше самолёты подавай или крылатые ракеты.


Евгений Башин-Разумовский, эксперт по историческим вопросам: "В общей сложности на театре военных действий было развёрнуто 33 батареи Patriot. В том числе 22 батареи со 132 пусковыми установками — в Саудовской Аравии; четыре (из них две американские и две датские с 26 пусковыми установками) — в Турции; а начиная с 19 января, дополнительные силы ПВО были развёрнуты и в Израиле. Всего территорию Израиля прикрывали семь батарей: две израильские, четыре американские и одна датская, с 48 пусковыми установками."





Raytheon начал спешно улучшать систему. И, как оно бывает, доулучшался. Некое кодирующее туловище невыясненного системно-аналитического образования придумало устранить баг с неточным определением 0,1 и написало новую процедуру умножения.

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

Вуаля! В системе завелось ДВА внутренних значения времени, используемых при расчёте РАЗНЫХ параметров. Различие между ними накапливалось тем сильнее, чем больше времени прошло с момента включения.

Теперь погрешности в математике ЗРК уже начали что-то решать, но об этом никто не думал. Потому что штатные проверки комплекса после переделки показывали, что всё ОК. Согласно программе испытаний: «Пункт 1: включили систему. Пункт 2: выставили режимы. Пункт 3: всё работает. Пункт 4: выключили. Переходим к следующему разделу».

Но никто не проводил «endurance test»: проверку на длительное дежурство на одном месте да против скоростных целей. А оно и зачем, если Patriot — это мобильный войсковой ЗРК для прикрытия боевых порядков? На одном месте ему по всем наставлениям стоять не следует, в том числе, в интересах собственной выживаемости.

Первыми за аномалию в работе комплекса зацепились не в США, а в Израиле. Развёртывающиеся боевые порядки страна прикрывать особо не собиралась, а вот собственная территория Израиль интересовала. Ну и по причине обычной национальной запасливости.

У ЗРК Patriot нет своих собственных накопителей для «логов» работы, поэтому комплексам полагались внешние. Но в армии США накопители не любили. Ходило вполне обоснованное мнение, что их софт какая-то очередная вавилонская ключница делала, и накопители периодически вешают всю систему. Поэтому операторы американских ЗРК на Ближнем Востоке их обычно не подключали, а вот в ЦАХАЛе всё сделали по инструкции.


Какой шлемазл это сделал?

Первые иракские «Скады» стартовали в сторону Израиля 18 января 1991 года. Израильские офицеры, однако, нашли время отсмотреть «логи». Уже 11 февраля от них в США прилетел первый «багрепорт»: после нескольких часов непрерывной работы ЗРК наблюдается необъяснимый дрейф параметров при переходе от режима обнаружения к сопровождению цели.

Радар при работе «на сопровождение» смотрит во вполне определенную узкую область пространства, где должна быть цель — так называемую «Range Gate Area», RGA. А ракета «Скада» быстрая, и надо чётко понимать, где она будет на следующем такте работы. Положение RGA определяется опережающим расчётом в зависимости от координат и скорости цели. А эта математика прямо завязана на точный отсчёт времени. А время у нас отсчитывается… ну, вы уже видели, как.





И с каждым часом отсчитывается всё косячнее. Израильтяне увидели, что границы окна, обсчитанные на этом косячном времени, начали ехать. Цель уже не посередине RGA, а ближе к краю, за 8 часов смещение процентов на 20 от центра окна.

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

«Да ну, фигня, — отмахнулись генералы в Штатах. — У системы нормальный аптайм всего несколько часов. Зачем её вообще держать включённой постоянно? Ладно, по мере сил всё пропатчим и заапдейтим».

Надо заметить, что софтину ЗРК Patriot за тот нервный период с осени 1990 года перепатчивали уже аж шесть раз. Причем в пожарном порядке: надо было обучить аппарат противостоять иракским «Скадам» и «Аль-Хусейнам», и какая-то идиотская проблема многочасовой работы никого не волновала. Тем более, что накатывался один такой патч пару часов минимум, и всё это время комплекс должен стоять мёртвым куском железа. Кому это надо прямо во время войны?

Но 16 февраля патч таки написали и начали помаленьку ставить на комплексы. 21 февраля военное начальство, испытав нехорошее предчувствие в области собственных кресел, дополнительно разослало дежурную инструкцию для операторов ЗРК. Она состояла из одной фразы: не держите систему включённой «слишком долго», а то будут проблемы с захватом цели.



Но сколько это — «долго» — до разъяснений не снизошли.

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

… Дежурная батарея «Альфа», принадлежавшая батальону, что прикрывал авиабазу Дахран, на вечер 25 февраля 1991 года имела аптайм больше четырёх суток. За этот период накопленная ошибка составляла уже 0,343 секунды. Для баллистической цели типа «Скада» это означало смещение центра RGA почти на 700 метров относительно реального положения ракеты. И это при габарите самого RGA около 300 метров.

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

Ракета «Скад» своё дело сделала.

А утром 26 февраля на Дахран приехали совершенно ничего не подозревавшие офицеры с накопителями. Они привезли… патч, исправляющий ошибку. Ну, просто по планам командования именно 26 февраля батарея «Альфа» должна была получить обновку. Раньше было никак: все борта на Ближний Восток забиты — всем что-то надо.


Борьба с дятлами

Дахранский «кейс» вошел во многие курсы по проектированию безопасных программных систем, некорректная работа которых может что-то сломать или кого-то убить.





Во-первых, если вы склеили софт слюнями, и он заработал, отдавайте себе в этом отчёт. Умейте видеть пределы прочности ваших заплаток.

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

В-третьих, когда вы что-то исправляете в уже работающей системе, посмотрите на её устройство сверху и подумайте, как ваши действия отразятся на том, что она ДО ВАС делала ВРОДЕ БЫ нормально.

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


Антон Железняк, эксперт по техническим и инженерным вопросам:
"В общей сложности в ходе первой войны в заливе вооруженные силы Ирака запустили 88 ракет «Скад». 12 из них были выпущены по Израилю до развёртывания на его территории ЗРК Patriot, из 76 оставшихся 47 были обстреляны с расходом 158 зенитных ракет. При этом, по данным комиссии конгресса, только 86 ракет были запущены по реальным целям, а 72 — по ложным, либо по обломкам уже подбитых «Скадов», принятых за ракеты. Точное число сбитых «Скадов» оспаривается до сих пор, равно как и критерии подсчёта."

[источники]источники
https://warhead.su/2018/01/21/ne-propatchili-kak-odin-malenkiy-bag-ugrobil-28-amerikantsev


Давайте еще вспомним американскую Операцию "Быстрый и яростный" и операцию "Орлиный коготь". А вот еще Операция "Шпинат" - единственный доказанный факт применения климатического оружия.

Метки:

Subscribe to  masterok

Posts from This Journal by “Оружие” Tag

promo masterok january 2, 12:00 46
Buy for 300 tokens
Вот так выглядит ушедший от нас 2017 год. А вот кстати, начало 2018 года показывает еще больший трафик, чем декабрь 2017: И вот один из дней - рекордсменов за всю историю журнала тоже уже в 2018 году: Красная цифра - это общее количество уникальных посетителей попавших в блог. В…

Comments

george_bigman
Jan. 22nd, 2018 07:21 am (UTC)
"Для отражения атак были применены американские зенитно-ракетные комплексы «Пэтриот», об эффективности применения которых существуют противоречивые утверждения. По израильским данным, в зоны действия «Пэтриотов» попали не более 47 Р-17, по которым было выпущено в общей сложности 158 противоракет. Согласно данным Министерства Обороны Израиля, «Пэтриотам», несмотря на перерасход противоракет (в том числе случай с расходом 28 единиц на цель), удалось перехватить не более 20 % запущенных иракцами ракет. В других источниках данные сильно варьируются (от 9 % по оценкам Контрольной Палаты Администрации США до 36 % в российских источниках, в американских источниках сейчас указываются цифры до 52-80 %, во время войны назывались также цифры до 100 %).
Современные израильские исследования говорят о том, что над Израилем не удалось сбить ни одной ракеты, а сообщения в радио об одной сбитой Р-17 так и не получили подтверждения. Столь различные данные связаны с объективной сложностью оценки результатов стрельб — даже близкие подрывы ЗУР «Пэтриот» не уничтожали боеголовки Р-17, а лишь отклоняли их от курс"

- ну то есть так что б кровь-кишки и обломочки на землю - ВООБЩЕ НИ ОДНОЙ НЕ СБИЛИ. Оно летело дальше, потом падало и взрывалось. Если взорвалось не в казарме - считали что ракета сбита. Что особенно весело, учитывая паспортный разлёт +-полкилометра, и это по нормативам СА, а не непонятно как выучившихся арабов.

"Количество задействованных мобильных ракетных установок «Скад» составило всего 14 штук, ещё 78 установок представляли из себя муляжи, либо списанные ракеты «Луна». Пилоты коалиции заявляли что в ходе войны уничтожили около 100 «Скадов», в реальности же ни одна установка не была поражена, даже ни один муляж не пострадал. Самолётам коалиции удалось разбомбить лишь несколько пустых ракетных шахт."

р-17, она же "скад" это кстати 1958-1961 года разработка, если кто не знает...


Edited at 2018-01-22 07:30 am (UTC)
koldoblin
Jan. 22nd, 2018 02:39 pm (UTC)
Ну испокон веков американское оружие создают не для достижения военных целей, а сугубо экономических, чтоб любимых союзников на бабки развести.
tihiomyt
Jan. 22nd, 2018 07:58 am (UTC)
мало угробил....
lexalexa
Jan. 22nd, 2018 09:49 am (UTC)
Все сложно, очень сложно.

На самом деле сие событие лишь подтвердило имеющиеся многочисленные разведданные о "косяках" ЗРК "Пэтриот", касающихся наведения ракет на маневрирующие цели.

И дало огромный импульс в развитии определенных видов оружия.

Кратко поясню, не выдавая никаких секретов :)

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

В идеале работа ЗРК должна строиться следующим образом - он получает радиолокационные данные по каналам связи от АСУ радиолокационных подразделений, которые не только дают реальное положение цели, но и проводят "экстраполяцию" координат, т.е. определяют, где примерно должна быть цель в будущий момент времени (с небольшим опережением).

ЗРК в это время находится в режиме тишины.
При подходе (планируемом) цели к зоне поражения ЗРК включает свои средства обнаружения и наведения и работает по цели самостоятельно.

Это в идеале. Когда нормально развернуты все средства ПВО.
Часто случается так, что ЗРК должен работать автономно (АВАКС конечно помогает, но взаимодействие, в силу того, что сам Авакс летит с хорошей скоростью и меняет собственные координаты, а следовательно его данные целеуказания это просто шухер), полагаясь на собственные средства обнаружения и АСУ.

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

В ситуации с довольно древним и тупорылым "Скадом" и ЗРК "Патриот" произошло следующее - Ракта "Скад" жидкостная, на долгохранимых топливных элементах, считалась очень надежной и, в отличие от твердотопливной, не требовала периодического контроля за топливной закладкой со всякими коррекциями.

Но время своё берет и некоторые ракеты, как бы это правильнее сказать, летели, совершая периодически что-то типа "рывков". Связано это было с тем, что топливо в некоторых из них частично утратило свои свойства.

Эти рывки представляли из себя практически маневры по скорости.
Они же приводили к срыву наведения по экстраполированным координатам.
Таким образом исправные ракеты (большинство), летящие практически равномерно-прямолинейно, успешно сбивались, а "тарахтелки" прорывались (прилетело ведь не только в казарму, на Израиль тоже прошло энное количество).

Не берусь судить за математику и заложенные алгоритмы, но вот то, что "Патриот" оказался неспособен сбивать скоростные маневренные цели, прекрасно их при этом наблюдая - это факт.
Сие привело к массовому появлению маневрирующих боевых блоков, а в работу наших ЗРК были внесены определенные изменения (на момент 91-го года тот же С-300 был еще весьма "сырым"), которые и сделали их лучшими не только на сегодня, но и, надеюсь, на десятилетия вперед.
suters
Jan. 31st, 2018 01:21 pm (UTC)
В каком месте Скад относится маневренным целям? Я бы еще поспорил и о определении ее как скоростной.
lexalexa
Jan. 31st, 2018 01:29 pm (UTC)
А в каком месте правил хорошего тона написано, что достаточно прочитать пост наискосок во время забега по малой нужде и, выключив процесс "думаю" пафосно-высокомерно задавать вопрос?
Про "маневры" я кажется подробно написал.

Что касается скоростной цели, то ракета таки да, цель скоростная, всю жизнь для ПВО такой была и останется (кроме дозвуковых КР).
Сергей Сергеев
Feb. 1st, 2018 01:30 pm (UTC)
данная ракета может совершать "рывки" только когда работает двигатель, а двигатель работает только начальном этапе полета не более нескольких десятков секунд и дальше летит как лом. вывод ваша теория о "маневрах" во время полета ракеты несколько не коректна
lexalexa
Feb. 1st, 2018 05:06 pm (UTC)
А на каком этапе их пытались сбить?

Это не моя теория. Это данные средств объективного контроля.


Edited at 2018-02-01 05:08 pm (UTC)
fucky_opossum
Jan. 22nd, 2018 09:56 am (UTC)
/Борьба с дятлами/

Наша декабрьская авария с "Фрегатом" здесь вполне уместна.
gvy
Jan. 22nd, 2018 10:17 am (UTC)
Да уж...

// русский программист
koldoblin
Jan. 22nd, 2018 02:30 pm (UTC)
Ну на войну работает весьма своеобразная прослойка программеров - истинные арийцы в пятом поколении с полиграфом и уровнем секретности по самые уши без права выезда из страны и возможности жениться не на точно такой же чистокровной тёлке.
Их профессиональные способности обычно уже дело десятое.
thomas_willow
Jan. 22nd, 2018 11:50 am (UTC)
Командиры конечно молодцы, приказав держать комплексы включенными "не слишком долго". Но исполнители-то что думали? Они хотя-бы задали уточняющий вопрос? Может на самом деле не командиры, а какое-то туловище опять-же командирам дало такую формулировку?
koldoblin
Jan. 22nd, 2018 02:23 pm (UTC)
Подарите им эту штуку для перезапуска системы:


Edited at 2018-01-22 02:24 pm (UTC)
Александр Туркин
Jan. 22nd, 2018 07:14 pm (UTC)
Перевод 0,1 в двоичный код... Они что, использовали низкоуровневый язык программирования? Хотя 70-е годы, наверно да. Тогда это поле непаханное для багов и ошибок. Зато не скучно синусы и косинусы каждый раз считать разложением в ряды в двоичной системе... Хорошо хоть не перфокарты.
de_monk
Jan. 23rd, 2018 09:28 pm (UTC)
А какая разница какой уровень? Если вычислитель фигово умел делить, но неплохо умножал (что в то время обычное дело), то таки старались умножать. А то, что 0,1 не точно записывается в стандартный флоат-32 (да и 64 тоже) тип данных - вещь не особо секретная, поди небось и в википедии написано. А если нет - то в описании формата всё есть. И это тоже зависит не от языка программирования, а от физического железа разве что (и даже от него не зависит на самом деле, ибо стандарт).

А синусы и косинусы проще всего брать из таблиц, и это тоже не зависит от языка.

ваш кэп
gmaximus
Jan. 24th, 2018 06:37 am (UTC)
"The software used had been written in assembly language 20 years ago. When Patriot systems were brought into the Gulf conflict, the software was modified (several times) to cope with the high speed of ballistic missiles, for which the system was not originally designed.
At least one of these software modifications was the introduction of a subroutine for converting clock-time more accurately into floating-point. This calculation was needed in about half a dozen places in the program, but the call to the subroutine was not inserted at every point where it was needed. Hence, with a less accurate truncated time of one radar pulse being subtracted from a more accurate time of another radar pulse, the error no longer cancelled.

In the case of the Dhahran Scud, the clock had run up a time of 100 hours, so the calculated elapsed time was too long by 2^(-20) x 100 hours = 0.3433 seconds, during which time a Scud would be expected to travel more than half a kilometer."

From SIAM News, July 1992, Volume 25, Number 4, page 11
http://www-users.math.umn.edu/~arnold/disasters/Patriot-dharan-skeel-siam.pdf
nepuc
Jan. 24th, 2018 03:42 pm (UTC)
Это просто русские хакеры тренировались.
Влад
Jan. 24th, 2018 04:44 pm (UTC)
бля, я тупо зоебался это читать.
можно было изложить все в десять раз короче, но автор красовался своим "остроумием".
masterok
Jan. 24th, 2018 04:46 pm (UTC)
справедливости ради современная молодежь вообще не хочет читать - вот бы в виде видоса или комикса это изложили, было бы круто, да? :-)
Влад
Jan. 24th, 2018 04:49 pm (UTC)
спросите у молодежи.
wild_east
Jan. 29th, 2018 10:56 pm (UTC)
Нормально написано.
jz828059
Jan. 25th, 2018 11:34 am (UTC)
че сразу туловище то? пинайте отдел тестирования
san_1_san
Jan. 27th, 2018 09:26 am (UTC)
Стесняюсь спросить о свежести нашего ПО...
Никита Халтурин
Feb. 1st, 2018 09:09 pm (UTC)
"Поэтому бодрые наследники древнего Вавилона из корпорации Raytheon вместо десятичного 0,1 загнали в систему двоичное число 0,00011001100110011001100. Оно немногим меньше требуемых 0,1 — примерно на одну десятимиллионную. Вот на это число радостно и умножили, полагая, что проблема решена."
Впечатление такое, что этим объяснением пытаются запутать не знающих людей - машина дробей не знает, поэтому назначают нужное кол-во бит на значащие цифры и считают как с целым числом деленным на нужное число разрядов (если надо с точностью до 0,001 - берут целые начиная с 1 с учетом сдвига на 3 знака после запятой, где 1- будет 0,001, 2- 0,002 и т.д.).
Второй момент - как 0,00011001100110011001100 меньше требуемых 0,1 - тоже решительно не поянятно - разве что если автор пытается сравнить 0,1 и 0,00011001100110011001100, которое вычитает из первого как десятичное. Да и какой смысл брать двоичное число примерно равное 0,1 - берите точно равное 0,1 - это же десятичная дробь а не натуральная, (как 1/3, которую точно в десятичные не перевести).
Словом, по-моему, автор либо не разобрался о чем речь и неправильно пересказал, либо сознательно привел запутанное объяснение похожее на правду.
ellestarrus
Feb. 8th, 2018 06:11 pm (UTC)
>> ашина дробей не знает, поэтому назначают нужное кол-во бит на значащие цифры и считают как с целым числом деленным на нужное число разрядов

Это "Число с фиксированной запятой". А есть ещё "Число с плавающей запятой".

>> Да и какой смысл брать двоичное число примерно равное 0,1 - берите точно равное 0,1 - это же десятичная дробь а не натуральная, (как 1/3, которую точно в десятичные не перевести).

Только мантисса хранится не в десятичной, а в двоичной системе - поэтому как 1/3 не переводится в десятичные без округления, точно также 1/10 не переводится в двоичную без округления.
borisvolhonin
Feb. 2nd, 2018 03:56 pm (UTC)
ЗРК Пэтриот создавался как зенитно ракетный комплекс войсковой потдержки , баллистические цели для него факультативны также как и впрочем для для наших БУКов или С300 в ТТХ указанана дальность поражения не более 20 км и отсутствует показатель вероятности поражения которую ни когда не подтверждали практическими пусками Для поражения баллистических целей нужны другие средства как например американский комплекс Иджис морского базирования с ракетами СМ2 Blok CM3 Возможно таким станет Российский С500 когда пройдет весь комплекс испытаний и доводок














































































для Россииятакой це

Links

Календарь

August 2018
S M T W T F S
   1234
567891011
12131415161718
19202122232425
262728293031 

Метки

Powered by LiveJournal.com