// при добавлении ноута в коллекцию
localStorage.setItem('laptops', JSON.stringify( laptopArray ));
// при рендере страницы после перехода
var laptopArray = JSON.parse(localStorage.getItem('laptops')) || [];
(0, 0)
задача упрощается, т.к. координаты вершин совпадают с векторами в них из центра.function scale( k, center, points) {
return points.map( p => p.map( (x, i) => center[i] + k * (x - center[i])));
}
scale(
2, // в два раза
[3, 1], // относительно точки (3,1)
[ [0,0], [1,1], [3,1], [10,10] ] // этот четырёхугольник
)
// [ [-3, -1], [-1, 1], [3, 1], [17, 19] ]
".required"
написать ".required, #parent_cat_id, #category_id"
attachment
в messages.send(). + - * /
var re = /^0(?![\.\+\-\/\*])/;
['03','0','0.','0+'].map(s => s.replace(re,'')) /* 3,,0.,0+ */
+ - * /
; каждую из частей бить по точке, и каждое из получившихся целых прогонять через parseInt()
– это отбросит нули в начале. Потом собирать: склеить точкой, склеить знаком операции.[5.1, "*", 4.2, "-", 3.7]
И перед склейкой в одну строку для отображения в табло, проводить необходимые коррекции чисел..ts
формат, который потом можно просто склеивать.# из mp4 сделать ts
TMPVIDEO="tmp_video.ts"
ffmpeg \
-i "short.mp4" \
-bsf:v h264_mp4toannexb \
-an \
-f mpegts \
-y -hide_banner \
"$TMPVIDEO"
# до этого определить, сколько раз повторить фрагмент,
# чтобы покрыть длину mp3
REPEATS=5
LONGVIDEO="long_video.ts"
N=1
while [ $N -le $REPEATS ]; do
ffmpeg -i "concat:$TMPVIDEO|$TMPVIDEO" \
-c:v copy \
-y -hide_banner \
"$LONGVIDEO"
local STATUS=$? ; if [ $STATUS -ne 0 ]; then return $STATUS; fi
rm -f "$TMPVIDEO"
mv "$LONGVIDEO" "$TMPVIDEO"
local N=$[$N << 1]
echo "N: $N"
done
# получили длинное видео с запасом
# подрезать длину, чтобы точно соответствовала
FFMPEG -i "$TMPVIDEO" \
-c:v copy \
-t $MUSIC_LENGTH \
-y -hide_banner \
"$LONGVIDEO"
// внутри ul с классом list ищем все li
var myNodeList = document.querySelectorAll('ul.list li');
if( myNodeList.length) { // что-то нашлось, коллекция не пустая
var el0 = myNodeList[0]; // первый
}
Рабочий примерquerySelectorAll()
есть и у документа и у элемента. Так что можно сначала получить элемент, внутри которого искать, а затем внутри него собрать коллекцию:var list = document.querySelectorAll('ul.list'); // все UL класса list в документе
if( list.length) {
var items = list[0].querySelectorAll('.list');
// любые элементы класса list внутри первого найденного ul.list
if(items.length) {
var item = items[0]; // первый из li
}
}
.attr('viewbox', '0 0 1200 250')
– svg не становится «живым». Зато если через инструменты разработчика иму изменить параметр viewbox, например, вместо 1200 поставить 1201, все оживает: график вписывается в ширину и меняется при изменении окна.0 + 1 = 1 // итого первые три ряда: 0 1 1
= 2 // 0 1 1 2
1 + 2 = 3 // 0 1 1 2 3
значение: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144
порядковый номер: 0 1 2 3 4 5 6 7 8 9 10 11 12
Восьмой, если считать с 0, равен 21.getFibonachi()
передаётся не значение, а порядковый номер элемента ряда Фибоначчи, а функция должна вернуть значение.(n-1) и (n-2)
dlina_stroki * position.y + position.x
10x10
— массив длиной 100.0,0 200,0 400,0 ... 1800,0
0,200 200,200 400,200 ... 1800,200
0,400 200,400 400,400 ... 1800,400
...
0,1800 200,1800 400,1800 ... 1800,1800
(400,200)
i = storona * y / shag + x / shag
shag = 200
значит, искомый индекс 10 * 200 / 200 + 400 / 200 = 12
const dg = document.getElementById.bind(document);
const inKey = dg('in-key');
const inVal = dg('in-val');
dg('btn-to').addEventListener('click', e => {
localStorage.setItem(inKey.value, inVal.value);
});
dg('btn-from').addEventListener('click', e => {
inVal.value = localStorage.getItem(inKey);
});
dg('btn-list').addEventListener('click', e => {
let list = [];
for (let i = 0; i < localStorage.length; i++) {
let k = localStorage.key(i);
list.push('<dt>'+k+'</dt><dd>'+localStorage.getItem(k)+'</dd>');
dg('list').innerHTML = list.join('\n');
}
});
рабочий пример