Викиверситет ruwikiversity https://ru.wikiversity.org/wiki/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0 MediaWiki 1.47.0-wmf.23 first-letter Медиа Служебная Обсуждение Участник Обсуждение участника Викиверситет Обсуждение Викиверситета Файл Обсуждение файла MediaWiki Обсуждение MediaWiki Шаблон Обсуждение шаблона Справка Обсуждение справки Категория Обсуждение категории Портал Обсуждение портала Факультет Обсуждения факультета TimedText TimedText talk Модуль Обсуждение модуля Event Event talk App Inventor 0 24902 166737 157488 2026-10-06T13:01:47Z Mitte27 13295 /* {{якорь|algorithm}} Алгоритм работы */ 166737 wikitext text/x-wiki [[Файл:Interfície App Inventor.png|мини|Интерфейс программы App Inventor. Реклама: курс научит делать игры и анимацию, доступен детям с 8 лет, простой и весёлый язык программирования.]] {{Материалы|кафедры|Программирование}} '''Программирование андроидов для школьников (с рисунками, видео и упражнениями)''' — это курс, обучающий программированию в визуальной среде "App Inventor for Android". Каждая глава курса раскрывает какую-либо тему, снабжена иллюстрациями и обучающим видео. Интерактивный опросник в конце главы позволяет проверить усвоение материала. Автором курса является [[Участник:AKA MBG|Крижановский Андрей]] и студенты [[w:Петрозаводский государственный университет|Петрозаводского государственного университета]] (предмет "Интернет-математика"). Студентам предложен алгоритм и ряд требований к написанию глав курса. Курс предназначен для школьников и учителей, преподающих информатику. Если у вас есть вопросы и пожелания, то пишите, пожалуйста, на [[Обсуждение:App Inventor|странице обсуждения курса]]. В курсе изложены основы работы в среде "App Inventor for Android". Вы научитесь создавать увлекательные игры, делать анимацию, проигрывать мелодии. При этом познакомитесь с базовыми идеями программирования. == {{якорь|results}} Результаты == В результате работы студенты курса создадут следующие произведения искусства. Будет написана глава (подстраница этой страницы) с рассказом об одной из сторон визуального языка программирования и о работе в среде "App Inventor for Android". В этом поможет знание [[w:ВП:вики-разметка|вики-разметки]]. На одном из занятий студенты выступают с докладом и рассказывают сокурсникам содержание своей главы. Эта подстраница Викиверситета (за исключением интерактивной части) превращается в часть книги и копируется на GitHub в проект [https://github.com/componavt/student_paper student_paper/app_inventor/]. Здесь пригодятся знания LaTeX'а и GitHub. См. учебники [[b:LaTeX|LaTeX]] и [[v:en:Version Control/Git|Version Control/Git]]. Полученные навыки разработки визуальных программ применяете для создания образовательной игры, при этом в игре будут использоваться результаты запросов к Викиданным. Для извлечения данных с сайта Викиданных пригодится курс [[Программирование Викиданных]]. == {{якорь|algorithm}} Алгоритм работы == {| class="wikitable collapsible" !colspan="3" style="background:#CCCCFF"|Задание для студентов |- !N||Описание |- |1 🎮||<font style="color:#2F4F4F">'''Выбор задачи (будущая глава учебника)'''</font> # Выберите математическую задачу (из этих книг: [https://yadi.sk/d/TqMcS0Nx5xeEbg Б. А. Кордемского или М. Гарднера]), напишите (ниже на этой странице в разделе "Задачи") название этой задачи, из какой книги взять (+ номер страницы), допишите справа ФИО и ник (задачи не должны повторяться). Весь этот текст идёт в одну строчку. # 🎮 Зарегистрируйтесь на сайте [http://ai2.appinventor.mit.edu ai2.appinventor.mit.edu]. # Сообщите преподавателю на [[Обсуждение участника:AKA MBG|его странице обсуждения]] название своей главы на этой странице в Викиверситете. Для этого предварительно зарегистрируйтесь в Википедии или в Викиверситете (логин единый). Этапы работ, связанных с созданием кода на сайте ai2.appinventor.mit.edu, отмечены в этой таблице значком 🎮. Довесок: <font style="color:green">оформить главу курса [[Работа в вики-среде (с упражнениями)]]</font>. |- |2 🅛||<font style="color:#2F4F4F">'''Становимся авторами книги (LaTeX, GitHub)'''</font> # 🅛 Зарегистрируйтесь на сайте [[w:GitHub|GitHub]]. Сообщите преподавателю свой логин. Затем вы получите приглашение к редактированию проекта [https://github.com/componavt/student_paper student_paper]. После каждого выполненного этапа работы (со значком 🅛) скопируйте текст и иллюстрации из Викиверситета на GitHub. Проверьте, что после добавления текста в LaTeX — этот текст компилируется в PDF-файл без ошибок. Текст в LaTeX является копией вашей статьи в Викиверситете, за исключением видео и интерактивных опросников. # Нужно успеть за 24 часа до следующего занятия добавить свою фамилию и имя (после имени преподавателя и других студентов, кто успел раньше) на третью страницу книги. Для этого нужно скачать себе на компьютер файлы проекта ''student_paper'', отредактировать файл ''ai1book.tex'' и залить его обратно на GitHub. [https://git-scm.com/book/ru/v2/Appendix-C%3A-%D0%9A%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D1%8B-Git-%D0%A1%D0%BE%D0%B2%D0%BC%D0%B5%D1%81%D1%82%D0%BD%D0%B0%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D0%B8-%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%BE%D0%B2 Будьте внимательны] и учтите, что с этим проектом работает сразу несколько студентов. Довесок: <font style="color:green">оформить главу курса [[Работа в вики-среде (с упражнениями)]]</font>. |- |3 🎮||<font style="color:#2F4F4F">Создание первого окна приложения '''About''' (об авторе, благодарности и о приложении)</font> Напишите приложение, которое будет содержать всего две кнопки: "Описание" и "Автор". # По нажатию на кнопку "Описание": #* всплывает текст с описанием задачи и сути игры, #* указан источник задачи (название книги, автор, год издания, страница) или ничего, если вы ‒ автор идеи. # По нажатию на кнопку "Автор": #* играет музыкальная композиция с открытой лицензией (в поисковике [https://soundcloud.com soundcloud.com] выберите музыкальное направление, например, jazz и укажите фильтр по трекам "To listen to" = "To modify commercially"), #* указан текст с вашими именем и фамилией, #* указано название музыкальной композиции, её автор и лицензия мелодии, #* появляется фоновая картинка, соответствующая задаче, имеющая открытую лицензию, также текст с указанием автора картины, названия и её лицензии. # Пришлите по почте преподавателю [http://appinventor.mit.edu/explore/ai2/share.html исходный код в виде файла с .aia] расширением. Решение будет зачтено при отправке более чем за 24 часа до начала занятия. <font style="color:green">'''Музыкальный довесок'''</font>: загрузить фрагмент любимого музыкального произведения по правилам [[w:ВП:КДИ]] для оформления статьи в Википедии о певце, группе или музыкальной композиции, если о них есть соответствующая статья. Пример работы наших студентов [[w:en:File:Infected Mushroom Animatronica cut.ogg|у них]] и [[w:Файл:Machinae Supremacy Player One 30sec.ogg|у нас]]. |- |4 🅛||<font style="color:#2F4F4F">'''Придумываем свою оригинальную математическую задачу''', основываясь на идее из книги, для последующей реализации в приложении</font> # На занятии рассказать преподавателю и студентам исходную задачу, взятую из книги. # Дать пять минут на размышление. Выслушать предлагаемые решения задачи. Обсудить эти решения. # Рассказать коллегам, какое решение есть у вас или предложено в книге. # Предложить альтернативную задачу, либо основанную на идее задачи из книги, либо совершенно новую задачу, но '''свою'''. # Дать пять минут на размышление. Выслушать предлагаемые решения задачи. Обсудить эти решения. Рассказать своё решение. # Описание своей свежепридуманной оригинальной задачи (без ответа) изложите на вашей подстранице курса. # Это же описание внесите в свою главу в LaTeX'е в проекте student_paper. Ваш латеховский файл создан преподавателем и находится в папке [https://github.com/componavt/student_paper/tree/master/app_inventor/chapter chapter]. Проверьте, что файл ''ai1book.tex'' продолжает компилироваться без ошибок. После этого "залейте" свой файл на GitHub. # Дополнительного задания не будет при загрузке латеховского файла более чем за 24 часа до начала занятия. Для написания математических формул используйте разметку TeX. См. примеры и подсказки в учебнике [[w:Википедия:Формулы|Википедия:Формулы]]. <font style="color:green">'''Минизадачи'''</font>: написать решение одной [[#Минизадачи|минизадачи]] в виде подстраницы этого курса. Решение должно содержать скриншот, загруженный на Викисклад. Преобразовать полученный викитекст в формат LaTeX и добавить в проект student_paper в папку ''cookbook''. Предварительно согласовать с преподавателем, какую минизадачу будете решать. |- |5 🎮||{{якорь|programming}} <font style="color:#2F4F4F">'''Программирование'''</font> Напишите программу в среде "App Inventor", идею котороый вы изложили в своей статье ранее. # Опубликуйте свою программу, см. [[/Галерея]]. # Поставьте ссылку в своей статье в разделе "Ссылки" на эту программу. Постарайтесь максимально использовать возможности комментирования кода, но только на чистом английском языке. Дополнительное задание. <font style="color:green">Поработайте на славу Петрозаводского государственного университета, см. [[w:Участник:AKA MBG/ПетрГУ|ПетрГУ]]</font>. |- |6 🎮 🅛||⛄{{якорь|image}} <font style="color:#2F4F4F">'''Иллюстрирование статьи'''</font>. Добавьте в свою главу LaTeX'а и на свою вики-страницу в этом курсе иллюстрации с помощью Викисклада. [[Файл:Illustrating Wikipedia brochure ru.pdf|thumb|250px|Иллюстрирование Википедии: Руководство по размещению файлов на Викискладе (перевели на русский студенты ПетрГУ)]] При написании программы вам пришлось решать различные технические задачи и преодолевать ограничения визуального языка программирования. Возможно, вы написали нетривиальную процедуру, которой было бы интересно поделиться с читателями. Сделайте скриншот экрана с тем фрагментом кода, который в дальнейшем вы хотите пояснить в статье. В своей статье после иллюстрации, снабжённой полноценной развёрнутой подписью на русском языке, напишите ‒ что изображено на рисунке. Какие выводы может сделать читатель из этой иллюстрации? Если иллюстраций несколько, то напишите свои пояснения к каждой иллюстрации. И попытайтесь обобщить свой опыт, переходя от своей конкретной задачи к обсуждению особенностей и тонкостей, связанных с работой в среде "App Inventor". Замечания: * загрузите иллюстрации на Викисклад (файл с рисунком или анимацией называйте длинно (3-7 слов) и только по-английски). Для загрузки новых версий рисунков не создавайте новых страниц на Викискладе, а жмите кнопку "Загрузить новую версию файла" / "Upload a new version of this file"; * у загруженного на Викисклад файла укажите категорию [[commons:Category:App Inventor at Wikiversity|Category:App Inventor at Wikiversity]], см. примеры работы других студентов в этой категории. Прочитайте [https://drive.google.com/file/d/0B5yjAmdZqsqNMnk5YmFwR29uNGs/edit брошюру об основах иллюстрирования статей в Википедии и работе на Викискладе], которую перевела на русский язык группа студентов ПетрГУ в 2014 году; * если вы случайно загрузили файл с иллюстрацией локально, то есть в Викиверситет, а не на Викисклад, то поставьте на этот файл-страницу помету к удалению, см. [[ВВ:КБУ]]. И загрузите этот файл на Викисклад. См. [[w:ru:Участник:AKA MBG/task#figure|подробности и правила оформления иллюстраций]]. Тот же рисунок загрузите в LaTeX на GitHub, см. папку [https://github.com/componavt/student_paper/tree/master/app_inventor/graphics/programs ./graphics/programs]. Если ваш файл в папке [https://github.com/componavt/student_paper/tree/master/app_inventor/chapter ./chapter] называется ''guess_the_number_Oksanche.tex'', то папка для ваших скриншотов будет [https://github.com/componavt/student_paper/tree/master/app_inventor/graphics/programs/guess_the_number ./graphics/programs/guess_the_number]. Довесок: <font style="color:green">[[w:Участник:AKA MBG/God|God]] — удалить или спасти одну статью</font>. |- |7 🎮 🅛||⛄{{якорь|image}} <font style="color:#2F4F4F">'''Пишем текст о программе (процедура и управление экранами)'''</font>. [[Файл:Wikinews-logo.svg|thumb|250px|В Викиновостях есть [[n:Категория:Интернет-математика|категория "Интернет-математика"]] для статей, написанных студентами ПетрГУ]] В предыдущем задании вы сделали скриншот своей программы, загрузили на Викисклад, чтобы добавить этот рисунок в свою страницу. Затем сделали развёрнутую подпись к рисунку и написали до рисунка текст, поясняющий, что интересного здесь изображено. В этом задании продолжаем писать о своей программе на красивом и понятном русском языке: # Выберите наиболее интересную процедуру в своей программе. Если процедур нет, то напишите её. Сделайте скриншот процедуры и добавьте (с помощью Викисклада) в свою главу. # Опишите работу с экранами в своём приложении, см. [[/Экран]]. Для этого ответьте на вопросы: ## Сколько экранов используете? ## Как выполняется переключение между экранами? Есть ли менеджер экранов? ## Закрываете ли вы экраны? Этот же текст и иллюстрации должны появиться в нашем LaTeX-проекте. Не случайно в номере этого задания кроме игровой консоли (обозначает визуальное программирование) есть ещё и буква ''L''. Довесок: <font style="color:green">[[n:User:AKA_MBG/newstask]] — написать новость по научной тематике в Русских Викиновостях</font>. |- |8 🎮 🅛||⛄{{якорь|literature}} <font style="color:#2F4F4F">'''Оформление ссылок на литературу и веб-ресурсы'''</font>. В разделах "Литература" и "Ссылки" перечислите те материалы, которыми вы пользовались при решении задачи. Хорошо, если ссылки на источники будут идти прямо из викитекста с помощью шаблона {{tl|sfn}}. Для оформления ссылок в LaTeX редактируйте файл [https://github.com/componavt/student_paper/blob/master/app_inventor/ai1references.bib ai1references.bib]. Всё хорошо, если файл LaTeX продолжает компилироваться без ошибок. См. пример оформления ссылки на книгу в разделе "Литература" в статье [[App Inventor/База данных#Литература]] (в шаблоне {{tl|sfn}} указаны номера страниц книги, эти номера видно в разделе "Примечания"). |- |9 🅛||<font style="color:#2F4F4F">'''Индексирование ключевых слов в LaTeX'''</font> [[Файл:Suffix tree BANANA.svg|thumb|250px|Суффиксное дерево ‒ это одна из структур индексирования. В случае LaTeX'а ''индекс'' ‒ это, скорее, глоссарий со ссылками]] # 🅛 Указать ключевые слова в своём разделе, чтобы они появились на предпоследней странице "Предметный указатель". Указать тематический подраздел, к которому относится то или иное ключевое слово, чтобы этот подраздел также появился в индексе. Например, если в разделе есть материал, касающийся элемента меню "Выбор из списка" ("ListView") из раздела меню "Интерфейс пользователя" на сайте "App Inventor", то пишите следующую команду рядом с текстом о ListView: \index{Интерфейс пользователя!ListView / Выбор из списка} Какой-то текст про ListView... В качестве тематических разделов (то есть параметров команды ''index'' в LaTeX) используйте названия разделов и пунктов меню на сайте "App Inventor". Ссылки на учебный материал по работе с индексом в LaTeX: * Indian TEX Users Group. [http://www.tug.org/tutorials/tugindia/chap16-scr.pdf#page=9 Index // On-line Tutorial on LaTeX]. 2000. с. 9-13. * [[b:en:LaTeX/Indexing]] ‒ глава об индексировании. Довесок: <font style="color:green">[[wikt:Участник:AKA MBG/wordlist|wordlist]] — написать несколько словарных статей в Русском Викисловаре</font>. |- |10 🅛||{{якорь|abstract}} <font style="color:#2F4F4F">'''Аннотация'''</font> ‒ написать аннотацию к тексту своей главы и в Викиверситете, и в LaTeX'е. |- |11 🅛||<font style="color:#2F4F4F">'''Разработка игры в форме упражнений и вопросов'''</font> (самое интересное задание) '''В Викиверситете''' добавьте в свою главу в качестве последнего раздела "<nowiki>== Упражнения ==</nowiki>". Придумайте три упражнения с вопросами по программированию в среде App Inventor и по теме своего приложения. При этом: * хотя бы одно из упражнений должно быть с иллюстрациями, * хотя бы одно упражнение должно быть связано с программированием в среде App Inventor. Используйте разные типы вопросов (см. [[:en:Help:Quiz|Help:Quiz]], [[:en:Help:Quiz-Simple|Help:Quiz-Simple]]). Вопросы и ответы на них должны (1) иметь образовательный характер, (2) сообщать новые нетривиальные сведения, (3) быть настолько яркими и интересными, чтобы их можно было отправить в телепередачу [[w:Что? Где? Когда?|Что? Где? Когда?]] Также как и всю статью, не забывайте [[w:ВП:Викификация|викифицировать]] вопросы, если в них упоминаются какие-либо термины, и варианты ответов на них. '''В LaTeX''' напишите вопросы к тексту и темам, обсуждаемым в вашей главе. См. примеры в главе [https://github.com/componavt/student_paper/blob/master/app_inventor/chapter/change_flags_AKA.tex Превращение флагов]. К вопросам прилагаются развёрнутые ответы с иллюстрациями, размещайте их в главе [https://github.com/componavt/student_paper/blob/master/app_inventor/chapter/answers.tex Ответы]. В этих двух главах посмотрите то, каким образом связаны между собой вопросы и ответы гиперссылками в итоговом PDF-файле. Довесок: <font style="color:green">[https://vk.com/topic-41102811_30362125 WRN] — написать рецензию на научную статью для [[m:Research:Newsletter]]</font>. |- |12||{{якорь|video}}<font style="color:#2F4F4F">'''Видео'''</font> ‒ записать видео с рассказом о приложении и примером работы программы. Требования к видео: # Видео не должно быть беззвучным. Голос диктора рассказывает о разработанной программе. * Добавить видео на Викисклад. Вставить в свою статью в Викиверситете. * Поставить ссылку на это викискладовское видео на странице своей программы в Галерее App Inventor. Приложения для записи видео: * расширение для Google Chrome [https://chrome.google.com/webstore/detail/screencastify-screen-vide/mmeijimgabbpbgpdklnllpncmdofkcpn/related?hl=en Screencastify]. Недостатки: ограничение в 10 минут, логотип на видео, 50 записей в месяц. * [[w:en:Open Broadcaster Software|OBS Studio]], см. [https://obsproject.com/wiki/ документацию]. Довесок: <font style="color:green">[[w:Участник:AKA MBG/РГАФД|РГАФД]] — работа с коллекцией фонограмм в Википедии</font> (знакомимся с электронными архивами). |- |13||<font style="color:#2F4F4F">'''Компиляция LaTeX в PDF'''</font>. |} Примечания: # Когда задание будет выполнено, отчитайтесь о проделанной работе на [[w:Википедия:Страницы обсуждений|странице обсуждения]] своей главы. Не забывайте [[w:ВП:ПОДПИСЬ|подписывать]] свои сообщения на страницах обсуждений с помощью четырёх тильд <nowiki>~~~~</nowiki>. # ⧖ Чтобы у студентов был спортивный интерес ‒ делать задания вовремя, к некоторым заданиям прилагаются <font style="color:green">довески</font>, дополнительные задания. == Задачи == Выберите из этих книг: [https://yadi.sk/d/TqMcS0Nx5xeEbg Б. А. Кордемского или М. Гарднера] математическую задачу. Напишите название этой задачи, из какой книги взята задача (автор книги, название книги, год издания, укажите номер страницы), свои данные следующим образом: * <nowiki>[[/Название задачи в виде ссылки на подстраницу]] (Автор книги. Название. Год издания, страница), [[User:имя пользователя|Фамилия Имя Отчество]]</nowiki> Ссылка с вашего имени должна вести на вашу страницу в Викиверситете, оформите её, см. [[w:ВП:Личная страница]]. Задачу выбирайте такую, которую: # сможете представить в виде компьютерной игры на телефоне, # а игра будет иметь образовательное значение. Например, игра [http://wiki.robbo.ru/wiki/%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82_AppInventor_%D0%9E%D1%81%D0%B2%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D1%81%D0%BC%D0%BE%D1%81%D0%B0 Освоение космоса] знакомит школьников в ходе игры с характеристиками планет Солнечной системы. Подстраницы и авторы: * [[/Превращение флагов]] (Кордемский Б.А. Математическая смекалка. 1956, с. 12), [[User:AKA MBG|Крижановский Андрей Анатольевич]] * [[/Угадыватель чисел]] (Галанин Д. Д. Леонтий Филиппович Магницкий и его арифметика. Вып. 2—3. — 1914, с.109), [[User:Oksanche|Панфилова Оксана Сергеевна]] * [[/От 1 до 31]], [[User:Gr3zjd|Захаров Алексей Михайлович]] == Лекции == * [[/Введение, установка, настройка]] * [[/Переменные и процедуры]] * [[/Списки]] ‒ [http://www.imagnity.com/tutorials/app-inventor/list-blocks-on-app-inventor/ List Blocks On App Inventor] * [[/База данных]] * [[/Экран]] * [[/Галерея]] ‒ о публикации приложений * [[/Комментарии]] ‒ о возможности комментировании кода, последовательность скриншотов: добавить комментарий, отобразить его, изменить размер окна с комментарием. ; По-мелочи * [http://ai2.appinventor.mit.edu/reference/other/manyscreens.html Building Apps with many screens] - версии, именование проектов и безопасная разработка * [https://appinventor.pevest.com/2014/09/08/display-warning-and-alert-box-messages-in-app-inventor-apps/ Display “Warning” and “Alert” box messages in App Inventor apps] - отладка приложений или Notifier == Минизадачи == Требования и пожелания: * Ссылки, которые помогли решить задачу, должны войти в список литературы в конце подстраницы с решением задачи. * Вначале идёт описание проблемы, что нужно сделать. * Последовательное и подробное описание - как решить проблему. * Скриншот загружаете на Викисклад (интерфейс среды программирования только на русском языке). Имя файла должно подробно пояснять ‒ что изображено на рисунке, только на английском. * Копию текста и скриншот добавляете на GitHub в проект [https://github.com/componavt/student_paper student_paper/app_inventor/]. LaTeX-файл должен компилироваться на ура. Маленькие задачи: * [[/Переключение языка интерфейса]] в App Inventor, + добавить замечание в "Алгоритм" заданий, чтобы скриншоты делали только с английским интерфейсом. * [[/Переключение между экранами]] (см. [http://appinventor.mit.edu/explore/ai2/support/blocks/control#openscreen link] и [http://www.appinventor.org/content/howDoYou/screens/swap пример], [https://www.safaribooksonline.com/library/view/learning-mit-app/9780133799286/ch08lev2sec3.html полезный пример]) * [[/HTML в поле Label]] - об использовании курсива, жирного шрифта и разбиении строк с помощью <nowiki><br></nowiki> в поле Label и других элементах (см. [https://community.thunkable.com/t/did-you-know-you-can-add-html-to-your-labels/55/20 link], см. [http://appinventor.mit.edu/explore/ai2/webview-javascript.html WebView Javascript Processor]) * [[/Публикация приложения]] ‒ подготовка и публикация приложения в галерее приложений с примером ([http://www.appinventor.org/content/CourseInABox/Intro/PublishingHowTo link]) * [[/Переименование проекта]] + скриншот ([https://github.com/mit-cml/appinventor-sources/issues/905 link]). <!-- * [[/Установка и настройка App Inventor 2]] * [[/Обзор платформы App Inventor]] (Project, Design, Blocks editor, с. 47-92), один человек и команда из двух человек для второго и третьего пунктов: :# Список проектов и создание нового проекта. Экран проектировщика приложения (Palette, Viewer, Components, Properties, Media), с. 47-51. :# Придумать игру, рассказать о ней и на её примере показать, как проектируют игру на экране проектировщика, как запускают игру в эмуляторе и на мобильном телефоне, с. 51-71. :# Редактор блоков (на примере того же приложения, что придумано в предыдущем пункте). Типы блоков. Пример использования блоков в вашей программе, с. 71-92. * '''Обработка событий в приложении''' (Event App, с. 119-139), команда из двух человек описывает одно (своё!) приложение, но с двух сторон (со стороны дизайна и со стороны логики, поведения): :# [[/Интерфейс пользователя]]: пользовательский интерфейс для добавления событий, установка фонового изображения, добавление рисунков и кнопок, ActivityStarter, работа с несколькими экранами, с. 120-133. :# [[/Программирование блоков]]: программирование логики приложения, с. 134-139. + см. [www.appinventor.org/Events события] и [http://www.appinventor.org/content/howDoYou/Conditionals/startStop условия] * [[/Работа с базой данных]] (Fusion Table, с. 141-172) * [[/Обработка списков в цикле]] (См. пример приложения Raffle, с. 173-197, а также [http://www.appinventor.org/content/howDoYou/RecordingInfo/phone phone]). * [[/Дизайн мобильного приложения]] (найти, указать и использовать дополнительную литературу о хорошем дизайне и проектировании приложений, с. 199-203) --> == См. также == * [[c:Category:MIT App Inventor]] * [[c:User:AKA MBG#App Inventor (book)]] ‒ идеи иллюстраций для книги * [[Wikipedia:App Inventor for Android]] == Примечания == {{примечания}} Материалы на сайте ai2.appinventor.mit.edu доступны по лицензии [https://creativecommons.org/licenses/by/4.0/ CC BY 4.0], см. [http://ai2.appinventor.mit.edu/Ya_tos_form.html MIT App Inventor Privacy Policy and Terms of Use], == Литература == * {{книга |автор=Kamriani F., Roy K. |заглавие=App Inventor 2 Essentials |год=2016 |издательство=[[w:en:Packt|Packt]] |место = |страниц = 246 |isbn= 978-1785281105 |ref= Kamriani and Roy }} * {{книга |автор=Paula Beer, Carl Simmons |ответственный = |заглавие=Hello App Inventor! |год=2015 |издательство=Hello App Inventor! |место = USA |страниц = 242 |ссылка = |isbn= 9781617291432 |ref= Beer and Simmons }} * {{книга |автор = М. А. Ливенец, Б. Б. Ярмахов |заглавие = Программирование мобильных приложений в MIT App Inventor: Практикум |год=2016 |страниц = 100 |ссылка = http://appinvent.ru/__f/__uroki/AppInventor-Programma-Praktikum.pdf |ref= Ливенец и Ярмахов }} * {{книга |автор=[[w:Кордемский, Борис Анастасьевич|Б. А. Кордемский]] |заглавие=Математическая смекалка |год=1956 |издательство=[[w:Физматлит|ГИТТЛ]] |место = М. |страниц = 576 |ref = Кордемский }} == Ссылки == <!--* [[/Ссылки|Ссылки]]--> * Mike James. [https://www.i-programmer.info/programming/other-languages/8062-getting-started-with-mit-app-inventor-2.html Getting started with MIT App Inventor 2]. 2018 * [http://ai2.appinventor.mit.edu/reference/components/animation.html#Canvas Canvas] // Рисование ; Курсы * [http://appinventor.mit.edu/explore/resources/introduction-software-application-development-app-inventor-and-python.html Introduction to Software Application Development with App Inventor and Python] * [http://appinventor.mit.edu/explore/resources/i-love-my-smartphone-mobile-app-development.html A Computing Science Course in Mobile App Development: I Love My Smartphone - (updated 2016 using App Inventor 2)] (похужее) * [http://appinventor.mit.edu/explore/resources/inventing-mobile-apps-taught-lyn-turbak-wellesley-college.html Inventing Mobile Apps, Taught by Lyn Turbak at Wellesley College], в частности: [https://sites.google.com/site/wellesleycs117fall11/lecture-notes/lecture-06-procedures-and-conditionals Lecture 06: Procedures and Conditionals] ; Ардуино * [https://habr.com/post/273269/ Среда разработки andriod приложений App Inventor 2 и ее применение в сообществе Arduino] ; Слайды * [https://docs.google.com/presentation/d/11nDt5nwbe51txdNdAlX5bO03XMMNXSdMUmaKSAQwgac/edit#slide=id.p PaintPot Slides] ; Видео (todo) [[Категория:Программирование]] nmm77b5d55qnx40l7g3mnzhaqb74e6t Программирование Викиданных/Алгоритм работы для новых статей 0 26265 166736 157538 2026-10-06T13:01:30Z Mitte27 13295 166736 wikitext text/x-wiki {{Программирование Викиданных}} Алгоритм работы по написания новых статей. {| class="wikitable collapsible" !colspan="3" style="background:#CCCCFF"|Задание для студентов |- !N||Описание |- |1||<font style="color:#2F4F4F">'''Выбор темы (выбор типа объекта)'''</font> # Выберите главу (ниже на этой странице), допишите справа ФИО и ник (выбираем класс объектов для работы). # Ⓐ Зарегистрируйтесь на сайте [[w:en:Authorea|Authorea]] (укажите при регистрации свои имя и фамилию по-английски, например: Andrew Krizhanovsky или Denis Kovalchuk, укажите в affilation свой вуз, а именно: [https://www.authorea.com/inst/7653 Petrozavodsk State University]). Сообщите преподавателю (1) свой e-mail и (2) название своей главы на этой странице в Викиверситете. Затем вы получите приглашение к редактированию статьи в LaTeX на Authorea. После каждого выполненного этапа работы (со значком Ⓐ) скопируйте текст и иллюстрации из Викиверситета в Authorea. Проверьте, что после добавления текста в LaTeX — этот текст компилируется в PDF-файл без ошибок. Текст на сайте Authorea пишите только на английском языке, этот текст является переводом вашей статьи в Викиверситете. |- |2 Ⓐ||<font style="color:#2F4F4F">'''Программирование: список объектов'''</font> Напишите скрипт для вывода всех объектов этого типа. Укажите полученное число записей. |- |3||{{якорь|3objects}}<font style="color:#2F4F4F">'''Знакомство со свойствами объектов. Заполнение данных вручную'''</font> Выберите три примера наиболее полно описанных объектов на сайте Викиданных (например, из списка [[w:ВП:ИЗБ|ИС]] или [[w:ВП:ХОР|ХС]]), выберите три "плохих" (неполных или пустых) примера объектов. При условии, что про "плохие" объекты есть достаточно полные статьи в Русской Википедии или в Английской Википедии. Прочитайте эти статьи и максимально заполните все поля "плохих" объектов, сделайте их "хорошими", заполните в том числе Label и Description на двух языках (английский и русский). Укажите три "хороших" и три "плохих" объекта со ссылками на Викиданные в своей статье. Сообщите преподавателю о выполнении задания. :: ''Label''. Если статья есть, то Label — это название статьи в Википедии. Если статьи нет, то переведите Label самостоятельно. См. документацию [[d:Help:Label/ru]]. :: ''Description'' — это краткое, но полноценное описание объекта. Описание начинается со строчной буквы, в конце точка не ставится. См. документацию [[d:Help:Description/ru]]. Подробности и условия: # Выбирая "хорошие" (максимально заполненные) объекты своего типа, возьмите один из ''образцовых'' объектов со страницы [[d:Wikidata:Showcase items]]. # Два из трёх "плохих" объектов должны относиться к России или русскому языку, если это применимо. # Для удобства проверки заполняемые свойства должны быть переведены на английский язык. То есть если из "плохого" объекта идёт ссылка на объект, называемый "QNNN", то следует зайти по ссылке в этот объект QNNN и добавить название на английском языке (поле Label). Довесок: <font style="color:green">Заполнить десять пустых объектов вместо трёх</font>. |- |4 Ⓐ||{{якорь|3task}}<font style="color:#2F4F4F">'''{{comment|ТЗ|Техническое задание}}: предложить школьникам три SPARQL-задачи''' (неформальное название: ''Нафантазировать задачную трилогию с картиной и Россией'')</font> Придумайте и сформулируйте на [[w:ВП:ОБС|СО]] своей статьи три задачи, которые можно решить с помощью SPARQL-запросов или связки Python и Pywikibot, используя данные ваших объектов. Укажите поля (свойства объектов), требуемые для решения задач (см. идеи задач про [[Обсуждение:Программирование Викиданных/Война#Идеи|войны]], [[Обсуждение:Программирование Викиданных/Страны#Идеи|страны]]). См. в разделе "Ссылки" ниже "SPARQL examples". Если вы будете работать с Python и Pywikibot, то сообщите преподавателю свой логин на сайте GitHub для включения в проект [https://github.com/componavt/botva botva]. Хотя бы одна из трёх задач должна быть с визуализацией (карта, граф, график, диаграмма). При постановке задач уделите больше внимания объектам, персонам, темам нашей страны, поскольку тогда можно ограничиться чтением и поиском данных в статьях Русской Википедии. Примеры сравнения по каким-либо параметрам: * национальные парки всего мира и России, * города мира (или каких-либо стран) и России, * вузы мира и России. Довесок: Нужно будет решить одну из трёх придуманных своих или предложенных задач. Задачу выбирает преподаватель. Если идей не будет, то <font style="color:green">нужно будет решить три задачи, а не одну.</font> |- |5 Ⓐ||{{якорь|completeness}}<font style="color:#2F4F4F">'''Полнота Викиданных и оформление литературы'''</font> Напишите в разделе той задачи, которую вы уже решили (то есть написали скрипт), подраздел "'''Полнота Викиданных'''" с критикой и анализом этой полноты. См. пример заготовки в статье "[https://ru.wikiversity.org/w/index.php?title=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%92%D0%B8%D0%BA%D0%B8%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/%D0%A1%D1%82%D1%80%D0%B0%D0%BD%D1%8B&oldid=125932#.D0.9F.D0.BE.D0.BB.D0.BD.D0.BE.D1.82.D0.B0_.D0.92.D0.B8.D0.BA.D0.B8.D0.B4.D0.B0.D0.BD.D0.BD.D1.8B.D1.85 Программирование Викиданных/Страны]". Вот, что у студентки получилось в итоге: [[Программирование Викиданных/Страны#Полнота Викиданных]]. Библиографическую ссылку на авторитетный источник, который вы упоминаете при описании полноты, укажите в разделе <nowiki>== Литература ==</nowiki> и поставьте на него ссылку с помощью шаблона {{tl|sfn}}. См. ниже раздел "Оформление ссылок". Довесок: <font style="color:green">поработать на славу Петрозаводского государственного университета, см. [[w:Участник:AKA MBG/ПетрГУ|ПетрГУ]]</font>. |- |6 Ⓐ||{{якорь|100}}<font style="color:#2F4F4F">'''Скриншот, сотня, скриншот''' (не [[w:Сотня (сериал)|та]] сотня, а ваша, трудовая)</font> Заполните свойства, требуемые для решения задачи, у исследуемых объектов. Решите поставленную ранее задачу. Подробнее: # Сделайте скриншот (или сохраните иллюстрацию иначе из Викиданных), если результат по исследуемому свойству представлен (в ходе выполнения SPARQL-скрипта) в виде иллюстрации. Если результат в виде таблицы, то укажите число - сколько было этих объектов с таким-то свойством на такую-то дату. # Заполните свойства, требуемые для решения задачи, у исследуемых объектов. Те самые свойства, о неполноте которых вы сокрушались в разделе "Полнота Викиданных". Заполнить свойство, требуемое вам для решения задачи, у 100 объектов. # У этих ста объектов также должно быть заполнено поле Label на двух языках (английский и русский). Поле Description заполнять не обязательно. <small>Заполненные поля Label нужны для того, чтобы при выводе SPARQL-результатов в виде таблиц или при генерации подписей к картам были осмысленные названия объектов, а не безличные идентификаторы объектов Викиданных.</small> # Сделайте скриншот или укажите число записей в таблице после заполнения данных (отметьте ‒ в какой момент времени получены новые результаты). Задание может выполняться как в ручном, так и в автоматическом режиме (#выжпрограммисты). См. [[Программирование Викиданных/Воздушные суда#Заполнение Викиданных|самолётный пример]] автоматического заполнения Викиданных. Довесок: <font style="color:green">[[w:Участник:AKA MBG/РГАФД|РГАФД]] — работа с коллекцией фонограмм в Википедии</font> (знакомимся с электронными архивами). |- |7 Ⓐ||⛄{{якорь|image}} <font style="color:#2F4F4F">'''Иллюстрирование статьи'''</font>. Добавьте в главу иллюстрации с помощью Викисклада. [[Файл:Illustrating Wikipedia brochure ru.pdf|link=https://upload.wikimedia.org/wikipedia/commons/e/e1/Illustrating_Wikipedia_brochure_RU.pdf|thumb|250px|Иллюстрирование Википедии: Руководство по размещению файлов на Викискладе (перевели на русский студенты ПетрГУ)]] Вы занимаетесь изучением какого-либо одного или нескольких свойств некоторого объекта Викиданных. Задача заключается в том, чтобы придумать интересную визуализацию, которая будет раскрывать ещё одну сторону исследуемого объекта. Замечательно, если визуализация будет связана с тем свойством, заполнением которого вы занимались в предыдущих заданиях. После иллюстрации, снабжённой полноценной развёрнутой подписью на русском языке, напишите ‒ что изображено на рисунке. Какие выводы может сделать читатель из этой иллюстрации? Если иллюстраций несколько, например, (1) иллюстрация для объектов всего мира и (2) отечественные объекты, то напишите свои наблюдения после каждой иллюстрации, и сравните их, то есть напишите в чём видно сходство и различие. И попытайтесь интерпретировать, объяснить полученные результаты, привлекая самые разные источники, которые будут подтверждать вашу точку зрения. Замечания: * сделайте иллюстрации штатными средствами [https://query.wikidata.org/ query.wikidata.org] или используйте программу [[w:en:Gephi|Gephi]]; * при прочих равных условиях масштабируемый формат SVG предпочтительнее растровых (JPG, PNG). Если интерес представляет только небольшой фрагмент, то растровый формат годится; * загрузите иллюстрации на Викисклад (файл с рисунком или анимацией называйте длинно (3-7 слов) и только по-английски). Для загрузки новых версий рисунков не создавайте новых страниц на Викискладе, а жмите кнопку "Загрузить новую версию файла" / "Upload a new version of this file"; * у загруженного на Викисклад файла укажите категорию [[commons:Category:Research in programming Wikidata by Wikiversity|Category:Research in programming Wikidata by Wikiversity]], см. примеры работы других студентов в этой категории. Прочитайте [https://drive.google.com/file/d/0B5yjAmdZqsqNMnk5YmFwR29uNGs/edit брошюру об основах иллюстрирования статей в Википедии и работе на Викискладе], которую перевела на русский язык группа студентов ПетрГУ в 2014 году; * при загрузке на Викисклад скриншота с географической картой обязательно: (1) указать в поле "авторы" OpenStreetMap со ссылкой на сайт, (2) в разделе лицензий указать шаблон того же OpenStreetMap. См. пример: [https://commons.wikimedia.org/w/index.php?diff=271209083&oldid=267259383&title=File:%D0%A0%D0%BE%D1%81%D1%81%D0%B8%D0%B9%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D1%80%D1%85%D0%B8%D0%B2%D1%8B_%D0%BD%D0%B0_%D0%BA%D0%B0%D1%80%D1%82%D0%B5.png diff]; * скриншот таблицы или какого-либо другого текста не является сколько-нибудь интересной визуализацией, достойной включения в статью. Такие иллюстрации не надо делать. Посмотрите примеры визуализации в принятых работах; * если вы случайно загрузили файл с иллюстрацией локально, то есть в Викиверситет, а не на Викисклад, то поставьте на этот файл-страницу помету к удалению, см. [[ВВ:КБУ]]. И загрузите этот файл на Викисклад. См. [[w:ru:Участник:AKA MBG/task#figure|подробности и правила оформлении иллюстраций]]. Довесок: <font style="color:green">[[w:Участник:AKA MBG/God|God]] — удалить или спасти одну статью</font>. |- |8|| <font style="color:#2F4F4F">'''Оформление ссылок'''</font> (внутренних и внешних) * Если есть главы, связанные по смыслу с вашей главой, то добавьте раздел "<nowiki>== См. также ==</nowiki>" и поставьте внутренние ссылки на эти главы. * Ссылки на статьи и книги оформите с помощью шаблона [[Шаблон:Sfn|Sfn]], ссылающегося на публикации, представленные с помощью шаблонов [[Шаблон:книга|книга]], [[Шаблон:статья|статья]] и [[Шаблон:Ссылка|ссылка]]. См. документацию на [[Шаблон:Sfn]] и примеры использования шаблонов в статьях [[Спорт]] и [[Работа в вики-среде (с упражнениями)|Работа в вики-среде]] (шаблон {{tl|книга}}), в главе [[Работа в вики-среде (с упражнениями)/Предисловие|/Предисловие]] (шаблон {{tl|статья}}). |- |9 Ⓐ||{{якорь|abstract}} <font style="color:#2F4F4F">'''Аннотация'''</font> * Напишите аннотацию к своей странице в Викиверситете. См. [[w:Википедия:Преамбула]]. Никакой заголовок не должен предшествовать преамбуле в вики-статье, преамбула идёт в самом начале статьи, до содержания. * Создайте файл abstract.tex в своей статье на сайте Authorea и напишите аннотацию к этой статье. Организуйте файл layout.md так, чтобы abstract.tex был первым в статье. Для указания заголовка раздела аннотации используйте команду \section{Аннотация}. Подумайте, как в Latex'е указать раздел для аннотации, но при этом выключить нумерацию, поскольку аннотация, введение и заключение в статьях традиционно не нумеруются. Существует разница между преамбулой статьи в Википедии (см. любую [[w:ВП:ИЗБ|хорошую статью в Википедии]]) и аннотацией научной статьи (см. научные статьи и их аннотации в журнале [http://journals.krc.karelia.ru/index.php/mathem Труды КарНЦ РАН], математическая серия). Поэтому ваши аннотации между этими статьями будут различаться. См. аннотации в принятых статьях. В этих принятых статьях есть ссылки на эти же статьи на сайте Authorea, см. в них аннотации. Довесок: <font style="color:green">[[n:User:AKA MBG/newstask]] — написать новость по научной тематике в Русских Викиновостях</font>. |- |10||{{якорь|exercise}} 🚁 <font style="color:#2F4F4F">'''Разработка игры в форме упражнений'''</font> (самое интересное задание) Добавьте в свою главу последним разделом раздел "<nowiki>== Упражнения ==</nowiki>". Придумайте три упражнения, связанные с выбранным объектом, его свойствами. Ниже, после упражнений, приведите скрипты, с помощью которых можно удостовериться в правильности ответов. При этом: * если у объектов есть иллюстрации, то хотя бы одно из упражнений должно быть с картинками, * хотя бы одно упражнение должно относиться к вычислимому полю, (например, вопрос может касаться плотности, если у объекта нет свойства ‒ плотность, но есть количество и площадь; в SPARQL-скрипте с ответами плотность должна вычисляться и выводиться в результатах), * хотя бы один вопрос должен быть связан с Россией. Эти вопросы-упражнения со скриптами не нужно переносить в свою статью на Authorea. Используйте разные типы вопросов (см. [[:en:Help:Quiz|Help:Quiz]], [[:en:Help:Quiz-Simple|Help:Quiz-Simple]]). Вопросы и ответы на них должны (1) иметь образовательный характер, (2) сообщать новые нетривиальные сведения, (3) быть настолько яркими и интересными, чтобы их можно было отправить в телепередачу [[w:Что? Где? Когда?|Что? Где? Когда?]] Также как и всю статью, не забывайте [[w:ВП:Викификация|викифицировать]] вопросы, если в них упоминаются какие-либо термины, и варианты ответов на них. Довесок: <font style="color:green">[https://vk.com/topic-41102811_30362125 WRN] — написать рецензию на научную статью для [[m:Research:Newsletter]]</font>. |- |11 Ⓐ||{{якорь|naming}}<font style="color:#2F4F4F">'''Называние статьи'''</font> На странице обсуждения своей главы в Викиверситете создайте раздел <nowiki>''==Название статьи на Authorea==''</nowiki>. Предложите в этом разделе пять разных названий для вашей статьи на Authorea. Названия должны соответствовать сути статьи, интриговать и привлекать читателя. Сообщите преподавателю с помощью команды "@" (например, так: <nowiki>@[[User:AKA MBG|Andrew Krizhanovsky]]</nowiki>) о готовых названиях, чтобы обсудить и выбрать название. Утверждённое название напишите в заголовке статьи на Authorea. В разделе "Ссылки" статьи Викиверситета обновите ссылку на свою статью на сайте Authorea. |- |12||{{якорь|futurework}}<font style="color:#2F4F4F">'''Будущая работа'''</font> # Создайте раздел "<nowiki>== Будущая работа ==</nowiki>" в конце статьи и до "Упражнений" (это только в статье Викиверситета, на Authorea не надо). Сформулируйте в нём интересные и глубокие вопросы для студентов, которые в следующем году продолжат исследовать ваш объект и продолжат писать статью. На каждый вопрос отведите по абзацу текста в нумерованном списке (также, как оформлен этот список). # Вопросы такие, что для ответа на них нужно построить SPARQL-запрос. Хотя вас и не интересуют детали реализации ‒ это уже проблемы будущих студентов. # Вопросов должно быть три. # ''Визуализация''. Хотя бы один вопрос должен давать возможность нарисовать ответ (например, в виде карты, графа, диаграммы или фотографий, связанных с объектом). # ''Вычислимость''. Для ответа хотя бы на один вопрос нужно использовать арифметические действия над свойствами объектов, искать максимум, минимум и тому подобное. [[w:Википедия:Викификация|Викифицируйте]] объекты, упоминаемые в разделе. То есть проставьте ссылки с названий объектов на соответствующие статьи Русской Википедии с помощью конструкции <nowiki>[[w:|]]</nowiki>. Укажите в каждом из трёх вопросов ‒ какие именно свойства Викиданных можно использовать для решения предложенных задач. Например, если в задаче идёт речь о вычислении возраста человека, то укажите в вопросе подсказку, что для вычисления возраста персоны можно использовать свойство [[d:Property:P569|дата рождения (P569)]]. Ссылка на это свойство сделана так: <nowiki>[[d:Property:P569|дата рождения (P569)]]</nowiki>. Довесок: <font style="color:green">[[w:Участник:AKA MBG/Ptz]] — фото объекта на Земле и коллаж города России</font>. |- |13||{{якорь|translate}} <font style="color:#2F4F4F">'''Перевод (English Wikiversity)'''</font> Создайте подстраницу курса [[v:en:Research in programming Wikidata|Research in programming Wikidata]] в Английском Викиверситете. Переведите полностью страницу со своим исследованием на английский язык. Сохраните викификацию для тех объектов, о которых есть статьи в Английской Википедии, то есть замените, например, ссылку <nowiki>[[w:Москва|Москва]]</nowiki> на ссылку <nowiki>[[w:Moscow|Moscow]]</nowiki>. Довесок: <font style="color:green">[[wikt:Участник:AKA MBG/wordlist|wordlist]] — написать несколько словарных статей в Русском Викисловаре</font>. |- |14||{{якорь|nauchkor}} <font style="color:#2F4F4F">'''Компиляция Латех в PDF'''</font> Скомпилируйте свою LaTeX-статью в PDF-файл на сайте Authorea. Загрузите полученный файл на сайт [[w:Научный корреспондент|Научный корреспондент]]. (<small>При регистрации в научкоре укажите свой вуз, чтобы ваше имя появилось в [http://nauchkor.ru/users?communities%5B%5D=5a342f197966e1073ce80529&lists%5B%5D=&lists%5B%5D=565610925f1be71e0f000003&lists%5B%5D= списке ПетрГУ]. Фото в вашем профиле обязательно.</small>) При желании можете выбрать для своей публикации какой-либо из конкурсов, проводимых Научным Корреспондентом. В поле "Описание работы" скопируйте аннотацию из статьи в LaTeX. Добавьте в раздел <nowiki>==Ссылки==</nowiki> в своей статье в Русском Викиверситете ссылку на загруженную статью на сайте Научного Корреспондента. Таким образом, в разделе <nowiki>==Ссылки==</nowiki> должно быть, как минимум, две ссылки: на версию статью в Научкоре и на сайте Authorea. См. пример оформления в статье [[Программирование Викиданных/Архивы#Ссылки|Архивы]]. |- |} Примечания: # Когда задание будет выполнено, отчитайтесь о проделанной работе на странице обсуждения своей главы. Не забывайте подписывать свои сообщения на страницах обсуждений с помощью четырёх тильд <nowiki>~~~~</nowiki>. # На сайте Authorea дайте своим '''листингам''' названия и ссылайтесь на них в тексте. На сайте Authorea в LaTeX на рисунки мы ссылаемся так: ''Fig.~\ref{someFigureName}'', на листинги ссылаемся так: ''see listing~\ref{someListingName}''. См. пример именованного листинга в статье [https://www.authorea.com/users/86022/articles/163933-example-colored-sparql-listing-with-reference Example colored SPARQL-listing with reference]. Для расцветки кода заполните свой файл [https://www.authorea.com/users/86022/articles/163933/master/file/header.tex header.tex]. # ⧖ Чтобы у студентов был спортивный интерес ‒ делать задания вовремя, к некоторым заданиям прилагаются <font style="color:green">довески</font>, дополнительные задания. # 😇 После выполнения заданий 4 и 10 на лекции и практике выходите и кратко рассказываете о проделанной работе. Задаёте вопросы студентам. Студенты отвечают, оценивают и обсуждают ваши задания-упражнения. При наличии замечаний мы с вами тут же исправляем и уточняем вопросы. Слушатели предлагают новые задачи для дальнейшего исследования объектов. fnn338qmzgtmsbbihm24fov3y38vs38 Обсуждение участника:Нейромодулятор 3 30504 166738 2026-10-06T17:10:52Z New user message 3844 Добавление [[Template:Welcome|приветствия]] на страницу обсуждения нового участника 166738 wikitext text/x-wiki {{Template:Welcome|name=Нейромодулятор}} -- [[Участник:New user message|New user message]] ([[Обсуждение участника:New user message|обсуждение]]) 17:10, 6 октября 2026 (UTC) pa2cszwryn3w5j2jxn9ason6s4s8qoo 166740 166738 2026-10-06T17:26:27Z Нейромодулятор 37059 /* Нейромодулятор */ новая тема 166740 wikitext text/x-wiki {{Template:Welcome|name=Нейромодулятор}} -- [[Участник:New user message|New user message]] ([[Обсуждение участника:New user message|обсуждение]]) 17:10, 6 октября 2026 (UTC) == Нейромодулятор == Разбиваю десятую часть на две. Склеиваются по порядку после части 9/10 (или нумеруй их как 10a и 10b — как удобнее). ## Часть 10a — CLI, вывод мета-протоколов, демо пациентов ```python # ═══════════════════════════════════════════════════════════════════════════ # CLI — КОМАНДНАЯ СТРОКА # ═══════════════════════════════════════════════════════════════════════════ def run_cli(): clear_metas() print(f"Нейромодулятор Medical Edition v3.0 — {formula_count()} протоколов, " f"{len(DIAGNOSES_BASE)} диагнозов\n") for rot in [0, 3, 6, 9]: r = run_pipeline_simple(rot) s = r["stats"]; nb = r["nanobots"]; sf = r["safety"] sup = r["supervisor"]; ms = r.get("meta_stats", {}) print(f"rot={rot:2d}: АКТИВЕН={s['active']:3d} НАРУШЕН={s['broken']:3d} " f"ПРОТИВОПОКАЗАН={s['contraindicated']:3d} всего={s['total']:3d}") print(f" Лечение: fixer={r['fixer']['repaired']} " f"наноботы: {nb['repaired']}/{nb['attempted']} (рой={nb['swarm_size']})") print(f" E_damage: {r['E_damage_initial']:.3f} → {r['E_damage']:.3f} " f"R_safety={r['R_safety']:.3f} Безопасность={sf['level']}") print(f" Omega={r['dynamics']['omega_final']:.1f} Psi={r['psi_target']:.1f} " f"Сходимость={r['dynamics']['converged']}") print(f" Supervisor: score={sup['score']:.3f} repair_rate={sup['repair_rate']:.3f}") print(f" Мета: опасных={ms.get('dangerous', 0)} " f"синергичных={ms.get('synergistic', 0)} " f"совместимых={ms.get('compatible', 0)}\n") def run_metas(): clear_metas() checker = CompatibilityChecker() for face in FACES: metas = generate_all_metas_for_face(face) checked = checker.check_all_metas(metas) dangerous = [m for m in checked if m["status"] == "dangerous"] synergistic = [m for m in checked if m["status"] == "synergistic"] print(f"\n{'='*70}\nГрань: {face} — 72 мета-протокола\n{'='*70}") if dangerous: print(f"\n ОПАСНЫЕ ({len(dangerous)}):") for m in dangerous: print(f" [{m['category']}] {m['meta_formula']}") print(f" → {m['reason']}") if synergistic: print(f"\n СИНЕРГИЧНЫЕ ({len(synergistic)}):") for m in synergistic: print(f" [{m['category']}] {m['meta_formula']}") print(f" → {m['reason']}") compatible = [m for m in checked if m["status"] == "compatible"] print(f"\n Совместимые: {len(compatible)}") for m in checked[:5]: print(f" [{m['category']}] {m['meta_formula'][:70]}") if len(checked) > 5: print(f" ... и ещё {len(checked) - 5}") DEMO_PATIENTS = [ {"name": "Пациент 1", "rotation": 3, "symptoms": ["жажда", "полиурия", "частое мочеиспускание", "усталость"], "labs": {"hba1c": 7.2, "глюкоза": 8.5}}, {"name": "Пациент 2", "rotation": 6, "symptoms": ["одышка", "отёк ног", "усталость", "снижение толерантности"], "labs": {"bnp": 180}}, {"name": "Пациент 3", "rotation": 3, "symptoms": ["депрессия", "апатия", "нарушение сна", "ангедония", "потеря интереса"], "labs": {}}, {"name": "Пациент 4", "rotation": 9, "symptoms": ["сепсис", "гипотония", "тахикардия", "лихорадка"], "labs": {"лактат": 3.5}}, {"name": "Пациент 5", "rotation": 6, "symptoms": ["птср", "флешбэк", "кошмары", "гипервигильность", "травма"], "labs": {}}, ] def run_diag(): print(f"\n{'='*70}\n ДЕМО ДИАГНОСТИКИ — 5 ПАЦИЕНТОВ\n{'='*70}") for patient in DEMO_PATIENTS: print(f"\n{'─'*70}\n {patient['name']}") print(f" Симптомы: {', '.join(patient['symptoms'])}") print(f" Лабораторные: {patient['labs'] if patient['labs'] else 'нет'}") print(f" Вращение куба: {patient['rotation']}") r = run_pipeline(patient["rotation"], symptoms=patient["symptoms"], labs=patient["labs"]) di = r.get("diagnosis_info") if di: print(f"\n ДИАГНОЗ: {di.get('name', '?')} (ICD-10: {di.get('icd10', '?')})") print(f" Уверенность: {di.get('confidence', 0):.1f}%") if di.get("matched_criteria"): print(f" Совпавшие критерии: {', '.join(di['matched_criteria'])}") others = di.get("all_results") or [] if len(others) > 1: print(" Другие возможные:") for alt in others[1:]: print(f" → {alt['name']} ({alt['confidence']:.1f}%)") ts = r.get("treatment_summary") or {} applied = set(ts.get("applied", [])) print("\n Рекомендованные протоколы:") for p in di.get("protocols", []): mark = " ✓ применён" if p in applied else " ✗ не применён" print(f" • {p}{mark}") if di.get("monitoring"): print("\n Мониторинг:") for m in di["monitoring"]: print(f" {m['param']} — {m['freq']} (цель: {m['target']})") if di.get("goals"): print("\n Цели лечения:") for g in di["goals"]: print(f" {g['param']}: {g['target']}") else: print("\n Диагноз не определён") nb = r["nanobots"]; sup = r["supervisor"]; sf = r["safety"] ts = r.get("treatment_summary") or {} print("\n Результат анализа:") print(f" Наноботы: {nb['repaired']}/{nb['attempted']} (рой={nb['swarm_size']})") print(f" Совпадений: {nb.get('matched', 0)} несовпадений: {nb.get('mismatched', 0)}") print(f" Match rate: {nb.get('match_rate', 0) * 100:.1f}%") print(f" Покрытие лечения: {ts.get('coverage_pct', 0):.1f}%") print(f" Лечение полное: {'ДА' if ts.get('treatment_complete') else 'НЕТ'}") if ts.get("missing"): print(f" Не хватает: {', '.join(ts['missing'][:3])}") print(f" E_damage: {r['E_damage']:.3f}") print(f" Безопасность: {sf['level']}") print(f" Supervisor: score={sup['score']:.3f}") if sup.get("adjustments", {}).get("action"): print(f" Корректировка: {sup['adjustments']['action']}") ``` ## Часть 10b — дашборд, API, тесты, точка входа ```python # ═══════════════════════════════════════════════════════════════════════════ # ДАШБОРД — HTML # ═══════════════════════════════════════════════════════════════════════════ DASHBOARD_HTML = """<!doctype html> <html lang="ru"><head><meta charset="utf-8"> <title>Нейромодулятор Medical v3.0</title> <style> body{font-family:system-ui,Arial,sans-serif;max-width:900px;margin:2rem auto;padding:0 1rem;color:#1a1a1a} h1{font-size:1.4rem} .warn{background:#fff4e5;border-left:4px solid #e69500;padding:.8rem;border-radius:4px;font-size:.9rem} label{display:block;margin:.6rem 0 .2rem} input,textarea{width:100%;padding:.5rem;box-sizing:border-box} button{margin-top:.8rem;padding:.6rem 1.2rem;cursor:pointer} pre{background:#f5f5f5;padding:1rem;border-radius:6px;overflow:auto} </style></head><body> <h1>Нейромодулятор Medical Edition v3.0</h1> <p class="warn"><b>Демонстрационный проект.</b> Не является медицинским изделием. Не использовать для постановки диагноза или назначения лечения реальным пациентам.</p> <label>Симптомы (через запятую)</label> <input id="s" placeholder="жажда, полиурия, усталость"> <label>Лабораторные (параметр=значение через запятую)</label> <input id="l" placeholder="hba1c=7.2, глюкоза=8.5"> <label>Вращение куба (0–11)</label> <input id="r" type="number" value="6" min="0" max="11"> <button onclick="run()">Анализ</button> <pre id="out">—</pre> <script> async function run(){ const body={symptoms:document.getElementById('s').value, labs:document.getElementById('l').value, rotation:parseInt(document.getElementById('r').value||'6')}; const r=await fetch('/api/v1/analyze',{method:'POST', headers:{'Content-Type':'application/json'},body:JSON.stringify(body)}); document.getElementById('out').textContent=JSON.stringify(await r.json(),null,2); } </script></body></html>""" # ═══════════════════════════════════════════════════════════════════════════ # API — FLASK # ═══════════════════════════════════════════════════════════════════════════ def _parse_labs(labs_raw): labs = {} if isinstance(labs_raw, str) and labs_raw: for pair in labs_raw.split(","): if "=" in pair: k, v = pair.split("=", 1) k = k.strip(); v = v.strip() try: labs[k.lower()] = float(v); labs[k] = float(v) except ValueError: labs[k.lower()] = v; labs[k] = v elif isinstance(labs_raw, dict): labs = labs_raw return labs def _parse_symptoms(symptoms_raw): if isinstance(symptoms_raw, str): return [s.strip() for s in symptoms_raw.split(",") if s.strip()] return symptoms_raw or [] def run_api(): try: from flask import Flask, jsonify, request from flask_cors import CORS except ImportError: print("Flask не установлен. Установите: pip install flask flask-cors") return app = Flask(__name__) CORS(app) @app.route("/") def dashboard(): return DASHBOARD_HTML @app.route("/api/v1/health") def health(): return jsonify({"status": "ok", "protocols": formula_count(), "diagnoses": len(DIAGNOSES_BASE), "version": "3.0"}) @app.route("/api/v1/diagnoses") def list_diagnoses(): return jsonify(DiagnosisChecker().list_all_diagnoses()) @app.route("/api/v1/diagnose", methods=["POST"]) def diagnose(): data = request.get_json() or {} symptoms = _parse_symptoms(data.get("symptoms", "")) labs = _parse_labs(data.get("labs", "")) return jsonify(DiagnosisChecker().diagnose(symptoms, labs)) @app.route("/api/v1/analyze", methods=["POST"]) def analyze(): data = request.get_json() or {} rot = data.get("rotation", 6) symptoms = _parse_symptoms(data.get("symptoms")) if data.get("symptoms") else None labs = _parse_labs(data.get("labs")) if data.get("labs") else None result = run_pipeline(rot, diagnosis_code=data.get("diagnosis_code"), symptoms=symptoms, labs=labs) state = SystemState(); state.load_formulas(); Analyzer(state).run(rot) face_stats = {} for f in state.formulas.values(): if f.formula_type == "base": fs = face_stats.setdefault(f.face, {"active": 0, "broken": 0, "contraindicated": 0}) if f.verdict == "АКТИВЕН": fs["active"] += 1 elif f.verdict == "НАРУШЕН": fs["broken"] += 1 else: fs["contraindicated"] += 1 result["face_stats"] = face_stats return jsonify(result) @app.route("/api/v1/metas") def metas(): face = request.args.get("face", "Pharmacotherapy") checker = CompatibilityChecker() return jsonify(checker.check_all_metas(generate_all_metas_for_face(face))) @app.route("/api/v1/compatibility") def compatibility(): return jsonify({"dangerous_pairs": len(DANGEROUS_PAIRS), "synergistic_pairs": len(SYNERGISTIC_PAIRS)}) @app.route("/api/v1/treatment/<diagnosis_code>") def treatment_info(diagnosis_code): diag = DiagnosisChecker().get_diagnosis(diagnosis_code) if not diag: return jsonify({"error": "Диагноз не найден"}), 404 return jsonify({"code": diagnosis_code, "name": diag["name"], "icd10": diag["icd10"], "protocols": diag["protocols"], "monitoring": diag["monitoring"], "goals": diag["goals"]}) print("\n Нейромодулятор Medical v3.0") print(" Дашборд: http://localhost:5000") print(" API health: http://localhost:5000/api/v1/health") print(" Диагнозы: http://localhost:5000/api/v1/diagnoses\n") app.run(host="0.0.0.0", port=5000, debug=True) # ═══════════════════════════════════════════════════════════════════════════ # TESTS — ТЕСТЫ # ═══════════════════════════════════════════════════════════════════════════ class TestCube(unittest.TestCase): def test_protocol_count(self): self.assertEqual(formula_count(), 332) def test_faces(self): self.assertEqual(len(FACES), 6) def test_validate_rotation_0(self): self.assertEqual(validate_rotation(0), 0) def test_validate_rotation_11(self): self.assertEqual(validate_rotation(11), 11) def test_validate_rotation_invalid(self): with self.assertRaises(ValueError): validate_rotation(12) def test_validate_rotation_bool(self): with self.assertRaises(TypeError): validate_rotation(True) def test_protocol_distribution(self): for face in FACES: count = sum(1 for k in FORMULA_REGISTRY if f"Medical:{face}:" in k) self.assertGreaterEqual(count, 55) class TestCompatibility(unittest.TestCase): def test_dangerous_warfarin_aspirin(self): r = CompatibilityChecker().check("Warfarin 5mg/день", "Aspirin 100mg/день") self.assertEqual(r["status"], "dangerous") def test_dangerous_simvastatin_clarithromycin(self): r = CompatibilityChecker().check("Simvastatin 40mg/день", "Clarithromycin 500mg x2") self.assertEqual(r["status"], "dangerous") def test_synergistic_metformin_kpt(self): r = CompatibilityChecker().check("Metformin 500mg x2/день", "КПТ 16 сессий") self.assertEqual(r["status"], "synergistic") def test_compatible_default(self): r = CompatibilityChecker().check("Аппендэктомия", "TENS 80Гц") self.assertEqual(r["status"], "compatible") def test_all_metas_checked(self): metas = generate_all_metas_for_face("Pharmacotherapy") self.assertEqual(len(metas), 72) self.assertEqual(len(CompatibilityChecker().check_all_metas(metas)), 72) class TestDiagnoses(unittest.TestCase): def test_diagnosis_count(self): self.assertEqual(len(DIAGNOSES_BASE), 20) def test_diagnose_dm2(self): results = DiagnosisChecker().diagnose( ["жажда", "полиурия", "частое мочеиспускание"], {"hba1c": 7.2, "глюкоза": 8.5}) self.assertGreater(len(results), 0) self.assertEqual(results[0]["code"], "DM2") def test_diagnose_htn(self): results = DiagnosisChecker().diagnose(["гипертония"], {"ад": 160}) self.assertGreater(len(results), 0) self.assertEqual(results[0]["code"], "HTN") def test_diagnose_sepsis(self): results = DiagnosisChecker().diagnose(["сепсис", "гипотония"], {"лактат": 3.5}) self.assertGreater(len(results), 0) self.assertEqual(results[0]["code"], "SEPSIS") def test_diagnose_no_match(self): results = DiagnosisChecker().diagnose(["насморк"], {"эритроциты": 4.5}) self.assertEqual(len(results), 0) def test_recommended_protocols(self): protos = DiagnosisChecker().get_recommended_protocols("DM2") self.assertIn("Metformin 500mg x2/день", protos) def test_all_diagnoses_have_protocols(self): checker = DiagnosisChecker() for code in DIAGNOSES_BASE: self.assertGreater(len(checker.get_recommended_protocols(code)), 0, f"{code} has no protocols") class TestTreatmentTracker(unittest.TestCase): def test_coverage_calculation(self): checker = DiagnosisChecker() tracker = TreatmentTracker("DM2", checker) tracker.record_treatment("Metformin 500mg x2/день", "bot_1", True) self.assertGreater(tracker.get_summary()["coverage_pct"], 0) def test_treatment_complete(self): checker = DiagnosisChecker() tracker = TreatmentTracker("HTN", checker) for p in checker.get_recommended_protocols("HTN"): tracker.record_treatment(p, "bot_1", True) self.assertTrue(tracker.get_summary()["treatment_complete"]) def test_missing_protocols(self): checker = DiagnosisChecker() tracker = TreatmentTracker("DM2", checker) tracker.record_treatment("Metformin 500mg x2/день", "bot_1", True) self.assertGreater(len(tracker.get_summary()["missing"]), 0) class TestState(unittest.TestCase): def test_state_init(self): self.assertEqual(SystemState().E_damage, 0.0) def test_load_formulas(self): s = SystemState(); s.load_formulas(); self.assertGreater(len(s.formulas), 0) def test_update_verdicts(self): s = SystemState(); s.load_formulas(); s.update_verdicts() self.assertEqual(s.stable_count + s.broken_count + s.destroyed_count, 332) def test_set_diagnosis(self): s = SystemState(); s.load_formulas() tracker = TreatmentTracker("DM2", DiagnosisChecker()) s.set_diagnosis("DM2", "Сахарный диабет 2 типа", 75.0, tracker) self.assertEqual(s.diagnosis_code, "DM2") self.assertEqual(s.diagnosis_name, "Сахарный диабет 2 типа") def test_treatment_stats(self): s = SystemState() s.update_treatment_stats(0.5, 60.0, True) self.assertEqual(s.match_rate, 0.5) self.assertTrue(s.treatment_complete) class TestAnalyzer(unittest.TestCase): def test_rotation_0_stable(self): s = SystemState(); s.load_formulas(); Analyzer(s).run(0) self.assertEqual(s.broken_count + s.destroyed_count, 0) def test_rotation_breaks(self): s = SystemState(); s.load_formulas(); Analyzer(s).run(6) self.assertGreater(s.broken_count + s.destroyed_count, 0) class TestNanobots(unittest.TestCase): def test_swarm_no_targets(self): s = SystemState(); s.load_formulas() self.assertEqual(DiagnosisNanobotSwarm(s).run()["attempted"], 0) def test_swarm_repairs(self): s = SystemState(); s.load_formulas(); Analyzer(s).run(6) self.assertGreater(DiagnosisNanobotSwarm(s).run()["attempted"], 0) def test_swarm_with_diagnosis(self): s = SystemState(); s.load_formulas(); Analyzer(s).run(6) checker = DiagnosisChecker() tracker = TreatmentTracker("DM2", checker) s.set_diagnosis("DM2", "Сахарный диабет 2 типа", 100.0, tracker) r = DiagnosisNanobotSwarm(s, diagnosis_code="DM2", diagnosis_checker=checker).run() self.assertIn("match_rate", r) self.assertIn("coverage_pct", r) def test_bert_template(self): s = SystemState(); s.load_formulas(); Analyzer(s).run(6) stable = [f.formula for f in s.formulas.values() if f.verdict == "АКТИВЕН" and f.formula_type == "base"] self.assertEqual(len(BertService().find_template("Metformin 500mg", stable, top_k=3)), 3) def test_match_diagnosis_logic(self): s = SystemState(); s.load_formulas(); Analyzer(s).run(6) checker = DiagnosisChecker() swarm = DiagnosisNanobotSwarm(s, diagnosis_code="DM2", diagnosis_checker=checker) self.assertTrue(swarm._matches_diagnosis("Metformin 500mg x2/день")) self.assertFalse(swarm._matches_diagnosis("Аппендэктомия лапароскопическая")) class TestDynamics(unittest.TestCase): def test_dynamics_runs(self): s = SystemState(); s.load_formulas(); Analyzer(s).run(6) self.assertIn("omega_final", DynamicsSimulator(s).run()) def test_rk4_steps(self): s = SystemState(); s.load_formulas() self.assertEqual(DynamicsSimulator(s).steps, 500) class TestSafety(unittest.TestCase): def test_green_level(self): s = SystemState(); s.R_safety = 0.9 self.assertEqual(PatientSafety(s).run()["level"], "ЗЕЛЁНЫЙ") def test_red_level(self): s = SystemState(); s.R_safety = 0.1 self.assertEqual(PatientSafety(s).run()["level"], "КРАСНЫЙ") def test_hysteresis(self): s = SystemState(); s.R_safety = 0.9 sf = PatientSafety(s); sf.run() s.R_safety = 0.73 self.assertEqual(sf.run()["level"], "ЗЕЛЁНЫЙ") class TestPipeline(unittest.TestCase): def test_pipeline_rotation_0(self): self.assertEqual(run_pipeline_simple(0)["stats"]["broken"], 0) def test_pipeline_rotation_6(self): self.assertGreater(run_pipeline_simple(6)["E_damage_initial"], 0) def test_pipeline_all_stages(self): r = run_pipeline_simple(3) for key in ["nanobots", "fixer", "dynamics", "safety", "concept_concentrate", "supervisor", "diversity", "meta_stats"]: self.assertIn(key, r) def test_pipeline_with_diagnosis(self): r = run_pipeline(3, diagnosis_code="DM2") self.assertIsNotNone(r.get("diagnosis_info")) self.assertEqual(r["diagnosis_info"]["code"], "DM2") def test_pipeline_with_symptoms(self): r = run_pipeline(3, symptoms=["жажда", "полиурия"], labs={"hba1c": 7.5, "глюкоза": 9.0}) self.assertIsNotNone(r.get("diagnosis_info")) self.assertEqual(r["diagnosis_info"]["code"], "DM2") def test_pipeline_treatment_summary(self): r = run_pipeline(3, diagnosis_code="DM2") self.assertIsNotNone(r.get("treatment_summary")) self.assertIn("coverage_pct", r["treatment_summary"]) class TestDiversity(unittest.TestCase): def test_diversity(self): s = SystemState(); s.load_formulas() d = calculate_weighted_diversity(s) self.assertIn("shannon", d) self.assertGreater(d["shannon"], 0) class TestSupervisor(unittest.TestCase): def test_supervisor_score(self): s = SystemState(); s.load_formulas(); Analyzer(s).run(6) checker = DiagnosisChecker() swarm = DiagnosisNanobotSwarm(s, diagnosis_code="DM2", diagnosis_checker=checker) swarm.run() s.S_omega = 90.0 result = MedicalSupervisor(s, swarm).run( swarm.run(), {"repaired": 0}, {"dangerous": 0, "synergistic": 1, "compatible": 71}) self.assertIn("score", result) self.assertIn("repair_rate", result) # ═══════════════════════════════════════════════════════════════════════════ # ТОЧКА ВХОДА # ═══════════════════════════════════════════════════════════════════════════ if __name__ == "__main__": import sys if "--test" in sys.argv: unittest.main(argv=[sys.argv[0], "-v"], exit=False) elif "--api" in sys.argv: run_api() elif "--metas" in sys.argv: run_metas() elif "--diag" in sys.argv: run_diag() else: run_cli() ``` Порядок сборки: части 1–9 → 10a → 10b. Оба блока идут подряд, без разрывов, и вместе образуют прежнюю десятую часть. [[Участник:Нейромодулятор|Нейромодулятор]] ([[Обсуждение участника:Нейромодулятор|обсуждение]]) 17:26, 6 октября 2026 (UTC) 8f0env0rpmloz9tcqpswvbcjsw0efbr Нейромодулятор 0 30505 166739 2026-10-06T17:15:55Z Нейромодулятор 37059 /* */ Разбиваю десятую часть на две. Склеиваются по порядку после части 9/10 (или нумеруй их как 10a и 10b — как удобнее). ## Часть 10a — CLI, вывод мета-протоколов, демо пациентов ```python # ═══════════════════════════════════════════════════════════════════════════ # CLI — КОМАНДНАЯ СТРОКА # ═══════════════════════════════════════════════════════════════════════════ def run_cli(): clear_metas() print(f"Нейромодулятор Medical Edition v3.0 — {formula_count()} протоколов, " 166739 wikitext text/x-wiki {{Курс |Факультет = <!-- название факультета,к которому относится курс --> |Кафедра = <!--название кафедры, к которому относится курс --> |К курсу = <!-- ссылки на курсы, которые нужны для прохождения данного курса --> |После курса = <!-- ссылку на курсы, после которых, можно проходить другие курсы --> |Преподаватель = <!-- ник участника в Викиверситете, который преподает --> }}Разбиваю десятую часть на две. Склеиваются по порядку после части 9/10 (или нумеруй их как 10a и 10b — как удобнее). == Часть 10a — CLI, вывод мета-протоколов, демо пациентов == == Часть 10b — дашборд, API, тесты, точка входа == Порядок сборки: части 1–9 → 10a → 10b. Оба блока идут подряд, без разрывов, и вместе образуют прежнюю десятую часть. == Лекции == == Семинары == == Экзамен == tq5nqaphyz2d1u6kspu0f2y7rdugqc6