console.log(this); // windowthis не принимает значение кнопки, а наследует его из внешнего кода. В данном случае, глобального, поэтому this === windowthis будет нажатой кнопкой. Так бы работало без стрелочной функции, если по-старинке передавали function(evt) {} 0. Получение ключа доступа
Для работы с виджетами в сообществе необходимо получить токен сообщества с правом доступаapp_widgetпри помощи события VK Connect: VKWebAppGetCommunityAuthToken в приложении с типом VK Mini Apps.
npm install @vkontakte/vk-connectindex.js:import connect from '@vkontakte/vk-connect';
// Sending event to client
connect
.sendPromise('VKWebAppGetCommunityAuthToken', {
"app_id": 6909581, // id вашего свежесозданного mini App
"group_id": 1, // id группы, где вы админ, куда виджет
"scope": "app_widget"
})
.then(data => {
// Обработка события в случае успеха
console.log(data);
})
.catch(error => {
//Обработка событияв случае ошибки
});Затем, наверное, webpack'ом билдится готовый скрипт, который подгружается в браузер.// Set the name of the hidden property and the change event for visibility
var hidden, visibilityChange;
if (typeof document.hidden !== "undefined") { // Opera 12.10 and Firefox 18 and later support
hidden = "hidden";
visibilityChange = "visibilitychange";
} else if (typeof document.msHidden !== "undefined") {
hidden = "msHidden";
visibilityChange = "msvisibilitychange";
} else if (typeof document.webkitHidden !== "undefined") {
hidden = "webkitHidden";
visibilityChange = "webkitvisibilitychange";
}
var videoElement = document.getElementById("videoElement");
// If the page is hidden, pause the video;
// if the page is shown, play the video
function handleVisibilityChange() {
if (document[hidden]) {
videoElement.pause();
} else {
videoElement.play();
}
}
// Warn if the browser doesn't support addEventListener or the Page Visibility API
if (typeof document.addEventListener === "undefined" || hidden === undefined) {
console.log("This demo requires a browser, such as Google Chrome or Firefox, that supports the Page Visibility API.");
} else {
// Handle page visibility change
document.addEventListener(visibilityChange, handleVisibilityChange, false);
// When the video pauses, set the title.
// This shows the paused
videoElement.addEventListener("pause", function(){
document.title = 'Paused';
}, false);
// When the video plays, set the title.
videoElement.addEventListener("play", function(){
document.title = 'Playing';
}, false);
}function myFunction() {
var sourceSheet = SpreadsheetApp.getActiveSpreadsheet(); //лист откуда берем данные
var activeRow = list1.getActiveSheet().getActiveCell().getRow(); //номер активной ячейки
var destSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Журнал ввода данных");
var lastRow = destSheet.getLastRow();
destSheet.insertRowAfter(lastRow);
var destRow = lastRow + 1;
function copyCell(colFrom, colTo) {
sourceSheet.getRange(activeRow, colFrom).copyTo(destSheet.getRange(destRow, colTo));
}
copyCell(1, 1); // номер участка
copyCell(2, 2); // имя человека
copyCell(4, 3); // дата начала работ
copyCell(6, 4); // дата завершения работ
}function onOpen(e) {
SpreadsheetApp.getUi()
.createMenu('Работа с Журналом')
.addItem('Копировать в журнал', 'myFunction')
.addToUi();
} 
6/65/64/66/6 * 5/6 * 4/6 = 120/216 = 5/9 docker build (док) создаёт новый image (образ) В вашем примере с тегом python-barcodedocker run запускает из образа контейнер. Можно и не один, а несколько, даже параллельно. В вашем примере имя для него сгенерится автоматом, какая-нибудь смешная комбинация двух слов. Контейнер может работать, останавливаться, перезапускаться. Можно удалить контейнер. Контейнер не изменяет образ, из которого создан – он «накатывает» свою деятельность поверх, в новых слоях.базовый FROM образ -- образ с доп. слоями = ваш новый образ -- контейнер и изменения -- образ с изменениями Host: ... перенаправлять/проксировать запрос на соотв. виртуальный сервер.server {
server_name site.ru;
location / {
proxy_pass http://127.0.0.1:8000; # допустим, тут слушает основной
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# ... ещё инструкции - передача заголовков, кэширование..
}
}
server {
server_name name1.site.ru;
location / {
proxy_pass http://127.0.0.1:8001; # вирт-1
# ...
}
}
server {
server_name name2.site.ru;
location / {
proxy_pass http://127.0.0.1:8002; # вирт-2
# ...
}
} все на php7.3, mysql 5.7, nginx
location /project-42 { root /projects/project-42; ... }
### или целый блок
server {
listen 80;
server_name project42.dev;
...
}nginx:
volumes:
- "/freelance/projects/Project-0/:/var/www/project0"
- "/freelance/projects/Project-42/:/var/www/project42"
# ...
php-fpm:
volumes:
# то же самое сюда2) Как проектам дать не localhost:8080, а нормальный урл типа project.dev?
docker-compose.yml пропишите вместо 8080:80 — 80:80, а в локальном файле hosts допишите 127.0.0.1 project.dev project42.dev [10, 20, 30, 50, 235, 3000].filter(n => !!~[1,2,5].indexOf(+n.toString()[0]))
// результат [ 10, 20, 50, 235 ]Вывод на экран пилите самостоятельно.filter() оставит только те элементы, для которых функция внутри вернёт true. Функция аргумент (в скобках) применяется по очереди к каждому элементу массива (числу).+).indexOf() ищет полученную первую цифру в массиве допустимых: 1, 2, 5 и возврашает его индекс (0, 1 или 2) или -1, если не найдено.~ из -1 сделает 0. А из любого другого числа (из 0, 1 или 2) – сделает ненулевое число. Два !! это два булевых оператора отрицания. Из аргумента делают true или false. Из 0 получится false, из любого другого true. Таким образом связка !!~ и indexOf() даёт ответ на вопрос найден или не найден? getRangeAt(0)Range есть свойства startOffset и endOffset – то, про что спрашиваете.youtube.readonly на доступ к своим данным.composer require google/apiclient:^2.0, в API консоли создать проект, создать OAuth ключ, скачать его JSON. value=""function reset() {
[...document.querySelectorAll('section.main input[type="text"]')]
.forEach( el => el.value='' )
;
}document.getElementsByClassName('budget_day-value')[0]document.querySelector('.budget_day-value')<label>, и либо указывать id инпута в атрибуте for="", либо включать инпут внутрь этого лейбла. Так клик по названию поля сделает фокус внутри этого поля.(100% - 6.51%) = 93.49%; операция равносильна умножению на 0.93490.94x * 0.9349 * 0.94 = x * 0,878806 без погрешностей, точно.
Замыкания
В программировании есть общий термин: «замыкание», – которое должен знать каждый разработчик.
Замыкание – это функция, которая запоминает свои внешние переменные и может получить к ним доступ. В некоторых языках это невозможно, или функция должна быть написана специальным образом, чтобы получилось замыкание. Но, как было описано выше, в JavaScript, все функции изначально являются замыканиями (есть только одно исключение, про которое будет рассказано в Синтаксис "new Function").
То есть, они автоматически запоминают, где были созданы, с помощью скрытого свойства[[Environment]]и все они могут получить доступ к внешним переменным.
Когда на собеседовании фронтенд-разработчик получает вопрос: «что такое замыкание?», – правильным ответом будет определение замыкания и объяснения того факта, что все функции в JavaScript являются замыканиями, и, может быть, несколько слов о технических деталях: свойстве[[Environment]]и о том, как работает лексическое окружение.
const onClick = event => {
const nodeList = document.querySelectorAll('.item');
for (let i=0; i<nodeList.length; i++ ) {
nodeList[i].style = (nodeList[i] === event.target ? 'background:red' : 'background:green');
};
}.item {background: green } // по умолчанию все зелёные
.item-red {background: red } // тот самый// clickedEl — item, по которому кликнули
[...document.querySelectorAll('.item')].forEach(el => {
if (clickedEl === el) el.classList.add('item-red');
else el.classList.remove('item-red');
});