MCP

вторник, 13 ноября 2012 г.

Intel vs AMD

Тут не торопясь присматриваю себе новый компьютер. Не так чтобы убер-машину, но хочется достаточно неплохую, чтобы хватило на некторое время. И смотрю я на процессоры AMD и Intel, т.к. не являюсь фанбоем ни одной из компаний. Во время просмотра сделал некоторые выводы, которыми хочу поделиться:

  • Выбрать процессор от AMD очень легко. Берём AMD FX-8320, т.к. он ничем не отличается от самого быстрого FX-8350, кроме частоты (а разгоняются они очень просто), а стоит дешевле.
  • Intel — выбрать сокет, выбрать i5 или i7, среди кучи похожих процессоров с буквами T, S, K, P или без букв выбрать подходящий. При этом два соседних процессора могут отличаться поддержкой какой-либо технологии (например vPro или VT-d), отличаться частотой на центы или десятки долларов, встроенной видеокартой и всем остальным, что только может прийти в голову.
  • Intel меньше кушают электричества. Значит более холодные и тихие
  • у AMD больше ядер: псевдо 8 против 4х у i5 и 4х с HT у i7
  • Индивидуальное ядро у AMD значительно медленнее чем у Intel
  • Паралелльная обработка на все ядра обычно оказывается быстрее у AMD (при сопоставимой цене процессоров)
  • Много ядер нужно для вычислений (видео, аудио, архивация), одного ядра кроме игр (где актуальнее видеокарта) хватает на работу вообще у любого процессора. 
  • Легко разгоняемый Intel стоит значительно дороже AMD
Вот сижу и думаю, что выбрать...

Update: заказал себе Xeon E3-1230V2 — тоже самое, что Core i7, но дешевле.

вторник, 2 октября 2012 г.

Впечатления от YaC 2012

Посетил вчера конференцию от Яндекса под незамысловатым названием YaC (Yet Another Conference). Перед посещением я слышал много положительных отзывов о ней, вплоть до крупнейшей технологической конференции в России (TechEd нервно курит в сторонке).

В результате ожидания были весьма серьёзными, да и Яндекс, одна из крупнейших IT компаний в России... А в результате всё оказалось не так радужно: может быть я слишком большой зануда, а может избалован конференциями от Microsoft, но впечатления — не фонтан. По уровню докладов, тот же ADD с лёгкостью уделывает YaC, и даже наша локальная Юзер-группа тоже по уровню докладов местами круче (хотя у нас нет больших проекторов и видео-трансляции).

Но обо всём по-порядку:

Организация

Одним словом можно охарактеризовать конференцию так: очереди. Очереди на вход, очереди на регистрацию, очереди за едой. Причём с едой вообще полный швах: 30 минут стоишь в очереди за тарелкой с едой (другие как-то за 5-10 мин ожидания умудряются шведский стол организовать), а потом пытаешься найти место, куда можно эту тарелку пристроить. В ход шли турникеты при входе и пожарные короба, но и этого было недостаточно. Хамоватость официанток приятно напомнила совок. 
Ну и постоянный шмон на входе (я периодически выходил из здания) тоже доставлял много приятных минут. Причём у каждого из охранников требования были разные, и я то доставал телефон из кармана, то проходил так, ну а забитый ноутом и фотоаппаратом рюкзак нужно было открыть, хотя я туда мог бы и пистолет засунуть, всё равно не посмотрели бы. Помню, на какой-то конференции от Microsoft народ бесился от однократного досмотра и наклейки на ноут: "за кого нас тут держат?", а тут было постоянно и более отвратно по отношению.

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

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

Про практически мёртвый WiFi и не очень удобное расписание (лист A4, вместо маленького сложенного листика в беджике) особо зудеть не буду, это мелочи, бывают подобные ляпы у всех.

Доклады

Тут всё было совсем грустно. Я думал что конференция будет техническая, а оказалось гиковская. Часть докладов явно составлял Капитан, а другая состояла из: "мы в Яндексе делаем так...". При этом так — это набор капитанских вещей (упавшие тесты красненькие), а другая часть применима только к Яндексу или чему-то очень похожему.
"Порадовал" доклад про способы организации защиты паролей пользователей. Началось с фразы: "Это продолжение доклада, который я читал на другой конференции" а закончилось длительным и мучительным сравнением 20 алгоритов хеширования. Собственно про саму организацию практически ничего сказано не было.
Приятным исключением был доклад про IPv6. Вроде бы тоже про Яндекс, но зато реально интересная техническая проблема с историей её решения.

Положительные моменты

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

четверг, 16 августа 2012 г.

Никому не нужное очередное мнение про Windows 8

Сразу скажу, что я достаточно лояльно отношусь к Microsoft, даже Vista я воспринимал достаточно спокойно, потому что как разработчик понимал, как там внутри всё перелопачено. А уж семёрку я очень сильно ждал, на бетах и RC она была просто шедевральная (относительно предыдущих). И хотя в ней полного странностей и глюков, она тем не менее весьма и весьма приятная в работе система.

Но хочу выплеснуть свой поток сознания именно про Windows 8. Ситуация такая, что с одной стороны система мне весьма нравится, а с другой стороны хочется оторвать ноги индусам, которые это всё писали (ну не руками же такое можно написать?). И до кучи я понимаю, что рано или поздно, мне придётся переходить на эту систему (разработчик, как никак, нужно следовать трендам, а то будешь динозавром и вымрешь).

Собственно, первая часть в Windows 8 это часть, которую условно можно назвать Windows 7 R2. И если бы была только это часть, то было бы всё просто замечательно! Я много читал про изменения в ядре, про то как люди выкраивали десятки мегабайт, оптимизировали таймеры, делали разные занятные вещи, всё ради того, чтобы система была быстрее и эффективнее. Новый TaskManager, это замечательная вещь, Ribbon в проводнике тоже отлично (нравится вам это или нет, но раньше было всё совсем грустно). Единственное, что в релизе испохабили Aero, при этом в RC он был просто замечательным, так что есть шансы что ещё что-нибудь пропатчат и вернут как было (я в это верю).

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

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

 Знаете, можно жить с родителями, а можно с девушкой. У каждого из подходов свои плюсы и свои минусы. При этом несмотря на то, что у родителей всё знакомо и понятно, убрано и накормлено, в отпуск куда-то лучше ехать с девушкой, потому что у неё сиськи третьего размера вам гораздо интереснее вместе. Но Windows 8 пропагандирует другую идею: вы теперь живёте сразу в двух местах! Холодильник у вас у родителей, а микроволновка у девушки. При этом родители живут в Тутаеве, а девушка в Амстердаме. Но ничего, мы вас мгновенно будем перемещать из одного места в другое, всё для вашего удобства.

