diff --git a/.github/workflows/gohugo.yml b/.github/workflows/gohugo.yml index 9a1e10a..ff0b873 100644 --- a/.github/workflows/gohugo.yml +++ b/.github/workflows/gohugo.yml @@ -1,160 +1,197 @@ name: Deploy Hugo site to Pages + on: push: branches: ["main"] + paths-ignore: + - "README.md" + - "LICENSE" + - ".gitignore" + - "docs/**" workflow_dispatch: + inputs: + force_regen: + description: "Пересобрать все артефакты, игнорируя кеш" + type: boolean + default: false + permissions: contents: read pages: write id-token: write -concurrency: - group: "pages" - cancel-in-progress: false + defaults: run: shell: bash + +env: + HUGO_VERSION: "0.161.1" + PANDOC_VERSION: "3.10.1" + TECTONIC_VERSION: "0.15.0" + jobs: - build: + build-deploy: runs-on: ubuntu-latest - env: - HUGO_VERSION: 0.161.1 + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + concurrency: + group: pages-${{ github.ref }} + cancel-in-progress: true + steps: - - name: Install Hugo CLI - run: | - wget -O ${{ runner.temp }}/hugo.deb \ - https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb \ - && sudo dpkg -i ${{ runner.temp }}/hugo.deb + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: recursive + fetch-depth: 0 - - name: Install Dart Sass + - name: Определить, нужна ли генерация артефактов + id: changes run: | - sudo apt-get update -q - sudo apt-get install -y -q sass + if [[ "${{ github.event_name }}" == "workflow_dispatch" ]] \ + || ! git rev-parse --verify -q HEAD^ >/dev/null; then + echo "content=true" >> "$GITHUB_OUTPUT"; exit 0 + fi + FILES=$(git diff --name-only HEAD^ HEAD) + echo "Изменённые файлы:"; echo "$FILES" + if grep -qE '^(content/|scripts/|\.github/workflows/)' <<< "$FILES"; then + echo "content=true" >> "$GITHUB_OUTPUT" + else + echo "content=false" >> "$GITHUB_OUTPUT" + fi + + - name: Собрать контрибьюторов + env: + GITHUB_TOKEN: ${{ github.token }} + run: python3 scripts/collect-contributors.py + + - name: Снапшот контрибьюторов в артефакты прогона + uses: actions/upload-artifact@v4 + with: + name: contributors-${{ github.run_number }} + path: data/contributors.json + retention-days: 90 - - name: Cache apt-пакеты + - name: Restore артефактов генераторов + id: gen-cache + uses: actions/cache/restore@v4 + with: + path: | + .cache + static/covers + static/posts + key: gen-${{ github.sha }} + restore-keys: gen- + + - name: Решить, запускать ли генераторы + id: gen + run: | + NEED=false + [[ "${{ steps.changes.outputs.content }}" == "true" ]] && NEED=true + # кеш вообще не восстановился — артефактов нет, надо генерить + [[ -z "${{ steps.gen-cache.outputs.cache-matched-key }}" ]] && NEED=true + [[ "${{ inputs.force_regen }}" == "true" ]] && NEED=true + echo "run=$NEED" >> "$GITHUB_OUTPUT" + echo "Генераторы: $NEED" + + - name: Cache CLI-бинарников + id: bins uses: actions/cache@v4 with: - path: /var/cache/apt/archives/*.deb - key: apt-xetex-v1-${{ runner.os }} + path: ~/.local/bin + key: bins-${{ runner.os }}-h${{ env.HUGO_VERSION }}-p${{ env.PANDOC_VERSION }}-t${{ env.TECTONIC_VERSION }} - - name: Install pandoc + XeLaTeX + - name: Скачать hugo / pandoc / tectonic + if: steps.bins.outputs.cache-hit != 'true' run: | - sudo apt-get install -y -q \ - pandoc \ - texlive-xetex \ - texlive-lang-cyrillic \ - fonts-dejavu + set -euo pipefail + mkdir -p ~/.local/bin && cd "$(mktemp -d)" - - name: Checkout - uses: actions/checkout@v4 - with: - submodules: recursive + curl -sSL "https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz" \ + | tar xz hugo && mv hugo ~/.local/bin/ - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: '20' - cache: 'npm' + curl -sSL "https://github.com/jgm/pandoc/releases/download/${PANDOC_VERSION}/pandoc-${PANDOC_VERSION}-linux-amd64.tar.gz" \ + | tar xz --strip-components=2 "pandoc-${PANDOC_VERSION}/bin/pandoc" && mv pandoc ~/.local/bin/ - - name: Setup Python - uses: actions/setup-python@v5 - with: - python-version: '3.11' + curl -sSL "https://github.com/tectonic-typesetting/tectonic/releases/download/tectonic%40${TECTONIC_VERSION}/tectonic-${TECTONIC_VERSION}-x86_64-unknown-linux-musl.tar.gz" \ + | tar xz tectonic && mv tectonic ~/.local/bin/ - - name: Install Python dependencies - run: pip install Pillow pyyaml genanki + chmod +x ~/.local/bin/* - - name: Cache fonts - uses: actions/cache@v4 - with: - path: .cache/fonts - key: covers-fonts-v1 + - name: PATH + run: echo "$HOME/.local/bin" >> "$GITHUB_PATH" - - name: Cache cover markers + - name: Cache бандла tectonic + if: steps.gen.outputs.run == 'true' uses: actions/cache@v4 with: - path: .cache/covers - key: covers-markers-${{ github.sha }} - restore-keys: covers-markers- + path: ~/.cache/Tectonic + key: tectonic-bundle-${{ env.TECTONIC_VERSION }}-v1 - - name: Cache PDF хеши - uses: actions/cache@v4 + - name: Setup Python + if: steps.gen.outputs.run == 'true' + uses: actions/setup-python@v5 with: - path: | - .cache/pdf - static/posts/*/resources/*.pdf - key: pdf-v1-${{ hashFiles('content/posts/**/*.md') }} - restore-keys: pdf-v1- + python-version: "3.12" + cache: pip + cache-dependency-path: scripts/requirements.txt - - name: Cache AI merged хеши - uses: actions/cache@v4 - with: - path: | - .cache/ai - static/posts/*/resources/*_merged.md - key: ai-v1-${{ hashFiles('content/posts/**/*.md') }} - restore-keys: ai-v1- + - name: Python deps + if: steps.gen.outputs.run == 'true' + run: pip install -r scripts/requirements.txt - - name: Cache Anki хеши - uses: actions/cache@v4 + - name: Генерация (covers / anki / merged / pdf) + if: steps.gen.outputs.run == 'true' + run: | + python scripts/generate-covers.py + python scripts/generate-anki.py + python scripts/merge-md-for-ai.py + python scripts/generate-pdf.py --jobs "$(nproc)" + + - name: Save артефактов генераторов + if: steps.gen.outputs.run == 'true' + uses: actions/cache/save@v4 + continue-on-error: true with: path: | - .cache/anki - static/posts/*/resources/*.apkg - static/posts/*/*/resources/*.apkg - key: anki-v1-${{ hashFiles('content/posts/**/*.md', 'content/posts/**/*.csv') }} - restore-keys: anki-v1- - - - name: Generate OG covers - run: python scripts/generate-covers.py - - - name: Generate Anki decks - run: python scripts/generate-anki.py - - - name: Generate merged MD for AI - run: python scripts/merge-md-for-ai.py - - - name: Generate PDF конспекты - run: python scripts/generate-pdf.py + .cache + static/covers + static/posts + key: gen-${{ github.sha }} - name: Setup Pages id: pages uses: actions/configure-pages@v5 - - name: Install Node.js dependencies and build CSS + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: "20" + cache: npm + + - name: Build CSS run: | - npm ci + npm ci --prefer-offline --no-audit --fund=false npm run css - name: Build with Hugo env: HUGO_CACHEDIR: ${{ runner.temp }}/hugo_cache HUGO_ENVIRONMENT: production - run: | - hugo \ - --minify \ - --baseURL "${{ steps.pages.outputs.base_url }}/" + run: hugo --gc --minify --baseURL "${{ steps.pages.outputs.base_url }}/" - name: Verify build run: | - [ -f public/index.html ] || exit 1 - grep -q " /dev/null 2>&1 || \ - (echo "Обложки не попали в public/covers/!"; exit 1) - echo "Содержимое index.html проверено." - echo "Обложки на месте." + [ -s public/index.html ] || { echo "index.html пустой"; exit 1; } + grep -q "/dev/null 2>&1 || { echo "Обложки не попали в public/covers/"; exit 1; } - name: Upload artifact uses: actions/upload-pages-artifact@v3 with: path: ./public - deploy: - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-latest - needs: build - steps: - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v4 \ No newline at end of file + uses: actions/deploy-pages@v4 diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml new file mode 100644 index 0000000..ed1c0da --- /dev/null +++ b/.github/workflows/pr.yml @@ -0,0 +1,99 @@ +# Проверка Pull Request. +# +# Ничего не публикует — только говорит, соберётся ли сайт и не сломает ли +# правка что-нибудь ещё. Деплой остаётся в отдельном workflow на main. +# +# Задачи разнесены намеренно: автор PR должен видеть, что именно не так, +# а не «один красный крестик». + +name: PR + +on: + pull_request: + branches: [main] + +# Новый пуш в ту же ветку отменяет предыдущий прогон. +concurrency: + group: pr-${{ github.event.pull_request.number }} + cancel-in-progress: true + +permissions: + contents: read + +env: + HUGO_VERSION: 0.161.1 + +jobs: + # ── 1. Front matter и структура папок ────────────────────────────────── + content: + name: Конспекты + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-python@v5 + with: + python-version: '3.12' + + - run: pip install pyyaml + + - name: Проверить структуру и front matter + run: python scripts/check-content.py + + # ── 2. Собирается ли сайт ────────────────────────────────────────────── + build: + name: Сборка + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 # нужна полная история для контрибьюторов + submodules: recursive + + - uses: actions/setup-node@v4 + with: + node-version: '20' + cache: npm + + - name: Установить Hugo + run: | + wget -qO hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb + sudo dpkg -i hugo.deb + + # Аватарки и пережатые картинки переживают прогоны — иначе каждая + # сборка заново ходит на github.com. + - name: Кеш ресурсов Hugo + uses: actions/cache@v4 + with: + path: | + resources/_gen + /tmp/hugo_cache + key: hugo-${{ runner.os }}-${{ hashFiles('content/**/*.md', 'hugo.toml') }} + restore-keys: hugo-${{ runner.os }}- + + - run: npm ci + - run: npm run build + + - name: Собрать контрибьюторов + run: python scripts/collect-contributors.py + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + # --printPathWarnings ловит коллизии адресов: две лекции с одним + # слагом молча перетирают друг друга, если на них не смотреть. + - name: Hugo build + run: hugo --gc --minify --printPathWarnings --baseURL "/" + + - name: Отчёт о размере + run: | + echo "### Размер сборки" >> $GITHUB_STEP_SUMMARY + echo '```' >> $GITHUB_STEP_SUMMARY + du -sh public >> $GITHUB_STEP_SUMMARY + find public -name '*.html' | wc -l | xargs echo "HTML страниц:" >> $GITHUB_STEP_SUMMARY + echo '```' >> $GITHUB_STEP_SUMMARY + + - uses: actions/upload-artifact@v4 + with: + name: site + path: public + retention-days: 7 diff --git a/.gitignore b/.gitignore index 54f2068..bcb72e5 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ .hugo_build.lock output.css +contributors.json /public /resources/ diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..64eaa32 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,101 @@ +# Changelog + +Формат — [Keep a Changelog](https://keepachangelog.com/ru/1.1.0/). +Версионируется движок сайта: шаблоны, стили, скрипты и **формат front matter**. +Публикация конспектов версией не отмечается. + +Что считается мажорным изменением: контент, написанный по старым правилам, перестаёт корректно собираться или отображаться. + +## [3.0.0] — 2026-08-XX + +Крупный рефакторинг: несколько конспектов на один предмет, формулы и иконки переехали на этап сборки, сторонние CDN убраны из критического пути. + +### Добавлено + +- **Несколько конспектов у одного предмета.** Одна папка описывает вариант: преподаватель + автор + учебный год. Варианты связываются ключом `subject`, на главной это одна карточка с раскрывающимся списком, внутри курса — переключатель с запоминанием выбора в `localStorage`. +- **Учебный год** (`academicYear`) у курсов и лекций. Если у того же преподавателя есть запись за более свежий год, старая помечается, а на её странице появляется ссылка на новую. +- Метка происхождения конспекта (`noteType`) с моделью и источником в подсказке. +- Общие подсказки: атрибут `data-cn-tip` на любом элементе. +- Контрибьюторы в футере с аватарками и статистикой коммитов. +- Проверка Pull Request в CI: front matter по схеме из архетипов, сборка, битые ссылки, формат заголовка. +- Архетипы для новых конспектов, курсов и отдельных страниц. +- Партиал `ui/icon.html` и шорткод `{{< icon >}}` — иконки инлайном. +- Шрифты, KaTeX и иконки вендорятся скриптом `scripts/vendor-assets.sh` и хранятся в репозитории. + +### Изменено + +- **Формулы считаются на сборке** через `transform.ToMath` (KaTeX внутри Hugo) вместо MathJax на клиенте. Требуется Hugo ≥ 0.132 и блок `passthrough` в конфиге. +- **Шрифты раздаются со своего домена** вместо `fonts.googleapis.com`. +- Цвет курса задаётся единственным полем `accent` и наследуется внутрь: карточка, шапка, обложки лекций, сайдбары. Раньше выбирался случайно по хешу заголовка. +- Аватарки GitHub скачиваются и пережимаются на этапе сборки. +- Левый и правый сайдбары лекции приведены к одному виду. +- Тема переключается только системными настройками ОС; отдельная логика ручного переключения убрана. +- Поисковый индекс грузится лениво — при первом фокусе на поле, а не на загрузке страницы. +- В индексе одна запись на предмет вместо записи на каждую папку; в текст попали фамилии преподавателей, авторы и год. +- Подсветка активного пункта в оглавлении переведена на `IntersectionObserver` вместо `scroll` с debounce. +- Контекстное меню и виджет-помощник грузятся лениво. +- Единая функция русской плюрализации вместо трёх разных. +- Порядок лекций согласован между списком, сайдбаром, «предыдущая/следующая» и нумерацией на обложках. +- Обновлены и приведены к единому стилю существующие markdown-файлы конспектов. +- daisyUI обновлён до v5.7.16, ai-widget переведён на его кастомные свойства. + +### Удалено + +- **MathJax** — 260 КБ JS и до 442 КБ шрифтов с сетевого пути. +- **Alpine.js** (16 КБ) — на нём держались только шорткоды `tabs`/`tab`, они удалены вместе с ним. +- **Ionicons как веб-компонент** — 24 КБ рантайма и по одному HTTP-запросу на каждую иконку (на странице курса их 11). +- Masonry. +- Остатки темы Dream, мёртвый CSS (`list.css`, disqus, `flip-container`, `dream-alert`) и осиротевшие партиалы. + +### Исправлено + +- Устаревшие вызовы Hugo: `site.Data` → `.Data`, `site.Language.LanguageCode` → `.Language.Locale`. +- Сортировка секций по дате и весу. +- Выравнивание и отступы текста на обложках. +- Наложение аватарок в списке авторов. +- Суффикс с названием сайта на странице 404. +- Вёрстка страницы лекции не сдвигается при скрытом сайдбаре. + +### Сломано + +- Курс с несколькими преподавателями нужно разложить по отдельным папкам и проставить `subject`. Развести преподавателей внутри одной папки полем у лекции больше нельзя. +- Обложки лекций не раскрашиваются хешем от заголовка — цвет приходит от `accent` курса. +- `cover_style` больше ни на что не влияет. +- Одиночный `$` остаётся инлайн-разделителем формул, но парсер стал строгим: пара обычных долларов в одном абзаце (`цена 5$ и 10$`) покрасится в красный, нужно экранировать `\$`. +- Новая иконка требует прогона `scripts/vendor-assets.sh` — иначе на её месте пустое место и предупреждение в логе сборки. + +### Замеры + +Ушло с сетевого пути (gzip): MathJax 260 КБ + до 442 КБ шрифтов, Alpine 16 КБ, ionicons 24 КБ и запрос на иконку, два RTT до Google за шрифтами. Добавилось: KaTeX CSS 3,5 КБ, и только на страницах с формулами. + +В репозиторий добавилось 248 КБ текстовых шрифтов, 254 КБ шрифтов KaTeX и 15 КБ иконок; браузер качает из этого единицы файлов благодаря `unicode-range` и подмножествам глифов. + +Цена для сборки — около 0,085 мс на формулу: на тестовом сайте 130 мс без формул против 164 мс с четырьмястами формулами на одной странице. + +## [2.0.0] + +Полная переработка контента и оформления после первой версии: сайт отвязан от темы Dream, появились поиск, шорткоды и автогенерация сопутствующих материалов. + +### Добавлено + +- Поиск по сайту, разбиение на разделы, разделение курсов по семестрам. +- Лекции: операционные системы, базы данных, C++ (семестр 1 и 2), математическая статистика. +- Автогенерация OG-картинок, Anki-колод и контекста для ИИ (`llm-context`) в CI/CD. +- Шорткоды для разметки лекций. +- Виджет с ИИ-помощником, кастомное контекстное меню. +- Новый логотип. + +### Изменено + +- Сайт полностью отвязан от темы Dream — собственные layout'ы вместо темы. +- Несколько итераций редизайна вёрстки и мобильного вида (шапка, списки, Anki-страницы). +- CI/CD-воркфлоу переработан и оптимизирован: кеширование и tectonic. + +## [1.0.0] + +Первая версия сайта на теме Dream. + +### Добавлено + +- Hugo-сайт на теме Dream, публикация через GitHub Actions. +- Подсветка синтаксиса кода. \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c2e2c55..67720f0 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,170 +1,278 @@ # Контрибьютинг -Этот документ описывает, как внести правки в репозиторий: структуру файлов, front matter, шорткоды и процесс отправки Pull Request. Перед началом работы рекомендуется ознакомиться с [README.md](README.md). +Структура файлов, front matter, проверки и процесс Pull Request. -## Способы участия +## С чего начать -### 1. Сообщить об ошибке +| Что хотите сделать | Куда идти | +|---|---| +| Нашли ошибку, править не готовы | [Issue](https://github.com/botaemeveryday/notes/issues/new?template=content-error.md) | +| Поправить текст лекции | `content/posts/<курс>/<лекция>/index.md` → PR | +| Добавить лекцию | новая папка в существующем курсе | +| Добавить курс | новая папка в `content/posts/` с `_index.md` | +| Свои конспекты по курсу, который уже есть | отдельная папка + общий `subject`, см. [ниже](#несколько-конспектов-по-одному-предмету) | -Если вы заметили проблему, но не готовы исправлять её самостоятельно — откройте [Issue](https://github.com/botaemeveryday/notes/issues/new?template=content-error.md). Подходящие поводы: +Последний случай — самый частый и самый важный. **Не смешивайте записи разных преподавателей, авторов или годов в одной папке.** Одна папка — один вариант конспекта. -- Ошибка в тексте, формуле или коде. -- Битое изображение или проблема с рендерингом. -- Неточность в объяснении или фактическая ошибка. -- Предложение по улучшению структуры или подачи материала. +## Локальная сборка -### 2. Исправить или дополнить существующий конспект +Требования: Hugo **extended ≥ 0.132** (формулы считаются на сборке, раньше не заработает), Node.js, npm, Python 3.11+, Git. -1. Найдите нужную лекцию в `content/posts/<курс>/<лекция>/index.md`. -2. Внесите правки, соблюдая правила оформления (см. ниже). -3. Проверьте результат локально (`hugo server -D`). -4. Отправьте Pull Request. +```bash +git clone https://github.com/botaemeveryday/notes.git +cd notes -### 3. Добавить новую лекцию +npm install # Tailwind и зависимости +npm run build # сборка стилей +hugo server -D # http://localhost:1313 +``` + +Шрифты, KaTeX и иконки лежат в репозитории — качать ничего не нужно. + +`npm run build` перезапускайте после появления новых Tailwind-классов, иначе они не попадут в CSS. **Если правку видно в разметке, но не видно на странице — начинайте отсюда.** + +Перед отправкой PR: ```bash -mkdir -p content/posts/<курс>/<идентификатор-лекции>/images -touch content/posts/<курс>/<идентификатор-лекции>/index.md +pip install pyyaml +python scripts/check-content.py # то же, что проверит CI +python scripts/check-content.py --strict # ещё и предупреждения ``` -Минимальный `index.md`: +## Именование + +| Объект | Соглашение | Примеры | +|---|---|---| +| Папка курса | `kebab-case` | `databases`, `operation-systems` | +| Папка варианта | `<предмет>-<фамилия>` | `java-makarevich`, `java-butenko` | +| Папка варианта с автором | `<предмет>-<фамилия>-<автор>` | `java-makarevich-notakeith` | +| Папка лекции | `kebab-case` | `lecture-01` | +| Изображения | осмысленное имя | `cover.png`, `process-tree.png` | + +Внутри одного курса держитесь единого стиля нумерации лекций — либо `lecture-01`, либо тематического `allocator-02-26`. Не смешивайте. + +``` +content/posts/<курс>/<лекция>/ +├── index.md +└── images/ + └── process-tree.png +``` + +## Front matter лекции ```yaml --- title: "Название лекции" -description: "Краткое описание содержания" +description: "Короткое описание, 1–2 предложения" date: 2026-05-07 +weight: 3 # номер лекции tags: - - C++ - - 2 семестр + - Базы данных + - 4 семестр + +authors: [] # если автор лекции отличается от автора курса +noteType: human # human | ai | ai-pro +aiModel: "" +aiSource: "" --- ``` -### 4. Добавить новый курс +Обязателен `title` и **либо** `date`, **либо** `weight` — иначе проверка PR не пройдёт. -1. Создайте директорию `content/posts/<курс>/`. -2. Положите в неё `_index.md` с описанием курса (см. соседние курсы как образец). -3. Добавьте `cover.png` для секции. -4. Создавайте лекции по схеме выше. +`weight` задаёт номер лекции на обложке. Без него номер считается по позиции в списке: для сплошного курса это нормально, но ломается, когда лекции добавляют не по порядку. -## Локальная сборка +`draft: true` скрывает страницу. В PR его лучше не оставлять. -Требования: Hugo (extended), Node.js, npm, Git. +### Метка происхождения -```bash -git clone https://github.com/botaemeveryday/notes.git -cd notes +| `noteType` | Метка | Когда ставить | +|---|---|---| +| `human` | Авторский (зелёная) | Написан человеком. Если ИИ помогал с оформлением — метка та же, но заполните `aiModel`, это честнее | +| `ai` | Нейроконспект (янтарная) | Сгенерирован моделью по аудио или презентации | +| `ai-pro` | Нейроконспект (фиолетовая) | То же, но моделью повышенной точности | -npm install # установка Tailwind и зависимостей -npm run build # сборка стилей -hugo server -D # http://localhost:1313 -``` +Для `ai` и `ai-pro` заполняйте `aiModel` и `aiSource` — иначе читатель не поймёт, чему доверяет. Оба попадают в подсказку при наведении на метку. + +`noteType` наследуется: если у лекции его нет, берётся из `_index.md` курса. + +## Front matter курса (`_index.md`) -`npm run build` нужно перезапускать после добавления новых Tailwind-классов, которых ещё не было в проекте — иначе классы не попадут в итоговый CSS. +```yaml +--- +title: "Базы данных" +description: "Реляционная модель, нормализация, индексы, транзакции." +semester: 4 +accent: 3 # 1..6 — цвет курса +weight: 10 # порядок в списке и порядок вариантов + +teacher: "Мацнев Николай Игоревич" +author: "notakeith" # или authors: [...] +academicYear: 2025 # → «2025/26» + +subject: "databases" # только если вариантов несколько +noteType: human # метка по умолчанию для всех лекций курса +abbr: "" # аббревиатура на карточке, иначе по инициалам +tag: "" # маленькая плашка на карточке +--- +``` -## Правила оформления +`accent` — **единственный источник цвета**. Он красит карточку на главной, шапку курса, обложки всех лекций и сайдбары. Точечно переопределить можно у лекции через `cover_color` и `cover_color_soft`, но без нужды не стоит. -### Именование +`author` понимает и ник GitHub (`notakeith` → аватарка и ссылка подтянутся сами), и обычное имя, и список: -| Объект | Соглашение | Примеры | -|---|---|---| -| Папка курса | `kebab-case` | `database-design`, `operation-systems` | -| Папка лекции | `kebab-case` | `lecture-01` | -| Изображения | произвольное имя, желательно осмысленное | `cover.png`, `process-tree.png` | +```yaml +authors: + - notakeith + - name: "Пётр Петров" + github: "petrov" +``` -В рамках одного курса придерживайтесь единого стиля именования лекций — либо нумерованного (`lecture_01`, `lecture_02`), либо тематического (`allocator-02-26`, `casts-04-02`). Не смешивайте. +## Несколько конспектов по одному предмету -### Структура папки лекции +Одна папка — один вариант. Вариант определяется тремя вещами: **преподаватель, автор конспекта, учебный год**. Варианты склеиваются общим ключом `subject`: ``` -content/posts/<курс>/<лекция>/ -├── index.md # текст лекции -└── images/ - ├── cover.png # обложка (обязательно) - └── ... # остальные изображения +content/posts/java-makarevich-notakeith/_index.md + title: Java subject: java teacher: Макаревич Р. Д. author: notakeith academicYear: 2025 weight: 10 + +content/posts/java-makarevich-petrov/_index.md + title: Java subject: java teacher: Макаревич Р. Д. author: Петров К. academicYear: 2025 weight: 20 + +content/posts/java-butenko-notakeith/_index.md + title: Java subject: java teacher: Бутенко А. В. author: notakeith academicYear: 2024 weight: 30 ``` -### Front matter +На главной это **одна** карточка «Java». Она раскрывается списком вариантов: преподаватель, метка происхождения, автор, число лекций, учебный год. Внутри курса кнопка открывает выбор, выбор запоминается в браузере — следующий клик по предмету на главной откроет его же. + +Требования: + +- у всех вариантов одного `subject` совпадают `title`, `accent`, `semester`; +- у каждого варианта заполнены `teacher` и `author`; +- `weight` задаёт порядок вариантов. Без него порядок определяется фамилией и годом — предсказуемо, но не факт что так, как вам хочется. -Обязательные поля: +Заголовок предмета берётся из варианта с наименьшим `weight`. Если папки называются по-разному, а показать надо одно название — поставьте `subjectTitle` любому из вариантов. + +### Учебный год ```yaml ---- -title: "Название лекции" -description: "Короткое описание (1–2 предложения)" -date: 2026-05-07 -tags: - - 0 Семестр - - Название курса ---- +academicYear: 2025 # → 2025/26 +academicYear: "2025/26" # так тоже можно ``` -`draft: true` скрывает страницу из публикации — используется для незавершённых материалов. +Год виден плашкой рядом с преподавателем. Если у **того же самого** преподавателя есть конспект за более свежий год, старый помечается приглушённой плашкой, а на его странице появляется баннер со ссылкой на новый. Сравнение идёт строго внутри преподавателя — разные лекторы с разными годами друг друга не «устаревают». -### Изображения +Год необязателен, но без него эта механика не работает. -- Поддерживаемые форматы: PNG, JPG, SVG, WebP. -- Хранятся в `images/` внутри папки лекции. -- Рекомендуется сжимать растровые изображения (например, через [squoosh.app](https://squoosh.app) или `oxipng`). -- Файл `cover.png` обязателен для каждой лекции. +## Формулы -### Формулы и код +Синтаксис LaTeX, считаются **на сборке** через KaTeX. На клиенте JS для формул больше не грузится. -- Математика — через MathJax, синтаксис LaTeX: `$inline$` и `$$display$$`. -- Блоки кода — с указанием языка для подсветки: ` ```cpp `, ` ```python ` и т. д. -- Mermaid-диаграммы — через стандартный блок ` ```mermaid `. +``` +$inline$ \(inline\) +$$display$$ \[display\] +``` -### Шорткоды +Блок ` ```math ` — то же самое display-формулой. -В проекте определены готовые шорткоды (`layouts/shortcodes/`), используйте их вместо ручной HTML-разметки: +**Ловушка с долларом.** Одиночный `$` — инлайновый разделитель, поэтому пара обычных долларов в одном абзаце превратится в формулу и покрасится в красный: + +``` +цена 5$ и 10$ ← сломается +цена 5\$ и 10\$ ← правильно +``` + +Ошибка в формуле не роняет сборку — KaTeX красит её красным прямо на странице. Проверяйте локально. + +## Код, изображения, диаграммы + +- Блоки кода — обязательно с языком: ` ```cpp `, ` ```python `. +- Диаграммы — ` ```mermaid `. +- Изображения: PNG, JPG, SVG, WebP, лежат в `images/` внутри папки лекции. Растр сжимайте — [squoosh.app](https://squoosh.app) или `oxipng`. + +## Иконки + +Иконки вставляются в разметку на сборке, никакого JS. В тексте лекции: + +``` +{{< icon "download-outline" >}} +{{< icon name="warning-outline" class="text-warning" >}} +``` + +Имена — из [ionicons](https://ionic.io/ionicons). **Если нужной иконки ещё нет в `assets/icons/`**, сборка выведет предупреждение, а на её месте будет пусто. Добавить: + +```bash +./scripts/vendor-assets.sh +``` + +Скрипт сам находит имена в шаблонах и контенте. Если имя вычисляется в шаблоне или приходит из front matter — впишите его в массив `EXTRA` внутри скрипта, грепом такое не находится. + +## Шорткоды + +Готовые шорткоды из `layouts/shortcodes/` вместо ручного HTML: | Шорткод | Назначение | |---|---| | `callout` | Выделенный блок (note, warning, tip) | | `card`, `cards` | Карточки для навигации | | `compare` | Сравнение двух вариантов бок о бок | -| `spoiler` | Скрытый блок с решением/ответом | -| `key` | Отображение клавиатурной комбинации | +| `spoiler` | Скрытый блок с решением | +| `key` | Клавиатурная комбинация | +| `marker`, `hand` | Выделение маркером, «рукописная» вставка | +| `math-box` | Теорема, определение, доказательство | +| `step`, `timeline` | Пошаговые и хронологические списки | | `stat`, `stat-row` | Числовая статистика | -| `youtube` | Встраивание видео | -| `anki-download` | Ссылка на колоду Anki | +| `terminal`, `filetree` | Вывод консоли, дерево файлов | +| `trap`, `note`, `disclaimer` | Предупреждения и примечания | +| `icon` | Иконка | +| `godbolt`, `youtube`, `anki-download` | Встраивания | ## Pull Request -1. Сделайте форк репозитория. -2. Создайте ветку с осмысленным именем: `git checkout -b fix/cpp-exceptions`. -3. Внесите изменения и проверьте их локально. -4. Откройте Pull Request в `main`. - -### Формат коммитов и заголовка PR +```bash +git checkout -b fix/cpp-exceptions +# правки, проверка локально +``` -Проект придерживается [Conventional Commits](https://www.conventionalcommits.org/ru/v1.0.0/). Заголовок имеет вид: +Заголовок PR — [Conventional Commits](https://www.conventionalcommits.org/ru/v1.0.0/): ``` -(): <описание> +(): описание ``` -**Типы (`type`):** - -| Тип | Когда использовать | +| Тип | Когда | |---|---| | `feat` | Новая лекция, курс или функциональность сайта | | `fix` | Исправление ошибки, опечатки, битой ссылки | -| `docs` | Изменения в README, CONTRIBUTING и прочей документации | -| `style` | Правки оформления, не меняющие смысл (отступы, форматирование) | -| `refactor` | Реорганизация контента или кода без изменения смысла | +| `docs` | README, CONTRIBUTING и прочая документация | +| `style` | Оформление без изменения смысла | +| `refactor` | Реорганизация без изменения смысла | | `chore` | Зависимости, конфиги, CI, скрипты | +| `perf` | Оптимизации | -**Scope** — короткое указание на область изменения: имя курса (`cpp`, `databases`, `os`) или компонент сайта (`layouts`, `shortcodes`, `ci`). Можно опустить, если правка глобальная. - -**Примеры:** +**Scope** — курс (`cpp`, `databases`, `java`) или компонент сайта (`layouts`, `shortcodes`, `ci`). Можно опустить. ``` -feat(cpp): лекция про concepts -fix(os): опечатка в lecture_03 -docs: уточнить требования к cover.png -refactor(databases): единое именование лекций -chore: обновить hugo до 0.130 +feat(cpp): add lecture concepts +fix(os): typo in lecture-03 +chore: update hugo to 0.148 ``` -В описании PR коротко укажите, что изменилось и зачем. Если правка затрагивает несколько лекций — перечислите их. \ No newline at end of file +Ломающие изменения помечайте `!`: `refactor(layouts)!: split teachers into separate folders`. + +### Что проверит CI + +| Проверка | Блокирует | +|---|---| +| `scripts/check-content.py` — front matter и структура | да | +| `npm run build` + `hugo --gc --minify --printPathWarnings` | да | +| Внутренние ссылки и якоря | да | +| Внешние ссылки | нет, только отчёт | +| Заголовок PR по Conventional Commits | да | + +Собранный сайт кладётся в артефакты прогона — можно скачать и посмотреть, не поднимая Hugo локально. + +## Авторство + +Контрибьюторы собираются автоматически из истории git и показываются в футере. Отдельно вписывать себя никуда не нужно — достаточно коммита от вашего аккаунта. + +Если вы автор или соавтор конспекта (крупные правки или обновление от 30% текста) — добавьте себя в `authors` во front matter лекции. \ No newline at end of file diff --git a/README.md b/README.md index 2cc1740..3290f9e 100644 --- a/README.md +++ b/README.md @@ -30,19 +30,26 @@ - [Let's Build A Simple Interpreter](https://botaemeveryday.github.io/notes/posts/interpreter/) — перевод серии статей Руслана Спивака по построению интерпретатора. -## Как принять участие +## Один предмет — несколько конспектов + +У предмета может быть несколько версий конспектов: разные преподаватели, разные авторы у одного преподавателя, разные учебные годы. Каждая версия живёт в своей папке, а на сайте они объединяются в одну карточку с выбором. Выбор запоминается — при следующем заходе предмет откроется на нём же. + +У каждой версии видно, кто вёл, кто записывал, за какой год и написан конспект человеком или сгенерирован моделью. Если у того же преподавателя есть запись за более свежий год, старая помечается, а на её странице появляется ссылка на новую. -Проект открыт для правок и дополнений. Pull request'ы приветствуются в любом объёме — от исправления опечатки до публикации собственных конспектов по новому курсу. +Поэтому **не нужно спрашивать разрешения, если по предмету уже есть конспект** — заводите свою папку рядом. + +## Как принять участие -Сценарии участия: +Проект открыт для правок. Pull request'ы приветствуются в любом объёме — от опечатки до собственного курса. -- **Опечатка или неточность** — откройте issue или сразу PR с правкой. -- **Дополнение существующего конспекта** — отредактируйте соответствующий `index.md` в `content/posts/<курс>/<лекция>/`. -- **Новая лекция в рамках существующего курса** — добавьте директорию по образцу соседних лекций. -- **Новый курс** — создайте директорию в `content/posts/` с файлом `_index.md` и лекциями внутри. Перед публикацией ознакомьтесь с правилами оформления. +- **Опечатка или неточность** — issue или сразу PR. +- **Дополнение конспекта** — правьте `content/posts/<курс>/<лекция>/index.md`. +- **Новая лекция** — добавьте директорию по образцу соседних. +- **Новый курс** — создайте директорию в `content/posts/` с `_index.md`. +- **Свои конспекты по курсу, который уже есть** — отдельная папка, связывается через `subject`. -Все требования к структуре файлов, front matter и шорткодам описаны в **[CONTRIBUTING.md](CONTRIBUTING.md)**. +Требования к структуре, front matter и шорткодам — в **[CONTRIBUTING.md](CONTRIBUTING.md)**. Каждый PR прогоняется через проверку front matter, сборку сайта и поиск битых ссылок; собранный сайт можно скачать из артефактов прогона. ## Лицензия -Распространяется под лицензией MIT. См. [LICENSE.md](LICENSE.md). +Код — MIT, см. [LICENSE.md](LICENSE.md). Тексты конспектов принадлежат их авторам. \ No newline at end of file diff --git a/archetypes/about.md b/archetypes/about.md deleted file mode 100644 index df289b5..0000000 --- a/archetypes/about.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: {{ replace .TranslationBaseName "-" " " | title }} -date: {{ .Date }} -draft: true ---- diff --git a/archetypes/course.md b/archetypes/course.md new file mode 100644 index 0000000..104a4e7 --- /dev/null +++ b/archetypes/course.md @@ -0,0 +1,47 @@ +--- +# Курс. Создаётся так: +# hugo new content posts/<курс>/_index.md --kind course +# +# Комментарии в конце строк — не декорация: по ним scripts/check-content.py +# понимает, что обязательно, что перечисление, а что число. Правишь схему — +# правь здесь, проверка подхватит сама. +# +# Одна папка = один ВАРИАНТ конспекта: преподаватель + автор + учебный год. +# Если по предмету уже есть чужой конспект — не смешивайте, заведите свою +# папку и поставьте одинаковый subject. На главной они склеятся в одну +# карточку с выбором. + +title: "{{ replace .File.ContentBaseName `-` ` ` | title }}" # required +description: "" + +semester: 0 # int +accent: 1 # recommended int: 1..6 +weight: 0 # порядок в списке и порядок вариантов внутри + # предмета; при нескольких вариантах обязателен + +# Кто вёл и кто записывал. +teacher: "" # recommended-with: semester +author: "" # recommended ник GitHub → аватарка и ссылка сами + # можно списком: authors: [notakeith, {name: ..., github: ...}] + +academicYear: # recommended 2025 → «2025/26»; можно "2025/26" + # без него не работает пометка устаревших конспектов + +# Ключ предмета. Заполняется, только если вариантов несколько. +# У всех вариантов должны совпадать title, accent и semester. +subject: "" +subjectTitle: "" # если папки называются по-разному, а на карточке + # нужно одно название — задайте любому варианту + +# Метка по умолчанию для всех лекций курса. +noteType: human # enum: human, ai, ai-pro +aiModel: "" +aiSource: "" + +abbr: "" # аббревиатура на карточке, иначе по инициалам +tag: "" # маленькая плашка на карточке + +# ВНИМАНИЕ: draft у _index.md скрывает ВЕСЬ курс со всеми лекциями разом, +# даже если сами лекции не черновики. Убирайте перед PR. +draft: true +--- \ No newline at end of file diff --git a/archetypes/default.md b/archetypes/default.md index 25b6752..dc50042 100644 --- a/archetypes/default.md +++ b/archetypes/default.md @@ -1,5 +1,41 @@ -+++ -date = '{{ .Date }}' -draft = true -title = '{{ replace .File.ContentBaseName "-" " " | title }}' -+++ +--- +# Лекция. Создаётся так: +# hugo new content posts/<курс>/<лекция>/index.md +# +# Комментарии в конце строк — не декорация: по ним scripts/check-content.py +# понимает, что обязательно, что перечисление, а что число. Правишь схему — +# правь здесь, проверка подхватит сама. + +title: "{{ replace .File.ContentBaseName `-` ` ` | title }}" # required +date: {{ .Date }} # required-any: порядок лекции +weight: 0 # required-any: порядок лекции + +description: "" # 1–2 предложения, попадает в карточку и в поиск +tags: [] + +# Авторы конкретной лекции. Каждый — name, при желании avatar и link; +# строка считается ником GitHub. Если не указать, берётся автор курса. +authors: [] + +academicYear: # только если эта лекция из другого года, + # чем остальной курс; обычно не нужно + +# Происхождение конспекта. Метка видна на карточке, модель и источник — +# в подсказке при наведении. Если не указать, берётся из _index.md курса. +noteType: human # enum: human, ai, ai-pro +aiModel: "" # чем сгенерировано; для human — чем помогали +aiSource: "" # аудиозапись, презентация, методичка + +# Обложка. Цвет наследуется от accent курса — переопределяйте только если +# этой лекции нужен свой. +cover_color: "" +cover_color_soft: "" + +# Что спрятать на странице. +hideTOC: false +hideLeftSidebar: false +hideBreadcrumbs: false +hidePrevNext: false + +draft: true +--- \ No newline at end of file diff --git a/archetypes/page.md b/archetypes/page.md new file mode 100644 index 0000000..63b0343 --- /dev/null +++ b/archetypes/page.md @@ -0,0 +1,32 @@ +--- +# Отдельная страница вне курсов (шпаргалки, колоды Anki, служебное). +# hugo new content posts/public/<имя>.md --kind page +# +# _index.md для таких папок не нужен: они не курсы и на главной как +# предмет не показываются. + +title: "{{ replace .File.ContentBaseName `-` ` ` | title }}" # required +date: {{ .Date }} +description: "" +tags: [] + +authors: [] # name, avatar, link; строка = ник GitHub + +pinned: false # закрепить на главной +pinned_text: "" # подпись под названием в закреплённом +href: "" # внешняя ссылка вместо самой страницы + +# Имя иконки ionicons. Оно подставляется в шаблон динамически, поэтому +# scripts/vendor-assets.sh его грепом НЕ найдёт — впишите имя в массив +# EXTRA внутри скрипта и прогоните его, иначе на месте иконки будет +# пусто, а в логе сборки — предупреждение. +icon: "" + +# Что спрятать. +hideTOC: false +hideLeftSidebar: false +hidePrevNext: false +hideBreadcrumbs: false + +draft: true +--- \ No newline at end of file diff --git a/archetypes/posts.md b/archetypes/posts.md deleted file mode 100644 index 9a7ba7e..0000000 --- a/archetypes/posts.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: {{ replace .File.ContentBaseName "-" " " | title }} -description: Desc -date: {{ .Date }} -tags: - - tag1 -authors: - - name: notakeith - avatar: https://avatars.githubusercontent.com/u/108391756?v=4 - link: https://github.com/notakeith - - name: salt-caramel - avatar: https://avatars.githubusercontent.com/u/180561221?v=4 - link: https://github.com/salt-caramel -# draft: true ---- - -Cut out summary from your post content here. - - - -The remaining content of your post. diff --git a/assets/icons/alert-circle-outline.svg b/assets/icons/alert-circle-outline.svg new file mode 100644 index 0000000..5a309fd --- /dev/null +++ b/assets/icons/alert-circle-outline.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/alert-circle.svg b/assets/icons/alert-circle.svg new file mode 100644 index 0000000..2ca5d4d --- /dev/null +++ b/assets/icons/alert-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/arrow-back-outline.svg b/assets/icons/arrow-back-outline.svg new file mode 100644 index 0000000..3ec3044 --- /dev/null +++ b/assets/icons/arrow-back-outline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/arrow-back.svg b/assets/icons/arrow-back.svg new file mode 100644 index 0000000..3ec3044 --- /dev/null +++ b/assets/icons/arrow-back.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/arrow-forward-outline.svg b/assets/icons/arrow-forward-outline.svg new file mode 100644 index 0000000..7d4896d --- /dev/null +++ b/assets/icons/arrow-forward-outline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/arrow-forward.svg b/assets/icons/arrow-forward.svg new file mode 100644 index 0000000..7d4896d --- /dev/null +++ b/assets/icons/arrow-forward.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/arrow-up-outline.svg b/assets/icons/arrow-up-outline.svg new file mode 100644 index 0000000..98473f4 --- /dev/null +++ b/assets/icons/arrow-up-outline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/book-outline.svg b/assets/icons/book-outline.svg new file mode 100644 index 0000000..2e2758e --- /dev/null +++ b/assets/icons/book-outline.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/bulb-outline.svg b/assets/icons/bulb-outline.svg new file mode 100644 index 0000000..1514d03 --- /dev/null +++ b/assets/icons/bulb-outline.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/bulb.svg b/assets/icons/bulb.svg new file mode 100644 index 0000000..b904a5d --- /dev/null +++ b/assets/icons/bulb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/calendar-outline.svg b/assets/icons/calendar-outline.svg new file mode 100644 index 0000000..ae8233a --- /dev/null +++ b/assets/icons/calendar-outline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/chatbubble-ellipses-outline.svg b/assets/icons/chatbubble-ellipses-outline.svg new file mode 100644 index 0000000..08599b7 --- /dev/null +++ b/assets/icons/chatbubble-ellipses-outline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/checkmark-circle-outline.svg b/assets/icons/checkmark-circle-outline.svg new file mode 100644 index 0000000..6fa7683 --- /dev/null +++ b/assets/icons/checkmark-circle-outline.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/checkmark-circle.svg b/assets/icons/checkmark-circle.svg new file mode 100644 index 0000000..f3f99e1 --- /dev/null +++ b/assets/icons/checkmark-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/checkmark-outline.svg b/assets/icons/checkmark-outline.svg new file mode 100644 index 0000000..cc0dddb --- /dev/null +++ b/assets/icons/checkmark-outline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/chevron-down-outline.svg b/assets/icons/chevron-down-outline.svg new file mode 100644 index 0000000..94f41e4 --- /dev/null +++ b/assets/icons/chevron-down-outline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/chevron-down.svg b/assets/icons/chevron-down.svg new file mode 100644 index 0000000..54890f4 --- /dev/null +++ b/assets/icons/chevron-down.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/chevron-forward.svg b/assets/icons/chevron-forward.svg new file mode 100644 index 0000000..133bb91 --- /dev/null +++ b/assets/icons/chevron-forward.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/close-circle-outline.svg b/assets/icons/close-circle-outline.svg new file mode 100644 index 0000000..e709288 --- /dev/null +++ b/assets/icons/close-circle-outline.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/close-circle.svg b/assets/icons/close-circle.svg new file mode 100644 index 0000000..8a49acb --- /dev/null +++ b/assets/icons/close-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/close.svg b/assets/icons/close.svg new file mode 100644 index 0000000..09a0a1b --- /dev/null +++ b/assets/icons/close.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/cloud-download-outline.svg b/assets/icons/cloud-download-outline.svg new file mode 100644 index 0000000..833f613 --- /dev/null +++ b/assets/icons/cloud-download-outline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/code-slash-outline.svg b/assets/icons/code-slash-outline.svg new file mode 100644 index 0000000..fecc242 --- /dev/null +++ b/assets/icons/code-slash-outline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/code-slash.svg b/assets/icons/code-slash.svg new file mode 100644 index 0000000..de9a6e0 --- /dev/null +++ b/assets/icons/code-slash.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/copy-outline.svg b/assets/icons/copy-outline.svg new file mode 100644 index 0000000..38e736e --- /dev/null +++ b/assets/icons/copy-outline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/copy.svg b/assets/icons/copy.svg new file mode 100644 index 0000000..eebe020 --- /dev/null +++ b/assets/icons/copy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/create-outline.svg b/assets/icons/create-outline.svg new file mode 100644 index 0000000..0415d45 --- /dev/null +++ b/assets/icons/create-outline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/document-text-outline.svg b/assets/icons/document-text-outline.svg new file mode 100644 index 0000000..022f24f --- /dev/null +++ b/assets/icons/document-text-outline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/document-text.svg b/assets/icons/document-text.svg new file mode 100644 index 0000000..ccaa461 --- /dev/null +++ b/assets/icons/document-text.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/flame.svg b/assets/icons/flame.svg new file mode 100644 index 0000000..50ca464 --- /dev/null +++ b/assets/icons/flame.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/folder-open-outline.svg b/assets/icons/folder-open-outline.svg new file mode 100644 index 0000000..99c5f1c --- /dev/null +++ b/assets/icons/folder-open-outline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/folder-open.svg b/assets/icons/folder-open.svg new file mode 100644 index 0000000..e9b82ad --- /dev/null +++ b/assets/icons/folder-open.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/help-circle-outline.svg b/assets/icons/help-circle-outline.svg new file mode 100644 index 0000000..bb525c2 --- /dev/null +++ b/assets/icons/help-circle-outline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/help-outline.svg b/assets/icons/help-outline.svg new file mode 100644 index 0000000..1bf654f --- /dev/null +++ b/assets/icons/help-outline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/home-outline.svg b/assets/icons/home-outline.svg new file mode 100644 index 0000000..fc8c5ba --- /dev/null +++ b/assets/icons/home-outline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/information-circle-outline.svg b/assets/icons/information-circle-outline.svg new file mode 100644 index 0000000..6a32936 --- /dev/null +++ b/assets/icons/information-circle-outline.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/information-circle.svg b/assets/icons/information-circle.svg new file mode 100644 index 0000000..b02bb0c --- /dev/null +++ b/assets/icons/information-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/leaf.svg b/assets/icons/leaf.svg new file mode 100644 index 0000000..b0231f4 --- /dev/null +++ b/assets/icons/leaf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/library.svg b/assets/icons/library.svg new file mode 100644 index 0000000..17a71e6 --- /dev/null +++ b/assets/icons/library.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/link-outline.svg b/assets/icons/link-outline.svg new file mode 100644 index 0000000..f0e7ba1 --- /dev/null +++ b/assets/icons/link-outline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/people-outline.svg b/assets/icons/people-outline.svg new file mode 100644 index 0000000..7b39991 --- /dev/null +++ b/assets/icons/people-outline.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/person-outline.svg b/assets/icons/person-outline.svg new file mode 100644 index 0000000..1204de0 --- /dev/null +++ b/assets/icons/person-outline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/search-outline.svg b/assets/icons/search-outline.svg new file mode 100644 index 0000000..4709381 --- /dev/null +++ b/assets/icons/search-outline.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/share-social-outline.svg b/assets/icons/share-social-outline.svg new file mode 100644 index 0000000..03cbc7b --- /dev/null +++ b/assets/icons/share-social-outline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/shield-checkmark-outline.svg b/assets/icons/shield-checkmark-outline.svg new file mode 100644 index 0000000..5561456 --- /dev/null +++ b/assets/icons/shield-checkmark-outline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skull.svg b/assets/icons/skull.svg new file mode 100644 index 0000000..4976b63 --- /dev/null +++ b/assets/icons/skull.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/sparkles-outline.svg b/assets/icons/sparkles-outline.svg new file mode 100644 index 0000000..792ed82 --- /dev/null +++ b/assets/icons/sparkles-outline.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/sparkles.svg b/assets/icons/sparkles.svg new file mode 100644 index 0000000..70f37b3 --- /dev/null +++ b/assets/icons/sparkles.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/warning.svg b/assets/icons/warning.svg new file mode 100644 index 0000000..af16039 --- /dev/null +++ b/assets/icons/warning.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/js/code-copy.js b/assets/js/code-copy.js deleted file mode 100644 index 79af6ea..0000000 --- a/assets/js/code-copy.js +++ /dev/null @@ -1,39 +0,0 @@ -document.addEventListener("DOMContentLoaded", () => { - const highlightBlocks = document.querySelectorAll(".highlight"); - - highlightBlocks.forEach((block) => { - block.style.position = "relative"; - - const button = document.createElement("button"); - button.className = "copy-code-btn absolute top-3 right-3 p-2 rounded-lg bg-base-content/10 text-base-content/50 hover:bg-base-content/20 hover:text-base-content transition-all opacity-0 group-hover:opacity-100 backdrop-blur-sm"; - button.setAttribute("aria-label", "Копировать код"); - button.setAttribute("title", "Копировать"); - - const iconCopy = ``; - const iconCheck = ``; - - button.innerHTML = iconCopy; - - block.classList.add("group"); - block.appendChild(button); - - button.addEventListener("click", async () => { - const codeElement = block.querySelector("code"); - let textToCopy = codeElement.innerText; - - try { - await navigator.clipboard.writeText(textToCopy); - - button.innerHTML = iconCheck; - button.classList.add("bg-green-500/20", "text-green-500"); - - setTimeout(() => { - button.innerHTML = iconCopy; - button.classList.remove("bg-green-500/20", "text-green-500"); - }, 2000); - } catch (err) { - console.error("Ошибка копирования: ", err); - } - }); - }); -}); \ No newline at end of file diff --git a/assets/js/grid.js b/assets/js/grid.js deleted file mode 100644 index db921d1..0000000 --- a/assets/js/grid.js +++ /dev/null @@ -1,18 +0,0 @@ -function initGrid() { - document.querySelectorAll('.dream-grid').forEach((grid) => { - const msnry = new Masonry(grid, { - itemSelector: '.dream-column' - }); - - if (grid.classList.contains('dream-grid-about')) { - window.aboutMasonry = msnry; - } - - imagesLoaded(grid, () => { - grid.style.opacity = 1; - msnry.layout(); - }); - }); -} - -initGrid(); \ No newline at end of file diff --git a/assets/js/main.js b/assets/js/main.js deleted file mode 100644 index ae65be8..0000000 --- a/assets/js/main.js +++ /dev/null @@ -1,56 +0,0 @@ -document.addEventListener('alpine:init', () => { - Alpine.store('darkMode', { - init() { - const isDark = window.localStorage.getItem('hugo-theme-dream-is-dark'); - if (isDark) { - this.on = isDark; - } else { - this.mql.addEventListener('change', (e) => { - this.on = e.matches ? 'y' : 'n'; - }); - this.on = 'auto'; - } - setTimeout(() => this.setThemeForUtterances(), 6000); - }, - mql: window.matchMedia('(prefers-color-scheme: dark)'), - on: 'n', - - isDark() { - return this.on === 'auto' ? this.mql.matches : this.on === 'y'; - }, - - class() { - return this.isDark() ? 'dark' : 'light'; - }, - - theme() { - return this.isDark() ? window.darkTheme : window.lightTheme; - }, - - iconMap: { n: 'sunny', y: 'moon', auto: 'desktop' }, - - icon() { - return this.iconMap[this.on]; - }, - - toggle(status) { - this.on = status; - if (status === 'auto') { - window.localStorage.removeItem('hugo-theme-dream-is-dark'); - } else { - window.localStorage.setItem('hugo-theme-dream-is-dark', status); - } - this.setThemeForUtterances(); - }, - - setThemeForUtterances() { - const utterances = document.querySelector('iframe.utterances-frame'); - if (utterances) { - utterances.contentWindow.postMessage({ - type: 'set-theme', - theme: this.isDark() ? 'github-dark' : 'github-light' - }, 'https://utteranc.es'); - } - } - }); -}); \ No newline at end of file diff --git a/assets/js/post.js b/assets/js/post.js new file mode 100644 index 0000000..c91521e --- /dev/null +++ b/assets/js/post.js @@ -0,0 +1,65 @@ +(function () { + 'use strict'; + + function init() { + var toc = document.getElementById('TableOfContents'); + if (!toc) return; + + var wrapper = toc.closest('[data-toc]'); + if (!wrapper || getComputedStyle(wrapper).display === 'none') return; + + var activeClasses = (wrapper.dataset.activeClass || '').split(/\s+/).filter(Boolean); + + var links = Array.prototype.slice.call(toc.querySelectorAll('a[href^="#"]')); + var pairs = []; + + links.forEach(function (link) { + var id = decodeURIComponent(link.getAttribute('href').slice(1)); + var heading = id && document.getElementById(id); + if (heading) pairs.push({ link: link, heading: heading }); + }); + if (!pairs.length) return; + + var current = null; + function setActive(index) { + if (index === current || !pairs[index]) return; + if (current !== null) { + activeClasses.forEach(function (c) { pairs[current].link.classList.remove(c); }); + } + activeClasses.forEach(function (c) { pairs[index].link.classList.add(c); }); + current = index; + } + + var visible = new Set(); + + var observer = new IntersectionObserver(function (entries) { + entries.forEach(function (entry) { + var i = pairs.findIndex(function (p) { return p.heading === entry.target; }); + if (i < 0) return; + if (entry.isIntersecting) visible.add(i); else visible.delete(i); + }); + + if (visible.size) { + setActive(Math.min.apply(null, Array.from(visible))); + return; + } + + var last = 0; + for (var i = 0; i < pairs.length; i++) { + if (pairs[i].heading.getBoundingClientRect().top < 100) last = i; + } + setActive(last); + }, { + rootMargin: '-100px 0px -70% 0px', + threshold: 0 + }); + + pairs.forEach(function (p) { observer.observe(p.heading); }); + } + + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', init, { once: true }); + } else { + init(); + } +})(); diff --git a/assets/js/search.js b/assets/js/search.js new file mode 100644 index 0000000..1955140 --- /dev/null +++ b/assets/js/search.js @@ -0,0 +1,195 @@ +/* + * Поиск по конспектам (только главная). + * + * Главное изменение: index.json больше НЕ качается при загрузке страницы. + * Он подгружается лениво — при первом фокусе/наборе или если в URL есть ?q=. + * Для большинства посетителей это минус весь вес индекса на первом экране. + */ +(function () { + 'use strict'; + + var input, resultsBar, countEl, normalView, searchView, grid, noResults, template; + var index = null; + var loading = null; + var timer = null; + var highlightClass = 'bg-primary/20 text-primary font-bold rounded px-1'; + + function loadIndex() { + if (loading) return loading; + loading = fetch(input.dataset.index) + .then(function (r) { + if (!r.ok) throw new Error('HTTP ' + r.status); + return r.json(); + }) + .then(function (data) { + index = data; + index.forEach(function (item) { + item._haystack = [ + item.title || '', + item.content || '', + Array.isArray(item.tags) ? item.tags.join(' ') : '' + ].join(' ').toLowerCase(); + }); + return index; + }) + .catch(function (err) { + loading = null; + resultsBar.classList.remove('hidden'); + resultsBar.innerHTML = 'Не удалось загрузить поисковый индекс.'; + throw err; + }); + return loading; + } + + function escapeRegExp(s) { + return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + } + + function highlight(html, term) { + if (!term || !html) return html; + var regex = new RegExp('(' + escapeRegExp(term) + ')', 'gi'); + var root = document.createElement('div'); + root.innerHTML = html; + + var skip = { SCRIPT: 1, STYLE: 1, CODE: 1, PRE: 1, SVG: 1 }; + var walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, { + acceptNode: function (node) { + if (skip[node.parentNode.nodeName]) return NodeFilter.FILTER_REJECT; + return regex.test(node.textContent) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT; + } + }); + + var targets = []; + while (walker.nextNode()) targets.push(walker.currentNode); + + targets.forEach(function (node) { + var fragment = document.createDocumentFragment(); + node.textContent.split(regex).forEach(function (part) { + if (!part) return; + if (part.toLowerCase() === term.toLowerCase()) { + var span = document.createElement('span'); + span.className = highlightClass; + span.textContent = part; + fragment.appendChild(span); + } else { + fragment.appendChild(document.createTextNode(part)); + } + }); + node.parentNode.replaceChild(fragment, node); + }); + + return root.innerHTML; + } + + function fallbackCard(item) { + var text = (item.content || '').replace(/<[^>]*>?/g, '').slice(0, 120); + return '' + + '
' + + '
' + + '

