
Привет, хабр! Под катом мы посетим китайский завод, где делают двигатели, заглянем внутрь ПЛК да попрограммируем его на разных языках, включая Си и C++, вплоть до ассемблера.
Инженер
Привет, хабр! Под катом мы посетим китайский завод, где делают двигатели, заглянем внутрь ПЛК да попрограммируем его на разных языках, включая Си и C++, вплоть до ассемблера.
Привет, Хабр. Меня зовут Павел Преблагин, я работаю в команде инжиниринга производительности Positive Technologies. Мы анализируем разные продукты компании и пытаемся так или иначе оптимизировать их изнутри. Как уже можно понять, команда наша мультипроектная: у нас нет постоянной кодовой базы, кроме некоторых инструментов анализа и тестирования. Обычно коллеги из других отделов приносят нам для изучения свою, написанную преимущественно на C++, если у них есть подозрения, что что-то работает не так быстро, как должно было бы. Мы в ответ приносим им результаты замеров, патчи и рекомендации.
Хотя наша команда относительно молодая, мы уже успели пройтись по нескольким таким продуктам и нанести непоправимую пользу. Все эти проекты разные и принадлежат разным командам, но мы заметили, что некоторые проблемы встречались в той или иной комбинации везде, носили общий характер, а решались примерно одинаково и порой без серьезных усилий. Цель этой статьи — показать подборку из таких, часто встречаемых, ситуаций вместе с возможными вариантами их решения. Кейсы могут показаться тривиальными или даже глупыми, но факт остается фактом: подобное мы наблюдаем с определенным постоянством и видели в других компаниях, еще до прихода в Позитив.
«Чтобы иметь право называть себя профессионалом, вы должны писать чистый код. Нет никаких разумных оправданий тому, чтобы не стремиться к лучшему». Clean Code
Однажды, выполнив в Гугле запрос "Three body problem" ("Задача трёх тел"), я был просто поражен - первая страница результатов состояла только из ссылок на роман китайского писателя-фантаста Лю Цысиня с соответствующим названием, а также на телесериал, снятый по этому роману, т.е. ссылок на собственно задачу трёх тел не было вообще! Мне это показалось удивительным и несправедливым, поскольку сама по себе задача трёх тел тоже может выглядеть увлекательной в популярном изложении. В этой публикации я постарался привести некоторые доказательства этого утверждения.
Записки «чайника», травмированного тензорным исчислением
Тема, заявленная в названии, пожалуй, самая запутанная в тензорном исчислении. Высокоучёные авторы мудрых книг в большинстве случаев ограничиваются только формальными определениями понятий ко- и контравариантности, не опускаясь до подробного пояснения их геометрической и физической сути. Похоже, в этом вопросе они сознательно или бессознательно воспроизводят ситуацию, характерную для квантовой физики: «Не старайтесь понять, просто считайте!». Но если в квантовой физике подобный подход безальтернативен, то в данном случае – вряд ли.
Подзаголовок даже комплиментарен для меня, поскольку в своём восприятии математики я даже не «чайник», а, скорее, «валенок». По этой причине мне очень хорошо понятны проблемы «чайников», с которыми они сталкиваются в попытках постичь математические абстракции. Поэтому материал предназначен не для «продвинутых», они и без меня разберутся, а для… В общем, для таких же, как я, «задвинутых» в математике (только в ней!). При этом предполагается хотя бы «шапочное» знакомство с тензорным исчислением.
Математика остаётся непонятной для многих потому, что нам её объясняют люди, которые понимают её на интуитивном уровне, или, выражаясь более изящно, «на уровне интуитивных образов» [1-7 ≡ Л.1, с. 7]. Нам же, нематематикам, для того, чтобы что-то понять, надо это «что-то» увидеть не в абстрактном («интуитивном»), а в реальном, физически представимом пространстве (по-научному это – «визуализация») или, ещё лучше, поковырять его пальцем (научный термин пока еще не придумали. Открыт приём предложений).
Пшеничников С.Б., Сотникова Т.В.
Нотный текст можно представить с помощью правильной координатизации матричными единицами подобно описанию вербальных текстов и других знаковых последовательностей. В дальнейшем может стать возможным математическое распознавание и создание музыкального смысла с предметным обоснованием промежуточных вычислений (в отличие от AI).
У звука имеется четыре свойства: высота, длительность, громкость и тембр. Тембр пока не рассматривается. Словарь алгебры музыкальных текстов строится на основе нотной раскладки для фортепиано и современной нотной нотации.
Длительность здесь для краткости первого изложения учитывается как «абсолютная». «Относительная» не рассматривается, хотя интервалы очень хорошо изучены и их признаки потребуются для категоризации композиторов.
Сложность музыкального текста для применения математики объясняется стремлением упростить чтение музыкантами нотных знаков на стане из пяти линий и минимизации использования нижних и верхних добавочных линий.
Для применения алгебры текста к музыкальным знаковым последовательностям нет необходимости использования нотоносца из пяти линий. То, что полезно и привычно для музыкантов, - для применения алгебры невыносимо вредно. Целесообразным представляется использование нотоносца-«нитка» - это нотный стан из одной линии. В этом случае нотный текст становится похож на вербальный текст.
Для решения задачи требуется найти преобразование канонического нотного текста в «нитку». И как всегда для нового применения алгебры необходима правильная координатизация предметной области. В данной случае каждому используемому нотному знаку и символу современной нотной нотации требуется поставить в соответствие свой порядковый номер (натуральное число).
В C и C++ есть особенности, о которых вас вряд ли спросят на собеседовании (вернее, не спросили бы до этого момента). Почему не спросят? Потому что такие аспекты имеют мало практического значения в повседневной работе или попросту малоизвестны.
Целью статьи является не освещение какой-то конкретной особенности языка или подготовка к собеседованиям, и уж тем более нет цели рассказать все потайные смыслы языка, т. к. для этого не хватит одной статьи и даже книги. Напротив, статья нужна для того, чтобы показать малоизвестные и странные решения, принятые в языках C и C++. Своего рода солянка из фактов. Вопрос “что делать с этими знаниями?” я оставляю читателю.
Если вы, как и я, любите и интересуетесь C/C++, и эти языки являются неотъемлемой частью вашей жизни, в том числе и его углубленного изучения, то эта статья для вас. По большей части я надеюсь, что эта статья сможет развлечь и заставить поработать головой. И если получится, рассказать что-то, чего вы, возможно, еще не знали.
Согласно Эйнштейну, гравитация не является силой в пространстве, а проявлением кривизны пространства-времени. Массивные тела, такие как звезды, планеты и черные дыры, изгибают пространство-время по-разному, притягивая друг друга – и это взаимодействие мы называем гравитацией. Известная цитата Джона Уилера кратко это подводит: “Пространство-время говорит материи, как двигаться, материя говорит пространству-времени, как изгибаться.”
Пространству-времени разрешается растягиваться, сжиматься и крутиться. Гравитационные волны – это волны в пространстве-времени, которые, как предсказывает общая теория относительности, излучаются, когда массивные тела двигаются ассиметричным образом.
В этом путеводители мы разберемся, что такое гравитационные волны, откуда они берутся и как их регистрировать.
Прим. пер. Обложка из видео https://www.youtube.com/watch?v=4GbWfNHtHRg, тоже советую!
В 1921 году Отто Штерн приехал в город Франкфурт, где познакомился в уроженцем этого города и сотрудником местного университета Вальтером Герлахом, вместе с которым они в том же году и провели прославивший их опыт. Впоследствии выяснилось, что почти всю математику описывающую, спин отдельного электрона, можно вывести из этого эксперимента. Читая описание эксперимента, такой вывод совершенно не кажется очевидным. Хотя бы, например, с какой стати в математике спина электрона появляются комплексные числа?
Чтобы прояснить связь математики спина с экспериментом Штерна‑Герлаха (Ш‑Г) мной была сделана его программная модель. При описании спина электрона очень часто используется сфера Блоха. В программной модели эксперимент Ш‑Г, можно сказать, был совмещен со сферой Блоха. При таком подходе можно визуально увидеть геометрию некоторых соотношений описывающих спин электрона. Увидеть несколько интерактивных программ можно в браузере на сайте Bloch sphere online.
При создании данного сайта использовалась главным образом школьная математика. В основном тригонометрия и простейшие действия с комплексными числами, а также формула Эйлера. Также для понимания материала требуются первоначальные сведения о матрицах.
Как производится возведение числа в степень, когда в качестве показателя степени выступает матрица, рассматривается непосредственно в тексте на сайте.
При рассмотрении примеров из четвертой части требуется понимание того, чем являются собственные числа и собственные векторы. Но четвертая часть фактически является факультативным дополнением к первым трем частям и читать ее необязательно.
Сегодня я хочу поговорить с Вами о красивейшей из наук - топологии. Начнем мы с очень тривиального рассуждения (за простотой формулировки которого кроется целая бездна), а закончим построением и изучением удивительного объекта - рогатой сферы Александера.
Интеграл по траекториям, предложенный Ричардом Фейнманом – это одновременно и мощный прогностический аппарат, и философское обоснование того, каков на самом деле мир. Но физики до сих пор затрудняются пользоваться этим инструментом, а также силятся понять, какой в нём смысл.
Когда я узнал об этом подходе, то первым ощущением было чувство, что меня где-то обманывают - или это какая-то ошибка и заблуждение, или от меня что-то скрывали все предыдущие годы обучения. Метод выглядел эффективным и удивительно простым в применении, но при этом я никогда не слышал о нём раньше. Как такое могло случиться?
Когда я говорю о простоте, то это не фигура речи. Если бы вы сидели напротив меня я уверен, что за 15 минут я научил бы ЛЮБОГО из вас. Ни знаний физики, ни знания математики не требуется. Это похоже на магию. Вы делаете простые операции с натуральными числами и ... в конце получаете все необходимые параметры схемы. В этом сила, красота и, возможно, проклятие этого подхода.
Если бы вы сидели напротив меня... но вы не сидите, и не так-то просто изложить всё это письменно. Я постарался. Если у меня получилось, то через 20 - 30 минут вы сможете рассчитать ЛЮБОЙ пассивный четырёхполюсник с линейными элементами.
Итак, засекаем время.
Мне по-настоящему нравится больше чего-либо в разработке ПО делать фреймворки, позволяющие другим разработчикам создавать что-то крутое. Иногда, в погоне за идеальным кодом, мне на ум приходят странные идеи, при реализации которых C# может дойти до предела своих возможностей.
Не так давно произошёл подобный случай, когда мы вместе с коллегой искали способ избежать передачи большого количества типовых параметров в тех местах, где компилятор должен был по идее их вывести. Однако, C# так устроен, что способен выводить типы в обобщённых вызовах только из передаваемых параметров метода.
В этой статье покажу небольшой трюк, который позволит симулировать вывод типов для возвращаемых значений, и немного примеров, где это может быть полезно.
Имя Лесли Лэмпорта, возможно, не является узнаваемым, но он стоит за несколькими великими проектами: программой для набора текста LaTeX и работой, которая сделала возможной облачную инфраструктуру в Google и Amazon. Он также уделил много внимания нескольким проблемам, дав им отличительные названия, такие как алгоритм пекарни и задача византийских генералов. Это не случайно. 81-летний учёный необычайно внимательно относится к тому, как люди используют программное обеспечение.
В 2013 году он выиграл Премию Тьюринга, считающуюся Нобелевской премией в сфере вычислительной техники, за его работу над распределенными системами, в которых несколько компонент в разных сетях координируются для достижения общей цели. Интернет-поиск, облачные вычисления и искусственный интеллект – все это требует совместной работы легионов мощных вычислительных машин. Конечно, такого рода координация создает много проблем.
«Распределенная система — это система, где сбой компьютера, о существовании которого вы даже не подозревали, может сделать ваш собственный компьютер непригодным для использования», — сказал однажды Лэмпорт.
Одним из самых больших источников проблем являются «параллельные системы», в которых несколько вычислительных операций выполняются в течение перекрывающихся отрезков времени, что приводит к двусмысленности: часы какого компьютера являются правильными? В основополагающей статье 1978 года Лэмпорт ввел понятие «причинности» для решения этой проблемы, используя идеи специальной теории относительности. Два наблюдателя могут не согласиться с порядком событий, но если одно событие вызывает другое, это устраняет двусмысленность. А отправка или получение сообщения может установить причинно-следственную связь между несколькими процессами. Логические часы – теперь также называемые часами Лэмпорта – давали стандартный способ рассуждать о параллельных системах.
Одна из фундаментальных тем в разработке под Android это работа с UI. Понимание того, как работает UI не даст многого в практическом плане, зато уменьшит вероятность того, что вы натворите полную дичь.
Это статья должна дать хоть и не исчерпывающее представление о том как работает UI в Android, но простым языком объяснит основные концепции и на каких сущностях он построен.