• Примеры использования Moq

      Moq – это простой и легковесный изоляционный фреймврк (Isolation Framework), который построен на основе анонимных методов и деревьев выражений. Для создания моков он использует кодогенерацию, поэтому позволяет «мокать» интерфейсы, виртуальные методы (и даже защищенные методы) и не позволяет «мокать» невиртуальные и статические методы.

      ПРИМЕЧАНИЕ
      На рынке существует лишь два фрейморка, позволяющих «мокать» все, что угодно. Это TypeMockIsolator и Microsoft Fakes, доступные в Visual Studio 2012 (ранее известные под названием Microsoft Moles). Эти фреймворки, в отличие от Moq, используют не кодогенерацию, а CLR Profiling API, что позволяет вклиниться практически в любой метод и создать моки/стабы даже для статических, невиртуальных или закрытых методов.
      Читать дальше →
      • +21
      • 111k
      • 3
    • Реализации кэша в C# .NET

      • Translation
      Привет, Хабр! В преддверии старта курса «C# ASP.NET Core разработчик», подготовили перевод интересного материала о реализации кэша в C#. Приятного прочтения.




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

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

      Кэширование отлично подходит для данных, которые изменяются нечасто. Или, в идеале, не меняются никогда. Данные, которые изменяются постоянно, например, текущее время, не должны кэшироваться, иначе вы рискуете получить неправильные результаты.
      Читать дальше →
      • +18
      • 10.4k
      • 2
    • Трудности в преподавании иностранных языков (студентам тоже рекомендовал бы)

        1. Чем отличаются «слово» и «понятие» и почему специальные методики запоминания слов — баловство


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

        Иллюстрация: англичанин учит русский язык, сталкивается со словом «стол». Смотрит в словарь. Оказывается, это и table, и desk. Но desk — скорее стол, за которым работают (не плотники). Ну ок. Затем встречает где-нибудь «паспортный стол». Стол?? Видит в супермаркете вывеску «Стол заказов», Но там внезапно нет никакого стола, а есть девочка за стойкой с планшетным компьютером… До него начинает доходить, что «стол» — это ещё некий пункт, где население обслуживается по конкретному вопросу (очевидно, в связи с тем, что сотрудник, который непосредственно обслуживает людей, сидит, как правило, за столом). Заходит в интернет-магазин, видит кнопку «Стол заказов», понимает, что это расширенное значение от реального (не виртуального) «стола заказов».
        Читать дальше →
      • Гигатрон — самодельный микрокомпьютер без процессора



          Микрокомпьютер Gigatron — это минималистичный 8-битный ретро-компьютер построенный по необычному дизайну: в нём нет никаких сложных логических интегральных схем, нет даже микропроцессора! Его CPU построен на классических логических элементах серии 7400, также известных как микросхемы на ТТЛ-логике. По сути все элементы компьютера разом и есть процессор. Эти простые чипы не только формируют CPU, но ещё и выполняют все задачи, которые обычно требуют дополнительной периферии. Несмотря на простую и компактную конструкцию, Gigatron работает как 8-битный одноплатный микрокомпьютер, на котором можно играть в видеоигры.

          Гигатрон — хобби-проект Уолтера Белгера, хакера, специалиста по информационной безопасности и ныне директора по информационной безопасности компании Philips. В этот понедельник 9 сентября Уолтер приезжает в наш Хакспейс, где будет рассказывать об устройстве Гигатрона, истории создания проекта и покажет его живьем.

          Под катом подробнее про Гигатрон и анонс встречи с создателем в Москве.
          Читать дальше →
        • Mind Mapping, или как заставить свой мозг работать лучше


            “Если не ломать мозгов — наломаешь дров”

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

            В 80-х годах ХХ века был придуман еще один такой способ — технология Mind Mapping или использование ментальных карт. И как показывает практика, метод далеко не худший, и заслуживающий внимания.
            Читать дальше →
          • Нарастающий итог в SQL

            • Tutorial
            Нарастающий (накопительный) итог долго считался одним из вызовов SQL. Что удивительно, даже после появления оконных функций он продолжает быть пугалом (во всяком случае, для новичков). Сегодня мы рассмотрим механику 10 самых интересных решений этой задачи – от оконных функций до весьма специфических хаков.
            Читать дальше →
          • 5 способов полезного использования Raspberry Pi. Часть третья

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

              Во второй части были рассмотрены 5 способов использования Raspberry Pi. И как оказывается, этот микрокомпьютер способен ещё на большее. Сейчас мы рассмотрим еще 5, надеюсь, не менее интересных возможностей Raspberry Pi.



              Как и в предыдущей части, будут рассмотрены способы, не требующие программирования.
              Продолжение под катом.
              Читать дальше →
            • Подробно о dynamic: подковерные игры компилятора, утечка памяти, нюансы производительности

                Прелюдия



                Рассмотрим следующий код:

                //Any native COM object
                var comType = Type.GetTypeFromCLSID(new Guid("E13B6688-3F39-11D0-96F6-00A0C9191601"));
                
                while (true)
                {
                    dynamic com = Activator.CreateInstance(comType);
                
                    //do some work
                
                    Marshal.FinalReleaseComObject(com);
                }


                Сигнатура метода Marshal.FinalReleaseComObject выглядит следующим образом:

                public static int FinalReleaseComObject(Object o)


                Создаем простой COM-объект, выполняем какую-то работу и тут же его освобождаем. Казалось бы, что может пойти не так? Да, создание объекта внутри бесконечного цикла — не очень хорошая практика, но GC возьмет на себя всю грязную работу. Реальность оказывается несколько иной:



                Чтобы понять, почему утекает память, нужно разобраться в том, как работает dynamic. На Хабре уже есть несколько статей на эту тему, например эта, но они не углубляются в детали реализации, так что проведем собственное исследование.

                Читать дальше →
              • Как программист банк выбирал и договора читал

                  image
                  Девять лет назад я написал заметку про то, как не быть обманутыми злыми буратинами. Всё, что там написано не потеряло актуальности, и сегодня мы рассмотрим попытку выбрать банк читая бумаги, а не рекламу. В данной заметке рассмотрены ВТБ, Альфа Банк, Авангард. По этим банкам приведены цитаты из действующих на 22.08.2019 договоров и оценочные суждения автора о приемлемости и удобстве предлагаемых договоров. В целом автор рассмотрел уже 8 банков из топа, и там тоже всё плохо. Рассматриваются только условия договоров, не учитывая процентов по кредитам, депозитам и иные потребительские качества банка.

                  В моём менеджменте персональных и семейных финансов фигурирует три разных категории финансов:

                  1. Оперативные финансы — карточка и наличные которыми я пользуюсь ежедневно, магазины, интернет покупки и тп. Ключевые параметры: удобство пользования, качество поддержки, кешбек.

                  2. Оперативный резерв — вклад в рублях и валюте размещённый на депозитном счёте. Нужен для размещения более крупных сумм чем оперативные финансы, но более надёжно. Ключевые параметры: максимальная ликвидность, надёжность в юридическом плане, защищённость от подделки сим и т.п. удалённых мошеннических действий, диверсификация валют, доходность.

                  3. Инвестиции — различные инвестиционные средства, долговременные. Недвижимость, акции, облигации и тп. Ключевые параметры такие же как у оперативного резерва, кроме ликвидности. Не вижу смысла играть в высокодоходные инвестиции которые может упереть девочка в салоне ООО «Дядя Вася» по франшизе сотового оператора.

                  В данном случае я выбирал банк для второй категории.
                  Читать дальше →
                • Что такое RESTful на самом деле

                  • Translation
                  А ваше приложение — RESTful? Чтобы ответить на этот вопрос нужно сначала разобраться что такое RESTful. Бытует мнение, что отдавать правильные коды ответов в HTTP — это уже RESTful. Или делать правильные идемпотентные HTTP-запросы — это вообще очень RESTful. Мы в Хекслете сделали практический курс по протоколу HTTP (отличия версий, отправка форм, аутентификация, куки и пр.), и в нем мы стараемся рассказать о правильном использовании запросов, но нужно понимать, что RESTful это не про HTTP, это вообще не про протоколы интернета. Современный веб и взаимодействие между браузером и сервером с помощью HTTP и URI могут удовлетворять принципам RESTful, а могут и не удовлетворять.

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

                  Читать дальше →
                • Создание минимального Docker-контейнера для Go-приложений

                  Привет, Хабр! Предлагаю вашему вниманию перевод статьи основателя сервиса Meetspaceapp Nick Gauthier «Building Minimal Docker Containers for Go Applications».

                  Время чтения: 6 минут

                  Существует множество, как официальных, так и поддерживаемых сообществом контейнеров для различных языков программирования (включая Go). Но эти контейнеры могут быть довольно большими. Давайте сперва сравним стандартные методы создания контейнеров для Go-приложений, а затем я покажу способ создания крайне маленьких статических контейнерезированных Go-приложений

                  Часть 1: Наше «приложение»


                  Для тестирования нам потребуется какое-нибудь маленькое приложение. Давайте будем фетчить google.com и выводить размер HTML.

                  package main
                  
                  import (
                      "fmt"
                      "io/ioutil"
                      "net/http"
                      "os"
                  )
                  
                  func main() {
                      resp, err := http.Get("https://google.com")
                      check(err)
                      body, err := ioutil.ReadAll(resp.Body)
                      check(err)
                      fmt.Println(len(body))
                  }
                  
                  func check(err error) {
                      if err != nil {
                          fmt.Println(err)
                          os.Exit(1)
                      }
                  }

                  Если мы запустимся, то получим только какое-то число. У меня вышло около 17К. Я целенаправленно решил использовать SSL, но причину объясню позднее.
                  Читать дальше →
                • Основы Elasticsearch

                    Elasticsearch — поисковый движок с json rest api, использующий Lucene и написанный на Java. Описание всех преимуществ этого движка доступно на официальном сайте. Далее по тексту будем называть Elasticsearch как ES.


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


                    В этой статье я расскажу про основы ES на примере индексации постов блога. Покажу как фильтровать, сортировать и искать документы.

                    Читать дальше →
                  • Исчерпывающий список различий между VB.NET и C#. Часть 1

                    • Translation
                    image

                    Согласно рейтингу TIOBE в 2018 году VB.NET обогнал по популярности C#. Совпадение или нет, но в феврале Эрик Липперт, один из создателей C#, призвал читателей обратить внимание на блог его друга, бывшего коллеги по команде компилятора Roslyn и, по совместительству, ярого фаната VB.NET, Энтони Грина. «Подобные ресурсы — это глубинные детали от экспертов, которые не так легко найти, читая документацию», пишет Эрик. Представляем вашему вниманию первую часть перевода статьи Энтони Грина «Исчерпывающий список различий между VB.NET и C#». Возможно, именно в этих различиях кроется секрет динамики рейтинга этих языков.
                    Читать дальше →
                  • Docker'изация: что нужно знать каждому .Net-разработчику

                      В век победившего DevOps разработчики просто обязаны знать про Docker контейнеры, зачем они нужны и как с ними работать. Это многократно облегчает работу. Причем всю силу контейнеризации могут почувствовать даже те, кто работает с .Net Core в среде разработки Visual Studio 2017. О доступных инструментах и настройке Docker под VS рассказал Павел Скиба, начальник отдела разработки серверных приложений, на митапе Panda-Meetup C# .Net.


                      Читать дальше →
                      • +13
                      • 13.2k
                      • 1
                    • DIY тепловизор на Raspberry PI или «Кажется теперь я знаю, чем займусь этим летом»

                        image

                        Всем привет!

                        Пришла зима, а с ней и задача проверить теплоизолирующие свойства построек загородной резиденции дачи. А тут ещё оказалось, что на известном китайском сайте появились вполне доступные тепловизионные модули. Не собрать ли себе экзотическую и, возможно, даже полезную вещь — самодельный тепловизор? Почему бы и нет, вроде и Raspberry где-то валялась… Что из этого вышло — расскажу под катом.
                        Читать дальше →
                      • Патентные тролли начинают и выигрывают: как я остался без игры


                          "Балда ® – игра, знакомая всем со школьной скамьи". Очень часто описание этой словесной игры начинается с избитой фразы. Однако, такое клише хорошо отражает суть: игра Балда ® широко известна еще с тех времен, когда в школах вместо стульев были лавки.


                          У самой игры Балда ® было бесчисленное количество различных реализаций под мобильники и ПК. Я и сам в далеких 2011 и 2013 годах написал две версии игра Балда ® под Android и iOS, которые набрали 3.5 миллиона установок.


                          Вероятно, у внимательного читателя уже возник вопрос: может хватит в каждом предложении писать Балда ®? почему же после слова Балда стоит знак правовой охраны товарного знака ®?


                          Все предельно просто: с конца 2017 года компания ООО "Паритет лифт" стала исключительным правообладателем товарного знака "Балда", и только "Паритет лифт" имеет право выпускать игры под таким названием. В начале 2018 года десятки разных игр под названием "Балда" были удалены из магазинов приложений. Осталась лишь одна-единственная, защищенная Роспатентом.


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

                          Читать дальше →
                        • Тетрис на C# в 100 строк

                          UPD. Ссылка на github.
                          Недавно мне в голову пришла идея — написать простенькую игру в минимальное количество строк. Мой выбор пал на тетрис. В этой статье я опишу свой код.

                          Для начала стоит отметить, что в свою реализацию я включил только базовые возможности:

                          • движение фигурок влево/вправо;
                          • падение фигурок;
                          • поворот фигурок;
                          • удаление заполненных фигурок;
                          • окончание игры.

                          Итак, сперва добавим на форму PictureBox и создадим таймер.
                          Читать дальше →
                        • Особые исключения в .NET и как их готовить

                            У разных исключений в .NET есть свои особенности, и знать их бывает очень полезно. Как обмануть CLR? Как остаться в живых в рантайме, поймав StackOverflowException? Какие исключения перехватить вроде бы нельзя, но если очень хочется, то можно?



                            Под катом расшифровка доклада Евгения (epeshk) Пешкова с нашей конференции DotNext 2018 Piter, где он рассказал про эти и другие особенности исключений.
                            Читать дальше →
                          • Сравнение строк в C# (по умолчанию)

                              Часто бывает, что мы соединяем 2 коллекции или группируем коллекцию при помощи LINQ to Objects. При этом происходит сравнение ключей, выбранных для группировки или связывания.
                              К счастью, стоимость этих операций равна O(n). Но в случае больших коллекций нам важна эффективность самого сравнения. Если в качестве ключей выбраны строки, то какая из реализаций сравнения будет использована по умолчанию, подходит ли эта реализация для ваших строк и можно ли, указав IEqualityComparer<string> явно, сделать эту операцию быстрее?
                              clients.Join(orders, 
                                                 c => c.Name, 
                                                 o => o.ClientName, 
                                                 (c, o) => CreateOrederDto(c, o));
                              

                              Как же выбирается реализация компаратора, если пользователь не указал её явно?
                              Пороемся в исходном коде coreclr
                              • +28
                              • 39.8k
                              • 1
                            • System.IO.Pipelines: высокоэффективный IO в .NET

                              • Translation
                              System.IO.Pipelines — это новая библиотека, упрощающая организацию кода в .NET. Трудно обеспечить высокую производительность и точность, если приходится иметь дело со сложным кодом. Задача System.IO.Pipelines — упростить код. Подробнее под катом!

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