понедельник, 26 ноября 2007 г.

Приключения. Или как перенести Vista на другой раздел

Сидел я, значит, никого не трогал и тут - бац! Windows Server 2008 RC0 вежливо сообщает мне, что мой 160 Гб диск помирать собирается... А ведь на нем - система! А ведь на нем - все мои проекты!! Вообщем - жуть :(
Пришлось срочно решать проблему - как запихнуть 160 гигов в 20 (именно столько у меня было свободно на втором винчестере). К счастью - на работе обнаружился свободный (новенький!) 250 гиговый винчестер...

Ну да это всё присказка. А сказка - дальше.

Итак, имеем проблему: на диске С: (второй раздел) стоит Windows Server 2008 RC0 (почти Vista :) ). На первом разделе - загрузчик. Необходимо перетащить систему на третий диск (40 Гигов, чистый).

Этап №1. Перенос системы на другой диск.

Я - существо ленивое :) Кроме того - в момент совершения данных действий физически я аходился на работе и управлял системой удаленно - через удаленный рабочий стол. Поэтому естественным для меня выбором было попробовать использовать стандартные средства новой ОС.
Первое - необходимо установить Windows Server Backup. Делается это в оснастке Server Manager в разделе Features.
Второе - собственно сам процесс бекапа описывать я думаю не имеет смысла - там три кнопки, кому надо - разберетесь (кому лень - всегда можно сделать копию из под другой ОС).
Третье - восстанавливаем бекап на другой диск. Здесь вы наверняка столкнетесь со следующей проблемой: нельзя восстановить бекап раздела, если раздел, на который мы восстанавливаем бекап, имеет другой размер. В этом случае можно произвести восстановление по файлам.

Примечание: самое удивительное, что после восстановления бекапа мало того, что все права на файлы сохранились (что логично), но сохранились так же и сжатие у файлов, и папки-ссылки на другие папки. Причем ссылки даже работали! Чудеса :)

Этап 2. Учим Vista загружаться с нового диска.

На этом этапе я потерял примерно 3 часа времени. Очень хотелось поотрывать руки разработчикам :)

Первое - записываем загрузчик на новый диск. Поиск в интернете говорит, что можно это сделать командой "Bootsect.exe /NT60 All". Упс! Нет такого файла на системном разделе. Еще немного поисков... Ага! Этот файл доступен, если загрузиться с CD-диска в режиме восстановления. Вставляем диск, грузимся, вызываем консоль, отдаем команду. Перегружаемся.

Упс... Не загружается.

Итак. Как мы все знаем, в Windows XP управление загрузками ОС с разных разделов осуществляется через файл boot.ini. В новой ОС - новый способ описания откуда грузить операционку. Вся информация теперь хранится в папке Boot куда и обращается наш загрузчик.
Главная проблема, с которой я столкнулся в том - что теперь используются не номера дисков/разделов, а уникальные идентифигаторы (GUID'ы). Естественно, что идентификатор нового диска я не знаю.
Вот тут и началось огромное количество приключений в попытках прописать правильную информацию :(
Краткий итог - все без исключения существующие на данный момент утилиты работают только с системным разделом, с которого была произведена загрузка. Естественно, что поправить я ничего не мог, потому что не мог загрузиться с нужного раздела. Получился этакий замкнутый круг.
Очередные поиски в интернете - ага! Необходимо загрузиться с CD-диска и в режиме восстановления и выбрать опцию "Исправление загрузочной информации".
Вставляю диск с сервером 2008 и... Щаз! Нет такого раздела!!
Потратив нное количество времени нахожу диск с Vista и загружаюсь с него. Ага! Есть! Жмем ссылку. Перегружаемся.

Этап 3. Учим ОС запускаться с нужного диска.

Грузимся. Логинимся. Ждем... И ждем... И ждем...
И тут понимаем - что-то не то :)
Итак: диск, с которого я загружался у меня был подмонтирован под буквой U:. Система же хотела загружаться с диска С: (который уже был физически отключен к тому времени).
Вспоминаю бурную молодость, и то, как поднимал еще Windows 2000 в аналогичной ситуации :) (Правда в тот раз я не мог залогиниться в систему - пришлось ее ломать через удаленный реестр).
Проверяем: есть возможность вызвать Диспетчер Задач (если вдруг не получается - загружаемся в безопасном режиме).
Запускаем Regedit. HKLM\System\MountedDevices.
Ага! Вот они. Меняем названия разделов \DosDevices\U: на \DosDevices\C: Перегружаемся.


Собственно, на этом и все... Система живет уже больше недели. Проблем не обнаружено.

P.S.: а винт, несмотря на бэд-блоки, всё ещё жив...

Интересный блог

Совершенно случайно обнаружил очень неплохой блог про VS2008 и C#.
Собственно, я искал как сделать красивые полупрозрачные окна в Висте. Воспользовавшись рекомендациями из вот этого поста в блоге сделал тестовый проект.

P.S.: А получилось ли у меня что-нибудь я узнаю только вечером, т.к. в пределах досягаемости висты нет :(

четверг, 25 октября 2007 г.

Немного о малоиспользуемых операторах С#

Вот тут можно почитать о некоторых конструкциях шарпа, которые редко используются.
В частности, для меня оказалось неожиданным то, что можно объявить generic-класс вот таким образом:


public class AbstractFactory where Products: IBuilder, new()
{
    ....
}


Обратите внимание - в данном случае new() означает, что класс Products должен иметь конструктор без параметров! Каюсь - даже и не знал, что так можно...

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

Немного о семантике

Обновился проект LinqToRdf до версии 0.3.

Кто не знает что такое Linq - вам сюда. Кто не знает что такое RDF - вам сюда.

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

P.S.: а никто не знает, где можно найти частоты встречаемости русских/английских слов (причем с учетом частей речи для английских слов, т.к. одно и то же слово там может быть, например, и наречием и существительным) в текстах различной тематики? Есть идея сделать ранжирование вариантов перевода по этой статистике... Причем сам алгоритм явно будет очень маленьким - только ему надо много-много данных :(

Update: Стоит еще обратить внимание на проект Introducing SyncLINQ. Позволяет делать data binding на LINQ-запросах.

про С++

Один товарищ написал объемистый документ с ответами на часто задаваемые вопросы про С++. Этакое собрание граблей :)
Почитать можно тут. На английском.

P.S.: а те грабли, на которые я наступил в своё время там тоже есть ;)