local MUSIC_LENGTH=$(ffprobe \
-v quiet \
-print_format ini \
-show_format \
"$MUSIC_PCM" | grep duration | sed s/duration=//)
$MUSIC_PCM
– путь к медиафайлу. if ($request_method = POST) {
rewrite ^(.*)$ /php/index.php break;
}
if ($http_user_agent ~ Android) {
rewrite ^(.*)$ /java/index.java break;
}
rewrite ^(.*)$ /html/index.html;
-H
Опция -H устанавливает переменную окружения HOME, в домашний каталог целевого пользователя (по умолчанию root) как определено в файле passwd(5). По умолчанию, sudo не модифицирует HOME (смотрите set_home и always_set_home в sudoers(5))
-H
или --set-home
Promise.all()
asyncX()
возвращали промисы:const yourXFunction = (async1, async2, async3, someCallback) => {
let latest; // последнее значение остаётся
Promise.all([
async1().then(v => {latest = 1; return v;}),
async2().then(v => {latest = 2; return v;}),
async3().then(v => {latest = 3; return v;}),
]).then(results => {
console.log("Last was async" + latest);
someCallback(results[latest - 1]);
});
}
const yourXFunction = (async1, async2, async3, someCallback) => {
let latest; // последнее значение остаётся
Promise.all([
wrap(async1).then(v => {latest = 1; return v;}),
wrap(async2).then(v => {latest = 2; return v;}),
wrap(async3).then(v => {latest = 3; return v;}),
]).then(results => {
someCallback(results[latest - 1]);
});
}
const wrap = (f) => new Promise((res, rej) => f(res));
const async1 = (cb) => {
setTimeout(() => {
cb(1);
}, 4000);
};
const async2 = (cb) => {
setTimeout(() => {
cb(13);
}, 6000);
};
const async3 = (cb) => {
setTimeout(() => {
cb(5);
}, 3000);
};
const someCallback = (val) => console.log(val);
yourXFunction(async1, async2, async3, someCallback);
// через 6 секунд выведет "13"
// так не сработает:
const response = '{"success":1,"data":"{\"esiaId\":null,\"legalMunicipality\":{\"id\":12,\"name\":\"Энгельс\"},\"factMunicipality\":{\"id\":12,\"name\":\"Энгельс\"},\"is_subscribed\":false,\"subscriptions\":null}"}';
// а вот так всё получится:
const response2 = '{"success":1,"data":"{\\\"esiaId\\\":null,\\\"legalMunicipality\\\":{\\\"id\\\":12,\\\"name\\\":\\\"Энгельс\\\"},\\\"factMunicipality\\\":{\\\"id\\\":12,\\\"name\\\":\\\"Энгельс\\\"},\\\"is_subscribed\\\":false,\\\"subscriptions\\\":null}"}';
console.log(response2);
const parsed = JSON.parse(response2);
const data = JSON.parse(parsed.data);
console.log(data.legalMunicipality.name); // Энгельс
time()
if .. else
и выводите релевантную строку.if()
проверяет только условие существования файла или директории. А try-catch
обработает бОльшее число ситуаций: если это не файл, а директория, если права не позволяют читать, если устройство гакнулось и не прочиталось.# Вариант 1:
f getFileContent(filename){
if (!file_exists(filename)) {error: file not found}
return file_content(filename)
}
# Вариант 2:
f getFileContent(filename){
try return file_content(filename)
catch FileNotFoundException {error: file not found}
}
if
отличается тем, что проверяет предусмотренные варианты, а исключения кидаются в непредусмотренных. Все бросаемые исключения надо документировать, чтобы их кто-то где-то, в итоге, поймал.const someObject = {a:'value A'};
const arr1 = [1, 'test', someObject];
const arr2 = [100, 200, 'testing', {a:'value A'}];
const arr3 = [1e3, someObject];
const arrays = [arr1, arr2, arr3];
const dict = new Map();
const addArray = (arr, label) => {
for(let i=0, len=arr.length; i<len; i++) {
const key = arr[i];
if (dict.has(key)) return [key, dict.get(key), label];
dict.set(key, label);
}
}
for (let i=0, len = arrays.length; i<len; i++) {
const check = addArray(arrays[i], `arr${i+1}`);
if (!check) continue;
console.log(`Value ${check[0]} found in arrays ${check[1]} and ${check[2]}`);
break;
}
// Value [object Object] found in arrays arr1 and arr3