И вот это всё бесит. Так сильно, что моменты в виде тупого текста, отсутствия банальных настроек, то, что приложение погоды жрёт 100 мегабайт и тормозит, и прочие косяки, уже не актуальны. Нас загоняют лопатами в светлое будущее, точнее пытаются объяснить нам, что оно светлое, а оно унылое и отвратительное, хотя вам это мало кто скажет, ибо люди привыкают к любой фигне, а эта фигня ещё и плавная и мигает, и все счастливы, и евангилисты Microsoft объясняют как стало хорошо, и что 20 лет мы не о том думали, и о том, что WinRT наше всё, в общем всеобщая любовь, обожание и красивые графики.

вторник, 24 июля 2012 г.

Медали на олимпиаде

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

Но всё ещё хуже. Возьмём, например, плавание. На олимпидах проводятся следующие соревнования:

  • 50 метров вольным стилем
  • 100 метров вольным стилем
  • 200 метров вольным стилем
  • 400 метров вольным стилем
  • 800 метров вольным стилем
  • 1500 метров вольным стилем
  • 100 метров на спине
  • 200 метров на спине
  • 100 метров брассом
  • 200 метров брассом
  • 100 метров баттерфляем
  • 200 метров баттерфляем
  • 200 метров комлексным
  • 400 метров комплексным
  • 10км марафон
У меня получилось 15 различных соревнований. За каждое медаль. По факту, один и тот же человек учавствует сразу в нескольких дисциплинах. Итого, можно получить пачку медалей в одно рыло.

И вот это и непонятно. Совершенно разные усилия по получению медалей, совершенно разные возможности, но все медали в конце кидаются в общую копилку и сравниваются.

понедельник, 23 июля 2012 г.

MVC. А нужны ли Контроллеры?


Мне концепция MVC в принципе, достаточно нравится, но в мелочах сильно раздражает. У нас есть бесправные View, которые по факту про всё знают и активно занимаются навигацей. У нас есть тупые Модели, которые периодически берут на себя заботу о данных, и есть Контроллеры, занимающиеся непонятно чем, только не тем, чем нужно.
MVC позволяет писать гибко, но за эту гибкость приходится расплачиваться жёсткими гайдлайнами или же полной неразберихой. Кто должен готовить данные для View? Контроллер, Модель, внешний слой бизнес-логики? И если внешний слой, то он должен возвращать Модель, или модель должна его использовать для наполнения, или контроллер должен заполнить модель, имеющимися данными?
Модель должна быть ViewModel или настоящая, живая? А может быть просто DTO?

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

Все контроллеры в приложении примерно равны

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

Контроллеры разделены логически, а не функционально

Вот смотрите, есть у нас класс User и какой-нибудь UserManager, который отвечает за создание пользователей, получение данных, редактирование и удаление. Всё просто и логично. Теперь делаем приложение, контроллеры и получаем UserRegistrationController, UserProfileController, UserAdministrationController и использование пользователей в каких-нибудь RoleManagerController, GroupManagerContoller, LoginController и куче других. Можно пытаться сделать один большой контроллер, но получим помойку, т.к. функционал администратора управляющего пользователями сильно отличается от функционала нового, регистрирующегося пользователя. В результате, с одной стороны мы раскидываем работу с пользователями по куче контроллеров, с другой, при попытке их объединить мы получаем жуткую чехарду с функционалом и контекстом.

Контроллеры занимаются самыми разными вещами

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

Вот такая вот подлость с этими контроллерами. А как решать эту проблему — я не знаю. У меня не настолько светлый ум.  Но если хотите моего мнения (а если не хотите, то всё равно напишу): утащить всю логику в некое WebAPI со своей маршрутизацией. Это WebAPI будет заниматься получением и сохранением данных, не трогая контроллеры. А за самими контроллерами оставить простейшую логику по отдаче нужных страничек по урлу, максимально вырезав из них всё остальное. И идти дальше, разбираться с View и Models.

суббота, 14 июля 2012 г.

Кнопка Пуск для Windows 8

Внизу поста есть ссылка на программу, остальное — мои занудные размышления о вечном и всяком отстое.


Я давно говорил, что я ненавижу то, как Microsoft запёхивает Metro UI куда надо и куда не надо, но поскольку Microsoft'у глубоко насрать на моё мнение, придётся жить с этим ужасом ближайшее время. Собственно, почему ужас? Ну вот хотя бы как выглядит свежий тестовый сервер на Server 2012 RC после двух часов с момента установки:


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

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

Если вы не видите эту красную точку, увеличьте в браузере размер страницы.

Вот за это хочется оторвать (если остались) руки дизайнерам Windows 8.

Чтобы хоть как-то с этим жить пришлось нарисовать псевдокнопку, которая представляет собой простейшную программу, которая нажимает на кнопку Win и имеет иконку, похожую на кнопку Пуск. Берём программу, перетаскиваем на таскбар, пинним её и получаем большую кнопку, на которую можно нажимать (только отсуп слева большой относительно семёрки, но тут уж ничего не поделать ).


Если хочется более продвинутой функциональности, то рекомендую ViStart, данная программа практически полностью эмулирует стартовое меню.

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

startButton.exe
startButton.zip

четверг, 12 июля 2012 г.

Ненависти к Hyper-V псто

Утро не предвещало ничего плохого. Приехал маленький сервер и на него нужно было взгромоздить Hyper-V (если быть точнее, то версии 2008 R2). Никаких проблем не ожидалось, всё-таки не первый раз ставлю Hyper-V, а уж винду тем более, но у сервера была маленькая особенность (что для серверов совсем не особенность). В нём радостно урча сидели 4 винчестера по 2Тб каждый.

