Быстрая медианная фильтрация с использованием AVX-512

Недавно Боб Стигалл сделал в конференции CppCon 2020 доклад под названием «Adventures in SIMD-thinking”, где он среди прочего рассказывал о своем опыте использования AVX512 для медианной фильтрации с окном 7. Этот доклад вызвал у меня двоякие чувства: с одной стороны, прикольно сделано, и заявлено почти 20-кратное ускорение по сравнению с «тупейшей» реализацией через STL; с другой стороны, за один проход алгоритма из 16 входных семплов у него получалось всего 2 выходных, хотя входных данных хватало на 10, да и некоторые детали реализации вызвали желание попытаться их улучшить. Я подумал-подумал, и придумал идею, потом еще, потом попробовал их «в софте» и понял, что у меня появилось что-то, чем можно поделиться 🙂 Так и получилась эта статья.

Базовая реализация

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

rotate: сдвиг элементов в регистре AVX-512 по кругу

shift with carry: сдвиг элементов из регистра с замещением элементами из второго регистра

in place shift with carry: как shift with carry, но входные регистры передаются по ссылке и результат сдвига остается в них же

compare with exchange: параллельная сортировка до 8 пар элементов в регистре

Это основной примитив для фильтрации, и самый сложный, поэтому про него стоит сказать чуть подробнее: в perm помещаются индексы 0..15, причем индексы каждой сортируемой пары переставлены местами; в mask помещаются биты 1 в «старшей» позиции каждой сортируемой пары. Идея проста: вычисляются поэлементный минимум и максимум между входными данными и данными, перестановленными в соответствии с perm. В результате для каждой сортируемой пары в vmin получаем меньшее значение из пары в обеих позициях пары, а в vmax соответственно бо́льшее значение из пары. Далее просто объединяем оба результата так, чтобы минимум и максимум оказались на нужных нам позициях.

Все, примитивы кончились, можно делать алгоритм. На каждой итерации цикла:

1) используя shift with carry, загоняем в «рабочий» регистр входные данные так, чтобы край окна фильтрации был в самом «левом» элементе регистра (т.е. окно для выходного элемента 0 будет состоять из входных элементов 0..6, для элемента 1 — из элементов 1..7 и т. д.)

2) переставляем элементы так, чтобы окно для элемента 0 было в одной половине регистра, а окно для элемента 1 — во второй

3) Делаем сортировочную сеть для 7 элементов, параллельно сразу для обоих массивов — это 6 итераций compare and exchange, после которых получаем два сортированных массива в регистре. Остается достать срединные элементы из обоих массивов — это и будут наши отсортированные данные — и положить их в выходной регистр и потом в память.

Если из этого объяснения ничего не понятно, то перед продолжением чтения стоит обратиться к первоисточнику, где Боб Стигалл все объясняет много подробнее (и, наверное, много понятнее)

Шаг оптимизации 0

Прежде чем что-то оптимизировать, надо научиться оценивать правильность и результативность оптимизации. Поэтому сначала надо найти исходные коды того, что сделал Боб, и положить их в бенчмарк (я выбрал размер данных, чтобы они убирались в кеш L2). Заодно добавлю проверку того, что разные подходы к фильтрации возвращают одинаковые результаты на одинаковых данных. И надо найти машину с поддержкой AVX-512…

Шаг оптимизации 1

Первое, что бросается в глаза в алгоритме — это сортировка массивов. Независимо сортируются два массива по 7 элементов; но у них 6 общих элементов и от результата сортировки нужен единственный центральный элемент!

Может быть, будет быстрее один раз отсортировать один массив из 6 общих элементов r1-r6 и сделать две сортировки вставками, для r0 и r7? Пусть у нас есть отсортированный массив S[0..5], и элемент X, который надо в него вставить, но нам интересно только значение S[3] после вставки.

  • Если X >= S[3], то S[3] остается на своем месте, и нам нужно его значение

  • Если X <= S[2], то S[2] сдвигается на место S[3], и нам нужно значение S[2]

  • Если S[2] < X < S[3], то X встает на место S[3], сдвигая его выше, и нам нужно значение X. Получается, что нам нужно clamp(X, S[2], S[3]) => min(max(X, S[2]), S[3])!

