Tuesday, April 27, 2010

Доктор Сухожилин

Пару дней назад, Камилка притащила свой игрушечный стетоскоп, заявила, что она доктор и намылилась нас лечить. А до этого она смотрела мультик про Незнайку, в котором есть такой персонаж как доктор Пилюлькин. Да и сам Незнайка, когда искал себя в жизни и решил стать врачом, взял себе псевдоним – доктор Касторкин и всем подряд выписывал касторку, заявляя, что врачевание – плевое дело. В общем Ариза и спрашивает: «А ты доктор Пилюлькин или Касторкин?». Немного подумав, дочь выдала: «Нет, я доктор Сухожилин!». Мы долго катались со смеху, ей это не понравилось и она стала нас уверять, что она доктор Морковкин или доктор Цветочкин, но никак не Сухожилин :). Но было уже поздно, фраза «Доктор Сухожилин», прочно вошла в наш семейный обиход.

Saturday, April 24, 2010

Банковский счет в Великобритании

Единственное проявление бюрократии в Великобритании, с которым я пока сталкивался - это проблема открытия банковского счета. В этой стране без банковского счета ты никто и звать тебя никак. Человек не может снять квартиру, у него нет возможности подключиться к интернету, оплатить телевизионную лицензию, заключить контракт на мобильную связь и т.д. То есть спектр услуг, которые он может получить, сильно ограничен. Наличие российского банковского счета никого не колышет (почти) :).
Для получения банковского счета необходимо предоставить доказательство проживания по какому-либо британскому адресу. В качестве доказательства могут выступать счета за газ/электричество/воду/телефон, приходящие на твое имя. И вот тут возникает рекурсия, лично у меня приводящая к переполнению буфера. Для того чтобы приходили счета, надо снять квартиру, что практически невозможно сделать не имея банковского счета. Конечно, можно попросить знакомых, чтобы они позвонили, к примеру, в газовую компанию и попросили включить твое имя в счет, но мои знакомые платят за газ/электричество с помощью электронных ключей, т.е. без счетов и соответственно помочь мне не могли, да и не всякий на это пойдет.
На этой почве расцветает куча быдло-контор для иммигрантов, которые за деньги предоставляют какой-то адрес, по которому ты якобы проживаешь, получают на твое имя счета и уже с этими счетами ты топаешь в банк. Я терпеть не могу подобного рода шарашки, ведь это сборище жуликов и проходимцев, плодящее нелегалов. Я пошел другим путем и умудрился снять квартиру, предоставив агентству выписку с российского банковского счета и справку от работодателя, что должно было убедить лендлорда, что я скоро открою местный банковский счет. Они долго ломались, потом стали требовать, чтобы я заплатил за полгода вперед, в конце концов, сошлись на трех месяцах.
Но счетов на руках я все еще не имел, и пришлось открывать банковский счет не имея доказательства адреса :). Я долго убеждал свой родной HSBC, что я работаю у них же, что вот контракт, вот паспорт, вот бумага от моего менеджера, сообщающая в свободной форме, что я проживаю по такому-то адресу - откройте мне счет, в конце концов. Я несколько раз был в нескольких отделениях, включая внутреннее (для сотрудников банка) и видел, что для людей это был разрыв шаблона –они реально понимали, что это глупо не открыть счет своему сотруднику, но поделать ничего не могли. В конце концов, я добрался до старшего менеджера, способного принимать такие решения, и он лично под свою ответственность открыл мне счет, приняв те бумаги, которые у меня были :).
Вся эта эпопея заняла около месяца. Самое интересное, что открыть счет без адреса трудно, но если у тебя уже есть счет, то при смене адреса никто у тебя не просит никаких бумажек, более того, ты сам можешь поменять его через сайт. Вообще через сайт делается практически все, т.е. мне ни разу не понадобилось зайти в отделение банка после того, как я получил карточку. Все коммунальные платежи, плата за квартиру, за телефоны с интернетами и даже за тренажерный зал, осуществляется созданием простой инструкции на сайте. Кроме того, все карточки здесь с чипами, в большинстве магазинов безчиповые карты вообще не принимают. Часто карточка выступает в качестве удостоверения личности, т.е. когда я заключал контракт на мобильную связь и когда регистрировал свой Oyster, меня попросили показать ID - карточки было достаточно.

Thursday, April 22, 2010

