MCP

четверг, 22 ноября 2012 г.

Смена темы в Windows 8 на тему из Release Preview

Я писал уже раньше, что Aero в Windows 8 у меня вызывает рвотный рефлекс. При том, что в Windows 8 Release Preview была шедевральная тема (чем-то даже лучше чем в Windows 7). И тут меня посетила мысль: а почему бы не попробовать подсунуть в релиз тему из релиз-кандидата.

Что удивительно, получилось совершенно без проблем (надеюсь не до первого сервис-пака ).
Собственно 2 картинки:
было

Стало
На мой взгляд гораздо приятнее, а ещё и с тенюшечкой и человеческой подсветкой при наведении.

Собственно, если вам это захотелось тоже проделать, то нужно поступить так.
В зависимости от версии (32 или 64 бита) скачать нужный архив:

Затем его распаковать в C:\Windows\Resources\Themes\Aero\ (нужны админские права. Возможно получится и без них в другую папку, но это уж вы сами).

После этого вам нужно создать какую-нибудь тему, сохранить её, например как "my theme", найти файл: C:\Users\<имя вашего пользователя>\AppData\Local\Microsoft\Windows\Themes\my theme.theme

Открыть его (например блокнотом). И поменять (ближе к концу):
[VisualStyles]
Path=%SystemRoot%\resources\Themes\Aero\Aero.msstyles

на

[VisualStyles]
Path=%SystemRoot%\resources\Themes\Aero\Aero_p.msstyles

После этого зайти в персонализацию и выбрать тему my theme. Всё. Можно пользоваться!

Для любителей, есть ещё встроенная тема AeroLite (можно применить таким же редактированием), но внешний вид сомнителен:


пятница, 16 ноября 2012 г.

Про SSD

Заказал себе ещё SSD, а пока заказывал, решил выяснить про них, как можно больше. Результатами исследование решил поделиться в этом небольшом чеклисте. Возможно пригодится, если кто-то ещё захочет взять SSD:
  • В работе SSD на функционал влияют 3 важные части:
    • Модули памяти
    • Контроллер
    • Прошивка
  • Модули памяти бывают построены по трём разным технлогиям
    • SLC — один бит на ячейку. Очень быстрые и очень надёжные. Стоят безумных денег и почти не попадаются. Выдерживают 100000 циклов записи.
    • MLC — два бита на ячейку. Практически все SSD на этом типе. 3000-5000 циклов
    • TLC — 3 бита на ячёйку. Пока такие только видел у Samsung 840. Но чувствую, что дальше будет больше. 1000 циклов перезаписи
  • Также у памяти бывает 3 основных интерфейса
    • Toggle NAND — одна из самых быстрых
    • Синхронный ONFi — почти такой же быстрый, как и Toggle NAND, но дешевле. Разница перекрывается прошивкой.
    • Асинхронный ONFi — более медленный, ещё дешевле. В некоторых случаях разница с синхронным практически незаметна
  • Ёмкость и производительность: текущая архитектура памяти приводит к тому, что 256Gb имеют одну из самых максимальных скоростей, 128 и 64 могут быть медленнеее (зависит от контроллера). 512 — особо не приводит к увеличению производительности.
  • Меньший техпроцесс означает меньшее количество циклов перезаписи и меньшую скорость. Так что старая память и старый SSD чем-то могут выигрывать перед новыми.
  • Контроллер
    • Есть дешёвые контроллеры в дешёвых SSD — Phison, JMicron. Тут я не исследовал, ибо некоторые факторы говорят, что дешёвый медленный SSD возможно будет хуже HDD
    • Есть SandForce — на нём построены большинство SSD. Есть некоторые проблемы, но большинство из них уже решили, также отличается сжиманием данных, что приводит к завышенным цифрам в характеристиках и плавающими скоростями в зависимости от данных
    • Есть Samsung, Indilinx Everest 2, Marvell, LAMD. Все имеют свои особенности, но самые быстрые
  • Прошивка.
    • Обновляется. Очень желательно следить и обновлять по возможности самостоятельно
    • В ней все алгоритмы работы. В некоторых случаях, кардинально повышается производительность и исправляются баги
    • В качестве примера, SSD от Intel на SandForce имеют собственную прошивку и на голову рвут остальных с тем же контроллером и той же памятью.
  • Производители: есть огромное количество производителей с практически идентичными характеристиками, ибо память одинаковая, контроллер одинаковый, для производства нужно купить мешок контроллеров, 8 мешков памяти и упаковать это всё в красивый корпус. Что из них брать — особо не принципиально.
  • Ёмкость.
    • SSD имеют "честные" гигабайты, но в целях балансировки часть места отводится под системные нужды и гигабаты становятся "маркетинговыми". Некоторые SSD позволяют изменить этот объём, но судя по всему при небольшом свободном месте производительность падает настолько, что луше не допускать этого.
    • Некоторые производители отрезают ещё 8% (и объём становится 60, 120, 240), ради надёжности (используются проверочные суммы, накопитель может работать даже при одном мёртвом модуле).
  • IOPS и производительность.
    • Свежий и загруженный диск имеют абсолютно разные скорости. Чем больше свободного места, тем быстрее.
    • Есть встроенный Garbage Collector, но лучше чтобы операционная система поддерживала команду TRIM, это эффективнее очищает диск и восстанавливает скорость.
    • Из-за ошибок прошивки после TRIM скорость может восстанавливаться не полностью. Т.е. работа нового и старого/пустого будет разной (привет SandForce!)
  • Соответственно при высокой нагрузке на SSD скорость будет проседать, вплоть до того что HDD будет быстрее. Лечение — дать отдохнуть диску.
  • Время жизни — не исследовал вопрос. Математика говорит про срок работы больше чем моральное устаревание, практика говорит что дохнут периодически все.
  • Чем больше ёмкость, тем больше срок жизни при равной нагрузке.
  • Лучшие накопители на данный момент и на мой взгляд  OCZ Vertex 4, Plextor M5 Pro и Samsung 840 Pro
  • RAID. Тут местами хорошо, местами плохо. Плохо в том плане, что RAID-контроллеры не поддерживают TRIM, поэтому при некачественной сборке мусора внутри SSD очень сильно просядет запись. С чтением всё хорошо. Так что при желании RAID думаю нужно:
    • Выяснить, может ли RAID-контроллер делать TRIM
    • Использовать софтовый RAID
    • Использовать SSD с хорошей сборкой мусора (т.е. не SandForce и Samsung)
А себе я заказал Samsung 830, уже достаточно старую модель, но из-за этого подешевевшую, при этом достаточно шуструю. А как мне сообщил пользователь SSD: "после 300Мб/с — разница в производительности не очень заметна."

вторник, 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, то с давлением становится всё ещё веселее, в плане того, что совершенно непонятно, каким числам верить.

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