Получаем новый алгоритм:

  • собрать «края» у 4 7-элементных массивов (элементы 0, 7, 2, 9) – это элементы X для 4 результатов

  • развести 6-элементные массивы 1..6 и 3..8 по отдельным линиям (пусть будут 0..7 и 8..15, как и было)

  • отсортировать оба 6-элементных массива

  • сделать clamp элементами 2 и 3 первого массива на элементы X[0] и X[1], и элементами 2 и 3 второго массива на элементы X[2] и X[3]

По прикидкам должно получиться примерно 2x ускорение — число операций сортировки в расчете на один выходной элемент уменьшается более чем в 2 раза (поскольку сортировочная сеть для 6 элементов требует 5 итераций, а для 7 элементов — 6), но clamp приблизительно соответствует одной итерации сортировочной сети. Проверяем в бенчмарке: 1,86x раз. Неплохо. Что еще можно ускорить?

Шаг 2

На «концевые» элементы X больше не смотрим. Обратим внимание на 6-элементные массивы; данных хватает на 5 таких массивов, но используется только 2 (поскольку для сортировки 3 уже не хватает места в регистре). Обратим внимание на первую итерацию сортировки каждого из массивов — это попарная сортировка: S[0] <=> S[1], S[2] <=> S[3], S[4] <=> S[5]

Массивы же смещены друг относительно друга на 2, т. е. если мы сделаем попарную сортировку во всем регистре еще до того, как разнесем массивы по половинам регистра, то выполним первый шаг сортировки во всех массивах сразу!

Получается простая оптимизация — разворачиваем внутренний цикл в 2 раза и делаем первую итерацию один раз, а уже потом можно по очереди брать и сортировать по 2 массива. Делаем, проверяем: 1.06x. Мелочь, а приятно.

Шаг 3

Можно было бы что-то выжать из последней итерации сортировки, но мы пойдем другим путем и попробуем повторить шаг 1, но уже с 6-элементными массивами.

Как видим, массивы пересекаются 4 элементами (зеленые области на картинке), а нам интересны только два элемента из 6; может быть, можно отсортировать эти 4-элементные массивы и потом вставить два оставшихся элемента?

От оптимизации с шага 2 можно не отказываться, поскольку у 4-элементной сортировочной сети первый шаг точно такой же. Тогда у нас получается для каждого 6-элементного массива: 2-элементный отсортированный массив Y и 4-элементный сортированный массив S, и нам интересны элементы 2 и 3 после слияния этих двух массивов (назовем конечный массив Z). Заметим, что min(Y[0], S[0]) => Z[0], который нам неинтересен; max(Y[0], S[0]) окажется одним из Z[1]..Z[5] – он интересен. Аналогично max(Y[1], S[3]) не интересен, а интересен только min(Y[1], S[3]).

У нас получается 4-элементный массив из S[1], S[2], и двух результатов min/max. Его нужно снова отсортировать, но зато мы можем сортировать все 4 таких массива вместе, и потом взять из каждого элементы 1 и 2 — это будут элементы 2 и 3 из оригинальных 6-элементного массива. Также заметим, что последний шаг у «первой» 4-элементной сортировочной сети сортирует между собой элементы S[1] и S[2], а нам их порядок не важен — все равно нужно пересортировать. Поэтому его можно смело выбросить, и от первой сети остается всего 2 итерации, одна из которых заодно сортирует наши массивы Y.

Поэтому вырисовывается такой алгоритм:

  • сортируем попарно r1-r2 и т. д.

  • сохраняем результат в отдельный регистр — это наши массивы Y, соответственно r1-2, r5-6, r7-8, r11-12; через permute сразу сформируем заготовку под 4 массива для второй сортировки, перенеся Y в r0-1, r4-5 и т. д.

  • делаем вторую (и последнюю) итерацию «первой» сортировочной сети; получаем в r3-r6 и r7-r10 частично сортированные массивы

  • вычисляем max и min соответственно для каждой пары Y[0]/S[0], Y[1]/S[3] и сохраняем результат обратно в регистр с заготовкой под массивы

  • делаем mask_permute для регистров Y и S, перенося S[1] и S[2] на их законные места и получая массивы, которые предстоит отсортировать

  • сортируем 4 массива параллельно

  • далее берем из каждого элементы 1 и 2, и через min/max с элементами X получаем 8 выходных результатов

