diff --git a/s3_db/course01/assets/fonts/times.ttf b/s3_db/course01/assets/fonts/times.ttf new file mode 100644 index 0000000..55f734a Binary files /dev/null and b/s3_db/course01/assets/fonts/times.ttf differ diff --git a/s3_db/course01/assets/fonts/timesbd.ttf b/s3_db/course01/assets/fonts/timesbd.ttf new file mode 100644 index 0000000..0fc9d84 Binary files /dev/null and b/s3_db/course01/assets/fonts/timesbd.ttf differ diff --git a/s3_db/course01/assets/images/image_2024-12-28_19-01-52.png b/s3_db/course01/assets/images/image_2024-12-28_19-01-52.png new file mode 100644 index 0000000..bf6f6bf Binary files /dev/null and b/s3_db/course01/assets/images/image_2024-12-28_19-01-52.png differ diff --git a/s3_db/course01/assets/images/stackoverflow-dev-survey-2024-technology-most-popular-technologies-database-prof-social.png b/s3_db/course01/assets/images/stackoverflow-dev-survey-2024-technology-most-popular-technologies-database-prof-social.png new file mode 100644 index 0000000..0d9ebb1 Binary files /dev/null and b/s3_db/course01/assets/images/stackoverflow-dev-survey-2024-technology-most-popular-technologies-database-prof-social.png differ diff --git a/s3_db/course01/docker/compose.yml b/s3_db/course01/docker/compose.yml new file mode 100644 index 0000000..0d26101 --- /dev/null +++ b/s3_db/course01/docker/compose.yml @@ -0,0 +1,46 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/compose-spec/compose-spec/master/schema/compose-spec.json +# @help: https://docs.docker.com/compose/compose-file + +x-healthcheck: &healthcheck + interval: "10s" + retries: 3 + start_period: "10s" + timeout: "5s" + +secrets: + psql_pswd: + external: true + name: "${STACK}_psql_pswd" + +services: + psql-primary: + deploy: + replicas: 1 + environment: + POSTGRES_INITDB_ARGS: "--auth=scram-sha-256" + POSTGRES_PASSWORD_FILE: "/run/secrets/psql_pswd" + healthcheck: + <<: *healthcheck + test: + - "CMD" + - "pg_isready" + # @see: https://www.postgresql.org/docs/release + image: "docker.io/library/postgres:17.2" + ports: + - protocol: "tcp" + published: 5432 + target: 5432 + secrets: + - "psql_pswd" + user: "postgres" + volumes: + - source: "../sql/" + target: "/docker-entrypoint-initdb.d/" + type: "bind" + - source: "psql_data" + target: "/var/lib/postgresql/data/" + type: "volume" + +volumes: + psql_data: + name: "{{.Service.Name}}-{{.Task.Slot}}_data" diff --git a/s3_db/course01/justfile b/s3_db/course01/justfile new file mode 100644 index 0000000..4a624c4 --- /dev/null +++ b/s3_db/course01/justfile @@ -0,0 +1,41 @@ +_default: + @just --list + +export STACK := env_var_or_default("STACK", "marine") + +PSQL_SRV := STACK + "_psql-primary" +PSQL_SEC := "psql_pswd" + +CID := "docker service ps --quiet $1 | xargs docker inspect --format {{.Status.ContainerStatus.ContainerID}}" +IID := "docker service ps --quiet $1 | xargs docker inspect --format {{.Spec.ContainerSpec.Image}}" +SECRET := "docker exec $1 cat /run/secrets/$2" + +deploy: + docker stack deploy --compose-file "./docker/compose.yml" --detach=false "{{STACK}}" + +exec cid=shell(CID, PSQL_SRV) iid=shell(IID, PSQL_SRV) secret=shell(SECRET, cid, PSQL_SEC): + docker run --rm -it --add-host "host.docker.internal:host-gateway" --env "PGPASSWORD={{secret}}" "{{iid}}" \ + psql --host "host.docker.internal" --port 5432 --username "postgres" + +init: + -docker swarm init + -openssl rand -base64 32 | docker secret create "{{STACK}}_psql_pswd" - + +rm: + docker stack rm --detach=false "{{STACK}}" + +rmv: + docker volume ls --filter "label=com.docker.stack.namespace={{STACK}}" --quiet | xargs --no-run-if-empty docker volume rm --force + +fonts_dir := join("assets", "fonts") +typst_flags := "--font-path " + fonts_dir + " --ignore-system-fonts " + "--root " + justfile_directory() + +typst_dst := join("target", "typst", "main.pdf") +typst_src := join("typst", "main.typ") + +compile: + mkdir -p {{ parent_directory(typst_dst) }} + typst compile {{ typst_flags }} {{ typst_src }} {{ typst_dst }} + +preview: + tinymist preview {{ typst_flags }} {{ typst_src }} diff --git a/s3_db/course01/readme.md b/s3_db/course01/readme.md new file mode 100644 index 0000000..762e74c --- /dev/null +++ b/s3_db/course01/readme.md @@ -0,0 +1,5 @@ +# s3_db/course01 + +```shell +just init deploy exec +``` diff --git a/s3_db/course01/typst/acronym.typ b/s3_db/course01/typst/acronym.typ new file mode 100644 index 0000000..461a8d4 --- /dev/null +++ b/s3_db/course01/typst/acronym.typ @@ -0,0 +1,7 @@ +#import "@preview/abbr:0.1.0" + +#set heading(outlined: false) + +#abbr.list(columns: 1, title: [ПЕРЕЛІК УМОВНИХ ПОЗНАЧЕНЬ]) + +#abbr.add("RDBMS", "Relational Database Management System") diff --git a/s3_db/course01/typst/appendix.typ b/s3_db/course01/typst/appendix.typ new file mode 100644 index 0000000..f06e0e8 --- /dev/null +++ b/s3_db/course01/typst/appendix.typ @@ -0,0 +1 @@ += ДОДАТКИ diff --git a/s3_db/course01/typst/body.typ b/s3_db/course01/typst/body.typ new file mode 100644 index 0000000..3b356df --- /dev/null +++ b/s3_db/course01/typst/body.typ @@ -0,0 +1,13 @@ +#set heading(numbering: "1.1") + += ОПИС ПРЕДМЕТНОГО СЕРЕДОВИЩА + += АНАЛІЗ ІСНУЮЧИХ ПРОГРАМНИХ ПРОДУКТІВ + += ПОСТАНОВКА ЗАВДАННЯ + += ПОБУДОВА ER-МОДЕЛІ + += РЕАЛІЗАЦІЯ БАЗИ ДАНИХ + += РОБОТА З БАЗОЮ ДАНИХ diff --git a/s3_db/course01/typst/contents.typ b/s3_db/course01/typst/contents.typ new file mode 100644 index 0000000..1773e74 --- /dev/null +++ b/s3_db/course01/typst/contents.typ @@ -0,0 +1,3 @@ +#show heading: set align(center) + +#outline(title: [ЗМІСТ]) diff --git a/s3_db/course01/typst/hayagriva.yml b/s3_db/course01/typst/hayagriva.yml new file mode 100644 index 0000000..477650d --- /dev/null +++ b/s3_db/course01/typst/hayagriva.yml @@ -0,0 +1,18 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/mkdjr/hayagriva/refs/heads/main/hayagriva.schema.json +# @help: https://github.com/typst/hayagriva/blob/main/docs/file-format.md + +# TODO: https://github.com/typst/hayagriva/pull/192 + +db_engines_2023: + title: "PostgreSQL is the DBMS of the Year 2023" + type: "web" + url: + date: "2024-01-02" + value: "https://db-engines.com/en/blog_post/106" + +so_survey_2024: + title: "Developers want more, more, more: the 2024 results from Stack Overflow Developer Survey" + type: "web" + url: + date: "2024-07-24" + value: "https://stackoverflow.blog/2024/07/24/developers-want-more-more-more-the-2024-results-from-stack-overflow-s-annual-developer-survey" diff --git a/s3_db/course01/typst/intro.typ b/s3_db/course01/typst/intro.typ new file mode 100644 index 0000000..5e9f398 --- /dev/null +++ b/s3_db/course01/typst/intro.typ @@ -0,0 +1,31 @@ +#import "@preview/abbr:0.1.0" + += ВСТУП + +Рейтинг DB-Engines #footnote[https://db-engines.com/en/ranking_trend] ранжує #abbr.s[RDBMS] за популярністю, охоплюючи +понад 410 систем. Критерії включають кількість результатів у пошукових системах при пошуку назв систем, обговорення +Google Trends, Stack Overflow, пропозиції роботи зі згадками про системи, кількість профілів у професійних мережах, +таких як LinkedIn, згадки в соціальних мережах, таких як Twitter. Оновлюється щомісяця. + +PostgreSQL було визнано одним з найуспішніших проектів з відкритим вихідним кодом в історії @db_engines_2023. Це +пов'язане з послідовними та суттєвими вдосконаленнями системи, які сприяють надійності та стабільності, що вже четвертий +рік поспіль приводить до перемоги в категорії "#abbr.s[RDBMS] року 2023" (див. @img:db_engines_2023). + +#figure(caption: [Порівняння популярності #abbr.s[RDBMS]], image("../assets/images/image_2024-12-28_19-01-52.png")) + +Stack Overflow - це цифрова платформа, на якій користувачі можуть ставити питання та залишати відповіді на запитання +інших користувачів. З 2011 року проводить щорічне опитування розробників під назвою "Stack Overflow Annual Developer +Survey" #footnote[https://survey.stackoverflow.co]. У травні 2024 року понад 65 000 розробників взяли учать в опитуванні +про програмування, роботу, штучний інтелект, а також про те, як вони до цього ставляться і не тільки. + +Дослідження інструментів і технологій, які зараз використовуються та очікуються до впровадження розробниками, виявляє +помітні тенденції. PostgreSQL стала претендентом на першість у категорії баз даних @so_survey_2024. Вперше включена в +опитування в 2018 році, вона отримала помітний рівень прийняття серед розробників - 33%, на відміну від переважаючого +59% прийняття MySQL. З того часу PostgreSQL продемонструвала значне зростання використання. Шість років потому її +використовують 52% розробників (див. @img:so_survey_2024), що робить її найпопулярнішою #abbr.s[RDBMS] другий рік +поспіль. + +#figure( + caption: [Результати опитування], + image("../assets/images/stackoverflow-dev-survey-2024-technology-most-popular-technologies-database-prof-social.png"), +) diff --git a/s3_db/course01/typst/main.typ b/s3_db/course01/typst/main.typ new file mode 100644 index 0000000..b6d3466 --- /dev/null +++ b/s3_db/course01/typst/main.typ @@ -0,0 +1,75 @@ +#show heading: set text(weight: "regular") +#show heading.where(level: 1): set align(center) +#show heading.where(level: 1): set text(weight: "bold") +#show link: set text(fill: blue.darken(30%)) + +// TODO: https://github.com/typst/typst/issues/311 +#show figure: it => block[ #it #v(-par.spacing) #{ "" } ] +#show heading: it => [ #it #v(-par.spacing) #{ "" } ] +#show list: it => [ #it #v(-par.spacing) #{ "" } ] +#show terms: it => [ #it #v(-par.spacing) #{ "" } ] + +// Текст на сторінці розміщується з дотриманням наступних відступів: зверху, знизу, зліва – не менше 20 мм, справа – не +// менше 10 мм. При комп’ютерному наборі використовується шрифт Times New Roman, розмір шрифту – 14рр, міжрядковий інтервал +// – 1.5, вирівнювання абзаців – по ширині, перший рядок – відступ 1,25 см. +// TODO: https://github.com/typst/typst/issues/4224 +#let leading = 1.5em +#let leading = leading - 0.75em +#set document(author: "", title: "БАЗА ДАНИХ ДЛЯ МОРСЬКОГО ВАНТАЖНОГО ТЕРМІНАЛУ") +#set page(margin: (bottom: 2cm, left: 2cm, right: 1cm, top: 2cm), paper: "a4") +#set par(first-line-indent: 1.25em, justify: true, leading: leading, spacing: leading) +#set text(font: "Times New Roman", lang: "ua", region: "ua", size: 14pt) + +// Для нумерації сторінок, розділів, підрозділів, пунктів, підпунктів використовують арабські цифри. Першою сторінкою +// курсової роботи є титульний аркуш. На титульному аркуші номер сторінки не ставлять, на наступних сторінках номер +// проставляють зверху у правому куті. Кожен розділ повинен мати свій номер, який записується перед його назвою. Після +// номера розділу крапка не ставиться. +#set page(header: context{ + let current = counter(page).get().first() + if current > 1 { + align(right, numbering("1", current)) + } +}) + +// Кожен розділ необхідно розпочинати з нової сторінки. Розділ може складатися з підрозділів. Підрозділи нумерують у межах +// кожного розділу. Номер підрозділу складається з номера розділу і порядкового номера підрозділу, між якими ставлять +// крапку. У кінці номера підрозділу крапка так само не ставиться. Наступні розділи курсової роботи: ЗМІСТ, ВСТУП, +// ВИСНОВКИ, СПИСОК ВИКОРИСТАНОЇ ЛІТЕРАТУРИ не мають порядкового номера, але всі аркуші, на яких розміщені згадані +// структурні частини курсової, нумерують звичайним чином. +#show heading.where(level: 1): it => { + if it.supplement != [outline] { + pagebreak(weak: true) + } + it +} +#show outline: set heading(supplement: [outline]) + +// Рисунки (схеми, діаграми, скріншоти) і таблиці надаються безпосередньо після тексту, де вони згадані вперше. Рисунки +// позначають словом "Рисунок" і нумерують послідовно у межах розділу. Номер рисунку складається з номера розділу і +// порядкового номера рисунку в рамках розділу, між якими ставиться крапка. Після номеру рисунку крапка не ставиться. +// Підпис рисунків розміщують під самим рисунком по центру тексту. +#show figure.where(kind: image): set figure.caption(position: bottom, separator: [ ]) +#show figure.where(kind: image): set figure(numbering: i => numbering("1.1", counter(heading).get().first(), i)) +#show figure.where(kind: image): it => { show figure.caption: set align(center); it } +#show heading: it => { counter(figure.where(kind: image)).update(0); it } + +// Таблиці, як і рисунки, нумерують послідовно у межах розділу. У лівому верхньому куті з абзацного відступу над таблицею +// розміщують напис "Таблиця" із зазначенням її номера. Номер таблиці складається з номера розділу і порядкового номера +// таблиці, між якими ставиться крапка. Після номеру таблиці крапка не ставиться. При переносі частини таблиці на наступну +// сторінку над частиною перенесеною таблиці з абзацного відступу вказують "Продовження таблиці" і номер таблиці. +#show figure.where(kind: table): set figure.caption(position: top, separator: [ ]) +#show figure.where(kind: table): set figure(numbering: i => numbering("1.1", counter(heading).get().first(), i)) +#show figure.where(kind: table): it => { show figure.caption: set align(left); it } +#show heading: it => { counter(figure.where(kind: table)).update(0); it } + +// Додаток повинен починатися з нової сторінки та мати заголовок. Додатки позначаються великими літерами української +// абетки, за винятком літер Г, Є, І, Ї, Й, О, Ч, Ь. + +#include "title.typ" +#include "contents.typ" +#include "acronym.typ" +#include "intro.typ" +#include "body.typ" +#include "summary.typ" +#include "reference.typ" +#include "appendix.typ" diff --git a/s3_db/course01/typst/reference.typ b/s3_db/course01/typst/reference.typ new file mode 100644 index 0000000..e6f8ebf --- /dev/null +++ b/s3_db/course01/typst/reference.typ @@ -0,0 +1,8 @@ +#show heading: set align(center) + +#bibliography( + "./hayagriva.yml", + // TODO: https://github.com/tetiuk/dstu-8302-2015/blob/main/dstu-8302-2015.csl + // style: "./dstu-8302-2015.csl", + title: [СПИСОК ВИКОРИСТАНОЇ ЛІТЕРАТУРИ], +) diff --git a/s3_db/course01/typst/summary.typ b/s3_db/course01/typst/summary.typ new file mode 100644 index 0000000..84ef6f3 --- /dev/null +++ b/s3_db/course01/typst/summary.typ @@ -0,0 +1 @@ += ВИСНОВКИ diff --git a/s3_db/course01/typst/title.typ b/s3_db/course01/typst/title.typ new file mode 100644 index 0000000..b4d8737 --- /dev/null +++ b/s3_db/course01/typst/title.typ @@ -0,0 +1,4 @@ +#set heading(outlined: false) + +#counter(page).update(3) +#pagebreak()