Эмиль Золя. «Ругон – Маккары». 4. «Завоевание».

В провинциальный городок Плассан – родину Ругон-Маккаров – с тайным заданием направляется имперский агент – аббат Фожа. Задание – объединить сильно разрозненных правых (империалистов и легитимистов) в единую коалицию против республиканцев – шансы которых на предстоящих выборах чрезвычайно высоки. Фожа и в самом деле аббат, но очень властный и импульсивный - огромный детина со здоровыми кулачищами. Он с пренебрежением относится к внешнему виду и мирским благам, ходит в задрипанной сутане и не расчесывается, но сила воли у него потрясающая. Приехав в Палссан, аббат снимает комнату на третьем этаже в доме Муре. Франсуа Муре – внук Маккара, женатый на своей кузине Марте Ругон – дочери Пьера и Фелисите Ругон (см. Карьера Ругонов).
Это не очень богатая, но довольная своей жизнью семья. У Марты и Франсуа, трое детей, два мальчика и немного отсталая в умственном развитии четырнадцатилетняя девочка – Дезире. Франсуа занимается оптовой торговлей сельхоз. продукцией, а также ухаживает за своим садом, который он очень любит, и которым ужасно гордится. Они в состоянии позволить себе платить служанке Розе - сварливой и прямо скажем тупой бабе. Тихий и счастливый быт Муре нарушается приездом аббата. Сначала аббата не видно и не слышно, но потихоньку, он начинает спускаться по вечерам в общую кухню и пока его мать играет в карты с Франсуа, ведет задушевные беседы с Мартой. Так постепенно день за днем аббат завладевает домом Муре, начинает принимать гостей, подолгу тусуется в саду, через некоторое время к нему приезжают его сестра с мужем. Это последовательное завоевание дома отражает завоевание Плассана. Все в городе только и говорят о Фожа. Светские дамы от него в восторге, и хотят видеть своим духовным наставником лишь его. Старый и слабовольный окружной епископ наделяет его всей полнотой церковной власти. Фожа владеет умами «золотой молодежи» и сердцами простолюдинов. Но ваЛлахи какой-же это лицемер и мерзавец! Он уничтожает семью Муре, он ставит на колени Плассан, он не позволяет никому даже пикнуть, пока...
Вообще все произведение напоминает кошмарный сон. С каждой страницей, поначалу вроде связное повествование, обрастает нелепостями очевидными читателю, но герои как будто ничего не замечают, или не хотят замечать и страница за страницей их жизнь превращается в театр абсурда. Часто хочется закрыть книгу и не читать ужасы, которые в ней описаны. И становится еще страшнее от того, что это не чистая выдумка, что ведь и в самом деле есть вся эта ложь и грязь, предательство и подлость, скотство и тупость которыми так пропитаны герои этого романа.
Единственные положительные герои это Франсуа и Марта, их сын Серж и дочь Дезире, да еще аббат Бурет. Остальные просто дебилы.

Sunday, April 18, 2010

Roman numbers converter in C#

