70 Commits
hw3 ... hw7

Author SHA1 Message Date
011e19e531 lab7 added 2026-01-09 19:36:55 +10:00
5d7ecb1f13 math fixed 2026-01-01 15:57:09 +10:00
9fef1e5b0d finishing touches 2026-01-01 15:24:08 +10:00
c09b7b5769 images fixed 2026-01-01 15:05:20 +10:00
cf80fd251e small refactor 2026-01-01 14:37:53 +10:00
46e3696d85 reset bug fixed 2026-01-01 14:17:34 +10:00
9e5950490a values checking added 2026-01-01 14:04:53 +10:00
26bc727758 tooltip for output fields added 2026-01-01 13:52:51 +10:00
04db81b55a math fixed 2025-12-31 22:13:22 +10:00
4ab5967abe basic structure created 2025-12-31 20:42:21 +10:00
63af3ed7b4 prettify 2025-12-29 14:06:51 +10:00
b2c005e22c transpose + reverse + index fix in lab6 2025-12-29 14:05:04 +10:00
4cf2f56749 jab6 bad rotation 2025-12-29 13:58:34 +10:00
b0c3660f16 moved files (again?) 2025-12-29 12:46:23 +10:00
b47e479b95 moved files 2025-12-29 12:46:22 +10:00
eb509fb846 Merge branch 'hw3' 2025-12-29 12:42:10 +10:00
9870335263 Merge branch 'lab6' 2025-12-29 12:25:45 +10:00
7cc781c0b9 gitignore added 2025-12-29 00:27:39 +10:00
8eaf1ed628 Merge branch 'hw3' 2025-12-29 00:18:51 +10:00
7b1c5b0a50 lab 6 done 2025-12-29 00:12:40 +10:00
4316ac1636 finished table controls 2025-12-29 00:12:40 +10:00
a4f511cb45 table added 2025-12-29 00:12:39 +10:00
dd9002a61b added table controls 2025-12-29 00:12:38 +10:00
e142436ed3 details BEM 2025-12-29 00:12:38 +10:00
38e70189b8 details page in progress 2025-12-29 00:12:38 +10:00
39d023d50b stylus mixins 2025-12-29 00:12:37 +10:00
05b624120d BEM naming 2025-12-29 00:12:37 +10:00
7a83c54165 main page working 2025-12-29 00:12:36 +10:00
c495c26320 added stylus template 2025-12-29 00:12:36 +10:00
3982a97dce updating styles 2025-12-29 00:12:36 +10:00
8f89dbe429 adding pages 2025-12-29 00:12:35 +10:00
98b74ae77d aboba mv node 2025-12-29 00:12:34 +10:00
bdc5a9d55c starting hw 2025-12-29 00:11:33 +10:00
8900cf3228 gitignore fix 2025-12-29 00:09:07 +10:00
4cc6b7e9d8 lab 6 done 2025-12-29 00:03:52 +10:00
73ea28eab6 finished table controls 2025-12-12 11:35:56 +10:00
ea0b091c8a table added 2025-12-12 10:57:38 +10:00
c53abdb678 added table controls 2025-12-12 10:10:30 +10:00
2b4a36c1ff details BEM 2025-12-11 22:26:18 +10:00
03e7b28167 details page in progress 2025-12-11 21:58:56 +10:00
a25b444c01 stylus mixins 2025-12-11 20:47:40 +10:00
d54afa7b2e BEM naming 2025-12-11 20:41:43 +10:00
01dfe8011d main page working 2025-12-11 19:59:17 +10:00
deeb9dbd5c added stylus template 2025-12-10 12:24:54 +10:00
2f44691a98 added lecture 3 2025-12-10 10:21:18 +10:00
36fb1653d3 lab5 finished 2025-11-28 12:01:09 +10:00
0bdaa800f6 nfww that was a fake 2025-11-28 11:05:07 +10:00
ebe6566b87 updated styling for lab 2025-11-28 10:52:14 +10:00
b653d69e77 updating styles 2025-11-28 10:15:15 +10:00
6720bfd450 adding pages 2025-11-28 01:31:50 +10:00
726b6e7adb aboba mv node 2025-11-28 01:23:28 +10:00
093d57a619 starting hw 2025-11-28 01:23:09 +10:00
d468d0efb4 added lab5 2025-11-28 00:47:07 +10:00
dc039301f6 margin fix for images 2025-11-27 22:07:43 +10:00
fa9ac16021 fixed images 2025-11-27 22:06:00 +10:00
e1e6e066ce added footer 2025-11-14 13:18:52 +10:00
977735a6a3 lab-4 2025-11-14 12:52:31 +10:00
58427fae25 basic structure added for lab4 2025-11-14 02:37:59 +10:00
654e9d2734 updated hw 2025-11-14 02:23:20 +10:00
9aadb0ce16 possibly added hw 2025-11-14 02:13:50 +10:00
b3ebd075b2 adding real lab4 2025-11-14 01:03:54 +10:00
c32a4a6fc2 OMAGAH O HELL NAH WTF MAAAN 2025-11-14 00:33:21 +10:00
c36e781e05 preparations for hw 2025-11-14 00:32:28 +10:00
dd9ee56a1a stray divs removed 2025-11-13 17:00:08 +10:00
80176d2a2e Merge branch 'lab4' 2025-11-13 16:56:40 +10:00
369c5c0428 bruh linux fix 2025-11-13 16:55:05 +10:00
62f1791203 Merge branch 'hw3' 2025-11-13 16:47:36 +10:00
124bc09d44 adding bootstrap 2025-11-01 01:21:25 +10:00
91a952aaf0 adding resources 2025-10-31 12:05:20 +10:00
d691d57037 fixed attributes 2025-10-31 10:27:11 +10:00
113 changed files with 22563 additions and 2948 deletions

3
.gitignore vendored
View File

@@ -1,2 +1,3 @@
**node_modules
**to_reform
**to_reform
.vscode

View File

@@ -1,37 +0,0 @@
import csv
def create_html_table_from_csv(csv_path, html_path):
try:
with open(csv_path, 'r', newline='', encoding='utf-8') as csv_file:
reader = csv.reader(csv_file)
header = next(reader)
with open(html_path, 'w', encoding='utf-8') as html_file:
html_file.write('<table class="data-table">\n')
html_file.write('<thead>\n')
html_file.write('<tr>\n')
for column_header in header:
html_file.write(f'<th>{column_header}</th>\n')
html_file.write('</tr>\n')
html_file.write('</thead>\n')
html_file.write('<tbody>\n')
for row in reader:
html_file.write('<tr>\n')
for cell in row:
html_file.write(f'<td>{cell}</td>\n')
html_file.write('</tr>\n')
html_file.write('</tbody>\n')
html_file.write('</table>\n')
print(f"Successfully created {html_path} from {csv_path}")
except:
pass
if __name__ == '__main__':
csv_file_name = 'temp_sensor_data.csv'
html_file_name = 'test.html'
create_html_table_from_csv(csv_file_name, html_file_name)

6692
current_site/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

30
current_site/package.json Normal file
View File

@@ -0,0 +1,30 @@
{
"name": "template_pug",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"build": "webpack --mode production",
"serve": "webpack serve --open --mode development",
"dev": "webpack --mode development",
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"chokidar": "^4.0.3",
"css-loader": "^6.8.1",
"filemanager-webpack-plugin": "^8.0.0",
"glob": "^11.0.3",
"html-webpack-plugin": "^5.5.3",
"pug": "^2.0.4",
"pug-loader": "^2.4.0",
"style-loader": "^3.3.3",
"stylus": "^0.61.0",
"stylus-loader": "^7.1.3",
"webpack": "^5.89.0",
"webpack-cli": "^5.1.4",
"webpack-dev-server": "^4.15.1"
}
}

View File

