Что такое sync over async deadlock

Опубликовано Sat 17 March 2018 в misc • Помечено dotnet, csharp, multithreading, TPL, SyncOverAsync • 3 min read

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

multithreading

Вспомним пример из предудущего поста. По нажатию на кнопку нужно вызвать длительную задачу. Так как наш код асинхронный, код длительной задачи нужно разместить в синхронном коде обработчика нажатия кнопки, для этого воспользуемся техникой sync over async. Т.е. просто дождёмся завершения асинхронной задачи при помощи метода taskName.Wait().


Продолжить чтение

Контекст синхронизации при работе с Task и Thread

Опубликовано Mon 12 March 2018 в misc • Помечено dotnet, csharp, multithreading, TPL, SynchronizationContext • 3 min read

При работе в проектах связанными с ui-control или asp.net часто приходится работать с ресурсами доступными в локальном хранилище потока (thread-local storage TLS). К слову: такое поведение можно задать при помощи аттрибута [ThreadStatic] или класса ThreadLocal<T>. При обращении к ним из другого потока платформа dotnet выбросит исключение System.InvalidOperationException с текстом 'The calling thread cannot access this object because a different thread owns it.'.

multithreading

Представим себе ситуацию когда в каком-то win-form приложении нам по нажатию кнопки нужно вызвать долгоиграющую задачу. Очевидно, что нужно было-бы создать поток и в этом потоке выполнить эту задачу. Проблематично будет отобразить результат выполнения из созданного потока на UI - ведь ресурсы UI принадлежат одному потоку, а обращаемся мы к нему в другом. Это и есть та вышеописанная ситуация, когда мы столкнёмся с System.InvalidOperationException. Для решения этой проблемы нам придётся подружиться с контекстом синхронизации.


Продолжить чтение

Реализация паттерна saga на C#

Опубликовано Sun 14 January 2018 в misc • Помечено dotnet, csharp, pattern, saga • 6 min read

Предисловие переводчика:

Уже не помню, что сподвигло меня заинтересоваться этим паттерном, скорее всего это то что в какой-то момент мне пришлось столкнуться с javascript библиотекой redux-saga.
Знакомство началось с описания паттерна от Bernd Rücker и прекрасной презентации Caitie McCaffrey. После ознакомления с этими материалами у меня всё ещё оставались вопросы. Очень хотелось увидеть этот код "в живую" в виде какого либо PoC-a.

Вашему вниманию представлена статья Clemens Vasters-a, которая поможет разобраться уже в деталях с конкретной реализацией.

нужно всё переделать

Сегодня был оживленный день в тех уголках Twitter-а, где обсуждался паттерн Saga. Существует несколько .NET фреймворков, которые используют термин «сага» и которые представляют из себя реализацию конечного автомата или воркфлоу.

Проблема в том, что это всё не сага!

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


Продолжить чтение

Ускоряемся: автозамена при помощи регулярных выражений

Опубликовано Fri 05 January 2018 в misc • Помечено regexp, регулярные выражения, регулярки • 2 min read

Нет такой проблемы которую нельзя было бы усугубить регуляркой (с)

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

я знаю регулярки

Регулярное выражение в этом случае сразу поможет с решением двух проблем:

  • поиск с учётом заданной регулярки
  • возможность захвата группы символов с последующей вставкой в заменяемый текст

Продолжить чтение

Минималистическое руководство по SQLite

Опубликовано Sat 30 December 2017 в misc • Помечено SQLite, SQL, Python, Jupiter • 10 min read

SQLite - это автономная безсерверная SQL база данных. Д-р Ричард Хипп, создатель SQLite, впервые опубликовал программное обеспечение 17 августа 2000 года. С тех пор он стал вторым по распространённости программным обеспечением в мире. Он используется в важных системах таких как Airbus A350, поэтому неудивительно, что тесты для SQLite 3 сертифицированы для применения в авиации. Само программное обеспечение очень мало, пакет клиента и пакет с библиотекой для системы Debian amd64 составляет 765 КБ в сжатом виде дистрибутива и 2,3 МБ в установленном виде. Программное обеспечение лицензируется по очень лояльной лицензии: Public Domain .

SQLite logo


Продолжить чтение

Версиониорвание базы данных - работа с ветками

Опубликовано Sat 25 November 2017 в misc • Помечено sql, schema migration • 6 min read

Если вы не знакомы с ветвлением и слиянием веток, предлагаю вам отличную HOWTO Control Source Eric Sink's. Я предпочитаю модель бранчевания "релизная ветка" (примечание переводчика: подходы к ветвлению указанные по ссылкам немного устарели. По-моему мнению стоит уделить внимание более современных подходам git-flow, github-flow и gitlab-flow).

При подходе "Релизная ветка" вся новая работа происходит в trunk ветке репозитория. Как только продукт приближается к релизу, изменения схемы становятся более редкими и фризятся новые правки. В этот момент, команда создает ветку для релиза. Разработка нового функционала продолжается в транке с изменениями в схеме и всего остального кода. В ветку отправляются только фиксы ошибок. После релиза команда объединяет исправления с ветки в trunk.

