Русский
Русский
English
Статистика
Реклама

Жуки

Спасительный пазл механика экзоскелета дьявольского жука

30.10.2020 12:22:53 | Автор: admin


Ни для кого не секрет, что эволюция это крайне длительный, сложный и порой невероятно странный процесс. Стоит взглянуть на муравьеда, птичку киви или на утконоса, как сразу же начинаешь задумываться про чувство юмора матушки-природы. Однако любые адаптационные изменения, приобретенные в ходе эволюции, всегда имеют логическое объяснение и вполне практическое применение, какими бы странными на первый взгляд они ни казались. Ученые из университета Пердью (США) решили повнимательнее изучить необычного жука вида Nosoderma diabolicum, который способен выдерживать внушительное давление. В чем особенность строения жука-экстремала, насколько он вынослив, и как человек может использовать секреты жука в инженерии? Ответы на эти вопросы мы найдем в докладе ученых. Поехали.

Основа исследования


Прежде всего стоит познакомиться с главным героем сего исследования. Жук Nosoderma diabolicum (или Phloeodes diabolicus), также называемый дьявольский броненосный жук, что для самого жука, скорее всего, крайне обидно, принадлежит к семейству зофериды (Zopheridae). Обитает данный вид на западном побережье Северной Америки.


Nosoderma diabolicum

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

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

Подготовка к взлету божьей коровки.

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

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

Результаты исследования


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


Изображение 1

Для сравнительного анализа были выбраны виды жуков, которые обладают схожими защитными механизмами как в структуре панциря (защита от давления и клевания), так и в поведении (танатоз мнимая смерть): Asbolus verrucosus, Eleodes grandicollis и Cryptoglossa muricata.

В начале сжатия P. diabolicus демонстрирует изменение жесткости с 115 Н/мм до 291 Н/мм при смещении 0.64 мм (1c). Разрушение панциря происходит при максимальной силе в 149 Н (среднее значение 133 16 Н). Эти показатели примерно в 39000 раз превышают вес его собственного тела. Для сравнения: взрослый человек, сжимающий большой и указательный пальцы вместе, создает силу в 43.0 18.4 Н.

Другие жуки, участвующие в опытах, смогли выдержать пиковую нагрузку не больше 68 Н, а отношение прочности к массе у них гораздо ниже, чем у дьявольского жука (вставка на ). Asbolus verrucosus показывал схожие с P. diabolicus результаты, но на середине процесса деформирования (т.е. при 50% от нагрузки) началось разрушение панциря.


Результаты тестов на сжатие.

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

  • медиальный шов, который навсегда соединяет два надкрылья вместе (1e);
  • латеральные (боковые) интерфейсы, соединяющие надкрылья с брюшной кутикулой и поддерживающие их (1f).

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

Медиальный шов P. diabolicus, соединяющий два надкрылья.

Сравнение P. diabolicus с его летающими родственниками показало, что такие образовании необходимы для взлета и полета насекомого (1g).

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


Изображение 2

Анализ дьявольского жука с помощью компьютерной томографии (КТ) выявил заполненную воздухом область под надкрыльями (субэлитральная полость), расположенную над брюшной полостью (черное пространство на 2a).


Сравнение макро- и микроструктур панциря у наземных и летающих жуков: P. diabolicus, A. verrucosus, C. muricata, E. grandicollis и T. dichotomus (по рядам сверху вниз).

Дальнейший анализ посредством КТ и СЭМ (сканирующий электронный микроскоп) показал наличие трех латеральных интерфейсных архитектур, которые обеспечивают поддержку надкрыльев над брюшной кутикулой: гребенчатые, защелкивающиеся и свободно расположенные элементы (2b). Также выяснилось, что эти элементы плавно сливаются друг с другом по всей длине тела (видео ниже).

Варианты латеральных интерфейсов, соединяющих надкрылья с брюшной кутикулой у P. diabolicus.

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


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

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

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

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

Вторая опора включает фиксирующую конструкцию, которая блокируется при сжатии, позволяя выдержать смещение на 40% больше при минимальном напряжении на интерфейсе (2c).

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

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

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

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

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