Итак, немного покопаться в биосе, поднять RAID10, получив 4Тб радости, воткнуть флешку и пойти покурить, пока это всё ставится (а ставится Hyper-V около 10 минут, так что ещё на кофе остаётся время).

И тут возникла первая проблема. После копирования файлов и установки перед самой перезагрузкой, винда вдруг заявила: нехорошие диски у тебя, не буду я с них грузиться. Давай, до свидания! Я всё откатываю. Тут я слегка офигел, но быстро понял, ибо это достаточно известный факт: Windows не умеет грузиться с винчестеров более 2Тб. Или умеет, но при лётной погоде.

Эти грабли удалось побороть достаточно просто: хвала Ктулху, что RAID-контроллер позволил сделать 2 виртуальных массива. Что я и сделал. 50Гб для системы, 3950Гб для данных. Винда бодро установилась, я пошёл её настраивать, включать в SCVMM, ставить апдейты и прочую мишуру, которую обязательно делать с виндой. Когда всё уже было готово, я решил перенести пару тестовых виртуалок и тут меня ожидали вторые грабли: виртуальные диски отказывались создаваться под всякими разными надуманными предлогами. Не буду расписывать как я танцевал с бубном (нижний брейк в сочетании с пасодоблем), но выяснил, что Hyper-V очень не любит винчестеры с размером сектора в 4k. Моя проблема оказалось в том, что RAID решил для такого большого винчестера установить сектор в 1 килобайт (вместо стандартных 512 байт), что было явно не 4Кб, и решению по мнению операционки не поддавалось.

Тут меня посетила гениальная идея: разбить диски на 2 рейда по 2Тб и молиться Ктулху, чтобы в таком конфиге сектор получился в 512 байт (в дальнейшем эта идея оказалась верной). Но тут винда решила устроить маленькую подлость, и обозвать диск 1 диском 2, а диск 2 диском 1, или что более корректно: диск 0 диском 2, а диск 1 диском 1. Вы чего-нибудь поняли? Я тоже не очень разобрался, но в результате система поставилась на первый из двух виртуальных дисков, а очень нужный Recovery-раздел на 100 мегабайт на второй.

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

В общем, переставил ещё раз, сделал диски dynamic и создал spanned-том (аналог JBOD) на 3950Гб из двух псевдовиртуальных. Было очень радостно на душе от того, что такую хитропопую проблему так оригинально решил. Новые виртуалки создавались без проблем и ничего не предвещало беды... Но тут опять появился SCVMM, который начал утверждать, что он не может мигрировать виртуалки, потому что на сервере нет места *удар моей головы ап стену*. Расследование показало, что System Center не понимает dynamic-диски (ха! их ещё 2000 винда понимала), и из-за этого отказывается мигрировать виртуалки. Но что самое интересное, если перевести dynamic диск в basic, обновить информацию в SCVMM, перевести назад в dynamic, то всё замечательно работает. До первого рефреша о системе. Блин.
Каким местом это нужно было писать, я не знаю. Явно не руками, но и насчёт ног я тоже сомневаюсь. Во всяком случае, голова тут не использовалась.

Пришлось, в результате сделать 2 диска и при создании виртуалок помнить о том, что надо как-то следить за местом. Но ситуация выглядит абсолютно глупо.

Пойти что-ли прочитать про Hyper-V 2012, может там всё поправили и не надо так извращаться ради простейшей очевидной задачи.

понедельник, 9 июля 2012 г.

Ленивые рекламщики

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

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

Со временем, всё-таки обленились и появилась реклама "71% женщит считает мыло душистое самым лучшим*". (*опрошено 10 женщин, каждой в подарок дали это мыло). 
Уже проще, но всё равно, надо хотя бы 10 женщин опросить, да ещё на всякий случай получить их согласие в обработке ПД, а то мало ли что.

И рекламщики начали лениться сильнее.

"Дезодорант Тройной от фабрики Новая Звезда, самый лучший дезодорант*" (*по сравнению с другими дезодорантами, производимыми фабрикой Новая Звезда). Бинго! Вообще делать ничего не надо, и не поспорить ведь! "Microsoft Windows — лучшая операционная система (из систем, производимых, компанией Microsoft), Samsung Ace самый быстрый телефон* (*из телефонов Samsung с рекомендованной ценой, идентичной рекомендованной цене Samsung Ace). 

Ленивые скотины. Единственное, что неизменно, так это то, что Carlsberg — пожалуй лучшее пиво в мире, а может быть и полное говно*.
*Данное суждение является оценочным и не претендует на 100%-ую достоверность. Тем не менее, независимые исследования, проведенённые частной, независимой, некоммерческой, незарегистрированной организацей любителей потрындеть вечерком за кружечкой-другой пива в какой-нибудь кафешке, да ещё с вкусной закусью, показали, что органолептические свойства данного пива, по субьективным показателям уступают другим, также весьма распространённым сортам и примерно идентичны пиву "Балтика", которое уже по мнению некоторых других независимых организаций является "мочой", а как известно, несмотря на отдельные успехи лечения и отдельного направления в нетрадиционной медицине (уринотерапия), моча имеет весьма посредственные вкусовые характеристики, таким образом, путём нехитрых умозаключений можно сделать вывод что пиво Carlsberg по своим вкусовым свойствам и консистенции напоминает мочу, и в результате заключить, что весь этот текст написан в одно предложение мелким шрифтом, будет показан в течение трёх секунд, и никто его не успеет прочитать.

вторник, 26 июня 2012 г.

Циклы. Нужны ли они?

Не стоит воспринимать данный текст слишком серьёзно. В нём присутствует некоторая доля бреда

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

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

Преобразование

Типичная задача: взять из списка объектов "Пользователь" только имя и работать с ним дальше. Есть вполне сформировавшиеся абстракции, например map в jQuery или Select в .NET. Согласитесь, что второй пример кода выглядит гораздо понятнее первого, т.к. отсутствует лишний вспомогательный код:

List<string> names = new List<string>(); 
foreach(var user in users) 
    names.Add(user.Name); 

var names = users.Select(x => x.Name);

Фильтрация

