• PostgreSQL Antipatterns: ударим словарем по тяжелому JOIN

      Продолжаем серию статей, посвященных исследованию малоизвестных способов улучшения производительности «вроде бы простых» запросов на PostgreSQL:


      Не подумайте, что я так сильно не люблю JOIN… :)

      Но зачастую без него запрос получается ощутимо производительнее, чем с ним. Поэтому сегодня попробуем вообще избавиться от ресурсоемкого JOIN — с помощью словаря.


      Читать дальше →
    • Основы CQRS

        Данная статья основана на материале из различных статей по CQRS, а также проектов, где применялся такой подход.

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

        Поэтому при разработке зачастую можно наблюдать одни и те же проблемы в организации кода и архитектуры, а также в их усложнении. При неправильном подходе к проектированию рано или поздно может наступить момент, когда код становится настолько сложным и запутанным, что каждое внесение изменений требует все больше времени и ресурсов.
        Читать дальше →
      • Каковы перспективы у «немодной» платформы .NET — мнения экспертов



          Платформа .NET появилась в начале 2000-х годов. Она объединяла «под одной крышей» несколько языков программирования, что было в новинку для того времени. Но разработчики платформы утверждали, что это новшество несет несомненную пользу: программисты начали создавать свои приложения на тех языках, которые знали лучше всего, которые лучше подходили для решения своих задач.

          Еще одним новшеством платформы .NET была технология активных серверных страниц ASP.NET (Active Server Page). С её помощью можно было относительно быстро разработать веб-приложения, взаимодействующие с базами данных. Важной особенностью ASP.NET считалась возможность использования всей мощи объектно-ориентированного программирования для веб-разработки. Приложения, написанные с использованием этой технологии, обладают лучшей производительностью и защитой. По крайней мере, в это верили инженеры Microsoft.
          Читать дальше →
        • Готовим Xamarin.Forms: настройка окружения и первые шаги



            Друзья! Мы продолжаем колонку на тему разработки мобильных приложений на Xamarin. И
            после небольшого перерыва готовы вернуться к рассмотрению особенностей использования Xamarin.Forms при разработке бизнес-приложений для iOS и Android. Все статьи из колонки можно будет найти и прочитать по ссылке #xamarincolumn

            В сегодняшней статье мы рассмотрим вопросы производительности приложений и оптимизации самого процесса разработки.

            Правильные пчелы


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

            Начнем мы с компьютеров, на которых будет идти разработка.
            Читать дальше →
            • +20
            • 19,9k
            • 8
          • Устранение дублирования Where Expressions в приложении

              Допустим, у вас есть товары и категории. В какой-то момент клиент сообщает, что для категорий с рейтингом > 50 необходимо использовать другие бизнес-процессы. У вас достаточно опыта и вы понимаете, что где сегодня 50 завтра будет 127.37 и хотите избежать появления магических чисел в коде, поэтому делаете так:

                  public class Category : HasIdBase<int>
                  {
                      public static readonly Expression<Func<Category, bool>> NiceRating = x => x.Rating > 50;
              
                     //...
                  }
              
                  var niceCategories = db.Query<Category>.Where(Category.NiceRating);
              

              К сожалению, этот номер не пройдет, если вы хотите выбрать продукты из соответствующих категорий, потому что NiceRating имеет тип Expression<Func<Category, bool>>, а в случае с Product нам потребуется Expression<Func<Product, bool>>. То есть, необходимо осуществить преобразование Expression<Func<Category, bool>> => Expression<Func<Product, bool>>.

                  public class Product: HasIdBase<int>
                  {
                      public virtual Category Category { get; set; }
              
                     //...
                  }
              
                  var niceProductsCompilationError = db.Query<Product>.Where(Category.NiceRating); // так нельзя!
              

              К счастью, осуществить это довольно просто!
              Код под катом
            • Применение FitNesse для .Net приложений

              Привет, хабр.

              Я думаю, многие из вас слышали про такую штуку, как FitNesse. Это одна из технологий тестирования, где тесты создаются как wiki-разметка (т.е. каждый тест — это web страница), и потом запускаются на определенной технологии (Java, .Net, PowerShell и пр.)

              В этой статье я расскажу про пример использования FitNesse для тестирования .Net приложения. И заодно покажу несколько приемов и трюков, чтобы сократить Ваше время разработки. Кстати, все эти технологии абсолютно бесплатны.
              Поехали
            • Как мы попробовали DDD, CQRS и Event Sourcing и какие выводы сделали

                Вот уже около трех лет я использую в работе принципы Spec By Example, Domain Driven Design и CQRS. За это время накопился опыт практического применения этих практик на платформе .NET. В статье я хочу поделиться нашим опытом и выводами, которые могут быть полезными командам, желающим использовать эти подходы в разработке.

                Факты, цифры, код
              • Как выбрать момент для отправки письма

                  Знаете ли вы, что письмо потенциальному клиенту с коммерческим предложением лучше всего отправлять с полудня и до трёх часов дня, лучший день для приглашения на вечеринку — пятница, а рекламные рассылки интернет-магазинов лучше всего делать с 19 и до 22 часов?

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

                  Начнём с того, как выбрать день для отправки вашего письма.



                  Под катом — расшифровка данных и материал о выборе времени для отправки в течение дня.

                  Читать дальше →
                  • +37
                  • 65,5k
                  • 9
                • Закат Stack Overflow

                  • Перевод
                  Как тролли захватили ваш любимый сайт вопросов и ответов по программированию

                  Сайт Stack Overflow был создан в 2008 году Джеффом Этвудом и Джоэлем Спольским как более открытая альтернатива возникшим ранее аналогичным сайтам, таким как, например, Experts-Exchange. Название для сайта было выбрано голосованием в апреле 2008 года читателями популярного блога по программированию Coding Horror, который вёл Этвуд.

                  Многие годы сайт Stack Overflow был одним из самых популярных ресурсов для программистов, пытающихся решить какую-то проблему. Поскольку вопросы, размещавшиеся на Stack Overflow, часто оказывались среди первых, которые выдавал Google в каком-либо поиске, относившемся к программированию, то пользователи массово приходили на сайт и начинали задавать свои собственные вопросы.

                  На июль 2015 года у Stack Overflow было более 4 млн. зарегистрированных пользователей и почти 10 млн. вопросов (без учёта удалённых пользователей и вопросов). Однако в исследовании 2013 года было выявлено, что 77% пользователей задают только один вопрос, 65% отвечают только на один вопрос и лишь 8% пользователей дают ответы на более чем 5 вопросов. В настоящей статье я хотел бы рассмотреть возможные причины такого чрезвычайно низкого процента.
                  Читать дальше →
                • Скринкаст: монада Maybe на языке C#

                    Небольшая иллюстрация того, как на языке C# реализовать монаду Maybe и зачем это вообще нужно. Смотреть видео рекоммендуется в разрешении 720p.



                    Сопутствующую статью можно найти тут (англ. яз.). Комментарии приветствуются!
                  • Событийная модель на основе async и await

                    В далеком 2012, когда цена на нефть еще была трехзначной, а трава зеленее, майкрософтом был выпущен .NET 4.5, а с ним и конструкция async/await. Про неё написано уже довольно много статей (Async в C#), а большинство разработчиков C# хорошо её изучили. Но все ли варианты использования были рассмотрены, можно ли выжать из await немного больше?

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

                    В классическом варианте это выльется в использование CancellationToken для обработки отмены, try catch для обработки разрыва соединения и код анализа возвращенных данных, для оценки результата запроса. Но можно ли уместить всё это в единой парадигме? В этот статье я предлагаю рассмотреть альтернативный подход, основанный на событийной модели с использованием синтаксического сахара async/await.
                    Читать дальше →
                  • MugenMvvmToolkit — кроссплатформенный MVVM фреймворк

                      MugenMvvmToolkit


                      Введение


                      Паттерн MVVM хорошо известен, о нем написано много статей, наверное каждый NET-разработчик сталкивался или слышал об этом паттерне. Цель этой статьи – рассказать о собственной реализации этого паттерна.
                      MugenMvvmToolkit — является кроссплатформенной реализацией паттерна MVVM и на текущий момент поддерживает следующие платформы:
                      • WinForms
                      • WPF
                      • Silverlight 5
                      • Silverlight for WP7.1, WP8, WP8.1
                      • Xamarin.Android
                      • Xamarin.iOS
                      • Xamarin.Forms
                      • WinRT XAML framework for Windows 8 Store apps

                      Читать дальше →
                    • Новшества C# 7

                        На втором дне конференции Build 2016 Dustin Campbell и Mads Torgersen рассказали про новые конструкции в языке C#.
                        Оригинал презентации на английском можно посмотреть здесь.



                        В этой статье собран полный обзор новых конструкций языка, некоторые из них уже доступны в Visual Studio 2015 Update 2.
                        Грядёт что-то грандиозное
                      • The dangers of not looking ahead

                          На первый взгляд, dynamic в C# — просто object с поддержкой машинерии компилятора. Но не совсем.

                          Ядром времени выполнения является DLR (Dynamic Language Runtime) — подсистема/фреймворк для поддержки динамических языков программирования. Существует реализация под собственно C#, который идет в поставке с .NET, и отдельная для Iron-языков.

                          Когда мы работаем с обобщениями (generics), то CLR имеет свои оптимизации на предмет специализации оных. В тот момент, когда CLR+DLR должны работать с generics вместе, поведение написанного кода может стать непредсказуемым.
                          Читать дальше →
                        • Пять советов тому кто публикует свой .Net проект на GitHub

                            GitHub Octocat Professor

                            Статья рассчитана в первую очередь на новичков и тех кто только собирается опубликовать свой первый проект на GitHub. Те у кого уже есть опубликованные проекты также могут почерпнуть что-то полезное и написать свои лучшие практики в комментариях. В статье представлены пять простых советов как улучшить ваш GitHub проект.

                            Читать дальше →
                          • Как обойтись почти без исключений, заменив их уведомлениями

                            • Перевод
                            Здравствуйте, Хабр.

                            Иногда попадаются статьи, которые хочется перевести просто за имя. Еще интереснее, когда такая статья может пригодиться специалистам по разным языкам, но содержит примеры на Java. Совсем скоро надеемся поделиться с вами нашей новейшей идеей по поводу издания большой книги о Java, а пока предлагаем ознакомиться с публикацией Мартина Фаулера от декабря 2014, которая до сих пор не была переведена на русский язык. Перевод сделан с небольшими сокращениями.
                            Читать дальше →
                          • Замена выброса исключений уведомлениями

                            Предлагаю вашему вниманию перевод статьи "Replace Throw With Notification" Мартина Фаулера. Примеры адаптированы под .NET.

                            Если мы валидируем данные, обычно мы не должны использовать исключения, чтобы известить о валидационных ошибках. Здесь я опишу как отрефакторить такой код с использованием паттерна «Уведомление» («Notification»).



                            Недавно я смотрел на код, который делал базовую валидацию входящих JSON сообщений. Это выглядело примерно так…
                            Читать дальше →
                          • Видеозаписи семинара CLRium #2

                              Добрый день! Не так давно прошла серия семинаров CLRium по новейшим технологиям и редко-раскрываемым темам CLRium #2. Мы собрали у себя в залах около 740 человек, что для нас является — фантастическим результатом. Сегодня хотелось представить вам свежие видеозаписи семинара и ссылки на репозитории спикеров:

                              День 1:

                              Ссылки с привязкой ко времени:

                              Читать дальше →
                            • Подходы к проектированию RESTful API


                                Автор: Вячеслав Михайлов, Solutions Architect.

                                В этой статье я поделюсь опытом проектирования RESTful API — на конкретных примерах покажу, как делать хотя бы простые сервисы красиво. Также мы поговорим, что такое API и зачем он нужен, поговорим об основах REST — обсудим, на чем его можно реализовывать; коснемся основных веб-практик, которые зависят и не зависят от этой технологии. Также узнаем, как составлять хорошую документацию, затрачивая на это минимум усилий, и посмотрим, какие существуют способы нумерации версий для RESTful API.

                                Часть 1. Теория


                                Итак, как мы все знаем, API — application programming interface (интерфейс программирования приложений), набор правил и механизмов, с помощью которых одно приложение или компонент взаимодействует с другими

                                Почему хороший API — это важно?

                                • Простота использования и поддержки. Хороший API просто использовать и поддерживать.
                                • Хорошая конверсия в среде разработчиков. Если всем нравится ваш API, к вам приходят новые клиенты и пользователи.
                                • Выше популярность вашего сервиса. Чем больше пользователей API, тем выше популярность вашего сервиса.
                                • Лучше изоляция компонентов. Чем лучше структура API, тем лучше изоляция компонентов.
                                • Хорошее впечатление о продукте. API — это как бы UI разработчиков; это то, на что разработчики обращают внимание в первую очередь при встрече с продуктом. Если API кривой, вы как технический эксперт не будете рекомендовать компаниям использовать такой продукт, приобретая что-то стороннее.


                                Теперь посмотрим, какие бывают виды API.

                                Виды API по способу реализации:
                                • Web service APIs
                                  • XML-RPC and JSON-RPC
                                  • SOAP
                                  • REST

                                • WebSockets APIs
                                • Library-based APIs
                                  • Java Script

                                • Class-based APIs
                                  • C# API
                                  • Java



                                Виды API по категориям применения:

                                • OS function and routines
                                  • Access to file system
                                  • Access to user interface

                                • Object remoting APIs
                                  • CORBA
                                  • .Net remoting

                                • Hardware APIs
                                  • Video acceleration (OpenCL…)
                                  • Hard disk drives
                                  • PCI bus



                                Читать дальше →
                              • Реализация потокобезопастного алгоритма round-robin на Java

                                Доброго времени суток, уважаемый хабрачитатель.
                                В один прекрасный рабочий день начальство поставило задачу добавить в разрабатываемую нами систему возможность использовать несколько серверов для повышения производительности. Разворачивать кластер и осуществлять балансировку за счет специализированных средств возможности не было. Поэтому пришлось придумывать свою реализацию, используя алгоритм round-robin.
                                Читать дальше →