Изображение 3

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

Моделирование экзоскелета P. diabolicus показало относительно однородное распределение напряжения по шву из-за его эллиптической геометрии и количества соединений (3b). У других же видов в этих областях наоборот наблюдалось повышенное напряжение, особенно в местах контакта встречно-гребенчатых структур.

Геометрический анализ элементов шва (зубцов, напоминающих элементы пазла, которые необходимы для соединения кусочков) P. diabolicus показал соотношение 1.8:1 между большой полуосью (b) и точкой фокусировки (a), при этом первичная геометрия каждого элемента параметрически представлена в виде трех идентичных эллипсов, соединенных друг с другом на расстоянии под определенным углом (3c). Угол контакта между эллипсами составляет 25, что дает механическую блокировку, которая предотвращает разделение надкрылий при растяжении. Кроме того, равномерное распределение напряжений на интерфейсе лопаток панциря увеличивает максимальную жесткость на растяжение и сдвиг, а также прочность и вязкость разрушения.

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

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

Увеличение количества зубцов приводит к более равномерному распределению неупругой деформации. За счет этого соединенные надкрылья, хоть и являющиеся отдельными частями, по своим свойствам напоминают однородный материал (3d).

Более тщательный анализ показал, что максимальная прочность наблюдается у швов с двумя зубцами, тогда как максимальная жесткость наблюдается у образцов с пятью, а пиковая нагрузка с четырьмя зубцами (3e). Чем меньше задействовано зубцов, тем меньше концентрация неупругих деформаций на шейке зубца (зауженная область зубца у его основания). Такое неупругое распределение деформации может объяснить переход от пластичного разрушения (вырывание с повреждением вокруг зубцов) к хрупкому разрушению (разрушение в области шейки) при увеличении количества зубцов или при уменьшении их размера.


Изображение 4

Далее были рассмотрены различные микроструктурные эффекты, связанные с медиальным швом.

При более внимательном рассмотрении поперечных сечений медиального шва (4a) была выявлена многослойная архитектура, которая при растягивающей нагрузке показывает разрушение матрицы, указывая на локальное расслоение (4b). Контрастная визуализация показывает степень расслоения зубцов, что свидетельствует о снятии напряжения (4c). При увеличении деформации наблюдается значительное расслоение с разделением волокон между слоями (желтые стрелки на 4d).

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

Для лучшего понимания микроструктурных особенностей геометрии зубцов были созданы три модели пазла с различными значениями угла (15, 25 и 50).

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

Зубцы с углом 25 продемонстрировали более высокие нормированные значения пиковой нагрузки и ударной вязкости (4e). Подобное наблюдалось и при 15, однако при увеличении угла до 25 (как у дьявольского жука) возникает значительная деформация с последующим отслаиванием с последующим вырыванием.

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

Наконец, у сильно изогнутого зубца ( = 50) наблюдается значительная деформация шейки, за которой следует перелом (без видимого отслоения).

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

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

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


Примеры Hi-Lok креплений.

Оценка распределения деформации, прочности и рассеивания энергии (4g) показала, что композитные зубцы, имитирующие шовный материал жука, немного прочнее (около 19 1.08 МПа), чем современные инженерные крепежные детали (около 18 0.73 МПа). При этом они демонстрируют существенное увеличение (более чем 100%) рассеяния энергии во время смещения (158.0 30.4 МПа/мм против 76.5 1.4 МПа/мм).

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

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

Авторы исследования рассказывают о своих находках.

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

Эпилог


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

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

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

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

Пятничный офф-топ:
К числу необычных насекомых можно без сомнения причислить и дровосека-титана. Этот жук, обитающий в джунглях Амазонки, может вырастать до 17 см в длину. Настоящий кошмар для тех, кто страдает инсектофобией.

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

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

Немного рекламы


Спасибо, что остаётесь с нами. Вам нравятся наши статьи? Хотите видеть больше интересных материалов? Поддержите нас, оформив заказ или порекомендовав знакомым, облачные VPS для разработчиков от $4.99, уникальный аналог entry-level серверов, который был придуман нами для Вас: Вся правда о VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps от $19 или как правильно делить сервер? (доступны варианты с RAID1 и RAID10, до 24 ядер и до 40GB DDR4).

