Pull to refresh
23
0
Тимур Абизгельдин @BuddhaSugata

Инженер

Send message

О программировании промышленного ПЛК на C++

Level of difficultyMedium
Reading time31 min
Views6.2K

Привет, хабр! Под катом мы посетим китайский завод, где делают двигатели, заглянем внутрь ПЛК да попрограммируем его на разных языках, включая Си и C++, вплоть до ассемблера.

Для любителей промышленной автоматизации

Оптимизация: типичные ошибки программистов и как их можно исправить

Reading time18 min
Views11K

Привет, Хабр. Меня зовут Павел Преблагин, я работаю в команде инжиниринга производительности Positive Technologies. Мы анализируем разные продукты компании и пытаемся так или иначе оптимизировать их изнутри. Как уже можно понять, команда наша мультипроектная: у нас нет постоянной кодовой базы, кроме некоторых инструментов анализа и тестирования. Обычно коллеги из других отделов приносят нам для изучения свою, написанную преимущественно на C++, если у них есть подозрения, что что-то работает не так быстро, как должно было бы. Мы в ответ приносим им результаты замеров, патчи и рекомендации.

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

Разобраться

Грязный код

Level of difficultyMedium
Reading time10 min
Views29K
Эдсгер Дейкстра: «Грязно и быстро — мне это не понравится»

«Чтобы иметь право называть себя профессионалом, вы должны писать чистый код. Нет никаких разумных оправданий тому, чтобы не стремиться к лучшему». Clean Code

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

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

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

Я программирую уже довольно давно и видел разнообразные подходы к обеспечению работоспособности ПО. Кто-то любит объектно-ориентированное программирование (я тоже), другие умные люди его ненавидят. Кому-то нравится выразительность динамических языков, кого-то она бесит. Кто-то успешно выпускает программы, строго следуя концепции Test Driven Development, другие добавляют в конце проекта несколько сквозных тестов, а многие остаются где-то посередине этих крайних точек.

Я был свидетелем проектов, выпускавших и поддерживавших успешное ПО на основе всех этих разнообразных подходов.

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

Пара тупых ответов про эволюцию

Reading time9 min
Views62K


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

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

Крыло работает только тогда, когда целое. Половина крыла не даёт оторваться от земли.

Примерно такой же вопрос к сложным мутациям. Как так можно поменять пару букв в коде, чтобы он вдруг стал отлаженной библиотекой с чем-то полезным?

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

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

Задача трёх тел (не китайская нефантастика)

Level of difficultyMedium
Reading time21 min
Views47K

Однажды, выполнив в Гугле запрос "Three body problem" ("Задача трёх тел"), я был просто поражен - первая страница результатов состояла только из ссылок на роман китайского писателя-фантаста Лю Цысиня с соответствующим названием, а также на телесериал, снятый по этому роману, т.е. ссылок на собственно задачу трёх тел не было вообще! Мне это показалось удивительным и несправедливым, поскольку сама по себе задача трёх тел тоже может выглядеть увлекательной в популярном изложении. В этой публикации я постарался привести некоторые доказательства этого утверждения.

Читать далее

Юнит-тестирование для чайников

Reading time15 min
Views1.1M
Даже если вы никогда в жизни не думали, что занимаетесь тестированием, вы это делаете. Вы собираете свое приложение, нажимаете кнопку и проверяете, соответствует ли полученный результат вашим ожиданиям. Достаточно часто в приложении можно встретить формочки с кнопкой “Test it” или классы с названием TestController или MyServiceTestClient.



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

Оно выполняет свою задачу, но сложно для автоматизации. Как правило, тесты требуют, чтобы вся или почти вся система была развернута и сконфигурирована на машине, на которой они выполняются. Предположим, что вы разрабатываете web-приложение с UI и веб-сервисами. Минимальная комплектация, которая вам потребуется: браузер, веб-сервер, правильно настроенные веб-сервисы и база данных. На практике все еще сложнее. Разворачивать всё это на билд-сервере и всех машинах разработчиков?

We need to go deeper

Контравариантность и ковариантность в тензорном исчислении

Level of difficultyMedium
Reading time57 min
Views13K

Записки «чайника», травмированного тензорным исчислением

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

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

