http://localhost:8000/api
docker run -p 8000:8000
http://centrifugo:8000/api
const findRangeKey = (keysArray, keyString) => {
const num = Number(keyString);
if (keysArray.includes(keyString)) {
// exact match
return keyString;
}
return keysArray.find(key => {
const [min, max] = key.split('-').map(Number);
if (max !== undefined) {
return num >= min && num <= max;
}
return num === min;
});
};
findRangeKey(['10', '20-40'], 30); // "20-40"
findRangeKey(['10', '20-40'], 20); // "20-40"
findRangeKey(['10', '20-40'], 10); // "10"
const data = {
'10': {
'5-15': {
title: '10-5-15',
}
},
'20-60': {
'5': { title: '20-60-5' },
'10': { title: '20-60-10' },
'20-40': { title: '20-60-20-40' },
},
};
const getTitle = (data, a, b) => {
const aKey = findRangeKey(Object.keys(data), a);
if (!aKey) {
return null;
}
const bKey = findRangeKey(Object.keys(data[aKey]), b);
if (!bKey) {
return null;
}
return data[aKey][bKey].title;
};
console.log(getTitle(data, '10', '5')); // "10-5-15"
console.log(getTitle(data, 40, 30)); // "20-60-20-40"
services:
frontend:
image: example/webapp
deploy:
resources:
limits:
cpus: '0.50'
memory: 50M
pids: 1
reservations:
cpus: '0.25'
memory: 20M
ls -l@
«Собака» – для расширенных атрибутов.$ ls -l@
drwx------@ 5 username staff 160 Sep 22 20:22 Applications
com.apple.quarantine 21
drwx------+ 57 username staff 1824 Jun 15 16:17 Desktop
drwx------+ 179 username staff 5728 Jan 17 12:03 Documents
drwx------+ 266 username staff 8512 Jan 15 18:25 Downloads
drwx------@ 125 username staff 4000 Dec 1 19:16 Dropbox
com.apple.FinderInfo 32
com.apple.quarantine 34
drwx------@ 74 username staff 2368 Oct 2 17:40 Library
com.apple.FinderInfo 32
xattr filename
$ xattr Dropbox/
com.apple.FinderInfo
com.apple.quarantine
Или подробнее, со значением атрибута в 16-ричном виде или текстовом: с ключом -l
$ xattr -l Dropbox/
com.apple.FinderInfo:
00000000 00 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 |................|
00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000020
com.apple.quarantine: 0082;00000000;DropboxFolderTagger;
man xattr
const keys = ['key1', 'key2', 'key3'];
const values = ['value1', 'value2', 'value3', 'value4', 'valu5', 'value6'];
const makeGen = function*(arr) {
let index = 0;
const { length } = arr;
while (true) {
yield arr[index++ % length];
}
}
const keyGen = makeGen(keys);
const valGen = makeGen(values);
const length = Math.max(keys.length, values.length);
const result = Array.from({ length }, () => [keyGen.next().value, valGen.next().value]);
console.log(JSON.stringify(result, null, 2));
/*
[
[
"key1",
"value1"
],
[
"key2",
"value2"
],
[
"key3",
"value3"
],
[
"key1",
"value4"
],
[
"key2",
"valu5"
],
[
"key3",
"value6"
]
]
*/
fadeOut()
вероятно, из jQuery?- elem.fadeOut();
+ $('selector').fadeOut();
Date.now()
и сколько сейчас времени до времени-Ч. И это отрисовали. Fingerprint2.get(hash => {
$.ajax({
type: 'post',
url: 'https://api.example.com/log',
dataType: 'json',
data: { hash },
success: res => console.log('OK!', res),
error: console.error,
});
});
Но вообще, переходите на поддерживаемую и обновляемую версию пакета @fingerprintjs/fingerprintjs const MyMap = new Map([['aAa', 'A'], ['bbb', 'B'], ['CcC', 'C']]);
const toRename = [...MyMap.keys()].filter(key => key.toLowerCase() !== key);
// [ "aAa", "CcC" ]
toRename.forEach(key => {
MyMap.set(key.toLowerCase(), MyMap.get(key));
MyMap.delete(key);
});
// MyMap: { bbb → "B", aaa → "A", ccc → "C" }
По-хорошему, надо проверять ещё, что ключ именно строка. А то Map дело такое, там и объект ключом может.$groups = [
'detailed',
'parent' => [
'short',
'parent' => [
'short',
'parent' => [
'short',
],
],
],
];
npm init
Для этого понадобится сначала установить на комп node
и npm
npm install ...
main.js
, где объединить ваш код и этот модульimport { Game } from 'js-chess-engine'; // 1-я строчка в файле main.js
const game = new Game();
// ... ваш код, взаимодействующий с game