• EntityFramework: (анти)паттерн Repository

    Repository Pattern
    Репозиторий является посредником между слоем доступа к данным и доменным слоем,
    работая как in-memory коллекция доменных обектов. Клиенты создают декларативные
    описания запросов и передают их в репозиторий для выполнения.
      — свободный перевод Мартина Фаулера

    EntityFraemwork предоставляет нам готовую реализацию паттернов Repository: DbSet<T> и UnitOfWork: DbContext. Но мне часто приходится видеть, как коллеги используют в своих проектах собственную реализацию репозиториев поверх существующих в EntityFraemwork.


    Чаще всего используется один из двух подходов:


    1. Generic Repository как попытка абстрагироваться от конкретного ORM.
    2. Repository как набор запросов к выбранной таблице БД (паттерн DAO).

    И каждый из этих подходов содержит недостатки.

    Читать дальше →
  • Конец халяве: I Also Know What You Download (часть 2)

      UPDATE: пост обновлен 11 мая 2017.

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

      NOTE: далее немного воды, и про баржу, и про канал, так что можно сразу переходить к разделу «Переходим к сути».

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

      В этом пути и возникло интересное продолжение по теме.

      image
      Читать дальше →
    • Создание сеток шестиугольников

      • Translation
      image

      Сетки из шестиугольников (гексагональные сетки) используются в некоторых играх, но они не так просты и распространены, как сетки прямоугольников. Я коллекционирую ресурсы о сетках шестиугольников уже почти 20 лет, и написал это руководство по самым элегантным подходам, реализуемым в простейшем коде. В статье часто используются руководства Чарльза Фу (Charles Fu) и Кларка Вербрюгге (Clark Verbrugge). Я опишу различные способы создания сеток шестиугольников, их взаимосвязь, а также самые общие алгоритмы. Многие части этой статьи интерактивны: выбор типа сетки изменяет соответствующие схемы, код и тексты. (Прим. пер.: это относится только к оригиналу, советую его изучить. В переводе вся информация оригинала сохранена, но без интерактивности.).
      Читать дальше →
    • Биологические предпосылки деградации компаний



        Современные научные представления говорят о существовании у процессов функционирования человеческого мозга определенных особенностей, которые:

        • на личном уровне подталкивают к прокастинации;
        • в стартапе по мере его успеха и роста приводят к потере прежней творческой «внутренней атмосферы» и нарастанию бюрократии;
        • в больших компаниях приводят к «иерархическому регрессу».

        Благодаря этим особенностям мышления человека, среднее время нормальной жизни коммерческих компаний составляет 15 лет, а изначальные «Империи добра», типа Гугл и Яндекс, неумолимо со временем приобретают черты «Империй зла».

        Некоторые компании сопротивляются этому, а некоторые даже и не понимают, почему приходит в упадок их внутренняя корпоративная культура. Почему попытки привить хорошие и правильные принципы и практики организации бизнеса не дают ожидаемых результатов…
        Читать дальше →
      • Утки, Таиланд и T-SQL… или что может подстерегать программистов при работе с SQL Server?

        • Tutorial

        Все начиналось довольно обыденно… Зачитывался Рихтером и усиленно штудировал Шилдта. Думал, что буду заниматься разработкой под .NET, но судьба на первом месяце работы распорядилась иначе. Один из сотрудников неожиданно покинул проект и во вновь образовавшуюся дыру докинули свежего людского материала. Именно тогда и началось мое знакомство с SQL Server.

        С тех пор прошло чуть меньше 6 лет и вспомнить можно многое…

        Про бывшего клиента Джозефа из Англии, который переосмыслил жизнь, за время отпуска в Таиланде, и в моем скайпе стал подписываться Жозефиной. Про веселых соседей по офису, с которыми приходилось сидеть в одной комнате: один страдал от аллергии на свежий воздух, а другой маялся от неразделенной любви к С++ дополняя это аллергией на солнечный свет. Один раз по команде свыше пришлось на время стать Александром отцом двух детей, чтобы изображать из себя обросшего скилами сениора по JS.
        Подробнее
      • Создание архитектуры программы или как проектировать табуретку

        Взявшись за написание небольшого, но реального и растущего проекта, мы «на собственной шкуре» убедились, насколько важно то, чтобы программа не только хорошо работала, но и была хорошо организована. Не верьте, что продуманная архитектура нужна только большим проектам (просто для больших проектов «смертельность» отсутствия архитектуры очевидна). Сложность, как правило, растет гораздо быстрее размеров программы. И если не позаботиться об этом заранее, то довольно быстро наступает момент, когда ты перестаешь ее контролировать. Правильная архитектура экономит очень много сил, времени и денег. А нередко вообще определяет то, выживет ваш проект или нет. И даже если речь идет всего лишь о «построении табуретки» все равно вначале очень полезно ее спроектировать.

        К моему удивлению оказалось, что на вроде бы актуальный вопрос: «Как построить хорошую/красивую архитектуру ПО?» — не так легко найти ответ. Не смотря на то, что есть много книг и статей, посвященных и шаблонам проектирования и принципам проектирования, например, принципам SOLID (кратко описаны тут, подробно и с примерами можно посмотреть тут, тут и тут) и тому, как правильно оформлять код, все равно оставалось чувство, что чего-то важного не хватает. Это было похоже на то, как если бы вам дали множество замечательных и полезных инструментов, но забыли главное — объяснить, а как же «проектировать табуретку».

        Хотелось разобраться, что вообще в себя включает процесс создания архитектуры программы, какие задачи при этом решаются, какие критерии используются (чтобы правила и принципы перестали быть всего лишь догмами, а стали бы понятны их логика и назначение). Тогда будет понятнее и какие инструменты лучше использовать в том или ином случае.

        Данная статья является попыткой ответить на эти вопросы хотя бы в первом приближении.
        Читать дальше →
      • Анализ хостеров и их тарифов на виртуальные серверы

          Привет, меня зовут Сергей, я редактор Хостинг Кафе. Каждый день я с утра до ночи пишу хостерам и задаю им много вопросов о них самих и их тарифах. Совсем недавно количество хостеров, которые представлены в каталоге HOSTING.cafe превысило 250, поэтому я решил сделать исследование о хостерах и их тарифах на виртуальные серверы, систематизировав информацию по различным параметрам. Если представленный материал окажется интересным, можно провести аналогичные исследования для виртуального хостинга, SSL сертификатов, лицензий и места для резервных копий.


          Читать дальше →
        • Умный дом или игрушка для мужчин: Интернет

            В качестве продолжения предыдущей статьи планировалась тема «ресурсосбережение». Но я скорректировал направление и решил начать описание технической части умного дома. Все-таки читатели здесь больше технари, чем экономисты. Хотя в последнее время всем нам предстоит начать экономить.

            Итак, к технике.


            Начнем по хронологии, чтобы всем все было понятно. Основы моего умного дома были заложены почти 2 года назад. Тогда считалось, что Интернет 2G на даче – это круто. Во всяком случае, я так считал. Если хочется 3G, то лезь повыше, на 2 этаж, залезай на табуретку около окна и не шевелись. Тогда было счастье – 3G, хоть и медленный. Я, как заядлый компьютерщик, решил усовершенствовать автоматизировать подъем на 2 этаж с табуреткой, купил роутер Zyxel, воткнул в него USB модем на проводе 1,8м, провод закрепил наверху около окна (все мы это проходили). Счастья стало больше. Теперь в доме можно было пользоваться Интернетом 3G со скоростью 1-2 Мбит.
            Читать дальше →
          • Как справиться с проблемами в унаследованном проекте после 3 других команд

              Данная статья не претендует на то, чтобы быть универсальным рецептом, мы постараемся в ней описать те проблемы, с которыми мы столкнулись, и их решения в проекте, который нам достался после 3 других команд.

              Вначале коротко опишем суть проекта. Есть доктора в клиниках, которые на специальные устройства надиктовывают информацию о пациенте и его визите. Затем эта информация переводится в текстовый вид (за это отвечает специальное подразделение, сотрудники которого слушают и набирают текст), текст проверяется, происходит заполнение шаблона. Потом происходит движение по Workflow, который включает в себя разные стадии с различной бизнес-логикой, потом происходит интеграция с несколькими внешними системами. И, наконец, печатается письмо пациенту и отсылается. А работа через некоторое время архивируется (но при этом она может быть восстановлена по необходимости).
              Читать дальше →
              • +17
              • 11.6k
              • 8
            • Неконстантные константные выражения

              • Translation
              // <какой-то код>
               
              int main ()
              {
                      constexpr int a = f ();
                      constexpr int b = f ();
               
                      static_assert (!= b, "fail");
              }

              Можно ли в приведенном выше фрагменте вместо комментария вставить такое определение f (), чтобы a получила значение, отличное от b?

              “Разумеется, нет!” — скажете вы, немного подумав. Действительно, обе переменные объявлены со спецификатором constexpr, а значит, f () тоже должна быть constexpr-функцией. Всем известно, что constexpr-функции могут выполняться во время компиляции, и, как следствие, не должны зависеть от глобального состояния программы или изменять его (иными словами, должны быть чистыми). Чистота означает, что функция при каждом вызове с одними и теми же аргументами должна возвращать одно и то же значение. f () оба раза вызывается без аргументов, поэтому должна оба раза вернуть одно и то же значение, которое и будет присвоено переменным a и b… правильно?

              Еще неделю назад я знал, что это правда, и действительно думал, что невозможно пройти static_assert в приведенном выше фрагменте, не допуская неопределенного поведения.

              Я ошибался.
              Увиденное под катом уже не развидеть
            • 12 малоизвестных фактов о CSS

              Предлагаю читателям «Хабрахабра» перевод статьи «12 Little-Known CSS Facts (The Sequel)». Она совсем недавно была упомянута в дайджесте интересных материалов из мира веб-разработки и IT.

              Update: немного «шлифанул» перевод напильником. Выражаю благодарность всем неравнодушным читателям.
              Внимание! Под катом почти 1.5 Мб картинок и много интересных ссылок.

              Итак, начнём-с…

              1. В свойстве border-radius можно использовать slash-синтаксис.


              Об этом уже писалось 4 года назад, но многие новички и даже некоторые опытные разработчики не знают о существовании этой «фишки».

              Верите или нет, но следующий код валиден:

              .box {
                border-radius: 35px 25px 30px 20px / 35px 25px 15px 30px;
              }
              

              Читать дальше →
            • Откровения метапрограммиста. Программируем программный код на этапе компиляции, используем шаблоны C++ для нешаблонных решений

              • Tutorial


              Шаблоны можно назвать самым главным отличием и основным преимуществом языка C++. Возможность создать шаблон алгоритма для различных типов без копирования кода и со строгой проверкой типов — это лишь один из аспектов использования шаблонов. Код специализаций шаблона строится на этапе компиляции, а это значит, что поведением создаваемых типов и функций можно управлять. Как тут удержаться от возможности попрограммировать компилируемые классы?

              Метапрограммирование становится столь же неотъемлемой частью написания кода на C++, как и использование стандартной библиотеки, часть которой создана именно для использования на этапе компиляции. Сегодня мы произведем на свет библиотеку безопасного приведения скалярных типов C++, метапрограммируя шаблонами!
              Читать дальше →
              • +15
              • 25.7k
              • 2
            • Ускорение загрузки Windows for fun and profit

                image Пожалуй, начну с того, что если перегружаться 15 раз в год, то любой «тюнинг» процесса загрузки отнимает больше времени, чем будет выиграно на перезагрузках за все время жизни системы. Однако, спортивный интерес берет свое, тем более, что люди интересуется процессом оптимизации быстродействия. А загрузка оказалась самым очевидным кандидатом в примеры того, как на мой взгляд должен выглядеть этот самый процесс. Сразу скажу, что грузиться будем с 5400 rpm винта, грузиться будем в «рабочую» систему: помимо недобитой вендорской крапвари там стоит еще куча всякого типа вижуал студии, антивируса, скайпа, стима, гуглапдейтера и пр…

                Про то, почему отключение pagefile-а скорее вредно, чем полезно — как нибудь в другой раз, а пока…
                Под катом много однообразных картинок и немножко унылого текста
              • Что такое скрипты и с чем их едят — Lua & C++

                • Tutorial
                Добрый день, Хабрахабр!
                Решил написать этот топик на тему скриптов

                Что нужно знать?


                • С++ на приличном уровне (в уроке будут шаблоны — template)
                • Lua, очень легкий скриптовый язык. Советую этот урок.

                Почему писать диалоги игры в .cpp файле было большой ошибкой


                Если вы разрабатывали большие проекты (к примеру, масштабные игры), замечали, что с каждой новой сотней строк кода компиляция идет медленней?
                В игре создается больше оружия, больше диалогов, больше меню, больше etc.
                Одна из самых главных проблем, возникающих в связи с нововведениями — поддерживать бессчетное множество оружия и бейджиков довольно сложное занятие.
                В ситуации, когда просьба друга/босса/напарника изменить диалог или добавить новый вид оружия занимает слишком много времени, приходится прибегать к каким-то мерам — например, записи всей этой фигни в отдельные текстовые файлы.
                Почти каждый геймдевелопер когда-нибудь делал карту уровней или диалоги в отдельном текстовом файле и потом их считывал. Взять хотя бы простейший вариант — олимпиадные задачи по информатике с файлом ввода

                Но есть способ, на голову выше — использование скриптов.

                Читать дальше →
              • Lock-free структуры данных. 1 — Начало


                  Я надеюсь, что эта статья станет началом цикла заметок о lock-free структурах данных. Я хочу поделиться с хабрасообществом своим опытом, наблюдениям и размышлениями о том, что такое lock-free структуры данных, как их реализовывать, подходят ли концепции контейнеров стандартной библиотеки STL к lock-free контейнерам, и когда стоит (и стоит ли вообще) применять lock-free структуры данных.

                  Читать дальше →
                • Поиск пропавшего android-смартфона и управление удаленным девайсом. Сервис Reptilicus



                    Так уж повелось, что некоторые мои знакомые и родственники теряют достаточно дорогие смартфоны с завидной (или не очень) регулярностью. При этом некоторые умудряются брать дорогущие смартфоны в кредит, и терять их в первую же неделю (это случилось совсем недавно). Не так давно пара таких пострадавших спросили меня о программе/сервисе, которая позволяла бы находить утраченное. К своему стыду, я не смог сразу найти искомое – у самого телефон от HTC, у них есть простенький сервис поиска (рассчитанный скорее, на поиск телефона, оброненного среди кучи вещей в собственной квартире). Я решил все же найти что-то надежное, функциональное и отечественное. И нашел, причем оказалось, что и ходить далеко не нужно – искомый сервис/приложение относительно недавно создан соотечественником. Я видел несколько похожих сервисов, в процессе поиска, но этот оказался наиболее функциональным и да, как бы родным. Речь идет о Reptilicus. В продолжении — описание сервиса (двухэтапное: возможности сервиса + собственные примеры использования)…

                    Читать дальше →