Знакомые лица: алгоритмы создания «типичного» портрета


Автор: Андрей Сорокин, Senior Developer DataArt

В конце прошлого года мы завершили R&D-проект, посвященный методам машинного зрения в обработке изображений. В результате мы создали ряд усредненных портретов IT-специалистов, работающих с разными технологиями. В этой статье я расскажу об изображениях «типичных» Java и .NET-программистов, подходящих для этого фреймворках и оптимизации процесса.

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

Взаимодействие C# и C++ кроссплатформенно

Вам приходилось сталкиваться с необходимостью взаимодействия кода на C# и native-C++ (или скорее С)? Причины могли быть разными: библиотека уже есть, на С/С++ написать проще, разработка частей приложения ведётся разными командами, _______________ (нужное вписать).

Известно, что языки базируются на совершенно разных наборах аксиом.

В С# (CLR, если точнее) вы имеете дело с типами фиксированных размеров (за редкими оговорками), код может быть скомпилирован JIT-компилятором под любую из поддерживаемых целевых платформ (если явно не оговорено иное).

В мире C++ всё совсем иначе: одни и те же типы могут иметь разные размеры при компиляции на разные платформы (привет, size_t), код генерируется по-разному для разных платформ, операционных систем и прочих прелестей.

Под катом будем пробовать их подружить с учётом указанных особенностей.
Читать дальше →

[DotNetBook] Стек потока. Его редактирование и клонирование потока


С этой статьей я продолжаю публиковать целую серию статей, результатом которой будет книга по работе .NET CLR, и .NET в целом. Вся книга будет доступна на GitHub: DotNetBook. Так что Issues и Pull Requests приветствуются :)

Существует область памяти, про которую редко заходит разговор. Однако эта область является, возможно, основной в работе приложения. Самой часто используемой, достаточно ограниченной с моментальным выделением и освобождением памяти. Область эта называется «стек потока». Причем поскольку указатель на него кодируется по своей сути регистрами процессора, которые входят в контекст потока, то в рамках исполнения любого потока стек потока свой. Зачем он необходим?

Итак, разберем элементарный пример кода:
void Method1()
{
    Method2(123);
}

void Method2(int arg)
{
    // ...
}

В данном коде не происходит ничего примечательного, однако не будем его пропускать, а наоборот: посмотрим на него максимально внимательно. Читать дальше →

Как с помощью трех открытых проектов написать диплом

Не секрет, что в у нас в проекте используют обучают студентов. Точнее, студенты на базе проекта осваивают практические аспекты системного программирования: пишут дипломы, курсовые, занимаются исследовательской деятельностью и так далее. Вот об одном дипломе, успешно защищённом прошлым летом, и пойдет речь в данной статье. Автором является Александра Бутрова AleksandraButrova, тема “Разработка графической подсистемы для встроенных операционных систем”. При написании диплома были использованы три открытых проекта: Embox, Nuklear и stb. Последний использовался только для загрузки картинок, а вот Nuklear являлся, по сути, виновником торжества. Можно сказать, что работа свелась к интеграции Nuklear и Embox. Первый предоставлял лёгкую графическую библиотеку, а Embox отвечал за встроенные системы.
Читать дальше →

Как я чинил интерактивный логин, или Что там в кишках у //chrome/test/ChromeDriver?

Эта статья возникла из-за одной моей ошибки и двух багов — по одному в Chromium Headless и Chrome Driver. В результате пришлось собрать всё это из исходников (в статье есть подробнейшая инструкция), отладить цепочку взаимодействия Selenium<->ChromeDriver<->Chromium в отладчике IntelliJ IDEA и Microsoft Visual Studio, покопаться в Java, C++ и JS.

Статья будет интересна тем, кто хочет понять, чем им грозит переход на Selenium + Headless Chrome и как с этим жить. А также всем, кто просто хочет немного поглумиться над несчастным быдлокодером.

Под катом есть пачка скриншотов (трафик!).

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

Вначале напомню названия участвующих продуктов. Их три штуки:

  • Chromium — это браузер. Небрендированная версия Google Chrome, без автообновлений, анальных следящих зондов, но и без несвободных компонентов типа кодеков.
  • Chromium ChromeDriver — это часть Chromium, которая отвечает за управление им с помощью внешних инструментов.
  • Selenium и его Selenium Chrome Driver — эта штука предоставляет Java API для управления Хромиумом. Джава тут не принципиальна, на JavaScript и Puppeteer было бы то же самое.
  • ...Далее...

Еще немного о валидации в ASP.NET

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

public class MoveProductParam
{
   public ProductId {get; set; }

   public CategoryId {get; set; }
}

//...
if(!dbContext.Products.Any(x => x.Id == par.ProductId))
    return BadRequest("Product not found");

if(!dbContext.Categories.Any(x => x.Id == par.CategoryId ))
    return BadRequest("Category not found");

Мы достойны лучшего
public class MoveProductParam
{
   [EntityId(typeof(Product))]
   public ProductId {get; set; }

   [EntityId(typeof(Category))]
   public CategoryId {get; set; }
}

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

Автопилот на AT91SAM7: Вступление

1. Вступление


Радиоуправляемыми самолетами я увлекся еще в 2002 году, живя в Праге. Первый самолет был с размахом крыла 1.2 м, двигатель 2-х тактный ДВС. Вот фрагмент видеозаписи тех времен. Однажды в 2008 году мне в руки попал акселерометр ADXL202E. Имея опыт разработки устройств на контроллере семейства MCS-51(это был Рубидиевый стандарт частоты и система сбора данных), я решил сделать автопилот для радиоуправляемой модели Mentor. Первым делом я подключил акселерометр к контроллеру. Для простоты я выбрал отладочную плату с контроллером AT91SAM7, за удобство и простоту работы с ней. Надо заметить, что я решил не изучать ничего про автопилоты в интернете, а делать все самостоятельно с "0", чтобы было интересней.



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

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

Танчики в консоли, статья третья: «Сервер и клиент»

Добрый всем день!



И с наступившими праздниками!

Мой репозиторий с кодом внизу этой статьи.

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

Я слышу критику и постараюсь написать интересную статью с разбором своего же кода (буду рада если найдёте и сможете исправить ошибки в нём).

Глава 1: «Рабочий клиент»


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

[Из песочницы] Как создать внутриигровое меню в Unity

Как создать внутриигровое меню в Unity


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

Избавляемся от boilerplate для валидации в ASP.NET MVC

В большинстве примеров проверка входных данных ASP.NET MVC осуществляется следующим образом:

        [HttpPost]
        public IActionResult Test(SomeParam param)
        {
            if (!ModelState.IsValid)
            {
                return View(param);
                // return Json({success: false, state: ModelState});
            }
            
            dbContext.UpdateData(param);

            return RedirectToAction("index");
            // return Ok({success: true});
        }

Этот код можно улучшить:

  1. вынести валидацию из тела метода и избавиться от дублирования if (!ModelState.IsValid)
  2. вернуть код ответа 422
Читать дальше →


Последние посты