MCP

среда, 23 февраля 2011 г.

Впечатления от Microsoft QA Days

Данный пост был написан вчера в поезде, по дороге с QA days, из изменений только проставленные ссылки и форматирование.


Сегодня я посетил мероприятие, проводимое Careerlab и Microsoft под названием Microsoft Quality Assurance Days, проходившее в офисе Microsoft в Крылатском.

Место проведения, конечно, выбрано "шикарное". Построить бизнес-центр в жопе мира далеко от центра и метро, а чтобы было не совсем плохо — пустить бесплатные маршрутки — это весьма сильно. Добираться от вокзала до места проведения час с лишним (хотя для москвичей, наверное это нормально, но для меня это жуть). Я как-то не привык к таким дальним странствиям, поэтому не расчитал, взяв обратный билет так, что остался без фуршета, да ещё чуть не опоздал на поезд. Добирался до своего вагона уже через весь поезд, ибо успел добежать только до первого вагона. Зато поучавствовал в записи подкаста ПолДевятого (если его удастся восстановить после фейла с программой ). Запись прошла отлично, даже сумел вставить пару "веских" слов, надеюсь, что не очень глупых.

При всём этом, это было единственное ИТ-мероприятие без интернета (из тех, на которых я был). Как мне объяснили, всё ушло на онлайн-трансляцию. В результате целый день внезапной отлучки от паутины вызывал аццкую ломку (я то надеялся вести логи и уточнять информацию прямо на месте).

Ладно, заканчиваю лирику и перехожу к самому мероприятию. Началось всё с приглашённого евангелиста Брайана Келлера. Он рассказал как всё круто с TFS и Visual Studio, какие удобные все инструменты для тестирования. И я ему верю! Правда, чтобы ощутить всё это великолепие в полном объёме, нужно несколько мега-админов, чтобы настроить TFS, Hyper-V, и всю остальную инфраструктуру. Также нужна достаточно мощная техника, но результат будет просто  замечательный. Куча информации, автоматическое и полуавтоматическое тестирование, возможность сохранения состояния, запись всех шагов — в общем сказка. Лишь бы всё это работало не только в презентациях.
Далее, Брайан рассказал про исследовательское и формальное тестирование, когда задача тестера состоит в том, чтобы оценить систему с точки зрения определённого типа пользователя и попробовать всё оригинально сломать. Впрочем, с моей точки зрения, для этого очень хорошо  подходят программисты, которых сорвали с другого проекта и дали потестировать чужой код. Тут уж вредность проявляется в полном объёме, ибо эти гады (программеры), имеют очень хорошее представление, куда ткнуть, чтобы всё сломать.  Правда не надо их этим часто загружать, иначе они расстроятся, и будут всё делать как неважный тестер, особо не думая и не разбираясь в системе.

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

Следующий доклад был ужасен и абсолютно ни про что, пропустим его

Последним был мастер-класс от Дмитрия Андреева где он рассказал про средства для отладки и улучшения качества кода, существующие в студии. К сожалению, он плохо знает решарпер, что привело к тому, что Дмитрий не осветил целый пласт возможностей по улучшению кода, без использования сторонних утилит. Ну и некоторые моменты, вроде политики редких могучих чекинов мне показались странными. Зато рассказал про интересные вещи как Pex и Moles, позволяющие упростить написание юнит-тестов (Pex — генерилка юнит-тестов, Moles — фреймворк для подмены методов, любых, включая системные, чтобы делать заглушки без изменения основного кода).

Далее, у меня было обсуждение новинок в мире Windows Phone 7 и запись подкаста, о котором я упоминал в начале, а основная масса участников зависла на сессии вопросов и ответов, даже не спешила к фуршету

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

воскресенье, 6 февраля 2011 г.

OpenXML и цифровая подпись

Тут некоторое время помучался пытаясь подписать OpenXML, хочу поделиться тем, что у меня вышло с этим неприятным форматом.

