ЕМНИП я использовал алгоритм Чудновского на ПК, но вообще замечание корректно - алгоритмы разные и даже отдаленного сравнения не провести между машинами.
PS: Будет еще один заход, но уже с более быстрым алгоритмом от Белларда. Там уже можно даже с современными процессорами посравнивать.
То ли я навострился на таких задачах в школе/универе, то ли они действительно несложные, но каждая решается за минуту. Дополнительные вопросы поинтереснее, но тоже не rocket science.
Если в двух словах, то храним в redis'e не только кэш, но и флаг того что у нас есть inflight запрос.
const cached = await dbService.get(cacheKey(id));
if (cached) {
return cached;
}
// need to pre-subscribe, if we would subscribe after flag checking we can miss event
const fetchedEvent = eventForFetchedData(id);
const inflightPromise = new Promise((resolve) => {
messageBusService.sub(fetchedEvent, ({ data }) => {
messageBusService.unsub(fetchedEvent).catch();
resolve(data);
});
});
const fetchStartEvent = eventForFetchStart(vin);
const fetchStartPromise = new Promise((resolve) => {
messageBusService.sub(fetchStartEvent, ({ tag }) => {
messageBusService.unsub(fetchStartEvent).catch();
resolve(tag);
});
});
const inflightRequest = await dbService.get(cacheKeyForInflightFlag(id));
if (inflightRequest !== null) {
return inflightPricePromise;
}
const requesterId = getRequesterId();
await messageBusService.pub(fetchStartEvent, { tag: requesterId });
const firstRequesterId = await fetchStartPromise;
// we lost that race, some other thread was first to send message to message bus,
// that it is going to fetch data!
if (firstRequesterId !== requesterId) {
return inflightPromise;
}
messageBusService.unsub(fetchedEvent).catch();
const data = await callToAPI(id);
await dbService.set(cacheKey(id), data);
await dbService.del(cacheKeyForInflightFlag(id));
// order is important, we need to clean flag first, otherwise consumer can subscribe
// inbetween pub and del operations and get stuck
await messageBusService.pub(fetchedEvent, { data });
return data;
Кроме redlock'a можно и pubsub использовать, который предоставляется редисом из коробки. Правда там тоже нужно код аккуратно написать, дабы не нарваться на другие race condition'ы уже.
`access token` приложения лимитирован. В частности столкнулся с тем, что через этот токен нельзя работать с github packages. Самое забавное, что дефолтный GITHUB_TOKEN позволяет это, а вот через токен приложения - ни-ни.
Вместо getContent лучше использовать другой метод для получения SHA текущей версии файла.
/*
* Return content for specific file from repo
*
* It has limit by 1MB
* Encoded in base64 by default
*/
const getFileContent = authorizeFn(
(
repo,
path,
branch,
) => (
githubClient.repos.getContent({
owner: ORGANIZATION_NAME,
repo,
path,
...branch && { ref: `refs/heads/${branch}` },
})
),
);
/*
* Return info (sha/size/...) for file
*/
const getFileInfo = async (repo, path, branch) => {
const folder = path.split('/').slice(0, -1).join('/');
const folderContent = await getFileContent(repo, folder, branch);
const fileEntry = folderContent.find(({ path: filePath }) => filePath === path);
if (!fileEntry) {
throw Error(`File ${path} not found!`);
}
return fileEntry;
};
/*
* Get SHA of existing file
*/
const getSHAForExistingFile = async (repo, path, branch) => {
try {
const { sha } = await getFileInfo(repo, path, branch);
return sha;
} catch (err) {
return undefined;
}
};
Заливка файлов не так важна у вас, но можно в один коммит включать несколько файлов, хоть это и более муторно - нужно создать git blob'ы для каждого файла, затем git tree, создать сам коммит и обновить branch head на sha новосоздонного коммита.
То что эксплоит позволяет исполнять произвольный код внутри процесса chrome это не является уязвимостью? Ну-ну.
Далеко не новость, что сейчас зловреды используют несколько уязвимостей чтобы скомпроментировать систему. Даже после того, как код выберется из песочницы, еще необходимо эксплутаировать ошибку в самой ОСи для повышения привелегий.
Единственное, надо сразу писать огромными буквами в самом начале, что изменение параметров блоков или прошивка обновлений может превратить автомобиль в кирпич и придется менять блоки на новые, а это недешевое удовольствие.
в большинстве случаев можно выпаять флеш-память и использовать программатор.
Когда я удалил gmail (через Titan Backup), он всё равно остался где-то прописан, и периодически (раз в 3-5 минут) система напоминала об его отсутствии alert'ом.
Готово.
ЕМНИП я использовал алгоритм Чудновского на ПК, но вообще замечание корректно - алгоритмы разные и даже отдаленного сравнения не провести между машинами.
PS: Будет еще один заход, но уже с более быстрым алгоритмом от Белларда. Там уже можно даже с современными процессорами посравнивать.
Я только потом добавил PS, что статья моя.
Используя rust - маловероятно.
Довольно популярная задачка на отреверсить VM без знания формата инструкций. Тем не менее, всегда мне нравились такие таски)
То ли я навострился на таких задачах в школе/универе, то ли они действительно несложные, но каждая решается за минуту. Дополнительные вопросы поинтереснее, но тоже не rocket science.
В elasticsearch на пару дней. Обычно этого достаточно чтобы понять проблему.
Если в двух словах, то храним в redis'e не только кэш, но и флаг того что у нас есть inflight запрос.
Забавно: мы похожую задачку даём на техническом интервью) Не всё же алгоритмами мучать - нужно что-то и из реального мира проверять.
Кроме redlock'a можно и pubsub использовать, который предоставляется редисом из коробки. Правда там тоже нужно код аккуратно написать, дабы не нарваться на другие race condition'ы уже.
`access token` приложения лимитирован. В частности столкнулся с тем, что через этот токен нельзя работать с github packages. Самое забавное, что дефолтный
GITHUB_TOKEN
позволяет это, а вот через токен приложения - ни-ни.Вместо
getContent
лучше использовать другой метод для получения SHA текущей версии файла.Заливка файлов не так важна у вас, но можно в один коммит включать несколько файлов, хоть это и более муторно - нужно создать git blob'ы для каждого файла, затем git tree, создать сам коммит и обновить branch head на sha новосоздонного коммита.
дык это оно и есть, не? :)
То что эксплоит позволяет исполнять произвольный код внутри процесса chrome это не является уязвимостью? Ну-ну.
Далеко не новость, что сейчас зловреды используют несколько уязвимостей чтобы скомпроментировать систему. Даже после того, как код выберется из песочницы, еще необходимо эксплутаировать ошибку в самой ОСи для повышения привелегий.
в большинстве случаев можно выпаять флеш-память и использовать программатор.
у порше же с более-менее свежих годов всё через онлайн, не?
хз, всё верно вроде —
(2x)^2 = 4x^2
насколько я помню, любой может заливать write-up на площадку. мб, ralf и залил этот write-up на HTB?
Эта опция deprecated уже фиг знает сколько времени. Может и была такая уязвимость лет 5 назад, но сейчас это не совсем актуально.
Когда я удалил gmail (через Titan Backup), он всё равно остался где-то прописан, и периодически (раз в 3-5 минут) система напоминала об его отсутствии alert'ом.