Как работать со скриптами при таком подходе?

Это достаточно сложный вопрос.

Изменения схемы в ветке требуют постоянного внимания. Техника только вперед (forward-only, run-once), которую я использую при работе с ветками имеет ряд проблем. Над ними определённо предстоит подумать и вам при разработке вашего процесса миграции баз данных.

К примеру я знаю, что в моем процессе изменения схемы в ветке будут редкими. Если вы используете более агрессивную стратегию ветвления (как feature-branch), такой подход очевидно хорошо работать не будет. В отличии от других стратегий - типо Руби Миграций, которые могут легко продвигаться вперед или назад по изменениями (если вы только не делаете необратимых изменений). Как и в большинстве случаев в нашей отрасли, приходится искать компромисы.


Продолжить чтение

Версирование базы данных - вьюшки, хранимые процедуры и т.п.

Опубликовано Wed 15 November 2017 в misc • Помечено sql, schema migration • 3 min read

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

размышлизмы


Продолжить чтение

Версирование базы данных - Скрипты изменения

Опубликовано Tue 14 November 2017 в misc • Помечено sql, schema migration • 4 min read

После рассмотрения трёх правил и создания базиса, вся команда может работать с базой данных, базис которой безопасно расположен в репозитории контроля версий. Наступит день когда команде предстоит изменить схему. Каждое изменение приводит к новой версии базы данных. В моем подходе, скрипты базиса создали таблицу журнала изменений БД, чтобы отслеживать эти изменения.

еноту нравится такой подход

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


Продолжить чтение

Версирование базы данных - создание базиса

Опубликовано Mon 13 November 2017 в misc • Помечено sql, schema migration • 4 min read

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

Предостережения

В качестве предисловия я должен сказать, что есть много работающих стратегий версионирования баз данных. Я не предлагаю единый и истинно верный вариант. Моя цель состоит в том, чтобы выкатить изменения базы данных в последовательном, проверяемом и воспроизводимым образом. Так как я привык работать с довольно большими схемами баз данных, то я не хочу использовать скрипты которые выполняются в течение 6 часов и тем самым заморозят на долго продакшен систему. Опасения которые я озвучил формируют мой ход мышления и стратегии. В каждом приложении с базой данных все изменения её схемы должны быть под контролем системы контроля версий, для этого Вам стоит подумать как реализовать это в ваших условиях наиболее простым путём.

создание базиса


Продолжить чтение

Три правила для работы с базой данных

Опубликовано Fri 03 November 2017 в misc • Помечено sql, schema migration • 3 min read

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

Работаем с легаси БД

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


Продолжить чтение

Как применить патч даже если git морозится

Опубликовано Tue 31 October 2017 в misc • Помечено Git • 1 min read

Git распологает широким ассортиментом вариантов делится изменениями без отправления этих изменений на origin. Одним из самых распространённых решений такой проблемы являются патчи. Их легко получить и применить на одном компьютере. Но что делать если на другом компьютере не применяется патч, не переносить же изменения руками?


Продолжить чтение

Двойной ревёрт или как жить после плохого пулл-реквеста

Опубликовано Mon 30 October 2017 в misc • Помечено Git, двойной revert, gitflow • 2 min read

Представте, что случилась такая ситуация, когда пулл реквест из фиче-бранча оказался немного бажным, но ревьюверы уже приняли его и вмёржили в общий девелоп. Ситуация очень неприятная, особенно если фиче-бранч ВАШ а тесты данную ситауцию почему-то сразу не раскрыли. Фактически, вы заблокировали работу всей команде или того хуже всего проекта с несколькими командами. Как на зло на исправление функционала нужно больше времени чем у вас есть, а злые девелоперы, которые не могут дальше работать уже разжигают костёр обещая Вас на нём поджарить. Что же делаааать?!


Продолжить чтение

Почему я люблю программирование!

Опубликовано Fri 18 August 2017 в misc • Помечено reflection, inspiration • 3 min read

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


Продолжить чтение

Безграничное богатство. Теория и практика экономической алхимии. [Пол Зейн Пилцер]

Опубликовано Sun 13 August 2017 в misc • Помечено Article, Precis • 1 min read

Автор книги Пол Зейн Пилцер достоин внимания своими заслугами как на поприще бизнес деяний - основатель 7ми компаний, как минимум одну из которых вывел на IPO и продал за 435 миллионов USD, так и на литературном поприще.

Piltser Paul Zane


Продолжить чтение

Цели блога

Опубликовано Sat 05 August 2017 в misc • Помечено reflection • 1 min read

Привет всем посетителям моего блога.

Меня зовут Владимир Ляшенко и я ДотНет разработчик - вот мой LinkedIn. К тому же я немного питоно-дел, немного фронтендщик и совсем чуть-чуть блоговод.

Главной целью этого блога - разобраться и сохранить мыслепоток в структурированном виде, по интересующим меня вопросам в разных направлениях.


Продолжить чтение