Search
Write a publication
Pull to refresh
27
0
Акбаров Дмитрий @Dinariys

Разработчик

Send message

Обзор C# библиотек для работы с PDF

Reading time5 min
Views175K
topic image
На написание данной статьи меня подтолкнул топик HTML в PDF, правда по причине того, что он посвящен языку php, лично мне он был мало полезен, т.к. весь опыт работы с php у меня сводился в переводе нескольких скриптов на C#, поэтому я решил сделать небольшой обзор того, что доступно для работы с pdf по средствам языка C#.

Ко мне в список попало 7 библиотек, о которых я скажу несколько слов, а для самой популярной (судя по ответам на stackoverflow), я напишу, как с помощью неё сделать простейший документ. Сразу скажу, что это iTextSharp и работа с ней будет описана в конце статьи.
Читать дальше →

Замеряем производительность с помощью BenchmarkDotNet

Reading time6 min
Views37K
imageДобрый день. Неделю назад я в третий раз применил библиотеку для создания\запуска .NET бенчмарков BenchmarkDotNet. Библиотека оказалась достаточно удобной, но практически не освещенной на хабре, что я сейчас и исправлю.

Под бенчмарком я подразумеваю измерение времени выполнения метода(ов). Для начала представим процесс написания бенчмарка руками. Создаем тестируемый метод, выбираем Release билд, создаем «замеряющий» метод, в нем собираем мусор, ставим StopWatch в начале и в конце, запускаем прогрев, запускаем тестируемый метод. Если тестируемый метод выполняется быстрее одного «тика» StopWatch, запускаем тестируемый метод много раз (пусть будет миллион), делим суммарное время на миллион, получаем результат (при этом нужно не забыть вычесть из суммарного времени время «холостого» прогона цикла на миллион операций).

А ведь это еще не все!

7 бесплатных курсов для разработчиков от Microsoft

Reading time5 min
Views83K
Привет, Хабр! Сегодня мы начинаем серию статей, в которую войдет 5 подборок бесплатных обучающих курсов от компании Microsoft. В этой статье у нас самые крутые курсы для разработчиков, которые сильнее всего нравятся программистам.

Кстати!

  • Все курсы бесплатные (вы даже сможете попробовать платные продукты бесплатно);
  • 6/7 на русском языке;
  • Начать обучение можно мгновенно;
  • По окончании вы получите бейдж об успешном прохождении обучения.

Присоединяйтесь, подробности под катом!

Новая серия статей


Следующая серия статей, начало 2020 года


Эта серия статей, 2019 год


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

Введение в Git

Reading time17 min
Views160K

Оглавление


Предисловие
1. Настройка git
....1.1 Конфигурационные файлы
....1.2 Настройки по умолчанию
....1.3 Псевдонимы (aliases)
2. Основы git
....2.1 Создание репозитория
....2.2 Состояние файлов
....2.3 Работа с индексом
....2.4 Работа с коммитами
....2.5 Просмотр истории
....2.6 Работа с удалённым репозиторием
3. Ветвление в git
....3.1 Базовые операций
....3.2 Слияние веток
....3.3 Rerere
4. Указатели в git
....4.1 Перемещение указателей
5. Рекомендуемая литература

Предисловие


Git — самая популярная распределённая система контроля версиями.[1][2]

Основное предназначение Git – это сохранение снимков последовательно улучшающихся состояний вашего проекта (Pro git, 2019).
Читать дальше →

Оптимизация аптек: что мы сделали с помощью математики

Reading time8 min
Views17K


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

Очень часты ситуации недозаказа товара (когда нужного ходового лекарства просто нет в аптеке), перезаказа (товар поставляется на пару ближайших лет) или неправильного распределения по сети аптек (в одной нет, а в другой — на шесть месяцев запаса). Таблетки компактные, выкладка в аптеках — хорошо, если 5 % от товарного запаса, поэтому восемь–десять миллионов рублей можно запросто спрятать даже на 15 квадратных метрах в ящиках. А потом у этих лекарств внезапно уже через год закончатся сроки годности.

Проблема — в ручном управлении запасами и в неправильном прогнозировании спроса: рынок таков, что часто в начале года подписываются обязательства на год вперёд, и производитель впихивает тонны неходового товара аптечным сетям.