Тоже частая задача. Выбрать всех активных пользователей. Тут стандартные схемы filter и Where:
List<User> resUsers = new List<User>(); 
foreach(var user in users) 
    if(user.IsActive) 
        resUsers.Add(user); 

var resUsers = users.Where(x => x.IsActive);

Аггрегация 

Куда же без неё! Например, нам нужно посчитать количество пользователей (да, у нас сейчас нет встроенной функции):
var cnt = 0; 
foreach(var user in users) 
    cnt++; 
А в нормальном стиле (в общем виде) это можно сделать как-то так, через аккумулятор:
var cnt = users.Aggregate((e, acc) => acc + 1);

Обработка

В данном случае результат передаётся куда-то дальше, основной объект никак не трансформируется. Тут нам на помощь приходят each в jQuery и ForEach в .NET. Например, мы хотим вывести имена пользователей на консоль:
//names - List<int> из первого примера 
foreach(var name in names)  
    Console.WriteLine(name);  

names.ForEach(Console.WriteLine);

И всё вместе

И конечно же, циклы используются сразу для всех задач вместе, ещё больше запутывая код и подменяющие реализацию задачи ненужными деталями реализации (которые, действительно, никому никогда не нужны и только мешают дальнейшему чтению кода).
Итак, выбираем имена активных пользователей и находим самое длинное:
List<string> names = new List<string>();  
foreach(var user in users)  
    if(user.IsActive) 
        names.Add(user.Name);  

var maxName = ""; 
foreach(var name in names) 
    if(maxName.Length < name.length)  
        maxName = name; 

//-------------------- 
var maxName = users 
    .Where(x => x.IsActive) 
    .Select(x => x.Name) 
    .Aggregate("", (e, acc) => e.Length > acc.Length ? e : acc);

Согласитесь, второй вариант, гораздо понятнее и короче. Сразу по тексту видно что он делает (и это я ещё не воспользовался готовым методом Max). В первом же случае проще всего догадаться о том, что делает код по названию переменной, но это в данном простом тестовом примере. А в реальной жизни всё гораздо запутаннее, ведь обязательно набегут оптимизаторы и цикл превратится в более короткую и простую версию, которая понятнее (вроде бы), но в результате вся логика прибита гвоздями и её изменение становится уже более сложной задачей, связанной с практически полным переписыванием куска кода:
var maxName = ""; 
foreach(var user in users)  
    if(user.IsActive && user.Name.Length > maxName.Length) 
        maxName = name; 

Результат

Что мы получили: циклы всегда можно заменить на простую комбинацию простых конкретных операций, в результате код будет легче читаться, легче сопровождаться и будет содержать меньше ошибок. Кроме того, мы избавляемся от врождённой болезни циклов — побочных эффектов (что сильно мешает оптимизациям даже на уровне компиляторов). Так что у них остаётся единственное преимущество — производительность. Но и она постепенно нивелируется развитием комплияторов и библиотек, так что может стоит отказаться от циклов прямо сейчас, и не быть слоупоком?


Напоследок

Чтобы не останавливаться на элементарных примерах, я решил привести чуть более сложный. А именно, реализацию сортировки. Классический quicksort из учебника выглядит примерно так (только главная часть):
public void Sort(int start, int end) 
{ 
    if (end <= start) return; 
    if (end - start == 1) 
    { 
        if (_array[end] < _array[start]) Swap(start, end); 
        return; 
    } 
    int el = _array[(start + end)/2]; 
    int endIdx = end; 
    int startIdx = start; 
    while(startIdx <= endIdx) 
    { 
        if (_array[startIdx] < el) startIdx++; 
        else 
            if (_array[endIdx] <= el) 
            { 
                Swap(startIdx, endIdx); 
                endIdx--; 
                startIdx++; 
            } 
            else endIdx--; 
    } 
    Sort(start, endIdx); 
    Sort(endIdx + 1, end); 
}
Данный код, конечно можно подсократить, но это уже тонкости и детали реализации и оптимизации. Тем не менее, даже на такой пример я потратил достаточно времени, пока его реализовал и выловил все замеченные ошибки. И в теперь разобраться как сортирует алгоритм за всеми конструкциями весьма сложно. А теперь посмотрите, что я написал сходу на LINQ:

public IEnumerable<int> Sort(IEnumerable<int> arr) 
{ 
    if (arr.Count() <= 1) return arr; 
    int el = arr.First(); 
    return Sort(arr.Where(x => x < el))
           .Concat(arr.Where(x => x == el))
           .Concat(Sort(arr.Where(x => x > el))); 
}
Всего 5 строчек, и то разбитых для удобства! И смотрите как просто объяснить теперь алгоритм: берём первый попавшийся элемент, берём из массива все элементы меньше него, сортируем их данным же алгоритом, добавляем элементы равные данному, и большие, отсортированные тем же алгоритмом. Всё просто, банально и понятно.
Не хочем quicksort, хотим сортировку выбором? Нет ничего проще:
public IEnumerable<int> Sort(IEnumerable<int> arr) 
{ 
    if (arr.Count() <= 1) return arr; 
    int elMax = arr.Max(); 
    return Sort(arr.Where(x => x < elMax)).Concat(arr.Where(x => x == elMax)); 
}

Видите, вполне чёткая логика и понятность. Так зачем вам ещё циклы?

пятница, 11 мая 2012 г.

Про кредиты

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

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

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

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

Как же меня достали все такие "жертвы", изобращающие из себя невинных овечек. Люди не хотят думать, не хотят шевелиться, лишь строят глазки, лишь бы им что-то сделали по причине того, что самим им просто лень.

пятница, 13 апреля 2012 г.

Про почту на собственном/общедоступном домене

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

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

Так что на сегодня моё мнение про корпоративную почту на бесплатных доменах — работает, и ладно, генеральный директор с адресом upyachka1988@mail.ru — это вполне мило. 

вторник, 27 марта 2012 г.

Проблема в Google Play и как МТС залез на смартфоны Samsung

Сегодня с утра пользователи Samsung обнаружили, что на их телефонах откуда-то взялся апдейт для почты МТС, хотя они её не устанавливали и даже не были в курсе про её существование.