Выглядит сложно, но должно быть быстрее, чем две развернутых итерации, получившиеся у нас в шаге 2. Пробуем — в 1.64x раза быстрее, чем шаг 2, и в 3 с лишним раза быстрее, чем оригинальная реализация.

Идеи по улучшению алгоритма на этом кончились; можно еще подобрать крошки в рамках имеющегося (точно можно избавиться от одного-двух permute; вероятно, еще что-то найдется), но этого я пока не делал.

Выводы

Издевательства над красивым алгоритмом иногда могут сделать его уродливым, но более быстрым 🙂

Повторю результаты benchmark:

  • на 512 кБ данных: ускорение примерно в 3.1-3.2 раза; в 7.3 раза медленнее, чем простой memcpy через регистр avx-512

  • на 50 МБ данных: ускорение в 2.8-2.9 раза; в 1.8 раза медленнее, чем memcpy (!)

Тормознутость основной памяти современных компьютеров не устает меня поражать.

Применимость для окон других размеров

Можно ли похожим образом ускорить медианный фильтр с окном 5? Думаю, что да (disclaimer: не проверялось даже на бумажке — исключительно умозрительные измышления).

В 16-элементном регистре хранится достаточно данных для вычисления 12 результатов.

  • Оригинальный алгоритм Боба — можно сделать вычисление 3 элементов (вообще неудобно для цикла…)

  • идея из шага 1 замечательно работает, и мы получаем одновременную обработку 4 (из 6 возможных) 4-элементных массивов — одновременно ускоряя сортировку, т. к. сортировочная сеть для 4 элементов короче, чем для 5 элементов; получаем 8 результатов.

  • шаг 2 сделать можно, но не имеет смысла — на вторую итерацию из имеющихся данных остается всего 2 массива; вероятно, будет выгоднее вместо их обработки сразу брать больше данных и делать следующую итерацию с начала.

  • шаг 3 сделать можно, и скорее всего будет иметь смысл. Первая сортировка вырождается в ничто, вторая — в единственную итерацию попарной сортировки, и в результате получаем все 12 результатов за один шаг цикла. Остается придумать, что делать с таким «некруглым» количеством — то ли вдвое раскрутить цикл и сохранять сразу по 24 значения, то ли писать в память по 12 результатов за шаг.

А что будет с окном 9? В регистре хранится достаточно данных для вычисления 8 результатов.

  • оригинальный алгоритм — всего один результат за шаг цикла

  • шаг 1 — в регистр убираются 2 8-элементных массива из 4 возможных, они нам дают 4 результата за шаг цикла (также уменьшаем длину сортировочной сети с 7 до 6 итераций)

  • шаг 2 — применим, но даст какие-то копейки

  • шаг 3 — сделать в принципе можно, но бессмысленно — 6-элементных массивов в регистр убирается всего 2, а дважды сортировать 6-элементный массив (даже если удастся сэкономить на том, что не нужны полностью сортированные массивы) наверняка обойдется дороже, чем один раз отсортировать 8-элементный.

Послесловие

Надеюсь, кому-нибудь эта статья оказалось интересной или полезной. Если хочется покопаться в этом самостоятельно, я выложил код всех шагов на https://github.com/tea/avx-median/. Писалось «на коленке», поэтому комментариев нет, названия взяты с потолка и вообще ужас-ужас. Описания алгоритмов из статьи придут на помощь желающим разобраться в том, что же там такое сделано.

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

ссылка на оригинал статьи https://habr.com/ru/post/525964/

Анализ проблем, а так же разработка АИС в складском учёте

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


Анализ проблем внедрения и разработки информационной системы складского учета и пути их решений

Общие проблемы при внедрении и разработках информационных систем

Как многие уже понимают и видят, что мир не стоит на месте и технологии на сегодняшний день развиваются в стремительном темпе («Я и сам иногда пропускаю некоторые новости»). На такой благоприятной почве многие, сказал бы большинство, компании стремятся идти нога к ноге с новым миром, где технологические решения и автоматизация играют большую роль в обработке информации (изменении, анализе и т. д.).

Такими технологическими решениями, являются информационные системы.