Dell R730xd в 2 раза дешевле в дата-центре Equinix Tier IV в Амстердаме? Только у нас 2 х Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 ТВ от $199 в Нидерландах! Dell R420 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB от $99! Читайте о том Как построить инфраструктуру корп. класса c применением серверов Dell R730xd Е5-2650 v4 стоимостью 9000 евро за копейки?
Подробнее..

Перевод Debugging в Julia два способа

08.12.2020 14:22:23 | Автор: admin


скришнот из metal slug 3


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


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


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


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



Кроме того, нужно знание базового синтаксиса.


Пример кода


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


В качестве примера возьмем задачку ProjectEuler problem #21. Можете попробовать решить сами. Тут будет начало реализации возможной наивной версии.


Задача заключается в следующем: мы ищем дружественные числа меньше 10 000. Дружественное число определяется как элемент дружественной пары
Пара двух целых чисел (a,b) дружна, если d(a) = b и d(b) = a, где d сумма делителей, так что d(4) = 1+2 = 3.


Дана дружная пара a = 220 и b = 284.
Мы могли бы начать с функции, которая просто берет пару и решает, является ли она дружественной.


function is_amicable(a, b)    sum_divisors(a) == b && sum_divisors(b) == aend

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

Затем нам понадобится функция sum_divisors


function sum_divisors(a)    result = 0    for i = 1:a        if a % i == 0            result += i        end    end    return resultend

которая вызывается так


julia> is_amicable(220, 284)false

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


Отладка с помощью Debugger.jl в REPL


Этот пост показывает вам два различных варианта отладки, и первый вариант может быть выполнен в REPL или в вашей IDE, то есть VSCode.


В этом разделе я объясню, как работать с отладчиком на REPL. (Debugger.jl)


julia> ] add Debuggerjulia> using Debugger

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


julia> @enter is_amicable(220, 284)In is_amicable(a, b) at REPL[7]:1 1  function is_amicable(a, b)>2      sum_divisors(a) == b && sum_divisors(b) == a 3  endAbout to run: (sum_divisors)(220)1|debug> 

Я набил @enter is_amicable(220, 284), чтобы получить этот вывод. Кстати, я только что скопировал две функции, которые я определил ранее, в REPL. С другой стороны, Вы можете создать для этого файл amicable.jl и использовать Revise и include (см. REPL and Revise.jl).


В случае файла номера строк, вероятно, более полезны.


Я вернусь через секунду...


julia> using Revisejulia> includet("amicable.jl")julia> using Debuggerjulia> @enter is_amicable(220, 284)In is_amicable(a, b) at /home/ole/Julia/opensources/blog/2020-10-27-basics-debugging/amicable.jl:1 1  function is_amicable(a, b)>2      sum_divisors(a) == b && sum_divisors(b) == a 3  endAbout to run: (sum_divisors)(220)1|debug> 

Готово. Хорошо, теперь как уже упоминалось, в конце мы собираемся запустить sum_divisors(220).


Последняя строка 1|debug> дает нам возможность исследовать дальше, прыгая по коду, в том числе и низкоуровневому, и много чего еще всякого интересного.
Можно посмотреть полный список команд: Debugger.jl commands


Вы также можете ввести ? в режиме отладчика и нажать клавишу enter, чтобы увидеть список команд

Давайте начнем с n шаг к следующей строке.


1|debug> nIn is_amicable(a, b) at /home/ole/Julia/opensources/blog/2020-10-27-basics-debugging/amicable.jl:1 1  function is_amicable(a, b)>2      sum_divisors(a) == b && sum_divisors(b) == a 3  endAbout to run: return false

Значит sum_divisors(220) != 284. Мы, вероятно, хотим перейти к вызову sum_divisors(220).


Мы всегда можем выпрыгнуть из сеанса отладки с помощью q, а затем начать все сначала
Начнем снова с @enter is_amicable(220, 284) и используем s для шага в функцию


