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

Во дворах Челябинска

Это вид из окна.
Как так можно было умудриться?
Видимо что-то с тормозами было не в порядке.
Сначало было смешно, но потом грустно. Хорошо что никто не пострадал.
Кстати, за зеленым забором садик.


среда, 4 июля 2012 г.

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

Проверка на возраст :)


четверг, 15 декабря 2011 г.

пятница, 3 июня 2011 г.

Хорошие статьи по WPF

Рекомендую почитать про WPF и шаблон MVVM:
 http://msdn.microsoft.com/ru-ru/magazine/cc785479.aspx
 http://msdn.microsoft.com/ru-ru/magazine/cc700358.aspx
 http://msdn.microsoft.com/ru-ru/magazine/cc785480.aspx
 http://msdn.microsoft.com/ru-ru/magazine/dd419663.aspx

среда, 25 мая 2011 г.

Настоящее понимание ViewState'а

http://habrahabr.ru/blogs/net/119537/

Непонимание ViewState'а ведет к...

  1. Потере важной информации
  2. Атакам на ViewState
  3. Плохой производительности — вплоть до ОТСУТСТВИЯ ПРОИЗВОДИТЕЛЬНОСТИ
  4. Плохой расширяемости — как много пользователей вы сможете обслужить, если каждый из них будет отправлять 50k с каждым запросом?
  5. Плохому дизайну вообще
  6. Головной боли, тошноте, головокружениям и необратимому искривлению формы надбровных дуг

Что делает ViewState?

Это список основных функций ViewState'а. Каждая из них служит определенной цели. Далее мы рассмотрим, как именно они этих целей достигают.
  1. Сохраняет данные элементов управления по ключу, как хэш-таблица
  2. Отслеживает изменения состояния ViewState'а
  3. Сериализирует и десериализирует сохраненные данные в скрытое поле на клиенте
  4. Автоматически восстанавливает данные на postback'ах


Еще более важно понимать, что ViewState НЕ делает.

Что не делает ViewState?

  1. Автоматически сохраняет состояние полей класса (скрытых, защищенных или открытых)
  2. Запоминает какую-либо информацию при загрузке страницы (только postback'и)
  3. Исключает необходимость загружать данные при каждом запросе
  4. Отвечает за загрузку данных, которые были отправлены на сервер, например введенных в текстовое поле (хотя ViewState и играет здесь важную роль)
  5. Варит вам кофе

пятница, 22 апреля 2011 г.

На работу и на волю :)


Список событий в GLOBAL.ASAX

Теория и практика MVC »

Список событий в GLOBAL.ASAX

пятница, 22 апреля 2011, 07:25 | Комментарии: 1 В этой небольшой памятке перечислены события, который можно перехватить используя методы, определяемые в файле global.asax.

Список событий в порядке из вызова

Чтобы не было путаницы в дальнейшем, определим чем аутентификация отличается от авторизации:
  • Аутентификация – идентификация личности пользователя (например по его имени и пароль).
  • Авторизация – определение прав на запрашиваемый пользователем ресурс (страницу, сервис).
Теперь рассмотрим вариант списка событий без их описания. При этом расположим их в порядке, соответствующем последовательности вызова.
01// запуск веб-приложения
02 
03protected void Application_Start(Object sender, EventArgs e);
04 
05// получение запроса
06 
07protected void Application_BeginRequest(Object sender, EventArgs e);
08protected void Application_AuthenticateRequest(Object sender, EventArgs e);
09protected void Application_AuthorizeRequest(Object sender, EventArgs e);
10protected void Application_ResolveRequestCache(Object sender, EventArgs e);
11 
12// начало сессии, один раз для каждого клиента
13 
14protected void Session_Start(Object sender, EventArgs e);
15 
16// обработка запроса
17 
18protected void Application_AcquireRequestState(Object sender, EventArgs e);
19protected void Application_PreRequestHandlerExecute(Object sender, EventArgs e);
20protected void Application_PostRequestHandlerExecute(Object sender, EventArgs e);
21protected void Application_ReleaseRequestState(Object sender, EventArgs e);
22protected void Application_UpdateRequestCache(Object sender, EventArgs e);
23protected void Application_EndRequest(Object sender, EventArgs e);
24 
25// конец запроса
26 
27// отправка ответа
28 
29protected void Application_PreSendRequestHeaders(Object sender, EventArgs e);
30protected void Application_PreSendRequestContent(Object sender, EventArgs e);
31 
32// конец сессии, один раз для каждого клиента
33 
34protected void Session_End(Object sender, EventArgs e);
35 
36// завершение работы веб-приложения
37 
38protected void Application_Disposed(Object sender, EventArgs e);
39protected void Application_End(Object sender, EventArgs e);
А теперь рассмотрим все эти события более подробно:
  • protected void Application_Start(Object sender, EventArgs e);