Начну издалека сбоку, про то, что явно подразумевается во всех статьях но словами леняться проговорить. Итак, OpenXML это документы формата Open Packaging. Это такой стандартизованный zip-файл, в котором в основном должны храниться XML'ки, но можно и любую другую фигню. Поэтому этот формат в принципе можно использовать для передачи апдейтов вашей программы, или хранения набора патчей, в общем для любых целей хранения стандартизованного пакаджа, который удобно читать и разбирать. Собственно, в .NET за это отвечает класс Package, он всё и умеет.

Разобравшись с общим форматом, переходим к частностям: в этом OPC формате хранятся: .docx, .xlsx, .xps и много других вещей. Соответственно работать в коде с документами вы можете абстрактно, как с пакадаждем содержащим набор частей, или взять специализированного наследника (скачав, например, OpenXML SDK, ну или использовав XpsDocument) и работать уже более детально.

А теперь, собственно о цифровой подписи и проблемах. Делается всё это на уровне Package, т.е. если мы хотим подписать вордовый документ, нам на самом деле это не принципиально, мы берём класс PackageDigitalSignatureManager, гоговорим какие секции надо подписать и подписываем.
Но вот тут и начинаются проблемы:

  • В 2007-ом офисе по умолчанию подпись будет показываться ошибочной, нужно шаманить с параметрами
  • В 2010-ом подпись по умолчанию будет показываться partial, т.е. офис будет считать что вы подписали лишь некоторые части, а не весь документ, и нервничать (кстати, вы можете подписать только стили, позволив беспрепятственно изменять текст (не через Word), и таким образом подделывать документы, если пользователь не будет настаивать на том что подпись partial).
  • В .NET реализации явно подразумевается (в смысле кодом), что сертификат для цифровой подписи может быть только RSA, да ещё будут проблемы с токенами, ибо вместо использования стандартной инфраструктуры PKI для подписи (что делает, например, сам Word), тут пытаются взять насильно приватный ключ (это плохо! а местами запрещено), кастуют его к RSA (сразу выкидываем все другие алгоритмы, например наш ГОСТ) и подписывют.
В общем, хоть на бумаге всё и гладко — 15 строчек кода, на практике эо всё превращается в весьма опасную неюзабельную штуку, которая непонятно когда и где может выстрелить, поломав всё и вся. А всё из-за криворукости индусов, которые изначально не могли всё сделать грамотно, в результате теперь сделать грамотно невозможно никому.

понедельник, 3 января 2011 г.

Миграция системы с одного компьютера на другой

Хочу рассказать про способ смигрировать операционную систему с одного компьютера на другой, с сохранением всех данных. По факту, это копирование данных с одного винчестера на другой, с использованием стандартных средств. Способ подходит для Windows 7 (возможно для Vista).
Его плюсы:

  • При некоторых условиях — малое время простоя компьютера
  • Возможно использовать на опечатанных компьютерах, когда просто нельзя заменить винчестер
  • Возможность восстановить данные на определённую дату (при соответствующих условиях)
  • Возможно мигрировать по сети