Информационные системы, если не научным языком – это системы направленные на изменение (доработки) какой-либо хозяйственной деятельности, которая должна повлечь за собой увеличение ее производительности.

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

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

  1. Малый уровень формализации процессов;
  2. Весомые изменения в структуре бизнес-процессов организации;
  3. Проблема с низкой квалификацией сотрудников;
  4. Трата больших ресурсов компании для привлечения сторонних специалистов для обучения штата сотрудников использованию ИС;
  5. Все общие сопротивление работников внедрению о информатизациях систем;
  6. Проблема современной технической оснащенности организации (компьютерные программы, компьютеры);

Тут приведена мала часть проблем. Так же не стоит забывать и о проблемах связанных непосредственно с разработкой таких систем. Внемлите это список:

  1. Выбор среды для разработки ИС и дальнейшего его поддержания.
  2. Проблема выбора типа разрабатываемой информационной системы;
  3. Проблема неправильного анализа требований организации, которая приведет к некорректному пониманию потоков информации в организации.
  4. Проблема построения корректной функциональной модели, которая может привести к не правильному построению архитектуры ИС.
  5. Проблема обеспечения целостности и безопасности информации на предприятии.

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

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

Такие системы должны решать проблемы связанные с:

  1. Правильностью контроля складских остатков в реальном времени;
  2. Корректностью отслеживание движения товара;
  3. Точностью фиксация продаж;
  4. Отчетностью по работе сотрудников;
  5. Предупреждению о наличие товара на складе;
  6. Формированию бухгалтерских отчетов и документов для поставщиков;

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

Далее будем рассматривать пути решения поставленных проблем. Не зря же у нас в заголовке статьи написано слово «Анализ».


Сопротивление, это процесс разрушение компании на пути изменение

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

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

Я: Наверно вы думаете, что стоило начать с проблемы, которая связана с разработкой? Мой ответ вам – «Это правильное начало». Ответ будут скоро, а для начала разберем сам процесс внедрения досконально.

Внедрение информационных систем можно рассмотреть, как переходной этап от устаревшей системы управления к более современной через переходной этап. Основные задачи переходного состояния можно разделить на три направления(рисунок 1):


—————————————Рисунок 1—————————————

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

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

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

  1. Интерес выгоды. Данная причина убеждает человека, что при изменениях он может потерять что-то ценное;
  2. Недопонимание и недостаток доверия. Из-за неэффективной коммуникации между сотрудниками и руководством возникает недопонимания значимости работы;
  3. Различная оценка ситуации. Персонал по-разному оценивает важность такой работы;
  4. Изменения на низком уровни готовности. Многие люди не понимают основ и предназначении информационных систем;
  5. Второстепенные причины: влияния коллег, усталость от изменений, неудачный опыт в области изменений.

Проблему сопротивления можно решить создав для рабочего персонала комфортные условия на момент изменения. Теперь рассмотрим более подробно способы преодоления сопротивление изменениям (рисунок 2).


—————————————Рисунок 2—————————————

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


Выбор правильной информационной системы, это путь к эффективной автоматизации

Я: Теперь вы понимаете для чего была рассмотрена первая проблема? Для того чтобы органы управления организацией могли эффективно сообщить сотрудникам об грядущих изменениях, а так же не встретить негативного направления в сторону разрабатываемой системы. В данной ситуации хочется сказать – «Предупреждён — значит вооружён».

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

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

Классификация признаков ИС подразделяется (приведена примерная классификация):

  1. По уровню сложности;
  2. По признаку структурированности задач;
  3. По функциональности;
  4. По степени автоматизации;
  5. По концепции построения;
  6. По режиму работы.

Теперь более подробно рассмотрим всего лишь один признак, исходя из него и сделаем выбор системы, которая будет разрабатываться с учетом проблем и области автоматизации (складской учёт).
Классификация про признаку автоматизации. В зависимости от автоматизации информационные системы разделяются на:

  1. 1. Ручные ИС;
  2. Автоматизированные ИС;
  3. Автоматические ИС.

Исходя из данной классификации, а, то есть учитывая одну приведенную классификацию, уже можно сделать вывод и закрыть вторую проблему связанную с выбором типа и вида информационных систем. Что для автоматизации такого аспекта деятельности организации, как складской учет, требуется система, которая не будет являться системой, где процессы протекают без участия человека, а так же где человека является самой системой и выполняет все задачи в ручную. Такой системой можно считать – Автоматизированную информационную систему.

