Professional Documents
Culture Documents
Zavd 25 01 2023
Zavd 25 01 2023
Збірник завдань
Hello, world! Написати сценарій, який виводить на екран статичний текст (“Hello,
world!”).
Сортування рядків
Написати на Node.js функцію, яка приймає рядок як параметр та повертає рядок, в
якому всі символи вхідного рядка відсортовані. Проілюструвати роботу цієї функції
Екстремальний інкремент
Знайти мінімальне значення змінної x, для якої інструкція
console.log((x++)<x);
Нетранзитивні порівняння
Навести приклад таких числових змінних x, y,z, що x==y дорівнює true, y==z
дорівнює true, але x==z дорівнює false.
Привітання клієнтові
Написати клієнт-серверне застосування, яке за допомогою форми отримує від
клієнта його ім'я та виводить цьому клієнтові привітання.
На основі виконання цієї вправи:
- показати, як можна передати дані до сервера, не використовуючи форму;
- проілюструвати, що може трапитися, якщо користувач введе в полі введення теги
розмітки, які не будуть належним чином оброблені.
Серверну частину реалізувати на Node.js.
Читання та запис
У текстовому файлі записано кілька слів, розділених пробілами. Написати консольне
застосування, яке зчитує файл, виводить його вміст на екран та додає до файлу нове слово.
Підключення JSON
Дано JSON-файл messages.json
{
"welcome":"You are welcome",
"reject":"Go away, please"
}
і програму simplejson.js:
let messages=require("./messages.json");
console.log(messages.welcome);
JSON-серіалізація
У консольній програмі створити масив об’єктів. Кожний об’єкт описує деяку
особистість, зокрема її прізвище та вік.
Написати код, який серіалізує цей масив на диску у JSON-форматі, а після цього
створює копію масиву шляхом десеріалізації та для цієї копії виводить на екран назви та
значення властивості для всіх об’єктів у форматі
Властивість_1: Значення_1
Властивість_2: Значення_2
----------------------------------------------------------
Властивість_1: Значення_1
Властивість_2: Значення_2
Шаблонізатори
Бази даних
Вибірка з бази. Реорганізувати вправу «Відображення колекції» так, щоб
інформація про об’єкти, що мають бути відображені на сторінці, зберігалися в MongoDB.
Поштова розсилка
Поштовий бот
Написати програму, яка надсилає електронного листа за вказаною адресою.
Колекції
Серійні карти
Створити колекцію Map з кількома парами ключ-значення. Серіалізувати її в JSON-
файл. Далі створити копію колекції шляхом десеріалізації та вивести її вміст на екран.
Асинхронне програмування
Поспішне виведення
Виправити помилку в коді
let fs=require("fs");
let s=undefined;
fs.readFile("test.txt", "utf8",
function(error,data){
if(error) throw error;
s=data;
});
console.log(s);
Шлях до асинхронності
Дано код
"use strict";
//Basic function
function foo(x){
return x*2;
}
let r=foo(5);
console.log(r);
Реорганізувати цей код так, щоб функція foo стала асинхронною (з модифікатором
async), але так, щоб вираз x*2 продовжував обчислюватися синхронно. Вправу
виконати в двох варіантах:
- без явного використання промісів та await;
- з використанням await.
Геть await!
Дано клієнт-серверний застосунок.
Сервер запускається на порту 7777 і при зверненні до нього відправляє клієнтові
деякий рядок. Його код має вигляд:
const PORT=7777;
let server=express();
server.listen(PORT);
console.log(`Server is running on port ${PORT}`);
server.use(express.static(__dirname));
"use strict";
const fetch = require('node-fetch');
const url='http://127.0.0.1:7777/';
getData(url);
Обгортка в проміс
З метою затримки виконання програми на 5 с був написаний код
"use strict";
const waittime=5000;
setTimeout(
()=>{
console.log("Operation finished");
}
,waittime);
console.log("Program finished");
Program finished
Operation finished
Проміс-читач
Написати функцію, яка приймає ім’я файлу та повертає проміс, призначений для
зчитування цього файлу. Має використовуватися функція асинхронного читання
readFile. Проміс має використовуватися в явному вигляді (без async-await).
Використати цю функцію в основній програмі. У випадку успішного читання програма
повинна виводити на екран вміст файлу, у випадку помилки виводити на екран, що при
читанні файлу з таким іменем сталася помилка.
Вторгнення у вічність
Дано код
"use strict";
function doOperation(){
console.log("I want to be performed!");
}
setTimeout(doOperation,0);
//Eternal loop
for (let k=0;; k++) {
if (k%1000000000==0) {
console.log(k);
}
}
Реорганізувати нескінченний цикл після коментаря //Eternal loop так, щоб він
зберіг свою функціональність, але щоб callback міг бути виконаний.
JavaScript у браузері
<div>
<p>One</p>
<p>Two</p>
<p>Three</p>
</div>
<hr/>
<div>
<p>Eleven</p>
<p>Twelve</p>
</div>
Написати код на клієнтському Java Script, який при натисканні на кнопку Add додає
до першого елементу div елемент p з вмістом Four. Використати можливості DOM.
Комунікації
Дані з сервера
Написати веб-сторінку, яка при натисканні на кнопку звертається до сервера з
використанням XMLHttpRequest або fetch та забезпечує формування контенту на основі
отриманих даних.
AJAX
Простий AJAX
Дана сторінка
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>AJAX client</title>
</head>
<body onLoad="getData();">
Content:
<br/>
<div id="content">
</div>
<script type="text/javascript">
function treatData(content) {
let elem=document.getElementById("content");
elem.innerHTML='';
for (let item of content) {
elem.innerHTML+="<p><strong>"+item+"</strong></p>";
}
function getData() {
let url="/data";
fetch(url).
then(response=>response.json()).
then(res=>treatData(res));
}
</script>
</body>
</html>
На бекенді:
let server=express();
server.listen(8888);
console.log('Server is running on port 8888');
server.use(express.static(__dirname));
let arr=[];
let i=0;
function add(){
if (++i>200) process.exit();
arr.push(i);
console.log(arr);
}
setInterval(add,5000);
Використання WebWorkers
Браузерний паралелізм
Написати веб-сторінку, яка має наступний вигляд:
Фреймворки та бібліотеки
Елементарний React
Написати сторінку, яка забезпечує виведення статичного тексту з використанням
React
Реактивний об’єкт
У серверній програмі зберігається об’єкт, який містить дані про деякий автомобіль
(зокрема, про його марку та колір). Написати сторінку, яка при натисканні на кнопку
звертається до сервера, отримує від нього ці дані в JSON-форматі та забезпечує
відображення у вигляді
Незнайомий об’єкт
За допомогою React відобразити всі назви і значення властивостей деякого об’єкта,
якщо ці назви та значення заздалегідь невідомі.
Вказівка: скористатися Object.keys() та map()
Реактивна колекція
У базі даних зберігається інформація про деякі книжки. Написати клієнт-серверне
застосування зі сторінкою, яка при натисканні на кнопку забезпечує виведення цієї
інформації в наступному вигляді:
Використати React. Для відображення окремої книжки створити компонент; на
сторінці використати відповідний елемент Book.
Використання Vue
У базі даних зберігається інформація про деякі книжки. Написати клієнт-серверне
застосування зі сторінкою, яка при натисканні на кнопку забезпечує виведення цієї
інформації в наступному вигляді:
Використати Vue. Для відображення окремої книжки створити компонент; на
сторінці використати відповідний елемент Book.
Сценарії на PHP
Привітання клієнтові
Написати клієнт-серверне застосування, яке за допомогою форми отримує від
клієнта його ім'я та виводить цьому клієнтові привітання.
На основі виконання цієї вправи:
- показати, як можна передати дані до сервера, не використовуючи форму;
- проілюструвати, що може трапитися, якщо користувач введе в полі введення теги
розмітки, які не будуть належним чином оброблені.
Серверну частину реалізувати на PHP.
Контроль знань
Написати сценарій, який проводить міні-тест: задає запитання з кількома варіантами
відповідей, після натискання кнопки дані відсилаються на сервер. У випадку правильної
відповіді має з’явитися повідомлення “Відповідь вірна”, а у випадку неправильної – “
Відповідь невірна ”. Використати радіокнопки. Форма має залишатися на екрані і після
відповіді сервера.
Хто та звідки
Написати веб-застосування, яке виводить на екран IP-адресу клієнта, а також адресу
сайта, з якого був здійснений перехід. Якщо такого сайту немає, повинно бути виведено
відповідне повідомлення
Редактор статей
На сервері зберігається декілька текстових ресурсів ("статей"). Написати сценарій,
який формує сторінку, яка для кожної статті містить два лінки: один дозволяє перейти до
неї в режимі читання, а інший – відредагувати за допомогою форми
Перегляд і виконання
Написати простий сценарій А, який виводить певний текст. Написати інший РНР-
сценарій, який може виводити код сценарію А, або ж результати його роботи. В режимі
виведення результатів роботи повинно виводитися гіпертекстове посилання, яке дозволяє
перейти в режим виведення коду, і навпаки – в режимі виведення коду повинно
виводитися гіпертекстове посилання, яке дозволяє перейти до режиму виведення
результатів роботи. Конкретна назва сценарію А передається у запиті від форми або
вводиться прямим набором в URL
Зворотний порядок
Написати сценарій, який зчитує текстовий файл та формує інший файл, в якому всі
слова початкового файлу розташовані в зворотному порядку (наприклад, текст "хочу
вчитися" повинен перетворитися на "вчитися хочу"). Для цього написати функцію, яка
приймає рядок та аргумент та повертає рядок, в якому всі символи вхідного рядка
розташовані в зворотному порядку
Сортування масивів
У текстовому файлі міститься інформація про зарплати співробітників деякої
компанії. Дані про кожного співробітника записані в окремому рядку у вигляді
"Прізвище-Зарплата"; роздільником виступає дефіс. Написати РНР-сценарій, який в
залежності від значення керуючої змінної виводить список співробітників, відсортований
за зростанням зарплати або за її спаданням. Значення керуючої змінної передається у
запиті від форми або вводиться прямим набором в URL.
Регулярний калькулятор
Написати консольне застосування, яке реалізує простий калькулятор: вводить з клавіатури
простий арифметичний вираз з двома операндами, що має вигляд, подібний до 3 + 5 (або
5*6) та виводить на екран його значення. Пробіли між операндами та знаками
арифметичних операцій можуть бути як присутніми, так і відсутніми. Використати
регулярні вирази. Програма має контролювати коректність введення. Функцію eval
та подібні до неї можливості не використовувати
Простий клас
Cтворити Value Object, який інкапсулює інформацію про окремий запис у блозі.
Передбачити, зокрема, орієнтацію на двомовність, короткий і повний вміст, а також дві
категорії записів – важливі та ординарні. Проілюструвати використання цього класу.
Сутності в Smarty
Для деякого екземпляру класу з вправи “Простий клас” відобразити інформацію про його
поля засобами Smarty.
Універсальний клас
Написати клас, який описує деяку сутність в ситуації, коли її властивості, і відповідно –
поля класу заздалегідь невідомі. Клас має забезпечувати засоби для отримання значення
конкретної властивості та для встановлення властивості в нове значення. Стандартні
засоби для підтримки динамічних властивостей (методи __get() та __set() не
використовувати.
Сеанси
Лічильник відвідувань
На сервері здійснена спроба організувати підрахунок кількості відвідувань, для цього був
написаний сценарій
let express = require('express');
let fs=require("fs");
let server=express();
server.listen(8888);
console.log('Server is running on port 8888');
const fName="counter.txt";
server.use(express.static(__dirname));
Але вона має проблему: кількість відвідувань змінюється при кожному перевантаженні
сторінки.
Реорганізувати сценарій так, щоб кількість відвідувань залишалася незмінною протягом
сесії.
Контрольні вправи до самостійної роботи (можливі зміни, про які буде оголошено
додатково)
Пошук анаграм
Набором анаграм називається набір слів, які складаються з однакових літер, але ці літери
стоять в різному порядку (напр., автор-товар-тавро; літо-тіло, кума-мука-умка).
Написати консольне застосування, яке знаходить у словнику деякої гіпотетичної мови всі
набори анаграм та виводить їх на екран.
Анаграми повинні формуватися в програмі у вигляді асоціативного масиву.
Виведення має бути форматованим. Мають виводитися лише набори анаграм, які
складаються з 2 та більше слів; кожний набір має виводитися в окремому рядку у вигляді
RESTful-сервіс
У базі даних зберігаються деякі інформаційні одиниці (книжки, статті тощо). Написати
сервіс, який забезпечує стандартні CRUD-операції (отримання всіх записів, отримання
запису за ID, додавання, оновлення та видалення записів). Доступ до бази даних
забезпечувати на основі принципів DAO.
Сервіс організувати на основі принципів REST. Сервіс має здійснювати передачу
інформації у форматі JSON. Передбачити можливість тестування сервісу за допомогою
Postman.
Крім реалізації стандартних операцій CRUD, реалізувати бізнес-логіку, яка виходить за
межі цих операцій.
База даних - MongoDB або MySQL (на вибір).
Сервіс реалізувати на основі Node.js та Express.
Робота з CSV
У текстовому файлі зберігається інформація про оцінки студентів з деяких
дисциплін у вигляді
100;15;71
12;100;99
…
Пособник спамера
Створити базу даних електронних адрес з як мінімум наступною інформацією: прізвище,
ім'я та по батькові та електронна адреса. Написати на Node.js клієнт-серверний
застосунок, який забезпечує розсилку електронних листів за цими адресами.
Користувачеві має бути наданий веб-інтерфейс, який забезпечує відображення переліку
адрес у відсортованому вигляді, а також надає можливість вибрати текст повідомлення з
деякого заздаледь заданого набору повідомлень або ввести свій текст.
Написати також веб-інтерфейс, який забезпечує керування списком розсилки: додавання
нових адрес та редагування і вилучення існуючих.
Адреси мають зберігатися в базі даних (MongoDB або MySQL).
Для відображення використати Twitter Bootstrap.
Сервер має бути реалізований на основі Node.js та Express.
Товстий клієнт
Реорганізувати вправу “RESTful-сервіс” так, щоб доступ до сервісу міг здійснювався за
допомогою браузера. Забезпечити клієнтський інтерфейс для перегляду сторінок, а також
інтерфейс адміністратора. Залишити можливість тестування сервісу через Postman.
Браузерний скрипт на основі JS має отримує від сервера наявну інформацію у вигляді
JSON-даних та забезпечує форматоване відображення цих даних на веб-сторінці. Для
відображення інформаційних одиниць використати React або Vue.
Реалізувати AJAX: після додавання нової інформації за допомогою
адміністративного інтерфейсу сторінка перегляду має оновлюватися без явної
ініціації з боку користувача.
Серверна частина має бути реалізована на Node.js та Express.
Подбати про належне розділення архітектурних рівнів, належну підтримку сеансів, а
також про достатній рівень захисту від несанкціонованого доступу та від можливих атак.
Для відображення використати Twitter Bootstrap.
Крутий сайт
Дано сторінку, яка відображає деякий книжковий каталог; для кожної книги
відображається її автор, назва та рік видання. При цьому книжки, видані після 2010 року,
повинні відображатися жирним шрифтом. Використовується PHP:
<html>
<head>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;
charset=windows-1251">
<title> No template page </title>
</head>
<body bgcolor="white">
<center>
<font color="green">
<h1>BOOK CATALOGUE</h1>
</font>
</center>
<br/><br/>
<?php
class Book {
public $author;
public $title;
public $year;
function __construct($author, $title, $year) {
$this->author=$author;
$this->title=$title;
$this->year=$year;
}
}
$books = array(
new Book("Ivanov","Addicted to murders",2018),
new Book("Petrov","The art of web programming",1901),
new Book("Sidorov","How to cheat",1515)
);
?>
</body>
</html>
Завдання:
Показати недоліки наведеного рішення. Реорганізувати його в наступних напрямках:
- уникати deprecated-тегів (зокрема, <font>); оформлення сторінки здійснювати на основі
таблиць стилів;
- повністю відокремити рівень представлення від бізнес-логіки – зокрема, на сторінці, яка
призначена для відображення, не повинно бути PHP-коду; для такого відокремлення
використати Smarty або Twig;
- дані про книжки зберігати в базі даних MySQL в таблиці books;
- відокремити бізнес-логіку від рівня даних на основі DAO та VO; всі звернення до даних
повинні здійснюватися лише через DAO; повинна здійснюватися нелінива ініціалізація
DAO, тобто при кожному зверненні всі дані з бази даних повинні завантажуватися в DAO;
в класі DAO мають бути функції ініціалізації даних та отримання всіх книжок.