1|debug> sIn sum_divisors(a) at /home/ole/Julia/opensources/blog/2020-10-27-basics-debugging/amicable.jl:5  5  function sum_divisors(a)> 6      result = 0  7      for i = 1:a  8          if a % i == 0  9              result += i 10          endAbout to run: 01|debug> 

А дальше продолжаем использовать n, но вы, вероятно, можете себе представить, что это займет некоторое время.


Какие еще инструменты у нас есть, чтобы проверить, что происходит?


Некоторые из вас могут подумать: Хорошо, мы должны, по крайней мере, выяснить, что мы возвращаем, и мы можем просто вызвать sum_divisors(220). Это, вероятно, правильно, но не показывает возможности отладчика. Давайте представим, что мы имеем доступ только к режиму отладчика и не можем просто вызвать функцию.


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


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


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


Вы можете сделать это с помощью bp add, а затем указать файл, номер строки и возможное условие. Вы можете увидеть все параметры с помощью ? в режиме отладки.


В наших интересах будет поставить bp add 12. После этого мы можем использовать команду c, которая расшифровывается как continue (до точки останова).


1|debug> cHit breakpoint:In sum_divisors(a) at /home/ole/Julia/opensources/blog/2020-10-27-basics-debugging/amicable.jl:5  8          if a % i == 0  9              result += i 10          end 11      end>12      return result 13  endAbout to run: return 504

Итак, теперь мы знаем, что оно возвращает 504 вместо 284. Теперь мы можем использовать `, чтобы перейти в режим Джулии. (Я знаю, что это вроде как запрещено нашими правилами, но время от времени это имеет смысл, и мы видим, что мы находимся в 1|julia>, а не в julia>, так что я думаю, что все в порядке...)


504-284 это не самый сложный расчет, но мы можем использовать julia, чтобы сделать это за нас, не выходя полностью из режима отладки, используя:


1|debug> `1|julia> 504-284220

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


А это значит, что мы можем сделать:


function sum_divisors(a)    result = 0    #for i = 1:a    for i = 1:a-1        if a % i == 0            result += i        end    end    return resultend

чтобы избежать эту проблему.


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

Мы можем выйти из режима вычислений с помощью backspace, а затем q, чтобы выйти из режима отладки. Запускаем


julia> is_amicable(220, 284)true

и видим, что мы выковыряли этот баг.


Давайте запустим его в последний раз в сеансе отладки и посмотрим на переменные. Снова перейдем к точке останова c и запустим


1|debug> w add i1] i: 2191|debug> w add a1] i: 2192] a: 220

Теперь мы видим переменные. Если мы снова нажмем c, то снова перейдем к точке разрыва (для очередного вычисления sum_divisors(284) == 220).
Мы можем снова использовать букву w, чтобы увидеть список переменных в области видимости:


1|debug> w1] i: 2832] a: 284

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


Использование VSCode


Я думаю, что большинство разработчиков Julia используют VSCode IDE и, по крайней мере, иногда, vim, emacs или еще что-то такое неудобное Ладно, это, наверное, просто слишком неудобно для меня


Определенно пришло время переключиться на VSCode с Atom/Juno, поскольку расширение Julia теперь разработано для VSCode вместо Atom.


Поскольку это IDE, имеет смысл иметь более визуальный отладчик, чем тот, который описан в предыдущем разделе.



Он довольно прост в навигации, и по умолчанию вы получаете больше выходных данных.


Чтобы начать сеанс отладки, вы нажимаете на кнопку с ошибкой и воспроизводите знак слева, пока у вас открыт файл julia.
Я добавил последнюю строку is_amicable(220, 284), так как VSCode просто запускает программу.


Вы можете добавить точку останова, щелкнув слева от номера каждой строки.


Я сделал снимок экрана после того, как сделал эти шаги, и последним шагом было нажатие на кнопку отладки.


Через несколько секунд сеанс отладки приостанавливается по мере достижения точки останова. С левой стороны можно увидеть локальные переменные в этой позиции. Это этап после того, как я исправил ошибку, так что вы можете видеть, что возвращается правильный результат "284". Однако вы также получаете значение для a и i.


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


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