Following methods written in C#, can be used for converting of numbers from Roman to decimal numerals (int) and vice versa. Only numbers in simple roman notation can be used. Simple Roman notations only includes ‘I’, ‘V’, ‘X’, ‘L’, ‘C’, ‘D’, ‘M’ digits and can represent numbers from 1 to 3999.
public class RomanNumbers
    {
        public static string ConvertFromInteger(int integerNumber)
        {
            if (integerNumber < 1)
                return String.Empty;
            if (integerNumber > 3999)
                throw new ArgumentException("integerNumber. Should be less than 3999");

            const string romanSymbols = "IVXLCDM";
            var orderOfNumber = (int)Math.Truncate(Math.Log10(integerNumber));

            var currentNumber = integerNumber;
            var sbRomanNumber = new StringBuilder();

            for (var i = orderOfNumber; i >= 0; i--)
            {
                int j = i * 2;
                int devisor = GetCurrentDevisor(i);
                int valueOfCurrentPower = (int)Math.Truncate((double)(currentNumber / devisor));

                switch (valueOfCurrentPower)
                {
                    case 1:
                        sbRomanNumber.Append(romanSymbols[j]);
                        break;
                    case 2:
                        sbRomanNumber.Append(romanSymbols[j], 2);
                        break;
                    case 3:
                        sbRomanNumber.Append(romanSymbols[j], 3);
                        break;
                    case 4:
                        sbRomanNumber.Append(romanSymbols[j]);
                        sbRomanNumber.Append(romanSymbols[j + 1]);
                        break;
                    case 5:
                        sbRomanNumber.Append(romanSymbols[j + 1]);
                        break;
                    case 6:
                        sbRomanNumber.Append(romanSymbols[j + 1]);
                        sbRomanNumber.Append(romanSymbols[j]);
                        break;
                    case 7:
                        sbRomanNumber.Append(romanSymbols[j + 1]);
                        sbRomanNumber.Append(romanSymbols[j], 2);
                        break;
                    case 8:
                        sbRomanNumber.Append(romanSymbols[j + 1]);
                        sbRomanNumber.Append(romanSymbols[j], 3);
                        break;
                    case 9:
                        sbRomanNumber.Append(romanSymbols[j]);
                        sbRomanNumber.Append(romanSymbols[j + 2]);
                        break;
                }
                currentNumber -= valueOfCurrentPower * devisor;
            }
            return sbRomanNumber.ToString();
        }

        public static int ConvertToInteger(string romanNumber)
        {
            if (romanNumber == null)
                throw new ArgumentNullException("romanNumber");

            int resultInteger = 0;

            romanNumber = romanNumber.ToUpperInvariant();

            for (int i = 0; i < romanNumber.Length; i++)
            {
                switch (romanNumber[i])
                {
                    case 'I':
                        if (i < romanNumber.Length - 1 
                            && romanNumber[i + 1] != 'I')
                            resultInteger--;
                        else resultInteger++;
                        break;
                    case 'V':
                        resultInteger += 5;
                        break;
                    case 'X':
                        if (i < romanNumber.Length - 1 
                            && (romanNumber[i + 1] == 'L' 
                            || romanNumber[i + 1] == 'C'))
                            resultInteger -= 10;
                        else resultInteger += 10;
                        break;
                    case 'L':
                        resultInteger += 50;
                        break;
                    case 'C':
                        if (i < romanNumber.Length - 1 
                            && (romanNumber[i + 1] == 'D' 
                            || romanNumber[i + 1] == 'M'))
                            resultInteger -= 100;
                        else
                            resultInteger += 100;
                        break;
                    case 'D':
                        resultInteger += 500;
                        break;
                    case 'M':
                        resultInteger += 1000;
                        break;
                    default:
                        throw new ArgumentException("Wrong Roman number format.");
                }
            }
            return resultInteger;
        }

        private static int GetCurrentDevisor(int i)
        {
            return (int)Math.Pow(10, i);
        }
    }