Ну и соответственно минусы:
  • Нужен отдельный внешний винчестер или отдельный компьютер, доступный по сети с достаточным объёмом свободного места на его винчестере
  • Новый компьютер должен иметь по крайней мере такой же винчестер как и на старом (или больше
Ну а теперь, собственно, сам метод. В двух словах он заключается в том, что необходимо проделать стандартную архивацию данных Windows на внешний винчестер или внешнюю сетевую папку и восстановление этих данных на новом компьютере. Дальше буду рассматривать самый интересный вариант, с бэкапом по сети (удобно для организаций, где все компьютеры подключены в сеть, и достаточно физического места).
  1. Запускаем архивацию Windows
  2. Выбираем какую-нибудь сетевую папку, куда будем складывать образ (создаём её на подходящем компьютере)
  3. Убираем все галочки с файлов, но ставим галочку "сделать образ восстановления системы"
  4. Свободного места во внешней папке должно быть по количеству даннных на диске (будет создан виртуальный диск (vhd-файл) с виртуальным размером всего винчестра, а физическим — по размеру реальных данных)
  5. Запускаем, ждём пока завершится, в это время продолжаем работать
  6. Берём свежий компьютер, загружаемся с диска или чудо-флешки
  7. Вместо установки выбираем восстановление системы
  8. Говорим, что хотим восстановиться с образа, и после тщетных попыток его найти, говорим что он расположен в сети. После этого система поднимет сетевой интерфейс (сама, в установочном режиме, она и такое умеет!)
  9. Если настройки сети не раздаются через DHCP то нажимаем Shift+F10, и в консоли набираем:
    netsh interface ip set address name="Local Area Connection" static 192.168.0.100 255.255.255.0 192.168.0.1 1
    Естественно, нужно заменить IP-шники на правильные для вашей сети (тут по порядку — IP-компьютера, маска сети, IP-шлюза). Для русской версии название будет "Подключение по локальной сети", уточнить можно через команду ipconfig
  10. Указываем сетевое размещение папки (если не получится по имени компьютера, можно использовать его IP)
  11. Указываем, если требуется логин с паролем
  12. Выбираем нужный образ (если их несколько) и восстанавливаем
  13. Ждём, перегружаемся и получаем копию старого компьютера на новом
  14. Выключаем старый компьютер, меняем его на новый, продолжаем работать (естественно, все изменения, которые произошли после архивации — потеряются, если они нужны, примите меры для их отдельной архивации)
Вот и всё. Можно работать на старом компьютере, пока не подготовится новый, при желании, компьютер даже можно загрузить с vhd-файла или просто подключить его как отдельный диск, если нужен просто полный архив, но не нужно восстановление). Можно настроить на всех компьютерах архивацию по графику и в случае физической смерти одного из компьютера, восстановить всё на другом.
Какие могт быть проблемы, и что с этим можно сделать:
  • Система отказывается восстанавливаться — убеждаемся что заархивирован винчестер целиком, новый винчестер имеет размер по крайней мере такой же как и старый
  • После восстановления есть неиспользуемое место на винчестере — заходим в управление компьютером и растягиваем разделы на всё доступное место (в упрощённом виде семёрка это позволяет). Можем просто создать дополнительный раздел или воспользоваться специализированными программами для тасования разделов.
  • После восстановления, компьютер улетает в BSOD. Самый тяжёлый случай, обычно связан с тем, что драйвера на старом и новом комьютере сильно отличаются (обычно проблема с контроллером жёстких дисков). Тут можно потанцевать с бубном, попробовать на исходном компьютере удалить все драйвера (оставить стандартные), переключить режим SATA-контроллера в IDE-режим, и только после этого сделать образ.
  • При попытке сделать архив по сети, он падает с ошибкой. — попробуйте сделать архивацию на другой компьютер, попробуйте заменить драйвера сетевой карты, ибо архивируется большой объём данных и могут выплыть проблемы в драйверах (бывали случаи, когда сетевые карты достаточно именитых производителей из-за ошибок в драйверах сжирали всю оперативную память и рушили сервер по недостатку ресурсов).
В общем, на этом всё, способ достаточно прост, я постарался расписать его подробно, уточнить проблемы и подводные камни. Надеюсь, что описание окажется полезным, и вы попробуете стандартные средства для архивации и соответствующей миграции, вместо использования сторонних.

четверг, 2 декабря 2010 г.

Подключение внешнего GPS-приемника к телефону на Android

У меня обновление телефонного парка, теперь есть замечательный Motorola DEFY, когда-нибудь расскажу про него подробнее, а также впечатлениях от Android по сравнению с Windows Mobile. Пока есть ощущение большой сыроватости андроида в плане фич. Если WM телефон выглядит как маленький компьютер со своими достоинствами и недостатками, но это именно продвинутый телефон с возможностью установки программ и отсутствием некоторых вещей.

Об одной такой вещи я и хочу сейчас рассказать, возможно это кому-нибудь поможет, ибо по данной проблеме слишком много ответов вида "нафиг?" и "нельзя" и конкретное решение теряется между ними.

Задача состоит в том, чтобы подключить внешний USB GPS-приёмник к телефону на Android. Для начала небольшая отбивка зачем это нужно (для тех, кто читает мой этот пост не ради конкретной цели подключить ).

  • Внешний приемник имеет свою батарею и не расходует телефонную
  • Внешний может быть постоянно включен, соответственно быть постоянно в курсе спутников (в телефоне норовит всё время отключиться, чтобы поэкономить батарейку)
  • Внешний приёмник имеет лучшее качество приёма, а чтобы было ещё лучше — его можно расположить в зоне лучшего сигнала (может быть полезно в машине). 
Итак, приёмник есть, стандартными средствами его не подключить, ибо в отличие от всех других телефонов и компьютеров, при подключении его к устройству не создаётся виртульный bluetooth COM-порт, к которому могут подключаться программы. Все программы используют системный API работы с GPS, который знать не хочет про внешние устройства.
Но есть оригинальное решение, основанное на том, что для каких-то целей в телефоне есть фунционал Location Mocks, это такие, виртуальные заглушки для определения местоположения. Это полезно для разработчиков, но зачем это конечному пользователю? Впрочем, поскольку данный функционал есть, один хороший человек написал программу, которая использует внешний приемник и изображает из себя заглушку для определения местоположения. Причём программа абсолютно бесплатная и выпущена под GPL.

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

понедельник, 1 ноября 2010 г.

Как сделать загрузочную флешку с Windows, и что ещё с этим можно делать

Тут иногда меня спрашивают, как сделать установить Windows 7 с флешки, сейчас я расскажу про это, и заодно расскажу, что ещё можно с этой флешкой делать.

Для начала с простого, как сделать загрузочную флешку. Делается всё элементарно: Идём на сайт Microsoft, находим ссылку на скачивание Windows 7 USB/DVD Download Tool, устанавливаем, следуем инструкции, получаем загрузочную флешку, теперь мы можем устанавливать свежую операционную систему, причём, опыты показывают это всё идёт весьма шустро, и гораздо тише, нежели с DVD-диска.

Теперь маленькие хитрости.

1. Если тупо заменить все файлы на флешке файлами другой системы, то мы получим загрузочную флешку другой ОС, ибо загрузчик не трогается, а у всего семёрочного семейства операционных систем Microsoft один загрузчик (возможно что и с Vista всё будет хорошо). Т.е. если мы изначально поставили русскую Windows 7 32 бита, а потом хотим поставить английский Hyper-V Server 2008 R2 x64 — то нам просто нужно заменить файлы.

2. Если где-нибудь на флешку положить Far (подходящей разрядности, разумеется), то можно загрузиться с флешки, нажать Shift+F10 в появившемся окне установки, в командной строке найти нужный диск с флешкой и запустить Far. В нём можно вполне сносно работать, ведь мы находимся в Windows PE, который нам достался беслатно вместе с установочным диском. Иногда в таком режиме можно решить некоторые проблемы с загрузкой системы.

3. Вместо Far'а можно использовать программы для восстановления файлов/разделов, некоторые из них вполне неплохо себя чувствуют в данном окружении. Т.е. если что-то случилось с системой, её можно подлечить таким образом, не прибегая к тяжёлой артиллерии специализированных систем (иногда просто их нет под рукой).

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

5. Shift+F10 во время установки системы и Far, могут весьма неплохо скрасить ожидание установки системы. Можно понаблюдать за её поведением.

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

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

понедельник, 27 сентября 2010 г.

Впечатления от Application Developer Days 2010

