• Синхронизация структуры базы данных между приложениями
    +2
    Только недавно читал статью по теме Alexander Tsvetkov — 5 Ways To Manage Database Schema Changes in 2017 (in .NET)
  • Почему программисты не могут программировать
    0
    Любителям однострочников:
    for (let i = 1, s = ''; i < 101; i++) (s = (i % 3 ? '' : 'Miss') + (i % 5 ? '' : 'Kiss')) && setTimeout(function() { console.log(s); }, 50 * i);
    
  • Тёмные паттерны LinkedIn или Почему вам спамят друзья, призывая зарегистрироваться в LinkedIn
    +4
    Автор, видимо, ещё не получал каждый месяц письмо всё-таки проимпортировать адресную книгу, потому что «80% людей находят работу через людей, которых они знают».
  • Redmine на MySQL с RocksDB быстрее, чем с InnoDB, от 20% до 3 раз
    0
    Если кому интересно, небезисвестный Parse использовал RocksDB в MongoDB ещё в 2015 (MongoDB + RocksDB at Parse).
  • Visual Studio для Mac и другие новости конференции Connect(); //2016
    +4
    Самой неожиданной новость про SQL Server 2016 стало то, что все возможности Enterprise версии стали доступны в SP1 для Standard и Express.
  • Как мы попробовали DDD, CQRS и Event Sourcing и какие выводы сделали
    +1
    Статья годная, спасибо. На мой взгляд есть проблема over engineering и перекос в сторону strong consistency. Как результат «Обработчик команды может возвращать значение.» и маштабирование через async/await. Если есть опыт работы с eventual consistency реализацией, то будет интересно прочитать аналогичную квинтэссенцию.
  • Условное внедрение зависимостей в ASP.NET Core. Часть 1
    0
    А есть ли необходимость сверяться с Environment в любой точке решения? Может просто задать начальные зависимости и абстрагировать остальные компоненты?
  • Условное внедрение зависимостей в ASP.NET Core. Часть 1
    0
    Ок, но вопрос о преимуществах новой модели над старой.
  • Условное внедрение зависимостей в ASP.NET Core. Часть 1
    +1
    Скажите, а чем Environments лучше Conditional compilation symbols, которые позволяют не тащить с собой ненужный в заданном окружение код?
  • Client-side Linq to NHibernate
    0
    Извините, но чем не подошёл WCF Data Services, реализация OData для NHibernate? Я вижу как преимущества хорошо описанный протокол, контроль над тем, какие запросы допускается использовать клиенту, возможность простого вызова через любой http client, нет протекающих абстракций вида PostQuery.
  • Все, что хотел
    +1
    Hotel – приют для localhost

    Со словом приют больше Hostel ассоциируется :)
  • Первичный ключ – GUID или автоинкремент? Часть вторая
    +1
    Странно, что никто не упомянул алгоритм генерации ObjectId из MongoDB:
    ObjectId is a 12-byte BSON type, constructed using:

    a 4-byte value representing the seconds since the Unix epoch,
    a 3-byte machine identifier,
    a 2-byte process id, and
    a 3-byte counter, starting with a random value.
  • Как работают замыкания (под капотом) в JavaScript
    0
    В своё время, с пониманием как работают замыкания под капотом, очень помог труд Nicholas C. Zakas JavaScript for Web Developers.
  • Bootstrap 4 вышел в alpha версии
    +4
    Не спешите, известный tweet от создателя Bootstrap, Марка Отто:
    Oh, btw—Bootstrap 4 will be in SCSS. And if you care, v5 will likely be in PostCSS because holy crap that sounds cool.
  • Документируем код эффективно при помощи Doxygen
    0
    В своё время для C# перешёл с Doxygen на Sandcastle. Сейчас проверил развитие Sandcastle на Codeplex остановилось в 2010, но нашёлся добрый человек, который сделал форк, выложил на GitHub и даже выпустил Help File Builder and Tools v2015.1.12.0.
  • Microsoft покупает компанию-разработчика Minecraft за 2 миллиарда долларов США
    +4
    В то время как Facebook купил шлем виртуальной реальности Oculus Rift, Microsoft просто не стал заморачиваться и купил другую реальность.
  • 18 неожиданностей при чтении исходного кода jQuery
    0
    тоже верно, хотя сам предпочитаю не передавать, не так уж часто undefined используется в чистом виде
  • 18 неожиданностей при чтении исходного кода jQuery
    0
    Когда-то давно прочитал в одной из статей о jQuery, зачем в функцию вставляется аргумент с названием undefined.

    Потому что undefined, который на самом деле переменная window.undefined, может быть перекрыт. А в вашем примере self-invoking function, код внутри начинает использовать undefined параметр, переданный в функцию, который неожиданно без инициализации имеет значение примитивного типа undefined.
  • JQuery Deferred — примеры использования
    +3
    Примеры хорошие, но на мой взгляд есть небольшая подмена понятий в Deferred Object и Promise Object (который я бы переводил как промис). Последний получается из первого путём вызова метода promise на объекте jQuery.Deferred:
    function example() {
      var dfd = new jQuery.Deferred();
     
      // Resolve
      // Reject
      // Notify
     
      // Return the Promise so caller can't change the Deferred
      return dfd.promise();
    }
    

    Сам Promise Object согласно справке:
    This object provides a subset of the methods of the Deferred object (then, done, fail, always, pipe, and state) to prevent users from changing the state of the Deferred.

    Т.е., в моём понимании, Promise Object это результат работы, а Deferred Object — способ повлиять на неё.
  • Опыт использования TFS после перехода с SVN
    +6
    По моему опыту могу сказать что если компания переходит на TFS, то это означает, что она уже давно и плотно сидит на продуктах Microsoft и никуда не собирается мигрировать.
  • Опыт использования TFS после перехода с SVN
    +4
    Для разработчиков они стремятся к 0, т.к. число достойных аналогов очень велико. Но решения в вопросах на что покупать лицензию часто зависит от людей, которым важно видеть ситуацию по проекту в режиме «реального времени». И тут Microsoft есть, что продать — красивые диаграммы, отчеты по трудозатратам, интеграция с Microsoft Project и Microsoft SharePoint, и т.д.
  • WCF + Cross Domain Ajax Calls (CORS) + Авторизация
    +1
    IE8/9 используют для CORS-запросов специальный объект XDomainRequest, отличный от XMLHttpRequest и неимеющий поддержки в jQuery. Если такая поддержка нужна, рекомендую расширение jQuery ajaxTransport
  • Непайтоновый Пайтон
    +1
    for(var i = 1, s = ''; i < 101; i++) (s = (i % 3 ? '' : 'Fizz') + (i % 5 ? '' : 'Buzz')) && console.log(s);
  • Автоматическое обновление программ на C#. Часть 2
    0
    В WebClient есть Dispose, не стесняйтесь обернуть его в using.
  • Автоматическое обновление программ на C#
    +1
    Ох, с ним много что не так. Особенно доставляет, что встроенный метод CheckForDetailedUpdate для проверки новой версии после определённого числа вызовов кидает COMException из-за ошибки в реализации. Чтобы этого избежать нужно самостоятельно выкачивать манифест приложения и сверять версию программы. И таких граблей там на каждом шагу. Однако, предпочитаю доработать напильником, чем изобретать свой велосипед.
  • Пять вещей, которые нужно учесть, продумывая архитектуру интернет‑магазина
    +1
    По-моему, с вашим подходом всё в порядке. Данных у вас, я так понимаю, не то чтобы очень много, поэтому запросы хоть и (относительно) тяжёлые, но могут кэшироваться.


    Да уж на BigData не перетендую. Кеширование поднял не сразу, так как без него работало приемлемо. Единственное, что тормозило это пересчёт количества товаров для каждой опции фильтра, но это решилось кешированием на уровне бд.

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


    Шаблон уже выбирается в UI в зависимости от этой величины, культуры и задачи.

    Но в целом я думаю, что если с вашим объёмом данных (тут, пожалуй, важно не только количество товаров, но и количество свойств) это работает достаточно быстро, то почему бы и нет. Хотя интереса ради можете попробовать посчитать, сколько уходит времени на обработку свойств и посмотреть, какие именно используются SQL-запросы. На основе этого обычно можно примерно прикинуть, какую нагрузку система сможет нормально выдержать (ну, а потом, в идеале, провести полноценное нагрузочное тестирование).


    Магазин достаточно специфически и большая нагрузка не ожидается, но померить конечно нужно. В основном запросы оптимизировал, а в UI так чтобы уложиться в комфортное время загрузки для пользователя. Так что, мест где можно прооптимизировать достаточно.

    Спасибо за ответ и статью.
  • Пять вещей, которые нужно учесть, продумывая архитектуру интернет‑магазина
    +1
    Использую такую структуру Products — ProductAttributes — ProductAttributeValues.

    Сущность Product включает в себя общие свойства продукта вроде имени, цены, описания, ссылки на изображение + набор динамических аттрибутов.

    Сущность ProductAttribute описывает свойство продукта, которое может быть чем угодно, например, на свойство мощность ссылаются холодильники и пылесосы, но не сковородки. Кроме того, описываем тип данных строка, число, и т.д. и такие метаданные как единица измерения, например, вольты, что в основном нужно для отображения.

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

    Т.е. структура достаточно простая и эффективная и легко расширяется, до описанных задач. В принципе 50 000 товаров и особых проблем не испытываю + легко строить фильтры. Единственное, что пришлось перестроить мышление с традиционного подхода с наследованием и добавлением отличных свойств продукта в сторону более менее плоской структуры свойств и работы с ними как с массивом.

    Хотелось бы спросить что вы думаете о таком подходе и какие подводные камни могут быть?
  • Статистика использования javascript-библиотек и CDN
    +1
    Тоже задумывался над вопросом локального хранилища популярных библиотек таких как jQuery. Но потом понял, то такое хранилище уже есть и предлагает много больше, чем я мог себе представить. Называется оно — кеш браузера. В самом деле, если браузеру приходится опрашивать CDN в поисках нужной библиотеки для сайта, для другого сайта она с большей степенью вероятности уже будет в кеше (естественно, если оба сайта обращаются к CDN по одному url). Уже потом я нашёл статью уважаемого Dave Ward aka Encosia, которая называется 6,953 reasons why I still let Google host jQuery for me. В этом труде 2010 года приводится аналогичная статистика и один из выводов:
    sites must reference exactly the same CDN URL in order to obtain the cross-site caching benefit
  • События C# по-человечески
    +7
    Запомните! Если Вы не подписались на событие и его делегат пустой, возникнет ошибка.
    Чтобы избежать этого, необходимо подписаться, или не вызывать событие вообще, как показано на примере (Т.к. событие — делегат, то его отсутствие является «нулевой ссылкой» null).


    Пример, сам по себе, является образцом как не нужно делать, между проверкой и вызовом, может произойти отписывание от события и тогда получим NullReferenceException. Выходов из этой ситуации ровно два. Первый — копируем событие в локальную переменную и работаем с ней, второй — в месте инициализации класса добавляем пустой обработчик для события, исключая ситуацию, когда на него никто не подписан и оно равно null.
  • Как мы в Канадские акселераторы подавались и интервью проходили
    +1
    Kitchener это не часть Toronto, а городок на 200к жителей в GTA (Grand Toronto Area). До самого Toronto полтора часа на машине. Kitchener практически слился с городом Waterloo и недалеко есть город Cambridge. Часто говорят Kitchener-Waterloo area или Tri-City, добавляя Cambridge. В сумме в Tri-City проживает ~350к жителей, что не так плохо по сравнению с остальными городами. На фоне этого советую выбирать Vancouver, а не провинциальный Kitchener.
  • Расширение Chrome для смягчения громких заголовков новостей
    +1
    Пользуюсь Disconnect. Блокирует не только социальные кнопки, но также различную аналитику.
  • Windows Azure Mobile Services custom API на примере скрам-доски
    0
    Идём во вкладку “Dashboard” и в колонке “Quick glance” кликаем по “Setup source control”. На момент написания статьи эта опция находилась в состоянии превью.

    Одна картинка сто́ит тысячи слов
  • Руки с мылом мыли? Тогда чай без сахара
    0
    Интернет-магазин строят в Manning — MongoDB in Action (2011), написано без учёта Aggregation framеwork, но большая часть проблем затронута.
  • Как жить без const?
    0
    Всегда пожалуйста, только используйте специальный тег для ссылки на хабрапользователя Ithilgwau.
  • Runtime-генерирование .Net-кода для тех, кому некогда
    0
    Добавьте, пожалуйста, в публикации немного устаревшую, но от этого не менее ценную статью Алгоритмы кодогенерации.
  • Как жить без const?
    0
    Декоратор служит для динамического подключения поведения, у меня ничего динамического тут нет.

    Необязательно. Вы декорировали ваш читающий класс методами записи.
    Кстати, там для получения reader'а вообще можно поставить __inline.

    MethodImplOptions.AggressiveInlining, если хотите дать совет JIT.
  • Как жить без const?
    0
    Ок, мы добрались до места, где ваша полная реализация делегирует методы чтения реализации только для чтения, в то время как мой вариант реализации только для чтения делегирует методы чтения полной реализации. Итого, если отбросить интерфейсы, можно утверждать, что ваша read-only версия читает данные быстрее, т.к. нет дополнительного вызова, в то время как моя full версия читает быстрее по тем же причинам. И могу с увереностью сказать, что вы реализовали Декоратор))
  • Как жить без const?
    0
    Т.е. продублировать все read вызовы из VectorConst в Vector? А в сторонние методы передавать через Reader, чтобы избежать downcast?
  • Как жить без const?
    0
    Если вызывать свойство Reader каждый раз при любой операции получится то же, что и у Вас. А при передаче VectorConst в другой метод, Reader или оператор преобразования вызовется только один раз. Получается, что, как ни крути, это выгоднее «Адаптера».

    С задачей передачи read-only объекта в метод ваш пример справляется на 100%
    Если свойство Reader настолько уж раздражает, можно запихать его в Vector. пометив как private, и перенаправлять к нему реализацию IVectorConst (или Вашего IReadOnlyVector). И даже это всё равно будет лучше «Адаптера», т.к. вызовы будут происходить не через интерфейс и останется разделение ответственности.

    Меня как пользователя не устраивает, что я должен писать в одно место и читать из другого. Если вы «запихаете VectorConst в Vector» и «пометите его как private» это никак не повлияет, что мне нужно вызывать Reader каждый раз чтобы что-то прочитать.
  • Как жить без const?
    0
    В данном случае, дублирования нет.

    Ещё раз посмотрел на вашу реализацию и понял, что все методы чтения вы предлагаете делать через Reader. Т.е. если мне не нужен read-only доступ, я как пользователь вашего класса вынужден писать:

    var v = new Vector<int>(5);
    
    v[0] = 0;
    Console.WriteLine(v.Reader[0]);    
    

    Это так? Вы сознательно поделили read и write версии? Обращение через дополнительно свойство в данном случае не overhead и потеря производительности? Удобно ли это в использовании для конечного пользователя?