DevNotes Live
6 subscribers
84.3K photos
12K videos
195 files
35.4K links
Автоматический агрегатор IT ресурсов в Telegram (@devnotes_robot)
Информация: https://t.me/devnotes_live/121
Download Telegram
Forwarded from Shock Design
Forwarded from Shock Design
Forwarded from Новые шрифты
Шрифт Cultbold by ruwakabaru

Бесплатно для личных и коммерческих проектов.

📁Скачать Шрифт

#Free #Cyrillic

🅰️ Новые шрифты
Posters by Polish graphic designer Mateusz Mahalski

link

💣 PSD
Forwarded from UI_UX inspiration
Минималистично оформленная коллекция шрифтов in use для поиска вдохновления. Довольно не плохая подборка кстати, надо бы понадергать оттуда шрифтовых маркетплейсов.

https://www.fontsinthewild.com

#fonts #collection

🌠 UI_UX inspiration
Forwarded from UI_UX inspiration
Forwarded from UI_UX inspiration
👩‍💻 Умный кеш JSON-запросов в файл

Реализуйте функцию fetchWithCache(url, ttl), которая делает HTTP-запрос по заданному URL (используя https), и кеширует результат в файл.

Если при повторном вызове с тем же URL кеш актуален (время жизни не истекло), функция должна вернуть данные из файла, не обращаясь к сети.

Поведение:

• Результат сохраняется в файл с названием, основанным на URL (можно использовать хеш).

• TTL (time to live) указывается в миллисекундах.

• Если кеш устарел или отсутствует, функция делает реальный HTTP-запрос и обновляет файл.


Решение задачи🔽

const https = require('https');
const fs = require('fs');
const path = require('path');
const crypto = require('crypto');

function fetchWithCache(url, ttl) {
const cacheDir = path.resolve(__dirname, 'cache');
const hash = crypto.createHash('md5').update(url).digest('hex');
const cacheFile = path.join(cacheDir, `${hash}.json`);

if (!fs.existsSync(cacheDir)) {
fs.mkdirSync(cacheDir);
}

return new Promise((resolve, reject) => {
if (fs.existsSync(cacheFile)) {
const { mtimeMs } = fs.statSync(cacheFile);
const now =
Date.now();

if (now - mtimeMs < ttl) {
const cached = fs.readFileSync(cacheFile, 'utf-8');
return resolve(JSON.parse(cached));
}
}

https.get(url, res => {
let data = '';
res.on('data', chunk => data += chunk);
res.on('end', () => {
fs.writeFileSync(cacheFile, data, 'utf-8');
resolve(JSON.parse(data));
});
}).on('error', reject);
});
}

// Пример использования:
fetchWithCache('
https://jsonplaceholder.typicode.com/todos/1', 5000)
.then(data => console.log(data))
.catch(err => console.error(err));
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Техночат
Разыгрываем лучшие гаджеты года: iPhone 16 Pro Max на 256 ГБ, 15-дюймовый MacBook Air 16/256 ГБ и PlayStation 5 Pro!

Чтобы их получить, достаточно подписаться на:
• наш канал «Техночат»
• И на канал «Больше, чем экономика»

Нажимаете после этого на кнопку «Участвовать» и ждёте 2 июля — в этот день в 20:00 по московскому времени рандомайзер выберет трёх победителей. Первый получит айфон, второй — макбук, а третий — PlayStation.

Призы бесплатно вышлем в ближайший к вам пункт выдачи СДЭК, поэтому уточните, есть ли он в вашей стране.
Forwarded from Техночат
Разыгрываем лучшие гаджеты года: iPhone 16 Pro Max на 256 ГБ, 15-дюймовый MacBook Air 16/256 ГБ и PlayStation 5 Pro!

Чтобы их получить, достаточно подписаться на:
• наш канал «Техночат»
• И на канал «Больше, чем экономика»

Нажимаете после этого на кнопку «Участвовать» и ждёте 2 июля — в этот день в 20:00 по московскому времени рандомайзер выберет трёх победителей. Первый получит айфон, второй — макбук, а третий — PlayStation.

Призы бесплатно вышлем в ближайший к вам пункт выдачи СДЭК, поэтому уточните, есть ли он в вашей стране.