Недавно в Ярославле завершилась конференция ADD 2010, я на ней выступал в качестве докладчика, а большинство времени просто в качестве слушателя и поедателя пирожков.   Мне из Ярославля в Ярославль было добираться достаточно быстро, в этом для меня был огромнейший плюс, правда пришлось проснуться пораньше, чтобы успеть на регистрацию (жители других городов сейчас должны считать, что я слегка зажрался ).

Собственно, заканчиваю про себя, лучше про впечатления. Конференция была просто отличной, в ней, конечно, не было московского лоска, зато было всё остальное: отличный интернет (спасибо D-Link, отличные пирожки, вода, и что особенно редко на конференциях — свободные розетки. Можно было зарядить ноутбук, одновременно поглощая информацию. При этом даже на крупных конференциях с интернетом обычно лажа, еда по расписанию, вода счастливчикам.

Теперь по докладам, 2/3 которых, я естественно пропустил  (было 3 параллельных трека, и естественно я не мог физически присутствовать на всех, будем ждать видео). Началось всё с доклада Стаса Фомина про Открытые Системы Разработки. Стас впечатлил технической организацией доклада — подставка под клавиатуру, mind map вместо power point, сам доклад при этом был не очень для меня полезен (может потому что у нас уже внедрено большинство из того, о чём говорил Стас?), но рассказано всё было очень хорошо и интересно, поэтому следующий доклад про Сравнения Хранилищ Данных, показался не очень хорош. Первая часть доклада была сплошным глоссарием, хоть полезным, но как-то не очень интересным, поэтому вместо второй части я отправился слушать Андрея Бибичева про Дополненную Реальность. Доклад был больше обзорным, зато было много деталей и полезной информации. Например, я узнал нафига в телефоне гироскоп, акселерометр, цифровой компас, чем они отличаются и почему для полного счастья должно быть всё. Ну, и то, что в обработке изображений в большинстве случаев используются тупые дубовые алгоритмы, зато они работают, и не жрут много ресурсов.

После обеда послушал Дмитрия Завалишина про разработку на Java. Ничего особого, но рассказано интересно. Доклад про GPGPU для .NET показался весьма странным: проект очень интересный, но весь доклад не покидала мысль: зачем всё это нужно?

Ну а после этого начался знатный срач Java vs C#, который быстро превратился в обсуждение vendor lock и является ли корпорацией зла Oracle. То, что если нужна разработка под Windows, то C# рулит, в самом начале заявил Дмитрий Завалишин и никто в общем-то и не спорил.  Доклад про статический анализ кода, позволил мне порадоваться за компанию Custis, что у них есть клёвый инструмент для этого. А в конце был замечательный доклад Алёны про ИИ в играх. Опять же, вроде бы ничего секретного не было рассказано, но было очень интересно и познавательно. Я даже записал видео доклада (спасибо хорошему интернету).

Потом было отличное afterparty (вечеринка в IT-стиле), и следующий день докладов, который начался с доклада Миши про разработку под Windows Phone 7. У Миши был секретный прототип, который он никому не давал пощупать, зато много показывал. Что я могу сказать, технически, разработка под WP7 очень крута. А что будет с политикой Microsoft в этом плане, узнаем позднее. Доклад про Apache Hadoop был омрачён фразой в конце, что он падает и теряет данные. Ну и нафига такое счастье? Подождём, когда будет более стабильный.

После этого Миша рассказал про круть и мощь IE9, ничего особо полезного, но зато очень красивая демонстрация, и интерсно рассказано.

У Ильи Кантора доклад был из двух частей, про защиту от DDOS с помощью специфичного прокси (с тем же успехом можно было сделать вводную про HiLoad) и кросс-доменную авторизацию, которая из себя представляет хороший рабочий хак, который реально нужен только для SEO. Ну и в конце был интересный секретный доклад, о котором я ничего не расскажу, он же секретный

Алёна рассказала про  C++0x, который движется непонятно в какую сторону и получается весьма странно и ужасно. Зато есть фишки из C#, выглядящиие абсолютно чужеродно для С++ Что-то люди как-то не туда движутся.

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

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

В конце была раздача слонов и подарков, а в субботу мастер-классы Ильи Кантора. В общем, всё было круто и замечательно. Первая конференция определённо удалась.

среда, 22 сентября 2010 г.

Pattern & Practices Summit. Результаты

Как я понял, никогда не стоит проводить конференции по понедельникам.
Просто и конференция давно кончилась и все отчитались, а я только вспомнил, что надо бы и мне пару слов вставить.
А всё из-за чего? В час ночи выехал, в час ночи следующих суток вернулся домой. Находясь там было интересно слушать жалобы людей, которым ехать до москвы 1-2 часа, типо это много, и они хотят спать. Ха!
Невыспавшийся рванул на работу, поднимать целину разгребать дела, делать клиентов счастливыми, потом одно, другое, в общем пишу уже когда никому это не нужно. Ну и ладно, для истории пойдёт (по блогу, кстати хорошо потом события восстанавливаются).

 Конференция была небольшой, всего в два трека, и специфика больше для архитекторов, чем для разработчиков. Во всяком случае, больше концептуальных вещей, чем каких-то специфичных. После основных докладов всё разделилось на две разные части: Enterprise Library и Azure (т.е. во всех проявлениях про Enterprise Library/Patterns и в них же про Azure). Побывал и там и там, для себя сделал следующие выводы: Enterprise Library выглядит на словах очень хорошо, но все кто с ней сталкивался отзываются о ней без энтузиазма: "ну есть и есть, а логгинг они и не починили". Соответственно, как я говорил, что это для архитекторов, архитекторы пусть и решают, стоит ли использовать данную библиотеку в проектах или же использовать другие, более удобные и понятные вещи.
Про Azure (это облачная платформа от Microsoft), наоборот было много интересного, правда всё это красиво нивелировалось тем, что никто не мог сказать, когда же это всё будет запущено в России. Зато понял про модель оплаты всего этого дела, и как всё это устроено. Вкратце, там поверх своей хитрой и специфичной технологии ещё натянуты обычные сервисы и NTFS. Их можно использовать, но это будет неоптимально с точки зрения потребления ресурсов, поэтому лучше писать сразу под Azure, но тут возникает вопрос: "А если нужно писать специально под эту технологию, то почему нужно писать именно под эту технологию, а не какую-нибудь другую?". Т.е. Microsoft предоставляет гибкость, масштабирование и всё такое, но вместо обычного SQL у нас SQL Azure который несмотря на название, всё-таки является NoSQL, сервисы и службы тоже весьма специфичные. Так что же мешает вместо всего этого просто взять и делать обычное масштабирование системы с использованием других технологий (пусть тех же облаков, но которые тупо IaaS)? Этого я не знаю. Пока в голову лезут уж очень специфические проекты с непостоянной сезонной нагрузкой.

Я намеренно не рассказываю конкретно про доклады, докладчиков и прочие моменты, потому что и без меня это уже очень хорошо сделано, единственное, что меня смутило, так это банальное отсутствие интернета на мероприятии. После двух докладов выяснилось, что он в принципе есть, и ещё два доклада и случайная встреча потребовались чтобы выяснить, что DHCP-сервер не существует, и нужно вбить очень оригинальные настройки руками. Многие, кстати, плюнули на весь этот квест, но я таки решил пройти его до конца. Так что в этом плане всё было весьма странно. Вторая странность была в парных докладах, т.е. между двумя соседними докладами не было паузы, и получалась весьма некрасивая ситуация, когда новый докладчик уже начал рассказывать, а люди в зале активно перемещаются (кто-то убегает на другой доклад, кто-то наоборот).

А вообще, организовано всё было неплохо, докладчики были интересными, подарки отличными, и если бы я был архитектором, я бы наверно оценил всё ещё лучше 
 
А уже завтра начинается Application Developer Days 2010, где я в пятницу буду выступать с докладом, всё обещает быть очень интересным, а я, надеюсь что оставлю отзыв не через 2 недели после мероприятия.