@@ -0,0 +1,306 @@
block variables
-
var navbarItems = {
Home: './index.html',
Embedded: './embeded_details.html',
OpenCV: './opencv_details.html',
Photography: './photography-details.html',
Table: './table.html',
Institute: './images/institute.png'
};
var smallCards = [
{
header: 'Заголовок',
text: '3D printers are versatile tools used for creating prototypes, custom parts, and artistic designs. They work by layering materials.',
image: require('../images/16x10/3d-printer.jpeg'),
imageAlt: '3D Printer',
link: '#',
},
{
header: 'BLHeli ESCs',
text: 'BLHeli ESCs are electronic speed controllers designed for drones, offering smooth and precise motor control.',
image: require('../images/16x10/blheli-esc.jpeg'),
imageAlt: 'BLHeli ESC',
link: '#',
},
{
header: 'Raspberry Pi Nano',
text: 'Raspberry Pi Nano is a compact computer ideal for learning, prototyping, and IoT projects. It is highly energy-efficient.',
image: require('../images/16x10/rpi-nano.jpeg'),
imageAlt: 'Raspberry Pi Nano',
link: '#',
},
{
header: 'Smart Thermostats',
text: 'Smart thermostats help regulate home temperatures efficiently, saving energy and enhancing comfort with automation.',
image: require('../images/16x10/thermostat.jpeg'),
imageAlt: 'Smart Thermostat',
link: '#',
}
];
var galleryImages= [
{ src: require('../images/sqarucos.png'), alt: 'ESP32'},
{ src: require('../images/sqstm32.png'), alt: 'Arduino'},
{ src: require('../images/sqesp32.png'), alt: 'STM32'}
];
var locationFilters = [
{ id: 'loc_kitchen', value: 'Kitchen', label: 'Kitchen' },
{ id: 'loc_living', value: 'Living Room', label: 'Living Room' },
{ id: 'loc_balcony', value: 'Balcony', label: 'Balcony' },
{ id: 'loc_bedroom', value: 'Bedroom', label: 'Bedroom' }
];
var sensorTypeFilters = [
{ id: 'type_xiaomi', value: 'Xiaomi', label: 'Xiaomi' },
{ id: 'type_bmp220', value: 'Bmp220', label: 'Bmp220' },
{ id: 'type_scd30', value: 'Scd30(Internal)', label: 'Scd30(Internal)' },
{ id: 'type_bmp280', value: 'Bmp280', label: 'Bmp280' }
];
var sortOptions = [
{ value: '', label: '-- None --' },
{ value: 'SensorID', label: 'SensorID' },
{ value: 'Timestamp', label: 'Time' },
{ value: 'BatteryLevel', label: 'BatteryLevel' },
{ value: 'Temperature', label: 'Temperature' },
{ value: 'Humidity', label: 'Humidity' }
];
var axisOptions = [
{ id: 'x_time', value: 'Time', label: 'Time', checked: true },
{ id: 'x_battery', value: 'BatteryLevel', label: 'BatteryLevel', checked: false },
{ id: 'x_temperature', value: 'Temperature', label: 'Temperature', checked: false },
{ id: 'x_humidity', value: 'Humidity', label: 'Humidity', checked: false }
];
var valueOptions = [
{ id: 'val_temperature', value: 'AverageTemperature', label: 'Average Temperature', checked: true },
{ id: 'val_humidity', value: 'Humidity', label: 'Average Humidity', checked: false },
{ id: 'val_battery', value: 'BatteryLevel', label: 'Average BatteryLevel', checked: false }
]
var sensorData = [
{
sensorId: 'TEMP-001',
location: 'Balcony',
timestamp: '2025-10-03T03:41:50Z',
temperature: 19.4,
tempDifference: -0.2,
sensorType: 'Bmp220',
batteryLevel: 95,
humidity: 38.1,
lastCalibrationDate: '2025-07-26'
},
{
sensorId: 'TEMP-003',
location: 'Bedroom',
timestamp: '2025-10-03T03:42:46Z',
temperature: 18.2,
tempDifference: -0.1,
sensorType: 'Xiaomi',
batteryLevel: 75,
humidity: 45.5,
lastCalibrationDate: '2025-07-21'
},
{
sensorId: 'TEMP-004',
location: 'Balcony',
timestamp: '2025-10-03T03:43:48Z',
temperature: 24.1,
tempDifference: 0.1,
sensorType: 'Xiaomi',
batteryLevel: 72,
humidity: 50.5,
lastCalibrationDate: '2025-08-30'
},
{
sensorId: 'TEMP-001',
location: 'Balcony',
timestamp: '2025-10-03T03:44:34Z',
temperature: 19.1,
tempDifference: -0.3,
sensorType: 'Bmp220',
batteryLevel: 95,
humidity: 56.5,
lastCalibrationDate: '2025-07-26'
},
{
sensorId: 'TEMP-006',
location: 'Kitchen',
timestamp: '2025-10-03T03:45:46Z',
temperature: 22.8,
tempDifference: 0.0,
sensorType: 'Scd30(Internal)',
batteryLevel: 80,
humidity: 41.4,
lastCalibrationDate: '2025-09-10'
},
{
sensorId: 'TEMP-010',
location: 'Balcony',
timestamp: '2025-10-03T03:46:18Z',
temperature: 21.7,
tempDifference: 0.5,
sensorType: 'Scd30(Internal)',
batteryLevel: 79,
humidity: 59.8,
lastCalibrationDate: '2025-08-07'
},
{
sensorId: 'TEMP-006',
location: 'Balcony',
timestamp: '2025-10-03T03:47:05Z',
temperature: 22.7,
tempDifference: -0.1,
sensorType: 'Scd30(Internal)',
batteryLevel: 80,
humidity: 36.1,
lastCalibrationDate: '2025-09-10'
},
{
sensorId: 'TEMP-006',
location: 'Bedroom',
timestamp: '2025-10-03T03:48:13Z',
temperature: 22.9,
tempDifference: 0.2,
sensorType: 'Scd30(Internal)',
batteryLevel: 80,
humidity: 56.1,
lastCalibrationDate: '2025-09-10'
},
{
sensorId: 'TEMP-005',
location: 'Living Room',
timestamp: '2025-10-03T03:49:03Z',
temperature: 24.4,
tempDifference: 0.4,
sensorType: 'Bmp180',
batteryLevel: 91,
humidity: 30.1,
lastCalibrationDate: '2025-08-07'
},
{
sensorId: 'TEMP-001',
location: 'Kitchen',
timestamp: '2025-10-03T03:50:24Z',
temperature: 19.1,
tempDifference: 0.0,
sensorType: 'Bmp220',
batteryLevel: 95,
humidity: 64.8,
lastCalibrationDate: '2025-07-26'
},
{
sensorId: 'TEMP-008',
location: 'Living Room',
timestamp: '2025-10-03T03:51:12Z',
temperature: 21.9,
tempDifference: -0.1,
sensorType: 'Scd30(Internal)',
batteryLevel: 92,
humidity: 36.0,
lastCalibrationDate: '2025-08-02'
},
{
sensorId: 'TEMP-009',
location: 'Balcony',
timestamp: '2025-10-03T03:51:46Z',
temperature: 22.3,
tempDifference: 0.0,
sensorType: 'Xiaomi',
batteryLevel: 76,
humidity: 74.0,
lastCalibrationDate: '2025-09-17'
},
{
sensorId: 'TEMP-003',
location: 'Kitchen',
timestamp: '2025-10-03T03:52:23Z',
temperature: 18.4,
tempDifference: 0.2,
sensorType: 'Xiaomi',
batteryLevel: 75,
humidity: 45.2,
lastCalibrationDate: '2025-07-21'
},
{
sensorId: 'TEMP-010',
location: 'Living Room',
timestamp: '2025-10-03T03:53:44Z',
temperature: 21.8,
tempDifference: 0.1,
sensorType: 'Scd30(Internal)',
batteryLevel: 79,
humidity: 36.3,
lastCalibrationDate: '2025-08-07'
},
{
sensorId: 'TEMP-001',
location: 'Kitchen',
timestamp: '2025-10-03T03:54:46Z',
temperature: 18.7,
tempDifference: -0.4,
sensorType: 'Bmp220',
batteryLevel: 95,
humidity: 44.3,
lastCalibrationDate: '2025-07-26'
},
{
sensorId: 'TEMP-006',
location: 'Bedroom',
timestamp: '2025-10-03T03:55:24Z',
temperature: 23.3,
tempDifference: 0.4,
sensorType: 'Scd30(Internal)',
batteryLevel: 80,
humidity: 55.9,
lastCalibrationDate: '2025-09-10'
},
{
sensorId: 'TEMP-002',
location: 'Kitchen',
timestamp: '2025-10-03T03:55:57Z',
temperature: 17.7,
tempDifference: -0.5,
sensorType: 'Scd30(Internal)',
batteryLevel: 93,
humidity: 70.2,
lastCalibrationDate: '2025-08-30'
},
{
sensorId: 'TEMP-002',
location: 'Balcony',
timestamp: '2025-10-03T03:57:05Z',
temperature: 17.4,
tempDifference: -0.3,
sensorType: 'Scd30(Internal)',
batteryLevel: 93,
humidity: 66.7,
lastCalibrationDate: '2025-08-30'
},
{
sensorId: 'TEMP-009',
location: 'Living Room',
timestamp: '2025-10-03T03:58:28Z',
temperature: 22.6,
tempDifference: 0.3,
sensorType: 'Xiaomi',
batteryLevel: 76,
humidity: 56.4,
lastCalibrationDate: '2025-09-17'
},
{
sensorId: 'TEMP-004',
location: 'Bedroom',
timestamp: '2025-10-03T03:59:51Z',
temperature: 24.3,
tempDifference: 0.2,
sensorType: 'Xiaomi',
batteryLevel: 72,
humidity: 47.3,
lastCalibrationDate: '2025-08-30'
}
];

View File

@@ -0,0 +1,24 @@
include mixins.pug
html
head
meta(charset="UTF-8")
block title
title Details Page
body
block navbar
+navbarMixin("")
.details
header.details__header
block header
h1 Default Header
.details__content
.details__text
block text
p Default text content
.details__gallery
block gallery
p No images available

View File