Я исследовал проблему и выяснил, что проблема в Google Play (бывший Android Market), а именно в том, как он проверяет приложения на идентичность. 

Дело в том, что приложения в маркете идентифицируются не по названию приложения, а по названию пакета (package), которое имеет свои характеристики и это название есть "область имён" классов приложения. Изначально это было сделано, чтобы разные приложения не конфликтовали если в них окажется одинаковые классы. Т.е. учитывается полное имя приложения.

Например, возьмём приложение Карты Google, посмотрите какой адрес у него в маркете:
https://play.google.com/store/apps/details?id=com.google.android.apps.maps

Пакет с приложением называется com.google.android.apps.maps, т.е. по стандартному соглашению:
com — common или com от google.com (бывают разные соглашения о именовании)
google — название компании-производителя
android — это приложение для android
apps — это приложение, а не отдельная библиотека
maps — это приложение карты

Ну или как вариант, Facebook:
https://play.google.com/store/apps/details?id=com.facebook.katana
com — common или от facebook.com
facebook — компания-производитель
katana — так называется клиент. Оригинальное название

Я попробовал сделать приложение, которое называется также, как QuickOffice (только специфичный, предустановленный на телефоны от Motorola).
И тут возникла первая проблема у Google: мне удалось загрузить это приложение в Market. Мне разрешили это сделать!

Тут же я увидел шедевральную картину:
Приложение ещё никто не установил, а у него уже есть 54 ошибки, которые прислали пользователи. Т.е. ошибки подхватились от оригинального приложения и я их мог посмотреть. Это проблема в безопасности.

После этого, я открыл с телефона своё приложение и увидел следующую картину (я его ещё не устанавливал):
Мне предлагают открыть приложение или обновить его. При этом, если бы у меня были включены автоматические обновления, я думаю, что оно установилось бы самостоятельно и заменило существующий офис.

Т.е. Android просто по названию перепутал оригинальное приложение и моё. И это несмотря на то, что все приложения подписываются ключом разработчика (естественно я подписал своим, у меня нет доступа к оригинальному).

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

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

(Данный текст уже неактуален, мы можем мелко пакостить, но не сможем обновить приложение)
Как результат, мы можем делать поддельные приложения Facebook (изначально стоит на множестве устройств) или Google Search, Google Maps и любых других. Мы можем назвать их совершенно по-другому и они даже могут делать честные вещи. Например, отсылать SMS на платные номера. Что здесь честного? А мы можем назвать приложение и написать в описании, что мы делаем именно это, а то, что оно заменило другое приложение — случайное совпадение.

Выходит, что приложение для МТС и Samsung делал один разработчик (Эльдар Муртазин подтверждил это) и подписал одним ключом. Приложение называется com.seven.Z7 в обоих случаях. И из-за полного совпадения случился такой факап у пользователей (несмотря на разные названия и иконки в маркете).


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

PS: Своё приложение из маркета я убрал после проверки, надеюсь, никому не успел навредить.

среда, 15 февраля 2012 г.

Про атмосферное давление

У атмосферного давления есть замечательное свойство — оно падает с высотой, что вполне логично. Причём, как утверждает Википедия, на небольших высотах на 1мм рт.ст. каждые 12 метров. Т.е. если взять Ярославль, то в зависимости от места, давление будет на 8-10 мм. рт.ст. ниже, чем давление над уровнем моря. А если подниметесь верхний этаж многоэтажного дома, то еще на 3мм рт.ст. ниже. Весьма интересные цифры вплане того, что люди, страдающие от высокого давления могут слегка облегчить себе жизнь поселившись на верхнем этаже.

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

А теперь догайтесь, какое именно показывают погодные сайты. Т.е. когда вы видите давление 760 мм рт.ст., это давление над уровнем моря или локально, в вашем городе. Подумали? Сейчас будет разгадка.

Для начала возьмём детальные данные с сайта rp5.ru, на данном сайте есть оба варианта давления, и сравним с показателями на остальных. Итак, в настоящий момент для Ярославля: фактическое 746.2, приведённое к уровню моря 755.2. Теперь посмотрим остальные:

Результат: если отбросить пару странных показаний, то большинство сайтов всё-таки показывают локальное давление, но 2 из рассмотренных, всё-таки привели его к уровню моря. А если учесть, что всякие виджеты и информеры очень часто берут данные именно с AccuWeather, то с давлением становится всё ещё веселее, в плане того, что совершенно непонятно, каким числам верить.

Вот такие пирожки с котятами. Я, если честно, даже и не знаю что делать с этим, и какие показания считать более правильными. А что вы думаете?

суббота, 31 декабря 2011 г.

Итоги 2011-ого года

Все подводят итоги года, ну и я решил не отставать и тоже что-нибудь подвести.  Но поскольку мои достижения никому не интересны, больше буду смотреть на ИТ-изменения, произошедшие в этом году, и коснувшиеся меня непосредственно.

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

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

Государственные службы тоже с большим скрипом но понемногу внедряют сервисы. Можно заплатить налоги, или записаться в ГИБДД без всяких звонков и походов ногами. Надеюсь, в будущем году движение продолжится и очень хотелось бы, чтобы оно было гораздо быстрее.

Радует, что множество компаний активно общается в твиттере, и не просто общается, а помогает решить вопросы (отдельные благодарности Мегафону и Связному Банку). Теперь даже думаешь, стоит ли связываться с компанией у которой нет контакта в Твиттере, и не стоит ли вместо неё выбрать другую.

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

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

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

воскресенье, 6 ноября 2011 г.

SVN vs DVCS

Последнее время, появилось множество фанатов, орущих про то, что SVN — сраное говно, а Git/Mercurial — активно рулят. При этом, несмотря на плюсы распределённых систем, у них ещё дофига минусов, которые решаются или костылями, или инструкциями по работе, или надеванием штанов через голову, потому что "это модно".

Покопавшись в интернете, я не нашёл особых статей со сравнением DVCS (распределённых системы управления версиями) и SVN (хотя не сильно-то и искал), так что решил написать свою, чтобы Трухин Юрий посмеялся. 
Собственно, буду сравнивать концепцию DVCS (без сильных завязок на Git или Mercurial) и SVN, как одного из самых ярких представителей централизованных систем (TFS тоже яркий, но это комбайн с кучей бантиков и практически только под Visual Studio)

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