Вызывается единожды при создании экземпляра класса HttpApplication в момент обращения первого пользователя к нему. Позволяет создать глобальные объекты, доступные во всем приложении.
  • protected void Application_BeginRequest(Object sender, EventArgs e);
Вызывается первым каждый раз при получения нового запроса от пользователя.
  • protected void Application_AuthenticateRequest(Object sender, EventArgs e);
Вызывается после аутентификации пользователя (установления его виртуальной личности, включая статус "незарегистрированный пользователь"). Данный метод можно использовать для проведения дополнительных проверок его статуса.
  • protected void Application_AuthorizeRequest(Object sender, EventArgs e);
Вызывается после авторизации пользователя по отношению к запрашиваемому ресурсу. Т.е. указывает что у пользователя есть права на действие (как правило просмотр), которое он хочет выполнить. Также как и Application_AuthenticateRequest() можно использовать для дополнительных проверок.
  • protected void Application_ResolveRequestCache(Object sender, EventArgs e);
Вызывается при поиске в кэше готового результата для запроса. Позволяет модулям вернуть уже готовый ранее результат и не задействовать обработчики. Таким образом снижается нагрузка на сервер, на котором размещено веб-приложение.
  • protected void Session_Start(Object sender, EventArgs e);
Вызывается единожды для каждого клиента (посетителя) в начале его сессии.
  • protected void Application_AcquireRequestState(Object sender, EventArgs e);
Вызывается после того, как ядро ASP.NET получает текущий контекст (state) запроса (данные сессии).
  • protected void Application_PreRequestHandlerExecute(Object sender, EventArgs e);
Вызывается перед обращением к обработчикам запроса (handlers).
  • protected void Application_PostRequestHandlerExecute(Object sender, EventArgs e);
Вызывается после завершения работы обработчиков запроса (handlers).
  • protected void Application_ReleaseRequestState(Object sender, EventArgs e);
Вызывается после завершения всех обработчиков событий и сохранения контекста (state) запроса.
  • protected void Application_UpdateRequestCache(Object sender, EventArgs e);
Вызывается после завершения всех обработчиков событий. В данном методе модули имеют возможность сохранить необходимые данные в кэше. В дальнейшем они могут быть использованы при обработке  Application_ResolveRequestCache().
  • protected void Application_EndRequest(Object sender, EventArgs e);
Вызывается как последнее событие при завершении обработки запроса от пользователя.
  • protected void Application_PreSendRequestHeaders(Object sender, EventArgs e);
Вызывается перед отправкой заголовков ответа клиенту.
  • protected void Application_PreSendRequestContent(Object sender, EventArgs e);
Вызывается перед отправкой содержимого ответа (например HTML кода страницы) клиенту.
  • protected void Session_End(Object sender, EventArgs e);
Вызывается единожды для каждого клиента (посетителя) при завершении его сессии (закрытии или истечении времени таймаута).
  • protected void Application_Disposed(Object sender, EventArgs e);
Вызывается при завершении веб-приложения. Хорошо подходит для методов освобождения используемых ресурсов.
  • protected void Application_End(Object sender, EventArgs e);
Вызывается при уничтожении последнего экземпляр класса HttpApplication. Т.е. при истечении таймаута у последнего активного пользователя.
  • protected void Application_Error(Object sender, EventArgs e);
В данный метод передаются все необработанные исключения, возникшие в веб-приложении. Как правило используется для записи информации о них в журнал и уведомлений обслуживающего персонала.

Пример файла Global.asax со всеми перечисленными обработчиками

