Harjutus 2 создание проекта в codesandbox
https://github.com/MihhailLastovski/Harjutus2Codesandbox
Открываем CodeSandbox
Выбираем шаблон Vanilla Js
Вставляем в index.mjs этот код и получаем таблицу с характеристиками машин
import "./styles.css";
const myjson = [
{
Car: {
Color: "Rose red",
"Tinted windows": false,
Wheels: 4,
"Roof Cargo": null,
Entertainment: ["Fm Radio", "MP3, MP4 and MKV player", "harman/kardon speakers"],
Accessories: ["satnav","cruise control"]
},
Car2:{
Color: "Navy blue",
"Tinted windows": true,
Wheels: 4,
"Roof Cargo": "Thule",
Entertainment: ["Fm Radio", "Apple CarPlay/Android Auto", "Bowers & Wilkins Premium Sound speakers"],
Accessories: ["self drive system","lugagge cover"]
}
}
];
document.getElementById("app").innerHTML = `
<div id = "json">
<h1>Car properties </h1>
<p>Color: ${myjson[0].Car.Color}</p>
<p>Tinted windows: ${myjson[0].Car["Tinted windows"]}</p>
<p>Wheels: ${myjson[0].Car.Wheels}</p>
<p>Roof Cargo: ${myjson[0].Car["Roof Cargo"]}</p>
<p>Entertainment: ${myjson[0].Car.Entertainment}</p>
<p>Accessories: ${myjson[0].Car.Accessories}</p>
</div>
<table>
<tr style="border: 1pt solid black">
<th>Property</th>
<th>Car0</th>
<th>Car1</th>
</tr>
${Object.keys(myjson[0].Car).map(property => `
<tr>
<td>${property}</td>
<td>${myjson[0].Car[property]}</td>
<td>${myjson[0].Car2[property]}</td>
</tr>
`).join('')}
</table>
<style>
table, tr, td{
border: 2pt solid black
}
</style>
`;
Harjutus 3 работаем с session storage
- Открываем новую вкладку в chrome и вписываем следующие команды
sessionStorage– проверяет хранилище сеансовsessionStorage.setItem('color','enda lemmikvärv')– добавляет новые данные в хранилище сеансов-
sessionStorage.getItem('color')– получает данные из хранилища

В application -> Session Storage можно посмотреть данные

Harjutus 4 работаем с local storage
localStorage– команла для создания локального хранилищаlocalStorage.setItem('car','audi')– добавляет новые данные в хранилищеlocalStorage.getItem('car')– получает данные из хранилище

В application -> Local Storage можно посмотреть данные

Harjutus 5 смотрим файлы cookie
.\xh.exe -h https://www.youtube.com – с помощью этой консольной команды можно посмотреть какие cookie файлы берет youtube.com

Harjutus 6 запрос к api на js
- Открываем codesandbox и выбираем шаблон static (HTML)
- Пишем следующий код в файл index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Static Template</title>
</head>
<body>
<button type="button" onclick="loadDoc()">Request bacon</button>
<p id="demo"></p>
<script>
function loadDoc() {
const xhttp = new XMLHttpRequest();
xhttp.onload = function () {
document.getElementById("demo").innerHTML = this.responseText;
};
xhttp.open("GET", "https://baconipsum.com/api/?type=all-meat");
xhttp.send();
}
</script>
</body>
</html>
3. Сохраняем файл и получаем ответ с API