Математика остаётся непонятной для многих потому, что нам её объясняют люди, которые понимают её на интуитивном уровне, или, выражаясь более изящно, «на уровне интуитивных образов» [1-7 ≡ Л.1, с. 7]. Нам же, нематематикам, для того, чтобы что-то понять, надо это «что-то» увидеть не в абстрактном («интуитивном»), а в реальном, физически представимом пространстве (по-научному это – «визуализация») или, ещё лучше, поковырять его пальцем (научный термин пока еще не придумали. Открыт приём предложений).

Читать далее

Алгебра музыкального текста

Level of difficultyMedium
Reading time6 min
Views4.4K

Пшеничников С.Б., Сотникова Т.В.

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

У звука имеется четыре свойства: высота, длительность, громкость и тембр. Тембр пока не рассматривается. Словарь алгебры музыкальных текстов строится на основе нотной раскладки для фортепиано и современной нотной нотации.

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

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

Для применения алгебры текста к музыкальным знаковым последовательностям нет необходимости использования нотоносца из пяти линий. То, что полезно и привычно для музыкантов, - для применения алгебры невыносимо вредно. Целесообразным представляется использование нотоносца-«нитка» - это нотный стан из одной линии.  В этом случае нотный текст становится похож на вербальный текст.

Для решения задачи требуется найти преобразование канонического нотного текста в «нитку». И как всегда для нового применения алгебры необходима правильная координатизация предметной области. В данной случае каждому используемому нотному знаку  и символу современной нотной нотации требуется поставить в соответствие свой порядковый номер (натуральное число).

Читать далее

Малоизвестные и интересные особенности C и C++

Level of difficultyMedium
Reading time43 min
Views51K

В C и C++ есть особенности, о которых вас вряд ли спросят на собеседовании (вернее, не спросили бы до этого момента). Почему не спросят? Потому что такие аспекты имеют мало практического значения в повседневной работе или попросту малоизвестны.

Целью статьи является не освещение какой-то конкретной особенности языка или подготовка к собеседованиям, и уж тем более нет цели рассказать все потайные смыслы языка, т. к. для этого не хватит одной статьи и даже книги. Напротив, статья нужна для того, чтобы показать малоизвестные и странные решения, принятые в языках C и C++. Своего рода солянка из фактов. Вопрос “что делать с этими знаниями?” я оставляю читателю.

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

Читать далее

Путеводитель по гравитационным волнам

Level of difficultyMedium
Reading time18 min
Views17K

Согласно Эйнштейну, гравитация не является силой в пространстве, а проявлением кривизны пространства-времени. Массивные тела, такие как звезды, планеты и черные дыры, изгибают пространство-время по-разному, притягивая друг друга – и это взаимодействие мы называем гравитацией. Известная цитата Джона Уилера кратко это подводит: “Пространство-время говорит материи, как двигаться, материя говорит пространству-времени, как изгибаться.”

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

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

Прим. пер. Обложка из видео https://www.youtube.com/watch?v=4GbWfNHtHRg, тоже советую!

Читать далее

Эксперимент Штерна-Герлаха, сфера Блоха и квантовые вращения

Level of difficultyMedium
Reading time5 min
Views3.8K

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

Чтобы прояснить связь математики спина с экспериментом Штерна‑Герлаха (Ш‑Г) мной была сделана его программная модель. При описании спина электрона очень часто используется сфера Блоха. В программной модели эксперимент Ш‑Г, можно сказать, был совмещен со сферой Блоха. При таком подходе можно визуально увидеть геометрию некоторых соотношений описывающих спин электрона. Увидеть несколько интерактивных программ можно в браузере на сайте Bloch sphere online.

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

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

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

Читать далее

Рогатая сфера Александера — дикая конструкция, которая стала одним из символов топологии

Level of difficultyEasy
Reading time4 min
Views15K

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

Читать далее

Обобщай это, обобщай то

Level of difficultyMedium
Reading time7 min
Views6.3K


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

На этот раз мы остановимся на связи между алгебраическими кольцами и алгоритмом поиска выпуклой оболочки множества точек (convex hull).
Читать дальше →

Может ли наша реальность быть суммой всех прочих реальностей

Reading time9 min
Views11K

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

Читать далее

Квантовая запутанность глазами хакера. Часть 1

Reading time12 min
Views20K

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

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

Расчёт электрических цепей методом структурных чисел для детей и взрослых

Reading time12 min
Views15K

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