Автоматизированные информационные системы, являются решение поставленной проблемы, поскольку в свою очередь предоставляют решение таких задач, как:

  1. Устранения рутинных операций;
  2. Сокращения трудозатрат;
  3. Увеличения скорости обработки и преобразования информации;
  4. Оперативность в обслуживания клиентов;
  5. Возможность провести статический анализ;
  6. Возможность эффективного использования информационных ресурсов.

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


Вывод:

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

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

ссылка на оригинал статьи https://habr.com/ru/post/525968/

Создание устройства качания детских кроваток с дугообразным полозом

В предыдущих статьях (раз, два) я описывал устройство качания детской кроватки с маятниковым механизмом. Прошло всего каких-то пять лет – и теперь вашему вниманию хочу представить следующую разработку – устройство качания для кроватки с дугообразным полозом.Ах, да! Предвидя вопросы: «а зачем качать?», «а качать-то, наверное, вредно?», «а вот у меня дети никогда в кроватке не качались – и выросли достойными людьми!», «не нужно приучать детей к качанию, в Спарте таких вообще не любили!» и т.д. – отвечаю: это не предмет рассмотрения данной статьи. Если звезды зажигают – сами понимаете. Всегда качали – это в культуре, причем разных народов. Люльки, колыбели, «бешики» — вот это вот всё. И сейчас тоже – кроватки-качалки, кроватки с маятниковым механизмом. Качали, качают и качать будут. И мы с женой – тоже качали, конечно.

А раз так – будем автоматизировать!

Каким должно быть устройство для качания кроватки? Во-первых, бесшумным. По возможности – абсолютно бесшумным. Никакого жужжания, писка, щелчков и тиканья. Во-вторых – надежным. Чем меньше движущихся частей – тем лучше. Чем меньше механических передач – тем лучше. В-третьих – простым в установке. В идеале – прикрутить на пару-тройку саморезов, а то и приклеить на скотч – и готово. В-четвертых – эффективным. Т.е. качать должно хорошо и, если нужно, сильно. В-пятых – кроватка должна иметь возможность раскачивания вручную. Следовательно, желательно отказаться от передач с большим коэффициентом. В-шестых – устройство должно обладать рядом функций – несколько «скоростей», т.е. интенсивностей качания, таймер, датчик плача, датчик движения, дистанционное управление. И в-седьмых – себестоимость устройства не должна быть слишком большой. Иначе – какой смысл, ведь изделие изначально задумывается коммерческим.

Исходя из обозначенных требований – каким может быть принцип действия устройства качания кроватки на дугах? Самое простое – двигатель с передачей, преобразующей вращательное движение в возвратно-поступательное. Шкив с веревочкой или ниткой. Шестерня и зубчатая рейка. Коленвал и шатун. Червячная передача. Винтовая передача (вариант домкрата). И прочее, и прочее.

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

В порядке абсурда

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

Линейный двигатель, если совсем просто – это двигатель с развернутым в линию статором (неподвижной частью) и соответствующим «ротором» (подвижной частью). Как и обычный вращающийся двигатель, линейный по принципу действия может быть шаговым, синхронным, асинхронным и много ещё каким. По конструкции линейные двигатели также могут быть очень разными – с магнитами, без магнитов; со стальным магнитопроводом или без него; с подвижными катушками или подвижными магнитами и прочее и прочее. Каким же должен быть двигатель для устройства качания кроватки?

И далее был поиск. Я читал материалы, найденные по ключевым словам «voice coil motor/actuator» и по другим похожим, смотрел, что выпускается сейчас разными фирмами – а вдруг что-то готовое подойдет? Потом узнавал цену – нет, не подойдет…

Кстати,

насколько я понял, в России такие изделия вообще не выпускаются. В Европе – пожалуйста, в Китае – тоже много. А у нас – как-то нет (может, конечно, просмотрел, поправьте, если так).

В результате я нашел два очень полезных для меня ресурса – сайт, на котором корейский энтузиаст-самодельщик описывает разработку и создание актуатора и подробный и широкий по охвату труд – магистерскую диссертацию «THE DESIGN OF MOVING MAGNET ACTUATORS FOR LARGE-RANGE FLEXURE-BASED NANOPOSITIONING» by David B. Hiemstra (можно найти в поиске), в которой подробно описано не только создание действующего актуатора, но и содержится огромное количество сведений «вокруг» этого вопроса. Отдельно стоит отметить часть работы, в которой автор делает обзор инноваций в проектировании актуаторов – очень интересно почитать, рекомендую.