' + (item.title || 'Документ') + '

' + + '

' + text + '…

' + + '
'; + } + + function render(term) { + normalView.style.display = 'none'; + + var fragment = document.createDocumentFragment(); + var found = 0; + + index.forEach(function (item) { + if (item._haystack.indexOf(term) === -1) return; + var node = template.content.cloneNode(true); + node.querySelector('.card-content').innerHTML = highlight(item.html || fallbackCard(item), term); + fragment.appendChild(node); + found++; + }); + + grid.replaceChildren(fragment); + + if (window.cnApplySubjectCards) window.cnApplySubjectCards(grid); + + countEl.textContent = found; + resultsBar.classList.toggle('hidden', found === 0); + noResults.classList.toggle('hidden', found > 0); + searchView.classList.toggle('hidden', found === 0); + + syncUrl(term); + } + + function search(query) { + var term = query.toLowerCase().trim(); + if (!term) return clear(); + loadIndex().then(function () { render(term); }).catch(function () {}); + } + + function clear() { + input.value = ''; + resultsBar.classList.add('hidden'); + noResults.classList.add('hidden'); + searchView.classList.add('hidden'); + grid.replaceChildren(); + normalView.style.display = ''; + syncUrl(''); + input.focus(); + } + window.clearSearch = clear; + + function syncUrl(term) { + if (!history.replaceState) return; + var url = new URL(window.location.href); + if (term) url.searchParams.set('q', term); else url.searchParams.delete('q'); + history.replaceState(null, '', url); + } + + function init() { + input = document.getElementById('global-search'); + if (!input) return; + + resultsBar = document.getElementById('search-results'); + countEl = document.getElementById('result-count'); + normalView = document.getElementById('normal-view'); + searchView = document.getElementById('search-view'); + grid = document.getElementById('search-grid'); + noResults = document.getElementById('no-results'); + template = document.getElementById('search-item-template'); + highlightClass = input.dataset.highlightClass || highlightClass; + + ['focus', 'pointerenter'].forEach(function (evt) { + input.addEventListener(evt, function () { loadIndex().catch(function () {}); }, { once: true }); + }); + + input.addEventListener('input', function () { + clearTimeout(timer); + var value = this.value; + timer = setTimeout(function () { search(value); }, 200); + }); + + document.addEventListener('keydown', function (e) { + if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === 'k') { + e.preventDefault(); + input.focus(); + input.select(); + } else if (e.key === 'Escape' && input.value) { + clear(); + } + }); + + if (!/Mac|iPhone|iPad/i.test(navigator.platform || navigator.userAgent)) { + var kbd = document.querySelector('[data-kbd-mod]'); + if (kbd) kbd.textContent = 'Ctrl'; + } + + var q = new URLSearchParams(window.location.search).get('q'); + if (q) { + input.value = q; + search(q); + } + } + + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', init, { once: true }); + } else { + init(); + } +})(); \ No newline at end of file diff --git a/assets/js/site.js b/assets/js/site.js new file mode 100644 index 0000000..7f74be3 --- /dev/null +++ b/assets/js/site.js @@ -0,0 +1,417 @@ +(function () { + 'use strict'; + + var onReady = function (fn) { + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', fn, { once: true }); + } else { + fn(); + } + }; + + function initStickyNav() { + var nav = document.getElementById('site-nav'); + if (!nav || !nav.dataset.stickyClass) return; + + var classes = nav.dataset.stickyClass.split(/\s+/).filter(Boolean); + var sticky = false; + var ticking = false; + + var apply = function () { + var next = window.scrollY > 30; + if (next !== sticky) { + sticky = next; + classes.forEach(function (c) { nav.classList.toggle(c, sticky); }); + } + ticking = false; + }; + + window.addEventListener('scroll', function () { + if (!ticking) { + ticking = true; + window.requestAnimationFrame(apply); + } + }, { passive: true }); + + apply(); + } + + function initStarCount() { + var el = document.getElementById('nav-star-count'); + if (!el || !el.dataset.repo) return; + + var CACHE_KEY = 'gh-stars:' + el.dataset.repo; + var TTL = 6 * 60 * 60 * 1000; + + var render = function (n) { + el.style.transition = 'opacity 0.4s ease'; + el.style.opacity = '0'; + setTimeout(function () { + el.textContent = n >= 1000 ? (n / 1000).toFixed(1) + 'k' : String(n); + el.style.opacity = '1'; + }, 200); + }; + + try { + var cached = JSON.parse(sessionStorage.getItem(CACHE_KEY) || 'null'); + if (cached && Date.now() - cached.t < TTL) { + el.textContent = cached.n >= 1000 ? (cached.n / 1000).toFixed(1) + 'k' : String(cached.n); + return; + } + } catch (e) { } + + fetch('https://api.github.com/repos/' + el.dataset.repo) + .then(function (r) { return r.ok ? r.json() : Promise.reject(r.status); }) + .then(function (data) { + if (typeof data.stargazers_count !== 'number') return; + try { + sessionStorage.setItem(CACHE_KEY, JSON.stringify({ n: data.stargazers_count, t: Date.now() })); + } catch (e) { } + render(data.stargazers_count); + }) + .catch(function () { el.textContent = '★'; }); + } + + var ICON_COPY = + ''; + var ICON_CHECK = + ''; + + function initCodeCopy() { + var blocks = document.querySelectorAll('.highlight'); + if (!blocks.length) return; + + blocks.forEach(function (block) { + var code = block.querySelector('code'); + if (!code) return; + + var button = document.createElement('button'); + button.type = 'button'; + button.className = 'copy-code-btn'; + button.setAttribute('aria-label', 'Копировать код'); + button.setAttribute('title', 'Копировать'); + button.innerHTML = ICON_COPY; + block.appendChild(button); + + var timer = null; + button.addEventListener('click', function () { + copyText(code.innerText).then(function (ok) { + if (!ok) return; + clearTimeout(timer); + button.innerHTML = ICON_CHECK; + button.classList.add('is-copied'); + timer = setTimeout(function () { + button.innerHTML = ICON_COPY; + button.classList.remove('is-copied'); + }, 2000); + }); + }); + }); + } + + function copyText(text) { + if (navigator.clipboard && window.isSecureContext) { + return navigator.clipboard.writeText(text).then(function () { return true; }, fallback); + } + return Promise.resolve(fallback()); + + function fallback() { + try { + var ta = document.createElement('textarea'); + ta.value = text; + ta.setAttribute('readonly', ''); + ta.style.cssText = 'position:fixed;top:-9999px;opacity:0'; + document.body.appendChild(ta); + ta.select(); + var ok = document.execCommand('copy'); + document.body.removeChild(ta); + return ok; + } catch (e) { + return false; + } + } + } + window.cnCopyText = copyText; + + function initContextMenu() { + var menu = document.getElementById('custom-context-menu'); + if (!menu) return; + + var copyTextBtn = document.getElementById('ctx-copy-text'); + var divider = document.getElementById('ctx-divider'); + var pendingText = ''; + + function hide() { + menu.classList.add('opacity-0'); + setTimeout(function () { menu.classList.add('hidden'); }, 150); + } + + document.addEventListener('contextmenu', function (e) { + if (e.shiftKey) return; + e.preventDefault(); + + pendingText = String(window.getSelection()).trim(); + var hasSelection = pendingText.length > 0; + copyTextBtn.style.display = hasSelection ? 'flex' : 'none'; + divider.style.display = hasSelection ? 'block' : 'none'; + + menu.classList.remove('hidden'); + + var x = Math.min(e.clientX, window.innerWidth - menu.offsetWidth - 10); + var y = Math.min(e.clientY, window.innerHeight - menu.offsetHeight - 10); + menu.style.left = Math.max(10, x) + 'px'; + menu.style.top = Math.max(10, y) + 'px'; + + requestAnimationFrame(function () { menu.classList.remove('opacity-0'); }); + }); + + menu.addEventListener('click', function (e) { + var btn = e.target.closest('[data-ctx]'); + if (!btn) return; + + switch (btn.dataset.ctx) { + case 'copy-text': copyText(pendingText); break; + case 'copy-url': copyText(window.location.href); break; + case 'share': + if (navigator.share) { + navigator.share({ title: document.title, url: window.location.href }).catch(function () {}); + } else { + copyText(window.location.href); + } + break; + case 'top': window.scrollTo({ top: 0, behavior: 'smooth' }); break; + } + hide(); + }); + + document.addEventListener('click', hide); + window.addEventListener('scroll', hide, { passive: true }); + document.addEventListener('keydown', function (e) { + if (e.key === 'Escape') hide(); + }); + } + + onReady(function () { + initStickyNav(); + initStarCount(); + initCodeCopy(); + initContextMenu(); + }); +})(); + +(function () { + 'use strict'; + + var GAP = 8; + var DELAY = 120; + var tip = null; + var target = null; + var showTimer = null; + var hideTimer = null; + + function ensure() { + if (tip) return tip; + tip = document.createElement('div'); + tip.className = 'cn-tip'; + tip.setAttribute('role', 'tooltip'); + tip.id = 'cn-tip'; + document.body.appendChild(tip); + return tip; + } + + function place(el) { + var box = el.getBoundingClientRect(); + var w = tip.offsetWidth; + var h = tip.offsetHeight; + var prefersTop = el.dataset.cnTipPos === 'top'; + + var top = prefersTop ? box.top - h - GAP : box.bottom + GAP; + if (!prefersTop && top + h > window.innerHeight - 4) top = box.top - h - GAP; + if (top < 4) top = Math.min(box.bottom + GAP, window.innerHeight - h - 4); + + var left = box.left; + if (left + w > window.innerWidth - 8) left = window.innerWidth - w - 8; + if (left < 8) left = 8; + + tip.style.left = Math.round(left) + 'px'; + tip.style.top = Math.round(top) + 'px'; + } + + function show(el) { + var text = el.getAttribute('data-cn-tip'); + if (!text) return; + ensure(); + clearTimeout(hideTimer); + target = el; + tip.textContent = text; + tip.style.visibility = 'hidden'; + tip.dataset.open = '0'; + requestAnimationFrame(function () { + if (target !== el) return; + tip.style.visibility = ''; + place(el); + tip.dataset.open = '1'; + el.setAttribute('aria-describedby', 'cn-tip'); + }); + } + + function hide() { + clearTimeout(showTimer); + if (!tip || !target) return; + target.removeAttribute('aria-describedby'); + target = null; + tip.dataset.open = '0'; + hideTimer = setTimeout(function () { + if (!target) tip.textContent = ''; + }, 200); + } + + function pick(node) { + return node && node.closest ? node.closest('[data-cn-tip]') : null; + } + + function schedule(el) { + clearTimeout(showTimer); + if (!el || el === target) return; + if (el.title) { el.dataset.cnTitle = el.title; el.removeAttribute('title'); } + showTimer = setTimeout(function () { show(el); }, DELAY); + } + + document.addEventListener('pointerover', function (e) { + if (e.pointerType === 'touch') return; + var el = pick(e.target); + if (el) schedule(el); else hide(); + }, { passive: true }); + + document.addEventListener('pointerdown', function (e) { + var el = pick(e.target); + if (!el) { hide(); return; } + if (e.pointerType === 'touch') { + show(el); + clearTimeout(hideTimer); + hideTimer = setTimeout(hide, 2600); + } + }, { passive: true }); + + document.addEventListener('focusin', function (e) { + var el = pick(e.target); + if (el) schedule(el); else hide(); + }); + + document.addEventListener('focusout', hide); + window.addEventListener('scroll', hide, { passive: true }); + window.addEventListener('resize', hide, { passive: true }); + document.addEventListener('keydown', function (e) { + if (e.key === 'Escape') hide(); + }); +})(); + + +/* + * Выбор варианта конспекта: преподаватель + автор. + * + * Модель: одна папка в content/posts — один вариант; варианты одного + * предмета связаны ключом `subject` во front matter. + * + * Что делает этот модуль: + * 1. запоминает, какой вариант человек открывал последним (localStorage); + * 2. на главной перевешивает ссылку заголовка карточки на этот вариант + * и подсвечивает соответствующую строку; + * 3. открывает шторку выбора внутри курса. + * + * Всё это — прогрессивное улучшение: без JS ссылки ведут на основной + * вариант, а шторка не открывается (кнопка просто ничего не делает). + */ +(function () { + 'use strict'; + + var PREFIX = 'cn:teacher:'; + + function remember(subject, variant) { + if (!subject || !variant) return; + try { localStorage.setItem(PREFIX + subject, variant); } catch (e) { } + } + + function recall(subject) { + try { return localStorage.getItem(PREFIX + subject); } catch (e) { return null; } + } + + function trackCurrent() { + var root = document.querySelector('[data-cn-course]'); + if (!root) return; + remember(root.dataset.subject, root.dataset.variant); + } + + function escapeAttr(value) { + if (window.CSS && CSS.escape) return CSS.escape(value); + return value.replace(/["\\]/g, '\\$&'); + } + + function applyToCards(scope) { + var root = scope || document; + root.querySelectorAll('[data-subject-card]').forEach(function (card) { + var saved = recall(card.dataset.subject); + if (!saved) return; + + var row = card.querySelector('[data-variant="' + escapeAttr(saved) + '"]'); + if (!row) return; + + var url = row.dataset.url || row.getAttribute('href'); + var link = card.querySelector('[data-subject-link]'); + if (link && url) link.setAttribute('href', url); + + card.querySelectorAll('[data-remembered]').forEach(function (el) { + el.removeAttribute('data-remembered'); + }); + row.dataset.remembered = '1'; + }); + } + + window.cnApplySubjectCards = applyToCards; + + function initSheet() { + var sheet = document.getElementById('cn-teacher-sheet'); + if (!sheet) return; + + document.addEventListener('click', function (e) { + var opener = e.target.closest('[data-teacher-open]'); + if (opener) { + e.preventDefault(); + if (typeof sheet.showModal === 'function') sheet.showModal(); + else sheet.setAttribute('open', ''); + return; + } + + var item = e.target.closest('.cn-sheet__item'); + if (item && sheet.contains(item)) { + remember(sheet.dataset.subject, item.dataset.variant); + } + }); + + sheet.addEventListener('click', function (e) { + if (e.target === sheet) sheet.close(); + }); + } + + function initCardRows() { + document.addEventListener('click', function (e) { + var row = e.target.closest('[data-subject-card] [data-variant]'); + if (!row) return; + var card = row.closest('[data-subject-card]'); + if (card) remember(card.dataset.subject, row.dataset.variant); + }); + } + + function init() { + trackCurrent(); + applyToCards(); + initCardRows(); + initSheet(); + } + + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', init, { once: true }); + } else { + init(); + } +})(); diff --git a/assets/js/toc.js b/assets/js/toc.js deleted file mode 100644 index 0e35143..0000000 --- a/assets/js/toc.js +++ /dev/null @@ -1,57 +0,0 @@ -function tocHighlighter() { - return { - headings: [], - links: [], - debouncedScroll: null, - - init() { - const toc = document.querySelector('#TableOfContents'); - if (!toc || window.getComputedStyle(toc.parentElement).display === 'none') { - return; - } - - this.links = Array.from(toc.querySelectorAll('a')); - this.headings = this.links - .map((link) => { - const href = link.getAttribute('href'); - return document.getElementById(href?.replace('#', '')); - }) - .filter(Boolean); - - this.debouncedScroll = this.debounce(this.onScroll.bind(this), 300); - this.debouncedScroll(); - }, - - onScroll() { - let closest = null; - let minOffset = Infinity; - - this.headings.forEach((el, index) => { - const rect = el.getBoundingClientRect(); - const offset = Math.abs(rect.top - 100); - - if (rect.top < window.innerHeight && offset < minOffset) { - minOffset = offset; - closest = index; - } - }); - - if (closest !== null && this.links[closest]) { - this.setActive(this.links[closest]); - } - }, - - setActive(activeLink) { - this.links.forEach((link) => link.classList.remove('menu-active', 'text-primary', 'font-bold')); - activeLink.classList.add('menu-active', 'text-primary', 'font-bold'); - }, - - debounce(fn, delay) { - let timeout; - return (...args) => { - clearTimeout(timeout); - timeout = setTimeout(() => fn.apply(this, args), delay); - }; - } - }; -} \ No newline at end of file diff --git a/content/posts/cpp-sem1/_index.md b/content/posts/cpp-sem1/_index.md index 51c5d03..73e37c4 100644 --- a/content/posts/cpp-sem1/_index.md +++ b/content/posts/cpp-sem1/_index.md @@ -1,15 +1,18 @@ --- title: "Основы Программирования" -description: "Хвастунов Александр Павлович" +teacher: "Хвастунов Александр Павлович" semester: 1 +accent: 1 +academicYear: 2024/25 +author: salt-caramel --- - + {{< icon "cloud-download-outline" >}} Лекции .pdf - + {{< icon "code-slash-outline" >}} Контекст для LLM diff --git a/content/posts/cpp-sem1/lecture-01/index.md b/content/posts/cpp-sem1/lecture-01/index.md index e4e5fca..de2c225 100644 --- a/content/posts/cpp-sem1/lecture-01/index.md +++ b/content/posts/cpp-sem1/lecture-01/index.md @@ -1,5 +1,6 @@ --- -title: Лекция 1 +title: Основы +description: Базовые понятия языка C++ — типы данных, идентификаторы и операторы. Разбираются операторы ветвления, циклы и объявление функций как первые строительные блоки программ. date: 2024-09-09 tags: - Основы Программирования diff --git a/content/posts/cpp-sem1/lecture-02/index.md b/content/posts/cpp-sem1/lecture-02/index.md index 45b7518..a3883c0 100644 --- a/content/posts/cpp-sem1/lecture-02/index.md +++ b/content/posts/cpp-sem1/lecture-02/index.md @@ -1,5 +1,6 @@ --- -title: Лекция 2 +title: Указатели +description: Указатели, массивы и строки как основа работы с памятью в C++. Рассматриваются адресация, void*, арифметика указателей и их связь с массивами и строковыми литералами. date: 2025-09-05 tags: - Основы Программирования diff --git a/content/posts/cpp-sem1/lecture-03/index.md b/content/posts/cpp-sem1/lecture-03/index.md index b6ccac9..959361b 100644 --- a/content/posts/cpp-sem1/lecture-03/index.md +++ b/content/posts/cpp-sem1/lecture-03/index.md @@ -1,5 +1,6 @@ --- -title: Лекция 3 +title: Структуры +description: Пользовательские составные типы — структуры (struct) и объединения (union). Показаны различия между struct и class, а также особенности хранения данных в union. date: 2025-09-05 tags: - Основы Программирования diff --git a/content/posts/cpp-sem1/lecture-04/index.md b/content/posts/cpp-sem1/lecture-04/index.md index 6e8d94d..7b32ba8 100644 --- a/content/posts/cpp-sem1/lecture-04/index.md +++ b/content/posts/cpp-sem1/lecture-04/index.md @@ -1,5 +1,6 @@ --- -title: Лекция 4 +title: Память +description: Устройство памяти компьютера и архитектуры фон Неймана и Гарвардская. Рассматриваются уровни памяти от регистров до дисков и работа с памятью на уровне процесса. date: 2025-09-05 tags: - Основы Программирования diff --git a/content/posts/cpp-sem1/lecture-05/index.md b/content/posts/cpp-sem1/lecture-05/index.md index 90eb0bd..27239c6 100644 --- a/content/posts/cpp-sem1/lecture-05/index.md +++ b/content/posts/cpp-sem1/lecture-05/index.md @@ -1,5 +1,6 @@ --- -title: Лекция 5 +title: Компиляция +description: Процесс раздельной компиляции и её преимущества для больших проектов. Объясняется роль заголовочных и cpp-файлов, а также этапы сборки программы. date: 2025-09-05 tags: - Основы Программирования diff --git a/content/posts/cpp-sem1/lecture-06/index.md b/content/posts/cpp-sem1/lecture-06/index.md index 69bde2b..466e2e1 100644 --- a/content/posts/cpp-sem1/lecture-06/index.md +++ b/content/posts/cpp-sem1/lecture-06/index.md @@ -1,5 +1,6 @@ --- -title: Лекция 6 +title: Ссылки +description: Ссылки как альтернатива указателям, правила инициализации переменных и продление жизни временных объектов. Также разбираются перегрузка функций и именованные скоупы. date: 2025-09-05 tags: - Основы Программирования diff --git a/content/posts/cpp-sem1/lecture-07/index.md b/content/posts/cpp-sem1/lecture-07/index.md index d9da2aa..2cee8c7 100644 --- a/content/posts/cpp-sem1/lecture-07/index.md +++ b/content/posts/cpp-sem1/lecture-07/index.md @@ -1,5 +1,6 @@ --- -title: Лекция 7 +title: Абстракция +description: Введение в объектно-ориентированное программирование через понятия абстракции и инкапсуляции. Рассматривается инвариант класса и сокрытие деталей реализации. date: 2025-09-05 tags: - Основы Программирования diff --git a/content/posts/cpp-sem1/lecture-08/index.md b/content/posts/cpp-sem1/lecture-08/index.md index 316cc70..8fc7769 100644 --- a/content/posts/cpp-sem1/lecture-08/index.md +++ b/content/posts/cpp-sem1/lecture-08/index.md @@ -1,5 +1,6 @@ --- -title: Лекция 8 +title: Перегрузка +description: Перегрузка функций, методов и операторов в C++. Даётся классификация операторов и правила, по которым компилятор выбирает подходящую перегрузку. date: 2025-09-05 tags: - Основы Программирования diff --git a/content/posts/cpp-sem1/lecture-09/index.md b/content/posts/cpp-sem1/lecture-09/index.md index c065f59..937db70 100644 --- a/content/posts/cpp-sem1/lecture-09/index.md +++ b/content/posts/cpp-sem1/lecture-09/index.md @@ -1,5 +1,6 @@ --- -title: Лекция 9 +title: Наследование +description: Наследование классов в ООП — базовые и производные классы, заимствование функциональности. Показывается, как наследование открывает дорогу к полиморфизму. date: 2025-09-05 tags: - Основы Программирования diff --git a/content/posts/cpp-sem1/lecture-10/index.md b/content/posts/cpp-sem1/lecture-10/index.md index d9aca39..e3ec2d7 100644 --- a/content/posts/cpp-sem1/lecture-10/index.md +++ b/content/posts/cpp-sem1/lecture-10/index.md @@ -1,5 +1,6 @@ --- -title: Лекция 10 +title: Полиморфизм +description: Динамический и статический полиморфизм в C++ через виртуальные функции. Объясняются позднее и раннее связывание и работа с объектами через единый интерфейс. date: 2025-09-05 tags: - Основы Программирования diff --git a/content/posts/cpp-sem1/lecture-11/index.md b/content/posts/cpp-sem1/lecture-11/index.md index f7a2bb5..1c5ef19 100644 --- a/content/posts/cpp-sem1/lecture-11/index.md +++ b/content/posts/cpp-sem1/lecture-11/index.md @@ -1,5 +1,6 @@ --- -title: Лекция 11 +title: Шаблоны +description: Шаблоны классов и функций как инструмент обобщённого программирования. Рассматриваются параметризация типами и значениями и семейства функций и классов, генерируемых компилятором. date: 2025-09-05 tags: - Основы Программирования diff --git a/content/posts/cpp-sem2/_index.md b/content/posts/cpp-sem2/_index.md index 7711785..45ede68 100644 --- a/content/posts/cpp-sem2/_index.md +++ b/content/posts/cpp-sem2/_index.md @@ -1,7 +1,10 @@ --- title: "Программирование на C++" -description: "Хвастунов Александр Павлович" +teacher: "Хвастунов Александр Павлович" semester: 2 +accent: 3 +academicYear: 2024/25 +author: notakeith, salt-caramel --- Конспекты содержат немалое количество ошибок, которые были обнаружены во время подготовки к экзаменам, но не были исправлены в этих версиях, а исправленные версии утеряны... Так что повторно проверяйте сами всё... @@ -9,11 +12,11 @@ semester: 2 Если есть желание, можете помочь сделать конспекты еще лучше, отправив нам [issue](https://github.com/botaemeveryday/notes/issues/new?template=content-error.md) или [pull request](https://github.com/botaemeveryday/notes/pulls) с изменениями - + {{< icon "cloud-download-outline" >}} Лекции .pdf - + {{< icon "code-slash-outline" >}} Контекст для LLM diff --git a/content/posts/cpp-sem2/lecture-01/index.md b/content/posts/cpp-sem2/lecture-01/index.md index 116f27b..56328b1 100644 --- a/content/posts/cpp-sem2/lecture-01/index.md +++ b/content/posts/cpp-sem2/lecture-01/index.md @@ -1,6 +1,6 @@ --- -title: Лекция 1 -description: Специализация шаблонов. Умные указатели +title: Умные указатели +description: Идиома RAII и её роль в управлении ресурсами. Разбираются умные указатели unique_ptr и shared_ptr как способ автоматизировать освобождение памяти. date: 2025-02-05 tags: - 2 семестр diff --git a/content/posts/cpp-sem2/lecture-02/index.md b/content/posts/cpp-sem2/lecture-02/index.md index e7d4833..be825e1 100644 --- a/content/posts/cpp-sem2/lecture-02/index.md +++ b/content/posts/cpp-sem2/lecture-02/index.md @@ -1,6 +1,6 @@ --- -title: Лекция 2 -description: Контейнеры и STL +title: STL +description: Обзор Standard Template Library и её ключевых компонентов — контейнеров, итераторов и алгоритмов. Показано, как эти части работают вместе для обобщённой обработки данных. date: 2025-02-12 tags: - 2 семестр diff --git a/content/posts/cpp-sem2/lecture-03/images/73fe1ef4c55e213ba5fc63e2248d2c63.png b/content/posts/cpp-sem2/lecture-03/images/image1.png similarity index 100% rename from content/posts/cpp-sem2/lecture-03/images/73fe1ef4c55e213ba5fc63e2248d2c63.png rename to content/posts/cpp-sem2/lecture-03/images/image1.png diff --git a/content/posts/cpp-sem2/lecture-03/images/6be4e44592b59074ff9b58eb8f0e1040.png b/content/posts/cpp-sem2/lecture-03/images/image2.png similarity index 100% rename from content/posts/cpp-sem2/lecture-03/images/6be4e44592b59074ff9b58eb8f0e1040.png rename to content/posts/cpp-sem2/lecture-03/images/image2.png diff --git a/content/posts/cpp-sem2/lecture-03/images/4e2aabb002f7440126cfbb63e17f3aa4.png b/content/posts/cpp-sem2/lecture-03/images/image3.png similarity index 100% rename from content/posts/cpp-sem2/lecture-03/images/4e2aabb002f7440126cfbb63e17f3aa4.png rename to content/posts/cpp-sem2/lecture-03/images/image3.png diff --git a/content/posts/cpp-sem2/lecture-03/images/baf034f9aa0cf1ea20cadef0a7088554.png b/content/posts/cpp-sem2/lecture-03/images/image4.png similarity index 100% rename from content/posts/cpp-sem2/lecture-03/images/baf034f9aa0cf1ea20cadef0a7088554.png rename to content/posts/cpp-sem2/lecture-03/images/image4.png diff --git a/content/posts/cpp-sem2/lecture-03/images/f8d54d223f153287189669bde9913d91.png b/content/posts/cpp-sem2/lecture-03/images/image5.png similarity index 100% rename from content/posts/cpp-sem2/lecture-03/images/f8d54d223f153287189669bde9913d91.png rename to content/posts/cpp-sem2/lecture-03/images/image5.png diff --git a/content/posts/cpp-sem2/lecture-03/images/659ce5b874be2eeb1b8c7c5f46e8acd5.png b/content/posts/cpp-sem2/lecture-03/images/image6.png similarity index 100% rename from content/posts/cpp-sem2/lecture-03/images/659ce5b874be2eeb1b8c7c5f46e8acd5.png rename to content/posts/cpp-sem2/lecture-03/images/image6.png diff --git a/content/posts/cpp-sem2/lecture-03/index.md b/content/posts/cpp-sem2/lecture-03/index.md index af271ac..6e69fa5 100644 --- a/content/posts/cpp-sem2/lecture-03/index.md +++ b/content/posts/cpp-sem2/lecture-03/index.md @@ -1,6 +1,6 @@ --- -title: Лекция 3 -description: Функциональные объекты +title: Функторы +description: Функциональные объекты (функторы) как альтернатива обычным функциям и указателям на функции. Разбирается их применение в алгоритмах STL на примере реализации собственного remove. date: 2025-02-19 tags: - 2 семестр @@ -94,12 +94,12 @@ const_reverse_iterator rend() const { return const_reverse_iterator(begin()); - `iterator` для `array` — это по сути просто указатель (поэтому `end()` = `data() + size`). - `reverse_iterator` смотрит на контейнер «с конца к началу»: `rbegin()` возвращает «обёртку» над `end()`, которая при разыменовании даёт последний элемент. -![](images/73fe1ef4c55e213ba5fc63e2248d2c63.png) +![](images/image1.png) - Классический фиксированный массив. ### `std::vector` -![](images/6be4e44592b59074ff9b58eb8f0e1040.png) +![](images/image2.png) - Один большой непрерывный кусок памяти. Выделяется с **запасом** (`capacity` ≥ `size`). - При вставке: если есть свободное место — добавляем, иначе делаем **реаллокацию** (обычно выделяется в ~2 раза больше памяти, всё копируется/перемещается). Реаллокация случается редко, поэтому амортизированная сложность вставки в конец — O(1). @@ -110,7 +110,7 @@ const_reverse_iterator rend() const { return const_reverse_iterator(begin()); ### `std::deque` -![](images/4e2aabb002f7440126cfbb63e17f3aa4.png) +![](images/image3.png) - Похож на вектор, но память состоит из **нескольких непрерывных блоков** (массив массивов). Если не хватает — добавляется ещё один блок. - Компромисс между вектором и списком. @@ -120,7 +120,7 @@ const_reverse_iterator rend() const { return const_reverse_iterator(begin()); ### `std::list` -![](images/baf034f9aa0cf1ea20cadef0a7088554.png) +![](images/image4.png) - Двусвязный список (циклический — у некоторых реализаций). - Эффективная вставка/удаление в любую позицию — O(1) (если есть итератор). @@ -130,7 +130,7 @@ const_reverse_iterator rend() const { return const_reverse_iterator(begin()); ### `std::forward_list` -![](images/f8d54d223f153287189669bde9913d91.png) +![](images/image5.png) - Однонаправленный список. - Меньше памяти, чем у `list` (один указатель на ноду вместо двух). @@ -142,7 +142,7 @@ const_reverse_iterator rend() const { return const_reverse_iterator(begin()); ## Ассоциативные контейнеры -![](images/659ce5b874be2eeb1b8c7c5f46e8acd5.png) +![](images/image6.png) Обычно реализованы как красно-чёрное дерево (но в стандарте конкретная реализация не зафиксирована — гарантируется только асимптотика). diff --git a/content/posts/cpp-sem2/lecture-04/index.md b/content/posts/cpp-sem2/lecture-04/index.md index fef2710..5bde78f 100644 --- a/content/posts/cpp-sem2/lecture-04/index.md +++ b/content/posts/cpp-sem2/lecture-04/index.md @@ -1,6 +1,6 @@ --- -title: Лекция 4 -description: Аллокаторы +title: Аллокаторы +description: Аллокаторы как механизм управления выделением памяти для контейнеров STL. Объясняется, зачем они нужны и как можно написать собственный аллокатор. date: 2025-02-26 tags: - 2 семестр diff --git a/content/posts/cpp-sem2/lecture-05/index.md b/content/posts/cpp-sem2/lecture-05/index.md index 74d8772..9674b3d 100644 --- a/content/posts/cpp-sem2/lecture-05/index.md +++ b/content/posts/cpp-sem2/lecture-05/index.md @@ -1,6 +1,6 @@ --- -title: Лекция 5 -description: Обработка ошибок +title: Обработка ошибок +description: Виды ошибок, возникающих в программах, и подходы к их обработке. Рассматриваются коды возврата, assert и другие способы реагировать на некорректные ситуации. date: 2025-03-05 tags: - 2 семестр diff --git a/content/posts/cpp-sem2/lecture-06/images/9a45288415f500a352f395980f724b90.png b/content/posts/cpp-sem2/lecture-06/images/image1.png similarity index 100% rename from content/posts/cpp-sem2/lecture-06/images/9a45288415f500a352f395980f724b90.png rename to content/posts/cpp-sem2/lecture-06/images/image1.png diff --git a/content/posts/cpp-sem2/lecture-06/images/007f386bb5deaf24ab698a2f1709529b.png b/content/posts/cpp-sem2/lecture-06/images/image2.png similarity index 100% rename from content/posts/cpp-sem2/lecture-06/images/007f386bb5deaf24ab698a2f1709529b.png rename to content/posts/cpp-sem2/lecture-06/images/image2.png diff --git a/content/posts/cpp-sem2/lecture-06/images/df657ac7f07c6b9d788f2e4876801e1f.png b/content/posts/cpp-sem2/lecture-06/images/image3.png similarity index 100% rename from content/posts/cpp-sem2/lecture-06/images/df657ac7f07c6b9d788f2e4876801e1f.png rename to content/posts/cpp-sem2/lecture-06/images/image3.png diff --git a/content/posts/cpp-sem2/lecture-06/images/ea94972b631029e66b37b483d90e59dd.png b/content/posts/cpp-sem2/lecture-06/images/image4.png similarity index 100% rename from content/posts/cpp-sem2/lecture-06/images/ea94972b631029e66b37b483d90e59dd.png rename to content/posts/cpp-sem2/lecture-06/images/image4.png diff --git a/content/posts/cpp-sem2/lecture-06/index.md b/content/posts/cpp-sem2/lecture-06/index.md index 42a22aa..6faa32c 100644 --- a/content/posts/cpp-sem2/lecture-06/index.md +++ b/content/posts/cpp-sem2/lecture-06/index.md @@ -1,12 +1,10 @@ --- -title: Лекция 6 +title: Исключения +description: Механизм исключений в C++ и иерархия std::exception. Объясняется, почему бросать типизированные исключения информативнее, чем строки или числа, и как их правильно перехватывать. date: 2025-03-12 - tags: - 2 семестр - Основы программирования - -description: Лекция 6 authors: - name: notakeith avatar: https://avatars.githubusercontent.com/u/108391756?v=4 @@ -31,7 +29,7 @@ public: }; ``` -![](images/9a45288415f500a352f395980f724b90.png) +![](images/image1.png) ## Свои исключения @@ -81,7 +79,7 @@ int main(int, char**) { ### Цена исключений -![](images/007f386bb5deaf24ab698a2f1709529b.png) +![](images/image2.png) Бенчмарк на разном числе потоков и разном количестве ошибок: - **Рост по столбцам** — раскрутка стека не бесплатная: чем больше ошибок, тем больше времени тратится на unwinding. diff --git a/content/posts/cpp-sem2/lecture-07/images/image1.png b/content/posts/cpp-sem2/lecture-07/images/image1.png new file mode 100644 index 0000000..8e9039a Binary files /dev/null and b/content/posts/cpp-sem2/lecture-07/images/image1.png differ diff --git a/content/posts/cpp-sem2/lecture-07/images/image2.png b/content/posts/cpp-sem2/lecture-07/images/image2.png new file mode 100644 index 0000000..9f3b894 Binary files /dev/null and b/content/posts/cpp-sem2/lecture-07/images/image2.png differ diff --git a/content/posts/cpp-sem2/lecture-07/index.md b/content/posts/cpp-sem2/lecture-07/index.md index ab3c7ab..46671c6 100644 --- a/content/posts/cpp-sem2/lecture-07/index.md +++ b/content/posts/cpp-sem2/lecture-07/index.md @@ -1,6 +1,6 @@ --- -title: Лекция 7 -description: Лямбды +title: Лямбды +description: Указатели на функции и переход к лямбда-выражениям как более гибкому способу передавать поведение. Разбираются захват переменных и области применения лямбд. date: 2025-03-19 tags: - 2 семестр @@ -188,11 +188,11 @@ int x = 1; Компилятор за нас создаёт функциональный объект — у каждой лямбды свой уникальный тип: -![](images/ea94972b631029e66b37b483d90e59dd.png) +![](images/image1.png) Если написать **две идентичные** лямбды — это всё равно будут два **разных типа**: -![](images/df657ac7f07c6b9d788f2e4876801e1f.png) +![](images/image2.png) --- diff --git a/content/posts/cpp-sem2/lecture-08/index.md b/content/posts/cpp-sem2/lecture-08/index.md index 918f119..61886e0 100644 --- a/content/posts/cpp-sem2/lecture-08/index.md +++ b/content/posts/cpp-sem2/lecture-08/index.md @@ -1,6 +1,6 @@ --- -title: Лекция 8 -description: MyFunction +title: std::function +description: Пошаговая реализация собственного аналога std::function. Показывается, как через специализацию шаблона по сигнатуре вызова строится обёртка для произвольных вызываемых объектов. date: 2025-03-26 tags: - 2 семестр diff --git a/content/posts/cpp-sem2/lecture-09/index.md b/content/posts/cpp-sem2/lecture-09/index.md index e48078b..6ee247d 100644 --- a/content/posts/cpp-sem2/lecture-09/index.md +++ b/content/posts/cpp-sem2/lecture-09/index.md @@ -1,6 +1,6 @@ --- -title: Лекция 9 -description: Касты +title: Касты +description: Виды приведения типов в C++ — static_cast, dynamic_cast, const_cast и reinterpret_cast. Разбираются их отличия от C-style cast и ситуации, где каждый из них уместен. date: 2025-04-02 tags: - 2 семестр diff --git a/content/posts/cpp-sem2/lecture-10/index.md b/content/posts/cpp-sem2/lecture-10/index.md index 4f3f738..ceed4c7 100644 --- a/content/posts/cpp-sem2/lecture-10/index.md +++ b/content/posts/cpp-sem2/lecture-10/index.md @@ -1,6 +1,6 @@ --- -title: Лекция 10 -description: Rvalue-ссылки и move-семантика +title: Move-семантика +description: Rvalue-ссылки и move-семантика как способ избегать лишних копирований. Рассматриваются move-конструктор, move-присваивание и сворачивание ссылок. date: 2025-04-09 tags: - 2 семестр diff --git a/content/posts/cpp-sem2/lecture-11/index.md b/content/posts/cpp-sem2/lecture-11/index.md index a8b9b14..2d7650b 100644 --- a/content/posts/cpp-sem2/lecture-11/index.md +++ b/content/posts/cpp-sem2/lecture-11/index.md @@ -1,6 +1,6 @@ --- -title: Лекция 11 -description: Parametr pack +title: Parameter pack +description: Вариативные шаблоны и пакеты параметров, появившиеся в C++11. Показывается рекурсивная обработка аргументов и возможности оператора развёртки пакета. date: 2025-04-16 tags: - 2 семестр diff --git a/content/posts/cpp-sem2/lecture-12/index.md b/content/posts/cpp-sem2/lecture-12/index.md index 3812f46..1921d65 100644 --- a/content/posts/cpp-sem2/lecture-12/index.md +++ b/content/posts/cpp-sem2/lecture-12/index.md @@ -1,6 +1,6 @@ --- -title: Лекция 12 -description: Templates (еще глубже!) +title: Tuple +description: Реализация собственного tuple с использованием шаблонной рекурсии по пакету типов. Разбирается доступ к N-му элементу и различие между TAD и CTAD. date: 2025-04-23 tags: - 2 семестр diff --git a/content/posts/cpp-sem2/lecture-13/index.md b/content/posts/cpp-sem2/lecture-13/index.md index 8b8fce2..e6d5509 100644 --- a/content/posts/cpp-sem2/lecture-13/index.md +++ b/content/posts/cpp-sem2/lecture-13/index.md @@ -1,6 +1,6 @@ --- -title: Лекция 13 -description: Метапрограммирование +title: Метапрограммирование +description: Введение в шаблонное метапрограммирование и вычисления на этапе компиляции. Разбирается порядок выбора специализаций шаблонов на примере собственной реализации is_same. date: 2025-04-30 tags: - 2 семестр diff --git a/content/posts/cpp-sem2/lecture-14/index.md b/content/posts/cpp-sem2/lecture-14/index.md index 91271cc..48cc7d0 100644 --- a/content/posts/cpp-sem2/lecture-14/index.md +++ b/content/posts/cpp-sem2/lecture-14/index.md @@ -1,6 +1,6 @@ --- -title: Лекция 14 -description: Метапрограммирование +title: Type traits +description: Продолжение темы метапрограммирования через type traits вроде is_same. Показывается, как компилятор через специализации шаблонов выводит свойства типов ещё до запуска программы. date: 2025-05-07 tags: - 2 семестр diff --git a/content/posts/cpp-sem2/lecture-15/index.md b/content/posts/cpp-sem2/lecture-15/index.md index a914b08..605f9e7 100644 --- a/content/posts/cpp-sem2/lecture-15/index.md +++ b/content/posts/cpp-sem2/lecture-15/index.md @@ -1,6 +1,6 @@ --- -title: Лекция 15 -description: Концепты +title: Концепты +description: Concepts как современная замена SFINAE-трюков для ограничения шаблонных параметров. Объясняется, зачем нужны концепты и как они делают ограничения читаемыми. date: 2025-05-14 tags: - 2 семестр diff --git a/content/posts/cpp-sem2/lecture-16/images/9a229df205eda3b85821e96b3547d2a9.png b/content/posts/cpp-sem2/lecture-16/images/image1.png similarity index 100% rename from content/posts/cpp-sem2/lecture-16/images/9a229df205eda3b85821e96b3547d2a9.png rename to content/posts/cpp-sem2/lecture-16/images/image1.png diff --git a/content/posts/cpp-sem2/lecture-16/images/32ca815bcead182e4f4d1845cb27c114.png b/content/posts/cpp-sem2/lecture-16/images/image2.png similarity index 100% rename from content/posts/cpp-sem2/lecture-16/images/32ca815bcead182e4f4d1845cb27c114.png rename to content/posts/cpp-sem2/lecture-16/images/image2.png diff --git a/content/posts/cpp-sem2/lecture-16/images/f9ad4df8e681cba53c87c60125ffbd20.png b/content/posts/cpp-sem2/lecture-16/images/image3.png similarity index 100% rename from content/posts/cpp-sem2/lecture-16/images/f9ad4df8e681cba53c87c60125ffbd20.png rename to content/posts/cpp-sem2/lecture-16/images/image3.png diff --git a/content/posts/cpp-sem2/lecture-16/images/af8c48f89699f019e65d5a5ef95f433d.jpeg b/content/posts/cpp-sem2/lecture-16/images/image4.jpeg similarity index 100% rename from content/posts/cpp-sem2/lecture-16/images/af8c48f89699f019e65d5a5ef95f433d.jpeg rename to content/posts/cpp-sem2/lecture-16/images/image4.jpeg diff --git a/content/posts/cpp-sem2/lecture-16/index.md b/content/posts/cpp-sem2/lecture-16/index.md index 73d7d71..eb4cf9e 100644 --- a/content/posts/cpp-sem2/lecture-16/index.md +++ b/content/posts/cpp-sem2/lecture-16/index.md @@ -1,6 +1,6 @@ --- -title: Лекция 16 -description: Многопоточность +title: Многопоточность +description: Причины появления многопоточности, начиная с закона Мура и ограничений роста производительности процессоров. Вводятся базовые понятия потоков и параллельного выполнения. date: 2025-05-21 tags: - 2 семестр @@ -72,7 +72,7 @@ graph LR - **Parallelism** — физическое выполнение нескольких действий **одновременно** (требует нескольких ядер). - **Concurrency** — выполнение двух или более задач **одновременно с точки зрения логики**: они могут чередоваться на одном ядре, но программа структурирована так, чтобы они «шли параллельно». -![](images/9a229df205eda3b85821e96b3547d2a9.png) +![](images/image1.png) В курсе фокус на **concurrency** — нас не очень волнует количество ядер, важно научиться запускать независимые потоки выполнения. @@ -102,7 +102,7 @@ int main(int argc, char** argv) { **Сейчас:** программа может запускать несколько **потоков** внутри одного процесса (потоки делят память). -![](images/32ca815bcead182e4f4d1845cb27c114.png) +![](images/image2.png) - Каждый процесс содержит хотя бы один поток. - Потоки **шарят общие ресурсы** процесса (память, файловые дескрипторы и т.д.). @@ -151,7 +151,7 @@ int main(int argc, char* argv[]) { ## Закон Амдала -![](images/f9ad4df8e681cba53c87c60125ffbd20.png) +![](images/image3.png) Не все алгоритмы хорошо параллелятся. Например, **bubble sort** — параллелится плохо: на каждом шаге зависимость от предыдущего. Чем больше доля **последовательного** кода — тем меньше выигрыш от параллелизма (что и формализует закон Амдала). @@ -183,7 +183,7 @@ int main(int argc, char* argv[]) { ### Deadlock -![](images/af8c48f89699f019e65d5a5ef95f433d.jpeg) +![](images/image4.jpeg) Ситуация в многозадачной среде, когда несколько процессов **бесконечно ждут ресурсов**, которые занимают сами эти процессы (поток A держит ресурс X и ждёт Y, поток B держит Y и ждёт X — оба замерли навсегда). diff --git a/content/posts/databases/_index.md b/content/posts/databases/_index.md index d5dd348..77e7ea7 100644 --- a/content/posts/databases/_index.md +++ b/content/posts/databases/_index.md @@ -1,16 +1,18 @@ --- title: "Базы Данных" -description: "Мацнев Никита Игоревич" +teacher: "Мацнев Никита Игоревич" semester: 3 accent: 4 +academicYear: 2025/26 +author: notakeith, salt-caramel --- - + {{< icon "cloud-download-outline" >}} Лекции .pdf - + {{< icon "code-slash-outline" >}} Контекст для LLM diff --git a/content/posts/databases/lecture-01/images/Drawing 2025-09-05 19.43.21.excalidraw.svg b/content/posts/databases/lecture-01/images/image1.svg similarity index 100% rename from content/posts/databases/lecture-01/images/Drawing 2025-09-05 19.43.21.excalidraw.svg rename to content/posts/databases/lecture-01/images/image1.svg diff --git a/content/posts/databases/lecture-01/index.md b/content/posts/databases/lecture-01/index.md index 8336201..a3a25ae 100644 --- a/content/posts/databases/lecture-01/index.md +++ b/content/posts/databases/lecture-01/index.md @@ -1,12 +1,10 @@ --- -title: Вводная лекция. +title: Введение +description: Знакомство с курсом баз данных и обоснование выбора PostgreSQL. Рассматриваются его преимущества — открытый код, нетребовательность к ресурсам и рост популярности после ухода MS SQL Server из России. date: 2025-09-05 - tags: - Базы Данных - 3 Семестр - -description: Лекция 1 authors: - name: notakeith avatar: https://avatars.githubusercontent.com/u/108391756?v=4 @@ -131,4 +129,4 @@ authors: > Избыточность приемлема ради оптимизации. -![](images/Drawing%202025-09-05%2019.43.21.excalidraw.svg) +![](images/image1.svg) diff --git a/content/posts/databases/lecture-02/index.md b/content/posts/databases/lecture-02/index.md index 7cb19c6..3e7da04 100644 --- a/content/posts/databases/lecture-02/index.md +++ b/content/posts/databases/lecture-02/index.md @@ -6,7 +6,7 @@ tags: - Базы Данных - 3 Семестр -description: Лекция 2 +description: Базовые понятия баз данных — сама БД, модель данных, СУБД и ERD-диаграммы. Закладывается терминологический фундамент для дальнейшего изучения реляционной модели. authors: - name: notakeith avatar: https://avatars.githubusercontent.com/u/108391756?v=4 diff --git a/content/posts/databases/lecture-03/index.md b/content/posts/databases/lecture-03/index.md index 4de4538..f05e194 100644 --- a/content/posts/databases/lecture-03/index.md +++ b/content/posts/databases/lecture-03/index.md @@ -6,7 +6,7 @@ tags: - Базы Данных - 3 Семестр -description: Лекция 3 +description: Термины отношения, кортежа и атрибута, а также виды ключей в реляционных таблицах. Объясняется разница между первичным, потенциальным и внешним ключом. authors: - name: notakeith avatar: https://avatars.githubusercontent.com/u/108391756?v=4 diff --git a/content/posts/databases/lecture-04/index.md b/content/posts/databases/lecture-04/index.md index 11b4855..e32dcfd 100644 --- a/content/posts/databases/lecture-04/index.md +++ b/content/posts/databases/lecture-04/index.md @@ -6,7 +6,7 @@ tags: - Базы Данных - 3 Семестр -description: Лекция 4 +description: Реляционная модель данных, её основы — реляционная алгебра и исчисление. Упоминается язык ISBL как один из первых, построенных на реляционной алгебре. authors: - name: notakeith avatar: https://avatars.githubusercontent.com/u/108391756?v=4 diff --git "a/content/posts/databases/lecture-05/images/\320\261\320\264 \320\273\320\265\320\272\321\206\320\270\321\217 2 \321\200\320\270\321\201\321\203\320\275\320\276\320\272 1.svg" b/content/posts/databases/lecture-05/images/image1.svg similarity index 100% rename from "content/posts/databases/lecture-05/images/\320\261\320\264 \320\273\320\265\320\272\321\206\320\270\321\217 2 \321\200\320\270\321\201\321\203\320\275\320\276\320\272 1.svg" rename to content/posts/databases/lecture-05/images/image1.svg diff --git "a/content/posts/databases/lecture-05/images/\320\261\320\264 \320\273\320\265\320\272\321\206\320\270\321\217 2 \321\200\320\270\321\201\321\203\320\275\320\276\320\272 2.svg" b/content/posts/databases/lecture-05/images/image2.svg similarity index 100% rename from "content/posts/databases/lecture-05/images/\320\261\320\264 \320\273\320\265\320\272\321\206\320\270\321\217 2 \321\200\320\270\321\201\321\203\320\275\320\276\320\272 2.svg" rename to content/posts/databases/lecture-05/images/image2.svg diff --git "a/content/posts/databases/lecture-05/images/\320\261\320\264 \320\273\320\265\320\272\321\206\320\270\321\217 2 \321\200\320\270\321\201\321\203\320\275\320\276\320\272 3.svg" b/content/posts/databases/lecture-05/images/image3.svg similarity index 100% rename from "content/posts/databases/lecture-05/images/\320\261\320\264 \320\273\320\265\320\272\321\206\320\270\321\217 2 \321\200\320\270\321\201\321\203\320\275\320\276\320\272 3.svg" rename to content/posts/databases/lecture-05/images/image3.svg diff --git "a/content/posts/databases/lecture-05/images/\320\261\320\264 \320\273\320\265\320\272\321\206\320\270\321\217 2 \321\200\320\270\321\201\321\203\320\275\320\276\320\272 4.svg" b/content/posts/databases/lecture-05/images/image4.svg similarity index 100% rename from "content/posts/databases/lecture-05/images/\320\261\320\264 \320\273\320\265\320\272\321\206\320\270\321\217 2 \321\200\320\270\321\201\321\203\320\275\320\276\320\272 4.svg" rename to content/posts/databases/lecture-05/images/image4.svg diff --git a/content/posts/databases/lecture-05/index.md b/content/posts/databases/lecture-05/index.md index 76298b7..9488c8d 100644 --- a/content/posts/databases/lecture-05/index.md +++ b/content/posts/databases/lecture-05/index.md @@ -6,7 +6,7 @@ tags: - Базы Данных - 3 Семестр -description: Лекция 5 +description: Процесс нормализации базы данных для устранения избыточности и обеспечения целостности. Разбираются нормальные формы и аномалии, которые они устраняют. authors: - name: notakeith avatar: https://avatars.githubusercontent.com/u/108391756?v=4 @@ -61,7 +61,7 @@ authors: > - все атрибуты атомарны; > - у отношения есть ключ. -![](images/бд%20лекция%202%20рисунок%201.svg) +![](images/image1.svg) ## Вторая нормальная форма (2НФ) @@ -73,7 +73,7 @@ authors: > Невозможно перейти ко 2НФ, не приведя сначала отношение к 1НФ. -![](images/бд%20лекция%202%20рисунок%202.svg) +![](images/image2.svg) ## Третья нормальная форма (3НФ) @@ -83,7 +83,7 @@ authors: **Решение.** Декомпозиция: вынести «Кафедру» в отдельную таблицу с её собственным телефоном. -![](images/бд%20лекция%202%20рисунок%203.svg) +![](images/image3.svg) ## Нормальная форма Бойса-Кодда (НФБК / BCNF) @@ -91,7 +91,7 @@ authors: > Таблицы с простым первичным ключом, находящиеся в 3НФ, автоматически соответствуют НФБК. -![](images/бд%20лекция%202%20рисунок%204.svg) +![](images/image4.svg) ## Высшие нормальные формы diff --git a/content/posts/databases/lecture-06/images/619554285754008fa09b0347d5ff3f18.png b/content/posts/databases/lecture-06/images/image1.png similarity index 100% rename from content/posts/databases/lecture-06/images/619554285754008fa09b0347d5ff3f18.png rename to content/posts/databases/lecture-06/images/image1.png diff --git a/content/posts/databases/lecture-06/images/9d3347c422aeeb7c0a08202924943e6f.png b/content/posts/databases/lecture-06/images/image2.png similarity index 100% rename from content/posts/databases/lecture-06/images/9d3347c422aeeb7c0a08202924943e6f.png rename to content/posts/databases/lecture-06/images/image2.png diff --git a/content/posts/databases/lecture-06/images/e7e51c5c8348272d6f542e909275cded.png b/content/posts/databases/lecture-06/images/image3.png similarity index 100% rename from content/posts/databases/lecture-06/images/e7e51c5c8348272d6f542e909275cded.png rename to content/posts/databases/lecture-06/images/image3.png diff --git a/content/posts/databases/lecture-06/images/1940b2be327bb35379c88b8d2405e452.png b/content/posts/databases/lecture-06/images/image4.png similarity index 100% rename from content/posts/databases/lecture-06/images/1940b2be327bb35379c88b8d2405e452.png rename to content/posts/databases/lecture-06/images/image4.png diff --git a/content/posts/databases/lecture-06/images/c479c6b178d8c8f3a7d346196a0255a2.png b/content/posts/databases/lecture-06/images/image5.png similarity index 100% rename from content/posts/databases/lecture-06/images/c479c6b178d8c8f3a7d346196a0255a2.png rename to content/posts/databases/lecture-06/images/image5.png diff --git a/content/posts/databases/lecture-06/images/87766084230397aeeafc76f10256cee3.png b/content/posts/databases/lecture-06/images/image6.png similarity index 100% rename from content/posts/databases/lecture-06/images/87766084230397aeeafc76f10256cee3.png rename to content/posts/databases/lecture-06/images/image6.png diff --git a/content/posts/databases/lecture-06/index.md b/content/posts/databases/lecture-06/index.md index 7fda291..9a88e73 100644 --- a/content/posts/databases/lecture-06/index.md +++ b/content/posts/databases/lecture-06/index.md @@ -6,7 +6,7 @@ tags: - Базы Данных - 3 Семестр -description: Лекция 6 +description: Индексы как способ ускорить поиск и выборку данных из таблиц. Рассматриваются их устройство и роль в поддержании ограничений целостности вроде UNIQUE и PRIMARY KEY. authors: - name: notakeith avatar: https://avatars.githubusercontent.com/u/108391756?v=4 @@ -65,7 +65,7 @@ authors: ## B-tree -![](images/619554285754008fa09b0347d5ff3f18.png) +![](images/image1.png) ### Свойства @@ -87,7 +87,7 @@ authors: - **Дубликаты «схлопываются»** в одну индексную запись, содержащую ключ и список табличных идентификаторов. - Уникальные индексы могут содержать дубликаты ключей из-за **многоверсионности** (MVCC), поскольку индекс хранит ссылки на все версии табличных строк. -![](images/9d3347c422aeeb7c0a08202924943e6f.png) +![](images/image2.png) --- @@ -100,7 +100,7 @@ GiST — **не конкретный тип индекса, а фреймвор - Идея R-дерева: плоскость разбивается на прямоугольники, которые в сумме покрывают все индексируемые точки. - Индексная запись хранит **ограничивающий прямоугольник**, а предикат можно сформулировать так: точка лежит внутри данного ограничивающего прямоугольника. -![](images/e7e51c5c8348272d6f542e909275cded.png) +![](images/image3.png) Типичный запрос, ускоряемый таким индексом, — получить все точки, входящие в заданную область. @@ -108,7 +108,7 @@ GiST — **не конкретный тип индекса, а фреймвор GiST позволяет эффективно искать $k$ ближайших соседей к заданной точке. -![](images/1940b2be327bb35379c88b8d2405e452.png) +![](images/image4.png) ### RD-дерево для полнотекстового поиска @@ -129,7 +129,7 @@ R-дерево как таковое не годится для индексац #### Сигнатурное дерево -![](images/c479c6b178d8c8f3a7d346196a0255a2.png) +![](images/image5.png) Используется **фильтр Блума**. Каждую лексему можно представить **сигнатурой** — битовой строкой определённой длины, в которой все биты равны нулю, кроме одного, который равен единице. Номер установленного бита определяется значением хеш-функции от лексемы. @@ -145,4 +145,4 @@ R-дерево как таковое не годится для индексац Тип индексной структуры, предназначенной для работы с **коллекциями данных** и для быстрого поиска по составным структурам. Особенно эффективен, когда одно поле содержит множество значений (массивы, JSON, `tsvector`). -![](images/87766084230397aeeafc76f10256cee3.png) +![](images/image6.png) diff --git a/content/posts/databases/lecture-07/images/4717a2e7b0de60f5444d861705851a10.png b/content/posts/databases/lecture-07/images/image1.png similarity index 100% rename from content/posts/databases/lecture-07/images/4717a2e7b0de60f5444d861705851a10.png rename to content/posts/databases/lecture-07/images/image1.png diff --git a/content/posts/databases/lecture-07/images/9d933ad7cbbb2edc31587d6e64a4ff5d.png b/content/posts/databases/lecture-07/images/image2.png similarity index 100% rename from content/posts/databases/lecture-07/images/9d933ad7cbbb2edc31587d6e64a4ff5d.png rename to content/posts/databases/lecture-07/images/image2.png diff --git a/content/posts/databases/lecture-07/index.md b/content/posts/databases/lecture-07/index.md index 85dffa3..c9c0a34 100644 --- a/content/posts/databases/lecture-07/index.md +++ b/content/posts/databases/lecture-07/index.md @@ -6,7 +6,7 @@ tags: - Базы Данных - 3 Семестр -description: Лекция 7 +description: Транзакции и свойства ACID, которые гарантируют надёжность операций с базой данных. Разбираются атомарность, согласованность, изолированность и устойчивость на конкретных примерах. authors: - name: notakeith avatar: https://avatars.githubusercontent.com/u/108391756?v=4 diff --git a/content/posts/databases/lecture-08/images/df5677efd88b75a36bd16274c2a02052.png b/content/posts/databases/lecture-08/images/image1.png similarity index 100% rename from content/posts/databases/lecture-08/images/df5677efd88b75a36bd16274c2a02052.png rename to content/posts/databases/lecture-08/images/image1.png diff --git a/content/posts/databases/lecture-08/images/e84e262cfa7780e66ba632762bf8c6e1.png b/content/posts/databases/lecture-08/images/image2.png similarity index 100% rename from content/posts/databases/lecture-08/images/e84e262cfa7780e66ba632762bf8c6e1.png rename to content/posts/databases/lecture-08/images/image2.png diff --git a/content/posts/databases/lecture-08/index.md b/content/posts/databases/lecture-08/index.md index 65a64c6..a4d279e 100644 --- a/content/posts/databases/lecture-08/index.md +++ b/content/posts/databases/lecture-08/index.md @@ -6,7 +6,7 @@ tags: - Базы Данных - 3 Семестр -description: Лекция 8 +description: Внутреннее устройство хранения данных на примере хеш-таблицы как движка с append-only логом. Показывается, как ключи отображаются на смещения в файле для быстрого доступа. authors: - name: notakeith avatar: https://avatars.githubusercontent.com/u/108391756?v=4 @@ -23,7 +23,7 @@ authors: - Данные хранятся в файле, в который можно только дописывать в конец (**append-only log**). - В оперативной памяти хранится хеш-таблица (словарь): **ключ → смещение (offset) в файле данных**. -![](images/df5677efd88b75a36bd16274c2a02052.png) +![](images/image1.png) **Запись:** добавляем пару «ключ-значение» в конец файла и обновляем хеш-таблицу. **Чтение:** по ключу находим смещение в хеш-таблице, переходим по нему в файле и читаем значение. @@ -44,7 +44,7 @@ authors: - Объединение нескольких небольших сегментов в один новый. - Позволяет уменьшить общее количество сегментов. -![](images/e84e262cfa7780e66ba632762bf8c6e1.png) +![](images/image2.png) ### Алгоритм чтения diff --git a/content/posts/databases/lecture-09/images/fb250343b86f11f9baff19291ad888d2.png b/content/posts/databases/lecture-09/images/image1.png similarity index 100% rename from content/posts/databases/lecture-09/images/fb250343b86f11f9baff19291ad888d2.png rename to content/posts/databases/lecture-09/images/image1.png diff --git a/content/posts/databases/lecture-09/images/0449f33b2b4834f9150cf3e048e3a2e5.png b/content/posts/databases/lecture-09/images/image2.png similarity index 100% rename from content/posts/databases/lecture-09/images/0449f33b2b4834f9150cf3e048e3a2e5.png rename to content/posts/databases/lecture-09/images/image2.png diff --git a/content/posts/databases/lecture-09/images/6a086c9c87cb24c7ef8c4f35227a5ca6.png b/content/posts/databases/lecture-09/images/image3.png similarity index 100% rename from content/posts/databases/lecture-09/images/6a086c9c87cb24c7ef8c4f35227a5ca6.png rename to content/posts/databases/lecture-09/images/image3.png diff --git a/content/posts/databases/lecture-09/images/fbf689de60343522af75b41563fa84f3.png b/content/posts/databases/lecture-09/images/image4.png similarity index 100% rename from content/posts/databases/lecture-09/images/fbf689de60343522af75b41563fa84f3.png rename to content/posts/databases/lecture-09/images/image4.png diff --git a/content/posts/databases/lecture-09/index.md b/content/posts/databases/lecture-09/index.md index b34bbbe..9a638e9 100644 --- a/content/posts/databases/lecture-09/index.md +++ b/content/posts/databases/lecture-09/index.md @@ -6,7 +6,7 @@ tags: - Базы Данных - 3 Семестр -description: Лекция 9 +description: Этапы выполнения SQL-запроса — от лексического и синтаксического разбора до плана выполнения. Разбирается команда EXPLAIN как инструмент анализа работы запроса. authors: - name: notakeith avatar: https://avatars.githubusercontent.com/u/108391756?v=4 @@ -189,13 +189,13 @@ authors: - Реализация использует **динамически расширяемую хеш-таблицу** с разрешением коллизий цепочками (как для буферного кеша). - Очень эффективно для больших наборов данных. При достаточном объёме оперативной памяти требует **однократного просмотра** двух наборов данных — то есть имеет **линейную сложность**. -![](images/fb250343b86f11f9baff19291ad888d2.png) +![](images/image1.png) -![](images/0449f33b2b4834f9150cf3e048e3a2e5.png) +![](images/image2.png) #### Соединение хешированием в параллельных планах -![](images/6a086c9c87cb24c7ef8c4f35227a5ca6.png) +![](images/image3.png) ### Соединение слиянием (Merge Join) @@ -203,7 +203,7 @@ authors: - Входной набор может оказаться уже отсортированным в результате индексного сканирования или быть отсортирован явно. - Используются алгоритмы: быстрая сортировка, частичная пирамидальная сортировка, **внешняя сортировка слиянием** (если данные не помещаются в память). -![](images/fbf689de60343522af75b41563fa84f3.png) +![](images/image4.png) ### Соединение вложенным циклом (Nested Loop Join) diff --git a/content/posts/databases/lecture-10/images/6d93f9e7413f9373bd4ca1e7c0c3dd65.jpg b/content/posts/databases/lecture-10/images/image1.jpg similarity index 100% rename from content/posts/databases/lecture-10/images/6d93f9e7413f9373bd4ca1e7c0c3dd65.jpg rename to content/posts/databases/lecture-10/images/image1.jpg diff --git a/content/posts/databases/lecture-10/images/7936d56cd41e67ca9f0124429541c55d.jpg b/content/posts/databases/lecture-10/images/image2.jpg similarity index 100% rename from content/posts/databases/lecture-10/images/7936d56cd41e67ca9f0124429541c55d.jpg rename to content/posts/databases/lecture-10/images/image2.jpg diff --git a/content/posts/databases/lecture-10/images/3bc2253a66e0928abedf5c0bbe5ef244.jpg b/content/posts/databases/lecture-10/images/image3.jpg similarity index 100% rename from content/posts/databases/lecture-10/images/3bc2253a66e0928abedf5c0bbe5ef244.jpg rename to content/posts/databases/lecture-10/images/image3.jpg diff --git a/content/posts/databases/lecture-10/index.md b/content/posts/databases/lecture-10/index.md index b170cc8..4fc4815 100644 --- a/content/posts/databases/lecture-10/index.md +++ b/content/posts/databases/lecture-10/index.md @@ -4,7 +4,7 @@ date: 2025-11-07 tags: - Базы Данных - 3 Семестр -description: Лекция 10 +description: Понятие безопасной системы и модель CIA Triad — конфиденциальность, целостность и доступность. Разбираются угрозы и подходы к защите данных в СУБД. authors: - name: notakeith avatar: https://avatars.githubusercontent.com/u/108391756?v=4 @@ -31,7 +31,7 @@ authors: - **Аутентификация** — процесс, когда пользователь вводит ключ (пароль, пин-код и т.п.), подтверждая своё право на доступ к учётной записи. - **Авторизация** — процесс определения того, какие действия позволено совершать аутентифицированному пользователю. -![](images/6d93f9e7413f9373bd4ca1e7c0c3dd65.jpg) +![](images/image1.jpg) ## Факторы идентификации (аутентификации) @@ -45,7 +45,7 @@ authors: ## Авторизация -![](images/7936d56cd41e67ca9f0124429541c55d.jpg) +![](images/image2.jpg) --- @@ -156,7 +156,7 @@ ALTER {obj} OWNER TO {role1}; ## Мандатная модель доступа (MAC) -![](images/3bc2253a66e0928abedf5c0bbe5ef244.jpg) +![](images/image3.jpg) **Mandatory Access Control (MAC)** используется в системах, где требуется высший уровень безопасности и централизованный контроль. В отличие от дискреционной модели, где владелец решает, кому предоставить доступ, в MAC доступ определяется **системными политиками**. diff --git a/content/posts/databases/lecture-11/index.md b/content/posts/databases/lecture-11/index.md index 376a9cf..0f1a087 100644 --- a/content/posts/databases/lecture-11/index.md +++ b/content/posts/databases/lecture-11/index.md @@ -4,7 +4,7 @@ date: 2025-11-21 tags: - Базы Данных - 3 Семестр -description: Лекция 11 +description: Устройство распределённых баз данных и трёхзвенная архитектура из клиента, бэкенда и БД. Рассматриваются подходы к масштабированию и особенности работы с данными в распределённой среде. authors: - name: notakeith avatar: https://avatars.githubusercontent.com/u/108391756?v=4 diff --git a/content/posts/interpreter/_index.md b/content/posts/interpreter/_index.md index 6a8df25..6c504c9 100644 --- a/content/posts/interpreter/_index.md +++ b/content/posts/interpreter/_index.md @@ -2,6 +2,7 @@ title: "Строим интерпретатор" description: "Перевод статей Руслана Спивака" accent: 6 +author: notakeith generate: pdf: false ai: false diff --git a/content/posts/interpreter/interpreter-1/index.md b/content/posts/interpreter/lecture-01/index.md similarity index 99% rename from content/posts/interpreter/interpreter-1/index.md rename to content/posts/interpreter/lecture-01/index.md index 528caaa..5f97efb 100644 --- a/content/posts/interpreter/interpreter-1/index.md +++ b/content/posts/interpreter/lecture-01/index.md @@ -1,14 +1,13 @@ --- title: Часть 1 description: Давайте построим простой интерпретатор. -date: 2025-05-08 - +weight: 1 tags: - Материалы ОП - -author: rspivak -avatar: https://avatars.githubusercontent.com/u/56723?v=4 -authorlink: https://github.com/rspivak +authors: + - name: rspivak + avatar: https://avatars.githubusercontent.com/u/56723?v=4 + link: https://github.com/rspivak --- **Материалы ОП** diff --git a/content/posts/interpreter/interpreter-2/index.md b/content/posts/interpreter/lecture-02/index.md similarity index 99% rename from content/posts/interpreter/interpreter-2/index.md rename to content/posts/interpreter/lecture-02/index.md index c9e365b..9e5b6a1 100644 --- a/content/posts/interpreter/interpreter-2/index.md +++ b/content/posts/interpreter/lecture-02/index.md @@ -1,12 +1,13 @@ --- title: Часть 2 description: Давайте построим простой интерпретатор. -date: 2025-05-08 +weight: 2 tags: - Материалы ОП -author: rspivak -avatar: https://avatars.githubusercontent.com/u/56723?v=4 -authorlink: https://github.com/rspivak +authors: + - name: rspivak + avatar: https://avatars.githubusercontent.com/u/56723?v=4 + link: https://github.com/rspivak --- **Материалы ОП** diff --git a/content/posts/interpreter/interpreter-3/index.md b/content/posts/interpreter/lecture-03/index.md similarity index 99% rename from content/posts/interpreter/interpreter-3/index.md rename to content/posts/interpreter/lecture-03/index.md index b124da3..35c5963 100644 --- a/content/posts/interpreter/interpreter-3/index.md +++ b/content/posts/interpreter/lecture-03/index.md @@ -1,12 +1,13 @@ --- title: Часть 3 description: Давайте построим простой интерпретатор. -date: 2025-05-08 +weight: 3 tags: - Материалы ОП -author: rspivak -avatar: https://avatars.githubusercontent.com/u/56723?v=4 -authorlink: https://github.com/rspivak +authors: + - name: rspivak + avatar: https://avatars.githubusercontent.com/u/56723?v=4 + link: https://github.com/rspivak --- **Материалы ОП** diff --git a/content/posts/interpreter/interpreter-4/index.md b/content/posts/interpreter/lecture-04/index.md similarity index 99% rename from content/posts/interpreter/interpreter-4/index.md rename to content/posts/interpreter/lecture-04/index.md index f0b742e..14dee01 100644 --- a/content/posts/interpreter/interpreter-4/index.md +++ b/content/posts/interpreter/lecture-04/index.md @@ -1,12 +1,13 @@ --- title: Часть 4 description: Давайте построим простой интерпретатор. -date: 2025-05-08 +weight: 4 tags: - Материалы ОП -author: rspivak -avatar: https://avatars.githubusercontent.com/u/56723?v=4 -authorlink: https://github.com/rspivak +authors: + - name: rspivak + avatar: https://avatars.githubusercontent.com/u/56723?v=4 + link: https://github.com/rspivak --- **Материалы ОП** diff --git a/content/posts/interpreter/interpreter-5/index.md b/content/posts/interpreter/lecture-05/index.md similarity index 99% rename from content/posts/interpreter/interpreter-5/index.md rename to content/posts/interpreter/lecture-05/index.md index ff88d44..705206b 100644 --- a/content/posts/interpreter/interpreter-5/index.md +++ b/content/posts/interpreter/lecture-05/index.md @@ -1,12 +1,13 @@ --- title: Часть 5 description: Давайте построим простой интерпретатор. -date: 2025-05-08 +weight: 5 tags: - Материалы ОП -author: rspivak -avatar: https://avatars.githubusercontent.com/u/56723?v=4 -authorlink: https://github.com/rspivak +authors: + - name: rspivak + avatar: https://avatars.githubusercontent.com/u/56723?v=4 + link: https://github.com/rspivak --- **Материалы ОП** diff --git a/content/posts/interpreter/interpreter-6/index.md b/content/posts/interpreter/lecture-06/index.md similarity index 98% rename from content/posts/interpreter/interpreter-6/index.md rename to content/posts/interpreter/lecture-06/index.md index ccbbc1a..fc66f84 100644 --- a/content/posts/interpreter/interpreter-6/index.md +++ b/content/posts/interpreter/lecture-06/index.md @@ -1,12 +1,13 @@ --- title: Часть 6 description: Давайте построим простой интерпретатор. -date: 2025-05-08 +weight: 6 tags: - Материалы ОП -author: rspivak -avatar: https://avatars.githubusercontent.com/u/56723?v=4 -authorlink: https://github.com/rspivak +authors: + - name: rspivak + avatar: https://avatars.githubusercontent.com/u/56723?v=4 + link: https://github.com/rspivak --- **Материалы ОП** diff --git a/content/posts/interpreter/interpreter-7/index.md b/content/posts/interpreter/lecture-07/index.md similarity index 99% rename from content/posts/interpreter/interpreter-7/index.md rename to content/posts/interpreter/lecture-07/index.md index 2dc2bff..87a79e9 100644 --- a/content/posts/interpreter/interpreter-7/index.md +++ b/content/posts/interpreter/lecture-07/index.md @@ -1,12 +1,13 @@ --- title: Часть 7 description: Давайте построим простой интерпретатор. -date: 2025-05-08 +weight: 7 tags: - Материалы ОП -author: rspivak -avatar: https://avatars.githubusercontent.com/u/56723?v=4 -authorlink: https://github.com/rspivak +authors: + - name: rspivak + avatar: https://avatars.githubusercontent.com/u/56723?v=4 + link: https://github.com/rspivak --- **Материалы ОП** diff --git a/content/posts/interpreter/interpreter-8/index.md b/content/posts/interpreter/lecture-08/index.md similarity index 98% rename from content/posts/interpreter/interpreter-8/index.md rename to content/posts/interpreter/lecture-08/index.md index 3f4e426..0514625 100644 --- a/content/posts/interpreter/interpreter-8/index.md +++ b/content/posts/interpreter/lecture-08/index.md @@ -1,12 +1,13 @@ --- title: Часть 8 description: Давайте построим простой интерпретатор. -date: 2025-05-08 +weight: 8 tags: - Материалы ОП -author: rspivak -avatar: https://avatars.githubusercontent.com/u/56723?v=4 -authorlink: https://github.com/rspivak +authors: + - name: rspivak + avatar: https://avatars.githubusercontent.com/u/56723?v=4 + link: https://github.com/rspivak --- **Материалы ОП** diff --git a/content/posts/interpreter/interpreter-9/index.md b/content/posts/interpreter/lecture-09/index.md similarity index 99% rename from content/posts/interpreter/interpreter-9/index.md rename to content/posts/interpreter/lecture-09/index.md index ce192ea..6ca953a 100644 --- a/content/posts/interpreter/interpreter-9/index.md +++ b/content/posts/interpreter/lecture-09/index.md @@ -1,12 +1,13 @@ --- title: Часть 9 description: Давайте построим простой интерпретатор. -date: 2025-05-08 +weight: 9 tags: - Материалы ОП -author: rspivak -avatar: https://avatars.githubusercontent.com/u/56723?v=4 -authorlink: https://github.com/rspivak +authors: + - name: rspivak + avatar: https://avatars.githubusercontent.com/u/56723?v=4 + link: https://github.com/rspivak --- diff --git a/content/posts/interpreter/interpreter-10/index.md b/content/posts/interpreter/lecture-10/index.md similarity index 99% rename from content/posts/interpreter/interpreter-10/index.md rename to content/posts/interpreter/lecture-10/index.md index f109411..d4199b0 100644 --- a/content/posts/interpreter/interpreter-10/index.md +++ b/content/posts/interpreter/lecture-10/index.md @@ -1,14 +1,13 @@ --- title: Часть 10 description: Давайте построим простой интерпретатор. -date: 2025-05-08 - +weight: 10 tags: - Материалы ОП - -author: rspivak -avatar: https://avatars.githubusercontent.com/u/56723?v=4 -authorlink: https://github.com/rspivak +authors: + - name: rspivak + avatar: https://avatars.githubusercontent.com/u/56723?v=4 + link: https://github.com/rspivak --- diff --git a/content/posts/interpreter/interpreter-11/index.md b/content/posts/interpreter/lecture-11/index.md similarity index 99% rename from content/posts/interpreter/interpreter-11/index.md rename to content/posts/interpreter/lecture-11/index.md index 31570db..3317cc5 100644 --- a/content/posts/interpreter/interpreter-11/index.md +++ b/content/posts/interpreter/lecture-11/index.md @@ -1,14 +1,13 @@ --- title: Часть 11 description: Давайте построим простой интерпретатор. -date: 2025-05-08 - +weight: 11 tags: - Материалы ОП - -author: rspivak -avatar: https://avatars.githubusercontent.com/u/56723?v=4 -authorlink: https://github.com/rspivak +authors: + - name: rspivak + avatar: https://avatars.githubusercontent.com/u/56723?v=4 + link: https://github.com/rspivak --- diff --git a/content/posts/interpreter/interpreter-12/index.md b/content/posts/interpreter/lecture-12/index.md similarity index 98% rename from content/posts/interpreter/interpreter-12/index.md rename to content/posts/interpreter/lecture-12/index.md index 7787321..d9f7ca4 100644 --- a/content/posts/interpreter/interpreter-12/index.md +++ b/content/posts/interpreter/lecture-12/index.md @@ -1,14 +1,13 @@ --- title: Часть 12 description: Давайте построим простой интерпретатор. -date: 2025-05-08 - +weight: 12 tags: - Материалы ОП - -author: rspivak -avatar: https://avatars.githubusercontent.com/u/56723?v=4 -authorlink: https://github.com/rspivak +authors: + - name: rspivak + avatar: https://avatars.githubusercontent.com/u/56723?v=4 + link: https://github.com/rspivak --- diff --git a/content/posts/interpreter/interpreter-13/index.md b/content/posts/interpreter/lecture-13/index.md similarity index 99% rename from content/posts/interpreter/interpreter-13/index.md rename to content/posts/interpreter/lecture-13/index.md index 4c569fc..3d1225f 100644 --- a/content/posts/interpreter/interpreter-13/index.md +++ b/content/posts/interpreter/lecture-13/index.md @@ -1,14 +1,13 @@ --- title: Часть 13 description: Давайте построим простой интерпретатор. -date: 2025-05-08 - +weight: 13 tags: - Материалы ОП - -author: rspivak -avatar: https://avatars.githubusercontent.com/u/56723?v=4 -authorlink: https://github.com/rspivak +authors: + - name: rspivak + avatar: https://avatars.githubusercontent.com/u/56723?v=4 + link: https://github.com/rspivak --- diff --git a/content/posts/interpreter/interpreter-14/index.md b/content/posts/interpreter/lecture-14/index.md similarity index 99% rename from content/posts/interpreter/interpreter-14/index.md rename to content/posts/interpreter/lecture-14/index.md index 62eea5d..2581e65 100644 --- a/content/posts/interpreter/interpreter-14/index.md +++ b/content/posts/interpreter/lecture-14/index.md @@ -1,12 +1,13 @@ --- title: Часть 14 description: Давайте построим простой интерпретатор. -date: 2025-05-08 +weight: 14 tags: - Материалы ОП -author: rspivak -avatar: https://avatars.githubusercontent.com/u/56723?v=4 -authorlink: https://github.com/rspivak +authors: + - name: rspivak + avatar: https://avatars.githubusercontent.com/u/56723?v=4 + link: https://github.com/rspivak --- diff --git a/content/posts/interpreter/interpreter-15/index.md b/content/posts/interpreter/lecture-15/index.md similarity index 99% rename from content/posts/interpreter/interpreter-15/index.md rename to content/posts/interpreter/lecture-15/index.md index 202072a..3e321ec 100644 --- a/content/posts/interpreter/interpreter-15/index.md +++ b/content/posts/interpreter/lecture-15/index.md @@ -1,12 +1,13 @@ --- title: Часть 15 description: Давайте построим простой интерпретатор. -date: 2025-05-08 +weight: 15 tags: - Материалы ОП -author: rspivak -avatar: https://avatars.githubusercontent.com/u/56723?v=4 -authorlink: https://github.com/rspivak +authors: + - name: rspivak + avatar: https://avatars.githubusercontent.com/u/56723?v=4 + link: https://github.com/rspivak --- diff --git a/content/posts/interpreter/interpreter-16/index.md b/content/posts/interpreter/lecture-16/index.md similarity index 99% rename from content/posts/interpreter/interpreter-16/index.md rename to content/posts/interpreter/lecture-16/index.md index c749710..1a91321 100644 --- a/content/posts/interpreter/interpreter-16/index.md +++ b/content/posts/interpreter/lecture-16/index.md @@ -1,12 +1,13 @@ --- title: Часть 16 description: Давайте построим простой интерпретатор. -date: 2025-05-08 +weight: 16 tags: - Материалы ОП -author: rspivak -avatar: https://avatars.githubusercontent.com/u/56723?v=4 -authorlink: https://github.com/rspivak +authors: + - name: rspivak + avatar: https://avatars.githubusercontent.com/u/56723?v=4 + link: https://github.com/rspivak --- diff --git a/content/posts/interpreter/interpreter-17/index.md b/content/posts/interpreter/lecture-17/index.md similarity index 99% rename from content/posts/interpreter/interpreter-17/index.md rename to content/posts/interpreter/lecture-17/index.md index 9a8d2ff..a7de54e 100644 --- a/content/posts/interpreter/interpreter-17/index.md +++ b/content/posts/interpreter/lecture-17/index.md @@ -1,12 +1,13 @@ --- title: Часть 17 description: Давайте построим простой интерпретатор. -date: 2025-05-08 +weight: 17 tags: - Материалы ОП -author: rspivak -avatar: https://avatars.githubusercontent.com/u/56723?v=4 -authorlink: https://github.com/rspivak +authors: + - name: rspivak + avatar: https://avatars.githubusercontent.com/u/56723?v=4 + link: https://github.com/rspivak --- diff --git a/content/posts/interpreter/interpreter-18/index.md b/content/posts/interpreter/lecture-18/index.md similarity index 99% rename from content/posts/interpreter/interpreter-18/index.md rename to content/posts/interpreter/lecture-18/index.md index 8b45809..2e53bfb 100644 --- a/content/posts/interpreter/interpreter-18/index.md +++ b/content/posts/interpreter/lecture-18/index.md @@ -1,12 +1,13 @@ --- title: Часть 18 description: Давайте построим простой интерпретатор. -date: 2025-05-08 +weight: 18 tags: - Материалы ОП -author: rspivak -avatar: https://avatars.githubusercontent.com/u/56723?v=4 -authorlink: https://github.com/rspivak +authors: + - name: rspivak + avatar: https://avatars.githubusercontent.com/u/56723?v=4 + link: https://github.com/rspivak --- diff --git a/content/posts/java/_index.md b/content/posts/java/_index.md index 50f0e24..458877d 100644 --- a/content/posts/java/_index.md +++ b/content/posts/java/_index.md @@ -1,17 +1,23 @@ --- title: "Технологии программирования на Java" -description: "Макаревич Роман Дмитриевич" +teacher: "Макаревич Роман Дмитриевич" semester: 4 +accent: 1 +noteType: ai-pro +aiModel: "Claude Opus 4.8" +aiSource: "презентации" +academicYear: 2025/26 +author: notakeith --- Конспекты, составленные по презентациям... - + {{< icon "cloud-download-outline" >}} Лекции .pdf - + {{< icon "code-slash-outline" >}} Контекст для LLM diff --git a/content/posts/java/lecture-01/index.md b/content/posts/java/lecture-01/index.md index 70a7ba1..d95d150 100644 --- a/content/posts/java/lecture-01/index.md +++ b/content/posts/java/lecture-01/index.md @@ -1,6 +1,6 @@ --- -title: Лекция 1 -description: Вводная лекция Java и JVM +title: Введение +description: Знакомство с курсом Java — устройство виртуальной машины, ООП, обработка ошибок и Generics. Обозначен план курса вплоть до коллекций, функционального программирования и работы с базами данных. weight: 1 tags: - Java diff --git a/content/posts/java/lecture-02/index.md b/content/posts/java/lecture-02/index.md index f2a3b2d..ecd5900 100644 --- a/content/posts/java/lecture-02/index.md +++ b/content/posts/java/lecture-02/index.md @@ -1,6 +1,6 @@ --- -title: Лекция 2 -description: Сборка мусора (Garbage Collection) +title: Garbage Collection +description: Сборка мусора как автоматическое управление памятью в managed-языках. Объясняется проблема утечек памяти в языках вроде C/C++ и то, как GC решает её без ручного delete/free. weight: 2 tags: - Java diff --git a/content/posts/java/lecture-03/index.md b/content/posts/java/lecture-03/index.md index d044456..299e810 100644 --- a/content/posts/java/lecture-03/index.md +++ b/content/posts/java/lecture-03/index.md @@ -1,6 +1,6 @@ --- -title: Лекция 3 -description: Collection Framework и Stream API +title: Коллекции +description: Пакеты Java и организация классов, а также Collection Framework и Stream API. Разбирается, как устроены коллекции и потоковая обработка данных в Java. weight: 3 tags: - Java diff --git a/content/posts/java/lecture-04/index.md b/content/posts/java/lecture-04/index.md index da5b0cf..6f57eef 100644 --- a/content/posts/java/lecture-04/index.md +++ b/content/posts/java/lecture-04/index.md @@ -1,6 +1,6 @@ --- -title: Лекция 4 -description: Системы сборки +title: Системы сборки +description: Зачем нужна автоматизация сборки в больших Java-проектах с десятками модулей и сотнями библиотек. Объясняется, почему ручное описание сценариев сборки становится непрактичным. weight: 4 tags: - Java diff --git a/content/posts/java/lecture-05/index.md b/content/posts/java/lecture-05/index.md index 215ab27..833a4b7 100644 --- a/content/posts/java/lecture-05/index.md +++ b/content/posts/java/lecture-05/index.md @@ -1,6 +1,6 @@ --- -title: Лекция 5 -description: Работа с базами данных (JDBC и JPA) +title: JDBC и JPA +description: Работа с базами данных через JDBC и JPA в контексте трёхуровневой архитектуры Java EE приложений. Рассматриваются клиентский уровень, бизнес-логика и уровень доступа к данным. weight: 5 tags: - Java diff --git a/content/posts/java/lecture-06/index.md b/content/posts/java/lecture-06/index.md index e642504..68ce27d 100644 --- a/content/posts/java/lecture-06/index.md +++ b/content/posts/java/lecture-06/index.md @@ -1,6 +1,6 @@ --- -title: Лекция 6 -description: Spring Framework +title: Spring Framework +description: Введение в Spring Framework как open-source платформу для языков семейства JVM. Обозначены его основные возможности и место в экосистеме Java-разработки. weight: 6 tags: - Java diff --git a/content/posts/java/lecture-07/index.md b/content/posts/java/lecture-07/index.md index c435d39..fa28769 100644 --- a/content/posts/java/lecture-07/index.md +++ b/content/posts/java/lecture-07/index.md @@ -1,6 +1,6 @@ --- -title: Лекция 7 -description: Spring AOP +title: Spring AOP +description: Аспектно-ориентированное программирование и выделение сквозной функциональности вроде логирования и транзакций. Разбираются ключевые понятия Spring AOP, включая join point. weight: 7 tags: - Java diff --git a/content/posts/java/lecture-08/index.md b/content/posts/java/lecture-08/index.md index e8c168a..63fe4d8 100644 --- a/content/posts/java/lecture-08/index.md +++ b/content/posts/java/lecture-08/index.md @@ -1,6 +1,6 @@ --- -title: Лекция 8 -description: Spring MVC +title: Spring MVC +description: Модуль Spring MVC и реализация паттерна Model-View-Controller через слабосвязанные компоненты. Разбирается назначение каждой части паттерна в веб-приложении. weight: 8 tags: - Java diff --git a/content/posts/java/lecture-09/index.md b/content/posts/java/lecture-09/index.md index 92641d4..625b9d2 100644 --- a/content/posts/java/lecture-09/index.md +++ b/content/posts/java/lecture-09/index.md @@ -1,6 +1,6 @@ --- -title: Лекция 9 -description: Spring Boot +title: Spring Boot +description: Spring Boot как надстройка, упрощающая настройку Spring за счёт автоматизации конфигураций. Объясняется, какие проблемы обычного Spring — обилие зависимостей и XML-конфигов — он решает. weight: 9 tags: - Java diff --git a/content/posts/java/lecture-10/index.md b/content/posts/java/lecture-10/index.md index c814912..f429a66 100644 --- a/content/posts/java/lecture-10/index.md +++ b/content/posts/java/lecture-10/index.md @@ -1,6 +1,6 @@ --- -title: Лекция 10 -description: Spring Data JPA +title: Spring Data JPA +description: Spring Data как удобный механизм работы с сущностями БД через репозитории. Показывается, как объявление интерфейса без реализации избавляет от написания шаблонного кода доступа к данным. weight: 10 tags: - Java diff --git a/content/posts/java/lecture-11/index.md b/content/posts/java/lecture-11/index.md index edb1c18..d971288 100644 --- a/content/posts/java/lecture-11/index.md +++ b/content/posts/java/lecture-11/index.md @@ -1,6 +1,6 @@ --- -title: Лекция 11 -description: Spring Security +title: Spring Security +description: Механизмы аутентификации и авторизации в Spring Security для корпоративных приложений. Разбирается архитектура цепочки фильтров, обрабатывающих каждый HTTP-запрос. weight: 11 tags: - Java diff --git a/content/posts/java/lecture-12/index.md b/content/posts/java/lecture-12/index.md index c7e4292..11b4c4c 100644 --- a/content/posts/java/lecture-12/index.md +++ b/content/posts/java/lecture-12/index.md @@ -1,6 +1,6 @@ --- -title: Лекция 12 -description: Keycloak +title: Keycloak +description: Современная аутентификация через Keycloak, OAuth 2.0 и OpenID Connect. Рассматривается интеграция со Spring Boot и автоконфигурация нужных бинов. weight: 12 tags: - Java diff --git a/content/posts/java/lecture-13/index.md b/content/posts/java/lecture-13/index.md index a467a58..e70c838 100644 --- a/content/posts/java/lecture-13/index.md +++ b/content/posts/java/lecture-13/index.md @@ -1,6 +1,6 @@ --- -title: Лекция 13 -description: Введение в межсервисное взаимодействие +title: Микросервисы +description: Микросервисная архитектура и преимущества независимого масштабирования сервисов. Обсуждается главная сложность перехода от монолита — изменение механизма взаимодействия компонентов. weight: 13 tags: - Java diff --git a/content/posts/java/lecture-14/index.md b/content/posts/java/lecture-14/index.md index 8a58bd8..fa3a398 100644 --- a/content/posts/java/lecture-14/index.md +++ b/content/posts/java/lecture-14/index.md @@ -1,6 +1,6 @@ --- -title: Лекция 14 -description: Apache Kafka +title: Apache Kafka +description: Apache Kafka как распределённая платформа потоковой обработки событий. Рассматриваются применения — высокопроизводительные пайплайны данных, потоковая аналитика и интеграция систем. weight: 14 tags: - Java diff --git a/content/posts/math-stats/_index.md b/content/posts/math-stats/_index.md index 70eefa3..5a32fad 100644 --- a/content/posts/math-stats/_index.md +++ b/content/posts/math-stats/_index.md @@ -1,11 +1,16 @@ --- title: "Математическая статистика" -description: "Лимар Иван Александрович" +teacher: "Лимар Иван Александрович" semester: 4 accent: 2 generate: pdf: false ai: false +noteType: ai-pro +aiModel: "Claude Opus 4.6" +aiSource: "аудиозапись лекции" +academicYear: 2025/26 +author: notakeith --- Конспекты лекций по Математической статистике **Ивана Александровича Лимара**.\ @@ -17,26 +22,26 @@ generate: Если нашли ошибку или хотите дополнить — открывайте [issue](https://github.com/botaemeveryday/notes/issues/new?template=content-error.md) или [pull request](https://github.com/botaemeveryday/notes/pulls) - + {{< icon "cloud-download-outline" >}} Лекции .pdf - + {{< icon "help-outline" >}} Вопросы экзамена - + {{< icon "document-text-outline" >}} Конспект ТВиМС
- + {{< icon "copy-outline" >}} Карточки Анки - + {{< icon "code-slash-outline" >}} Контекст для LLM diff --git a/content/posts/math-stats/lecture-01/index.md b/content/posts/math-stats/lecture-01/index.md index 2041421..e236512 100644 --- a/content/posts/math-stats/lecture-01/index.md +++ b/content/posts/math-stats/lecture-01/index.md @@ -1,6 +1,6 @@ --- -title: "Лекция 01" -description: "Введение в математическую статистику" +title: "Введение" +description: "Предмет математической статистики в сравнении с теорией вероятностей. Задаётся отправная точка курса и модель простейшей выборки, на которой строятся дальнейшие темы." date: 2026-02-04 tags: diff --git a/content/posts/math-stats/lecture-02/index.md b/content/posts/math-stats/lecture-02/index.md index 2c80f33..c859ace 100644 --- a/content/posts/math-stats/lecture-02/index.md +++ b/content/posts/math-stats/lecture-02/index.md @@ -1,6 +1,6 @@ --- -title: "Лекция 02" -description: "Описательная статистика. Выборочные моменты, квантили и асимптотические свойства" +title: "Описательная статистика" +description: "Выборочные моменты и квантили как инструменты описательной статистики. Рассматриваются их асимптотические свойства на модели простейшей выборки." date: 2026-02-11 tags: diff --git a/content/posts/math-stats/lecture-03/index.md b/content/posts/math-stats/lecture-03/index.md index b52ee77..fbfdf6b 100644 --- a/content/posts/math-stats/lecture-03/index.md +++ b/content/posts/math-stats/lecture-03/index.md @@ -1,6 +1,6 @@ --- -title: "Лекция 03" -description: "Точечное оценивание параметров. Метод моментов" +title: "Метод моментов" +description: "Точечное оценивание параметров распределения на модели простейшей выборки. Разбирается метод моментов как один из базовых способов построения оценок." date: 2026-02-18 tags: diff --git a/content/posts/math-stats/lecture-04/index.md b/content/posts/math-stats/lecture-04/index.md index 260f188..3bd8106 100644 --- a/content/posts/math-stats/lecture-04/index.md +++ b/content/posts/math-stats/lecture-04/index.md @@ -1,6 +1,6 @@ --- -title: "Лекция 04" -description: "Метод максимального правдоподобия и информация Фишера" +title: "Правдоподобие" +description: "Метод максимального правдоподобия и введение информации Фишера. Разбирается контрпример, показывающий, что асимптотическая нормальность оценки не влечёт её асимптотическую несмещённость." date: 2026-02-25 tags: diff --git a/content/posts/math-stats/lecture-05/index.md b/content/posts/math-stats/lecture-05/index.md index a0fd1bb..e90065a 100644 --- a/content/posts/math-stats/lecture-05/index.md +++ b/content/posts/math-stats/lecture-05/index.md @@ -1,6 +1,6 @@ --- -title: "Лекция 05" -description: "Информация Фишера, неравенство Рао–Крамера и доверительные интервалы" +title: "Рао–Крамер" +description: "Информация Фишера и неравенство Рао–Крамера как граница эффективности оценок. Вводится понятие доверительного интервала для оцениваемого параметра." date: 2026-03-04 tags: diff --git a/content/posts/math-stats/lecture-06/index.md b/content/posts/math-stats/lecture-06/index.md index f261e60..7778376 100644 --- a/content/posts/math-stats/lecture-06/index.md +++ b/content/posts/math-stats/lecture-06/index.md @@ -1,6 +1,6 @@ --- -title: "Лекция 06" -description: "Доверительные интервалы и введение в проверку статистических гипотез" +title: "Гипотезы" +description: "Формальное определение доверительного интервала и переход к проверке статистических гипотез. Закладывается терминологическая база для дальнейших тем курса." date: 2026-03-11 tags: diff --git a/content/posts/math-stats/lecture-07/index.md b/content/posts/math-stats/lecture-07/index.md index d0b5d01..f52bce8 100644 --- a/content/posts/math-stats/lecture-07/index.md +++ b/content/posts/math-stats/lecture-07/index.md @@ -1,6 +1,6 @@ --- -title: "Лекция 07" -description: "Проверка статистических гипотез" +title: "Проверка гипотез" +description: "Формальная постановка задачи проверки статистических гипотез, включая нулевую и альтернативную гипотезы. Разбираются базовые понятия критерия и ошибок первого и второго рода." date: 2026-03-18 tags: diff --git a/content/posts/math-stats/lecture-08/index.md b/content/posts/math-stats/lecture-08/index.md index e4f09b1..9b01dc9 100644 --- a/content/posts/math-stats/lecture-08/index.md +++ b/content/posts/math-stats/lecture-08/index.md @@ -1,6 +1,6 @@ --- -title: "Лекция 08" -description: "Статистические критерии (продолжение)" +title: "Критерий о медиане" +description: "Продолжение темы статистических критериев на примере критерия о медиане для одной выборки. Разбирается постановка задачи и построение соответствующего теста." date: 2026-03-25 tags: diff --git a/content/posts/math-stats/lecture-09/index.md b/content/posts/math-stats/lecture-09/index.md index 9fc2add..17c79a0 100644 --- a/content/posts/math-stats/lecture-09/index.md +++ b/content/posts/math-stats/lecture-09/index.md @@ -1,6 +1,6 @@ --- -title: "Лекция 09" -description: "Статистические критерии (продолжение)" +title: "Примеры критериев" +description: "Практическое применение базовых статистических критериев на конкретных задачах. Разбирается, в частности, проверка гипотезы о математическом ожидании на примере честной монеты." date: 2026-04-01 tags: diff --git a/content/posts/math-stats/lecture-10/index.md b/content/posts/math-stats/lecture-10/index.md index 359131a..da87402 100644 --- a/content/posts/math-stats/lecture-10/index.md +++ b/content/posts/math-stats/lecture-10/index.md @@ -1,6 +1,6 @@ --- -title: "Лекция 10" -description: "Статистические тесты" +title: "Тесты" +description: "Статистические тесты на примере критерия для коэффициента корреляции Пирсона. Разбирается постановка задачи и построение проверки гипотезы о наличии линейной связи между переменными." date: 2026-04-08 tags: diff --git a/content/posts/math-stats/lecture-11/index.md b/content/posts/math-stats/lecture-11/index.md index c504528..79d1b9f 100644 --- a/content/posts/math-stats/lecture-11/index.md +++ b/content/posts/math-stats/lecture-11/index.md @@ -1,6 +1,6 @@ --- -title: "Лекция 11" -description: "Линейная регрессия. Метод наименьших квадратов. Теорема Гаусса–Маркова" +title: "Регрессия" +description: "Линейная регрессия и метод наименьших квадратов с точки зрения математической статистики. Разбирается теорема Гаусса–Маркова о наилучшей линейной несмещённой оценке." date: 2026-04-15 tags: diff --git a/content/posts/math-stats/lecture-12/index.md b/content/posts/math-stats/lecture-12/index.md index 70b5614..49395ca 100644 --- a/content/posts/math-stats/lecture-12/index.md +++ b/content/posts/math-stats/lecture-12/index.md @@ -1,6 +1,6 @@ --- -title: "Лекция 12" -description: "Линейная регрессия: доверительные интервалы и проверка гипотез" +title: "Регрессия: интервалы" +description: "Доверительные интервалы и проверка гипотез для коэффициентов линейной регрессионной модели. Продолжается разбор линейной модели, начатый в предыдущей лекции." date: 2026-04-22 tags: diff --git a/content/posts/math-stats/lecture-13/index.md b/content/posts/math-stats/lecture-13/index.md index 731b9e0..f78da70 100644 --- a/content/posts/math-stats/lecture-13/index.md +++ b/content/posts/math-stats/lecture-13/index.md @@ -1,6 +1,6 @@ --- -title: "Лекция 13" -description: "Линейные модели: Однофакторный дисперсионный анализ, метод главных компонент, взвешенный МНК" +title: "Линейные модели" +description: "Расширение линейных моделей — однофакторный дисперсионный анализ, метод главных компонент и взвешенный МНК. Показывается, как эти техники решают частные случаи, где обычный МНК не подходит." date: 2026-04-29 tags: diff --git a/content/posts/math-stats/lecture-14/index.md b/content/posts/math-stats/lecture-14/index.md index db81c9f..53991f9 100644 --- a/content/posts/math-stats/lecture-14/index.md +++ b/content/posts/math-stats/lecture-14/index.md @@ -1,6 +1,6 @@ --- -title: "Лекция 14" -description: "Обобщённые линейные модели и критерий отношения правдоподобия" +title: "GLM" +description: "Обобщённые линейные модели для случаев, когда выходная переменная категориальная, а не количественная. Вводится критерий отношения правдоподобия для проверки гипотез в таких моделях." date: 2026-05-06 tags: diff --git a/content/posts/operation-systems/_index.md b/content/posts/operation-systems/_index.md index 27292a7..1c052c3 100644 --- a/content/posts/operation-systems/_index.md +++ b/content/posts/operation-systems/_index.md @@ -1,16 +1,20 @@ --- title: "Операционные системы" -description: "Маятин Александр Владимирович" +teacher: "Маятин Александр Владимирович" semester: 4 accent: 5 +noteType: human +aiModel: "Claude Opus 4.8" +academicYear: 2025/26 +author: notakeith --- - + {{< icon "cloud-download-outline" >}} Лекции .pdf - + {{< icon "code-slash-outline" >}} Контекст для LLM diff --git a/content/posts/operation-systems/lecture-01/images/Drawing_1.svg b/content/posts/operation-systems/lecture-01/images/image1.svg similarity index 100% rename from content/posts/operation-systems/lecture-01/images/Drawing_1.svg rename to content/posts/operation-systems/lecture-01/images/image1.svg diff --git a/content/posts/operation-systems/lecture-01/images/Drawing_2.svg b/content/posts/operation-systems/lecture-01/images/image2.svg similarity index 100% rename from content/posts/operation-systems/lecture-01/images/Drawing_2.svg rename to content/posts/operation-systems/lecture-01/images/image2.svg diff --git a/content/posts/operation-systems/lecture-01/images/Drawing_3.svg b/content/posts/operation-systems/lecture-01/images/image3.svg similarity index 100% rename from content/posts/operation-systems/lecture-01/images/Drawing_3.svg rename to content/posts/operation-systems/lecture-01/images/image3.svg diff --git a/content/posts/operation-systems/lecture-01/index.md b/content/posts/operation-systems/lecture-01/index.md index f191d34..5a5a09e 100644 --- a/content/posts/operation-systems/lecture-01/index.md +++ b/content/posts/operation-systems/lecture-01/index.md @@ -1,10 +1,14 @@ --- -title: "Лекция 1" -description: "Вводная. Эволюция ОС, этап 1" +title: "Введение" +description: "Вводная лекция курса и первый этап эволюции операционных систем. Обсуждаются фундаментальные компромиссы вроде размена времени на память и то, зачем нужно понимать устройство ОС «под капотом»." date: 2026-02-04 tags: - Операционные-системы - 4 семестр +authors: + - name: notakeith + avatar: https://avatars.githubusercontent.com/u/108391756?v=4 + link: https://github.com/notakeith --- Существовали 4 принципа архитектуры фон Неймана — «люди жили в раю». А потом случилось грехопадение: эти принципы начали нарушать. Ну и что, что фон Нейман сказал, что так надо — давайте не будем так делать. В итоге: **«голову вытянет — хвост увязнет»**. @@ -56,7 +60,7 @@ tags: ### Архитектура фон Неймана -![]() +![]() Если зайти в диспетчер задач, видно сотни процессов. И все эти процессы хотят пользоваться железом… @@ -66,7 +70,7 @@ tags: 3. **Адресность** — каждая ячейка памяти имеет уникальный адрес. 4. **Программное управление** — программа определяет последовательность выполнения. -![]() +![]() ### Этап 1. Подпрограммы, диспетчер, прерывания @@ -95,6 +99,6 @@ tags: Процессор может только давать контроллеру инструкции перегнать данные. Но мы не знаем, закончил ли контроллер перегонку — это ведь физическая штука (магнитная лента, перфокарта…). Нужен механизм оповещения — **прерывание**. Контроллер сообщает процессору, что закончил. -![]() +![]() > **Прерывание** — обращение (сигнал), поступающее от внешнего устройства в центральный процессор, сообщающее о наступлении некоторого события, приостанавливающее исполнение текущего потока команд и передающее управление обработчику этого прерывания. \ No newline at end of file diff --git a/content/posts/operation-systems/lecture-02/images/Drawing_1.svg b/content/posts/operation-systems/lecture-02/images/image1.svg similarity index 100% rename from content/posts/operation-systems/lecture-02/images/Drawing_1.svg rename to content/posts/operation-systems/lecture-02/images/image1.svg diff --git a/content/posts/operation-systems/lecture-02/images/Drawing_2.svg b/content/posts/operation-systems/lecture-02/images/image2.svg similarity index 100% rename from content/posts/operation-systems/lecture-02/images/Drawing_2.svg rename to content/posts/operation-systems/lecture-02/images/image2.svg diff --git a/content/posts/operation-systems/lecture-02/images/Drawing_3.svg b/content/posts/operation-systems/lecture-02/images/image3.svg similarity index 100% rename from content/posts/operation-systems/lecture-02/images/Drawing_3.svg rename to content/posts/operation-systems/lecture-02/images/image3.svg diff --git a/content/posts/operation-systems/lecture-02/images/Drawing_4.svg b/content/posts/operation-systems/lecture-02/images/image4.svg similarity index 100% rename from content/posts/operation-systems/lecture-02/images/Drawing_4.svg rename to content/posts/operation-systems/lecture-02/images/image4.svg diff --git a/content/posts/operation-systems/lecture-02/images/Drawing_5.svg b/content/posts/operation-systems/lecture-02/images/image5.svg similarity index 100% rename from content/posts/operation-systems/lecture-02/images/Drawing_5.svg rename to content/posts/operation-systems/lecture-02/images/image5.svg diff --git a/content/posts/operation-systems/lecture-02/index.md b/content/posts/operation-systems/lecture-02/index.md index fe2e21c..f14fcae 100644 --- a/content/posts/operation-systems/lecture-02/index.md +++ b/content/posts/operation-systems/lecture-02/index.md @@ -1,17 +1,21 @@ --- -title: "Лекция 2" -description: "Этапы 2 и 3 эволюции ОС" +title: "Оверлеи" +description: "Переход от программ-монолитов к структурным программам, модулям и пакетам. Разбирается оверлейное программирование как способ исполнять код, превышающий объём доступной памяти." date: 2026-02-11 tags: - Операционные-системы - 4 семестр +authors: + - name: notakeith + avatar: https://avatars.githubusercontent.com/u/108391756?v=4 + link: https://github.com/notakeith --- ### Структурные программы и пакеты Раньше считалось, что программы — это монолиты. Затем начали появляться **структурные программы**. Теперь можно было дробить работу между разными программистами: кто-то пишет один метод, кто-то — другой. Появились **модули** — это не просто методы, но и связанные с ними данные (например, предрассчитанные таблицы). Из модулей появились **пакеты**. -![](images/Drawing_1.svg) +![](images/image1.svg) ### Оверлейное программирование @@ -33,7 +37,7 @@ tags: > **Марковский процесс** — каждый шаг зависит только от предыдущего состояния. -![](images/Drawing_2.svg) +![](images/image2.svg) #### Кооперативная многозадачность @@ -53,7 +57,7 @@ tags: Нельзя просто так остановиться в любой точке — в регистрах могут быть нужные данные. Появляется понятие **регистрового контекста**. Обработчик прерывания таймера становится не таким простым: нужно не просто перейти к обработке другой программы, но и **выгрузить один контекст и подгрузить другой**. -![](images/Drawing_3.svg) +![](images/image3.svg) Итог: > **Processor Sharing = Таймер прерываний + Регистровый контекст** @@ -116,11 +120,11 @@ tags: Компания **AT&T** взяла кредиты и протянула медные провода по всей США — это была телефонная связь. -![](images/Drawing_4.svg) +![](images/image4.svg) Появился **модем**. -![](images/Drawing_5.svg) +![](images/image5.svg) Но теперь нет умного оператора, который проверял правильность кода и выставлял счёт (bill). Нужно это чем-то заменить. Появляются **аккаунты** и **биллинг**. Как понять, кто именно подключается? Появляется **логический вход (logical login)** и 3 этапа аутентификации: diff --git a/content/posts/operation-systems/lecture-03/index.md b/content/posts/operation-systems/lecture-03/index.md index 3794a9e..2cd7aa1 100644 --- a/content/posts/operation-systems/lecture-03/index.md +++ b/content/posts/operation-systems/lecture-03/index.md @@ -1,10 +1,14 @@ --- -title: "Лекция 3" -description: "Универсальные ОС, UNIX, языки высокого уровня" +title: "Универсальные ОС" +description: "Переход от ОС под конкретное железо к переносимым универсальным операционным системам вроде UNIX. Показывается роль языков высокого уровня в унификации аппаратных платформ." date: 2026-02-18 tags: - Операционные-системы - 4 семестр +authors: + - name: notakeith + avatar: https://avatars.githubusercontent.com/u/108391756?v=4 + link: https://github.com/notakeith --- ### Постепенное нарастание функционала ОС diff --git a/content/posts/operation-systems/lecture-04/index.md b/content/posts/operation-systems/lecture-04/index.md index e08d3cb..c863ca5 100644 --- a/content/posts/operation-systems/lecture-04/index.md +++ b/content/posts/operation-systems/lecture-04/index.md @@ -1,10 +1,14 @@ --- -title: "Лекция 4" -description: "Архитектура ОС. Функциональная архитектура" +title: "Функциональная архитектура" +description: "Роль архитектурных паттернов в развитии больших программных систем на примерах из архитектуры зданий. Вводится понятие функциональной архитектуры операционной системы." date: 2026-02-25 tags: - Операционные-системы - 4 семестр +authors: + - name: notakeith + avatar: https://avatars.githubusercontent.com/u/108391756?v=4 + link: https://github.com/notakeith --- Нормальная компания живёт от кодовой базы. Твой накопленный код — это твоё богатство. Время уникальных решений прошло: уже не засесть в гараже и не написать что-то уникальное — всё когда-то уже было написано. diff --git a/content/posts/operation-systems/lecture-05/index.md b/content/posts/operation-systems/lecture-05/index.md index 9dac8e8..4a7c719 100644 --- a/content/posts/operation-systems/lecture-05/index.md +++ b/content/posts/operation-systems/lecture-05/index.md @@ -1,10 +1,14 @@ --- -title: "Лекция 5" -description: "Информационная и системная архитектура" +title: "Информационная архитектура" +description: "Информационная и системная архитектура ОС как продолжение функциональной. Разбирается управление процессами через PCB и очереди планирования, а также управление памятью." date: 2026-03-04 tags: - Операционные-системы - 4 семестр +authors: + - name: notakeith + avatar: https://avatars.githubusercontent.com/u/108391756?v=4 + link: https://github.com/notakeith --- На прошлом занятии разобрали функциональную архитектуру. diff --git a/content/posts/operation-systems/lecture-06/images/Drawing_1.svg b/content/posts/operation-systems/lecture-06/images/image1.svg similarity index 100% rename from content/posts/operation-systems/lecture-06/images/Drawing_1.svg rename to content/posts/operation-systems/lecture-06/images/image1.svg diff --git a/content/posts/operation-systems/lecture-06/images/Drawing_2.svg b/content/posts/operation-systems/lecture-06/images/image2.svg similarity index 100% rename from content/posts/operation-systems/lecture-06/images/Drawing_2.svg rename to content/posts/operation-systems/lecture-06/images/image2.svg diff --git a/content/posts/operation-systems/lecture-06/images/Drawing_3.svg b/content/posts/operation-systems/lecture-06/images/image3.svg similarity index 100% rename from content/posts/operation-systems/lecture-06/images/Drawing_3.svg rename to content/posts/operation-systems/lecture-06/images/image3.svg diff --git a/content/posts/operation-systems/lecture-06/images/Drawing_4.svg b/content/posts/operation-systems/lecture-06/images/image4.svg similarity index 100% rename from content/posts/operation-systems/lecture-06/images/Drawing_4.svg rename to content/posts/operation-systems/lecture-06/images/image4.svg diff --git a/content/posts/operation-systems/lecture-06/images/Drawing_5.svg b/content/posts/operation-systems/lecture-06/images/image5.svg similarity index 100% rename from content/posts/operation-systems/lecture-06/images/Drawing_5.svg rename to content/posts/operation-systems/lecture-06/images/image5.svg diff --git a/content/posts/operation-systems/lecture-06/images/Drawing_6.svg b/content/posts/operation-systems/lecture-06/images/image6.svg similarity index 100% rename from content/posts/operation-systems/lecture-06/images/Drawing_6.svg rename to content/posts/operation-systems/lecture-06/images/image6.svg diff --git a/content/posts/operation-systems/lecture-06/images/Drawing_7.svg b/content/posts/operation-systems/lecture-06/images/image7.svg similarity index 100% rename from content/posts/operation-systems/lecture-06/images/Drawing_7.svg rename to content/posts/operation-systems/lecture-06/images/image7.svg diff --git a/content/posts/operation-systems/lecture-06/index.md b/content/posts/operation-systems/lecture-06/index.md index 9c5d34e..74652d1 100644 --- a/content/posts/operation-systems/lecture-06/index.md +++ b/content/posts/operation-systems/lecture-06/index.md @@ -1,10 +1,14 @@ --- -title: "Лекция 6" -description: "Архитектуры ядер" +title: "Архитектуры ядер" +description: "Ядро ОС как резидентный привилегированный компонент и компромисс между удобством и размером. Разбирается монолитная архитектура с разделением на main program, services и utilities." date: 2026-03-11 tags: - Операционные-системы - 4 семестр +authors: + - name: notakeith + avatar: https://avatars.githubusercontent.com/u/108391756?v=4 + link: https://github.com/notakeith --- Ядро всегда работает в привилегированном режиме. Оно **резидентно** — находится в физической памяти, минуя виртуальную. @@ -20,7 +24,7 @@ tags: 2. **Services** 3. **Utilities** -![](images/Drawing_1.svg) +![](images/image1.svg) > **Системный вызов** — обращение пользовательского приложения к ядру операционной системы с целью попросить/предоставить ресурс или выполнить привилегированную операцию. @@ -38,30 +42,30 @@ tags: 2. **Слой аппаратной поддержки ядра** 3. **Машинно-зависимые модули (HAL — Hardware Abstraction Layer)** -![](images/Drawing_2.svg) +![](images/image2.svg) > **Чипсет** — то, что обеспечивает вашу совместимость или несовместимость с ОС. -![](images/Drawing_3.svg) +![](images/image3.svg) Вызов запроса кванта непрерывной памяти и подобные операции идут в слой «Базовые механизмы ядра». **Базовые механизмы ядра** супероптимизированы, написаны на ассемблере. **Менеджеры ресурсов** максимально оптимизированы алгоритмически (с использованием стохастики). -![](images/Drawing_4.svg) -![](images/Drawing_5.svg) +![](images/image4.svg) +![](images/image5.svg) ### 3. Микроядерная архитектура Одна из концепций, которую продвигал **Танненбаум**. -![](images/Drawing_6.svg) +![](images/image6.svg) `APP1` сделает системный вызов в ядро. Системный вызов вызовет `API2`, тот вернёт результат, ядро вернёт результат `APP1`. `APP1` обработает результат, запросит ещё что-то — и снова системный вызов… Теряем скорость работы ядра, но **освобождаем память**, в которой может лежать пользовательская программа. -![](images/Drawing_7.svg) +![](images/image7.svg) **Windows** — это среднее между двумя мирами (гибрид). diff --git a/content/posts/operation-systems/lecture-07/images/Drawing_1.svg b/content/posts/operation-systems/lecture-07/images/image1.svg similarity index 100% rename from content/posts/operation-systems/lecture-07/images/Drawing_1.svg rename to content/posts/operation-systems/lecture-07/images/image1.svg diff --git a/content/posts/operation-systems/lecture-07/images/Drawing_2.svg b/content/posts/operation-systems/lecture-07/images/image2.svg similarity index 100% rename from content/posts/operation-systems/lecture-07/images/Drawing_2.svg rename to content/posts/operation-systems/lecture-07/images/image2.svg diff --git a/content/posts/operation-systems/lecture-07/images/Drawing_3.svg b/content/posts/operation-systems/lecture-07/images/image3.svg similarity index 100% rename from content/posts/operation-systems/lecture-07/images/Drawing_3.svg rename to content/posts/operation-systems/lecture-07/images/image3.svg diff --git a/content/posts/operation-systems/lecture-07/images/Drawing_4.svg b/content/posts/operation-systems/lecture-07/images/image4.svg similarity index 100% rename from content/posts/operation-systems/lecture-07/images/Drawing_4.svg rename to content/posts/operation-systems/lecture-07/images/image4.svg diff --git a/content/posts/operation-systems/lecture-07/images/Drawing_5.svg b/content/posts/operation-systems/lecture-07/images/image5.svg similarity index 100% rename from content/posts/operation-systems/lecture-07/images/Drawing_5.svg rename to content/posts/operation-systems/lecture-07/images/image5.svg diff --git a/content/posts/operation-systems/lecture-07/images/Drawing_6.svg b/content/posts/operation-systems/lecture-07/images/image6.svg similarity index 100% rename from content/posts/operation-systems/lecture-07/images/Drawing_6.svg rename to content/posts/operation-systems/lecture-07/images/image6.svg diff --git a/content/posts/operation-systems/lecture-07/images/Drawing_7.svg b/content/posts/operation-systems/lecture-07/images/image7.svg similarity index 100% rename from content/posts/operation-systems/lecture-07/images/Drawing_7.svg rename to content/posts/operation-systems/lecture-07/images/image7.svg diff --git a/content/posts/operation-systems/lecture-07/index.md b/content/posts/operation-systems/lecture-07/index.md index 7c48b5e..94136b5 100644 --- a/content/posts/operation-systems/lecture-07/index.md +++ b/content/posts/operation-systems/lecture-07/index.md @@ -1,17 +1,21 @@ --- -title: "Лекция 7" -description: "Процессы и потоки" +title: "Процессы" +description: "Понятие процесса как набора команд, ресурсов и контекста исполнения под управлением ОС. Разбираются сигналы вроде SIGKILL и SIGSTOP, а также управление приоритетом процессов через renice." date: 2026-03-18 tags: - Операционные-системы - 4 семестр +authors: + - name: notakeith + avatar: https://avatars.githubusercontent.com/u/108391756?v=4 + link: https://github.com/notakeith --- Любой системный вызов выполняется в рамках процесса. > **Процесс** — набор исполняемых команд, ассоциированных с ним ресурсов и контекста исполнения, находящийся под управлением операционной системы. -![](images/Drawing_1.svg) +![](images/image1.svg) Если в цикле запускаете `grep` — запускается один и тот же код, но у каждого процесса свои дескрипторы ввода/вывода. @@ -27,7 +31,7 @@ tags: - **Физическая многоядерность** (cores) - **Виртуальные потоки** (threads, hyper-threading) -![](images/Drawing_2.svg) +![](images/image2.svg) Есть процесс, выполняющийся на конкретном ядре. Например, осветляет картинку: к каждому пикселю прибавляет константу. Остальные ядра простаивают. С точки зрения алгоритма можно сделать многопоточное осветление, но нужно: - (а) расшарить память и обеспечить целостность данных (что сложно из-за разной скорости процессов); @@ -49,13 +53,13 @@ tags: В Kotlin это реализовано с помощью конечных автоматов. -![](images/Drawing_3.svg) +![](images/image3.svg) ### Распределение ресурсов между процессами Пример: запущены IDEA и Chrome. Кажется, должно достаться поровну, 50/50. Но у Chrome 99 процессов, а у IDEA — 1. Ресурсы делятся как 99:1. Упс. С позиции ОС нет разницы, что они порождены одним процессом, — все процессы плюс-минус равны. -![](images/Drawing_4.svg) +![](images/image4.svg) ### Основные функции подсистемы управления процессами @@ -79,11 +83,11 @@ tags: Любой процесс создаёт другой процесс. А как создаётся первый? В каждой ОС есть **костыль** для рождения первого процесса. В Unix процессы образуют строгое классическое **иерархическое дерево** — у каждого процесса ровно один родитель. -![](images/Drawing_5.svg) +![](images/image5.svg) `d` в `systemd` — это **daemon** (system daemon). -![](images/Drawing_6.svg) +![](images/image6.svg) #### Системные вызовы для создания процессов @@ -98,7 +102,7 @@ cat file.txt ``` Bash породил потомка с именем `cat`. -![](images/Drawing_7.svg) +![](images/image7.svg) > **Если зомби-апокалипсис привёл к тому, что закончились PID'ы — сервер зависнет настолько, что даже войти нельзя.** Открыть терминал — породить процесс. Даже если зашли, посмотреть процессы через `ps` — тоже процесс… diff --git a/content/posts/operation-systems/lecture-08/images/Drawing_1.svg b/content/posts/operation-systems/lecture-08/images/image1.svg similarity index 100% rename from content/posts/operation-systems/lecture-08/images/Drawing_1.svg rename to content/posts/operation-systems/lecture-08/images/image1.svg diff --git a/content/posts/operation-systems/lecture-08/images/Drawing_2.svg b/content/posts/operation-systems/lecture-08/images/image2.svg similarity index 100% rename from content/posts/operation-systems/lecture-08/images/Drawing_2.svg rename to content/posts/operation-systems/lecture-08/images/image2.svg diff --git a/content/posts/operation-systems/lecture-08/images/Drawing_3.svg b/content/posts/operation-systems/lecture-08/images/image3.svg similarity index 100% rename from content/posts/operation-systems/lecture-08/images/Drawing_3.svg rename to content/posts/operation-systems/lecture-08/images/image3.svg diff --git a/content/posts/operation-systems/lecture-08/images/Drawing_4.svg b/content/posts/operation-systems/lecture-08/images/image4.svg similarity index 100% rename from content/posts/operation-systems/lecture-08/images/Drawing_4.svg rename to content/posts/operation-systems/lecture-08/images/image4.svg diff --git a/content/posts/operation-systems/lecture-08/images/Drawing_5.svg b/content/posts/operation-systems/lecture-08/images/image5.svg similarity index 100% rename from content/posts/operation-systems/lecture-08/images/Drawing_5.svg rename to content/posts/operation-systems/lecture-08/images/image5.svg diff --git a/content/posts/operation-systems/lecture-08/images/Drawing_6.svg b/content/posts/operation-systems/lecture-08/images/image6.svg similarity index 100% rename from content/posts/operation-systems/lecture-08/images/Drawing_6.svg rename to content/posts/operation-systems/lecture-08/images/image6.svg diff --git a/content/posts/operation-systems/lecture-08/index.md b/content/posts/operation-systems/lecture-08/index.md index 9abb718..7e314cc 100644 --- a/content/posts/operation-systems/lecture-08/index.md +++ b/content/posts/operation-systems/lecture-08/index.md @@ -1,10 +1,14 @@ --- -title: "Лекция 8" -description: "Состояния процессов" +title: "Состояния процессов" +description: "Модель состояний процесса как автомат с вершинами-состояниями и рёбрами-переходами. Разбирается историческая двухсостоянийная модель Running/Waiting и её развитие." date: 2026-03-25 tags: - Операционные-системы - 4 семестр +authors: + - name: notakeith + avatar: https://avatars.githubusercontent.com/u/108391756?v=4 + link: https://github.com/notakeith --- ### Диспетчеризация и клонирование процессов @@ -25,7 +29,7 @@ tags: Из Running у процесса 2 выхода: завершиться или уйти в Waiting. -![](images/Drawing_1.svg) +![](images/image1.svg) Пока стоял в очереди, операция I/O завершилась — он перейдёт в Running, когда подойдёт очередь. Но может быть и так, что очередь подошла, а I/O ещё не завершено — процесс снова уйдёт в Waiting. Это **непродуктивно**: дёргать процесс, который не может выполняться. @@ -33,7 +37,7 @@ tags: Появилось состояние **Runnable** (готов). -![](images/Drawing_2.svg) +![](images/image2.svg) Любой процесс попадает в **Runnable** (готовность). Мы всегда начинаем с вычислений (нужно запросить дескриптор и т. п.). Сразу обеспечить Running мы не можем. @@ -45,13 +49,13 @@ tags: **`R` (Running)** — процесс либо прямо сейчас исполняется, либо будет исполняться в ближайшее время. -![](images/Drawing_3.svg) +![](images/image3.svg) **`D` (Direct Waiting / Uninterruptible Sleep)** — ожидает завершения конкретного события, которое выведет его в Runnable. Процесс сначала разгребёт накопившийся перечень событий — обработает сигналы, вызовет системные вызовы. **`S` (Sleeping)** — процесс спит. Это, как правило, **демоны**: те же веб-серверы, если запросов нет, большую часть времени спят. -![](images/Drawing_4.svg) +![](images/image4.svg) **Чем S отличается от D?** В обоих процесс ждёт. Но: - В **D** он ждёт конкретный сигнал. @@ -67,13 +71,13 @@ tags: **`T` (Stopped/Terminated)** — приостановлен. На жаргоне — «состояние комы»: процесс ставят на паузу. -![](images/Drawing_4.svg) +![](images/image4.svg) ### Почему у «рождения» нет состояния? Чтобы выдать состояние, нужно выдать PID. Пока PID нет — процесса нет в `ps aux`. Соответственно, состояние «рождение» — это и есть процесс создания. -![](images/Drawing_5.svg) +![](images/image5.svg) ### Состояние «карантин» (Exception) @@ -83,4 +87,4 @@ tags: > **ОС очень гуманная.** Она никогда не убивает процесс — она **предлагает ему самоубиться**. Почему? Если ОС вдруг убьёт какую-нибудь транзакцию, какой-то дяденька потеряет шестизначную сумму долларов. Такую систему никто не купит. **Дефолтные обработчики сигналов — это самоубийства.** -![](images/Drawing_6.svg) \ No newline at end of file +![](images/image6.svg) \ No newline at end of file diff --git a/content/posts/operation-systems/lecture-09/images/Drawing_1.svg b/content/posts/operation-systems/lecture-09/images/image1.svg similarity index 100% rename from content/posts/operation-systems/lecture-09/images/Drawing_1.svg rename to content/posts/operation-systems/lecture-09/images/image1.svg diff --git a/content/posts/operation-systems/lecture-09/images/Drawing_2.svg b/content/posts/operation-systems/lecture-09/images/image2.svg similarity index 100% rename from content/posts/operation-systems/lecture-09/images/Drawing_2.svg rename to content/posts/operation-systems/lecture-09/images/image2.svg diff --git a/content/posts/operation-systems/lecture-09/images/Drawing_3.svg b/content/posts/operation-systems/lecture-09/images/image3.svg similarity index 100% rename from content/posts/operation-systems/lecture-09/images/Drawing_3.svg rename to content/posts/operation-systems/lecture-09/images/image3.svg diff --git a/content/posts/operation-systems/lecture-09/images/Drawing_4.svg b/content/posts/operation-systems/lecture-09/images/image4.svg similarity index 100% rename from content/posts/operation-systems/lecture-09/images/Drawing_4.svg rename to content/posts/operation-systems/lecture-09/images/image4.svg diff --git a/content/posts/operation-systems/lecture-09/images/Drawing_5.svg b/content/posts/operation-systems/lecture-09/images/image5.svg similarity index 100% rename from content/posts/operation-systems/lecture-09/images/Drawing_5.svg rename to content/posts/operation-systems/lecture-09/images/image5.svg diff --git a/content/posts/operation-systems/lecture-09/images/Drawing_6.svg b/content/posts/operation-systems/lecture-09/images/image6.svg similarity index 100% rename from content/posts/operation-systems/lecture-09/images/Drawing_6.svg rename to content/posts/operation-systems/lecture-09/images/image6.svg diff --git a/content/posts/operation-systems/lecture-09/images/Drawing_7.svg b/content/posts/operation-systems/lecture-09/images/image7.svg similarity index 100% rename from content/posts/operation-systems/lecture-09/images/Drawing_7.svg rename to content/posts/operation-systems/lecture-09/images/image7.svg diff --git a/content/posts/operation-systems/lecture-09/images/Drawing_8.svg b/content/posts/operation-systems/lecture-09/images/image8.svg similarity index 100% rename from content/posts/operation-systems/lecture-09/images/Drawing_8.svg rename to content/posts/operation-systems/lecture-09/images/image8.svg diff --git a/content/posts/operation-systems/lecture-09/index.md b/content/posts/operation-systems/lecture-09/index.md index 3f34285..1db181e 100644 --- a/content/posts/operation-systems/lecture-09/index.md +++ b/content/posts/operation-systems/lecture-09/index.md @@ -1,10 +1,14 @@ --- -title: "Лекция 9" -description: "Планирование процессов" +title: "Планирование" +description: "Метрики качества планировщика — время ожидания и время отклика. Разбираются свойства алгоритмов планирования: предсказуемость, масштабируемость и реализуемость на практике." date: 2026-04-01 tags: - Операционные-системы - 4 семестр +authors: + - name: notakeith + avatar: https://avatars.githubusercontent.com/u/108391756?v=4 + link: https://github.com/notakeith --- ### Метрики @@ -28,7 +32,7 @@ tags: - **статические** vs **динамические**, - **системы** vs **процессы**. -![](images/Drawing_1.svg) +![](images/image1.svg) - **Статические параметры системы**: характеристики железа. - **Динамические параметры системы**: процент утилизации процессора, утилизации канала связи и т. д. @@ -46,11 +50,11 @@ tags: #### 1. FCFS (First-Come-First-Served) -![](images/Drawing_2.svg) +![](images/image2.svg) А что если перевернуть очередь? -![](images/Drawing_3.svg) +![](images/image3.svg) Полное время сократилось в 2 раза, время ожидания — в 5 раз. @@ -61,17 +65,17 @@ tags: С теми же процессами: -![](images/Drawing_4.svg) +![](images/image4.svg) Поставим квант $K = 1$: -![](images/Drawing_5.svg) +![](images/image5.svg) Но накладные расходы будут колоссальными. #### 3. SJF (Shortest Job First) -![](images/Drawing_6.svg) +![](images/image6.svg) #### 4. Гарантированное планирование @@ -99,7 +103,7 @@ $$R_i = \frac{\tau_i \cdot N}{T_i}$$ Как расставить рейтинг? Появился новый студент, надо вставить между 378-м и 379-м местом. Вещественные числа? Сдвигать всех начиная с 378? Возникает идея — **многоуровневая очередь**. -![](images/Drawing_7.svg) +![](images/image7.svg) - Внутри очереди — Round-Robin. - Процесс может исполняться только если нет процессов в более приоритетной очереди. @@ -108,4 +112,4 @@ $$R_i = \frac{\tau_i \cdot N}{T_i}$$ Появился алгоритм типа **«лифт»** — и **многоуровневая очередь с обратной связью**. -![](images/Drawing_8.svg) \ No newline at end of file +![](images/image8.svg) \ No newline at end of file diff --git a/content/posts/operation-systems/lecture-10/images/Drawing_1.svg b/content/posts/operation-systems/lecture-10/images/image1.svg similarity index 100% rename from content/posts/operation-systems/lecture-10/images/Drawing_1.svg rename to content/posts/operation-systems/lecture-10/images/image1.svg diff --git a/content/posts/operation-systems/lecture-10/images/Drawing_2.svg b/content/posts/operation-systems/lecture-10/images/image2.svg similarity index 100% rename from content/posts/operation-systems/lecture-10/images/Drawing_2.svg rename to content/posts/operation-systems/lecture-10/images/image2.svg diff --git a/content/posts/operation-systems/lecture-10/images/Drawing_3.svg b/content/posts/operation-systems/lecture-10/images/image3.svg similarity index 100% rename from content/posts/operation-systems/lecture-10/images/Drawing_3.svg rename to content/posts/operation-systems/lecture-10/images/image3.svg diff --git a/content/posts/operation-systems/lecture-10/images/Drawing_4.svg b/content/posts/operation-systems/lecture-10/images/image4.svg similarity index 100% rename from content/posts/operation-systems/lecture-10/images/Drawing_4.svg rename to content/posts/operation-systems/lecture-10/images/image4.svg diff --git a/content/posts/operation-systems/lecture-10/index.md b/content/posts/operation-systems/lecture-10/index.md index d885b31..c4db72b 100644 --- a/content/posts/operation-systems/lecture-10/index.md +++ b/content/posts/operation-systems/lecture-10/index.md @@ -1,10 +1,14 @@ --- -title: "Лекция 10" -description: "Планировщики Windows и Linux" +title: "Планировщики" +description: "Реальные планировщики Windows и Linux и четыре противоречивых требования к ним. Разбирается проблема deadlock и способы минимизировать риск тупиков в планировании." date: 2026-04-08 tags: - Операционные-системы - 4 семестр +authors: + - name: notakeith + avatar: https://avatars.githubusercontent.com/u/108391756?v=4 + link: https://github.com/notakeith --- ### 4 требования к планировщику (исходно противоречивые) @@ -19,7 +23,7 @@ tags: > **Deadlock**: несколько процессов блокируют ресурсы — процесс A заблокировал ресурс $R_1$ и ждёт $R_2$, процесс B заблокировал $R_2$ и ждёт $R_1$. > > Другая ситуация: процесс стоит в очереди I и ждёт ресурс A. Ресурс A занят другим процессом, стоящим в очереди II и ждущим исполнения. С точки зрения компьютера всё хорошо — но они в бесконечном ожидании. - ![](images/Drawing_1.svg) + ![](images/image1.svg) > Оказывается, есть и экономическая выгода от справедливости. @@ -27,7 +31,7 @@ tags: Windows использует **32-уровневую очередь**. -![](images/Drawing_2.svg) +![](images/image2.svg) - **Realtime-уровень** — системные процессы, которые не меняют очередь и никогда её не покидают. - С 16 по 31 — системные процессы. @@ -77,7 +81,7 @@ Windows XP / 95 / 98 прогнозировал CPU Burst. Потом понял **140 многоуровневых очередей.** -![](images/Drawing_3.svg) +![](images/image3.svg) В Linux между процессами на одном уровне — **FIFO**. @@ -95,7 +99,7 @@ Windows XP / 95 / 98 прогнозировал CPU Burst. Потом понял - **Execution time** — целочисленное время выполнения. - **Max execution time** — максимальное. -![](images/Drawing_4.svg) +![](images/image4.svg) Но вставка в очередь долгая. Малдар ходил на алгосы — выбрал сбалансированное дерево, **Red-Black Tree**. diff --git a/content/posts/operation-systems/lecture-11/index.md b/content/posts/operation-systems/lecture-11/index.md index f6b89ef..0fdd9e4 100644 --- a/content/posts/operation-systems/lecture-11/index.md +++ b/content/posts/operation-systems/lecture-11/index.md @@ -1,10 +1,14 @@ --- -title: "Лекция 11" -description: "Взаимодействие процессов и синхронизация" +title: "Синхронизация" +description: "Проблема синхронизации процессов при работе с неразделяемыми ресурсами вроде принтера или сети. Формулируются условия корректной синхронизации, включая взаимоисключение и прогресс." date: 2026-04-22 tags: - Операционные-системы - 4 семестр +authors: + - name: notakeith + avatar: https://avatars.githubusercontent.com/u/108391756?v=4 + link: https://github.com/notakeith --- Проблема возникает с **синхронизацией**. diff --git a/content/posts/operation-systems/lecture-12/images/Drawing_1.svg b/content/posts/operation-systems/lecture-12/images/image1.svg similarity index 100% rename from content/posts/operation-systems/lecture-12/images/Drawing_1.svg rename to content/posts/operation-systems/lecture-12/images/image1.svg diff --git a/content/posts/operation-systems/lecture-12/images/Drawing_2.svg b/content/posts/operation-systems/lecture-12/images/image2.svg similarity index 100% rename from content/posts/operation-systems/lecture-12/images/Drawing_2.svg rename to content/posts/operation-systems/lecture-12/images/image2.svg diff --git a/content/posts/operation-systems/lecture-12/index.md b/content/posts/operation-systems/lecture-12/index.md index 5a474a5..abfdc65 100644 --- a/content/posts/operation-systems/lecture-12/index.md +++ b/content/posts/operation-systems/lecture-12/index.md @@ -1,10 +1,14 @@ --- -title: "Лекция 12" -description: "Тупики и обедающие философы" +title: "Тупики" +description: "Голодание процессов и проблема читателей/писателей при доступе к общему ресурсу. Рассматривается классическая задача об обедающих философах как иллюстрация тупиков в синхронизации." date: 2026-04-29 tags: - Операционные-системы - 4 семестр +authors: + - name: notakeith + avatar: https://avatars.githubusercontent.com/u/108391756?v=4 + link: https://github.com/notakeith --- **Отсутствие прогресса** — ресурс доступен, но никто им не пользуется. @@ -23,7 +27,7 @@ tags: - $p_2$ начал ждать конца чтения, чтобы записать. - $p_1$ начал чтение, пока $p_0$ ещё читал. -![](images/Drawing_1.svg) +![](images/image1.svg) **Решение:** разрешаем параллельное чтение только когда в очереди **нет ожидающих записи**. @@ -50,7 +54,7 @@ tags: ### Проблема обедающих философов -![](images/Drawing_2.svg) +![](images/image2.svg) - За круглым столом сидят 5 философов. Между каждой парой соседей — 1 вилка. - Философы либо размышляют, либо едят. diff --git a/content/posts/public/pins/reports.md b/content/posts/public/pins/reports.md index fc9ee18..e587f98 100644 --- a/content/posts/public/pins/reports.md +++ b/content/posts/public/pins/reports.md @@ -3,5 +3,5 @@ title: "Шаблоны" icon: book-outline description: "Шаблоны для лабораторных работ" href: https://github.com/botaemeveryday/reports -pinned: true +pinned: false --- diff --git a/content/posts/public/pins/search.md b/content/posts/public/pins/search.md index e8c92ea..e97479d 100644 --- a/content/posts/public/pins/search.md +++ b/content/posts/public/pins/search.md @@ -3,5 +3,5 @@ title: "Поисковик" icon: search-outline description: "Федеративный поисковик" href: http://botaemeveryday.github.io/search/ -pinned: true +pinned: false --- diff --git a/hugo.toml b/hugo.toml index f7ce1d9..58b359e 100644 --- a/hugo.toml +++ b/hugo.toml @@ -1,9 +1,8 @@ baseURL = "https://botaemeveryday.github.io/notes/" -locale = "ru-RU" title = "botaemeveryday" defaultContentLanguage = "ru" -hasCJKLanguage = true +hasCJKLanguage = false [module] [module.hugoVersion] @@ -43,7 +42,6 @@ hasCJKLanguage = true showSummaryCoverInPost = true imageZoomableInPost = true showPrevNextPost = true - coverStyle = 1 [outputs] home = ["HTML", "RSS", "JSON"] \ No newline at end of file diff --git a/layouts/404.html b/layouts/404.html index e33ea60..43781a0 100644 --- a/layouts/404.html +++ b/layouts/404.html @@ -1,12 +1,10 @@ -{{ define "title" }}404 — страница пропала{{ end }} +{{ define "title" }}404 — страница пропала | {{ site.Title }}{{ end }} {{ define "main" }} -{{ end }} \ No newline at end of file diff --git a/layouts/partials/core/og.html b/layouts/partials/core/og.html index f33d3a5..393e7b7 100644 --- a/layouts/partials/core/og.html +++ b/layouts/partials/core/og.html @@ -1,10 +1,5 @@ {{- $cover := "" -}} -{{- /* Extract the course slug from the file path. We split File.Dir - on "/" and take index 1 (after "posts"). Works for: - posts/operation-systems/lecture-10/ → "operation-systems" - posts/operation-systems/ → "operation-systems" - Falls back to .Section for pages outside posts/. */ -}} {{- $course := "" -}} {{- with .File }} {{- $parts := split (trim .Dir "/") "/" -}} diff --git a/layouts/partials/core/scripts.html b/layouts/partials/core/scripts.html index 35a0280..e4cae49 100644 --- a/layouts/partials/core/scripts.html +++ b/layouts/partials/core/scripts.html @@ -1,25 +1,3 @@ - - - - - -{{ $gridJs := resources.Get "js/grid.js" }} -{{ if hugo.IsProduction }} - {{ $gridJs = $gridJs | minify }} -{{ end }} - - -{{ $mainJs := resources.Get "js/main.js" }} -{{ if hugo.IsProduction }} - {{ $mainJs = $mainJs | minify }} -{{ end }} - - -{{ $codeCopyJs := resources.Get "js/code-copy.js" }} -{{ if hugo.IsProduction }} - {{ $codeCopyJs = $codeCopyJs | minify }} -{{ end }} - \ No newline at end of file +{{ $site := resources.Get "js/site.js" }} +{{ if hugo.IsProduction }}{{ $site = $site | minify | fingerprint }}{{ end }} + \ No newline at end of file diff --git a/layouts/partials/footer/contributors.html b/layouts/partials/footer/contributors.html index e69de29..e58e15f 100644 --- a/layouts/partials/footer/contributors.html +++ b/layouts/partials/footer/contributors.html @@ -0,0 +1,55 @@ +{{- $data := .Data.contributors -}} +{{- if $data -}} + + {{- $exclude := slice -}} + {{- range (site.Params.coreAuthors | default (slice "notakeith" "salt-caramel")) -}} + {{- $exclude = $exclude | append (lower (string .)) -}} + {{- end -}} + + {{- $people := slice -}} + {{- range $data.people -}} + {{- $login := lower (string (.login | default .name)) -}} + {{- if not (in $exclude $login) -}} + {{- $people = $people | append . -}} + {{- end -}} + {{- end -}} + + {{- with $people -}} + {{- $limit := int (site.Params.contributorsLimit | default 16) -}} + {{- $shown := first (int (math.Min $limit (len .))) . -}} + {{- $rest := sub (len .) (len $shown) -}} + {{- $repo := site.Params.githubRepo | default "botaemeveryday/notes" -}} + +
+

+ thanks to <3 +

+ +
+ {{ range $shown }} + {{- $login := string (.login | default "") -}} + {{- $name := .name | default $login -}} + {{- $commits := .commits_total | default .commits | default 0 -}} + {{- $tip := printf "%s — %d %s" $name (int $commits) (partial "utils/plural.html" (dict "count" (int $commits) "forms" (slice "коммит" "коммита" "коммитов"))) -}} + {{- with .last_commit }}{{ $tip = printf "%s, последний %s" $tip (dateFormat "02.01.2006" .) }}{{ end -}} + + + {{ if $login }} + {{ partialCached "ui/avatar.html" (dict "handle" $login "size" 24 "class" "cn-contributor__avatar" "alt" $name) $login 24 }} + {{ else }} + {{ substr $name 0 1 }} + {{ end }} + {{ $name }} + + {{ end }} + + {{ if gt $rest 0 }} + и ещё {{ $rest }} + {{ end }} +
+
+ {{- end -}} +{{- end -}} diff --git a/layouts/partials/footer/footer.html b/layouts/partials/footer/footer.html index 072115a..2f570a9 100644 --- a/layouts/partials/footer/footer.html +++ b/layouts/partials/footer/footer.html @@ -1,4 +1,10 @@ -
- {{ partial "footer/footerLeft.html" . }} - {{ partial "footer/footerRight.html" . }} -
\ No newline at end of file +
+
+ {{ partial "footer/footerLeft.html" . }} + {{ partial "footer/footerRight.html" . }} +
+ +
+ {{ partialCached "footer/contributors.html" . }} +
+
diff --git a/layouts/partials/footer/footerLeft.html b/layouts/partials/footer/footerLeft.html index 7f9344e..f34fce4 100644 --- a/layouts/partials/footer/footerLeft.html +++ b/layouts/partials/footer/footerLeft.html @@ -7,13 +7,13 @@

made by - + notakeith & - + salt-caramel

diff --git a/layouts/partials/header/logo.html b/layouts/partials/header/logo.html index f455b6d..30b57af 100644 --- a/layouts/partials/header/logo.html +++ b/layouts/partials/header/logo.html @@ -1,70 +1,11 @@ - - \ No newline at end of file + diff --git a/layouts/partials/header/nav.html b/layouts/partials/header/nav.html index a792427..29627b9 100644 --- a/layouts/partials/header/nav.html +++ b/layouts/partials/header/nav.html @@ -1,109 +1,64 @@ -{{ if site.Params.stickyNav }} - diff --git a/layouts/partials/header/navCustomItems.html b/layouts/partials/header/navCustomItems.html deleted file mode 100644 index d350d0b..0000000 --- a/layouts/partials/header/navCustomItems.html +++ /dev/null @@ -1,16 +0,0 @@ -{{ $customItems := site.Params.navItems }} -{{ $keys := slice }} - -{{ range $k, $v := $customItems }} -{{ $keys = $keys | append $k }} -{{ end }} - -{{ $restNavItems := complement .navItems $keys }} -{{ $mobile := .mobile }} -{{ range $restNavItems }} - {{ if $mobile }} - {{ partial "renderMobileNavItem.html" . }} - {{ else }} - {{ partial "renderNavItem.html" . }} - {{ end }} -{{ end }} diff --git a/layouts/partials/header/renderNavItem.html b/layouts/partials/header/renderNavItem.html deleted file mode 100644 index c1a082f..0000000 --- a/layouts/partials/header/renderNavItem.html +++ /dev/null @@ -1,39 +0,0 @@ -{{ if and (eq . "about") }} - -{{ with site.GetPage "/about" }} -{{ $aboutPages := .Resources.ByType "page" }} -{{ if gt (len $aboutPages) 0 }} -
- {{- T "about" -}} -
-{{ end }} -{{ end }} - -{{ else if and (eq . "search") (gt (len (where site.Pages "Type" "search")) 0) }} - - - -{{ else if and (eq . "rss") site.Params.rss }} - - - -{{ else if and (eq . "categories") site.Taxonomies.categories }} - - - -{{ else if and (eq . "tags") site.Taxonomies.tags }} -{{ else }} -{{ $navItems := site.Params.navItems }} -{{ $item := index $navItems . }} -{{ with $item }} - {{ if .icon }} - - - - {{ else if .title }} - - {{ .title }} - - {{ end }} -{{ end }} -{{ end }} diff --git a/layouts/partials/home/search-bar.html b/layouts/partials/home/search-bar.html index 70c12d3..57075f9 100644 --- a/layouts/partials/home/search-bar.html +++ b/layouts/partials/home/search-bar.html @@ -1,27 +1,29 @@
- +
- +
- +
- + autocomplete="off"> -
- - \ No newline at end of file diff --git a/layouts/partials/home/search-results.html b/layouts/partials/home/search-results.html index df29d48..ce84e10 100644 --- a/layouts/partials/home/search-results.html +++ b/layouts/partials/home/search-results.html @@ -7,34 +7,14 @@
🔍

Ничего не найдено

Мы перерыли все конспекты, но ничего не нашли. Попробуйте изменить запрос.

-
- - \ No newline at end of file diff --git a/layouts/partials/home/search-script.html b/layouts/partials/home/search-script.html deleted file mode 100644 index 4a8325e..0000000 --- a/layouts/partials/home/search-script.html +++ /dev/null @@ -1,158 +0,0 @@ - \ No newline at end of file diff --git a/layouts/partials/home/semester-view.html b/layouts/partials/home/semester-view.html index 6f76546..f64c8f4 100644 --- a/layouts/partials/home/semester-view.html +++ b/layouts/partials/home/semester-view.html @@ -1,30 +1,24 @@
- {{ $pinnedPages := where site.RegularPages "Params.pinned" true }} - {{ if gt (len $pinnedPages) 0 }} + {{ with where site.RegularPages "Params.pinned" true }}

Закреплено

- {{ range $pinnedPages }} + {{ range . }} - - {{ if .Params.icon}} -
- -
+ {{ with .Params.icon }} +
+ {{ partial "ui/icon.html" (dict "name" .) }} +
{{ end }}
- - {{ .Title }} - - {{ if .Params.pinned_text }} - - {{ .Params.pinned_text }} - + {{ .Title }} + {{ with .Params.pinned_text }} + {{ . }} {{ end }}
@@ -33,59 +27,41 @@

- {{ if gt $semNum 0 }}{{ $semNum }} Семестр {{ else }}Прочие материалы{{ end }} + {{ if gt $semNum 0 }}{{ $semNum }} Семестр{{ else }}Прочие материалы{{ end }}

- - {{ $count := len $semSubjects }} - {{ $mod10 := mod $count 10 }} - {{ $mod100 := mod $count 100 }} - {{ $word := "предметов" }} - {{ if and (ge $mod100 11) (le $mod100 14) }}{{ $word = "предметов" }} - {{ else if eq $mod10 1 }}{{ $word = "предмет" }} - {{ else if and (ge $mod10 2) (le $mod10 4) }}{{ $word = "предмета" }} - {{ end }} {{ $count }} {{ $word }}
- +
- {{ range $semSubjects }} - {{ $publishedPages := where .Pages "Draft" false }} - {{ if gt (len $publishedPages) 0 }} -
- {{ partial "ui/section-card.html" . }} -
- {{ end }} + {{ range $subjects }} +
+ {{ partial "ui/section-card.html" . }} +
{{ end }}
diff --git a/layouts/partials/post/ai-widget.html b/layouts/partials/post/ai-widget.html index 4303a3e..f37f8f7 100644 --- a/layouts/partials/post/ai-widget.html +++ b/layouts/partials/post/ai-widget.html @@ -1,8 +1,5 @@ {{ if .IsPage }} - - -