Простая визуализация структур данных в Java (OSEDUCONF-2021) — различия между версиями
Материал из 0x1.tv
StasFomin (обсуждение | вклад) |
StasFomin (обсуждение | вклад) |
||
…лнительных настроек отрисовки графов и более удобным интерфейсом для пользователя. LJV можно использовать для реверс-инжиниринга, а также он будет удобен преподавателям и студентам, чтобы изучать алгоритмы и структуры данных </blockquote> {{VideoSection}} {{vimeoembed|541382248|800|450}} {{youtubelink|}} |AjXb5kuQ-VE}} {{SlidesSection}} [[File:Простая визуализация структур данных в Java (OSEDUCONF-2021).pdf|left|page=-|300px]] {{----}} == Thesis == |
Текущая версия на 14:52, 12 мая 2022
- Докладчик
LJV (Lightweight Java Visualizer) — инструмент визуализации структур данных Java с использованием Reflection API для прохода по объекту и GraphViz для отрисовки. Проект изначально был разработан Джоном Хамером (John Hamer) в 2004 году на Java 1.4 под лицензией GPL, но с тех пор не обновлялся. Нами проект был переписан на современную версию языка Java, выложен на GitHub, а также добавлены новые фичи в виде дополнительных настроек отрисовки графов и более удобным интерфейсом для пользователя. LJV можно использовать для реверс-инжиниринга, а также он будет удобен преподавателям и студентам, чтобы изучать алгоритмы и структуры данных
Содержание
Видео
Презентация
Thesis
История проекта
В 2004 году Джон Хаммер, который работал в Новой Зеландии, разработал инструмент для обучения студентов, чтобы они лучше освоили структуры данных. Долгое время, инструмент был написан на Java 1.4 и запускал заранее предустановленный на компьютере GraphViz. Но в осенью 2020 года мы решили возобновить проект. В первую очередь перед нами стоит цель исправить такие недостатки как: морально устаревший программный интерфейс (API), привязка к локально установленному GraphViz и отсутствие использования возможностей GraphViz новых версий.
Применение в преподавании и использование в Java Community
Изначальная идея возрождения проекта возникла в рамках подготовки курса Core Java Ивана Пономарёва для МФТИ. Диаграммы полученные с помощью LJV применялись на соответствующих лекциях о стандартных структурах данных в Java. Кроме того, была сделана интернет-публикация[1] и сделано выступление на профессиональной Java конференции SnowOne 2021[2][3][4], которые вызвали определённый интерес в сообществе Java-разработчиков.
Принцип работы
В режиме runtime инструмент строит внутреннее представление графа объектов памяти, используя Reflection API. Мы рекурсивно начинаем от передаваемого объекта и заходим в каждый связанный объект и собираем необходимую информацию. По ходу работы мы также формируем GraphViz представление с собранной информацией и сохраняем в текст на языке DOT, чтобы затем на его основе пользователь мог самостоятельно нарисовать граф в установленном локально приложении или с помощью онлайн-сервисов.
Изменения
Нами проделаны следующие задачи:
Мы обновили проект до Java 11, использовав практики построения API, которые выработались за 16 лет, а также новые возможности языка. Мы не стали писать на Java 14, так как данная версия ещё не стала популярнее Java 11, а мы ставим цель охватить больше людей, в частности преподавателей и студентов.
Полностью перестроен принцип генерации графа c использованием новых возможностей GraphViz, которые, в свою очередь, позволили легко добавить некоторую новую функциональность -- например, выбор направления отрисовки графа. Поэтому теперь пользователям доступна ещё больше возможных вариантов графа.
Изменён API инструмента на удобный method chaining, чтобы добавлять новые параметры к одному объекту.
А также код и документация выложены на Github, а сам проект доступен для скачивания в Maven Central.
Как использовать
У объекта LJV есть метод drawGraph куда мы передаём объект, который мы хотим визуализировать. Метод возвращает строку, которую мы загрузили в онлайн-сервис http://dreampuf.github.io и получили изображение:
<source lang="java">
String graph = new LJV().drawGraph("Hello");
</source>
Также перед вызовом drawGraph можно передать различные параметры:
<source lang="java"> String graph = new LJV()
.setTreatAsPrimitive(Integer.class) .addFieldAttribute({"next", "color=red,fontcolor=red") .addFieldAttribute("prev", "color=blue,fontcolor=blue") .addFieldAttribute("first", "color=red,fontcolor=red") .addFieldAttribute("last", "color=red,fontcolor=red") .drawGraph(linkedList);
</source>
Примечания и ссылки
- ↑ John Hamer, Visualizing Data Structures as Graphs, ACE 2004 conference, https://www.cs.auckland.ac.nz/~j-hamer/ACE04-paper.pdf
- ↑ Ivan Ponomarev, LJV: What We Can Learn From Java Data Structures Visualization, https://dzone.com/articles/what-can-we-learn-from-java-data-structures-visual
- ↑ Иван Пономарёв. LJV: Чему нас может научить визуализация структур данных в Java -- доклад на Java-конференции SnowOne, 2021 г., https://snowone.ru/speakers/ivan_ponomarev
- ↑ Иван Пономарёв. LJV: Чему нас может научить визуализация структур данных в Java -- слайды к докладу на Java-конференции SnowOne, 2021 г., https://inponomarev.github.io/ljvtalk/
- Текущая версия проекта, https://github.com/atp-mipt/ljv
- Изначальная версия проекта, https://www.cs.auckland.ac.nz/~j-hamer/LJV.html
Plays:0 Comments:0