Harjutus 7 работа с api github
Открываем codesandbox, выбираем шаблон JS Vanilla
Вставляем этот код в index.mjs
let profile = "";
let profileName = "";
let profileID = "";
let profileLink = "";
let profileRepos = "";
function renderPage(){
document.getElementById("app").innerHTML = `
<div>
<h1>Github</h1>
<p>Please enter profile name: </p>
<input />
<div class="content">
<h1 id="name">Name: ${profileName}</h1>
<p id="id">Id: ${profileID}</p>
<p id="repos">Repos: ${profileRepos}</p>
<p id="profileurl">Link: ${profileLink}
<a href=${profileName}" target="_blank"></a></p>
</div>
</div>
`;
}
let fetchProfile = async () => {
let fetchedData;
await fetch(`https://api.github.com/users/${profile}`)
.then((response) => response.json())
.then((data) => (fetchedData = data));
profileName = fetchedData.login ;
profileID = fetchedData.id ;
profileLink = fetchedData.html_url ;
profileRepos = fetchedData.public_repos ;
renderPage();
};
renderPage();
const input = document.querySelector("input");
input.addEventListener("change",updateValue);
function updateValue(e){
profile = e.target.value;
fetchProfile();
}
На выходе получаем страницу для просмотра профилей GitHub, с помощью API GitHub

Harjutus 8 вывод xml файла с помощью js
Переходим в удобный редактор кода
Создаем файл games.xml и вставляем в него этот код
<?xml version="1.0" encoding="UTF-8"?>
<gameslist>
<game>
<title lang="en">Hearthstone</title>
<price>Free</price>
</game>
<game>
<title lang="en">Dota 2</title>
<price>Life</price>
</game>
<game>
<title lang="en">Elden ring</title>
<price>60$</price>
</game>
</gameslist>
Создаем файл index.mjs вставляем этот код
document.getElementById("app").innerHTML = "<table id='xmlTable'></table>";
let xmlhttp = new XMLHttpRequest(); // Создаем объект XMLHttpRequest
xmlhttp.open("GET", "games.xml", false);
xmlhttp.send();
if (xmlhttp.status === 200) {
let XMLContent = xmlhttp.responseXML;
let tableRows = "<thead><tr><th>Title</th><th>Price</th></tr></thead>";
let gameElements = XMLContent.getElementsByTagName("game");
for (let i = 0; i < gameElements.length; i++) {
tableRows +=
"<tbody><tr><td>" +
gameElements[i].getElementsByTagName("title")[0].childNodes[0].nodeValue +
"</td><td>" +
gameElements[i].getElementsByTagName("price")[0].childNodes[0].nodeValue +
"</td></tr></tbody>";
}
document.getElementById("xmlTable").innerHTML = tableRows;
} else {
console.error("XMLHttpRequest failed with status " + xmlhttp.status);
}
Создаем файл index.html и вставляем этот код
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Title</title>
</head>
<body>
<div id="app"></div>
</body>
<script src="index.mjs"></script>
</html>
<style>
table{
border: 2pt solid black;
border-radius: 20px;
font-size: large;
width: 300px;
height: 300px;
}
td{
border: 2pt solid black;
}
</style>
Должны браться игры из xml файла и вывводиться в таблицу

Harjutus 10 письмо при github push
Создаем пустой репозиторий

клонируем его
git clone https://github.com/MihhailLastovski/harjutus10.git

Создаем папки .github/workflows
Создаем файл mail-on-push.yml
В него пишем этот код
name: Mail on Push
on:
push:
branches:
- main
jobs:
send-mail:
runs-on: ubuntu-latest
steps:
- name: Checkout Repo
uses: actions/checkout@v2
- name: Send Email
uses: dawidd6/action-send-mail@v3
with:
server_address: smtp.gmail.com
server_port: 465
username: ${{ secrets.MAIL_USERNAME }}
password: ${{ secrets.MAIL_PASSWORD }}
subject: "Push to Repository: ${{ github.repository }}"
to: "your@gmail.com"
body: |
Kehtestuse looja nimi: ${{ github.event.pusher.name }}
Kehtestuse sõnum: ${{ github.event.head_commit.message }}
from: Github actions
На гитхабе создаем две секретных переменных
В MAIL_USERNAME пишем свою почту
В MAIL_PASSWORD пишем пароль приложения, если у вас стоит двухэтапная аутентификация
Его можно получить в аккаунт google/безопасность/двухэтапная аутентификация/пароли приложений