Приведенный ниже код может быть добавлен в ASP.NET или ASP.NET MVC приложение. В каждом приведенном методе используется вызов Debug.Write() из пространства имен System.Diagnostics для вывода уведомления в окно Output. Таком образом можно самостоятельно посмотреть на порядок вызова обработчиков событий (код взять из ASP.NET MVC приложения).
001namespace MvcApplication
002{
003    using System;
004    using System.Diagnostics;
005    using System.Web.Mvc;
006    using System.Web.Routing;
007 
008    // Note: For instructions on enabling IIS6 or IIS7 classic mode,
009    // visit http://go.microsoft.com/?LinkId=9394801
010 
011    public class MvcApplication : System.Web.HttpApplication
012    {
013        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
014        {
015            filters.Add(new HandleErrorAttribute());
016        }
017 
018        public static void RegisterRoutes(RouteCollection routes)
019        {
020            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
021 
022            routes.MapRoute(
023                "User", // Route name
024                "{controller}/{action}/{id}", // URL with parameters
025                new {
026                    controller = "UserProfiles",
027                    action = "Index",
028                    id = UrlParameter.Optional
029                } // Parameter defaults
030            );
031        }
032 
033        protected void Application_Init(Object sender, EventArgs e)
034        {
035            Debug.WriteLine("protected void Application_Init();");
036        }
037 
038        protected void Application_Start()
039        {
040            AreaRegistration.RegisterAllAreas();
041 
042            RegisterGlobalFilters(GlobalFilters.Filters);
043            RegisterRoutes(RouteTable.Routes);
044 
045            Debug.WriteLine("protected void Application_Start();");
046        }
047 
048        protected void Application_End(Object sender, EventArgs e)
049        {
050            Debug.WriteLine("protected void Application_End();");
051        }
052 
053        protected void Application_Disposed(Object sender, EventArgs e)
054        {
055            Debug.WriteLine("protected void Application_Disposed();");
056        }
057 
058        protected void Application_BeginRequest(Object sender, EventArgs e)
059        {
060            Debug.WriteLine("protected void Application_BeginRequest();");
061        }
062 
063        protected void Application_EndRequest(Object sender, EventArgs e)
064        {
065            Debug.WriteLine("protected void Application_EndRequest();");
066        }
067 
068        protected void Application_PreRequestHandlerExecute(Object sender, EventArgs e)
069        {
070            Debug.WriteLine("protected void Application_PreRequestHandlerExecute();");
071        }
072 
073        protected void Application_PostRequestHandlerExecute(Object sender, EventArgs e)
074        {
075            Debug.WriteLine("protected void Application_PostRequestHandlerExecute();");
076        }
077 
078        protected void Application_PreSendRequestHeaders(Object sender, EventArgs e)
079        {
080            Debug.WriteLine("protected void Application_PreSendRequestHeaders();");
081        }
082 
083        protected void Application_PreSendRequestContent(Object sender, EventArgs e)
084        {
085            Debug.WriteLine("protected void Application_PreSendRequestContent();");
086        }
087 
088        protected void Application_AcquireRequestState(Object sender, EventArgs e)
089        {
090            Debug.WriteLine("protected void Application_AcquireRequestState();");
091        }
092 
093        protected void Application_ReleaseRequestState(Object sender, EventArgs e)
094        {
095            Debug.WriteLine("protected void Application_ReleaseRequestState();");
096        }
097 
098        protected void Application_ResolveRequestCache(Object sender, EventArgs e)
099        {
100            Debug.WriteLine("protected void Application_ResolveRequestCache();");
101        }
102 
103        protected void Application_UpdateRequestCache(Object sender, EventArgs e)
104        {
105            Debug.WriteLine("protected void Application_UpdateRequestCache();");
106        }
107 
108        protected void Application_AuthenticateRequest(Object sender, EventArgs e)
109        {
110            Debug.WriteLine("protected void Application_AuthenticateRequest();");
111        }
112 
113        protected void Application_AuthorizeRequest(Object sender, EventArgs e)
114        {
115            Debug.WriteLine("protected void Application_AuthorizeRequest();");
116        }
117 
118        protected void Session_Start(Object sender, EventArgs e)
119        {
120            Debug.WriteLine("protected void Session_Start();");
121        }
122 
123        protected void Session_End(Object sender, EventArgs e)
124        {
125            Debug.WriteLine("protected void Session_End();");
126        }
127    } 
128}