@@ -0,0 +1,158 @@
include data.pug
mixin navbarMixin(selectedItem)
.navbar
each navbarUrl,navbarName in navbarItems
if navbarName == selectedItem
a.navbar__link-wrapper(href=navbarUrl)
.navbar__item.navbar__item_selected #{navbarName}
else
a.navbar__link-wrapper(href=navbarUrl)
.navbar__item #{navbarName}
mixin infoCardsMinxin()
each cardData in smallCards
.small-card
.small-card__content
h3.small-card__header #{cardData.header}
p.small-card__text #{cardData.text}
a.small-card__link(href=cardData.link) Подробнее»
.small-card__image
img(src=cardData.image alt=cardData.imageAlt)
mixin galleryMixin()
each img in galleryImages
img.gallery__image(src=img.src alt=img.alt)
mixin filtersMixin()
details.filters
summary.filters__summary Filters
form.filters__form
fieldset.filters__fieldset
.filter-group
i.filter-group__label
b Location
br
.filter-group__items
each filter in locationFilters
input.filter-group__checkbox(type="checkbox" id=filter.id name="location" value=filter.value)
span #{filter.label}
br
.filter-group
i.filter-group__label
b Sensor Type
br
.filter-group__items
each filter in sensorTypeFilters
input.filter-group__checkbox(type="checkbox" id=filter.id name="sensor_type" value=filter.value)
span #{filter.label}
br
.filter-group
i.filter-group__label
b Numeric Values
br
.filter-group__range
span Temperature from:
input.filter-group__input(type="number" name="temp_min" placeholder="20")
span to:
input.filter-group__input(type="number" name="temp_max" placeholder="30")
br
span Humidity from:
input.filter-group__input(type="number" name="humidity_min" placeholder="40")
span to:
input.filter-group__input(type="number" name="humidity_max" placeholder="60")
br
.filter-group
i.filter-group__label
b Device Specific Filters
br
.filter-group__items
span Sensor Name:
input.filter-group__input(type="text" name="sensor_name")
br
span Days Since Calibration (max):
input.filter-group__input(type="number" name="calibration_days" placeholder="30")
br
.filter-group
i.filter-group__label
b Measurement Period
br
.filter-group__dates
span From:
input.filter-group__input(type="date" name="date_from")
br
span To:
input.filter-group__input(type="date" name="date_to")
br
.filter-group__buttons
input.filter-group__button.filter-group__button--submit(type="submit" value="Apply Filters")
input.filter-group__button.filter-group__button--reset(type="reset" value="Reset Filters")
mixin sortLevel(level)
.sort-level
i.sort-level__label
b Sort Level #{level}
br
label.sort-level__field-label(for=`sort${level}`) Field:
select.sort-level__select(id=`sort${level}` name=`sort${level}`)
each option in sortOptions
option(value=option.value) #{option.label}
label.sort-level__reverse-label(for=`sort${level}_reverse`)
input.sort-level__checkbox(type="checkbox" id=`sort${level}_reverse` name=`sort${level}_reverse`)
span Reverse
br
if level === '3'
input.sort-level__submit(type="submit" value="Sort")
else
br
mixin sortingMixin()
- const sortLevels = ['1', '2', '3'];
details.sorting
summary.sorting__summary Sortings
form.sorting__form
fieldset.sorting__fieldset
each level in sortLevels
+sortLevel(level)
mixin graphXOption(option)
if option.checked
input.axis-group__radio(type="radio" id=option.id name="x_axis" value=option.value checked)
else
input.axis-group__radio(type="radio" id=option.id name="x_axis" value=option.value)
label.axis-group__option-label(for=option.id) #{option.label}
br
mixin graphYOption(option)
if option.checked
input.values-group__checkbox(type="checkbox" id=option.id name="values" value=option.value checked)
else
input.values-group__checkbox(type="checkbox" id=option.id name="values" value=option.value)
label.values-group__option-label(for=option.id) #{option.label}
br
mixin graphMixin()
details.graph
summary.graph__summary Graph
form.graph__form
fieldset.graph__fieldset
.axis-group
i.axis-group__label
b X axis
br
.axis-group__options
each option in axisOptions
+graphXOption(option)
.values-group
i.values-group__label
b Values
br
.values-group__options
each option in valueOptions
+graphYOption(option)
button.values-group__button(type="submit" id="build_graph" name="build_graph") Build

View File

Before

Width:  |  Height:  |  Size: 198 KiB

After

Width:  |  Height:  |  Size: 198 KiB

View File

Before

Width:  |  Height:  |  Size: 159 KiB

After

Width:  |  Height:  |  Size: 159 KiB

View File

Before

Width:  |  Height:  |  Size: 106 KiB

After

Width:  |  Height:  |  Size: 106 KiB

View File

Before

Width:  |  Height:  |  Size: 229 KiB

After

Width:  |  Height:  |  Size: 229 KiB

View File

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

View File

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View File

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

Before

Width:  |  Height:  |  Size: 1.2 MiB

After

Width:  |  Height:  |  Size: 1.2 MiB

View File

Before

Width:  |  Height:  |  Size: 80 KiB

After

Width:  |  Height:  |  Size: 80 KiB

View File

Before

Width:  |  Height:  |  Size: 347 KiB

After

Width:  |  Height:  |  Size: 347 KiB

View File

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 41 KiB

View File

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 1.1 MiB

View File

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

View File

Before

Width:  |  Height:  |  Size: 2.3 MiB

After

Width:  |  Height:  |  Size: 2.3 MiB

View File

Before

Width:  |  Height:  |  Size: 5.2 MiB

After

Width:  |  Height:  |  Size: 5.2 MiB

View File

Before

Width:  |  Height:  |  Size: 99 KiB

After

Width:  |  Height:  |  Size: 99 KiB

View File

Before

Width:  |  Height:  |  Size: 3.9 MiB

After

Width:  |  Height:  |  Size: 3.9 MiB

View File

Before

Width:  |  Height:  |  Size: 4.4 MiB

After

Width:  |  Height:  |  Size: 4.4 MiB

View File

Before

Width:  |  Height:  |  Size: 1.9 MiB

After

Width:  |  Height:  |  Size: 1.9 MiB

View File

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 65 KiB

View File

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

View File

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 53 KiB

View File

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 50 KiB

View File

Before

Width:  |  Height:  |  Size: 99 KiB

After

Width:  |  Height:  |  Size: 99 KiB

View File

@@ -0,0 +1,3 @@
import './styles/index.styl'
import './styles/details.styl'
import './styles/table.styl'

View File

@@ -0,0 +1,51 @@
include ../components/mixins.pug
-
const infoBlockA = {
header: "Embedded Systems",
text: "Had a serval projects with different MCUs and wrote firmware for them. My main stack consists of Platformio+EspIdf or Arduino, also tried STM32 asdadas",
description: "I love embeded development beceuse of autonomity of produced devices, the redices are not dependant on any other hardware and can work autunomously",
img: require('../images/AQ_monitor.png'),
imgAlt: "ESP32"
}
const infoBlockB = {
header: "Embedded Systems",
text: "Had a serval projects with different MCUs and wrote firmware for them. My main stack consists of Platformio+EspIdf or Arduino, also tried STM32",
description: "I love embeded development device because of autonomity of produced devices, the devices are not dependant on any other hardware and can work autunomously or off the grid",
img: require('../images/remote.jpeg'),
imgAlt: "ESP32"
}
html(lang="en")
head
meta(charset="UTF-8")
title Portfolio
body
+navbarMixin("Home")
.gallery
+galleryMixin()
.main-container
.main-container__content
article.info-block
h2.info-block__header #{infoBlockA.header}
.info-block__container.info-block__container_layout-a
p.info-block__text #{infoBlockA.text}
.info-block__details
p.info-block__description #{infoBlockA.description}
a.info-block__link(href="#") More info
img.info-block__image(src=infoBlockA.img alt=infoBlockA.imgAlt)
article.info-block
h2.info-block__header #{infoBlockB.header}
.info-block__container.info-block__container_layout-b
p.info-block__text #{infoBlockB.text}
img.info-block__image(src=infoBlockB.img alt=infoBlockB.imgAlt)
.info-block__details
p.info-block__description #{infoBlockB.description}
a.info-block__link(href="./photography-details.html") More info
.sidebar
+infoCardsMinxin()

View File

@@ -0,0 +1,22 @@
extends ../components/details-template.pug
block title
title Photography Portfolio - Details
block navbar
+navbarMixin("Photography")
block header
h1.details__title Photography
p.details__description I prefer landscape photography.
block text
p.details__text-content D3100 -> SLT A58.
block gallery
.details__gallery-item
img.details__gallery-image(src=require('../images/photos/image0.png') alt="Photography 1")
.details__gallery-item
img.details__gallery-image(src=require('../images/photos/image1.png') alt="Photography 2")
.details__gallery-item
img.details__gallery-image(src=require('../images/photos/image2.png') alt="Photography 3")

View File

@@ -0,0 +1,25 @@
include ../components/mixins.pug
include ../components/data.pug
head
title table
body
+navbarMixin("Table")
.table-controls
+filtersMixin()
+sortingMixin()
+graphMixin()
table.table
tbody.table-content
each dataItem,index in sensorData
if index == 0
tr.table-content__table-header
each value,header in dataItem
th #{header}
tr.table-content__table-row
each value,header in dataItem
td #{value}

View File

@@ -0,0 +1,58 @@
.details
margin 0 auto
padding 20px
.details__header
margin-bottom 20px
text-align center
.details__title
margin-bottom 5px
.details__description
margin auto
.details__content
display flex
gap 40px
align-items flex-start
.details__text
flex 1
text-align justify
.details__text-content
margin auto 30px
.details__gallery
display flex
flex-direction column
gap 20px
margin auto
.details__gallery-item
overflow hidden
border-radius 8px
box-shadow 0 4px 12px rgba(0, 0, 0, 0.1)
transition transform 0.3s ease, box-shadow 0.3s ease
&:hover
transform translateY(-5px)
box-shadow 0 8px 20px rgba(0, 0, 0, 0.15)
.details__gallery-image
width 100%
height 250px
object-fit cover
display block
@media screen and (max-width: 700px)
.details__content
flex-direction column
.details__gallery
order -1 // Move gallery above text
.details__gallery-image
height 300px

View File

@@ -0,0 +1,166 @@
item_h=3em;
double-border()
border-top double thick silver
border-bottom double thick silver
flex-center()
display flex
align-items center
justify-content center
text-center-bold()
text-align center
font-weight bold
display block
grid-responsive(columns)
display grid
grid-template-columns columns
grid-template-rows 1fr
.navbar
double-border()
font-size 0
grid-responsive(repeat(7, min-content))
justify-items start
&__link-wrapper
color black
text-decoration none
&__item
display inline-block
width max-content
height item_h
line-height item_h
text-align center
vertical-align middle
padding 0 10px
margin @padding
overflow hidden
text-overflow ellipsis
font-size medium
&_selected
color green
font-weight bold
border-left double thin silver
border-right double thin silver
.gallery
display flex
flex-direction row
width 90%
margin auto
&__image
margin auto
width 100%
border thin solid black
&:nth-child(2n+1)
margin-top 10px
.main-container
grid-responsive(3fr 1fr)
.info-block
border solid thin black
padding 2vw
margin 1vw 0
&__header
text-center-bold()
&__container
&_layout-a
grid-responsive(3fr 3fr 2fr)
&_layout-b
grid-responsive(4fr 7fr 4fr)
& > *
margin 2vw
&__text, &__description
text-align justify
&__image
margin auto
width 100%
&__link
color inherit
.sidebar
border-left thin solid black
margin 30px 0 0 50px
.small-card
margin 20px 10px 0
grid-responsive(1fr 1fr)
&__content
text-align justify
&__header
text-center-bold()
text-align right
&__link
display block
text-align right
color inherit
&__image
& img
width 100%
margin-left:10px
@media screen and (max-width: 1000px)
.small-card
display flex
flex-direction column
.sidebar
margin 0
width:100%
@media screen and (max-width: 800px)
.navbar
grid-responsive(1fr 1fr)
grid-template-rows 1fr 1fr 1fr
justify-items center
&__item
&_selected
border-bottom double thick silver
border-left none
border-right none
.gallery
display inline-flex
flex-direction column
width 100%
&__image
width 100%
height 100%
&:nth-child(2n+1)
margin-top 0px
.main-container
display flex
flex-direction column
.info-block
&__container
&_layout-a, &_layout-b
display flex
flex-direction column