Начнём с плюсов DVCS:
  • У каждого своя пользователя копия репозитория в которой он может делать всё что угодно, до заливки в основной репозиторий
  • Удобные бранчи и теги 
  • Более приличный мёрж (за счёт ченджсетов)
  • Отличная автономность
  • Возможность устраивать сложную систему иерархий в организации проекта
А теперь, про недостатки, про то, что не пишут или что обходится административными мерами:
  • Один репозиторий — один проект. Т.е. распределённые системы удобны для работы над одним проектом, и очень плохо разделять зону ответственности между связанными проектами. Технически, два независимых проекта, это два полностью независимых проекта, с разными репозиториями и отсутствием общей инфраструктуры
  • Подключение к проекту внешних модулей (например, общей между разными проектами, библиотеки). В svn это весьма коряво решается через svn:externals, и в git и в mercurial есть ещё более корявые решения, но в принципе решить задачу можно, хоть и очень коряво.
  • Проблема с хранением больших бинарных файлов (особенно, если они ещё и изменяются периодически). Т.к. у каждого разработчика по копии своего репозитория, то у каждого по копии всех этих файлов (и всей истории), даже если они ему и не нужны. Решение — использовать всяческие расширения или выносить эти файлы из DVCS в другие системы (например, тот же SVN).
  • Невозможность забрать всего-лишь несколько файлов из проекта. Например, менеджерам абсолютно не нужен код, им нужно только ТЗ, макеты и прочая мелочёвка. При этом, уровень грамотности у них в плане работы с VCS значительно ниже. В общем, как результат, проще документацию хранить отдельно, чем обучать менеджеров работе с DVCS.
  • Отсутствие единой сквозной нумерации. Прощай автоверсионирование в билдах и удобная привязка к багтрекеру. Проблема некритичная, но очень "радует" своим удобством.
  • Отсутствие возможности тонкого разграничения прав, например, запретить писать некоторым пользователям в важные конфигурационные файлы, или же заблокировать от изменений часть проекта.
  • Отсутствие возможности блокировки файлов. Фича редкая, но когда нужна, тогда без неё плохо. Можно обойти административными мерами, но их любят нарушать.
  • Практически всегда необходимо выделять центральный репозиторий (хотя бы для автомтатических билдов), как результат, он выполняет роль сервера SVN, т.е. в принципе, всё сводится назад, к централизованной системе с более умными клиентами у разработчиков.
  • Хуки на определённые группы файлов, и вообще слежение за изменениями. Необходимо прилагать дополнительные усилия для слежки, то, что в SVN делается из коробки.
  • Потеря исходников автоматически означает потерю всего репозитория, т.е. включает в себя всю историю, уже удалённые файлы, даты, список пользователей, ветвления. Т.е. ценность данной информации гораздо выше, стоимость потери — тоже. А с учётом пункта об проблемах с разграничением прав, всё становится совсем плохо. А потерять один ноутбук разработчика гораздо проще чем данные с одного сервера, охраняемого злобным цербером администратором. 
И как закономерный результат: отлично DVCS применимы для распределённой разработки (как и следует из их названия) и слабо применимы для локальной группы разработчиков, когда все преимущества распределённости теряются, а недостатки никуда не деваются.

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

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

воскресенье, 18 сентября 2011 г.

Определяем бездействие пользователя в Windows

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

  • Если нужен ответ от пользователя на не очень важный вопрос, можно принять решение самостоятельно или же продолжить заниматься другими вещами, отложив вопрос до появления
  • Если идут вычисления, можно поднять приоритет операции
  • Если идёт демонстрация некой информации, её можно остановить, чтобы зря не переводить ресурсы
  • Если есть подобие мессенжера, можно изменить статус
Итак, как это можо сделать:

GetLastInputInfo

Данная функция возвращает время последнего действия пользователя мышкой или клавиатурой. Т.е. если пользователь ничего не делает с компьютером, наверное его уже и нет за ним (как вариант — он медитирует перед компьютером). Оцениваем необходимое время, которое будет являться символом бездействия, например 10 минут (с помощью GetSystemTime), и делаем своё грязное дело. 

SPI_GETSCREENSAVERRUNNING

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

SC_MONITORPOWER

Это глобальное сообщение, рассылаемое системной или приложением, через WM_SYSCOMMAND, сигнализирующее о том, что монитор включен/спит/выключен. Можно считать более продвинутым вариантом скринсейвера (ну и вручную отключать монитор, но это не тема этого поста).

WTS_SESSION_LOCK/WTS_SESSION_UNLOCK

Данные события помогут нам определить момент блокировки компьютера пользователем. К сожалению, текущее состояние блокировки, таким образом определить не получится, но по умолчанию можно считать, что раз кто-то запустил вашу программу, то система явно не блокирована. Блокировка — это событие явственно свидетельствующее о том, что пользователь убежал от компьютера, правда используется в основном в организациях в целях безопасности, дома мало кто это делает. Но, тем не менее событие очень хорошее, поэтому грех им не воспользоваться.
Для этого регистрируемся на получение события через WTSRegisterSessionNotification и в WndProc (основной функции, обработчике всех событий) ловим сообщение WM_WTSSESSION_CHANGE. Естественно, у нас должно быть некоторое окно, которое будет это обрабатывать. Если приложение не подразумевает наличие окон, можно создать невидимое. 

четверг, 23 июня 2011 г.

Мифы о многозадачности и прожорливости Android до памяти

Данный пост написан по мотивам подкаста Юрия Трухина и Эльдара Муртазина, где они не очень корректно высказались про то, как устроена многозадачность в андроиде, и зачем ему таскменеджеры. Многозадачность в Андроиде такая же, как в готовящемся Mango для WP7, с точностью до деталей реализации и названий в архитектурных решениях.

Некорректное понимание многозадачности в андроиде я встречаю достаточно часто, и думаю, что это вина Google, что они не могут нормально объяснить обычному пользователю, как всё внутри устроено, и что Task Manager'ы в большинстве своём вредны, нежелели полезны.

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