Далее делаем push проекта на github и мы должны получить такое сообщение на почту

И в github/actions

Harjutus 11 общение с пользователями на одном сервере
https://github.com/MihhailLastovski/serverMessage.git
Открываем удобный редактор кода и создаем два файла: index.html; server.js
Вставляем в них следующий код
<!doctype html>
<form name="publish">
<input type="text" name="message" maxlength="50"/>
<input type="submit" value="Send"/>
</form>
<div id="messages"></div>
<script>
let url = location.host == 'localhost' ?
'ws://localhost:8080/ws' : location.host == 'javascript.local' ?
`ws://javascript.local/article/websocket/chat/ws` : // dev integration with local site
`wss://javascript.info/article/websocket/chat/ws`; // prod integration with javascript.info
//создаем объект с вебсокетом
let socket = new WebSocket(url);
// отправляем сообщение на форму
document.forms.publish.onsubmit = function() {
let outgoingMessage = this.message.value;
socket.send(outgoingMessage);
return false;
};
// обрабатываем входящие сообщения
socket.onmessage = function(event) {
let incomingMessage = event.data;
showMessage(incomingMessage);
};
//если пользователь закрыт сокет, то пишем об этом в консоли
socket.onclose = event => console.log(`Closed ${event.code}`);
// показываем сообщения в div#messages
function showMessage(message) {
let messageElem = document.createElement('div');
messageElem.textContent = message;
document.getElementById('messages').prepend(messageElem);
}
</script>
const http = require('http');
const fs = require('fs');
const ws = new require('ws')
//создаем вебсокет сервер
const wss = new ws.Server({noServer: true});
//при подключении на адресс /ws, подключаем человека к сокет серверу
function accept(req, res){
if(req.url === '/ws' && req.headers.upgrade &&
req.headers.upgrade.toLowerCase() === 'websocket' &&
req.headers.connection.match(/\bupgrade\b/i)){
wss.handleUpgrade(req, req.socket, Buffer.alloc(0), onSocketConnect);
} else if(req.url === '/'){
fs.createReadStream('./index.html').pipe(res);
} else{
res.writeHead(404);
res.end()
}
}
//создаем сет из клиентов
const clients = new Set();
//при присоединении к сокету, устанавливем следующие эвенты подключившемуся пользователю
function onSocketConnect(ws){
clients.add(ws)
//при получении сообщения
ws.on('message', function(message){
message = message.slice(0, 50);
for(let client of clients) {clients.send(message);}
});
//при закрытии сокета
ws.on('close', function (){
log('connection closed');
clients.delete(ws);
})
}
let log;
if(!module["parent"]){
log = console.log();
//создаем сервер
http.createServer(accept).listen(8080);
} else {
log = function () {};
exports.accept = accept;
}
В папке с проектом в консоли пишем npm init и устанавливаем vestlusruum

Получаем возможность общаться с пользователями, которые находятся на том же сервере
Harjutus 12 соль и хеш пароля
https://github.com/MihhailLastovski/passwordHash.git
Открываем удобный редактор кода и создаем два файла: generateHash.js Вставляем в него следующий код
const bcrypt = require('bcrypt');
const myPassword = '';
console.time('Time to generate salt');
const salt = bcrypt.genSaltSync(10);
console.log('This is your salt: '+ salt);
console.timeEnd('Time to generate salt');
console.time('Time to generate hash');
const hashedPassword = bcrypt.hashSync(myPassword, salt);
console.log(myPassword + ' is your passwod & this your password after hashing it: ' + hashedPassword);
console.timeEnd('Time to generate hash');
Запускаем код или нажимаем ctrl + shift + F10
Получаем “соль” и хешированный пароли

Password salting – добавляет случайные символы до или после пароля перед хешированием, чтобы скрыть фактический пароль
Password hashing – это односторонний процесс, который преобразует пароль в зашифрованный текст с использованием алгоритмов хеширования