среда, 20 апреля 2011 г.

четверг, 10 февраля 2011 г.

вторник, 25 января 2011 г.

what leads to success?

Richard St. John's 8 secrets of success:

What LEADS to SUCCESS?
  1. Passion
  2. Work
  3. Focus
  4. Persist
  5. Ideas
  6. Good
  7. Push
  8. Serve
8 секретов успеха:
  1. Страсть
  2. Работа
  3. Фокусирование на одной цели
  4. Упорство
  5. Идеи
  6. Быть полезным
  7. Всегда подталкивать себя
  8. Служить людям


среда, 29 декабря 2010 г.

четверг, 21 октября 2010 г.

афоризмы новые :: 20 октября 2010

афоризмы новые :: 20 октября 2010:
"Всегда делай то, что тебе нравится, а то что не нравится, оставь делать
тем кому это нравится."

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

пятница, 24 сентября 2010 г.

Написал интернет-магазин на ASP.NET MVC

Мной почти завершается разработка интернет магазина IntellectShop.
Пока проект open source.
Размещается на площадке codeplex.com
http://intellectshop.codeplex.com

Готовый магазин можно посмотреть на http://www.intec74.ru

среда, 11 августа 2010 г.

вторник, 3 августа 2010 г.

Немного юмора :)

#3789: Откровенно интересно
от IT happens

Работаю инженером по ремонту ноутбуков, по долгу службы довольно часто проверяю лэптопы клиентов прямо на их системе.
У 85% пользователей ноутбуков все фото лежат в папках на рабочем столе.
Если мужчина женат, фоном рабочего стола часто выступает фотка с женой (чаще всего свадебная).
У замужних дам чаще всего на рабочем столе их фотка в купальнике или откровенном платье.
У свободных дам на рабочем столе лежат не попрятанные по папкам джейпеги с фотками в откровенном виде.
Если у мужчины на рабочем столе фоном лежит красивая актриса, то в какой-нибудь папке на рабочем столе найдётся «интересное видео».
Только в одном ноутбуке из ста, использующихся (со слов клиента) только для работы, не стоят 3D-игры.

пятница, 16 июля 2010 г.

Что должен знать правильный .NET-разработчик

Автор: Scott Hanselman
Оригинал: What Great .NET Developers Ought To Know (More .NET Interview Questions)

Что должен знать правильный .NET-разработчик

Каждый кто пишет код

  • Объясните разницу между нитью (Thread) и процессом (Process)
  • Что такое сервис (Windows Service) и как его жизненный цикл отличается от «стандартного» EXE?
  • Какой максимальный объем памяти может адресовать один процесс? Отличается ли он от максимального объема виртуальной памяти, доступной системе? Как это влияет на структуру системы?
  • В чем различие между EXE и DLL?
  • Что такое строгая типизация (strong-typing) в сравнении со слабой типизацией (weak-typing)? Какая предпочтительнее? Почему?
  • Некий продукт называют «контейнером компонентов» ("Component Container"). Назовите по крайней мере 3 контейнера компонентов, поставляемых с семейством продуктов Windows Server Family.
  • Что такое PID? Чем он полезен при выявлении неисправностей системы?
  • Сколько процессов могут слушать один и тот же порт TCP/IP?
  • Что такое GAC? Какую проблему он разрешает?