Отчасти это в чём-то правда, но тут есть весьма тонкий момент. Дело в том, что все программы для андроида модульные. Т.е. программа состоит из множества кусочков, которые работают независимо друг от друга (если явно не вызывают другой модуль). Т.е. наличие в памяти программы совершенно не показывает то, что она вся используется в данный момент. Она может вообще не исполнять никакого кода, а в памяти висеть просто потому, что память есть и почему бы не держать приложение в кеше, чтобы последующая активация произошла быстрее. Естественно, когда память будет нужна другим приложениям, самое ненужное (есть система приоритетов) будет выгружено. Т.е. это тоже самое что и концепция захоронения в WP7. Т.е. в данном случае таскменеджеры просто вредны, так как они выгружают приложения, которые потом будут загружаться снова, тратя ресурсы и время.
Само по себе, наличие приложения в памяти не тормозит телефон, освобождать память ради большой цифры free mem — бесполезное занятие, от этого ничего не изменится.

Но всё же, определённая толика правды тут есть, и сейчас расскажу почему.


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

В андроиде все модули в программе делятся на три основных типа:

  • Activity
  • Broadcast Receivers
  • Services

Рассмотрю их подробнее на виртуальном примере музыкального плеера.

Activity

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

Broadcast Receivers

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

Это части программ, отвечающие за приём глобальных сообщений. Их весьма много стандартных, плюс, можно ожидать абсолютно любое сообщение, сказав про это системе  (это бывает полезно для связи между различными программами). Сообщения бывают самые разные, например, сообщение о том, что появилась WiFi-сеть и можно бежать в интернет за новыми песнями, вставили телефон в док-станцию — рисуем красивое окошко с часиками. Нажали кнопку паузы на гарнитуре — остановим воспроизведение. Собственно таким образом можно отправить картинку в твиттер из галереи: твиттер регистрируется на событие вида "могу шарить картинки", галерея посылает событие всем подобным приложениям и пользователь выбирает, что он хочет сделать с картинкой. Благодаря этому и обеспечивается гибкость андроида в установке различных приложений.

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

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

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

Сервисы

Вот мы и подошли к самому главному потребителю ресурсов. Сервисы, эта часть программы, которая должна работать в фоне, и она предназначена ровно для этого и не для чего больше. Это вот те самые маленькие блоки, которые работают при многозадности и в Android, и в iOS, и в WP7 Mango.
Это сервисы синхронизации, обновления, загрузки. Для музыкального плеера играть музыку должен именно сервис! Даже во время звонка, часть программы, отвечающая за разговор — это сервис, который нужен, чтобы разговор шёл, а пользователь мог играть в Angry Birds в это время.
Собственно это и есть основные потребители ресурсов, но таскменеджеры их очень плохо определяют, лучше на них смотреть в стандартных настройках приложений (Running Services).
Но Android может убивать сервисы при нехватке памяти тоже, хоть они и имеют приоритет по времени жизни, что удивительно, он потом их постарается запустить заново, чтобы вернуть всё как было. Самый высокий приоритет у сервисов с иконкой в статусбаре, как это глупо не звучит. Просто эти сервисы своим видом демонстрируют пользователю, что они существуют и работают, и Android их бережёт до последнего. Именно поэтому большинство музыкальных плееров рисуют иконку в статус баре, такой вот архитектурный финт ушами.

Небольшая ремарка про аналог сервисов в Windows Phone 7 (в грядущем релизе Mango), там подобный функционал называется "Background Agents" (т.е. агенты, работающие в фоне)

  • Агенты более специализированные и реализуются под конкретную задачу (т.е. специальный агент по проигрыванию музыки, специальный агент для скачивания файлов)
  • Есть агенты для своих задач, но WP7 ограничивает их 10% CPU и 5Mb памяти, т.е. они не могут сильно повлиять на производительность телефона
  • У агентов есть ограничение на функционал, например, они не могут использовать камеру и сенсоры. Т.е. нельзя будет сделать видеорегистратор и шагомер (GPS-можно).
  • Агенты выводятся в отдельный хост-процесс, но это детали внутренней организации системы
  • Принципиально отсутствует Task Manager, как результат пользователь не может насильно оставить работу агента
В общем, если в WP7 вдаваться в детали, то там реализация выглядит отличающейся, но если смотреть глазами пользователя, то задача будет решаться одна и та же: небольшая часть приложения, которая делает конкретную часть работы.

Заключение

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

среда, 1 июня 2011 г.

Излечивание от глюков ATI/AMD Catalyst Control Center

Если лень читать целиком, решение в конце поста. 

У владельцев видеокарт от ATI/AMD периодически (судя по гуглу) возникают проблемы с запуском Catalyst Control Center. Выражается это в эпичненьком сообщении при запуске CCC (которое ещё и при старте винды лезет):
The Catalyst Control Center is not supported by the driver version of your enabled graphics adapter. Please update your ATI graphics driver, or enable your ATI adapter using the Displays Manager.
Как говорится: Внушаетъ!
Особенно часто это происходит на Windows Server от 2003 до 2008 R2, при этом AMD до сих пор не смогла это починить по-человечески.

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

Для начала о истоках проблемы (на случай, если в лоб решение не поможет, или для использования его в других случаях, например с nvidia):
После установки драйверов, ATI/AMD скидывает видеокарту в слишком низкий уровень аппаратного ускорения, что приводит к тому, что сами же утилиты от AMD не понимают что у них видеокарта от AMD (Windows бодро рапортует, что это замечательный VGA-адаптер, который ничего не умеет). Под Windows Server это бывает постоянно (типа безопасность, сервер, все дела).
В 2003-ем сервере это решалось элементарно: Свойства экрана, устранение неполадок, слайдер ускорения вправо до упора и все счастливы. Проблема решена. В 2008 (R2), данный пункт меню эпичненько задизаблен с комментарием "драйвер запретил менять". Т.е. получается патовая ситуация: драйвер сбросил ускорение, не даёт его менять и от этого перестаёт работать. Просто счастье, какое-то.