View File

@@ -0,0 +1,6 @@
.table, .table-content *, .table-content
border: 1px solid black;
border-collapse: collapse;
.table-content__table-row:nth-child(2n)
background: #F0FFF0;

View File

@@ -0,0 +1,69 @@
const HtmlWebpackPlugin = require("html-webpack-plugin");
const FileManagerPlugin = require("filemanager-webpack-plugin");
const path = require("path");
const fs = require("fs");
const pagesDir = path.join(__dirname, "src", "pages");
const pages = fs.readdirSync(pagesDir).filter(file => file.endsWith(".pug"));
module.exports = {
output: {
path: path.join(__dirname, "dist"),
filename: "index.[contenthash].js",
assetModuleFilename: path.join("images", "[name].[contenthash][ext]"),
},
entry: path.join(__dirname, "src", "index.js"),
module: {
rules: [
{
test: /\.pug$/,
loader: "pug-loader",
},
{
test: /\.(png|jpg|jpeg|gif)$/i,
type: "asset/resource",
},
{
test: /\.svg$/,
type: "asset/resource",
generator: {
filename: path.join("icons", "[name].[contenthash][ext]"),
},
},
{
test: /\.styl$/,
use: [
{
loader: "style-loader",
},
{
loader: "css-loader",
},
{
loader: "stylus-loader",
},
],
},
],
},
plugins: [
...pages.map(
(page) =>
new HtmlWebpackPlugin({
template: path.join(pagesDir, page),
filename: page.replace(".pug", ".html"),
})
),
new FileManagerPlugin({
events: {
onStart: {
delete: ["dist"],
},
},
}),
],
devServer: {
watchFiles: path.join(__dirname, "src"),
port: 9000,
},
};

View File

@@ -1,104 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>
Embedded Details
</title>
</head>
<body bgcolor="#F0F8FF">
<details>
<summary>Menu</summary>
<ul>
<li><a href="./index.html">Home</a></li>
<li><a href="./embeded_details.html"><h4>Embeded Details</h4></a></li>
<li><a href="./opencv_details.html">OpenCV Details</a></li>
<li><a href="./photography_details.html">Photography Details</a></li>
<li><a href="./table.html">Table with filters (not working yet)</a></li>
<li><a href="./images/institute.png">Institute</a></li>
</ul>
</details>
<h2 align="center">Embedded Details</h2>
<hr width="800" align="center">
<p align="center">
<img src="./images/esp32.png" alt="ESP32" height="150">
<img src="./images/arduino.png" alt="Arduino" height="150">
<img src="./images/stm32.png" alt="STM32" height="150">
</p>
<p align="justify">My programming path started with embeded systems,
i love all the low level things that Mcu could do with just a little bit of code,
sometimes build or flashing progress could take some time to get a hand of , but after that everething usualy
goes smooth</p>
<p align="justify">The first MCU i tried was a ATmega328P,
after some time i was surprised with the debug capabilities on the Stm32
and now i'm working with esp32-s3 , that's a good chip, has internal JTAG and all the shiny wireless interfaces
but feels faulty
for some reason <i> regular segfaults with CDC</i></p>
<h3 align="center">Microcontroller Comparison Table</h3>
<table border="1" align="center" cellpadding="6" cellspacing="0">
<tr>
<th>Board/MCU</th>
<th>UART Count</th>
<th>Dynamic UART Assignment</th>
<th>ADC Channels</th>
<th>Debug Support</th>
<th>Flash Size</th>
<th>Wireless Connectivity</th>
</tr>
<tr>
<td>ESP32</td>
<td>3</td>
<td>Yes (via IO MUX)</td>
<td>18</td>
<td>JTAG, Serial</td>
<td>4MB (typical)</td>
<td>Wi-Fi, Bluetooth</td>
</tr>
<tr>
<td>ESP32-S3</td>
<td>3</td>
<td>Yes (via IO MUX)</td>
<td>20</td>
<td>JTAG, Serial</td>
<td>8MB (typical)</td>
<td>Wi-Fi, Bluetooth LE</td>
</tr>
<tr>
<td>ESP-01</td>
<td>1</td>
<td>No</td>
<td>1</td>
<td>Serial only</td>
<td>512KB/1MB</td>
<td>Wi-Fi</td>
</tr>
<tr>
<td>Arduino Uno (ATmega328P)</td>
<td>1</td>
<td>No</td>
<td>6</td>
<td>Serial, DebugWire</td>
<td>32KB</td>
<td>None</td>
</tr>
<tr>
<td>Blue Pill (STM32F103C8T6)</td>
<td>3</td>
<td>Yes (remappable)</td>
<td>10</td>
<td>SWD, Serial</td>
<td>64KB/128KB</td>
<td>None</td>
</tr>
</table>
<p align="right"> no rpi pico here , the build system has won over my temper</p>
</body>
</html>

112
hw/hw6/hw6.js Normal file
View File

@@ -0,0 +1,112 @@
let templates = [
[
"X--X----",
"-XXX-X--",
"----X---",
"----X---",
"------XX",
"----XX--",
"X-------",
"-XX--X--"
],
[
"---XX---",
"----X-X-",
"---XX---",
"---X----",
"-X------",
"X----X-X",
"--X--X--",
"-X----XX"
],
[
"-X-X----",
"---X-X--",
"X-XX--X-",
"--X-X---",
"------X",
"--------",
"X-----X-",
"-X-X---X"
],
[
"-XX-X---",
"-----X--",
"----X---",
"-----X-X",
"-X-X--X-",
"-XX----X",
"-X------",
"XX------"
], [
"----XX-X",
"X-------",
"--------",
"-----XX-",
"---X-X--",
"-X---XX-",
"-X-X----",
"----XXX-"
], [
"XX------",
"-----X--",
"-------X",
"-X-X----",
"X-X----X",
"-X-X-X-X",
"----X-X-",
"-X------"
],
];
const squareSize = templates[0].length;
//convert to arrays for mutability
let temp = []
for (let n = 0; n < templates.length; n++) {
temp.push([])
for (let i = 0; i < squareSize; i++) {
temp[n].push([]);
for (let j = 0; j < squareSize; j++) {
temp[n][i].push(templates[n][i][j] == "X" ? 1 : 0);
}
}
}
templates = temp;
const encodedMsg = "Р_НАЙА_СЛЗДЕОСЖСТОИКНОЛЬЛЬТКУЮО__КЗАЕВАОКАЧОЖЗ_УЧАСМОДУ_ТЮЖЕ";
function rotateTemplate(template) {
for (let i = 0; i < squareSize; i++) {
for (let j = 0; j < i; j++) {
let temp = template[i][j];
template[i][j] = template[j][i];
template[j][i] = temp;
}
}
for (let i = 0; i < squareSize; i++) {
for (let j = 0; j < squareSize / 2; j++) {
let temp = template[i][j];
template[i][j] = template[i][(squareSize - 1) - j];
template[i][(squareSize - 1) - j] = temp;
}
}
}
for (let n = 0; n < templates.length; n++) {
let out = ""
for (let rot = 0; rot < 4; rot++) {
for (let i = 0; i < squareSize; i++) {
for (let j = 0; j < squareSize; j++) {
if (templates[n][i][j]) {
out += encodedMsg[i * squareSize + j];
}
}
}
rotateTemplate(templates[n]);
}
console.log(out);
console.log("=======");
}

BIN
hw/hw7/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

108
hw/hw7/hw7.css Normal file
View File

@@ -0,0 +1,108 @@
.desctription-heading{
font-size: medium;
text-align: center;
}
.main-container {
display: flex;
gap: 20px;
align-items: flex-start;
}
.scheme-image{
flex: 1;
max-width: 400px;
height: auto;
object-fit: contain;
}
.controls-container {
display: flex;
flex-direction: column;
gap: 20px;
flex: 1;
min-width: 300px;
max-width: 400px;
}
.inputs{
min-width: 300px;
}
.outputs{
min-width: 300px;
}
.radio-label{
display: inline-block;
}
p{
line-height: 0;
}
.max-w{
width: 100%;
}
.bad-input-tooltip {
display: block;
background: #ffffff;
color: #721c24;
border: 1px solid #8f0c19;
padding: 4px 8px;
max-width: 220px;
white-space: normal;
}
.bad-input-highlight {
outline: 2px solid #990917;
}
.hidden{
display: none;
}
body{
display: flex;
flex-direction: column;
gap: 20px;
}
table {
width: 100%;
border-collapse: collapse;
margin: 16px 0;
}
th, td {
border: 1px solid #ccc;
text-align: left;
}
th {
background-color: #f5f5f5;
font-weight: bold;
}
tr:nth-child(even) {
background-color: #fafafa;
}
@media (max-width: 800px) {
.main-container {
flex-direction: column;
align-items: center;
}
.scheme-image {
max-width: 100%;
width: 100%;
}
.controls-container {
width: 100%;
max-width: none;
}
.inputs, .outputs {
min-width: unset;
width: 100%;
}
}

71
hw/hw7/hw7.html Normal file
View File