.NET-разработчик среднего уровня

  • Объясните разницу между интерфейсно ориентированным (Interface-oriented), объектно ориентированным и аспектно ориентированным (Aspect-oriented) программированием
  • Объясните что такое «интерфейс» и чем он отличается от класса
  • Что такое Reflection?
  • В чем различие между XML Web Services с использованием ASMX и .NET Remoting с использованием SOAP?
  • Являются ли системы типов, представленные в XmlSchema и в CLS — изоморфными?
  • Концептуально, в чем различие между ранним и поздним связыванием (early-binding и late-binding)?
  • Использование Assembly.Load — это статическая или динамическая ссылка?
  • Когда уместно использование Assembly.LoadFrom, а когда Assembly.LoadFile?
  • Что такое «Asssembly Qualified Name»? Это имя файла? В чем различие между ними?
  • Правильно ли так писать?
    Assembly.Load("foo.dll");
  • Чем отличается «strongly-named» сборка от «НЕ strongly-named» сборки?
  • Может ли DateTime равняться null?
  • Что такое JIT? Что такое NGEN? Каковы преимущества и ограничения каждого из них?
  • Как основанный на поколениях сборщик мусора в .NET CLR управляет жизненным циклом объекта? Что такое «non-deterministic finalization»?
  • В чем различие между Finalize() и Dispose()?
  • Чем полезен using()? Что такое IDisposable? Как он поддерживает deterministic finalization?
  • Что делает эта полезная команда? tasklist /m "mscor*"
  • В чем разница между «in-proc» и «out-of-proc»?
  • Какая технология позволяет выполнять out-of-proc взаимодействие в .NET?
  • Когда вы запускаете компонент из под ASP.NET, в каком процессе он работает под Windows XP? Windows 2000? Windows 2003?

Ведущий разработчик

  • Что не так вот в следующей строке?
    DateTime.Parse(myString);
  • Что такое PDB? Где они должны находится, чтобы можно было выполнять отладку?
  • Что такое «цикломатическая сложность» (cyclomatic complexity) и почему она важна?
  • Напишите стандартный lock() плюс «двойную проверку» для создания критической секции вокруг доступа к переменной.
  • Что такое «FullTrust»? Имеют ли FullTrust сборки, помещенные в GAC?
  • Какие преимущества получает ваш код, если вы декорируете его атрибутами, относящимися к особым Security permissions?
  • Что делает эта команда?
    gacutil /l | find /i "Corillian"
  • Что делает эта команда?
    sn -t foo.dll
  • Какие порты брандмауэра должны быть открыты для DCOM? Каково назначение порта 135?
  • Сопоставьте OOP и SOA. Каковы принципы каждого из них?
  • Как работает XmlSerializer? Каких ACL permissions требует использующий его процесс?
  • Почему catch(Exception) почти всегда — плохая мысль?
  • В чем разница между Debug.Write и Trace.Write? Когда должен быть использован каждый из них?
  • В чем различие между компиляцией в Debug и в Release? Есть ли значительная разница в скорости? Почему или почему нет?
  • Как работает JIT — по сборке целиком или по методу? Как это влияет на working set?
  • Сравните использование абстрактного базового класса и использование интерфейса?
  • В чем различие между a.Equals(b) и a == b?
  • В контексте сравнения, что такое идентичность объектов по сравнению с эквивалентностью объектов?
  • Как можно выполнить глубокое копирование (deep copy) в .NET?
  • Изложите ваше понимание IClonable.
  • Что такое «упаковка» (boxing)?
  • string — это тип значений (value type) или ссылочный тип?
  • В чем значимость паттерна "PropertySpecified", используемого в XmlSerializer? Какую проблему он пытается разрешить?
  • Почему в .NET выходные параметры (out parameters) не стоит применять? Действительно ли это так?
  • Может ли атрибут быть установлен на один из параметров метода? Чем это полезно?

Разработчик компонентов на C#

  • Сопоставьте использование override и new. Что такое «shadowing»?
  • Объясните использование virtual, sealed, override и abstract.
  • Объясните использование и значение каждого компонента строки:
    Foo.Bar, Version=2.0.205.0, Culture=neutral, PublicKeyToken=593777ae2d274679d
  • Объясните различия между public, protected, private и internal.
  • Какое преимущество вы получаете от использования первичной сборки взаимодействия (Primary Interop Assembly, PIA)?
  • Благодаря какому механизму NUnit узнает, какой метод протестировать?
  • В чем различие между:
    catch(Exception e){throw e;}  и
    catch(Exception e){throw;}
  • В чем разница между typeof(foo) и myFoo.GetType()?
  • Объясните что происходит в первом конструкторе:
    public class c{ public c(string a) : this() {;}; public c() {;} }
    Чем полезна такая конструкция?
  • Что такое «this»? Может ли this использоваться в статическом методе?