Устройство качания медленно возникало в моем воображении, как черно-белая фотография в кювете с проявителем. Детали были еще туманны, но основная идея становилась всё более понятна. Статор, состоящий из двух встречно включенных катушек внутри ферромагнитного ярма, и шток – стержень с надетым на него кольцевым магнитом. Возможно, полюсы – металлические шайбы, надетые на тот же стержень. Вот как-т о так.

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

К счастью, нет. Умные люди уже давно придумали моделирование.

Надо сказать, что устройство для качания кроваток с маятниковым механизмом, разработанное ранее, я моделировал в COMSOL Multiphysics. Это впечатляющий продукт, позволяющий моделировать явления из очень разных областей физики, в том числе, конечно, и электромагнитные явления. Моделируются электромагнитные системы там в трехмерном виде, что, с одной стороны, является универсальным подходом, а с другой – требует вычислительных мощностей и времени – как на освоение программы (хотя «порог входа» невысокий, обучающих материалов много), так и непосредственно на вычисления. Процесс моделирования происходит в формате «что-то изменил – запустил расчет – ушел чай пить». Продукт коммерческий, если это важно.

А еще есть FEMM (Finite Element Method Magnetics, Magnetic Analysis). Некоммерческая программа, моделирует в 2D, но этого во многих случаях достаточно. А к ней «добавление»: DoSA-Open_2D (Designer of Solenoid & Actuator) от автора, насколько я понял, того же сайта. «Добавление» специально сделано для простого моделирования актуаторов и соленоидов. Система должна быть осесимметричная, для анализа рисуется ее сечение. Указывается материал элементов, их подвижность или неподвижность, запускается расчет – и через несколько секунд результат готов. Для моего случая программа оказалось идеальной.

Дополнительно

на упомянутом сайте описаны еще несколько систем моделирования, если интересно – почитайте.

Итак, моделирование позволило выбрать некоторые параметры первого прототипа. Что ж, нарисуем, изготовим, посмотрим на результат.

Модель
Модель
 В разрезе
В разрезе

Главное – оно работает, кроватка качается. Значит, принципиально всё правильно. Теперь нужно придать устройству качания приличный товарный вид.

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

Но дело же не только в корпусе. Нужно ещё придумать, как сделать конструкцию технологичной. Катушки нужно на что-то намотать, на какой-то каркас. Шток должен двигаться в подшипниках скольжения, которые в свою очередь должны быть как-то закреплены и быть как минимум соосны. Печатная плата также должна быть как-то размещена и закреплена. Ну что ж, попробуем решить эту задачку «в лоб». Алюминиевый каркас, нержавеющий немагнитный шток, стальной корпус – он же ярмо, алюминиевые крышки. В результате пробы получилось вот это:

Модель
Модель
В разрезе
В разрезе

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

Я подозревал, что получится, наверное, дороговато. Но цена оказалась высокой настолько, что никакого смысла изготавливать такую конструкцию и вовсе не было. Для изготовления требовалось использование токарно-фрезерных станков с ЧПУ, нужны были ручные операции типа нарезания резьбы, разворачивания отверстий развертками и прочее. И каждая такая операция – дорога. Даже при партии в 100 штук. Даже в Китае.

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

Что в этой конструкции самое дорогое? Детали, выточенные на токарном станке. От них нужно отказаться. Все ручные операции, требующие точного позиционирования – сверление, нарезание резьбы – туда же. А что нам вообще доступно? Лазерная резка. Металла, пластика, фанеры. Но как из плоской вырезанной детали сделать, например, каркас катушки? Или магнитопровод, охватывающий эту катушку?

Есть такое понятие – инсайт. Внезапное озарение, прозрение. Вот так думал-думал над какой-то проблемой, а потом что-то «щелкнуло» – и вдруг понял, как надо. Упало, к примеру, яблоко на голову – и вот уже всё понятно: пора собирать урожай картофеля.