Here are the unit tests:
[TestFixture]
    public class RomanNumbersTests
    {
        private object[] _convertTestCases = {
                                                 new object[] {"I", 1},
                                                 new object[] {"II", 2},
                                                 new object[] {"III", 3},
                                                 new object[] {"IV", 4},
                                                 new object[] {"V", 5},
                                                 new object[] {"VI", 6},
                                                 new object[] {"VII", 7},
                                                 new object[] {"VIII", 8},
                                                 new object[] {"IX", 9},
                                                 new object[] {"X", 10},
                                                 new object[] {"XI", 11},
                                                 new object[] {"XII", 12},
                                                 new object[] {"XIII", 13},
                                                 new object[] {"XIV", 14},
                                                 new object[] {"XV", 15},
                                                 new object[] {"XVI", 16},
                                                 new object[] {"XVII", 17},
                                                 new object[] {"XVIII", 18},
                                                 new object[] {"XIX", 19},
                                                 new object[] {"XX", 20},
                                                 new object[] {"XXI", 21},
                                                 new object[] {"XXV", 25},
                                                 new object[] {"XXX", 30},
                                                 new object[] {"XXXV", 35},
                                                 new object[] {"XL", 40},
                                                 new object[] {"XLV", 45},
                                                 new object[] {"XLIX", 49},
                                                 new object[] {"L", 50},
                                                 new object[] {"LX", 60},
                                                 new object[] {"LXIX", 69},
                                                 new object[] {"LXX", 70},
                                                 new object[] {"LXXVI", 76},
                                                 new object[] {"LXXX", 80},
                                                 new object[] {"XC", 90},
                                                 new object[] {"XCIX", 99},
                                                 new object[] {"C", 100},
                                                 new object[] {"CL", 150},
                                                 new object[] {"CC", 200},
                                                 new object[] {"CCC", 300},
                                                 new object[] {"CD", 400},
                                                 new object[] {"CDXCIX", 499},
                                                 new object[] {"D", 500},
                                                 new object[] {"DC", 600},
                                                 new object[] {"DCLXVI", 666},
                                                 new object[] {"DCC", 700},
                                                 new object[] {"DCCC", 800},
                                                 new object[] {"CM", 900},
                                                 new object[] {"CMXCIX", 999},
                                                 new object[] {"M", 1000},
                                                 new object[] {"MCDXLIV", 1444},
                                                 new object[] {"MDCLXVI", 1666},
                                                 new object[] {"MCMXC", 1990},
                                                 new object[] {"MCMXCIX", 1999},
                                                 new object[] {"MM", 2000},
                                                 new object[] {"MMI", 2001},
                                                 new object[] {"MMX", 2010},
                                                 new object[] {"MMD", 2500},
                                                 new object[] {"MMM", 3000},
                                                 new object[] {"MMMDCCCLXXXVIII", 3888},
                                                 new object[] {"MMMCMXCIX", 3999}
                                             };

        [Test]
        public void ConvertFromInteger_Returns_EmptyString_For_Zero()
        {
            Assert.IsEmpty(RomanNumbers.ConvertFromInteger(0));
        }

        [Test]
        public void ConvertFromInteger_Returns_EmptyString_For_NegativeNumber()
        {
            Assert.IsEmpty(RomanNumbers.ConvertFromInteger(-1));
            Assert.IsEmpty(RomanNumbers.ConvertFromInteger(-999));
            Assert.IsEmpty(RomanNumbers.ConvertFromInteger(Int32.MinValue));
        }

        [Test]
        [ExpectedException(typeof(ArgumentException))]
        public void ConvertFromInteger_ThrowsArgumentException_For_Number_Greater_Tnan_3999()
        {
            RomanNumbers.ConvertFromInteger(4000);
        }

        [Test]
        public void ConvertFromInteger_WorksFine_For_Numbers_Between_1_And_3999()
        {
            for (var i = 1; i < 4000; i++)
                RomanNumbers.ConvertFromInteger(i);
        }

        [Test]
        [TestCaseSource("_convertTestCases")]
        public void ConvertFromInteger_Works(string romanNumber, int numberToConvert)
        {
            Assert.AreEqual(romanNumber, RomanNumbers.ConvertFromInteger(numberToConvert));
        }

        [Test]
        [ExpectedException(typeof(ArgumentNullException))]
        public void ConvertToInteger_RisesArgumnetNullException_If_InputStringIsNull()
        {
            RomanNumbers.ConvertToInteger(null);
        }

        [Test]
        [ExpectedException(typeof(ArgumentException))]
        public void ConvertToInteger_RisesArgumnetException_If_InputStringIsNotRomanNumber()
        {
            RomanNumbers.ConvertToInteger("sddfjslf9321233jrlew49jkrlwr3");
        }
        
        [Test]
        [TestCaseSource("_convertTestCases")]
        public void ConvertToInteger_Works(string romanNumberToConvert, int resultNumber)
        {
            Assert.AreEqual(resultNumber, RomanNumbers.ConvertToInteger(romanNumberToConvert));
        }
    }
Unit tests' results:

Thursday, April 08, 2010

Навыки

За три месяца работы на новом месте узнал следующие вещи:
  1. Понял что такое EAV, как с ним работать и какие выгоды оно сулит человечеству.
  2. Начал погружаться в волшебный мир ExtJS. Очень нравится.
  3. Начал писать в стиле MVC. Там где это выгодно (а выгодно почти везде), проектирую новые классы, так чтобы они ложились в этот паттерн.
  4. Стал активно использовать «моки» и «заглушки» при тестировании, в частности с использованием NUnit.Mocks.
  5. Стал активно пользоваться JSON.
  6. Понял что такое log4net и почему все с него так балдеют :) Использую вовсю.
  7. В данный момент изучаю/пользую библиотеку WinForms контролов Devexpress.

По работе приходится работать как с Web, так и с WinForms приложениями. Также в скором будущем планируется начать проекты на WPF и на Silverlight, иншаАллах.

Monday, April 05, 2010

