На серваке установлена Microsoft SQL Server 2014 с лимитом в 10гб
Посоветуйте, как можно было бы максимально безболезненно восполнить утраченные знания, а также наверстать упущенные новшества в языке?
Сейчас хочу попробовать реализовать научный проект.Собсно практика - лучший учитель, садитесь и пишите. Если базу уже знаете реализация не станет проблемой. По ходу решения текущих задач проекта познакомитесь со всеми нужными изменениями и практиками, сегодня на любой чих есть дока, туториал, видео и чатжпт. Двух зайцев двумя плюсами, так сказать...
$grouped = [];
foreach ($arr as [ 'id' => $id, 'name' => $name, 'key' => $key ]) {
$grouped[$key][$name] ??= [ 'name' => $name, 'ids' => [] ];
$grouped[$key][$name]['ids'][] = $id;
}
foreach ($keys as $k) {
$$k = array_map(fn($n) => [
'name' => $n['name'],
'ids' => implode(', ', $n['ids'])
], array_values($grouped[$k] ?? []));
}
Я запутался в том, что хочу сделать.
но знаю что setTimeout работает криво,
накапливается или вовсе перестает работать
Как мне перезапускать скрипт после развертывания браузера телефона
let socket;
const url = "ws://your-websocket-server-url";
function connect() {
socket = new WebSocket(url);
socket.onopen = () => {};
socket.onmessage = (event) => {};
socket.onerror = (error) => {};
socket.onclose = (event) => {};
}
function reconnect() {
if (socket && socket.readyState !== WebSocket.CLOSED) return;
.....
}
function send(message) {
if (socket && socket.readyState === WebSocket.OPEN) {
socket.send(message);
return
}
console.warn("WebSocket is not open. Message not sent:", message);
....
}
document.addEventListener('visibilitychange', () => {
// document.hidden
if (document.visibilityState === 'visible' && websocket.readyState === WebSocket.CLOSED) {
reconnect();
}
});
API to allow messages to be pushed from a server to a browser, even when the site isn't focused or even open in the browser.
{ 'старый ключ': 'новый ключ' }
:const keys = {
x: 'a',
y: 'b',
z: 'c',
};
const renameKeys = (obj, keys) =>
Object.fromEntries(Object
.entries(obj)
.map(([ k, v ]) => [ Object.hasOwn(keys, k) ? keys[k] : k, v ])
);
// или
const renameKeys = (obj, keys) =>
Object.keys(obj).reduce((acc, k) => (
acc[keys[k] ?? k] = obj[k],
acc
), {});
const newArr = arr.map(n => renameKeys(n, keys));
function renameKeys(keys, obj) {
for (const k in keys) {
if (obj.hasOwnProperty(k)) {
obj[keys[k]] = obj[k];
delete obj[k];
}
}
}
arr.forEach(renameKeys.bind(null, keys));
вместо условных 100 кликов людям засчитывало ~40судя по sql у тебя количество сохраняемых кликов считается как сначала запросом получить текущее значение, затем сохранить его увеличенным... что естественно неправильно обсчитывается, если одновременно на бакэнд идут несколько запросов, и завершаются в разном порядке (т.е. первый, получил значение 1, затем его обогнал второй, получил то же значение 1, оба отправляют +1 значение, т.е. 2, вместо ожидаемого 3.
update set clicks=clicks+1, last_click_time=now() where last_click_time+:ALLOWED_CLICK_INTERVAL<now() and id=:current_id