Compare commits

...

30 Commits

Author SHA1 Message Date
roma-dxunvrs c513ce326f web fix 2
deploy / Pull and Restart (push) Successful in 17s
2026-11-02 22:45:19 +03:00
roma-dxunvrs 9361978648 web fix
deploy / Pull and Restart (push) Successful in 16s
2026-11-02 22:42:10 +03:00
roma-dxunvrs 8f42d4a320 web add some tasks for 1 milestone
deploy / Pull and Restart (push) Successful in 16s
2026-11-02 17:27:14 +03:00
roma-dxunvrs c654fcd9c2 web add info for 1 milestone
deploy / Pull and Restart (push) Successful in 18s
2026-10-31 22:26:37 +03:00
roma-dxunvrs 2ec4a7e7db web add lectures for 1 milestone
deploy / Pull and Restart (push) Successful in 18s
2026-10-30 19:01:08 +03:00
roma-dxunvrs 283660b9ef web update milestone 1
deploy / Pull and Restart (push) Successful in 16s
2026-10-29 14:49:49 +03:00
roma-dxunvrs f0817da47e web update index.md
deploy / Pull and Restart (push) Successful in 17s
2026-10-29 14:37:34 +03:00
roma-dxunvrs c9bc96dafc web milestone 1
deploy / Pull and Restart (push) Successful in 16s
2026-10-29 14:35:00 +03:00
roma-dxunvrs 6538742678 Update helios guide
deploy / Pull and Restart (push) Successful in 17s
2026-10-25 22:15:31 +03:00
roma a7f8e74f3f revert 9b0c9f4b4a
deploy / Pull and Restart (push) Successful in 15s
revert Merge pull request 'Kotlin guide ready' (#5) from AK_Additions into master

Reviewed-on: #5
2026-10-20 13:43:08 +03:00
roma 9b0c9f4b4a Merge pull request 'Kotlin guide ready' (#5) from AK_Additions into master
deploy / Pull and Restart (push) Successful in 16s
Reviewed-on: #5
2026-10-20 13:38:05 +03:00
Aklivtsov b62e54bbb0 Merge branch 'master' into AK_Additions 2026-10-20 12:55:54 +03:00
Aklivtsov 6853ada348 Kotlin guide done. (20.10.26) 2026-10-20 12:54:25 +03:00
roma-dxunvrs 4d0e404259 add vliw, empty risc and m68k
deploy / Pull and Restart (push) Successful in 16s
2026-10-15 16:39:49 +03:00
Aklivtsov da3ad9dd1a Added kotlin guide. (WIP) (15.10.26) 2026-10-15 00:24:21 +03:00
roma-dxunvrs 005017595b 10.10
deploy / Pull and Restart (push) Successful in 16s
2026-10-10 19:41:44 +03:00
roma-dxunvrs 23a9e06d53 update index
deploy / Pull and Restart (push) Successful in 16s
2026-10-08 21:27:47 +03:00
roma-dxunvrs 8c95d15f6c add deploy guide 2026-10-08 21:00:18 +03:00
roma-dxunvrs 61e293f81b update zsh guide
deploy / Pull and Restart (push) Successful in 17s
2026-10-05 23:57:00 +03:00
roma-dxunvrs 75e45eb930 web add deploy guide
deploy / Pull and Restart (push) Successful in 17s
2026-10-05 22:49:35 +03:00
roma-dxunvrs 12a473f46e web update
deploy / Pull and Restart (push) Successful in 17s
2026-10-04 19:57:51 +03:00
roma-dxunvrs 11432e782f csa update
deploy / Pull and Restart (push) Successful in 16s
2026-10-03 13:42:57 +03:00
roma-dxunvrs fec7f50b3e 02.10.26
deploy / Pull and Restart (push) Successful in 16s
2026-10-02 22:58:53 +03:00
roma-dxunvrs 4886625dac fix
deploy / Pull and Restart (push) Successful in 18s
2026-10-01 20:57:53 +03:00
roma-dxunvrs 977e016822 other: important
deploy / Pull and Restart (push) Successful in 17s
2026-10-01 20:55:51 +03:00
roma-dxunvrs 3764f7dafa js: add table of contents
deploy / Pull and Restart (push) Successful in 17s
2026-10-01 11:32:48 +03:00
roma-dxunvrs ecd928d72d other: add zsh guide
deploy / Pull and Restart (push) Successful in 16s
2026-09-30 20:41:07 +03:00
roma-dxunvrs c0b8ac0043 fix PL, add x86 in CS
deploy / Pull and Restart (push) Successful in 16s
2026-09-29 21:49:51 +03:00
roma 88b307c311 Merge pull request 'ProgLangs added. 29.09.26' (#4) from AK_Additions into master
deploy / Pull and Restart (push) Successful in 17s
Reviewed-on: #4
2026-09-29 21:29:11 +03:00
AK dc82207723 ProgLangs added. 29.09.26 2026-09-29 21:22:14 +03:00
56 changed files with 4998 additions and 25 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

+6 -1
View File
@@ -8,10 +8,15 @@
- Устранить элементы "магического мышления" и "карго культа".
## Системная инженерия
- [Понятие системы](Системная%20инженерия/Понятие%20системы.md)
- [Компьютерные системы](Вычислительные%20системы/Компьютерные%20системы.md)
- [Компьютерные системы](Системная%20инженерия/Компьютерные%20системы.md)
- [Особенности производства аппаратуры](Системная%20инженерия/Особенности%20производства%20аппаратуры.md)
- [Hardware and Software](Системная%20инженерия/Hardware%20and%20Software.md)
## Схемотехника
- [Цифровая схемотехника](Цифровая%20схемотехника/Цифровая%20схемотехника.md)
## Теория вычислений
- [Модель вычислений](Вычислительные%20системы/Модель%20вычислений.md)
- [Процессоры и системы команд](Вычислительные%20системы/Процессоры%20и%20системы%20команд.md)
- [Машина фон Неймана](Вычислительные%20системы/Машина%20фон%20Неймана.md)
## Вычислительные архитектуры
- [Вычислительные архитектуры](Архитектуры/Вычислительные%20архитектуры.md)
## Инструменты low-level
@@ -0,0 +1,27 @@
## Учебная архитектура
## Реальные VLIW и Эльбрус
### Виды параллелизма
> [!warning] Эта часть должна переехать в часть лекций
1. На уровне инструкций
- Конвейризация
- Суперскалярность
- Длинные машинные слова (very long instruction word)
2. На уровне данных
- Векторы
3. На уровне потоков - многопоточность
4. На уровне процессов - много ядер в процессоре
### Оптимизация обращений к памяти
- Есть спекулятивные команды, по типу спекулятивного чтения. В самом начале процессор читает, а если нигде по итогу не использовалось, то прочитанное значение отваливается.
- Оптимизация обращений к памяти в цикле: вместо `load -> alu -> store` компилятор расслаивает итерации и делает `store i -> alu i+1 -> load i+2` (i - номер итерации)
### Оптимизация переходов
Переход довольно затратная операция для конвейрных процессоров. Виды оптимизаций:
1. Штраф за переход и просто все этапы конвейера сбрасываются (самый простой вариант, на практике встречается редко)
2. В Эльбрусе - предикаты, выполняются обе ветки (if-else) а потом записывает только то, что в предикате. Превращает Control Flow в Data Flow. Используется только для коротких веток (3-5 команд). Логика: команды сравнения записывают в регистровый файл предикатов 0 или 1. Компилятор ставит абсолютно все команды в поток исполнения (и из if, и из else), но ставит специальные биты в команду: номер предиката, который контроллирует выполнение. Дальше команды исполняются, на этапе декода процессор видит предикат, а на этапе записи в память делает операцию, только если управляющий предикат - 1. (P.S. такое же было и в Intel Itanium)
3. Предикт переходов, в cisc - это делает процессор (у него маленькая область видимости, поэтому может быть неэффективно), в vliw - это делает компилятор (компилятор видит всю программу целиком и может отлично с этим справится). Процессор готовится к переходу и загружает команды в конвейер. Эльбрус позволяет подготовавливать до трех переходов одновременно.
### Регистровое окно и стек регистров
- Процессор содержит несколько сотен регистров, каждая фукнция "заказывает" себе у процессора нужное количество, при этом видимые для функции регистров делятся на три группы: регистры с параметрами, регистры для временных вычислений, регистры с параметрами для вызываемой функции. В момент вызова функции регистровый файл виртуально сдвигается вниз - первая и вторая группы не будут видны вызванной функции. Третья группа становится первой, а новые вторые и третью группы функция снова заказывает.
- Если процессору не хватает физических регистров для функции, то процессор сам в фоновом режиме сбрасывает неиспользуемую часть регистрового файла в стек в ОЗУ. При возврате из функции процессор незаметно восстанавливает регистры из стека.
- Есть глобальная группа регистров (типичные регистры из cisc, risc)
### Безопасность
- Несколько стеков: регистры пользователя на одном, адрес возврата и состояние процессора - на другом - защита от buffer overflow и подмены адреса возврата
- Процессор различает в памяти указатели и сами данные. В Эльбрусе нельзя создать указатель не из указателя. При этом первичный указатель безопасно получается специальными командами и механизмами в процессоре
@@ -0,0 +1,90 @@
## Архитектура
- 64-битная (процессоры Intel / AMD)
- Ассемблер: `NASM`
- OC: Linux
- Размеры данных:
- `byte`
- `word` (два байта)
- `dword` (4 байта)
- `qword` (8 байт)
## Регистры общего назначения
Все 64-битные регистры начинаются с `R`. Их младшие части можно прочитать отдельно
#### База
- `RAX` (Accumulator) - аккумулятор, возвращаются результаты функций и номера сисколлов
- `RBX` (Base) - обычная переменная
- `RCX` (Counter) - счетчик циклов, 4-й аргумент функции, уничтожается сисколлом
- `RDX` (Data) - данные, 3-й аргумент функции, второе возвращаемое значение, хранит остаток при делении
#### Индексы и указатели
- `RDI` (Destination Index) - 1-й аргумент функции
- `RSI` (Source Index) - 2-й аргумент фукнции
- `RSP` (Stack Pointer) - указатель вершины стека
- `RBP` (Base Pointer) - указатель базы стекового кадра
#### Новые регистры
- `R8, R9` - 5-й и 6-й аргументы функций
- `R10, R11` - временные
- `R12-R15` - свободные переменные
#### Имена частей регистров
| *64 бита (qword)* | *32 бита (dword)* | *16 бит (word)* | *8 бит (byte)* |
| :---------------: | :---------------: | :-------------: | :------------: |
| `rax` | `eax` | `ax` | `al` |
| `rbx` | `ebx` | `bx` | `bl` |
| `rcx` | `ecx` | `cx` | `cl` |
| `rdx` | `edx` | `dx` | `dl` |
| `rdi` | `edi` | `di` | `dil` |
| `rsi` | `esi` | `si` | `sil` |
| `rsp` | `esp` | `sp` | `spl` |
| `rbp` | `ebp` | `bp` | `bpl` |
| `r8..15` | `r8..15d` | `r8..15w` | `r8..15b` |
## Соглашение о вызовах
1. Аргументы: `RDI`, `RSI`, `RDX`, `RCX`, `R8`, `R9`
2. Возврат значения: `RAX` и `RDX`
3. Сохранность регистров
- *Caller-saved* (портятся при вызове `call`): `RAX`, `RCX`, `RDX`, `RSI`, `RDI`, `R8-R11`. Обязанность запоминать их - на вызывающем
- *Callee-saved* (обязаны остаться неизменными): `RBX`, `RBP`, `RSP`, `R12-R15`. Обязанность вернуть их в исходное состояние - на функции
4. Выравнивание стека
- В момент `call` значение регистра `RSP` должно быть кратно 16
- При входе в функцию стек сдвинут адресом возврата, поэтому RSP % 16 == 8. Перед внутренним call нужно выровнять стек (сделать push или sub rsp, 8)
## Самые нужные сисколлы
Все сисколлы [тут](https://gitlab.se.ifmo.ru/programming-languages/cse-programming-languages-fall-2026/main/-/blob/master/docs/system-calls.md)
| Назначение | RAX | RDI (fd) | RSI (buffer) | RDX (size) | Возврат в RAX |
| :----------------------- | :--- | :----------- | :------------- | :---------- | :--------------------------------------------- |
| **Чтение (`sys_read`)** | `0` | `0` (stdin) | Адрес в памяти | Кол-во байт | Кол-во прочитанных байт (0 = EOF, <0 = ошибка) |
| **Запись (`sys_write`)** | `1` | `1` (stdout) | Адрес в памяти | Кол-во байт | Кол-во записанных байт |
| **Выход (`sys_exit`)** | `60` | Код возврата | - | - | Процесс завершается |
## Самые нужные инструкции
#### Перемещение данных
- `mov A, B` - скопировать B в A
- `movzx` - скопировать байт B в регистр A и заполнить старшие биты нулями
#### Математика
- `add A, B` / `sub A, B` - сложение / вычитание `A = A +/- B`
- `inc A` / `dec A` - инкремент / декремент
- `neg A` - `A = -A`
- `imul A, B` - знаковое умножение `A = A * B`
- `mul B` - беззнаковое умножение, умножает `RAX` на B. Старшая часть результата в `RDX`, младшая - в `RAX` (результат - `RDX:RAX`)
- `div B` - беззнаковое деление. Делит `RDX:RAX` на B. Частное в `RAX`, остаток в `RDX`
#### Логика
- `and`, `or`, `not` - побитовое И, ИЛИ, НЕ
- `xor A, B` - исключающее ИЛИ (`xor rax, rax` - быстрый способ обнулить регистр)
- `test A, B` - побитовое И без сохранения результата (только ставит флаги) - лучший способ проверить регистр на ноль
#### Ветвление и переходы
- `cmp A, B` - сравнивает A и B, ставит флаги
- `jmp метка` - безусловный переход
- `je` / `jne` (или `jz` / `jnz`) - прыжок, если `Z = 1` / `Z = 0`
- Дли знаковых чисел
- `jl` / `jle` (Less / Less or Equal) - меньше / меньше или равно
- `jg` / `jge` (Greater / Greater or Equal) - больше / больше или равно
- `js` / `jns` (Sign) - отрицательное / положительное (флаг `S`)
- Для беззнаковых чисел:
- `jb` / `jbe` (Below / Below or Equal) - меньше / меньше или равно
- `ja / jae` (Above / Above or Equal) - больше / больше или равно
- Для переполнений
- `jc` / `jnc` (Carry)
- `jo` / `joc` (Overflow)
#### Работа со стеком
Растет как в БЭВМ (в сторону уменьшения адресов)
- `push A` - кладет 8 байт на стек (`rsp -= 8, [rsp] = A`)
- `pop A` - достает 8 байт со стека (`A = [rsp], rsp += 8`)
- `sub rsp, 24` - выделить буфер на 24 байта
- `add rsp, 24` - освободить буфер
@@ -1,5 +1,9 @@
## Инструментарий
- [Платформа Wrench](Платформа%20Wrench.md)
## Архитектуры
- [x86_64](x86_64.md) (реальная архитектура)
- [acc32](acc32.md)
- [f32a](f32a.md)
- [f32a](f32a.md)
- [m68k](m68k.md) (будет)
- [risc-iv](risc-iv.md) (будет)
- [vliw-iv](vliw-iv.md) (в работе, есть интересные факты про Эльбрус)
@@ -77,7 +77,7 @@
Цвета - 3 партии входных данных. Цифры - на каком такте будут на данном этапе вычисления
### Практика
На практике все перечисленные механизмы встречаются в современных [компьютерных системах](Компьютерные%20системы.md), в том числе:
На практике все перечисленные механизмы встречаются в современных [компьютерных системах](../Системная%20инженерия/Компьютерные%20системы.md), в том числе:
- В процессорах общего назначения
- В специализированных процессорах
- В распределенных системах
@@ -0,0 +1,61 @@
1. Развитие [Машины Тьюринга](Модель%20вычислений.md#Машина%20Тьюринга). Отличия:
- Лента заменена на Random-Access Memory (RAM)
- Инструкции и данные объединены
2. Призвана быть максимально простой в реализации и производстве
3. Процедурное программирование и ООП - тот же принцип
![](../../Attachments/Машина%20фон%20Неймана.png)
## Особенности
1. Использование двоичного кодирования
- Встречается и троичное, и двоично-десятичное кодирование
2. Программное управление. Команды выполняются последовательно
- Последовательность и порядок сегодня условны
3. Память компьютера однородно хранит данные и программы
- Однородность спорна
4. Ячейки памяти компьютера имеют адреса. Random-Access Memory
- Адрес не сводится к целому числу сегодня
- Память не является пассивным элементом компьютера
5. Возможность условного перехода
- И перехода по иным причинам
## Окружение
### (Микро)процессор
Цифровая схема, которая выполняет операции с внешним источником данных (обычно с памятью или потоком данных)
### (Микро)контроллер
Микросхема, предназначенная для управления электронными устройствами. Типичный микроконтроллер сочетает функции процессора и периферийных устройств, содержит ОЗУ и/или ПЗУ
### Оперативная память (память)
Обычно часть компьютерной памяти, в которой хранится выполняемый машинный код, а также входные, выходные и промежуточные данные
## Control Unit и DataPath
### Control Unit
Компонент центрального процессора (CPU), управляющей работой процессора. CU часто использует двоичный декодер для преобразования закодированных инструкций в управляющие сигналы, координирующие работу остальных блоков
### DataPath
АЛУ, набор регистров и внутренние шины CPU, по которым данные перемещаются между ними
![](../../Attachments/Control%20Unit%20and%20DataPath.png)
## Виды инструкций
1. Работа с памятью: запись констант, копирование данных (память, регистры, порты I/O)
2. Арифметческие, логические и битовые операции
3. Управляющие операции: переходы, вызов и возврат из подпрограмм
4. Инструкции сопроцессоров: загрузка и выгрузка данных, управление сопроцессором
## Роль машинного слова
Единица данных, которая выбрана естественной для данной архитектуры процессора
1. Может быть адресована в памяти
2. Передается по шине между памятью и процессором за один раз
3. Является стандартной единицей обрабатываемой информации
4. Связанные вопросы: формат инструкции, форматы данных, форматы адресов
## На практике
1. В чистом виде практически не встречаются
2. Влияние на индустрию - трудно переоценить
3. Элементы архитектуры присутствуют в подавляющем большинстве процессоров и средств разработки
4. Структурное программирование, ООП - наследие фон Неймана
5. Ловушка обратной совместимости
## Вариации
1. Память команд и данных: Принстонская и Гарвардская архитектуры
- Типы данных, адресные пространства, машинные слова, теги
2. Принцип работы с данными в DataPath
- Accumulator, Register-to-Register, Register-to-Memory, Memory-to-Memory, Stack Architectures
3. "Мощность" системы команд: CISC, RISC
- Количество операндов (0, 1, 2, ...)
- Кодирование инструкций
- Принципы построения Control Unit
4. Адресация операндов
Кроме того: ввод-вывод, параллелизм, иерархия памяти и тп
@@ -0,0 +1,82 @@
MoC - Model of Computation
1. MoC предоставляет язык для описания моделей процессов/программ/структур
2. MoC определяет возможности вычислительной машины
3. MoC характеризует, как исполняется модель (программа): возможные состояния вычислителя, их последовательность, правила переходов (детерменированные или нет)
4. MoC, обычно, минималистичны относительно реальных вычислителей
## Последовательные модели
Sequential models
Относительно просто реализуются в виде аппаратных схем
### Конечные автоматы
![](../../Attachments/FSM.png)
Несколько наборов состояний системы и условия переходов между ними
#### Автомат с магазинной памятью
![](../../Attachments/Автомат%20с%20магазинной%20памятью.png)
Например, парсеры
#### Достоинства
- Таблица состояний
- Верифицируемость переходов
- Простая реализация в схемотехнике и ПО
### Машина Тьюринга
Включает:
- Неограниченную двустороннюю ленту, разделенную на ячейки
- Устройство управления (головка записи-чтения), которое может находиться в конечном числе состояний
Управляющее устройство может:
- Перемещаться по ленте влево и вправо
- Читать и записывать в ячейки символы конечного алфавита
Машина Тьюринга
1. Не может быть реализована на практике (нет бесконечной ленты)
2. Обладает полнотой по Тьюрингу (можно реализовать любой известный алгоритм)
3. Проблема остановки
4. Данные и управление отделены
5. Ориентирована на реализацию
### Random Access Machine
![](../../Attachments/RAM.png)
## Функциональные модели
Functional models
Представление вычислительного процесса как совокупности символов и правил их преобразований
1. Арифметика
2. Лямбда исчисление (полнота по Тьюрингу)
3. Combinatory logic
4. General recursive functions
5. Abstract rewriting systems
Программа/данные - математический объект
Возможна Тьюринг неполнота
### Лямбда исчисление
#### 4 вида выражений
1. Переменная: $x, y\ \text{и} \ z$
2. Константа: $a,b,c$
3. Коминация (вызов): $s\ t$
4. Абстракция: $\lambda x.s$
#### 3 вида редукций/подстановки
1. Переименование переменных: $\lambda u.u\ v \xrightarrow{\alpha} \lambda w.w\ v$
2. Применение функции (подстановка аргумента): $(\lambda x.s)\ t \xrightarrow{\beta} s[t/x]$
3. Сокращение аргумента: $\lambda u.v\ u \xrightarrow{\eta} v$
## Параллельные модели
Системы, включающие несколько взаимодействующих процессов
- Kahn process networks - однонаправленные каналы с неограниченными буферами (+- как в гошке)
- Actor model - отправка сообщений в "почтовые ящики" (как в Erlang)
- Discrete Event - события в заданные моменты времени (цифровые схемы)
- Multi-Thread Model - общая память (как в джаве)
- Synchronous Data Flow - синхронизированные потоки данных
## Близкие понятия
### Парадигмы программирования
Способ классификации языков программирования на основе их функций. Языки могут относиться к нескольким парадигмам
### Стиль программирования
Это набор правил или рекомендации, используемых при написании исходного кода компьютерной программы
## Применение на практике
1. Computer Science. Формальные модели
2. Дизайн ЯПов
3. Ограничение творческого порыва, контроль сложности
4. Модель-ориентированная инженерия
## Model-Driven Engineering
1. Разработка через моделирование предметной области
2. Автоматическая генерация кода из моделей
3. Повышение уровня абстракции при разработке
4. Сокращение разрыва между требованиями и реализацией
5. Улучшение коммуникации между заинтересованными сторонами
6. Снижение сложности разработки масштабных систем
@@ -7,7 +7,7 @@
### ПЛК
- Специальная разновидность электронной вычислительной машины
- Особенности
1. [Управляющие системы](Управляющие%20системы.md)
1. [Управляющие системы](../Системная%20инженерия/Управляющие%20системы.md)
2. Законченные устройства для встроенного использования
3. Специализация ввода-вывода, модульность
4. Выделение инструментальной составляющей
@@ -0,0 +1,64 @@
## Инорфмационный процессор
- Система (электрическая, механическая или биологическая), которая принимает информацию (последовательность символов или состояний) в одной форме и обрабатывает (преобразует) ее в другую форму
- Например: исходный сигнал в статистику, посредством алгоритмического процесса
- Включает:
1. Ввод
2. Процессор
3. Хранилище
4. Вывод
## Универсальный процессор
Позволяет решать широкий круг задач, настройка которых производится после производства "по месту" или в run-time
### Примечания
1. Универсальность != полнота по Тьюрингу
2. Теоретическая универсальность != практическая универсальность
3. Универсальность противоречит эффективности
4. Современный процессор - совокупность программного и аппаратного обеспечения
### Свойства
1. [Hardware and Software](../Системная%20инженерия/Hardware%20and%20Software.md) (двухэтапное производство)
2. Полнота по Тьюрингу
3. Отсутствие "серьезных" ограничений на "объем" программы
4. Изменяемость ПО
## Виды процессоров
1. Application-Specific Integrated Circuit
2. Coarse-Grained Reconfigurable Arrays
3. Field-Programmable Gate Array
4. Digital Signal Processor
5. Graphics Processing Unit
6. Central Processing Unit
![](../../Attachments/Процессоры%20и%20системы%20команд.png)
## Архитектура процессора
То, как видит компьютер программист. Определена набором команд (язык), местом нахождения операндов (регистры и память) и вычислительными механизмами (кеш, прерывания и тд)
1. Множество разных [архитектур](../Архитектуры/Вычислительные%20архитектуры.md)
2. Чтобы понять архитектуру, нужно знать ее язык
3. Слова в языке компьютера - "инструкции" или "команды"
4. Словарный запас - "система команд"
## Микроархитектура процессора
Соединение простейших цифровых элементов в логические блоки, предназначенные для выполнения команд определенной архитектуры
### Примечания
1. Описывает, как в процессоре расположены и соединены друг с другом регистры, АЛУ, конечные автоматы, блоки памяти, интерфейсы ввода-вывода и тп
2. У каждой архитектуры может быть много микроархитектур, обеспечивающих разное соотношение производительности, цены, сложности, технической эстетики. Они смогут выполнять одни и те же программы
3. Если ISA и микроархитектура отличаются на уровне MoC - обычно требуется уровень виртуализации (ПО, аппаратура, транслятор и тд)
## Система команд (ISA)
- Instruction Set Architecture
- Абстрактная модель процессора, формирующая интерфейс взаимодействия между программным обеспечением и процессором
- Производительность, энергопотребление и задержки часто не рассматриваются
### Что входит
1. Типы данных
2. Модель памяти, система и методы адресации
3. Набор инструкций
4. Механизмы обработки прерываний и исключений
5. Методы ввода и вывода
### Машинное слово
Фрагмент данных фиксированного размера, обрабатываемый как единое целое процессором
### Разнообразие систем команд
1. Действие над памятью/регистрами
- Произвольной сложности и длины (CISC)
- Фиксированного формата (RISC)
2. Действие без указания обрабатываемых данных (стековый)
3. Управляющие сигналы процессора под видом команды (NISC)
4. Группа команд под видом одной команды (VLIW)
5. Действие над шиной данных (TTA)
6. Команды без последовательного исполнения (редукционные)
7. Система команд из одной команды (URISC)
8. Управляющие сигналы процессоров под видом команды (NITTA)
@@ -0,0 +1,82 @@
- **Hardware** производится один раз и дальше не меняется, не корректируется
- **Software** адаптируется под задачу, легко изменяется
- Разделены по времени/специальности: разные дисциплины и разные индустрии
## Как разделить HW/SW
1. Определяем возможности "конфигурирования":
- Заложенные при проектировании - интерфейс задокументирован и стабилен (ISA, API)
- Незадокументированные (нецелевое использование, дыра в безопасности) - используется то, что интерфейсом не гарантировано но работает
2. Фиксируем интерфейс "конфигурирования"
- Набор механизмов
- Модель вычислений
- Интструментальные средства
## Конфигурирование [РЭА](Особенности%20производства%20аппаратуры.md#Монтаж%20радиоэлектронной%20аппаратуры%20(РЭА))
1. Макетные платы
2. Печатные платы: перерезать, навесить дорожку
3. Джамперы
4. Платы расширения
- Вычислительные платы
- Порты ввода/вывода
- Dendy (память программ и графическая память)
## Реконфигурация. Коммутация
### Реконфигурируемые архитектуры
Архитектуры, где задача отображается в структуру вычислителя (пространственно, spatial), а не выполняется потоком инструкций. В отличие от ASIC, это структура может быть перенастроена после изготовления
1. Программируемые логические интеграционные схемы
2. Крупногранулярные реконфигурируемые массивы (CGRA)
3. Выстраивание людей для расчета таблиц
## Программное управление
1. Данные (программы) определяют то, какой прикладной процесс будет разворачиваться
2. Количество уровней исполнения/интерпретации данных ограничено только целесообразностью
**Временные вычисления** - одна и та же схема последовательно проходит через разные состояния во времени
## Аппаратное обеспечение
Электронные и механические части вычислительного устройства, входящие в состав системы. Включает: компьютеры и логические устройства, внешние устройства и диагностическую аппаратуру, энергетическое оборудование
## Программное обеспечение (ПО)
Совокупность программ и программных документов необходимых для эксплуатации. Позволяет аппаратному обеспечению выполнять функции
## Аппаратура и ПО != Hardware и Software
1. Программная/аппаратная составляющая слабо связаны с SW/HW:
- Minix - ОС встроена в Intel ME/CSME
- Микропрограммное обеспечение
2. Часто аппаратурой называют то, что работает как аппаратное обеспечение
- Virutal-Computer, Virtual-Network, Virtual-Volume, etc
- Реконфигурируемые архитектуры (ПЛИС, CGRA)
3. Разделение на SW/HW зависит в большей степени от способа использования
- Hardware - тяжело/долго/дорого поменять
- Software - легко/быстро/дешево поменять
## Плюсы и минусы ПО/SW
### Часть плюсов
1. Быстрый цикл разработки, CI/CD и тд
2. Меняем у пользователя
3. Пользователь - Beta-тестер
### Часть минусов
1. Высокая сложность программ
2. Безопасность
3. Культура разработки. Верификация
## Типовое HW/SW проектирование
### Проектируем аппаратуру
- Система команд и вычислительные механизмы
- Интерфейсы управления аппаратурой
- Цифровая схематехника, система команд
### Пишем программу
- Прикладная задача
- Язык и библиотеки
- Система команд и вычислительные механизмы (виртуальная память, прерывания)
- Интерфейсы управления аппаратурой
### Проблемы
1. Излишне шаблонное проектирование
2. Высокие интеграционные риски
3. Последовательная разработка (сроки)
## Hardware/Software CoDesign
Мы проектируем систему
1. Разработка интерфейса HW/SW (системы команд)
2. Разработка моделей HW/SW, для получения обратной связи
3. Разработка HW/SW, верификация моделей
4. Заменая моделей на HW/SW
![](../../Attachments/CoDesign%20HW-SW.png)
В итоге: сокращение цикла разработки
## Как выбирать инструменты для разработки Software
1. От доступного Hardware и инструментальных средств
2. От доступной команды разработки
3. От прикладной задачи
- От области (библиотеки)
- От модели вычислений (принципов организации вычислительного процесса: параллелизм, конвейризация, оптимизации и тд)
@@ -12,4 +12,4 @@
3. Desktops - компьютеры на рабочем месте, почти у всех
4. Сервисы - решения прикладных задач, чтобы не делать их локально
5. Мобильные вычисления - повсеместно
6. Вычисления окружают нас уже повсеместно
6. Вычисления окружают нас уже повсеместно
@@ -23,7 +23,7 @@
Различают:
- одно- и двухслойные платы
- многослойные платы
## Виды монтажа компонентоы
## Виды монтажа компонентов
- Выводной (в отверстие)
- Поверхностный
- Встроенный
@@ -94,6 +94,7 @@
1. Разные частоты процессоров -> разные SKU из одного wafer
2. Core Single / Core Duo / Core Quad -> одинаковый кристалл, разное число активных ядер
3. Intel Pentium / Celeron -> урезанные Core с отключенными кэшем и функциями
## Реальный мир
### Производство
1. Логистика
2. Склады
@@ -107,4 +108,13 @@
1. Амортизация. Выход оборудования из строя
2. Необходимость физического доступа
3. Особенности среды эксплуатации
4. Долгосрочные эффекты
4. Долгосрочные эффекты
### Сложность изменений
1. Чем совершеннее технология, тем сложнее внести изменения
2. Физический контакт
### Варианты замены устаревшей аппаратуры
1. Перепроектирование на новой элементной базе
2. Модульная организация. Стандартные интерфейсы. Имитация старых систем
3. Виртуализация
Как решаем проблемы аппаратуры - [Hardware and Software](Hardware%20and%20Software.md)
@@ -57,4 +57,4 @@
Множественность точек зрения на систему. Систему может разрушить проблема коммуникации при разработке
Формальный способ зафиксировать эти точки зрения и передать их другим - [архитектура](Понятие%20архитектуры.md)
## Применение в Computer Science
- [Компьютерные системы](../Вычислительные%20системы/Компьютерные%20системы.md)
- [Компьютерные системы](Компьютерные%20системы.md)
+25 -1
View File
@@ -2,4 +2,28 @@
```bash
xprop WM_CLASS
```
Дальше кликаем в открытом окне. Нужно чтобы изменить иконку на панели задач, путь: `~/.local/share/applications`
Дальше кликаем в открытом окне. Нужно чтобы изменить иконку на панели задач, путь: `~/.local/share/applications`
#### Установка zsh + oh-my-zsh + powerlevel10k
1. Скачиваем zsh: `sudo apt install zsh`
2. Меняем оболочку: `chsh -s $(which zsh)`
3. Скачиваем `oh-my-zsh`: `sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"`
4. Скачиваем два нужных дополнения: `sudo apt install zsh-autosuggestions zsh-syntax-highlighting`
5. Скачиваем тему `powerlevel10k`: `git clone --depth=1 https://github.com/romkatv/powerlevel10k.git "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k"`
6. Меняем `.zshrc`:
```
...
ZSH_THEME="powerlevel10k/powerlevel10k"
...
plugins=(git zsh-autosuggestions)
...
source /usr/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh # в конце
```
7. Применяем через `source .zshrc` и настраиваем тему
Дополнения можно скачать и так:
```bash
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
```
Затем в `zshrc`: `plugins=(git zsh-autosuggestions zsh-syntax-highlighting)`
+2 -1
View File
@@ -1,4 +1,5 @@
Повседневные или почти вещи
- [Linux](Linux.md)
- [Полезные утилиты и сайты](Полезные%20утилиты%20и%20сайты.md)
- [VPN](VPN.md)
- [VPN](VPN.md)
- [Миграция с npm на npmplus](Миграция%20с%20npm%20на%20npmplus.md)
@@ -0,0 +1,2 @@
Может меняться, актуальная информация в [ридми](https://github.com/ZoeyVid/NPMPlus#migration-from-upstreamvanilla-nginx-proxy-manager)
1.
@@ -3,4 +3,11 @@
Установка через `pipx`: `pipx install gitingest`, дальше в любой папке команда `gitingest`, либо команда с указанием папки
Есть веб-версия, переходим в любой репозиторий или папку в репозитории и меняем в ссылке `https://github.com/...` на `https://gitingest.com/...`
## roadmap.sh
[Сайт](https://roadmap.sh/) с полезными роадмапами
[Сайт](https://roadmap.sh/) с полезными роадмапами
## thefuck
Быстро исправляет опечатку в команде и так далее
```bash
sudo apt install thefuck
echo 'eval $(thefuck --alias oops)' >> ~/.zshrc # oops - алиас на thefuck, можно любое слово
source ~/.zshrc
```
+2 -1
View File
@@ -1,10 +1,11 @@
Очень "полезные" материалы
[Java](Программирование%20на%20Java/Java.md) - полный, ультимативный гайд по жабе (WIP)
[АиСД](АиСД/АиСД.md)- разбор задач на алгоритмы и структуры данных (пока что только с литкода), позже будут добавлены шаблоны для методов, описание каждой из структур данных и много чего еще
[ИТМО](Итмо/3%20сем.md) - список предметов на текущий семестр + базовые требования + материалы
[ИТМО](Итмо/ИТМО.md) - список предметов на текущий семестр + базовые требования + материалы
[Веб](Веб/Веб.md) - лекции и заметки по Веб-программированию
[Computer Science](Computer%20Science/Computer%20Science.md) - лекции и материалы по АК+ОПД+PL и в целом база по CS
[Экзамен](ОПД/Экзамен.md) - разбор экзамена по ОПД за 2 семестр
[ЯПы](ЯПы/ЯПы.md) - семинары по ЯПам (осторожно, AI-SLOP)
[Other](Other/Other.md) - всякая всячина
Spring Boot - будет...
+2
View File
@@ -14,3 +14,5 @@
- [HTML](Фронтенд/HTML.md)
- [CSS](Фронтенд/CSS.md)
- [JavaScript](Фронтенд/JavaScript.md)
## Клиент-серверное взаимодействие
- [Клиент-серверное взаимодействие](Клиент-сервер/Клиент-серверное%20взаимодействие.md)
+20
View File
@@ -0,0 +1,20 @@
- Asynchronious JavaScript and XML
- Подход к построению интерактивных пользовательских интерфейсов веб-приложений
- Основан на фоновом обмене данными браузера с веб-сервером
- При обмене данными между клиентом и сервером веб-страница не перезагружается полностью
## Основные принципы
- Использование технологии динамического обращения к серверу "на лету", без перезагрузки всей страницы
- Использование [DHTML](../Фронтенд/DHTML.md) для динамического изменения содержания страницы
## Преимущества
- Экономия трафика
- Уменьшение нагрузки на сервер
- Ускорение реакции интерфейса
## Недостатки
- Динамически загружаемое содержимое недоступно поисковикам
- Сложнее собирать метрики по использованию сайта
- Усложнение проекта
- Требуется включенный JS в браузере
## Реализация в коде
- [XMLHTTPRequest](XMLHTTPRequest.md)
- [JQuery](JQuery.md)
- [Fetch API](Fetch%20API.md)
+25
View File
@@ -0,0 +1,25 @@
- Common Gateway Interface
- Простейший механизм вызова пользователем программ на стороне сервера
- Данные отправляются программе посредством HTTP-запроса, формируемого веб-браузером
- То, какая именно программа будет вызвана, обычно определяется [URL](../Основы/URI.md) запроса
- Каждый запрос обрабатывается отдельным процессом CGI-программы
- Взаимодействие программы с веб-сервером осуществляется через `stdin` и `stdout`
## Жизненный цикл CGI-запроса
1. Браузер присылает HTTP-запрос `POST /api/check?id=5` с телом `x=1&y=2`
2. Веб-сервер (например Apache Httpd) создает новый процесс в ОС и запускает скомпилированную программу
3. Метаданные (заголовки и тп) кладутся в переменные окружения, тело запроса отправляется в `stdin`
4. Программа выполняется как будто с ней взаимодействует пользователь в консоли
5. Веб-сервер забирает ответ из `stdout`
6. ОС убивает процесс запущенной программы
## Достоинства
- Программы могут быть написаны на множестве ЯПов
- Падение CGI-сценария не приводит к падению всего сервера
- Исключены конфликты при параллельной обработке нескольких запросов
- Хорошая поддержка веб-серверами
## Недостатки
- Высокие накладные расходы на создание нового процесса в ОС
- Плохая масштабируемость
- Слабое разделение уровня представления и бизнес-логики
- Могут быть платформо-зависимы
Как развитие - [FastCGI](FastCGI.md)
@@ -0,0 +1,47 @@
- Все запросы могут обрабатываться одним процессом CGI-программы
- Веб-сервер взаимодействует с процессом через UNIX Domain Sockets или TCP/IP (а не через stdin и stdout)
- Для общения используется бинарный протокол, обеспечивающий передачу любых текстовых данных
## FastCGI на Java
Пример
```Java
public static void main(String[] args) {
FCGIInterface fcgiInterface = new FCGiInterface();
while (fcgiInterface.FCGIAccept() >= 0) {
String content = """
<html>...</html>
""";
String response = """
HTTP /1.1 200 OK
Content-Type: text/html
Content-Length: %d
%s
""".formatted(content.getBytes(StandardCharsets.UTF_8).length, content);
}
}
```
- `FCGIInterface` - реализует магию по перенаправлению `System.in`, `System.out` и `System.err` в потоки TCP сокета. Поля для запросов и сокета - статические
- `FCGIInterface.request.params` - объект `Properties`, через который можно узнать список параметров, переданных веб-сервером
- Наиболее значимые параметры:
- `REQUEST_METHOD` - Get, Post и тд
- `QUERY_STRING` - параметры запроса после `?`
- `CONTENT_TYPE` - значение заголовка запроса
- `CONTENT_LENGTH` - значение заголовка запроса
Еще пример
```Java
private static String readRequestBody() throws IOException {
FCGIInterface.request.inStream.fill();
var contentLength = FCGIInterface.request.inStream.available();
var buffer = ByteBuffer.allocate(contentLength);
var readBytes = FCGIInterface.request.inStream.read(buffer.array(), 0, contentLength);
var requestBodyRaw = new byte[readBytes];
buffer.get(requestBodyRaw);
buffer.clear();
return new String(requestBodyRaw, StandardCharsets.UTF_8);
}
```
@@ -0,0 +1,40 @@
- Современный стандарт на замену [XMLHTTPRequest](XMLHTTPRequest.md)
- Поддерживается всеми современными браузерами
- Работает на промисах
## Пример кода
Чуть чуть было написано в [ECMAScript](../Фронтенд/ECMAScript.md)
```JavaScript
async function getData() {
const url = "https://example.org/products.json";
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`{response.status}`);
}
const json = await response.json();
console.log(json);
} catch (error) {
console.error(error.message);
}
}
```
Отправление данных через POST
```JavaScript
async function checkPoint(x, y, r) {
const pointData = {x: x, y: y, r: r};
const response = await fetch("/api/check", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(pointData)
});
const res = await response.json();
console.log(res.hit);
}
```
## Как работает
- Получение данных работает в два этапа: асинхронное получение ответа, затем асинхронное получение тела (данные могут быть большими и передаться потоком - Stream)
@@ -0,0 +1,49 @@
- JS-библиотека, предназначенная для разработки [DHTML](../Фронтенд/DHTML.md) и [AJAX](AJAX.md)-приложений
- Упрощает доступ к элементам [DOM](../Фронтенд/DOM.md) с помощью кучи разных способов
- Упрощает и унифицирует реализацию AJAX
- Упрощает добавление визуальных эффектов
- Ключевым элементов API является функция(объект) `$`
## Пример AJAX-запроса
```JavaScript
$.ajax({
type: "POST",
url: "some.php",
data: {name: "JOHN", location: "London"},
success: function(msg) {
// логика
}
});
```
## Взаимодействие с DOM
```JavaScript
$("div.test")
.add("p.quote")
.addClass("blue")
.slideDown("slow");
$("a"),click(function() {
alert("Hello");
});
$("div.demo-container").html("<p>New content</p>");
```
## Работа с событиями
```JavaScript
$("#foo").bind("mouseenter mouseleave", function() {
$(this).toggleClass("entered");
});
```
## Подключение
### Через CDN
```HTML
<!-- Подключение актуальной версии jQuery через CDN Google -->
<script src="https://googleapis.com"></script>
```
### Локально
```HTML
<!-- Подключение локального файла jQuery -->
<script src="js/jquery-3.7.1.min.js"></script>
```
## Почему устарел
- JS эволюционировал: добавили `document.querySelector` (написано в [заметке про DOM](../Фронтенд/DOM.md)), добавили [Fetch API](Fetch%20API.md)
- Смена парадигмы: императивный стиль -> декларативный (в современных React, Vue, Angular)
@@ -0,0 +1,306 @@
## Платформа Java EE
- Набор стандартов и спецификаций для создания корпоративных приложений на Java
- Спецификации Java EE реализуются серверами приложений
- Apache Tomcat
- Sun/Oracle GlassFish
- BEA/Oracle WebLogic
- IBM WebSphere
- RedHat JBoss
## Сервлеты
- [Серверные сценарии](Серверные%20сценарии.md) написанные на Java
- Жизненным циклов сервлетов управляет веб-контейнер (он же контейнер сервлетов)
- В отличие от [CGI](CGI.md) запросы обрабатываются в отдельных потоках (а не процессах) на веб-контейнере
## Преимущества
- Выполняются быстрее, чем CGI-сценарии
- Хорошая масштабируемость
- Надежность и безопасность
- Платформенно-независимы
- Множество инструментов мониторинга и отладки
## Недостатки
- Слабое разделение уровня представления и бизнес-логики
- Возможны конфликты при параллельной обработке запросов
## Обработка HTTP-запроса
1. Браузер формирует [HTTP](../Сеть%20и%20API/HTTP.md)-запрос и отправляет его на сервер
2. Веб-контейнер создает объекты `HttpServletRequest` и `HttpServletResponse`
3. Веб-контейнер вызывает метод `service` у сервлета
4. Сервлет формирует ответ и записывает его в поток вывода `HttpServletResponse`
## Пример сервлета
```Java
package sample.servlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class SampleServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException {
String pageTitle = "Пример сервлета";
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
...
out.println("</html>");
}
}
```
## Конфигурация сервлета
Конфигурирование происходит в `WEB-INF/web.xml` (есть конечно аннотации, но это слишком современно). В `WEB-INF/classes` должны лежать скомпилированные джава-классы
```xml
<!-- Регистрируем сервлет -->
<servlet>
<servlet-name>SampleServlet</servlet-name>
<servlet-class>org.itmo.sample.SampleServlet></servlet-class>
</servlet>
<!-- Маппинг -->
<servlet-mapping>
<servlet-name>SampleServlet</servlet-name>
<url-pattern>/sample</url-pattern>
</servlet-mapping>
```
Полный файл `web.xml`
```xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<!-- Регистрируем сервлет -->
<servlet>
<servlet-name>SampleServlet</servlet-name>
<servlet-class>org.itmo.sample.SampleServlet></servlet-class>
</servlet>
<!-- Маппинг -->
<servlet-mapping>
<servlet-name>SampleServlet</servlet-name>
<url-pattern>/sample</url-pattern>
</servlet-mapping>
</web-app>
```
## Жизненный цикл сервлета
- Жизненным циклом управляет веб-контейнер
- Методы, управляющие жизненным циклом, должен вызывать только веб-контейнер
### 1. Загрузка класса сервлета
Проверяются пути: `WEB-INF/classes/`, `WEB-INF/lib/*.jar`, стандартные классы Java SE и классы веб-контейнера
```xml
<servlet>
<servlet-name>SampleServlet</servlet-name>
<servlet-class>org.itmo.sample.SampleServlet></servlet-class>
<!-- Этот параметр можно получить через унаследованный метод getInitParametr(paramName); -->
<init-param>
<param-name>say-hello</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
```
### 2. Создание экземпляра сервлета
Создание через конструктор `new SampleServlet()`
### 3. Вызов метода init()
`init(config)` - принимает `config`
### 4. Обработка HTTP-запросов
На каждый запрос в новом потоке (на самом деле там пул потоков) вызывается метод `service()`
### 5. Уничтожение сервлета
Вызов метода `destroy()`
## Контекст сервлетов
- API, с помощью которого сервлет может взаимодействовать со своим контейнером
- Доступ к методам осуществляется через интерфейс `javax.servlet.ServletContext`
- У всех сервлетов внутри приложения общий контекст
- В контекст можно помещать общую для всех сервлетов информацию (методы `getAttribute` и `setAttribute`)
- Если приложение - распределенное, то на каждом экземпляре JVM контейнером создается свой контекст
```Java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class DemoServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
res.setContentType("text/html");
PrintWriter pw = res.getWriter();
ServletContext context = getServletContext();
String driverName = context.getInitParameter("dname");
pw.println("driver name: " + driverName);
pw.close();
}
}
```
В `web.xml` до сервлетов
```xml
<context-param>
<param-name>dname</param-name>
<param-value>org.postgresql.Driver</param-value>
</context-param>
```
## HTTP-сессии
- Напомним, что HTTP - stateless
- `javax.servlet.HttpSession` - интерфейс, позволяющий идентифицировать конкретного клиента (браузер) при обработке множества HTTP-запросов от него
- Экземпляр `HttpSession` создается при первом обращении клиента к предложению и сохраняется некоторое (настраиваемое) время после последнего обращения
- Идентификатор сессии либо помещается в `cookie`, либо добавляется к URL. Если удалить этот идентификатор, то сервер создаст новую сессию
- В экземпляр `HttpSession` можно помещать общую для этой сессии информацию (`getAttribute` и `setAttribute`)
- Сессия привязана к конкретному приложению, у разных приложений - разные сессии
- В распределенном окружении обеспечивается сохранение целостности данных в HTTP-сессии
```Java
public class SimpleSession extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
HttpSession session = request.getSession();
out.println("<html>");
...
out.println("session id: " + session.getId());
out.println("session timeout: " + session.getMaxInactiveInterval());
session.setMaxInactiveInterval(20*60);
out.println("new session timeout: " + session.getMaxInactiveInterval());
...
out.println("</html>");
}
}
```
## Диспетчиризация запросов сервлетами
- Сервлеты могут делегировать обработку запросов другим ресурсам (сервлетам, JSP, HTML-страницам)
- Диспетчеризация осуществляется с помощью реализаций интерфейса `javax.servlet.RequestDispatcher`
- Два способа получения `RequestDispatcher` - через `ServletRequest` (абсолютный или относительный URL) и `ServletContext` (только абсолютный URL)
- Два способа делегирования - `forward` и `include` (в обоих случаях url не меняется)
- `forward` - полностью отдает запрос другому сервлету или JSP-странице
- `include` - включает в себя обработку запроса от другого сервлета или JSP-страницы
- Полный редирект (меняется url в браузере, статус-код 302) - `response.sendRedirect(url)`
```Java
public class MyServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
RequestDispatcher dispatcher = request.getRequestDispatcher("index.jsp");
dispatcher.forward(request, response);
}
}
```
## Фильтры запросов
- Фильтры позволяют осуществлять пред- и постобработку запросов до и после передачи их ресурсу (сервлету, JSP или HTML-странице)
- Пример предобработки - допуск только авторизованных пользователей
- Пример постобработки - запись в лог времени обработки запроса
- Реализуют интерфейс `javax.servlet.Filter`
- Ключевой метод `doFilter`
- Метод `doFilter` класса `FilterChain` передает управление следующему фильтру или целевому ресурсу, таким образом возможна реализация последовательностей фильтров
```Java
public class MyFilter implements Filter {
@Override
public void init(FilterConfig arg0) throws ServletException {}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
PrintWrite out = resp.getWriter();
out.print("filter is invoked before");
chain.doFilter(req, resp); // sends to next resource
out.print("filter is invoked after);
}
@Override
public void destroy() {}
}
```
Конфигурация похожа на конфигурацию сервлетов
```xml
<web-app>
<servlet>
<servlet-name>s1</servlet-name>
<servlet-class>HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>s1</servlet-name>
<url-pattern>/servlet1</url-pattern>
</servlet-mapping>
<filter>
<filter-name>f1</filter-name>
<filter-class>MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>f1</filter-name>
<url-pattern>/servlet1</url-pattern>
</filter-mapping>
</web-app>
```
> [!important] Порядок сверху вниз, но если использовать аннотации, то порядок недетерминирован
## Конфигурация аннотациями
Конфигурация можно писать прямо в Java коде. Tomcat сам сканирует классы и регистрирует компоненты
### Сервлеты
`@WebServlet` - замена `<servlet>` и `<servlet-mapping>`
```Java
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
@WebServlet("/api/check")
public class CheckServlet extends HttpServlet {}
```
Продвинутый вариант
```Java
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.annotation.WebInitParam;
@WebServlet(
name = "MyCheckLogic", // Аналог <servlet-name>
urlPatterns = {"/api/check", "/run"},// Можно привязать сразу несколько URL!
loadOnStartup = 1, // Запустить при старте сервера
initParams = { // Замена <init-param>
@WebInitParam(name = "adminEmail", value = "admin@itmo.ru"),
@WebInitParam(name = "maxSize", value = "5000")
}
)
public class CheckServlet extends HttpServlet { ... }
```
### Фильтры
`@WebFilter` - замена `<filter>` и `<filter-mapping>`
```Java
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.Filter;
@WebFilter(urlPatterns = "/*")
public class EncodingFilter implements Filter {}
```
## Справка по параметрам/аттрибутам
### Внешние данные от пользователя
- `getParameter()`
- Приходит от браузера/клиента по сети
- Возвращает `String` или `null`
- Находится в URL или в теле запроса
- Приоритет у первого query параметра
- `String user = request.getParameter("red");`
- Если несколько `String[] colors = request.getParameterValues("color");`
- Никакого `set` не существует
### Внутренние данные приложения
- `getAttribute()` и `setAttribute()`
- Записывается Java-кодом на сервере. Браузер ничего не знает
- Возвращает `Object` или `null`, поэтому требует явного каста
- Внутри запроса `HttpServletRequest` - живет 1 запрос
- Используется для передачи из Model в View
- `request.setAttribute("myUser", new User()); User u = (User) request.getAttribute("myUser");`
- Внутри сессии `HttpSession` - живет пока юзер на сайте
- `HttpSession session = request.getSession();`
- `session.setAttribute("role", "ADMIN")`;
- `String role = (String) session.getAttribute("role");`
- Внутри контекста `ServletContext` - живет пока работает сервер
- `ServletContext context = getServletContext();`
- `context.setAttribute()` и `context.getAttribute()`
### Метаданные HTTP
- `getHeader()`
- Приходит от браузера в служебных строках
- Возвращает `String` или `null`
- `request.getHeader("Authorization");`
### Статические настройки из файла конфигурации
- `getInitParameter()`
- Читается сервером из файла `web.xml` или аннотаций
- Возвращает `String` или `null`
- `String email = getServletConfig().getInitParameter("email");` - для сервлета
- `String dbUrl = getServletContext().getInitParameter("dbUrl");` - для всех сервлетов
@@ -0,0 +1,11 @@
## Short Polling
- Браузер через JS (`setInterval` + `fetch`) отправляет AJAX-запросы на сервер каждые 2 секунды
- Сервер отвечает сразу: либо отдает новые данные, либо говорит, что данных нет
- Элементарная реализация, но 99% запросов не нужны
## Long Polling
Костыль до появления [WebSocket](WebSocket.md)
- Браузер делает AJAX-запрос на сервер
- Сервер отвечает не сразу, но удерживает соединение открытым
- Как только появляется сообщение, сервер отдает ответ
- Соединение для этих данных закрывается, клиент повторяет Long Polling запрос
- Нет пустых запросов, но серверу приходится держать в ОЗУ тысячи открытых соединений
+6
View File
@@ -0,0 +1,6 @@
- Sever-Sent Events
- Середина между [Polling](Polling.md) и [WebSocket](WebSocket.md)
- Однонаправленный канал (от сервера к браузеру)
- Браузер подписывается, а сервер шлет ему события
- Подходит для ленты новостей
- Работает поверх обычного [HTTP](../Сеть%20и%20API/HTTP.md)
@@ -0,0 +1,28 @@
- Протокол полнодуплескной(двунаправленной) связи поверх TCP-cоединения, предназначенный для обмена сообщениями между браузером и веб-сервером в режиме реального времени
- Позволяет серверу отправлять данные браузеру без дополнительного запроса со стороны клиента
- Обмен данными ведется через отдельное TCP-соединение
- Поддерживается всеми современными браузерами
- Альтернатива - [[AJAX]] + [Long Polling](Polling.md)
## Пример кода
```JavaScript
var webSocket = new WebSocket("ws://localhost/echo");
webSocket.onopen = function(event) {
webSocket.send("Hello");
}
webSocket.onmessage = function(event) {
webSocket.close();
}
webSocket.onclose = function(event) {}
```
## Как устанавливается
1. Браузер отправляет обычный [HTTP](../Сеть%20и%20API/HTTP.md)-запрос с заголовком `Connection: Upgrade` и `Upgrade: websocket`
2. Сервер отвечает `101` (Switching Protocols)
3. HTTP обрывается, появляется чистый TCP-коннект
## Плюсы
- Идеально для реалтайма
- Нулевые расходы на трафик
## Минусы
- Сложнее администрировать
@@ -0,0 +1,42 @@
- XMLHTTP - набор API, позволяющий осуществлять HTTP-запросы к серверу без необходимости перезагружать страницу
- Данные можно пересылать в виде [XML](../Форматы%20данных/XML.md), [JSON](../Форматы%20данных/JSON.md), [HTML](../Фронтенд/HTML.md) или просто неструктурированным текстом
- При пересылке используется [HTTP](../Сеть%20и%20API/HTTP.md)
```JavaScript
var req;
function loadXMLDoc(url) {
req = null;
if (window.XMLHttpRequest) {
try {
req = new XMLHttpRequest();
} catch (e) {}
} else if (window.ActiveXObject) { // более старая версия
try {
req = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
req = new ActiveXObject("Microsoft.XMLHTTP"); // вообще древняя версия
} catch (e) {}
}
}
if (req) {
req.open("GET", url, true); // true - асинхронно
req.onreadystatechange = processReqChange; // callback
req.send(null);
}
}
function processReqChange() {
try {
if (req.readyState === 4) {
if (req.status === 200) {
// обработка ответа
} else {
// обработка ошибка, доступен req.statusText
}
}
} catch (e) {
// баги самого XMLHttpRequest
}
}
```
@@ -0,0 +1,11 @@
## Клиентские запросы
- [AJAX](AJAX.md)
## Модели взаимодействия
- [WebSocket](WebSocket.md)
- [Polling](Polling.md)
- [SSE](SSE.md)
## Серверная обработка
- [Серверные сценарии](Серверные%20сценарии.md)
- [CGI](CGI.md)
- [FastCGI](FastCGI.md)
- [Java Servlets](Java%20Servlets.md)
@@ -0,0 +1,3 @@
- Программы, вызываемые на сервере для формирования динамического контента
- Веб-сервер "делегирует" им на обработку запрос и "транслирует" сформированный ими ответ клиенту
- Могут использоваться вместе со "статикой", могут - сами по себе
+7
View File
@@ -0,0 +1,7 @@
Dynamic HTML - способ создания интерактивного веб-сайта, использующий сочетание
- Статичного языка разметки [HTML](HTML.md)
- Выполняемого на стороне клиента скриптового языка [JavaScript](JavaScript.md)
- [CSS](CSS.md) (каскадных таблиц стилей)
- [DOM](DOM.md) (объектной модели документа)
## Концепция
Использовать JavaScipt для изменения HTML-элементов и их стилей на стороне клиента в real-time
+31
View File
@@ -1,3 +1,34 @@
- [[#Особенности языка|Особенности языка]]
- [[#ES6|ES6]]
- [[#let и const|let и const]]
- [[#Форматирование вывода|Форматирование вывода]]
- [[#Деструктуризация|Деструктуризация]]
- [[#Классы и объекты|Классы и объекты]]
- [[#Наследование|Наследование]]
- [[#Типы данных|Типы данных]]
- [[#`Number`|`Number`]]
- [[#`String`|`String`]]
- [[#`Boolean`|`Boolean`]]
- [[#`Undefined`|`Undefined`]]
- [[#`Null`|`Null`]]
- [[#`Symbol`|`Symbol`]]
- [[#`Object`|`Object`]]
- [[#Приведение типов|Приведение типов]]
- [[#Строгое равенство `===`|Строгое равенство `===`]]
- [[#Нестрогое равенство `==`|Нестрогое равенство `==`]]
- [[#Нестрогое равенство `==`#Правила кастов|Правила кастов]]
- [[#Стрелочные функции|Стрелочные функции]]
- [[#Цикл с итератором|Цикл с итератором]]
- [[#Параметры по умолчанию|Параметры по умолчанию]]
- [[#Rest-параметры|Rest-параметры]]
- [[#Rest-параметры#Операция spread|Операция spread]]
- [[#Promise|Promise]]
- [[#Операция spread#Состояния промиса|Состояния промиса]]
- [[#Операция spread#Работа с промисом|Работа с промисом]]
- [[#Операция spread#Async и Await|Async и Await]]
- [[#Event Loop и Асинхронность|Event Loop и Асинхронность]]
- [[#Операция spread#Приоритет выполнения задач|Приоритет выполнения задач]]
- Встраиваемый расширяемый не имеющий средств ввода-вывода ЯП
- 5 примитивных типов данных - Number, String, Boolean, Null, Undefined
- Объектный тип данных - Object
-8
View File
@@ -1,8 +0,0 @@
Предметы третьего сема:
1. [АК](Предметы/АК.md)
2. [Веб-программирование](Предметы/Веб-программирование.md)
3. [ЯПы](Предметы/ЯПы.md)
4. [Физика](Предметы/Физика.md)
5. [Теорвер](Предметы/Теорвер.md)
6. [Матан](Предметы/Матан.md)
7. [ВТП](Предметы/ВТП.md)
+50
View File
@@ -0,0 +1,50 @@
## Удобный вход
Когда уже есть ssh-ключ ввод пароля становится не обязательным, но порт и имя пользователя с доменом вводить приходится
Можно добавить в `.ssh/config`
```
Host helios
HostName se.ifmo.ru
User sXXXXXX
Port 2222
```
Теперь вход будет по `ssh helios`
## Смена оболочки (на zsh)
Скачивать свои пакеты нельзя, но благо zsh уже скачан (в `/usr/local/bin/zsh`)
Менять оболочку нормальным способом через `chsh` тоже нельзя, поэтому используем такой костыль: создаем в домашней папке `.bash_profile` и добавляем туда:
```bash
# Переключаемся на zsh только в интерактивном режиме (чтобы не сломать scp и sftp)
if [ -t 1 ] && [ -x /usr/local/bin/zsh ]; then
exec /usr/local/bin/zsh -l
fi
```
Теперь у нас zsh
### oh-my-zsh
1. Устанавливаем oh-my-zsh
```bash
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
```
2. Скорее всего вылетит ошибка прав, поэтому дефолтный конфиг копируем сами
```bash
cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc
```
3. Скачиваем два базовых дополнения
```bash
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
```
4. Скачиваем тему `powerlevel10k`
```bash
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k"
```
5. Меняем `.zshrc`
```
...
ZSH_THEME="powerlevel10k/powerlevel10k"
...
plugins=(git zsh-autosuggestions zsh-syntax-highlighting)
...
```
6. Применяем через `source .zshrc`, настраиваем тему
7. Для того чтобы заново запустить настройку темы: `p10k`
+12
View File
@@ -0,0 +1,12 @@
## Текущие предметы
1. [АК](Предметы/АК.md)
2. [Веб-программирование](Предметы/Веб-программирование.md)
3. [ЯПы](Предметы/ЯПы.md)
4. [Физика](Предметы/Физика.md)
5. [Теорвер](Предметы/Теорвер.md)
6. [Матан](Предметы/Матан.md)
7. [ВТП](Предметы/ВТП.md)
## Полезные материалы
- [Гайд](https://github.com/Imtjl/1st-year-guide) на первый курс на гитхабе
- [Гайд](https://github.com/Imtjl/2nd-year-guide) на второй курс на гитхабе
- [Настройка](Helios.md) Гелиоса
@@ -0,0 +1,24 @@
---
kanban-plugin: board
---
## В работе
- [ ] Собрать материалы
- [ ] Изучить примеры лабб
- [ ] ...
## Выполнено
%% kanban:settings
```
{"kanban-plugin":"board","list-collapse":[false,false]}
```
%%
+10
View File
@@ -0,0 +1,10 @@
[АК лаб 4 доска](АК%20лаб%204%20доска.md) с задачами
## Сбор информации
- [Пример](https://github.com/ryukzak/brainfuck/tree/master) Пенского
- [Таблица](https://github.com/petrovviacheslav/myitmo/tree/main/Computer-System-Architecture) с примерами
- [Пример](https://github.com/2BuRy1/itmo/tree/main/%D0%92%D1%82%D0%BE%D1%80%D0%BE%D0%B9%D0%9A%D1%83%D1%80%D1%81/%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0%20%D0%9A%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%B0/%D0%9B%D0%B0%D0%B1%D0%B03/scheme) risc-схемы
- [Пример](https://github.com/awesoma31/csa-lab4/tree/19e11019630092c809329798c278da500e169110) alg варианта
- [Пример](https://github.com/sultanowskii/drum) варианта на risc схеме
- [Пример](https://github.com/Azat2202/itmo-labs/tree/master/2%20year/%D0%90%D0%9A/%D0%9B%D0%B0%D0%B1%D0%BE%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%BD%D0%B0%D1%8F%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%203) варанта на stack схеме
## Мой вариант
- `alg | risc | harv | hw | trap | port | cstr | vector | alg3`
@@ -0,0 +1,13 @@
# 1 лаба
## Быстрый вариант
Тут все максимально легко, в лабе три (скорее всего) файла: index.html, style.css и script.js
Кидаем эти файлы в `~/public_html` на гелиосе, теперь лаба доступна по ссылке `https://se.ifmo.ru/~sXXXXXX/index.html` (XXXXXX - ваш ИСУшник)
## Другие варианты
На гелиосе запущен веб-сервер из папки `public_html`, все что вы туда кладете, доступно из интернета (как вот [эти](https://pdmi.zhabka.fun/) презентации)
Так что можно сделать папку `lab1` и веб-сервер подтянет `index.html` с оттуда, лаба будет доступна по ссылке `.../~sXXXXXX/lab1`
> [!hint] Самый крутой вариант
> Если лаба залита на гитхаб/gitea/gitlab/..., то делаем гит клон в удобную папку на гелиосе, а в `public_html` создаем символическую ссылку на нужную папку/файл `index.html`, теперь для обновления лабы на гелиосе можно тупо сделать `git pull`
# 2 лаба
Тут все сложнее, по требованию задания лабы нужно поднимать `apache httpd` + свой бекенд на FastCGI-либе
Пока не мой [гайд](https://www.youtube.com/watch?v=URdECcC25vY) на деплой
Также здесь будет гайд на легкий локальный тест в докере + nginx
@@ -0,0 +1,163 @@
> [!hint]
> В старых рубежках может быть актуально все, кроме вопросов о PHP
> Нужно знать весь материал лекций до 3.2
- [Файл](https://docs.google.com/document/d/11ccQ3H0NNVfMtdiKW1Zxq0woOfk9o-2p0VcKhj4Bz_A/edit?tab=t.0#heading=h.5xocd8wh7ln) для подготовки (от 2025 года)
- [Разбор](https://docs.google.com/document/d/1c-9ci-rwhO1EB7cTknReMxZEzvrdazObXMiVpq9Ov3o/edit?tab=t.0) 2022 года
- [Билеты](https://docs.google.com/document/d/1EBdskbN0v1942zgW2qu_datoyJ0yoVxBx69D4sPemyk/edit?tab=t.0) 2022 года
- [Заметки](https://grove-spandex-678.notion.site/1-fe90f5db40b6477ebd439b9f3229e6ee) в notion
- [Еще](https://github.com/AppLoidx/Web-Development-Cheats/blob/master/itmo-university/module%20tests/ModuleTest1Questions.md) 2022 год
- [Задания](https://github.com/AppLoidx/Web-Development-Cheats/blob/master/itmo-university/module%20tests/ModuleTest1.md) на код 2022 года
- Прошлогодняя [рубежка](https://github.com/sub-myitmo/web-rubezhka1)
- [Еще](https://invited-digit-866.notion.site/2022-53c853d396364002b29a1331dfc78bba#80cee9d88a03495ea134ec05a365d43c) заметки в notion от 2022 года
## Разбор типовых задач
### 1. Сделать слошную синюю границу 2px у текстового ввода внутри класса `auth_form` при фокусе
```CSS
.auth-form input[type="text"]:focus {
border: 2px solid blue;
}
```
### 2. Написать миксин на SCSS и использовать его в классе `user-card`, добавить вложенный стиль при наведении курсора
```SCSS
@mixin card-style($bg-color: #ffffff) {
background-color: $bg-color;
border-radius: 8px;
}
.user-card {
@include card-style;
&:hover {
opacity: 0.8;
}
}
```
### 3. Написать код на JS, который читает поле ввода, если там число, то выводит удвоенное значение в консоль, иначе сообщение об ошибке в alert
```JavaScript
const form = document.querySelector("#calcForm");
const input = document.querySelector("#numInput");
form.addEventListener("submit", (event) => {
event.preventDefault();
const text = input.value;
const number = parseFloat(text);
if (isNan(number)) {
alert("Введите число");
} else {
console.log(number*2);
}
});
```
### 4. Написать асинхронную функцию, которая делает POST запрос с координатами точки и возвращает json-ответ
```JavaScript
async function sendCoordinates(x, y) {
const url = "/api/points";
const data = {x: x, y: y};
const response = await fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(data)
});
if (!response.ok) {
throw new Error();
}
const res = await response.json();
return res;
}
```
### 5. Через JQuery поменять элемент с классом `content-box` и вывести значение из поля ввода с id `statusInput`
```JavaScript
$("#toggle-btn").on("click", () => {
$(".content-box").slideUp().css("color", "red");
console.log($("#statusInput").val());
});
```
### 6. Написать FCGI-сценарий, который проверяет строку запроса, если там есть слово `ping`, то выводит `pong`. Иначе возвращает 400 ошибку
```Java
public class Main {
public static void main(String[] args) {
FCGIInterface fcgi = new FCGIInterface();
while (fcgi.accept() >= 0) {
if (FCGIInterface.request == null) {
continue;
}
String query = FCGIInterface.request.getProperty("QUERY_STRING");
if (query != null && query.contains("ping")) {
System.out.println("Content-Type: text/plain\n");
System.out.println("ping");
} else {
System.out.println("Status: 400 Bad Request");
System.out.println("Content-Type: text/plain\n");
System.out.println("Bad Request");
}
}
}
}
```
### 7. Написать сервлет, который считает количество заходов пользователя на сайт через HTTP-сессии
```Java
@WebServlet("/counter")
public class MyServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest req, HttpServletResponse res) {
HttpSession session = req.getSession();
if (session.getAttribute("visitCount") == null) {
session.setAttribute("visitCount", 0);
}
int count = (Integer) session.getAttribute("visitCount") + 1;
session.setAttribute("visitCount", count);
res.setContentType("text/plain");
PrintWriter out = res.getWriter();
out.println("Вы посетили страницу %d раз".format(count));
}
}
```
### 8. Написать сервлет, который проверяет роль пользователя и пропускает, если он админ, иначе переадресация на сообщение об ошибке
```Java
@WebServlet("/task")
public class MyServlet extends HttpServlet {
@Override
public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
String role = req.getParameter("role");
if (role == null || !role.equals("admin")) {
res.sendRedirect("/access-denied.html");
}
req.setAttribute("secretData", "TopSecret123");
RequestDispatcher disp = req.getRequestDispatcher("/admin.jsp");
disp.forward(req, res);
}
}
```
### 9. Написать фильтр, который пропускает пользователя дальше, только если в его сессии есть атрибут `user`
```Java
@WebFilter("/secure/*")
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {
HttpServletRequest httpReq = (HttpServletRequest) req;
HttpServletResponse httpRes = (HttpServletResponse) res;
HttpSession session = httpReq.getSession();
if (session.getAttribute("user")==null) {
httpRes.setContentType("text/plain");
httpRes.setStatus(403);
hhtpRes.getWriter().println("Вход воспрещен");
} else {
chain.doFilter(req, res);
}
}
}
```
### 10. Реализовать функцию на JavaScript, которая будет закрывать текущее окно, если в нем открыт гугл
```JavaScript
function closeWindow() {
if (window.location.href === "https://www.google.ru") {
window.close();
}
}
```
### 11. Открытие в новом окне браузера гугла через JS
```JavaScript
window.open("http://google.com", "newwin", "width=1200,height=600");
```
@@ -9,10 +9,10 @@
Проводит практик
1 - конец октября
2 - декабрь
[Материалы](../Лабы/Веб/Рубежка%201.md) по первой рубежке
## Лабы
На сайте великого тюнита, их 4
На том же сайте гайд на деплой фронта на гелиос
Напомню классику - [Гайд на 2 курс гитхаб](https://github.com/Imtjl/2nd-year-guide) - там гайд на деплой лаб
[Деплой лаб](../Лабы/Веб/Деплой%20лаб.md) - гайд на деплой лаб
## Лекции
[Веб](../../Веб/Веб.md)
## Материалы
@@ -1,7 +1,5 @@
В Java: статическая типизация, сильная, явная
Типы делятся на: [примитивные](Типы%20данных.md#Примитивные%20типы%20данных) и [ссылочные](Типы%20данных.md#Ссылочные%20типы%20данных)
Типы делятся на: [](.md#Примитивные%20типы%20данных|примитивные) и [](.md#Ссылочные%20типы%20данных|ссылочные)
Типы делятся на: примитивные и ссылочные
# Примитивные типы данных
1. Целые - `byte`, `short`, `int`, `long`
2. Символьный - `char`
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+6
View File
@@ -0,0 +1,6 @@
## Что это?
Методички по семенарам (разжёванная теория для самых маленьких + доп материалы)
[Семинар-1](Семинары/Семинар-1.md) - Окружение, инструменты, первая программа
[Семинар-2](Семинары/Семинар-2.md) - Функции, стек, конечные автоматы