И первый такой инсайт – а не надо каркас. У нас есть самоспекающийся провод, и мы уже неплохо научились с ним работать. Катушки будут бескаркасные. Второе «яблоко» — да и ярмо необязательно цилиндрическим делать, вот у различных реле и соленоидов ярмо из пластин состоит – и ничего. И далее: все детали должны быть – плоскими. Никакой резьбы – используем закладные квадратные шайбы. Несущая конструкция будет из металла и пластика, поликарбоната. А корпус… пусть будет из фанеры.

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

Модель
Модель
Разрез
Разрез
На кроватке
На кроватке

И конечно, видео:

Пока изготовлено лишь несколько экземпляров, процесс доводки и доработки ещё идёт. Кроме того, электронная часть взята самая простая – с управлением маленьким пультом-брелоком. С помощью пульта можно запустить и остановить качание, а также выбрать одну из шести возможных мощностей укачивания. Дип-переключателями на корпусе устройства можно выбрать время качания – от 15 минут до бесконечности, всего 8 вариантов установок. Также кроватку можно остановить рукой – просто затормозить и подержать 3-5 секунд. В планах – управление с помощью большого пульта с экраном, и по Wi-Fi – всё как в предыдущих устройствах для кроваток с маятником. Добавятся ещё датчик плача и датчик движения, время качания можно будет также устанавливать дистанционно, а не переключателями на корпусе.

По мотивам разработки мною был получен патент на полезную модель 200048 «Устройство качания мебели для лежания или сидения».

А дальше? Практика – критерий истины. Нужно изготовить небольшую партию изделий и проверить коммерческую привлекательность и перспективность. Но это уже совсем другая история, которая, к тому же, только начинается.

ссылка на оригинал статьи https://habr.com/ru/post/525972/

Создание зашифрованного диска с «двойным» дном с помощью Veracrypt

VeraCrypt — свободный форк TrueCrypt используемый для сквозного шифрования в Windows, Mac OSX и Linux, и позволяет шифровать системный диск, отдельный внутренний или внешний диск или создавать виртуальные диски с использованием файлов-контейнеров.

В этой статье мы рассмотрим интересную возможность VeraCrypt для создания зашфированного диска со скрытым разделом, этот метод, так же называемый методом «двусмысленного шифрования», обеспечивает возможность правдоподобного отрицания наличия второго тома, т.к. не обладая нужным паролем, доказать существование скрытого тома не представляется возможным.

Создание ключевого файла

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

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

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

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

Создание зашфированного раздела

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

Выберем "Зашифровать несистемный раздел/диск", что бы создать зашифрованный диск (в моем случае это небольшой SSD диск). Если отдельного диска нет, можно использовать "Создать зашифрованный файловый контейнер", т.к. он будет в дальнейшем смонтирован как виртуальный диск, все последующие инструкции справедливы и для него.

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

Режим создания тома "Создать и отформатировать" если диск пустой, или "Зашифровать на месте", если на диске уже есть данные, которые нужно зашифровать.

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

Средняя скорость шифрования/дешифрования в памяти (12 потоков, Апп. ускорение AES включено, Мб/c, больше-лучше):

Зададим надежный пароль (как выбрать надежный пароль мы рассказывали в этой статье).

Интересный факт: пароль “самого разыскиваемого хакера”, использовавшего полное шифрование дисков, Джереми Хэммонда, был именем его кошки: “Chewy 123”;

Перед форматированием тома, потребуется совершить несколько хаотичный движений мышкой, что бы создать необходимый уровень энтропии для шифрования. Опцию «быстрое форматирование» не следует использовать, так как предполагается создание скрытого раздела. Если не предполагается хранение больших файлов (>4Гб), тип файловой системы рекомендуется оставить FAT.

Создание скрытого тома

В мастере томов выберем "Зашифровать несистемный раздел/диск". Режим тома "Скрытый том VeraCrypt". Режим создания "Прямой режим". Выберем устройство или контейнер, зашифрованные на предыдущем шаге. Введем созданный ранее пароль и нажмем "Далее".

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

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

Подключение внешнего тома

Монтирование тома может занимать некоторое время, это связано с большим количеством итераций при генерации ключа, что повышает стойкость при атаках «в лоб» в десятки раз.

Для подключения внешнего тома, нажмем "Смонтировать", откроем "Параметры" и установим опцию "Защитить скрытый том от повреждения при записи" и укажем пароль и ключевой файл от скрытого тома.

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

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