@@ -0,0 +1,71 @@
<html>
<head>
<title>калькулятор равнобедренного треугольника</title>
<link rel="stylesheet" href="./hw7.css">
<link rel="icon" href="favicon.ico">
<link rel="stylesheet" href="https://unpkg.com/xp.css/dist/98.css"
>
</head>
<body>
<h3 class="desctription-heading">калькулятор равнобедренного треугольника</h3>
<div class="main-container">
<div class="image-container">
<img src="./imgs/type1.png" class="scheme-image" id="schemeImageA">
<img src="./imgs/type2.png" class="scheme-image hidden" id="schemeImageB">
</div>
<div class="controls-container">
<div class="inputs" id="inputsForm">
<p>Выберете варинат входных данных:</p>
<input type="radio" name="input-type" id="radioButtonA" checked>
<label class="radio-label" for="radioButtonA">
<span>боковая сторона и угол при основании</span>
</label><br>
<input type="radio" name="input-type" id="radioButtonB">
<label class="radio-label" for="radioButtonB">
<span>основание и прилежащий к нему угол</span>
</label>
<form>
<fieldset id="inputTypeFieldsetA">
<legend>входные данные</legend>
<label for="equalSideLength">Длина боковой стороны B:<span class="bad-input-tooltip hidden" id="equalSideLengthErr"></span></label><br>
<input class="max-w" type="number" min="0" id="equalSideLength">
<br>
<label for="baseAngle">Угол при основании α (в градусах):<span class="bad-input-tooltip hidden" id="baseAngleErr"></span></label><br>
<input class="max-w" type="number" min="0" max="180" id="baseAngle">
</fieldset>
<fieldset id="inputTypeFieldsetB" class="hidden">
<legend>входные данные</legend>
<label for="baseSideLength">Длина основания A:<span class="bad-input-tooltip hidden" id="baseSideLengthErr"></span></label><br>
<input class="max-w" type="number" min="0" id="baseSideLength">
<br>
<label for="baseAdjacentAngle">Угол прилежащий основанию β:<span class="bad-input-tooltip hidden" id="baseAdjacentAngleErr"></span></label><br>
<input class="max-w" type="number" min="0" max="180" id="baseAdjacentAngle">
</fieldset>
<fieldset id="outputsFieldset">
<legend>что вычислить</legend>
<span class="bad-input-tooltip hidden" id="outputValuesErr"><br></span>
<input type="checkbox" name="output-valuesR" id="outputValuesR" checked>
<label for="outputValuesR">радиус вписанной окружности</label><br>
<input type="checkbox" name="output-valuesH" id="outputValuesH" checked>
<label for="outputValuesH">высоты треугольника</label><br>
<input type="checkbox" name="output-valuesL" id="outputValuesL" checked>
<label for="outputValuesL">длины сторон треугольника</label><br>
</fieldset>
<button id="calculateButton" disabled>Вычислить</button>
<button id="clearButton">Отчислить</button>
</form>
</div>
<table class="outputs hidden" id="outputsTable">
</table>
</div>
</div>
</body>
<script src="./hw7.js">
</script>
</html>

357
hw/hw7/hw7.js Normal file
View File

@@ -0,0 +1,357 @@
let elements = {
radioA: document.getElementById('radioButtonA'),
radioB: document.getElementById('radioButtonB'),
fieldsetA: document.getElementById('inputTypeFieldsetA'),
fieldsetB: document.getElementById('inputTypeFieldsetB'),
imageA: document.getElementById('schemeImageA'),
imageB: document.getElementById('schemeImageB'),
inputsForm: document.getElementById('inputsForm'),
equalSideLength: document.getElementById('equalSideLength'),
equalSideLengthErr: document.getElementById('equalSideLengthErr'),
baseAngle: document.getElementById('baseAngle'),
baseAngleErr: document.getElementById('baseAngleErr'),
baseSideLength: document.getElementById('baseSideLength'),
baseSideLengthErr: document.getElementById('baseSideLengthErr'),
baseAdjacentAngle: document.getElementById('baseAdjacentAngle'),
baseAdjacentAngleErr: document.getElementById('baseAdjacentAngleErr'),
outputsFieldset: document.getElementById('outputsFieldset'),
outputValuesErr: document.getElementById('outputValuesErr'),
outputR: document.getElementById('outputValuesR'),
outputH: document.getElementById('outputValuesH'),
outputL: document.getElementById('outputValuesL'),
calculateButton: document.getElementById('calculateButton'),
clearButton: document.getElementById('clearButton'),
outputsTable: document.getElementById('outputsTable')
}
console.log("loaded js!");
let currentModeIsA = true;
let outputFields = {};
let inputsA = {
l: null,
angle: null
};
let inputsB = {
l: null,
angle: null
};
function highlightErrorElement(errorFieldIndex, add = true) {
let fields = [
elements.equalSideLength,
elements.baseAngle,
elements.baseSideLength,
elements.baseAdjacentAngle,
outputsFieldset
];
if (fields[errorFieldIndex]) {
if (add) {
fields[errorFieldIndex].classList.add("bad-input-highlight");
}
else {
fields[errorFieldIndex].classList.remove("bad-input-highlight");
}
}
}
function setErrTooltip(errorFieldIndex, tooltip) {
let errElem = [
elements.equalSideLengthErr,
elements.baseAngleErr,
elements.baseSideLengthErr,
elements.baseAdjacentAngleErr,
elements.outputValuesErr
][errorFieldIndex];
if (errElem) {
highlightErrorElement(errorFieldIndex, tooltip !== "");
if (tooltip !== "") {
errElem.classList.remove("hidden");;
}
else {
errElem.classList.add("hidden");;
}
if (errorFieldIndex == 4) {
tooltip += "<br>"
}
errElem.innerHTML = tooltip;
}
}
function deg2rad(degrees) {
return degrees * (Math.PI / 180);
}
function getCalculations() {
let heights = [];//base related, side realted
let lengths = [];// base side
let radius = 0;
let baseAngle = 0;
let sideAngle = 0;
if (currentModeIsA) {
lengths[0] = 2 * Math.sin(deg2rad(inputsA.angle) / 2) * inputsA.l;
lengths[1] = inputsA.l;
baseAngle = inputsA.angle;
sideAngle = (180 - baseAngle) / 2;
}
else {
lengths[0] = inputsB.l;
lengths[1] = inputsB.l / (2 * Math.cos(deg2rad(inputsB.angle)));
sideAngle = inputsB.angle;
baseAngle = 180 - 2 * sideAngle;
}
let a = lengths[0];
let b = lengths[1];
let p = (a + b + b) / 2;
radius = Math.sqrt((p - a) * (p - b) * (p - b) / p);
heights[0] = lengths[1] * Math.sin(deg2rad(sideAngle));
heights[1] = lengths[0] * Math.sin(deg2rad(baseAngle));
return {
radius: radius,
heights: heights,
lengths: lengths
};
}
function updateCheckboxes() {
outputFields["radius"] = elements.outputR.checked;
outputFields["heights"] = elements.outputH.checked;
outputFields["lengths"] = elements.outputL.checked;
let ret = !outputFields.radius && !outputFields.heights && !outputFields.lengths;
if (ret) {
setErrTooltip(4, "Выберите хотя бы один параметр для вывода.");
} else {
setErrTooltip(4, "");
}
updateCalculateButton();
}
function updateCalculateButton() {
let ret = false;
if (currentModeIsA) {
ret = inputsA["l"] !== null && inputsA["angle"] !== null
}
else {
ret = inputsB["l"] !== null && inputsB["angle"] !== null
}
ret &= elements.outputR.checked || elements.outputH.checked || elements.outputL.checked;
elements.calculateButton.disabled = !ret;
}
function switchInputs(selectA) {
if (selectA) {
elements.imageA.classList.remove("hidden");
elements.imageB.classList.add("hidden");
elements.fieldsetA.classList.remove("hidden");
elements.fieldsetB.classList.add("hidden");
}
else {
elements.imageA.classList.add("hidden");
elements.imageB.classList.remove("hidden");
elements.fieldsetA.classList.add("hidden");
elements.fieldsetB.classList.remove("hidden");
}
updateCalculateButton();
}
function displayTable(calcResults) {
let table = elements.outputsTable;
table.innerHTML = ""; // Clear previous content
let header = "<tr><th>Параметр</th><th>Значение</th></tr>";
let rows = "";
if (outputFields.radius) {
rows += `<tr><td>R</td><td>${calcResults.radius.toFixed(3)}</td></tr>`;
}
if (outputFields.heights) {
rows += `<tr><td>h1</td><td>${calcResults.heights[0].toFixed(3)}</td></tr>`;
rows += `<tr><td>h2</td><td>${calcResults.heights[1].toFixed(3)}</td></tr>`;
}
if (outputFields.lengths) {
rows += `<tr><td>A</td><td>${calcResults.lengths[0].toFixed(3)}</td></tr>`;
rows += `<tr><td>B</td><td>${calcResults.lengths[1].toFixed(3)}</td></tr>`;
}
table.innerHTML = header + rows;
if (rows === "") {
table.innerHTML = `<h3>Выберите параметры для вычислений, сейчас таблица пустая</h3>`;
}
table.classList.remove("hidden");
}
function clearCurrentInputs() {
if (currentModeIsA) {
elements.equalSideLength.value = null;
elements.baseAngle.value = null;
setErrTooltip(0, "");
setErrTooltip(1, "");
inputsA = {
l: null,
angle: null
};
}
else {
inputsB = {
l: null,
angle: null
};
setErrTooltip(2, "");
setErrTooltip(3, "");
elements.baseSideLength.value = null;
elements.baseAdjacentAngle.value = null;
}
elements.outputsTable.classList.add("hidden");
updateCalculateButton()
}
function check180Angle(angleString) {
let angle = parseFloat(angleString);
if (isNaN(angle)) {
return "Введите корректное число";
}
if (angle <= 0) {
return "Угол должен быть больше 0";
}
if (angle >= 180) {
return "Угол должен быть меньше 180";
}
return "";
}
function check90Angle(angleString) {
let angle = parseFloat(angleString);
if (isNaN(angle)) {
return "Введите корректное число";
}
if (angle <= 0) {
return "Угол должен быть больше 0";
}
if (angle >= 90) {
return "Угол должен быть меньше 90";
}
return "";
}
function checkLength(lengthString) {
let length = parseFloat(lengthString);
if (!isFinite(length)) {
return "Введите корректное число";
}
if (length <= 0) {
return "Длина должна быть больше 0";
}
return "";
}
function handleSwitchInputs(event) {
if (event.target.id[event.target.id.length - 1].toLowerCase() == "a") {
currentModeIsA = true;
switchInputs(true);
console.log("Switching inputs to A");
}
else {
currentModeIsA = false;
switchInputs(false);
console.log("Switching inputs to B");
}
}
function handleInputsUpdate(event) {
switch (event.target.id) {
case "equalSideLength":
{
const err = checkLength(event.target.value);
setErrTooltip(0, err);
if (err === "") {
inputsA.l = parseFloat(event.target.value);
} else {
inputsA.l = null;
}
}
break;
case "baseAngle":
{
const err = check180Angle(event.target.value);
setErrTooltip(1, err);
if (err === "") {
inputsA.angle = parseFloat(event.target.value);
} else {
inputsA.angle = null;
}
}
break;
case "baseSideLength":
{
const err = checkLength(event.target.value);
setErrTooltip(2, err);
if (err === "") {
inputsB.l = parseFloat(event.target.value);
} else {
inputsB.l = null;
}
}
break;
case "baseAdjacentAngle":
{
const err = check90Angle(event.target.value);
setErrTooltip(3, err);
if (err === "") {
inputsB.angle = parseFloat(event.target.value);
} else {
inputsB.angle = null;
}
}
break;
default:
console.log(event.target.id)
break;
}
updateCalculateButton();
}
function handleFieldsetEvent(event) {
if (event.target.type === 'radio') {
handleSwitchInputs(event);
} else if (event.target.type === 'number') {
handleInputsUpdate(event);
}
}
elements.inputsForm.addEventListener('change', handleFieldsetEvent);
elements.inputsForm.addEventListener('input', handleFieldsetEvent);
elements.outputsFieldset.addEventListener('change', (event) => {
if (event.target.type === 'checkbox') {
updateCheckboxes();
}
});
elements.clearButton.addEventListener('click', (event) => {
event.preventDefault();
clearCurrentInputs()
});
elements.calculateButton.addEventListener('click', (event) => {
event.preventDefault();
displayTable(getCalculations());
});
// чтобы не сконфузило
updateCheckboxes();
switchInputs(elements.radioA.checked);