Когда я говорю о простоте, то это не фигура речи. Если бы вы сидели напротив меня я уверен, что за 15 минут я научил бы ЛЮБОГО из вас. Ни знаний физики, ни знания математики не требуется. Это похоже на магию. Вы делаете простые операции с натуральными числами и ... в конце получаете все необходимые параметры схемы. В этом сила, красота и, возможно, проклятие этого подхода.

Если бы вы сидели напротив меня... но вы не сидите, и не так-то просто изложить всё это письменно. Я постарался. Если у меня получилось, то через 20 - 30 минут вы сможете рассчитать ЛЮБОЙ пассивный четырёхполюсник с линейными элементами.

Итак, засекаем время.

Читать далее

Simulating Return Type Inference in C#

Reading time10 min
Views12K

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

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

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

Читать далее

Как писать программы с математическим совершенством

Reading time7 min
Views11K

Имя Лесли Лэмпорта, возможно, не является узнаваемым, но он стоит за несколькими великими проектами: программой для набора текста LaTeX и работой, которая сделала возможной облачную инфраструктуру в Google и Amazon. Он также уделил много внимания нескольким проблемам, дав им отличительные названия, такие как алгоритм пекарни и задача византийских генералов. Это не случайно. 81-летний учёный необычайно внимательно относится к тому, как люди используют программное обеспечение.

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

«Распределенная система — это система, где сбой компьютера, о существовании которого вы даже не подозревали, может сделать ваш собственный компьютер непригодным для использования», — сказал однажды Лэмпорт.

Одним из самых больших источников проблем являются «параллельные системы», в которых несколько вычислительных операций выполняются в течение перекрывающихся отрезков времени, что приводит к двусмысленности: часы какого компьютера являются правильными? В основополагающей статье 1978 года Лэмпорт ввел понятие «причинности» для решения этой проблемы, используя идеи специальной теории относительности. Два наблюдателя могут не согласиться с порядком событий, но если одно событие вызывает другое, это устраняет двусмысленность. А отправка или получение сообщения может установить причинно-следственную связь между несколькими процессами. Логические часы – теперь также называемые часами Лэмпорта – давали стандартный способ рассуждать о параллельных системах.

Читать далее

Как работает UI в Android. Не все так сложно

Reading time6 min
Views18K

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

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

Читать далее

10 лучших алгоритмов 20 века

Reading time7 min
Views48K
Прим. Эта статья была опубликована в майском номере 2000 года журнала SIAM. На рубеже веков появилась «мода» на подведение итогов уходящего столетия. И алгоритмы этой участи не избежали. В этой статье авторы делают обзор 10 лучших алгоритмов 20 века. Возможно, вам будет интересно узнать, какие алгоритмы, по мнению авторов списка, внесли наибольший вклад в развитие науки.

Algos — греческое слово, означающее боль. Algor — латинское слово, означающее холод. Но ни то, ни другое не является корнем слова «алгоритм», которое происходит от имени Аль-Хорезми – арабского ученого девятого века – чья книга «al-jabr wa’l muqabalah» (Китаб аль-джебр ва-ль-мукабала) переросла современные учебники по алгебре для средней школы. Аль-Хорезми подчеркивал важность методических процедур для решения задач. Будь он сегодня здесь, то, несомненно, был бы впечатлен вершинами математического метода, названного в его честь.

Часть из лучших алгоритмов компьютерной эры были освещены в январско-февральском выпуске 2000 года журнала Computing in Science & Engineering — совместном издании Американского института физики и Компьютерного общества IEEE. Приглашенные редакторы Jack Dongarra (Джек Донгарра) из Университета Теннесси и Francis Sullivan (Фрэнсис Салливан) из Института оборонного анализа составили список из 10 алгоритмов, который они назвали «Top Ten Algorithms of the Century».

«Мы попытались собрать 10 алгоритмов, оказавших наибольшее влияние на развитие и практику науки и техники в 20 веке», — пишут Донгарра и Салливан. По признанию авторов, как и в любом рейтинге, их выборы неизбежно будут спорными. Когда дело доходит до выбора лучшего алгоритма, кажется, что он и вовсе не существует.

Итак, вот список 10 лучших алгоритмов в хронологическом порядке. (Все даты и имена стоит воспринимать как аппроксимацию первого порядка. Большинство алгоритмов формируются в течение времени при участии многих ученых).
Читать дальше →
1

Information

Rating
Does not participate
Location
Villach, Kärnten, Австрия
Registered
Activity