Конечно же, в этой ситуации очень не хватает математической модели. Ну мы с ней и пришли. В процессе сделали ещё несколько чудесных открытий про рынок.
Читать дальше →

Распознавание штрих и QR кодов в приложениях UWP

Reading time5 min
Views27K

Я не открою Америку, если скажу, что самой популярной библиотекой для распознавания штрихкода является ZXing («Zebra Crossing»). Список поддерживаемых форматов довольно внушителен и включает в себя: EAN-8 и EAN-13, QR Code, UPC-A и UPC-E, Code 39, Code 93, Code 128 и другие.

Есть порт и для WinRT, а значит, библиотеку можно использовать и с универсальной платформой Windows.
Читать дальше →

Асинхронное программирование – производительность async: понять расходы на async и await

Reading time21 min
Views31K

Это статья достаточно древняя, но не потерявшая актуальности. Когда разговор заходит об async/await, как правило, появляется ссылка на неё. Перевода на русский найти не смог, решил помочь кто не fluent.




Асинхронное программирование долгое время было царством самых опытных разработчиков с тягой к мазохизму – тех, кто имел достаточно свободного времени, склонность и психические способности размышлять об обратных вызовах (callback) из обратных вызовов в нелинейном потоке выполнения. С появлением Microsoft .NET Framework 4.5, C# и Visual Basic принесли асинхронность всем нам, так что простые смертные теперь могут писать асинхронные методы почти так же легко, как синхронные. Обратные вызовы больше не нужны. Больше не нужна явная передача (marshaling) кода из одного контекста синхронизации в другой. Больше не нужно беспокоиться как двигаются результаты выполнения или исключения. Нет необходимости в трюках, которые искажают средства языков программирования для удобства разработки асинхронного кода. Короче говоря, больше нет мороки и головной боли.

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

Как мы автоматизировали большой интернет-магазин и стали сопоставлять товары автоматически

Reading time21 min
Views25K
image

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

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

  • Работа с поставщиками. Чтобы продать что-то ненужное, нужно сначала купить что-то ненужное.
  • Управление каталогом. У кого-то узкая специализация, а кто-то продает сотни тысяч разных товаров.
  • Управление розничными ценами. Тут придется учесть и цены поставщиков, и цены конкурентов, и доступные финансовые инструменты.
  • Работа со складом. В принципе, можно и не иметь собственного склада, а забирать товар со складов партнеров, но так или иначе вопрос стоит.
  • Маркетинг. Тут наполнение сайта контентом, размещение на площадках, реклама (онлайн и офлайн), акции и много чего еще.
  • Прием и обработка заказов. Колл-центр, корзина на сайте, заказы через мессенджеры, заказы через площадки и маркетплейсы.
  • Доставка.
  • Бухгалтерия и прочие внутренние системы.

Магазин, о котором мы будем говорить, не имеет узкой специализации, а предлагает кучу всего от косметики до мини-трактора. Я расскажу, как у нас устроена работа с поставщиками, мониторинг конкурентов, управление каталогом и формирование цен (оптовых и розничных), работа с оптовыми клиентами. Немного затронем тему склада.

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

Так что рассматриваем отдельную систему, более-менее универсальную, с которой интегрирована остальная инфраструктура компании.
Читать дальше →

Под капотом у Dictionary и ConcurrentDictionary