Эмиль Золя. «Ругон – Маккары». 3. «Чрево Парижа».

«Чрево Парижа» Эмиля Золя – третья книга из серии Ругон-Маккары. Лиза – внучка  контрабандиста Маккара – представительница среднего класса – класса  зажиточных буржуа. Она размеренная и чинная толстуха, хозяйка колбасной лавки рядом с центральным рынком (собственно «чрево») в Париже. Все в ее мирке идет как по маслу, она и ее семья – муж и дочка пышут здоровьем, денег валом, почет и уважение всех окрестных торгашей. В общем, все просто великолепно пока в их чистом и уютном доме, доме недалеких толстяков не появляется «худой» – чеcтный и интеллигентный молодой человек с пламенным сердцем – Флоран – беглый  каторжник, брат Кеню – мужа Лизы.
На каторгу он попал лишь за то, что пытался остановить кровь у подстреленной на баррикадах девушки и испачкал себе руки. Озверевшие жандармы, увидев окровавленные руки, доставили его в каталажку, предварительно, как водится, избив до полусмерти. Проведя несколько лет на каторге, и чудом бежав, Флоран добирается до Прижа. Селится инкогнито у своего брата и пытается начать новую жизнь. Он устраивается на центральный рынок контроллером в павильон рыбы. И тут Золя описывает обычную жизненную ситуацию, когда двуногий скот (выражение Золя) – торгаши, начинают издеваться над бедным интеллигентом. Травля продолжается почти ежечасно; помои под ноги, трехэтажный мат, сплетни и пересуды, откровенная ложь и поклеп. В то же время Флоран, совершенно бесплатно занимается грамотой с сыном  Нормандки (одна из авторитетных торговок), чем заслуживает ее симпатию, а так как Нормандка в контрах с Лизой, она ставит своей целью женить Флорана на себе, чтобы насолить ей. При этом его искренне любит сестра Нормандки – Клер.
Флоран, видя нищету и голод народа - то, как жирует небольшая прослойка, буквально прожигая жизнь, начинает по вечерам разрабатывать проекты законов – новые правила торговли и изменения в налоговом регулировании, которые, по его мнению, послужат улучшению благосостояния среднего класса и бедняков. Он примыкает к кружку, которые в отдельном кабинете ведут разговоры о политике. Через некоторое время, он становится его лидером и подстрекаемый провокаторами, начинает разрабатывать план революции. Его ученик – Мюш, сын Нормандки, усердно выводит у себя в прописях фразы: «День суда настанет… Страдание праведника — приговор нечестивцу… Час возмездия пробьет, и виновный падет».
Постепенно идея революции захватывает весь его ум, чему конечно сильно способствует его обида за незаслуженно понесенное наказание. Он печется о быдле, хочет, чтобы ему было лучше, чтобы оно не платило взятки, жило по законам, имело какие-то социальные гарантии. И как всегда, быдло сопротивляется – оно довольно тем, что им помыкают, оно даже не понимает, что то положение дел, которое существует, является в корне неправильным.
Когда полиция приходит арестовывать Флорана, выясняется, что только ленивый не написал на него донос. Все, включая Лизу, успели побывать в полиции и настучать. Только его брат, толстяк Кеню, был не в теме и очень горячо и искренне любил своего старшего брата, он рыдал как животное (термин Золя) узнав, что его арестовали. Да Клер изрывает себе пальцы в кровь, пытаясь вырваться из запертой комнаты и предупредить любимого. Суд, используя в качестве доказательства вины Флорана, в частности, прописи Мюша («О ужас! Чем учило ребенка это чудовище!»), отправляет его обратно на каторгу, вместе с парой вообще ни в чем не повинных «мимо проходивших» (видимо для профилактики).
Как всегда у Золя очень тщательно прорисованные персонажи, со своей сложной судьбой, историей и характером. В целом, серия нравится все больше и больше.

Friday, April 02, 2010

5 km race

I will be running the 5km race for the Stroke Foundation on the 18th April 2010, and ask for your support in raising funds for the organisation. Thank you in advance, Bashir.
Я собираюсь пробежать кросс в 5 километров в поддержку благотворительного фонда борьбы с инсультами. Каждый участник кросса должен собрать минимум 50 британских фунтов, поэтому прошу вас помочь мне в этом деле. Ваше пожертвование пойдет на благое дело! Заранее спасибо, Башир.