Вы можете спросить себя: Ну, на самом деле это не два способа отладки, не так ли? Это примерно одно и то же, только с другим графическим интерфейсом.


Это правда! Вот почему я сейчас перехожу к следующему разделу поста


Infiltrator.jl для скорости


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


Можно перейти в скомпилированный режим с отладчиком, но это экспериментально, и, по крайней мере, для меня он никогда не останавливался на точке останова.


Некоторые другие пакеты пытаются исправить эту проблему, делая какую-то причудливую магию, но я лично большой поклонник Infiltrator.jl. Правда, некоторое время не было никаких обновлений, и у меня есть некоторые проблемы с ним, но мне нравится сама идея.


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


Infiltrator.jl идет совершенно другим путем. Прежде всего, вам нужно немного изменить свой код. Он предоставляет макрос @infiltrate. О боже, как я люблю это название


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


Я снова продемонстрирую это на примере разобранном выше. Подобного рода использование было в debugging ConstraintSolver.jl.


Я скопировал код сверху и просто добавил using Infiltrator и @infiltrate.


using Infiltratorfunction is_amicable(a, b)    sum_divisors(a) == b && sum_divisors(b) == aendfunction sum_divisors(a)    result = 0    for i = 1:a-1        if a % i == 0            result += i        end    end    @infiltrate    return resultendis_amicable(220, 284)

При запуске кода с include("amicable.jl") получаем:


Hit `@infiltrate` in sum_divisors(::Int64) at amicable.jl:14:debug> 

Это означает, что мы знаем, какая точка останова была достигнута, и видим тип переменной, которую мы назвали sum_divisors. Однако в отличие от Debugger.jl мы не видим кода.


Вы можете снова увидеть раздел справки с помощью ?


debug> ?  Code entered is evaluated in the current function's module. Note that you cannot change local  variables.  The following commands are special cased:    - `@trace`: Print the current stack trace.    - `@locals`: Print local variables.    - `@stop`: Stop infiltrating at this `@infiltrate` spot.  Exit this REPL mode with `Ctrl-D`, and clear the effect of `@stop` with `Infiltrator.clear_stop()`.

Существует не так уж много команд, поэтому мы можем просто попробовать их одну за другой:


debug> @trace[1] sum_divisors(::Int64) at amicable.jl:14[2] is_amicable(::Int64, ::Int64) at amicable.jl:4[3] top-level scope at amicable.jl:18[4] include(::String) at client.jl:457

Таким образом, мы пришли из is_amicable и можем видеть типы, а также имя файла и номер строки, что полезно при использовании multiple dispatch.


debug> @locals- result::Int64 = 284- a::Int64 = 220

мы можем видеть локальные переменные, которые похожи на те, которые мы видели в представлении переменных VSCode.


Кроме того, мы можем просто вычислять выражения прям в этом режиме. Для Infiltrator.jl нет необходимости использовать `, чтобы переключиться на вычисления.


debug> a == 220true

Вы можете использовать @stop, чтобы больше не останавливаться на этой вехе, и Infiltrator.clear_stop(), чтобы очистить эти остановки.


Давайте не будем использовать @stop сейчас, а вместо этого перейдем к следующей точке @infiltrate с помощью CTRL-D:


Hit `@infiltrate` in sum_divisors(::Int64) at amicable.jl:14:debug> 

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


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


Давайте рассмотрим сравнение двух различных способов в следующем разделе.


Выводы


Мы посмотрели на Debugger. jl, который дает вам всю информацию, которая может понадобиться в вашем REPL.
Поэтому он не зависит от редактора.


Следующий инструмент, который я упомянул, был дебагер в VSCode который является в основном просто графическим интерфейсом для Debugger.jl. Вероятно, его удобнее использовать людям, которые любят работать с IDE. Хотя в Debugger.jl могут быть некоторые опции, которые недоступны в графическом интерфейсе, как это часто бывает.


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


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


Спасибо за то, что дочитали и особая благодарность моим 10 покровителям!


Я буду держать вас в курсе Twitter OpenSourcES.

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru