docker build
(док) создаёт новый image
(образ) В вашем примере с тегом python-barcode
docker 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.9349
0.94
x * 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');
});
docker network connect myapp_default mysql
mysql
, как и требовалось.