Шаблон LaTeX для оформления письменных работ
Для оформления письменных работ студентов кафедры, например, таких как:
- реферат,
- курсовая работа,
- выпускная квалификационная работа,
- магистерская диссертация,
рекомендуется использовать официальный LaTeX -шаблон кафедры информационной безопасности.
Скачать шаблон (или клонировать) можно по ссылке на github :
Чижов Иван Владимирович
Доцент, учёный секретарь кафедры, к.ф.-м.н.
Мои научные интересы — теория помехоустойчивого кодирования в криптографии, криптографические свойства дискретных функций, алгебраические методы в криптографии.
©Кафедра информационной безопасности
Как оформить курсовую работу по гост latex
Кафедра радиофизики и нелинейной динамики



Оформление по ГОСТу в Latex
Оформление по ГОСТу в Latex

Оформление курсовых и дипломных работ по ГОСТу в Latex
Главная идея LaTeX состоит в том, что авторы должны думать о содержании, о том, что они пишут, не беспокоясь о конечном визуальном облике (печатный вариант, текст на экране монитора или что-то другое). Готовя свой документ, автор указывает логическую структуру текста (разбивая его на главы, разделы, таблицы, изображения), а LaTeX решает вопросы его отображения. Так содержание отделяется от оформления. Оформление при этом или определяется заранее (стандартное), или разрабатывается для конкретного документа.
Для использования Latex необходимо установить соответствующий вашей операционной системе пакет программ. Для редактирования исходных файлов .tex можно использовать как простой текстовый редактор (с последующей ручной компиляцией, например, с помощью команды pdflatex), так и специальные среды (такие как texmaker, gummi и другие). Вводные инструкции по использованию системы Latex без труда можно найти в интернете (инструкция на сайте habr.com и на сайте overleaf.com). На последней странице вы также найдете инструкцию по использованию русского языка в Latex.
Специальные символы в математических окружениях Latex можно найти в документации к используемой программной среде (texmaker documentation), в интернете, или с помощью специального графического сервиса.
Для оформления в стиле ГОСТ удобно использовать шаблон с сайта overleaf (скачать архив шаблона проекта). Есть возможность использовать как готовый шаблон онлайн, так и скомпилировать его на локальном компьютере. Также предлагается рассмотреть модификацию специально (для студентов кафедры радиофизики и нелинейной динамики).
Saved searches
Use saved searches to filter your results more quickly
Cancel Create saved search
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.
LaTeX шаблоны для написания отчетов/дипломов/курсовых работ
mirea-ninja/Latex-Template-for-Report-Diploma-Thesis
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Switch branches/tags
Branches Tags
Could not load branches
Nothing to show
Could not load tags
Nothing to show
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Cancel Create
- Local
- Codespaces
HTTPS GitHub CLI
Use Git or checkout with SVN using the web URL.
Work fast with our official CLI. Learn more about the CLI.
Sign In Required
Please sign in to use Codespaces.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching Xcode
If nothing happens, download Xcode and try again.
Launching Visual Studio Code
Your codespace will open once ready.
There was a problem preparing your codespace, please try again.
Latest commit
39a603a Feb 18, 2023
Git stats
Files
Failed to load latest commit information.
Latest commit message
Commit time
README.md
LaTeX шаблон для написания отчетов/дипломов/курсовых работ
Готовый шаблон, который оформлен по ГОСТу 2021.
Для работы с шаблоном рекомендуется использовать Overleaf (настройка редактора).
- Шрифт для курсовой Times New Roman, размер – 14 пт.
- Междустрочный интервал должен быть равен 1.5 cантиметра.
- Каждая новая строка должна начинаться с отступа равного 1.25 сантиметра.
- Текст, который является основным содержанием, должен быть выровнен по ширине.
- Ширина левого поля должна равняться 3 сантиметра, а правое 1 сантиметра. Верхнее и нижнее должны равняться 2 сантиметра.
Доступно изменение параметров в Settings/format.tex.