Reading time5 min
Views183K
Некоторое время назад, я решил, что хочу знать больше подробностей о работе многопоточности в .NET и что я уделял этому незаслуженно мало внимания в прошлом. Информации на эту тему великое множество (отправной точкой я для себя выбрал этот раздел книги «C# in a nutshell»), но, как оказалось, только малая часть ресурсов пытаются объяснить что-то в деталях.

Каждый мастер должен знать свои инструменты, а что может использоваться чаще коллекций? Поэтому я решил сделать небольшой обзор многопоточных коллекций и начать с ConcurrentDictionary (беглый обзор уже встречался здесь, но его там совсем мало). Вообще, я несколько удивился, что такой статьи для .NET еще нет (зато хватает по Java).

Итак, поехали.
Читать дальше →

Как я программирую движки для ролевых игр в Google-таблицах

Reading time9 min
Views12K
image

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

Позднее связывание в C#

Reading time6 min
Views8.9K
Вы видели хоть один проект на C# не использующий DLL? А серьезный не модульный проект? В любом случае рано или поздно для Вас данный вопрос будет критичным. Для остальных данная статья не представляет интереса, т.к. здесь описаны лишь базовые понятия с примером реализации рефлексии.
Читать дальше →

Проблема с периодически долго выполняемыми запросами в MS SQL Server

Reading time4 min
Views95K

Предисловие


Есть информационная система, которую я администрирую. Система состоит из следующих компонент:

1. База данных MS SQL Server
2. Серверное приложение
3. Клиентские приложения

Данные информационные системы установлены на нескольких объектах. Информационная система активно и круглосуточно используется одновременно от 2-х до 20-ти пользователей на каждом объекте. Поэтому нельзя выполнять регламентные работы все и сразу. Т е приходится дефрагментацию индексов размазывать на целый день, а не одним махом все нужные фрагментированные индексы дефрагментировать. Аналогично и с другими работами.

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

Локализация проектов на .NET с интерпретатором функций

Reading time8 min
Views16K

Пролог


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

  1. Сложность внедрения в существующий проект.
  2. Отсутствие средств форматирования локализованных сообщений (за исключением стандартного string.Format).
  3. Невозможность встраивания культурно-зависимых функций. Например, типичную задачу, — подстановку нужной формы слова в зависимости от значения числа, — одними словарями значений не разрешить.


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

Состав библиотеки


Ссылка на проект SourceForge: https://sourceforge.net/projects/open-genesis/?source=navbar

Пример: LocalizationViewer

В сборку входят следующие проекты:

  • Genesis.Localization — основная библиотека локализации.
  • Ru — реализация русской локализации (пример).
  • En — реализация английской локализации (пример).
  • LocalizationViewer — программа для демонстрации возможностей библиотеки с возможностью редактирования локализаций.

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

Эти занимательные региональные настройки

Reading time8 min
Views30K
Сегодня мы поговорим о региональных настройках. Но сперва — небольшая задачка: что выведет нижеприведённый код? (Код приведён на языке C#, но рассматривается достаточно общая проблематика, так что вы можете представить на его месте какой-нибудь другой язык.)

Console.WriteLine((-42).ToString() == "-42");
Console.WriteLine(double.NaN.ToString() == "NaN");
Console.WriteLine(int.Parse("-42") == -42);
Console.WriteLine(1.1.ToString().Contains("?") == false);
Console.WriteLine(new DateTime(2014, 1, 1).ToString().Contains("2014"));
Console.WriteLine("i".ToUpper() == "I" || "I".ToLower() == "i");

Сколько значений true у вас получилось? Если больше 0, то вам не мешает узнать больше про региональные настройки, т. к. правильный ответ: «зависит». К сожалению, многие программисты вообще не задумываются о том, что настройки эти в различных окружениях могут отличаться. А выставлять для всего кода InvariantCulture этим программистом лениво, в результате чего их прекрасные приложения ведут себя очень странно, попадая к пользователям из других стран.Ошибки бывают самые разные, но чаще всего связаны они с форматированием и парсингом строк — достаточно частыми задачами для многих программистов. В статье приведена краткая подборка некоторых важных моментов, на которые влияют региональные настройки.

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

Как генерировать осмысленные коммиты. Применяем стандарт Conventional Commits

Reading time8 min
Views133K


Привычный хаос в названиях коммитов. Знакомая картина?

Наверняка вы знаете git-flow. Это отличный набор соглашений по упорядочиванию работы с ветками в Git. Он хорошо документирован и широко распространен. Обычно мы знакомы с правильным ветвлением и много говорим об этом, но, к сожалению, уделяем слишком мало внимания вопросу наименования коммитов, поэтому часто сообщения в Git пишутся бессистемно.

Меня зовут Ержан Ташбенбетов, я работаю в одной из команд Яндекс.Маркета. И сегодня я расскажу читателям Хабра, какие инструменты для создания осмысленных коммитов мы используем в команде. Приглашаю присоединиться к обсуждению этой темы.

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

Подводные камни HttpClient в .NET

Reading time9 min
Views95K
Продолжая серию статей о «подводных камнях» не могу обойти стороной System.Net.HttpClient, который очень часто используется на практике, но при этом имеет несколько серьезных проблем, которые могут быть сразу не видны.

Достаточно частая проблема в программировании — то, что разработчики сфокусированы только на функциональных возможностях того или иного компонента, при этом совершенно не учитывают очень важную нефункциональную составляющую, которая может влиять на производительность, масштабируемость, легкость восстановления в случае сбоев, безопасность и т.д. Например, тот же HttpClient — вроде бы и элементарный компонент, но есть несколько вопросов: сколько он создает параллельных соединений к серверу, как долго они живут, как он себя поведет, если DNS имя, к которому обращался ранее, будет переключено на другой IP адрес? Попробуем ответить на эти вопросы в статье.
Читать дальше →

Фатальные ошибки двоичной арифметики при работе с числами с плавающей точкой

Reading time6 min
Views56K
Среди всего разнообразия форматов представления действительных чисел в компьютерной технике особое место отведено формату чисел с плавающей точкой (ЧПТ), который запротоколирован в стандарте IEEE754. Главные достоинства чисел с плавающей точкой, как известно, заключаются в том, что они позволяют производить вычисления в большом диапазоне значений и при этом вычисления организуются инструментарием двоичной арифметики, легко реализуемой на вычислительном устройстве. Однако последнее обстоятельство таит в себе подводные камни, которые являются причиной того, что расчеты, сделанные с использованием этого формата, могут приводить к совершенно непредвиденным результатам.

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

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

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

Help, my database is corrupt. Now what?

Reading time12 min
Views40K
Поврежденная база данных — это, наверное, один из худших ночных кошмаров большинства администраторов баз данных. Результатом повреждения являются простои, вопли менеджеров и всякие другие неприятные штуки.
В этой статье я объясню что нельзя делать с поврежденной базой данных и опишу кое-что из того, что должно быть сделано, некоторые виды повреждений и как их можно исправить.

Как обнаружить, что база данных повреждена


Обычно повреждения превосходно обнаруживаются при попытке доступа к поврежденной странице. Запросы, бэкапы или процедуры реиндексации завершаются ошибками с высокими уровнями серьезности.
Вот пара примеров системных сообщений при обнаружении повреждения БД:
SQL Server detected a logical consistency-based I/O error: incorrect checksum (expected: 0xfdff74c9; actual: 0xfdff74cb). It occurred during a read of page (1:69965) in database ID 13 at offset 0x0000002229a000 in file 'D:\Develop\Databases\Broken1.mdf'.
Attempt to fetch logical page 1:69965 in database 13 failed. It belongs to allocation unit 72057594049069056 not to 281474980642816.
Основная проблема заключается в том, что если проверки целостности базы данных не производятся на постоянной основе, то повреждение может быть обнаружено спустя часы, дни и даже месяцы, после того, как оно образовалось, в тот момент, когда уже сложно будет что-то исправить.
Читать дальше →

Универсальный API для получения информации по чекам

Reading time9 min
Views121K
Привет жителям Хабра.

В данной статье хотелось бы рассказать про API для получения чеков, которое нам не предоставила всеми любимая ФНС.

Когда только появились QR-коды на чеках я подумал «Вау, как круто! Ты сканируешь код и видишь если не всю инфу по чеку, то ссылку на него». И какого же было мое разочарование, когда просканировав такой код я увидел что-то вроде

t=20180518T220500&s=975.88&fn=8710000101125654&i=99456&fp=1250448795&n=1

Но расстраиваться я не стал и подумал, что ФНС позаботилась о нас и предоставила API для получения такой информации. Погуглив некоторое время я понял, что ФНС нам предоставила только мобильное приложение для проверки чека и просмотра той информации, что поступила к ним от магазина.
Читать дальше →

Вертим логи как хотим ― анализ журналов в системах Windows

Reading time6 min
Views130K


Пора поговорить про удобную работу с логами, тем более что в Windows есть масса неочевидных инструментов для этого. Например, Log Parser, который порой просто незаменим.


В статье не будет про серьезные вещи вроде Splunk и ELK (Elasticsearch + Logstash + Kibana). Сфокусируемся на простом и бесплатном.

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

Information

Rating
Does not participate
Location
Chernevo, Varna, Болгария
Date of birth
Registered
Activity