const resTemps = await axios.post(
'/api/files/datas',
{
fileNames: temps.map((temp) => temp.name),
layer: degree,
domain: { low: zoomDomain[0], high: zoomDomain[1] },
},
{
signal: controllerTempsRef.current.signal,
}
);
const resPressures = await axios.post(
'/api/files/datas',
{
fileNames: pressures.map((pressure) => pressure.name),
layer: degree,
domain: { low: zoomDomain[0], high: zoomDomain[1] },
},
{
signal: controllerPressuresRef.current.signal,
}
);
//Перед обновление стейта сохраняешь текущую версию
const oldState = { ...state }
//Обновляешь стейт
setState({ foo: 'bar' });
//Этот код нужно выполнять в юзефект с депсами стейта
//Это массив измененных свойств
const changedProperties = {};
for (const key in state) {
if (state.hasOwnProperty(key) && oldState[key] !== state[key]) {
changedProperties[key] = state[key];
}
}
//Проверяем если были обновления и отправляем
if (Object.keys(changedProperties).length > 0) {
fetch('/endpoint', {
method: 'POST',
body: JSON.stringify(changedProperties),
headers: {
'Content-Type': 'application/json'
}
}).then((response) => {
if (response) {
console.log('Данные успешно обновлены на сервере');
} else {
console.log('Не удалось обновить данные на сервере');
// В случае ошибки апдейтп можно откатить стейт
setState(oldState);
});
}
function my_get_wpdm_post_count() {
$cache_key = 'my_wpdm_post_count';
$post_count = wp_cache_get( $cache_key );
if ( false === $post_count ) {
global $wpdb;
$post_count = $wpdb->get_var(
"SELECT COUNT(*) FROM {$wpdb->posts} WHERE post_type = 'wpdmpro' AND post_author = 1 AND post_status IN ('publish', 'private')"
);
wp_cache_set( $cache_key, $post_count );
}
return $post_count;
}
import { createSlice, createAsyncThunk } from '@reduxjs/toolkit';
export const loadImage = createAsyncThunk(
'canvas/loadImage',
async (dataURL, { getState }) => {
const state = getState().canvas;
const img = new Image();
img.src = dataURL;
return new Promise((resolve, reject) => {
img.onload = () => {
const ctx = state.canvas.getContext('2d');
ctx.clearRect(0, 0, state.canvas.width, state.canvas.height);
ctx.drawImage(img, 0, 0, state.canvas.width, state.canvas.height);
resolve();
};
img.onerror = reject;
});
}
);
export const canvasSlice = createSlice({
name: 'canvas',
initialState: {
canvas: null,
undoList: [],
redoList: [],
},
reducers: {
setCanvas: (state, action) => {
state.canvas = action.payload;
},
pushToUndo: (state, action) => {
state.undoList.push(action.payload);
},
pushToRedo: (state, action) => {
state.redoList.push(action.payload);
},
undo: (state) => {
if (state.undoList.length) {
const dataURL = state.undoList.pop();
state.redoList.push(dataURL);
dispatch(loadImage(dataURL));
} else {
console.log('Нет элементов для отката');
}
},
redo: (state) => {
if (state.redoList.length) {
const dataURL = state.redoList.pop();
state.undoList.push(state.canvas.toDataURL());
dispatch(loadImage(dataURL));
}
},
},
extraReducers: (builder) => {
builder.addCase(loadImage.pending, (state) => {
// обработка начала загрузки изображения
});
builder.addCase(loadImage.fulfilled, (state) => {
// обработка завершения загрузки изображения
});
builder.addCase(loadImage.rejected, (state) => {
// обработка ошибки загрузки изображения
});
},
});
export const { setCanvas, pushToUndo, pushToRedo, undo, redo } = canvasSlice.actions;
export default canvasSlice.reducer
function detectCollision(sq1, sq2) {
// вычисляем границы квадратов
const sq1_left = sq1.x;
const sq1_right = sq1.x + sq1.side;
const sq1_top = sq1.y;
const sq1_bottom = sq1.y + sq1.side;
const sq2_left = sq2.x;
const sq2_right = sq2.x + sq2.side;
const sq2_top = sq2.y;
const sq2_bottom = sq2.y + sq2.side;
// проверяем, пересекаются ли границы квадратов по осям X и Y
const x_collide = sq1_right >= sq2_left && sq1_left <= sq2_right;
const y_collide = sq1_bottom >= sq2_top && sq1_top <= sq2_bottom;
// если пересекаются, проверяем наличие пересечения сторон
if (x_collide && y_collide) {
const top_collision = sq1_bottom >= sq2_top && sq1_top <= sq2_top;
const bottom_collision = sq1_top <= sq2_bottom && sq1_bottom >= sq2_bottom;
const left_collision = sq1_right >= sq2_left && sq1_left <= sq2_left;
const right_collision = sq1_left <= sq2_right && sq1_right >= sq2_right;
return top_collision || bottom_collision || left_collision || right_collision;
}
return false;
}
const square = {
x: 100, // координата левого верхнего угла по оси X
y: 50, // координата левого верхнего угла по оси Y
side: 30 // длина стороны квадрата
};
const arr = [1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 6, 7, 8, 11, 13, 31, 31, 44, 51, 81, 65, 63];
const target = parseInt(prompt("enter number", "52"));
function findCombinations(sum, startIndex, currentCombination) {
if (sum === target) {
console.log(currentCombination);
return;
}
for (let i = startIndex; i < arr.length; i++) {
const num = arr[i];
const newSum = sum + num;
if (newSum <= target) {
findCombinations(newSum, i + 1, [...currentCombination, num]);
}
}
}
arr.sort((a, b) => b - a); // сортируем массив по убыванию, чтобы начинать с самых длинных комбинаций
findCombinations(0, 0, []);
const onMouseDown = (evt) => {
let posX = evt.pageX;
let current = 0;
const onMouseMove = (evt) => {
if (evt.pageX < posX) {
posX = evt.pageX;
current -= 5;
} else {
posX = evt.pageX;
current += 5;
}
menuList.style.transform = `translateX(${current}px)`;
};
menuList.addEventListener('pointermove', onMouseMove);
menuList.style.transition = 'transform 0.2s ease-out';
};
menuList.addEventListener('pointerdown', onMouseDown);
setInputDinamic(Array.from({length: numOfInputs}, () => ({ value: '', value1: '' })));
import telebot
from telebot import types
import config
bot = telebot.TeleBot(config.token)
ADMINS = [1111111]
doska = []
@bot.message_handler(commands=['start'])
def start(message):
markup = types.InlineKeyboardMarkup()
btn1 = types.InlineKeyboardButton("Доска Почета", callback_data="doska")
btn2 = types.InlineKeyboardButton("❓ Задать вопрос", callback_data="question")
markup.add(btn1, btn2)
bot.send_message(message.chat.id, text="Привет, {0.first_name}! Я бот инженерной школы".format(message.from_user), reply_markup=markup)
@bot.callback_query_handler(func=lambda call: True)
def callback_query(call):
if call.data == "doska":
markup = types.InlineKeyboardMarkup()
btn1 = types.InlineKeyboardButton("Назад", callback_data="back")
btn2 = types.InlineKeyboardButton("Редактировать", callback_data="edit")
markup.add(btn1)
if call.message.chat.id in ADMINS:
markup.add(btn2)
bot.send_message(call.message.chat.id, text="test text",reply_markup=markup)
elif call.data == "back":
markup = types.InlineKeyboardMarkup()
btn1 = types.InlineKeyboardButton("Доска Почета", callback_data="doska")
btn2 = types.InlineKeyboardButton("❓ Задать вопрос", callback_data="question")
markup.add(btn1, btn2)
bot.send_message(call.message.chat.id, text="Вы вернулись в главное меню", reply_markup=markup)
if __name__ == '__main__':
print("bot start work")
bot.infinity_polling()
const R = 6371; // радиус Земли в км
// запрос высоты точки у пользователя
const height = prompt("Введите высоту точки в км");
// вычисление расстояния до линии горизонта Земли
const horizonDistance = Math.sqrt((2 * R * height) + (height ** 2));
// вывод результата
console.log(`Расстояние до линии горизонта Земли: ${horizonDistance.toFixed(2)} км`);
Foreign key
(внешний ключ) - это механизм, который позволяет связывать данные из двух таблиц в базе данных, где одна таблица ссылается на другую посредством поля, которое является первичным ключом в таблице, на которую она ссылается.foreign key
имеет несколько преимуществ. Одно из них - обеспечение целостности данных, то есть предотвращение появления некорректных значений в таблице. Когда вы устанавливаете foreign key
, вы создаете ограничение, которое не позволит вставить запись в таблицу, если нет соответствующего значения в связанной таблице.foreign key
, вы должны выполнить следующие шаги:CREATE TABLE table1 (
id INT PRIMARY KEY,
name VARCHAR(50),
table2_id INT,
FOREIGN KEY (table2_id) REFERENCES table2(id)
);
CREATE TABLE table2 (
id INT PRIMARY KEY,
name VARCHAR(50)
);
REFERENCES
:FOREIGN KEY (table2_id) REFERENCES table2(id)
table1
, которая имеет поле table2_id
, которое ссылается на поле id
в таблице table2
. С помощью ключевого слова FOREIGN KEY
мы говорим базе данных, что это поле должно быть связано с полем id
в таблице table2
.ON DELETE
, чтобы определить, что происходит с записями в таблице, которые связаны с удаленными записями из другой таблицы. Например:FOREIGN KEY (table2_id) REFERENCES table2(id) ON DELETE CASCADE
table2
, все связанные записи в таблице table1
также должны быть удалены (CASCADE)
.foreign key
может значительно улучшить целостность данных в вашей базе данных, облегчить ее обслуживание и предотвратить появление ошибок в будущем. COUNTA
. Например, если у вас есть список ФИО в диапазоне A1:A100
, то формула для подсчета заполненных ячеек будет выглядеть так: =COUNTA(A1:A100)
. Эта формула вернет количество заполненных ячеек в диапазоне A1:A100
.INDEX
. Например, если у вас есть список ФИО в диапазоне A1:A100
, и вы хотите разделить его поровну на два столбца в диапазоне B1:C50
, то формула для первого столбца будет выглядеть так: =INDEX(A:A, 1+ROW(B1)*2-2)
, а для второго столбца: =INDEX(A:A, 1+ROW(B1)*2-1)
. Эти формулы вернут значения из списка ФИО, разделенные поровну на два столбца.=INDEX(A:A, 1+ROW(B1)*3-3)
, для второго столбца: =INDEX(A:A, 1+ROW(B1)*3-2)
, а для третьего столбца: =INDEX(A:A, 1+ROW(B1)*3-1)
. Эти формулы вернут значения из списка ФИО, разделенные поровну на три столбца.IMPORTRANGE
. Например, если у вас есть лист с именем Sheet1
, на котором находится список ФИО и подсчитано количество заполненных ячеек, а также есть лист с именем Sheet2
, на котором вы хотите разделить список на два столбца, то формула для первого столбца на листе Sheet2
будет выглядеть так: =INDEX(IMPORTRANGE("<spreadsheet_url>", "Sheet1!A:A"), 1+ROW(B1)*2-2)
, где <spreadsheet_url>
- это URL-адрес вашей таблицы. Аналогично для второго столбца.