Подробный туториал по использованию внутри шаблона
Вставка собственного PDF документа в качестве титульного листа
Вставка рисунков
Оформление списка литературы
⌨️ Вставка и подсветка листингов
Как использовать с Overleaf
- Откройте Overleaf
- Нажмите на New Project, выберите Upload Project
- Выгрузите .zip архив с шаблоном
- Menu \ Settings \ Compiler \ XeLaTeX
- Все готово к использованию.
- Learn LaTeX in 30 minutes
- Викиучебник
Дистрибутивы пакетов с XeLaTeX компилятором
Редакторы исходного кода
WYSIWYM (То, что ты видишь, есть то, что ты имеешь в виду)
- Разработчик Stulk3
- Спасибо SyntOwl за подборку программ,
- Спасибо ValeryVerkhoturov за помощь с шаблоном
About
LaTeX шаблоны для написания отчетов/дипломов/курсовых работ
Скиньте шаблон для курсовой работы в Латехе(LaTeX)

Для курсовой нет общих для всех особых правил оформления. Она должна удовлетворять какому-то минимальному набору правил (ГОСТ), которого придерживается Ваш вуз, а потому, Вам не подойдет чей-то готовый шаблон, если только это не будет Ваш коллега (а почему Вы не спросите про правила оформления у своего научного руководителя? и зачем именно шаблон? — курсовая не настолько сложный документ). Минимальный уровень документа, к которому начинают относиться хоть сколько-нибудь строго — это ВКР бакалавра. Могу дать шаблон для ВКР из СПбГУ: https://github.com/itonik/spbu_diploma , но подозреваю, что он Вам не подойдет.
Похожие посты
1 день назад

Пацан к успеху шёл, не получилось, не фартануло

1 день назад
Установка Windows 11 на старый ПК/ноут с BIOS и MBR

Установленная Windows 11 на старый комп с Bios и MBR
Поздравляю с Новым Годом мой самый любимый сайт pikabu.ru и всех его обитателей!
Так сложилось, что именно здесь я находил, и обнаруживал случайно очень много полезной информации: лайфхаки, технические инструкции, новинки мира IT.. Вот и наступила моя очередь ответить чем-нибудь полезным, так что держите подарок в подарок этот пост.
Надеюсь, после этой статьи, Майкрософты не «пофиксят» эту фишку.
Примерно месяц назад ко мне в гости зашёл друг, который, как и я, техник-айтишник. У нас произошёл интересный спор про достоинства и недостатки операционной системы Windows 11, и её отличия от Windows 10. Я топил за Windows 10, поясняя что её только доделали, а 11 сделана на её основе, не отличается по производительности, но с новыми ограничениями и багами + интерфейс отстойный. Сам не пробовал, но в интернете читал и видел. Друг же топил за 11, отталкиваясь от субъективного опыта использования..
«Давай установим и сравним!» — так и началась история этой статьи.
Первый блин комом. Так как у меня старенький комп(в игры не играю), Windows 11 при установке сообщила что моё железо не отвечает минимальным системным требованиям.. В тот вечер на этом всё и закончилось. Но это событие возбудило интерес.. Так что держите результат!
Сразу хочу сказать, что найденный способ простой, эффективный, и не требует вмешательств в дистрибутив Windows 11. Но при этом, статья написана для опытных пользователей, а не совсем новичков. Поехали!
Для эксперимента нам потребуется:
- Старенький комп/ноут без UEFI т.е. с BIOS, но поддерживающий Windows 10. Назовём «ПК-1».
- Современный комп/ноут с UEFI, поддерживающий Windows 11, или виртуальная машина с такими же качествами. Назовём «ПК-2».
- Установочные флешки c Windows 10 и Windows 11, либо загрузочная флешка с Windows PE типа LiveUSB и установочные ISO образы этих систем.
- Загрузочная флешка с Windows PE типа LiveUSB с Acronis True Image на борту. Для примера я буду использовать загрузочную флешку WinPE SergeyStrelec, https://sergeistrelec.name/ .
Ну что, готовы? Продолжаем!
- Устанавливаем Windows 11 на «ПК-2», но с соблюдением условий: ни в процессе установки, ни после, не подключаем интернет и не устанавливаем драйверы. Доходим до этапа, когда видим рабочий стол, и перезагружаем машину.
- Загружаемся с флешки WinPE на «ПК-2», и с помощью Acronis True Image снимаем образ жёсткого диска/SSD. Кладём этот образ на эту же флешку. Больше нам ПК-2 не понадобится.
- Устанавливаем Windows 10 на «ПК-1» любым удобным способом.
- Загружаемся с флешки WinPE на «ПК-1». Далее будут иллюстрации, присаживайтесь поудобней.