BIN
hw/hw7/imgs/type1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

BIN
hw/hw7/imgs/type2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

197
index.css
View File

@@ -1,197 +0,0 @@
/* menu part */
.menu {
border-top: double thick silver;
border-bottom: double thick silver;
font-size: 0;
display: grid;
grid-template-columns: repeat(7, min-content);
grid-template-rows: 1fr;
justify-items: start;
}
.menu-item {
display: inline-block;
width: max-content;
height: 3em;
line-height: 3em;
/* to align to center */
text-align: center;
vertical-align: middle;
padding: 0 10px;
margin: 0 10px;
overflow: hidden;
text-overflow: ellipsis;
font-size: medium;
}
.menu .selected {
color: green;
font-weight: bold;
border-left: double thin silver;
border-right: double thin silver;
}
.menu .menu-header {
color: green;
font-weight: bold;
}
.menu a {
color: black;
}
@media screen and (max-width: 800px) {
.menu {
grid-template-columns: 1fr 1fr;
grid-template-rows: 1fr 1fr 1fr;
justify-items: center;
}
.menu .selected {
border-bottom: double thick silver;
}
}
/* 3 images part */
.images-container {
display: flex;
flex-direction: row;
width: 90%;
margin: auto;
}
.images-container>img {
margin: auto;
width:100%;
border: thin solid black;
}
.images-container>img:nth-child(2n+1) {
margin-top: 10px;
}
@media screen and (max-width: 800px) {
.images-container {
display: inline-flex;
flex-direction: column;
width: 100%;
}
.images-container>img {
width: 100%;
height: 100%;
}
.images-container>img:nth-child(2n+1) {
margin-top: 0px;
}
}
/* text block part */
.info-block-header {
display: block;
font-weight: bold;
text-align: center;
}
.block-border {
border: solid thin black;
padding: 2vw;
margin: 1vw 0;
}
.block-a-container {
display: grid;
grid-template-columns: 3fr 3fr 2fr;
grid-template-rows: 1fr;
}
@media screen and (max-width: 800px) {
.block-a-container {
display: flex;
flex-direction: column;
}
}
.block-b-container {
display: grid;
grid-template-columns: 4fr 7fr 4fr;
grid-template-rows: 1fr;
}
@media screen and (max-width: 800px) {
.block-b-container {
display: flex;
flex-direction: column;
}
}
.h-block>* {
margin: 2vw;
}
.h-block>span,
.h-block>div {
text-align: justify;
}
.h-block>img {
margin: auto;
width: 100%;
}
/*small articles part*/
.main-right{
border-left: thin solid black;
margin: 30px 0 0 50px;
}
.small-info-block{
margin: 20px 10px 0 ;
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-rows: auto;
}
@media screen and (max-width: 1000px) {
.small-info-block {
display: flex;
flex-direction: column;
}
}
.small-info-block-header{
display: block;
font-weight: bold;
text-align: right;
}
.small-info-block-image >img{
width: 100%;
}
.small-info-block-text {
text-align: justify;
}
.small-info-block-text >a{
display: block;
text-align: right;
}
/*main part*/
.main{
display: grid;
grid-template-columns: 3fr 1fr;
grid-template-rows: 1fr;
}
@media screen and (max-width: 800px) {
.main {
display: flex;
flex-direction: column;
}
}

View File

@@ -1,145 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>
"Portfolio"
</title>
<link rel="stylesheet" href="./index.css">
</head>
<body>
<div class="menu">
<a href="./index.html">
<div class="menu-item selected">Home</div>
</a>
<a href="./embeded_details.html">
<div class="menu-item">Embedded</div>
</a>
<a href="./opencv_details.html">
<div class="menu-item">OpenCV</div>
</a>
<a href="./photography_details.html">
<div class="menu-item">Photography</div>
</a>
<a href="./table.html">
<div class="menu-item">Table</div>
</a>
<a href="./images/institute.png">
<div class="menu-item">Institute</div>
</a>
</div>
<div class="images-container">
<img src="./images/sqarucos.png" alt="Arduino">
<img src="./images/sqstm32.png" alt="Institute">
<img src="./images/sqesp32.png" alt="ESP32">
</div>
<div class="main">
<div class="main-center">
<div class="block-border">
<span class="info-block-header">Embedded Systems</span>
<div class="block-a-container h-block">
<span>Had a serval projects with different MCUs and wrote firmware for them.
My main stack consists of Platformio+EspIdf or Arduino, also tried STM32
</span>
<div>
<div>I love embeded development beceuse of autonomity of produced devices, the redices are not
dependant on
any other hardware and can work autunomously
</div>
<a href="#"> More info</a>
</div>
<img src="./images/AQ_monitor.png" alt="ESP32">
</div>
</div>
<div class="block-border">
<span class="info-block-header">Embedded Systems</span>
<div class="block-b-container h-block">
<span>Had a serval projects with different MCUs and wrote firmware for them.
My main stack consists of Platformio+EspIdf or Arduino, also tried STM32
</span>
<img src="./images/remote.jpeg" alt="ESP32">
<div>
<div>I love embeded development device because of autonomity of produced devices, the devices
are
not dependant on
any other hardware and can work autunomously or off the grid</div>
<a href="#"> More info</a>
</div>
</div>
</div>
</div>
<div class="main-right">
<div class="small-info-block">
<div class="small-info-block-text">
<div class="small-info-block-header">Заголовок</div>
<span>
3D printers are versatile tools
used for creating prototypes,
custom parts, and artistic designs.
They work by layering materials.
</span>
<a href="#">Подробнее»</a>
</div>
<div class="small-info-block-image">
<img src="images/16x10/3d-printer.jpeg" alt="3D Printer">
</div>
</div>
<div class="small-info-block">
<div class="small-info-block-text">
<div class="small-info-block-header">BLHeli ESCs</div>
<span>
BLHeli ESCs are electronic
speed controllers designed
for drones, offering smooth
and precise motor control.
</span>
<a href="#">Подробнее»</a>
</div>
<div class="small-info-block-image">
<img src="images/16x10/blheli-esc.jpeg" alt="BLHeli ESC">
</div>
</div>
<div class="small-info-block">
<div class="small-info-block-text">
<div class="small-info-block-header">Raspberry Pi Nano</div>
<span>
Raspberry Pi Nano is a compact
computer ideal for learning,
prototyping, and IoT projects.
It is highly energy-efficient.
</span>
<a href="#">Подробнее»</a>
</div>
<div class="small-info-block-image">
<img src="images/16x10/rpi-nano.jpeg" alt="Raspberry Pi Nano">
</div>
</div>
<div class="small-info-block">
<div class="small-info-block-text">
<div class="small-info-block-header">Smart Thermostats</div>
<span>
Smart thermostats help regulate
home temperatures efficiently,
saving energy and enhancing
comfort with automation.
</span>
<a href="#">Подробнее»</a>
</div>
<div class="small-info-block-image">
<img src="images/16x10/thermostat.jpeg" alt="Smart Thermostat">
</div>
</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,40 @@
CN Tower, Торонто, Канада
553,3-метровая телевизионная башня. Была самым высоким свободно стоящим сооружением в мире с 1976 по 2007 год,
а также до сих пор остаётся таковым в Западном полушарии. Является символом Торонто.
Земляные работы для сооружения железобетонной конструкции с последующим
натяжением арматуры весом 130 000 т начались 12 февраля 1973 г., а уже 2 апреля 1975 г. возведение башни было завершено.
Башня используется для телекоммуникационных нужд. Кроме того, башня используется как обзорная площадка.
Также на башне имеется вращающийся ресторан.
На высоте 447 м находится астрономическая обсерватория.
Бурдж-Халифа, Дубай, ОАЭ
Небоскрёб высотой 828 метров, самое высокое сооружение в мире. Форма здания напоминает сталагмит.
Строительство небоскрёба началось в 2004 году и шло со скоростью 1—2 этажа в неделю. Ежедневно на строительстве
работало до 12 000 рабочих. На его создание ушло около 320 тыс. м³ бетона и более 60 тыс. тонн стальной арматуры.
Бетонные работы были завершены после возведения 160 этажа, далее шла сборка 180-метрового шпиля из металлических
конструкций.
Специально для «Бурдж-Халифа» была разработана особая марка бетона, который выдерживает температуру до +50 °C.
Бетонную смесь укладывали только ночью, а в раствор добавляли лёд.
Небесное дерево, Токио, Япония
Телевизионная башня в районе Сумида самая высокая среди телебашен мира. Высота телебашни вместе с антенной составляет 634 метра.
Высота башни была выбрана так, чтобы цифры: 6 (на старом японском «му»), 3 («са»), 4 («си») были созвучны «Мусаси» —
названию исторической области, где находится современный Токио.
Здание напоминает пятиярусную пагоду, что хорошо сочетается с историческим районом Асакуса на другом берегу реки.
Основание башни напоминает штатив; с высоты примерно 350 м она имеет цилиндрическую форму, позволяющую наслаждаться
панорамными видами реки и города.
Имеются две наблюдательные площадки: одна на высоте 350 м (вместимостью 2000 человек), другая на высоте 450 м
(вместимостью 900 человек).