Разработчик на ASP.NET (UI)

  • Объясните, как POST-запрос формы из браузера становится на серверной стороне событием — таким как Button1_OnClick.
  • Что такое «PostBack»?
  • Что такое «ViewState»? Как он кодируется? Является ли он шифрованным? Кто использует ViewState?
  • Что такое element и для чего используются эти две технологии ASP.NET? (В оригинале: What is the element and what two ASP.NET technologies is it used for?)
  • Какие три Session State providers доступны в ASP.NET 1.1? Какие преимущества и недостатки у каждого из них?
  • Что такое «Web Gardening»? Как его использование влияет на проект?
  • В заданном ASP.NET-приложении, сколько объектов-приложений имеется, если это одно-процессорная машина? двухпроцессорная? двухпроцессорная с включенным Web Gardening? Как это отражается на проекте?
  • Используются ли нити (threads) ASP.NET приложения повторно для различных запросов (requests)? Получает ли каждый HttpRequest свою собственную нить? Должны ли вы в ASP.NET использовать Thread Local storage?
  • Полезен ли атрибут [ThreadStatic] в ASP.NET? Есть ли побочный эффект? Это хорошо или плохо?
  • Дайте пример того, как использование HttpHandler может упростить существующий проект, который обслуживает Check Images на .aspx-странице.
  • На события какого вида может подписываться HttpModule? Какое влияние они могут оказать на реализацию? Что может быть сделано без перекомпиляции ASP.NET-приложения?
  • Опишите способы представления «arbitrary endpoint (URL)» и направьте запросы к этой endpoint в ASP.NET.
  • Объясните как работают cookies. Дайте пример злоупотребления Cookie.
  • Объясните важность HttpRequest.ValidateInput()?
  • Какого рода данные передаются в заголовках HTTP (HTTP Headers)?
  • Сравните HTTP-запросы вида GET и POST. Что такое «HEAD»?
  • Назовите и опишите по крайней мере 6 статус-кодов HTTP (HTTP Status Codes) и объясните о чем они говорят клиенту, давшему запрос.
  • Как работает «if-not-modified-since»? Как это может быть программно реализовано на ASP.NET?
  • Объясните <@OutputCache%> и использование «VaryByParam», «VaryByHeader».
  • Как работает «VaryByCustom»?
  • Как можно реализовать кэширование готового HTML в ASP.NET, кэшируя отправляемые версии страниц, полученные по всем значениям q= кроме q=5 (например, http://localhost/page.aspx?q=5)?

Разработчик, использующий XML

  • В чем назначение XML Namespaces?
  • Когда уместно использование DOM? Когда неуместно? Есть ли ограничения по размеру?
  • Что такое «WS-I Basic Profile» и почему он важен?
  • Напишите простой XML-документ, использующий пространство имен (namespace) по умолчанию, а также qualified (prefixed) namespace. Добавьте элементы из обоих пространств имен.
  • В чем основное фундаментальное различие между элементами (Elements) и атрибутами (Attributes)?
  • В чем различие между «Well-Formed XML» и «Valid XML»?
  • Как бы вы валидировали XML используя .NET?
  • Почему такое использование — почти всегда неудачно. В каких случаях такое уместно?
    myXmlDocument.SelectNodes("//mynode");
  • Объясните различие между «pull-style parsers» (XmlReader) и «eventing-readers» (Sax)
  • В чем различие между XPathDocument и XmlDocument? Опишите ситуацию когда один из них может быть использован над другим.
  • В чем различие между XML "Fragment" и XML "Document"
  • Что означает — «каноническая» форма XML?
  • Почему спецификация XML InfoSet отличается от Xml DOM? Что пытается решить InfoSet?
  • Сравните DTD и XSD. В чем они схожи, в чем различны? Что предпочтительнее и почему?
  • Поддерживаются ли DTD в System.Xml? Как именно?
  • Всякая ли XML Schema может быть представлена в виде графа объектов? А наоборот?
Перевод: Никита Зимин,
ведущий разработчик компании «Деловые программы»

вторник, 13 июля 2010 г.

Анекдот :)

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