Вот на таком ПК проводился эксперимент. WinPE — SergeyStrelec. https://sergeistrelec.name/
5. Сразу после загрузки WinPE, нужно отформатировать раздел с установленной системой(обычно C:\), желательно, штатными средствами WinPE в быстром варианте. Именно форматируем, а не пересоздаём, чтобы никакие идентификаторы разделов не сбились. Нужно это для того, чтобы потом Acronis True Image не создавал проблем с выбором диска для распаковки, и чтобы не морочиться с загрузчиками.

Форматируем раздел с установленной Windows 10
6. Запускаем Acronis True Image, и выбираем созданный на «ПК-2» образ диска с установленной Windows 11.

Выбираем созданный на «ПК-2» образ диска с установленной Windows 11
7. Метод восстановления: «Восстановить диски или разделы», «Далее>»

8. Выбираем только раздел с Windows 11, т.е. диск (C:), жмём «Далее>»

Выбираем только раздел с Windows 11, т.е. диск (C:)
9. Хранилище нового раздела — выбираем наш отформатированный диск (C:), «Принять». Кстати, именно на этом этапе возникает затык: если диск не отформатирован, то мы его не сможем выбрать.

Выбираем наш отформатированный диск (C:).
10. «Далее>», «Приступить», ждать..

11. После окончания процесса, запускаем Acronis Disk Director или другую дисковую утилиту, чтобы удалить «Раздел восстановления», который остался от Windows 10. Windows 11 новый такой создаст сама.

Удаляем «Раздел восстановления» Windows 10.
12. Перезагружаем ПК-1, Первую загрузку Windows 11 нужно выполнить с отключенным интернетом, иначе будут ошибки BSOD. А вот уже как рабочий стол увидите, тогда можно и интернет подключать, тогда всё и заработает.
13. Радуемся новенькой системе на стареньком ПК!
Вот так выглядит первый запуск Windows 11 на стареньком ПК с BIOS и MBR)
Способ нашёл и проработал я, статью тоже напечатал: тег «Моё».
Всем, кто дочитал до конца, бесконечная благодарность. С Новым Годом всех, ещё раз! Счастья, здоровья, и беззаботности вам.
Показать полностью 9 1
2 дня назад

Чат GPT становится все больше похожим на программистов.

* Код, который ты мне дал, не работает. Можешь исправить?
* У меня всё работает.
2 дня назад

SQL задача про IN и NOT IN с объяснением

Всем отличного начала нового года! Вчера утром в своём Телеграм-канале опубликовал интересную задачу по SQL с собеседования про IN и NOT IN.
С первого взгляда кажущееся правильным решение на самом деле ложно. Чтобы верно ответить в задаче, нужно знать как СУБД обрабатывает элементы множества, указанные для оператора IN / NOT IN в запросе.
Вначале вот текст самой задачи. Ниже я поясню правильное решение:
В таблице CLIENTS пять строк. В первых двух строках в поле CLIENT_TYPE значение 1, ещё в двух строках в CLIENT_TYPE значение 2 и в последней строке поле CLIENT_TYPE не заполнено, то есть в последней строке в поле CLIENT_TYPE значение NULL.
Есть два запроса:
1)
SELECT * FROM CLIENTS WHERE CLIENT_TYPE IN (1)
2)
SELECT * FROM CLIENTS WHERE CLIENT_TYPE NOT IN (2, NULL)
Результирующие наборы данных, полученные в результате выполнения этих запросов, будут одинаковыми или разными?
Здесь поставь чтение на паузу и ответь на вопрос самостоятельно.
На сегодня на канале следующий разброс ответов:

Первый запрос отбирает клиентов, у которых в столбце тип указано значение 1. В результате будут отобраны две строки. Здесь все понятно. Так как в таблице клиентов ещё остаются строки, не попавшие в выбор первого запроса, со значениями в столбце тип 2 и NULL, то видится, что второй запрос должен как раз вернуть такой же результирующий набор данных. Однако, тут дело в коварном NULL в значениях для оператора NOT IN. СУБД представляет оператор NOT IN:
SELECT * FROM CLIENTS WHERE CLIENT_TYPE NOT IN (2, NULL)
в результате должны быть отобраны клиенты, у которых значение в столбце тип не равно каждому из перечисленных во множестве значений:
SELECT * FROM CLIENTS WHERE ( (CLIENT_TYPE <> 2) AND (CLIENT_TYPE <> NULL) )
С NULL не допустимо использовать операторы сравнения. При сравнении с NULL (= NULL, <> NULL) результат будет всегда отрицательным.
Второй запрос не вернёт ни одной строки данных.
Ещё больше полезного и интересного в моём Телеграмм-Канале.
Показать полностью 1
Поддержать
2 дня назад

Тот мир который все заслужили

Поддержать
2 дня назад

Документация

Поддержать
3 дня назад

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI?

Зачастую в процессе разработки собственных устройств или моддинга уже существующих, встаёт задача выполнения стороннего кода: будь то ваши собственные программы с SD-флэшек, или программы, написанные другими пользователями с помощью SDK для вашего устройства. Тема компиляторов и кодогенерации достаточно сложная: чтобы просто загрузить ELF или EXE (PE) программу, вам нужно досконально разбираться в особенностях вашей архитектуры: что такое ABI, релокации, GOT, отличие -fPIE от -fPIC, как писать скрипты для ld и т. п. Недавно я копал SDK для первых версий Symbian и основываясь на решениях из этой ОС понял, каким образом можно сделать крайне «дешевую» загрузку любого нативного кода практически на любом микроконтроллере, совершенно не вникая в особенности кодогенерации под неё! Сегодня мы с вами: узнаем, что происходит в процессе загрузки программы ядром Linux, рассмотрим концепцию, предложенную Symbian Foundation и реализуем её на практике для относительно малоизвестной архитектуры — XTensa (хотя она используется в ESP32, детали её реализации «под капотом» для многих остаются загадкой). Интересно? Тогда добро пожаловать под кат!
❯ Как это работает?
Думаю, для многих моих читателей реализация процесса загрузки exe-программ и dll-библиотек в память процесса оставалась эдаким чёрным ящиком, в детали реализации которого вдаваться не нужно. Отчасти это так и есть: современные ОС разруливают процесс загрузки бинарников в память сами, не требуя от программиста вообще ничего, даже понимания того, куда будет загружена его библиотека или программа.

Давайте для общего понимания вкратце разберемся, как происходит загрузка программ в Windows/Linux:
1. Система создаёт процесс и загружает в память программы секции из ELF/PE. Обычные программы для своей работы используют 3 секции: .text (код), .data (не-инициализированный сегмент памяти для глобальных переменных), .bss (сегмент памяти для инициализированных переменных). Каждому процессу выделяется собственное адресное пространство, называемое виртуальной памятью, которое не позволяет программе испортить память ядра, а также позволяет не зависеть от разметки физической памяти на выполняющей машине. Концепцию виртуальной памяти реализует специальной модуль в процессоре, называемый MMU.
2. Если бы наши программы не использовали никаких зависимостей в виде динамических библиотек, то на этом процесс загрузки можно было бы закончить: каждая программа имеет свой адрес загрузки, относительно которого линкер строит связи между обращениями к коду/данным программы. Фактически, для самых простых программ линкеру остаётся лишь прибавить адрес загрузки программы (например, 0x100) к каждому абсолютному обращению к памяти.
Однако современные программы используют десятки библиотек и для всех предусмотреть собственный адрес загрузки не получится: кто-то где-то всё равно будет пересекаться и вероятно, портить память. Кроме того, современные стандарты безопасности в Linux рекомендуют использовать позиционно-независимый код, дабы использовать преимущества ASLR (Address Space Layout Randomization, или простыми словами возможность загрузить программу в случайное место в памяти, дабы некоторые уязвимости, завязанные на фиксированном адресе загрузки программы перестали работать).
3. Поэтому для решения этой проблемы придуман т. н. динамический линкер, который уже на этапе загрузки программы или библиотеки патчит программу так, чтобы её можно было загрузить в любой участок памяти. Для этого используются данные, полученные от обычного линкера а этапе компиляции программы: помимо .text, .data и .bss, линкер создаёт секции .rel и .rel-plt, которые называются релокациями. Если объяснять совсем условно, то релокации — это просто запись вида «какой абсолютный адрес в коде программы нужно пропатчить» -> «на какое смещение его пропатчить». Самая простая релокация выглядит вот так:


.rel-plt же служит для резолвинга вызовов к dll/so: изначально программа ссылается на заранее определенные в процессе компиляции символы, которые уже в процессе загрузки патчатся на физические адреса функций из загруженной библиотеки.
И казалось бы — всё очень просто, пока в дело не вступают GOT (Global Offset Table — глобальная таблица смещений) и особенности реализации конкретного ABI. И ладно бы x86 или ARM, там всё разжевано и понятно, однако на других архитектурах начинаются проблемы и не всегда очевидно что и где за что отвечает.
А ведь чаще всего нужно просто загрузить небольшую программу, которой не нужны комплексные загрузчики: немного кода, немного данных и всё. И тут у нас есть три выхода:
- Писать полноценный загрузчик ELF-бинарников. ELF может оказаться громоздким для некоторых окружений и его реализация может оказаться тривиальной не для всех.
- Зарезервировать определенный сегмент в памяти (пусть с 0xFFF по 0xFFFF) и скомпилировать нашу программу с адресом загрузки 0xFFF с параметром -fno-pic. В таком случае, линкер сгенерирует обращения к памяти по абсолютным адресам — если переменная лежит по адресу 0xFFF, то программа будет обращаться сразу к этому адресу памяти, без необходимости что либо динамически линковать. Именно такой подход использовался во времена ZX Spectrum, Commodore 64 и MS-DOS (однако там роль «виртуальной памяти» выполняла такая особенность 8086, как сегменты). У такого подхода есть и минусы: относительная невозможность загрузки сразу нескольких программ одновременно, зарезервированное пространство линейно отъест небольшой кусок памяти у основной прошивки, нет возможности динамической аллокации секций. Зато такой код теоретически будет работать быстрее, чем PIC.
Недавно мы сидели в чате ELF-сцены (разработка нативных программ под телефоны Siemens, Sony Ericsson, Motorola и LG с помощью хаков) и думали, как же можно реализовать загрузчик сторонних программ на практически неизвестных платформах. Кто-то предлагал взять ELF под основу — однако с его реализацией под некоторые платформы есть трудности, а кто-то предлагал писать «бинлоадер» — самопальный формат бинарников, который получается из, например, тех же эльфов.

В это же время я копал SDK для Symbian и хорошо помнил, что в прикладных приложениях для этой ОС нет поддержки глобальных переменных вообще. Да, сегмент .data и .bss полностью отсутствует — переменные предлагается хранить в структурах. Почему так сделано? Всё дело в том, что каждая программа в Symbian — это dll-библиотека, которую загружает EKA и создаёт экземпляр CApaApplication. И дабы была возможность загрузить dll один раз для всех программ (что справедливо для системных библиотек), ребята полностью выкинули возможность использования любых глобальных переменных. А ведь идея интересная!
Однако в таком подходе есть несколько серьезных ограничений:
- Отсутствие глобальных переменных может стать проблемой при портированиии уже существующего софта, хотя вашим программам ничего не мешает передавать в каждую функцию структуру с глобальным стейтом, который можно при необходимости изменять. Кроме того, нет ограничений на использование C++ (за исключением необходимости ручной реализации new/delete и отсутствием исключений).
- Отсутствие преинициализированных данных. Вот это уже может стать относительно серьёзной проблемой, у которой, тем не менее, есть свои обходные решения. Например если вы храните команды для инициализации дисплея в таблице, или какие-либо калибровочные данные — вы не сможете их объявить, просто используя инициализаторы в C. Тоже самое касается и строковых литерал. Тут есть два варианта: часть таблиц можно вынести на стек (если эти самые таблицы достаточно маленькие), либо подгружать необходимые данные из бинарника с помощью основной прошивки (например, LoadString и т. п.).
Давайте же на практике посмотрим, имеет ли право на жизнь такой подход!
❯ Практическая реализация
Формат нашего бинарника будет до безобразия прост: небольшой заголовок в начале файла и просто сырой дамп сегмента .text, который можно экспортировать из полученного elf даже без необходимости писать скрипт для линкера. При этом нужно учесть, что ESP32 — это микроконтроллер частично Гарвардской архитектуры, т. е. шина данных и кода у него расположены отдельно. Однако у чипа есть полноценный MMU, который позволяет маппить регионы физической памяти в виртуальную память, чем мы и воспользуемся в итоге!
Заголовок нашего бинарника будет выглядеть вот так:

Программа общается с основной прошивкой посредством псевдо-syscall’ов: функции, которая в качестве первого аргумента ожидает номер нужной службы и один 32х-битный указатель для описания структуры с параметрами. Реализация syscall’ов — одна из самых простых и неприхотливых с точки зрения обратной совместимости с будущими прошивками.

Концептуально всё очень просто: GetGlobalStateSize сообщает нашему загрузчику размер структуры для хранения глобального стейта, в то время как Start уже фактически заменяет main() в нашей программе. Необходимости в crt0 нет, поскольку весь необходимый инит выполняет бутлоадер ESP32. Впрочем, при желании вы можете выделить отдельный стек для вашей программы — это повысит надежность, если выполняемая программа удумает испортить стек.

Собираем нашу программу:
xtensa-esp32-elf-cc.exe test.c -fno-pic -nostdlib -nostartfiles -Wl,—section-start=.text=0x0
xtensa-esp32-elf-objcopy.exe —only-section=.text —output-target binary a.out run.bin
-fno-pic отключает генерацию кода, зависимого от GOT, -nostdlib и -nostartfiles убирает из билда crt0 и stdlib, благодаря чему мы получаем только необходимый код. —section-start задает смещение для загрузки секции .text на 0x0 (в идеале это делать необходимо из скрипта для ld).
objcopy скопирует из полученного ELF только необходимую нам секцию .text.
Как же это работает на практике? Давайте дизассемблируем выходной бинарник и посмотрим, что у нас дает на выхлопе cc:

Обратите внимание, что Start вызывает подфункции с помощью инструкции CALLX8, которая в отличии от обычного Immediate-версии CALL8, выполняет переход относительно текущего адреса в PC, благодаря чему переход полностью независим от адреса загрузки программы в памяти. А благодаря тому, что все данные, в том числе и указатель на глобальный стейт передаются через стек, нет необходимости релокейтить сегменты данных.
По итогу всё, что нужно от загрузчика бинарников — это загрузить программу в память для инструкций, выделить память для структуры с стейтом программы и передать управление Start. Всё!
Конкретно в случае ESP32, у нас есть два возможных решения задачи загрузки программы в память:
- Загрузить программу в IRAM. Такая возможность теоретически есть, однако на практике загрузчик ESP32 устанавливает права только на чтение и выполнение на данный регион памяти. Попытка что-то скопировать туда закончится исключением SIGSEGV. Кроме того, сегмент IRAM относительно небольшой — всего около 200Кб.
- Самопрограммирование. Для этого, в esp32 есть два механизма — Partition API и SPI Flash API. Я выбрал Partition API для простоты реализации.
Для нашей прошивки необходимо будет переразметить флэш-память. Для этого запускаем idf.py menuconfig, идём в Partition Table -> Custom partition table CSV. Создаём в папке проекта partitions.csv, куда пишем:
# ESP-IDF Partition Table
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x6000,
phy_init, data, phy, 0xf000, 0x1000,
factory, app, factory, 0x10000, 1M,
executable, data, undefined, 0x110000, 0x10000
Для заливки программы можно использовать соответствующее Partition API, либо parttool.py :
parttool.py —port «COM41» write_partition —partition-name=executable —input «run.bin»
Переходим к загрузчику программы: