Блог разработчика

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

  • Как вернуть два Action из эффекта ngrx

    Изучаю ngrx и rxjs. Сами по себе библиотеки очень мощные, но понять, где кроется проблема, подчас бывает очень сложно. То ли это тяжёлое наследие JavaScript и его идейного наследника TypeScript, языков с нечёткой типизацией, то ли их плохая поддержка в средах разработки, то ли я ещё не очень привык к работе с ними. Вот и с этой проблемой я промаялся несколько вечеров: как правильно вернуть из ngrx effect два объекта action. В Сети нашёл упоминание о том, что якобы можно вернуть массив Action, однако у меня это не взлетело. В консоли браузера с упорством барана появлялась ошибка о том, что эффект вернул неожиданный тип массива. Вот такой кусок кода не работает:

    Read more...

  • Обход бинарного дерева с помощью итератора

    Tags: вопросы на собеседовании, структуры данных, алгоритмы

    Исходники для статьи

    Недавно мне пришлось проходить собеседование в Microsoft. По моим впечатлениям, я проявил себя довольно неплохо, но взяли другого разработчика, который по каким-то причинам подошёл лучше меня. Интервьюировали меня в несколько этапов. Задания и вопросы, в отличии от большинства вопросов в наших компаниях, были интереснее и разумнее, что-ли. Поэтому мне захотелось опубликовать серию статей с разбором заданий. Сегодня я рассмотрю задание, с частью которого я не справился, но хорошенько подумав на досуге нашёл хорошее решение.

    Задание, собственно, было такое. Напишите класс-итератор для обхода бинарного дерева. Первую половину – обход дерева breadth-first traversal – я решил довольно быстро, а вот со второй – inorder depth-first traversal возникли проблемы. Выполнить какое-либо действие (например, распечатать значение поля данных узла) для всех узлов с помощью рекурсии не представляет проблем, а вот с итератором у меня что-то не заладилось.

    Теория

    Для начал немного теории. Бинарное дерево – древовидная структура данных, в которой каждый узел имеет не более двух потомков (детей). Как правило, первый называется родительским узлом, а дети называются левым и правым наследниками.

    Далее по тексту я буду использовать следующее бинарное дерево.

    binary-tree-1

    Read more...

  • Модульное тестирование и контракты

    Tags: tdd, code contracts, unit testing, defensive programming

    Я давно хотел попробовать использовать контракты в дизайне своего кода, но всё как-то руки не доходили. Для целей defensive programming мне было вполне достаточно привычного подхода if-then-throw в начале каждого метода. Однако, руки наконец-то дошли, подвернулся новый несложный проект, и я решил включить эту технику в свой инвентарь. Как минимум это позволит мне писать более безопасный код, так как я буду проверять не только предусловия, но и постусловия и состояние объектов. И сразу же возник вопрос: “как такой код тестировать”. Вроде бы всё просто, заменяй тип ожидаемого исключения в модульных тестах с разнообразных ArgumentException, ArgumentNullException на тип, который используется при нарушении контрактов, но не тут-то было! Действительно контракты выбрасывают, при своём нарушении, исключение типа ContractException, но этот тип объявлен внутренним (internal).

    То есть подобный код просто не будет скомпилирован:

            [TestMethod]
            [ExpectedException(System.Diagnostics.Contracts.ContractException)]
            public void TestMethodName()
            {
                new ClothesStyle(null, 0);
            }
    

    Read more...

  • HTML 5 макет страницы с фиксированной шириной

    Tags: html5, css, макет страницы

    Один из типичных макетов страницы – страница с фиксированной шириной. Как правило, в таком макете должны присутствовать заголовок, область контента и подвал. Высота всего макета, в случае когда контента не хватает, должна равняться высоте окна браузера. Я решил накидать подобный макет для последующего использования. Макет проверен в пяти наиболее распространённых на текущий момент браузерах: Opera, Internet Explorer, Fire Fox, Chrome и Safari.

    Read more...

  • Вопросы для собеседования программистов

    Tags: идея, вопросы на собеседовании

    stackoverflow-logoМеня достали тупые, шаблонные вопросы на собеседованиях! Верхом тупости я считаю вопрос о том, как работает Garbage Collector. Грешен, я его сам задавал и не раз, но никогда не требовал от кандидатов полного отчёта о всех тонкостях его работы, никогда не ставил им в упрёк то, что они не знают с каких объектов GC начинает поиск мёртвых объектов. Работает и ладно. Будут проблемы с утечкой памяти, буду разбираться. Лично я считаю, что все эти энциклопедические знания никому не нужны. Ну, разве что игрокам в “Что, где, когда”. У нас всегда под рукой MSDN (или какая-то другая библиотека с документацией), блоги, и т.д. Так как быть?

    Однако я знаю по себе, как сложно придумать Хорошие вопросы. Сегодня меня осенило. Не надо мучать себя, надо воспользоваться тем, что уже есть. Думаю, всем программистам известен сайт Stack Overflow (есть и другие аналоги), на нём люди задают вопросы, касающиеся разработки программного обеспечения. Суть иди: идёшь на  Stack Overflow и подбираешь вопросы по нужной тематике и уровню, там их море с ответами и без. Да, многие вопросы требуют кодирования, но совсем не обязательно получать от кандидата готовое решение. Достаточно спросить о путях решения, которые он видит. В конце концов важно ведь не то, даст он правильный ответ за несколько секунд. Важно понять, как он ищет решение, как думает, как рассуждает, как ищет информацию. Хорош не тот программист, который знает все классы и методы сотни API, а тот, кто умеет быстро доходить до сути проблемы и знает как собрать нужную информацию для поиска решения, как поставить опыт (тест).

    Пользуйтесь, господа интервьюирующие! Идея бесплатна при условии ссылки на автора. Улыбка

    Read more...

  • CALM-нотация

    call-notation

    Иногда меня спрашивают, почему я так специфично именую переменные в своём коде? Несколько лет назад мне надоело постоянно писать идентификатор this перед именами полей-членов класса.

                string cheepCounter = "Use CALM notation!";
                this.cheepCounter++;
    
    

    Так приходится делать, если слепо следовать рекомендациям для C#-кода. Но рекомендации – это лишь рекомендации. Я много раз видел в коде использование префикса для полей-членов. Кто-то ставит подчёркивание, кто-то m, а кто-то и то и другое: m_. Здравое зерно в этом было, и я решил попробовать. Поля вообще желательно использовать как можно реже, заменяя их свойствами. А так сразу видно, что, возможно, стоит пересмотреть дизайн класса. Если так можно пометить поля, почему бы не пометить и другие идентификаторы, где это будет полезно? Мне показалось полезным добавить следующие условные обозначения: a – аргумент метода, l – локальная переменная, c – локальная константа. Я решил дать этой нотации имя CALM: Constant Argument Local Member, что значит: Constant Argument Local Member. Такое именование несёт следующие выгоды:

    • не нужно больше писать конструкцию this.fieldName,
    • если необходимо приведение типов какого-то аргумента, то можно не выдумывать какое-то другое имя: FrameworkElement lSender = (FrameworkElement) aSender;
    • константу легко отличить от переменной только по имени: cYouCanNotChangeMe,
    • строго говоря это даже не нарушает рекомендацию: имена переменных, параметров, полей и локальных констант начинаются с маленькой буквы,

    Хорошо, использовать префиксы не рекомендуется, например, венгерскую нотацию, но тут несколько другое дело. И в конце концов, рекомендованные правила можно нарушать, если есть достаточное основание их нарушить. Я считаю, такой подход имеет право на жизнь. А что думаете вы?

    Read more...

  • Windows Phone + Caliburn.Micro + Autofac

    Tags: windows phone, caliburn.micro, autofac

    Source code

    Недавно я начал экспериментировать с разработкой под Windows Phone. У меня уже есть некоторый опыт разработки под WPF и Silverlight с использованием шаблона MVVM и IoC-контейнера, поэтому эта задача не представляет для меня большой трудности. Как выяснилось, мой любимый MVVM-фреймворк Caliburn.Micro (CM) и любимый IoC-контейнер Autofac поддерживают эту платформу. Я засучил рукава и начал формировать скелет приложения. CM активно использует IoC-контейнер для своей работы. Можно использовать либо встроенный контейнер (SimpleContainer), либо ряд других, для которых существуют адаптеры для CM. Есть такой адаптер и для Autofac – Caliburn.Micro.Autofac, который я уже использовал для WPF-приложений. Это замечательно, однако бочку мёда, как обычно, испортила ложка дёгтя – адаптер Autofac для CM 1.3.1 (текущая версия) под Windows Phone не работает. До недавнего времени он даже не компилировался, но его автор David Buksbaum пару недель назад поправил это недочёт. Однако, так или иначе, приложения с его использованием не работают. Видимо David не разрабатывает сам приложений для Windows Phone и эта версия осталась недоработанной. Отказываться от любимой связки не хотелось и пришлось написать этот адаптер самостоятельно. Сегодня я представляю вашему вниманию эту реализацию.

    Read more...

  • Изучая Autofac. Динамическое создание объектов с помощью контейнера

    Tags: autofac

    Тестовый проект

    Autofac 2 – один из множества IoC-контейнеров для .NET. Я не стану рассказывать о том, что такое IoC-контейнер (Inversion of Control container), IoC (Inversion of Control) и DI (Dependency Injection), предполагая, что вы уже знаете об этом или можете узнать из других источников, например, здесь. Я буду рассказывать об одном из них – Autofac – по мере моего знакомства с ним. До этого я пользовался StructureMap, но по ряду причин он мне больше не подходит. В частности он давно уже не обновлялся, требует полного .NET Framework (в противовес .NET Framework Client Profile), нет версии для Windows Phone, версия для WinRT (Windows 8) не предвидится. Autofac, как я понял, избавлен от этих недостатков. Вряд ли у меня получится излагать материал последовательно, да я к этому и не стремлюсь. Просто буду описывать те возможности, которые меня заинтересовали в данный момент.

    Read more...

  • Подключение к MS SQL серверу с машины, не входящей в домен сервера

    Tags: mssql

    Взял работу домой, связанную с базами данных. Я дома, сервер на работе, в домене компании. Вроде бы всё просто: подключился по VPN, запустил SQL Server Management Studio, ввёл имя сервера баз данных, доменный логин и… И не тут-то было! В диалоге Connect to Server, если выбрана Windows Authentication, нельзя ввести логин, поле просто запрещено для изменения. Вроде бы можно подключиться с использованием SQL Server Authentication, но это не мой случай, мне нужна доменная аутентификация. Пока пытался решить эту ситуацию напоролся на сообщение об ошибке “Login failed for user. The user is not associated with a trusted SQL Server connection.” Порывшись в Сети нашёл решение, как часто бывает, простое, но весьма неочевидное. Если не мудрствовать лукава и не описывать первопричины, решение заключается в использование командной строки следующего вида:

    Read more...

  • Идея. Модуль Orchard CMS для организации небольшой библиотеки

    Tags: идея, orchard cms

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

    Read more...

  • Как сделать размер элементов вложенных списков одинаковым

    Tags: css, css3

    nested-lists

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

    .content-items ul, .content-items ol {  font-size: 1.4em; } 

    Read more...

  • Как подружить Facebook и Ваш сайт на Orchard CMS

    Tags: orchard cms, facebook

    Facebook + Orchard CMS

    Я расскажу как начать использовать возможности Facebook на Вашем сайте на основе Orchard CMS на примере кнопки Facebook Like. Возможности используемых модулей значительно шире, но я, к сожалению, пока не разбираюсь в этом. Просто решил начать исследовать этот вопрос и, по ходу изучения, кратко описать сам процесс. Буду исходить из предположения, что вы, как и я, пользуетесь русифицированными версиями Facebook и Orchard CMS.

    Read more...