GeeksFlow
40 subscribers
5 photos
6 videos
1 link
Download Telegram
Channel created
Forwarded from котики
я просто айтишник проработавший всю жизнь в бигтехе однажды ко мне заходит в комнату сын и спрашивает пап а что ты сделал для человечества и я потирая ручки довольный качусь на кресле с колесиками к полке достаю пыльный ноутбук открываю какой то странный дашборд и говорю смотри вот это вот метрика очень важная метрика у нас на ней весь продукт завязан на метрике этой и вон слева двадцать лет назад она была 0.576 потом я пришел и смотри вон как она двадцать лет менялась над ней работал я и шесть человек еще фулл тайм сейчас она 0.591 нихуево так скажи да +2.5% за двадцать лет а в прибыль знаешь какая конверция ты ахуеешь это мое детище это мое все я умру за продукт за дашборд за корпоративы за рабочее место за два монитора за сидр по пятницам за удаленку по четвергам за анекдоты в курилке по понедельникам как много твой папа сделал для этого мира скажи
👍5🫡2🔥1😁1
GeeksFlow
Tell me where the freaks at?
На видосике можно подумать, что я уже начал смотреть мультики без телевизора 0_0
Но нет - это "Yeah Science Bitch!!"

Поясняю 🤓

1) Как известно, быстрое преобразование Фурье в аудио-файлах преобразует звуковой сигнал из временной области в частотную область, позволяя анализировать его частотный состав и глубину спектра.
Применяем БПФ (STFT), разбивая сигнал на перекрывающиеся окна длиной 2048 сэмплов. Как результат - матрица «время × частота», из которой мы потом вычленяем только низкие басовые частоты.

y, sr = librosa.load(wav_path, sr=None)
S = np.abs(librosa.stft(y, n_fft=2048, hop_length=512))
freqs = librosa.fft_frequencies(sr=sr, n_fft=nfft)


2) Отбрасываем все строчки спектра выше 250 Гц и считаем Onset strength переходов в басах. Её кривая (oenv[m]) экстремумами откликается на «удары» bAss’a. times[m] - время каждого фрейма в секундах.
Далее ищем локальные максимумы из топ-10% по силе на кривой oenv, с интервалом в 0.4 для игнорирования мелкого «шума».

oenv = librosa.onset.onset_strength(S=S[freqs < 250], sr=sr, hop_length=hop)
times = librosa.times_like(oenv, sr=sr, hop_length=hop)
peaks = librosa.util.peak_pick(oenv, 5,5,10,10, float(np.percentile(oenv, 90)), int(0.4 * sr / hop))


3) Определяем длительность вспышки.
Для каждого пика мы нормируем его «силу» в диапазон [0.05…0.3] сек: сильнее бас - дольше горит фонарик + формируем временные метки вспышек.

stimes, strengths = times[peaks].tolist(), oenv[peaks].tolist()
dmin, dmax = 0.05, 0.3
smin, smax = min(strengths), max(strengths)
inv = (dmax - dmin) / (smax - smin) if smax != smin else 0
durations = list(map(lambda s: dmin + (s - smin) * inv, strengths))


Бинго, у нас готов спектроанализатор плотных бассов! Но это не все…
Перед нами встает инженерная задачка - компенсировать сетевой джиттер и гарантировать, что фонарик мигнёт ровно в момент сильных басовых ударов.

4) клиент шлёт: {type:'ping_req', client_ts}

сервер отвечает: {type:'ping_res', client_ts, server_ts}

msg = await ws.receive_json()
await ws.send_json({
"type": "ping_res",
"client_ts": client_ts,
"server_ts": server_ts
})


По RTT клиент вычисляет свой оффсет часов и пинг.

log
(`RTT=${((Date.now()/1000 - msg.client_ts)*1000).toFixed(1)}ms
offset=${((msg.server_ts - (msg.client_ts + (Date.now()/1000 - msg.client_ts)/2))*1000).toFixed(1)}ms`
);


5) На серваке формируется расписание «флешей» - каждый флеш получает абсолютную метку unix-timestamp сервера и длительность dur. Этот список по вебсокету отправится всем клиентам.


SCHEDULE_EVENTS.extend(map(lambda td: {"ts": time.time() + td[0], "dur": td[1]}, zip(stimes, durations)))

await ws.send_json({
"type": "schedule",
"events": SCHEDULE_EVENTS
})


6) Клиент-сайд рассчитывает свой пинг


RTT = t2 - t0;
offset = server_ts - (t0 + RTT/2);

И формирует для каждого флэша таймауты в рамках открытого ws соединения.

localFireTime = ev.ts - offset;
delayMs = (localFireTime - Date.now()/1000)*1000;
setTimeout(()=>doFlash(ev.dur), delayMs);

Для каждого клиента будет калькулироваться свой RTT в зависимости от его сетевого джиттера.

Для убедительности эксперимента на локалке включил vpn + проксировал коннект через ngrok + на телефоне тоже был включен vpn.


Остается 1 вопрос - зачем? автор сделал концовку с открытым финалом
🔥6🫡1
лега мем
👍2😁2
Поюзал 5-ую ГПТ-шку и Replit в достаточно комплексном проекте.
Все что могу сказать:

Программисты, we are cooked 😢
🫡2👍1🤔1
This media is not supported in your browser
VIEW IN TELEGRAM
баZироVаный мемчаго
👍5😁2🤔1
😁2🔥1🥴1
This media is not supported in your browser
VIEW IN TELEGRAM
разработка в 2025ом году
😁3🤨2