Подключение скрытого тома

Для подключения скрытого тома, нажмем «Смонтировать», укажем пароль и ключевой файл от скрытого тома. При примонтированном скрытом томе, VeraCrypt добавляет пометку "Скрытый".

Векторы атаки

Атака в лоб:

Атаки методом перебора, при наличии стойкого пароля малоэффективна — это тот сценарий, к которому и готовились разрабочики VeraCrypt, а при наличии ключевого файла — неэффективны абсолютно.

Извлечение ключей шифрования:

Теоретически, получив доступ к выключенному компьютеру, есть некоторый шанс извлечь ключи шифрования из памяти или файла гибернации и файла подкачки. Для противодействия такого рода атакам, рекомендуется включить опцию шифрования ключей и паролей в ОЗУ в меню Настройка — Быстродействие и отключить файл подкачки и спящий режим.

Скрытое управление:

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

ссылка на оригинал статьи https://habr.com/ru/company/ruvds/blog/525876/

Я храню продакшен ключи прямо в Git репозитории

image

Время шло, CI/CD тулзы менялись, количество проектов, сред и мест хранения ключей множились, уровень беспокойства о том, что какой-нибудь ключ где-нибудь устарел все повышалось. Ну хватит уже… Можно я просто в репозитории ключи оставлю? Оказывается, да, можно. И это на порядок удобнее всего что я делал раньше.

Пропустим душераздирающую историю о том, с какими проблемами все мы сталкиваемся когда дело касается всяких секреток в проектах и перейдем сразу к делу.

Цели

  • Не хочу беспокоиться о том, все ли конфиги в порядке перед отправкой кода в продакшен/стейджинг
  • Не хочу думать о том, какие конфиги дать новому разработчику, только что присоединившемуся к проекту
  • Хочу чтобы все CI системы запускались без танцев с бубном, так же просто как на локальной машине
  • Хочу чтобы ключи соответствовали версии кода.

Решение

Создаем два баш скрипта: encrypt.sh и decrypt.sh.

encrypt.sh выглядит так:

#!/bin/bash  # sh encrypt.sh <./path/to/file.js> <environment> <password>  LOCAL_IP_REMOVED='Y'  if [[ $2 == 'local' ]]; then   read -p "You are encrypting local environment. \   Did you remove your local ip address from configs? Y/n" LOCAL_IP_REMOVED fi  if [[ $LOCAL_IP_REMOVED != 'Y' ]]; then   echo "Well, go on and remove it then! Aborting encryiption"   exit 1 fi  echo "encrypting $1" openssl enc -aes-128-cbc -a -salt -pass pass:$3 -in $1 -out $1.${2}-enc -md md5 echo "done"

decrypt.sh выглядит так:

#!/bin/bash # sh decrypt.sh <environment> <password>  echo "decrypting $1 environment"  for file in $(find . -not -path "*/node_modules/*" -name "*.$1-enc") do     echo "decrypting $file to ${file//.$1-enc}"     openssl enc -aes-128-cbc -a -d -salt -pass pass:$2 -in $file -out "${file//.$1-enc}" -md md5 done  if [[ $1 == 'local' ]]; then   LOCAL_IP=`ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'`   echo "Also replacing localhost with your local machine ip: $LOCAL_IP"   # optionally, add logic to replace "localhost" with your machine IP   sed -i ''  "s|localhost|$LOCAL_IP|g" './src/env.js' fi

Складываем все секретки в один или несколько файлов, как удобно. Будь то .env, env.js или что там вы используете.

Добавляем этот файл в .gitignore.

Юзаем encrypt.sh:

sh encrypt.sh ./src/env.js <environment> <very_secure_password>

Указанный файл шифруется и сохраняется как копия. В данном примере это будет ./src/env.js.production-enc.
И

Кстати, сложность подбора пароля можно чекнуть тут:

Советую начать с трех environmentов: local, staging, production.

Особенность local среды в том, что скрипт decrypt.sh может также подменять localhost в ваших конфигах на локальный IP вашего компьютера. Это нужно, например, в мобильной разработке, когда необходимо чтобы смартфон коннектился к локальному серверу.

Спасибо за внимание!

ссылка на оригинал статьи https://habr.com/ru/post/525928/