Собственно хватит лить воду, само решение: 

  1. Открываем в реестре следующий ключ: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Video
  2. Среди гуидов находим нужную видеокарту (раскрываем, смотрим на описания ключей, пропускаем всякие эмуляторы RDP, VGA, VNC, записывателей видео и т.д.). Возможно, что для AMD будет гуид (хотя не уверен в их определённости): {DA28D4B2-FAF5-45C5-A111-36F83DD8634A}
  3. Находим значение Acceleration.Level и ставим в 0, если там не ноль (0 — полное, 5 — отключено совсем).
  4. Перегружаемся (или пинаем ногами CCC) и наблюдаем на нормальные, человеческие настройи и отсутсвие идиотских ошибок.
Если подитожить всё вышесказанное, то решение такое:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Video\[гуид видеокарты от AMD]\0000\Acceleration.Level ставим 0

воскресенье, 17 апреля 2011 г.

Смена админского пароля без доступа к компьютеру

Если злоумышленник имеет физический
 доступ к вашему компьютеру,
 то это больше не ваш компьютер

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

Вообще, данный способ в теории для меня был достаточно ясен, но случилась ситуация, когда старый компьютер сотрудника выпал из домена (привет, Microsoft!), а самого сотрудника уже не было на работе, и невозможно было даже войти по кешированным данным. Был выбран самый простой способ для взлома.

Итак, что нам нужно сделать:

  • Смотрим, работает ли на целевом компьютере режим залипания клавиш по пятикратному нажатию шифта (если нет, придётся испробовать другие варианты, о них позднее, концепция будет та же)
  • Загружаемся с установочного диска, нажимаем shift+F10, получаем консоль. Находим нужный диск и переименовываем cmd.exe в sethc.exe (точнее делаем бекап sethc.exe, и копируем cmd.exe в sethc.exe). Примерный синтаксис:
  • c: //методом тыка и dir находим нужный диск cd windows\system32 ren sethc.exe sethc.exe.bak copy cmd.exe sethc.exe
  • Перегружаемся по-обычному 
  • Нажимаем пять раз shift и у нас есть консоль от SYSTEM (такой, злобный админ)
  • Меняем пароль админу (будем считать что его зовут Administrator):
  • net user Administrator new_password
    Это всё сломает шифрованные файлы для данного пользователя и его приватные ключи, так что аккуратнее с этим, если есть ценные данные. Возможно лучше будет создать нового пользователя и включить его в группу Администраторы.
  • Заходим под этим пользователем в систему и делаем, что нам надо
  • Восстанавливаем sethc.exe на место
Можем ещё повеселиться и запустить explorer от пользователя System, это ещё смешно работает по RDP, в общем получается отличный удобный хоткей для запуска консоли.

Что можно сделать, если "липкие клавиши" отключены?
  • Можно посмотреть, запускается ли от бездействия скринсейвер и подменить его
  • Можно подменить ненужную службу (только придётся сделать подготовления, ибо на обычный cmd, её не заменить)
  • Можно открыть реестр и прописать в автозагрузку нужные вещи
В общем, защищаться от такого сложно (если только ограничить доступ к внешним устройствам: выломать USB, CDROM, LPT, FDD и закрыть корпус на замок), главное, не подпускать злодеев к компьютеру, тогда всё будет хорошо, и вам тоже всё будет замечательно.

суббота, 12 марта 2011 г.

Оживление системы после миграции. Мучения с AHCI

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

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

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

Итак, проблема в том, что из-за каких-то абстрактных побуждений об оптимизации (доли секунды при загрузке) Windows 7 отключает неиспользуемые устройства при загрузке, и не включает.  Поэтому включать нужно вручную. Запустить реестр и переключить тип запуска. Данный способ отлично помогает, если мы можем загрузиться в IDE-режиме. Тогда мы сможем включить драйвера, включить AHCI и компьютер загрузится в продвинутом режиме. Но если мы не можем это сделать, или компьютер не загружается ни в каком из режимов?
Тогда берём загрузочный диск с семёркой или мегафлешку, загружаемся, открываем консоль, и запускаем regedit. В нём выбираем:
  • HKEY_LOCAL_MACHINE
  • File/Load Hive...
  • Находим реестр от нашей системы (диск наверняка будет не C:, так что находим нужный (пусть будет T:), и загружаем файл system, т.е. полный путь будет вида T:\Windows\System32\config\system
  • Выбираем любое имя для него, что-нибудь вида tmp
  • У нас появился данный раздел tmp в HKEY_LOCAL_MACHINE
  • Следуем инструкции от Microsoft и меняем значение Start на 0 в следующих ветках:
    • HKEY_LOCAL_MACHINE\tmp\ControlSet001\Services\Msahci
    • HKEY_LOCAL_MACHINE\tmp\ControlSet001\Services\IastorV
  • Имеем ввиду, что нам нужно сменить значение у активной конфигурации, поэтому может быть не ControlSet001, а ControlSet002 или 3, или 4... В общем, если сомневаетесь, меняйте везде
  • Если проблемы возникают и в IDE-режиме, то можете ещё включить pciide (по тем же путям)
  • Если у вас чипсет от nvidia, то включаем nvstor или nvraid
После этого перегружаетесь и радуетесь загруженной системе. Должно всё получиться.  Если не получилось, то проблема не в жёстком диске, а в чём-нибудь другом или же вы что-то забыли или не там изменили. Пытайтесь выяснить в чём проблема, пытайтесь включить дополнительные устройства. Естественно, если текущий компьютер имеет экзотический конфиг, для которого не подходят стандартные драйвера, то тут всё гораздо хуже, и выполнимо только при затрате большого количества усилий, нужны ли они вам, решайте сами.

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

среда, 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-режим, и только после этого сделать образ.
  • При попытке сделать архив по сети, он падает с ошибкой. — попробуйте сделать архивацию на другой компьютер, попробуйте заменить драйвера сетевой карты, ибо архивируется большой объём данных и могут выплыть проблемы в драйверах (бывали случаи, когда сетевые карты достаточно именитых производителей из-за ошибок в драйверах сжирали всю оперативную память и рушили сервер по недостатку ресурсов).
В общем, на этом всё, способ достаточно прост, я постарался расписать его подробно, уточнить проблемы и подводные камни. Надеюсь, что описание окажется полезным, и вы попробуете стандартные средства для архивации и соответствующей миграции, вместо использования сторонних.