6
labs/fake-lab4/css/bootstrap.min.css vendored Normal file

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

208
labs/fake-lab4/index.html Normal file
View File

@@ -0,0 +1,208 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Лабораторная работа Bootstrap</title>
<link href="css/bootstrap.min.css" rel="stylesheet">
<script src="js/bootstrap.bundle.min.js"></script>
<style>
.lead{
text-align: justify;
}
@media (max-width: 576px) {
.lead{
font-size: 1rem;
}
}
</style>
</head>
<body>
<header>
<nav class="navbar navbar-expand-md bg-light navbar-light">
<!-- Заголовок -->
<a class="navbar-brand" href="#">Топ высотных зданий</a>
<!-- Кнопка для свернутого меню -->
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#menu">
<span class="navbar-toggler-icon"></span>
</button>
<!-- меню -->
<div class="collapse navbar-collapse" id="menu">
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link active" href="#">Главная</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Список зданий</a>
</li>
<li class="nav-item">
<a class="nav-link disabled" href="#">Контакты</a>
</li>
</ul>
<!-- форма для поиска -->
<form class="d-flex">
<input class="form-control" type="text" placeholder="Найти">
<button class="btn btn-outline-success" type="submit">Найти</button>
</form>
</div>
</nav>
</header>
<div class="row gy-3 text-center d-none d-md-flex">
<div class="col-lg-2 col-md-4 col-6 img-fluid img-thumbnail">
<img src="images/image1.jpg" alt="">
</div>
<div class="col-lg-2 col-md-4 col-6 img-fluid img-thumbnail">
<img src="images/image2.jpg" alt="">
</div>
<div class="col-lg-2 col-md-4 col-6 img-fluid img-thumbnail">
<img src="images/image12.jpg" alt="">
</div>
<div class="col-lg-2 col-md-4 col-6 img-fluid img-thumbnail">
<img src="images/image4.jpg" alt="">
</div>
<div class="col-lg-2 col-md-4 col-6 img-fluid img-thumbnail">
<img src="images/image5.jpg" alt="">
</div>
<div class="col-lg-2 col-md-4 col-6 img-fluid img-thumbnail">
<img src="images/image6.jpg" alt="">
</div>
</div>
<div id="gallery" class="carousel slide carousel-dark d-block d-md-none " data-bs-ride="carousel">
<!-- Содержимое галереи -->
<div class="carousel-inner">
<div class="carousel-item active">
</div>
<div class="carousel-item ">
<img src="images/image1.jpg" class="d-block mx-auto" alt="">
</div>
<div class="carousel-item">
<img src="images/image2.jpg" class="d-block mx-auto" alt="">
</div>
<div class="carousel-item">
<img src="images/image12.jpg" class="d-block mx-auto" alt="">
</div>
<div class="carousel-item">
<img src="images/image4.jpg" class="d-block mx-auto" alt="">
</div>
<div class="carousel-item">
<img src="images/image5.jpg" class="d-block mx-auto" alt="">
</div>
<div class="carousel-item">
<img src="images/image6.jpg" class="d-block mx-auto" alt="">
</div>
</div>
<!-- Кнопки управления -->
<button class="carousel-control-prev" type="button" data-bs-target="#gallery" data-bs-slide="prev">
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
<span class="visually-hidden">Предыдущий</span>
</button>
<button class="carousel-control-next" type="button" data-bs-target="#gallery" data-bs-slide="next">
<span class="carousel-control-next-icon" aria-hidden="true"></span>
<span class="visually-hidden">Следующий</span>
</button>
</div>
<main class="container">
<div class="row">
<div class="col-md-9">
<h2>
CN Tower, <span class="text-muted">Торонто, Канада</span>
</h2>
<p class="lead">
553,3-метровая телевизионная башня. Была самым высоким свободно стоящим сооружением в мире с 1976 по
2007 год,
а также до сих пор остаётся таковым в Западном полушарии. Является символом Торонто.
</p>
<p class="lead">
Земляные работы для сооружения железобетонной конструкции с последующим
натяжением арматуры весом 130 000 т начались 12 февраля 1973 г., а уже 2 апреля 1975 г. возведение
башни было завершено.
</p>
<p class="lead">
Башня используется для телекоммуникационных нужд. Кроме того, башня используется как обзорная
площадка.
Также на башне имеется вращающийся ресторан.
</p>
<p class="lead">
На высоте 447 м находится астрономическая обсерватория.
</p>
</div>
<div class="col-md-3">
<img src="images/image9.jpg">
</div>
</div>
<div class="row order flex-row-reverse">
<div class="col-md-9">
<h2>
Бурдж-Халифа, <span class="text-muted">Дубай, ОАЭ</span>
</h2>
<p class="lead">
Небоскрёб высотой 828 метров, самое высокое сооружение в мире. Форма здания напоминает сталагмит.
</p>
<p class="lead">
Строительство небоскрёба началось в 2004 году и шло со скоростью 1—2 этажа в неделю. Ежедневно на строительстве
работало до 12 000 рабочих. На его создание ушло около 320 тыс. м³ бетона и более 60 тыс. тонн стальной арматуры.
Бетонные работы были завершены после возведения 160 этажа, далее шла сборка 180-метрового шпиля из металлических
конструкций.
</p>
<p class="lead">
Специально для «Бурдж-Халифа» была разработана особая марка бетона, который выдерживает температуру до +50 °C.
Бетонную смесь укладывали только ночью, а в раствор добавляли лёд.
</p>
</div>
<div class="col-md-3">
<img src="images/image13.jpg">
</div>
</div>
<div class="row">
<div class="col-md-9">
<h2>
Небесное дерево, <span class="text-muted">Токио, Япония</span>
</h2>
<p class="lead">
Телевизионная башня в районе Сумида самая высокая среди телебашен мира. Высота телебашни вместе с антенной составляет 634 метра.
Высота башни была выбрана так, чтобы цифры: 6 (на старом японском «му»), 3 («са»), 4 («си») были созвучны «Мусаси» —
названию исторической области, где находится современный Токио.
</p>
<p class="lead">
Здание напоминает пятиярусную пагоду, что хорошо сочетается с историческим районом Асакуса на другом берегу реки.
Основание башни напоминает штатив; с высоты примерно 350 м она имеет цилиндрическую форму, позволяющую наслаждаться
панорамными видами реки и города.
</p>
<p class="lead">
Имеются две наблюдательные площадки: одна на высоте 350 м (вместимостью 2000 человек), другая на высоте 450 м
(вместимостью 900 человек).
</p>
</div>
<div class="col-md-3">
<img src="images/image11.jpg">
</div>
</div>
</main>
</body>
</html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
labs/fake-lab5/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
node_modules

6695
labs/fake-lab5/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,30 @@
{
"name": "template_pug",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"build": "webpack --mode production",
"serve": "webpack serve --open --mode development",
"dev": "webpack --mode development",
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"chokidar": "^4.0.3",
"css-loader": "^6.8.1",
"filemanager-webpack-plugin": "^8.0.0",
"glob": "^11.0.3",
"html-webpack-plugin": "^5.5.3",
"pug": "^2.0.4",
"pug-loader": "^2.4.0",
"style-loader": "^3.3.3",
"stylus": "^0.61.0",
"stylus-loader": "^7.1.3",
"webpack": "^5.89.0",
"webpack-cli": "^5.1.4",
"webpack-dev-server": "^4.15.1"
}
}

View File

@@ -0,0 +1,36 @@
block variables
- var title = 'Самые высокие здания и сооружения'
-
var dictMenu = {'Главная': 'index.html',
'Небоскребы' : "#",
'Башни': "#",
'Список': "#"
}
- var listImages = ['image1.jpg', 'image2.jpg', 'image3.jpg', 'image4.jpg', 'image5.jpg']
-
var listSections = [
{'header' : 'Бурдж-Халифа в Дубае, ОАЭ',
'image' : 'image7.jpg',
'text' : 'Небоскрёб высотой 828 метров, самое высокое сооружение в мире. Форма здания напоминает сталагмит.'
},
{'header' : 'Токийское небесное дерево, Япония',
'image' : 'image6.jpg',
'text' : 'Телевизионная башня в районе Сумида самая высокая среди телебашен мира. Высота телебашни вместе с антенной составляет 634 метра.'
},
{'header' : 'CN Tower, Канада',
'image' : 'image8.jpg',
'text' : 'Си-Эн Тауэр — самое высокое свободно стоящее сооружение в мире с 1976 по 2007 год. Его высота составляет 553,33 метра.'
}
]
-
var structures = [
{
menuItem: "Ворота Запада, США",
pict: "image1_big.jpg",
firstP: `Арка в Сент-Луисе, также известная под именем «Врата на запад» — мемориал, являющийся частью Джефферсоновского национального экспансиального мемориала, а также визитной карточкой Сент-Луиса, штат Миссури, США.`,
secondP: `Арка была спроектирована финско-американским архитектором Ээро Саариненом в 1947 году. Её высота 192 метра в самой высокой точке, ширина её основания также 192 метра.
Таким образом арка является самым высоким памятником на территории США. Её строительство началось 12 февраля 1963 года и было закончено 28 октября 1965 года. Памятник открылся для посетителей 24 июля 1967 года.`
}
]

View File

@@ -0,0 +1,20 @@
include ../components/data.pug
mixin createMenu(menu, active)
each value, key in menu
if active == key
a.active(href= value)= key
else
a(href= value)= key
mixin createMenuBuild(menu, active)
each value, key in menu
a(href= value)= key
a.active(href= "")= active
mixin createSection()
each item in listSections
section
h3= item.header
img(src= require("../images/" + item.image))
p= item.text
a(href="#") &hellip;

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View File

@@ -0,0 +1 @@
import './styles/main.styl'

View File

@@ -0,0 +1,19 @@
extends template
block nav
title #{structures[0].menuItem}
nav
+createMenuBuild(dictMenu, structures[0].menuItem)
block header
h2= structures[0].menuItem
block content
img.big(src= require("../images/" + structures[0].pict))
section
p= structures[0].firstP
p= structures[0].secondP

View File

@@ -0,0 +1,19 @@
extends template
block nav
nav
+createMenu(dictMenu, 'Главная')
block content
div.images
each pict in listImages
a(href= "building.html")
img(src= require("../images/" + pict))
article
each item in listSections
section
h3= item.header
img(src= require("../images/" + item.image))
p= item.text
a(href="#") &hellip;

View File

@@ -0,0 +1,18 @@
include ../components/mixin.pug
include ../components/data.pug
doctype html
html(lang="ru")
head
title #{title}
body
block header
h2= title
block nav
block content
block footer
footer
h4 &copy; Пример html-страницы

View File

@@ -0,0 +1,86 @@
colorText = #6f6d6d
back(size)
background-color #f1f1f1
box-shadow 4px 5px 10px rgba(0, 0, 0, 0.4)
padding: size + "%"
margin 0 0 1% 0
html
color colorText
nav
back(0)
text-align right
& a
display inline-block
padding 1%
color colorText
text-decoration: none
&:hover
&.active
background-color #f87777
color #f8f8f8
div.images
display grid
grid-template-columns repeat(5, 1fr)
grid-gap 0.5%
back(1)
overflow hidden
& img
width: 100%
@media (max-width: 600px)
grid-template-rows repeat(5, 1fr)
grid-template-columns 1fr
justify-items center
article
width 80%
margin auto
display grid
grid-template-columns repeat(3, 1fr)
grid-gap 4%
overflow hidden
@media (max-width: 600px)
grid-template-rows repeat(3, 1fr)
grid-template-columns 1fr
& section
display grid
grid-template-columns 1fr 2fr
grid-gap 2%
align-items center
back(2)
& h3
grid-column 1/3
margin 0
text-align center
& img
width: 100%
footer
background-color colorText
color white
@media (max-width: 600px)
margin 3vh 0
& h4
padding:10px
.big
width 50vw
@media (max-width: 600px)
width 100vw
section
display grid
grid-template-columns 1fr 1fr
@media (max-width: 600px)
grid-template-columns 1fr

View File

@@ -0,0 +1,69 @@
const HtmlWebpackPlugin = require("html-webpack-plugin");
const FileManagerPlugin = require("filemanager-webpack-plugin");
const path = require("path");
const fs = require("fs");
const pagesDir = path.join(__dirname, "src", "pages");
const pages = fs.readdirSync(pagesDir).filter(file => file.endsWith(".pug"));
module.exports = {
output: {
path: path.join(__dirname, "dist"),
filename: "index.[contenthash].js",
assetModuleFilename: path.join("images", "[name].[contenthash][ext]"),
},
entry: path.join(__dirname, "src", "index.js"),
module: {
rules: [
{
test: /\.pug$/,
loader: "pug-loader",
},
{
test: /\.(png|jpg|jpeg|gif)$/i,
type: "asset/resource",
},
{
test: /\.svg$/,
type: "asset/resource",
generator: {
filename: path.join("icons", "[name].[contenthash][ext]"),
},
},
{
test: /\.styl$/,
use: [
{
loader: "style-loader",
},
{
loader: "css-loader",
},
{
loader: "stylus-loader",
},
],
},
],
},
plugins: [
...pages.map(
(page) =>
new HtmlWebpackPlugin({
template: path.join(pagesDir, page),
filename: page.replace(".pug", ".html"),
})
),
new FileManagerPlugin({
events: {
onStart: {
delete: ["dist"],
},
},
}),
],
devServer: {
watchFiles: path.join(__dirname, "src"),
port: 9000,
},
};

View File

@@ -3,17 +3,9 @@ h3{
margin: 1vh;
}
a{
/* display: inline-flex;
flex-direction: row;
flex-wrap: wrap;
background-color: gray;
width: 10%; это grid!!!*/
}
.content{
background-color: lightgreen;
display: inline-flex;
display: flex;
flex-direction: row;
flex-wrap: nowrap;
padding:10px;
@@ -38,13 +30,8 @@ a{
}
@media (max-width:800px) {
.content{
display: flex;
flex-direction: column;
}
.topic{
width: calc(100%-20px);
/* width:50%; */
}
}
/* grid part */

6
labs/lab4/css/bootstrap.min.css vendored Normal file

File diff suppressed because one or more lines are too long

BIN
labs/lab4/images/c.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

BIN
labs/lab4/images/java.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

BIN
labs/lab4/images/prolog.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
labs/lab4/images/python.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

BIN
labs/lab4/images/ruby.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

99
labs/lab4/index.html Normal file
View File

@@ -0,0 +1,99 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Лабораторная работа Bootstrap</title>
<link href="css/bootstrap.min.css" rel="stylesheet">
<script src="js/bootstrap.bundle.min.js"></script>
<style>
.lead {
text-align: justify;
}
</style>
</head>
<body class="container">
<div class="row bg-lg-light justify-content-center">
<div class="col-sm-12 col-md-6 col-xl-4 p-4 text-center">
<h3 class="bg-light d-sm-block d-lg-inline my-0 p-2">
JavaScript
</h3>
<div class="bg-light d-lg-flex align-self-center">
<p class="lead px-2 m-0">
разработан в 1996 году, автор - американский программист Брендан Айк.
</p>
<img src="images/javascript.jpg" class="d-block m-auto w-50">
</div>
</div>
</div>
<div class="row bg-lg-light justify-content-center">
<div class="col-sm-12 col-md-6 col-xl-4 p-4 text-center">
<h3 class="bg-light d-sm-block d-lg-inline my-0 p-2">
Java
</h3>
<div class="bg-light d-lg-flex align-self-center">
<p class="lead px-2 m-0"></p>
разработан в 19901996 годах канадским программистом Джеймсом Гослингом.
</p>
<img src="images/java.jpg" class="d-block m-auto w-50">
</div>
</div>
<div class="col-sm-12 col-md-6 col-xl-4 p-4 text-center">
<h3 class="bg-light d-sm-block d-lg-inline my-0 p-2">
C
</h3>
<div class="bg-light d-lg-flex align-self-center">
<p class="lead px-2 m-0">
разработан в 19691973 годах сотрудником Bell Labs Деннисом Ритчи.
</p>
<img src="images/c.jpg" class="d-block m-auto w-50">
</div>
</div>
</div>
<div class="row bg-lg-light justify-content-center">
<div class="col-sm-12 col-md-6 col-xl-4 p-4 text-center">
<h3 class="bg-light d-sm-block d-lg-inline my-0 p-2">
Prolog
</h3>
<div class="bg-light d-lg-flex align-self-center">
<p class="lead px-2 m-0">
разработан в 1972 году, автор - французский программист Ален Колмероэ.
</p>
<img src="images/prolog.jpg" class="d-block m-auto w-50">
</div>
</div>
<div class="col-sm-12 col-md-6 col-xl-4 p-4 text-center">
<h3 class="bg-light d-sm-block d-lg-inline my-0 p-2">
Python
</h3>
<div class="bg-light d-lg-flex align-self-center">
<p class="lead px-2 m-0">
создан в 19891991 годах голландским программистом Гвидо ван Россумом.
</p>
<img src="images/python.jpg" class="d-block m-auto w-50">
</div>
</div>
<div class="col-sm-12 col-md-6 col-xl-4 p-4 text-center">
<h3 class="bg-light d-sm-block d-lg-inline my-0 p-2">
Ruby
</h3>
<div class="bg-light d-lg-flex align-self-center">
<p class="lead px-2 m-0">
разработан в 1993-1995 годах, автор - японский программист Юкихиро Мацумото.
</p>
<img src="images/ruby.jpg" class="d-block m-auto w-50">
</div>
</div>
</div>
</body>
</html>

7
labs/lab4/js/bootstrap.bundle.min.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
labs/lab5/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
node_modules

Some files were not shown because too many files have changed in this diff Show More