Bite the Byte
2.77K subscribers
24 photos
1 video
251 links
Соловйов здорової людини!

🌐solovyov.net
🐦twitter.com/asolovyov
🔴youtube.com/asolovyov

Архів каналу: solovyov.net/channel

Без реклами
Download Telegram
Дратують люди, які вважають 80 символів неважливим обмеженням через недосконалість терміналів у древності (тут маються на увазі часи 30-50 років тому).

Це ж невимовно круте обмеження! Фасілітатор покращення якості коду! І все таке. Чому, запитає допитливий читач (ггг).

• Найпростіша причина: так легше читати. Коли автор не може дозволити собі всі думки в цілому світі запхати в одну строку - це знижає шанси на виникнення піків складності (за відсутністю сталого терміну). Можна сказати, що гарний програміст уникає їх у коді самостійно, але ж це веде до того, зо він свою енергію втрачає не туди, куди треба — а на самообмеження. А сила волі — дуже кінечний ресурс. Тож ок, воно обмежує автора для користі читача.
• Це наче продовження попередньої думки, але під іншим кутом: обмеження змушує автора подумати над тим, як краще структурувати код, як розділити його і все таке. Типу годі вже грязюку розводити, подумай, де чекпоінти. Рядок - він як регекс, якщо в ньому забагато символів, ти вирішуєш проблему невірно!
• Найцікавіше: це допомога самому автору. Сумніваюся, що хтось образу з голови пише код в редактор і все. Набагато більше часу ми витрачаємо на редагування і, відповідно, на повторне читання того коду! Тож не смітить одразу і легше буде перероблювати і прибирати потім.

Раптовий поворот: стаття про те, що чувак обмежив собі ширину у редакторі і йому стало простіше писати тексти. Воно трохи емпіричне, але збігається з моїм досвідом: з телефона пишеш простіше, коротше, а отже, краще. :) І менше відволікаєшся, але це про інше. ;)

Ви можете згадати мої думки про поради, тож думайте самі. У сенсі думайте про те, як краще виконувати це правило. 😬
Нідерландська система поїздів наче зійшла зі сторінок науково-фантастичної книги. Яку ще писали років 60-70 тому, коли вірили, що людство може організуватися і побудувати логічне суспільство. :)

Бо я інакше не можу нічим пояснити працюючі трьох-хвилинні пересадки. Ти півтори години їдеш у потязі з Гронінгену, оголошують «Алміре», переходиш через платформу у потяг навпроти, та й їдеш в Амстердам. Ну або в інший час буде іншою дорогою з двома пересадками, і все одно стиковки там по 2-4 хвилин.

Так, бувають пересадки і по 15-20 хвилин, які мені якось більш зрозумілі. І так, я наче уявляю, що ці трьох-хвилинні — їх спеціально сінкають для того, щоб зручно було добиратися. Але як таке можна зробити у масштабах цілої країни, навіть доволі невеликої?

Коли згадують теорії змов, один з наочних аргументів проти — це складність організації будь-яких проектів. Так ось NS.nl — аргумент за те, що людство таки щось може. :)
Фундаментальна помилка атрибуції

Нашим мізкам властива купа помилок, від яких відбитися важко і взагалі вони відчуваються розумною поведінкою. Типу Коля запізнюється на зустріч — це ж бо він безвідповідальна тварюка, і 100% ще буде ліпити відмазки на кшталт трафіку, дітей, що заважали, і такого іншого. Не поважає час інших людей, так?

А ось я поважаю! Дуже стараюся приходити вчасно, і запізнююся тільки з поважних причин.

Дивна річ, що Коля думає рівно навпаки — бо ми оцінюємо себе за намірами, а інших — за результатами. Ця помилка інколи призводить до дуже неприємних розмов, хахаха. Особливо у випадках, коли людина взагалі не відстрелює про цю особливість мислення.

Якщо хочете ковирнути глибше, є стаття на вікіпедії, але мені вистачає знати себе, щоб зрозуміти, що проблема існує. :)

Хз як закінчити пост. Вважайте це нагадуванням про те, що до інших треба ставитися людяно. :)
Річ Посполита

Багато вже років тому я прочитав, що означає слово "посполита" — це від "спільний" у сенсі для всього народу, ну або просто "народний". Там у якийсь час це слово позначало селян (тобто є пани, є міщани і є посполиті люди, типу звичайні). Ладно, тут все зрозуміло.

А от слово "Річ" роками не міг зрозуміти. Я розумію, що разом "Річ Посполита" — це "республіка", res publica, але ніде ніколи ніхто не пояснював значення цього слова. Ну як відібрало їм, чи що. Оце навіть якийсь час думав, що це термін типу "Січ", яке незрозуміло звідки взялося — мови розвиваються іноді дуже незрозумілими путями.

Ну і шо, колись воно набридло мені, і я пішов шукати. Спочатку пішов до Гугл Транслейту і він мені каже, так res — це ж річ. Сууупер, думаю, допоміг. Клац на англійську, а воно мені - thing. 🤦‍♂️ Отак і роздуплився, що на сучасну мову річ посполитанародна штука.
Трійко рочків тому всередині сайта Касти ми зробили цікаву (для мене) річ — закешували результати збирання товару по всій базі у тій самій базі.

Тобто ідея така: товар розкладений по десятку таблиць, типу там стоки, ціни, інформація про постачальника і таке інше. Зібрати його і потім ще дообробити — це займає доволі багато часу і ще й навантажує базу своїми джойнами. А так ти результати поклав у базу, і фактично по ключу дістаєш вже готові дані. Тільки не забувай оновляти дані!

Але це теж вирішена проблема, за декілька місяців до того переробили оновлення даних у еластіку і вони туди попадають через єдине місце. А там де товар оновлюється, шлються нотифікашки для цього сервісу через кафку. Через те, що для еластіка теж потрібні всі дані про товар, це місце ідеально підходить для того, щоб оновляти той «постійний кеш».

І все було супер, але з часом етап після доставання з дб-кешу (за нестачею гарного терміну) теж почав розростатися, типу всякі більш динамічні штуки важко закешувати надовго. Скажімо, шаблони написання імені товару — рендерінг строки, кльово б закешувати, але чекати день до того, як товари оновляться - наче дуже довго.

Так ми жили аж до минулого тижня, коли вже вкінець задовбало, що в цього апі 99 процентиль - 300 мс під навантаженням. А тепер ми прожили перший день тижня чорної п‘ятниці з 99 процентилем у 130 мс! Непогано, га?

Що ми видумали: вираховувати ці «динамічні» властивості перед дб-кешем плюс брати хеш від конфігу для їх вираховування. А у той момент, коли відбувається виклик апі, порівнювати хеши від конфігів і за необхідності відправляти запит на перекешування товару. І таким чином перенесли важкі операції у асинхронну площину.

> Конфіг у цьому випадку — це типу залежність для прорахунку. Скажімо, хочеш відрендерити ім'я товару — то треба шаблон, значить від нього і будемо хеш рахувати.

А ще, поки з тим колупалися, помітили купу вже нерелевантної роботи — вона мала вигляд наче дуже корисна, та тільки клієнти (у сенсі веб/аппки) нею вже не користувалися. Вирубання цього дало навіть кращі результати, ніж той двуступеневий кеш. :)) Ну як завжди, ггг.

Цікава річ, що запит на перекешування ми поки вимкнули, бо воно генерує ті запити значно швидше, ніж виходить перекешувати товар. :) Треба придумати якийсь дебаунсер відправки з урахуванням того, що апп-серверів багато... хз, може час ключі для топіків кафки заюзати. :)

P.S. А ще ми у п‘ятницю півтори години паршиво працювали, але це еластік винуватий — товари себе відчували мов живі. І це зовсім інша історія. :)
Слухайте шо! Ми з fwdays записали перший подкаст, де я ведучій! ☺️ Тож історія така: вибирати технології насправді дуже важко, їх дуже багато, вони різноманітні, а оцінити плюси і мінуси потребує багато часу. Тож іноді доводиться вгадувати, а у більшості випадків взагалі просто брати щось знайоме, хоч може і неоптимальне.

Як це виглядає: звемо якусь авторитетну людину і обговорюємо з нею технології, вподобання, роздуми на тему і таке інше у пошуках бажаного, але досить міфічного Right Tool For the Job. :-)

Велкам послухати RTFJ #1 з Андрієм Листочкиним! ⚡️
Raycast

Я дуже люблю змінювати ті інструменти, якими користуюся. Воно дає відчуття свіжості і чогось такого цікавого, трохи схоже на те, коли читаєш нову книгу. :) Але чим далі в ліс, тим складніше — звикаєш більше, глибше інтегруються інструменти у звичні процеси, і таке інше.

Я вже доволі давно користуюся такими штуками, як Alfred і Hammerspoon. Alfred — через те, що він швидше, ніж Spotlight, знаходить програму. А Hammerspoon — це така штука для автоматизації макосі, яку скриптуєш на луа, але в мене воно в кінці прийшло до трьох юзкейсів:

• запустити програму шорткатом
• перемістити вікно шорткатом (заміна SizeUp фактично)
• переключити розкладку клавіатури (у парі з Karabiner-Elements)

Але остання штука вже попала в сам Карабінер, тож необхідність у хамерспуні знизилася критично (бо совати вікна і запускати програми будь-який дурень вміє), і я навіть почав думати, чи не купити мені Alfred Powerpack — хоча там конфігурація, яким хоткеем запускати програму, прямо неприємно незручна.

Аж тут на очі попався Raycast. Він вміє майже все те саме, що й Альфред, плюс вішати шорткати на свої команди, плюс має розширення для переміщення вікон, тож я однією штукою заміняю одразу дві, плюс вона нова, плюс можна писати екстеншени на джаваскрипті, а не клацати руками у візуальному конструкторі.

Тіки однієї речі не вистачає — вміння показувати напис великими літерами, те що Альфред по ⌘ ⏎ робить. Чи можна якийсь нормальний екстеншен написати, чи може показати симпатичний напис — це занадто складно для джаваскріпта?.. :)
‍DOU опубліковали інтерв'ю зі мною, так що можна піти подивитися, якщо цікаво. :) Причому вони зробили і текстову версію, але вона дуже скорочена, типу там більше факти, ніж роздуми. Мені здається, що послухати буде цікавіше, ніж почитати. :)

Порозмовляли за різне, наче вийшло прикольно. Більш схоже на розмову за пивом, ніж на зважені відповіді. :)
Мені тут Саша, з яким я у Колоколі колись працював, нагадав смішну історію. Значить, на новорічну ніч 2004 року хтось все одно залишається на роботі, в компанії ж цілодобова підтримка. Там між всіма відбуваються торги за цю ніч і врешті решт залишаємося ми вдвох.

Ну типу свято, тож ми випили шампанського чи що, сидимо чимось займаємося, аж раптом після 12 ночі, вже у прийдешньому році моніторинг піщить що якийсь з сервачків на Леонтовіча помер і не відповідає.

Якихось супертехнологій у нас не було, ми трохи почекали і я відправився дивитися. Я — бо ми по черзі були відповідальні за майдачики колокейшена на Тургеневській та Леонтовича, а ночі проводили на Тургеневській, бо там нормальний офіс був, а на Леонтовіча страшна каморка при гермозоні.

Прийшов, а там ворота в арку зачинені. Перша година ночі, охоронець хз де у себе в будці наврядчи тверезий, а я стою перед зачиненою аркою, намагаюся дізнатися, чи в нас може є телефон того охоронця. Телефону авжеж не було, але я згадав як у давно прочитаній книзі якийсь чувак казав, що головне — просунути голову: якщо вдалося, то сам пролізеш. :)) Ну і я був кілограмів на 20 менший, ніж зараз. :)

Зняв куртку, проліз туди, і пішов собі на сервер дивитися. Приєднав екран, а там скрінсейвер консольний фрі, де демон літає туди-сюди, висить. Бутнув, значить, воно завелось, і пішов собі назад. :)
Давайте трохи за результати Black Friday у Касті розповім. Значить, перший раз, коли ми пережили її у 2016 році, в нас було 2.5k RPS (запитів у секунду) в API, десь 80 тисяч товарів і мінімум серверного рендерінгу.

Цього року близько мільйона товарів, 130 відрендерених сторінок в секунду (більша частина клієнтів — це мобільні аппки, які тільки апі торкаються) і близько 6k RPS.⚡️ Це насправді прикольний результат, враховуючи, що з заліза, де це все живе, в нас реально тільки сервер Постгресу новий (минулий був 15-го року за 10к баксів, а цей 20-го року теж за 10к баксів).

Єдине, що пішло трохи не по плану, так це ElasticSearch — хто б сумнівався, інтроспекції у те, як для нього розраховувати навантаження, дуже мало. В нього є "explain", але його результат ну дуже важко інтерпретувати.

Я дивився у співвідношення LA нод ES і навантаження на сервіс в цілому, і воно виглядало майже пов'язаним лінійно — типу подвоєння RPS подвоює навантаження на ES. Але зранку минулої п'ятниці (19 листопаду, на початку розпродажу) замість трохи підрости, LA злетів у небеса й еластіки почали гальмувати. Це означає що всі списки товарів туплять і людям важко купляти — у сенсі вони просто пішли собі займатися іншими справами. :(

Ми за годину наколупали з 5 додаткових нод еластіку, а за наступний тиждень взяли в оренду ще заліза, щоб побудувати додатковий кластер еластіку і раунд-робіном на них розкинули навантаження. Тож п'ятниця 26-го була нудною. Чого, власне, ми й прагнули. ☺️
Є така штука, як Cloudflare Workers. Це спосіб задеплоїти джаваскрипт на серверах в клаудфлерівські точках присутності. Ну типу AWS Lambda, тільки для тих, хто хоче зробити небагато і швидко. Точно кружляють навколо традиційних авсів і хочуть взяти їх в оточення. :) Але я не про те.

Вони там роблять всілякі хитрощі, типу запуску коду у сендбоксах всередині процесів, що вже працюють, і там напевно всяке інше. Але у результаті є штука, яку легко задеплоїти, яку чаржать за запуск (тому що час виконання обмежений 10 мс) і яка дуже швидко стартує. На відміну від інших "serverless" платформ типу амазонівських лямбд, де запускається цілий окремий процес.

А я хочу таке саме, але для кложі. :) Так, звісно є GraalVM і можна скомпілювати все в бінарь, який буде дуже швидко запускатися і всякі амазон лямбди та й інші гугл клауд фанкшнс тоді будуть з цим нормально працювати, але:

• Компіляція дуже довга, paste.in.ua, який ну дуже простий сервіс — вміє хттп, жсон та маркдаун, а замість БД там файли, бо драйвер к sqlite я не зміг зібрати — компілюється він кілька хвилин, на стандартному варіанті Github Actions — 8 хвилин!
• Компіляція, на жаль, змінює те, що відбувається. Грааль не може зкомпілювати все і приходиться трохи підганяти під нього поведінку. Є загалом прийнятні штуки: відсутність рефлексії, відсутність дій на верхньому рівні неймспейсів (бо вони при компіляції виконуються), але є й речі, які я не можу сформулювати. Просто реально перший раз зібрати все — це купа спроб з пошуками помилок у гуглі й експериментів. Той же самий драйвер бд я так і не зміг зібрати.
• Спало на думку, що до скомпільованого бінарника не приєднатися реплом, але у такому середовищі, як serverless cloud function worker (чи можна ще слово сюди додати? Чи я вже всі хайпові терміни заюзав? :)) — воно не дуже має сенс.

Гаразд! Врешті-решт, жвм стільки років робили та й що, нічого не видумали? Наче SubstrateVM, яка у граалі йде, краще вміє швидко стартувати, але чи треба це? Так важко нагуглити, чесно, відчуття, що я не знаю потрібних слів.

Типу потрібно щось таке, що вміє запускати код у сендбоксі, і при цьому тримати залежності у пам‘яті, щоб запуск того коду був швидким. Так?
Вранці звернув увагу на закінчення книжечки про Колобка і досі думаю про нього. Я розумію, що видавець намагався скоротити казочку, щоб вона влізла у маленький формат, але ж яка жиза! Лисичка — як правильний злодій у фільмі, замість бла-бла-бла просто зохавала малого та й все.

Вважаю, що тепер сенс не у тому, що життя повне небезпеки та не треба збігати від мами й тата. Сенс в тому, що коли ти щось хочеш зробити — то роби це.

Сильна така тепер книга. 😁
Зараз показувати Дію з сертифікатом вакцінації треба наліво і направо. А вона така вся ще відкривається годинами, а ти у масці й або топчи свій код, або знімай маску — бо айфони ж так і не зробили тач-айді в екрані, і взагалі, експірієнс не з кращих.

Чи це життя взагалі?! Якісь люди з Чехії подумали так само і зробили сайт, якій вміє з QR-коду сгенерувати файлик для Wallet'у. Скануєш QR-код сертифікату, або завантажуєш його скриншот, і отримуєш pkpass. Відкрив — і тепер за подвійним натисканням на бокову кнопку ховається той сертифікат.

Не треба розблокувати айфон, шукати потім дію, чекати поки її швидкісні сервери дадуть відповідь, чекати розблокування (чи навпаки?)... Все локально сидить в айфоні.

Воно там всередині каже, що буде працювати аж до моменту закінчення придатності. Доволі логічно, але дати закічення придатності я щось не знайшов. Ну хз, подивимося. :)
Коли конспірологи десь раптово вискакують в офлайні (тому що в онлайні я їх просто ігнорую), головною відмазкою від їх домагань працює історія про «якби ти колись намагався щось організувати, не думав би про реальність таких масштабних секретних змов». :)

Але трафік на дорозі... це хоч і не аргумент у протилежний бік, але це така фантастична штука, насправді. Це те, що наочно демонструє, що більша частина людей мають добрі наміри та готові співпрацювати. Небезпека неіллюзорна, здоровезні металеві дурепи, вбити когось — ізі-пізі!

Іноді, буває, познайомишся з людиною, і вона наче не дуже приємна і взагалі є питання щодо адекватності — але ж якось їздить по дорогах і не лупиться кожен день. І навіть коли хтось дурнею мається — на це звертаєш увагу, бо це не типово, більшість людей нормально їздить.

Значит, попри купу самоіронії, порівняння з усілякими мурахами та бджілками, і таке інше, людство — доволі круте. :)
Пару тижнів тому Марцин написав пост, про те, як він переписав asciinema-player з ClojureScript на Rust + WASM. В результаті в нього бандл став у 4 рази менший і швидкість виросла у 50 разів.

Це дуже крутий результат! Але дуже цікаво чому, і чи не має тут історії про те, що не треба використовувати CLJS взагалі? 😁

Давайте розберемось. По-перше, одним з головних компонентів є емулятор терміналу, який він заново написав на расті — vt-rs. Це біля 2 тисяч строк коду відносно тисячі строк у vt-clj, але! Це ж взагалі найкращий юзкейс для мов з мутабельностю даних.

А у vt-clj відбувається неподобство, зі здоровезних масивів даних (ну як здоровезних, width*height терміналу, ггг) генерувалися нові такі самі — думаю, що GC браузерів просто захлинався від такого нахабства. Тут навіть structural sharing занадто багато не допоможе. У цьому місці йому б треба було взяти ArrayBuffer, і перестати мучити худобу. :)) Але! Треба сказати, що я приємно здивований кількістю кода на расті, і пов'язую це з тим, що йому вже не прийшлося експериментувати з імплементацією, як у кложі.

Інша велика зміна, яку він зробив — проміняв ReactJS на SolidJS. Каже, що набагато швидше, ніж реакт. Може, я не дуже в темі. Але що він робив до цього - використовував Reagent. Це дуже ергономічний і дуже неефективний врапер навколо реакту. Найбільша його проблема — він не компілює хікап ([:div "smth"]) у виклики реакту, і робить це у рантаймі.

Мені чомусь здається, що виправлення цих двох вже провело б його більшою частиною дороги у 50х. Авжеж, різниця була б меншою, але й часу пішло б менше. :) Але пацан вже забодався воювати, плюс експеримент вийшов вдалий, а feature surface не дуже великий — тому можна перероблювати на швидшу мову з більшим ефортом.

Взагалі, виглядає, як найкращий кейс зі "зробив експеримент — працює, але інструменти не підходять — переробив на щось більш вдале". Нажаль, він у пості нічого не каже за те, чи був сенс взагалі робити спочатку на CLJS, було б цікаво його думки з того приводу почути — особливо через якийсь час, коли вже наловить багів у тому, що є зараз. :)
Clojure — паразит

Позаминулої суботи ми записували новий випуск подкасту (spoiler alert!) з Ромою Лютіковим і прийшли до несподіваного визначення: Clojure — це паразит. Причому паразит у квадраті! От дивіться.

По-перше, в кложі немає своє платформи, так? Вона працює або на JVM, або на .NET, або на JS, або он там на підході ClojureDart, щоби Flutter можна було нормальною мовою писати. Це ж одна з основних ціннісних пропозицій кложі!

Але є й інший шар: кложа паразитує на інших мовах як на ресурсі для постачання розробників. У сенсі якщо кложа виявиться першою мовою, ти будеш цінити її плюси точно так само, як новачки-програмісти цінують плюси мови, на якій пишуть — треба сприймати на віру, бо у власному досвіді порівняти поки що ні з чим. Але не випадково вік програмістів на кложі значно вище середньго — майже ні в кого вона не є першою мовою. Люди приходять за класним інструментом для розв'язання задач вже після того, як намаються з іншими.

Тому менше новачків, тому вище середній рівень розробників і тому краще середній рівень проєктів (скажімо, опенсорсних бібліотек).
Знаєте, чому я вирішив робити подкаст з fwdays, а не сам? Тому що з жовтня по зараз я записав ровно 0 відео сам, але ось вже готовий другий випуск подкасту RTFJ. :) Спасибі вдалій мотивації від Даші, і цікавій розмові з Ромою Лютіковим.

Рома зараз відповідає за перформанс у Pitch (дуже кльовий інструмент, щоб робити презентації, до речі), тож натурально ми порозмовляли і про перформанс, і про кложу (бо Пітч написаний на кложі), і про всяке інше — думаю що немає сенсу повторяти все, що в описі написано.

Тож дивіться, відправляйте лінки друзям, і дуже чекаю фідбеку, як вам новий випуск. :)

P.S. До речі, він є і на подкаст-платформах:
SoundCloud 👉 bit.ly/3yvKmCo
Apple Podcasts 👉 apple.co/3EZZTwQ
Google Podcasts 👉 bit.ly/3F8lfs0
Поки всі завзято обговорюють log4j, тут виліз новий експлоіт для айфону, набагато цікавіший: якщо трабли з лог4ж це звичайний відстій, таке постійно з компами трапляється, то цей айфонний просто краса. :) Якщо ви ще не в темі, то читайте!

Значить історія: приходить повідомлення iMessage, від якогось номера, просто картиночка. Ти відкриваєш подивитися, що там, а воно... iMessage, щоб показати картинку, викликає метод copyGifFromPath:toDestinationPath:.

Воно зветься «копі», а під капотом рендерить гіфку у пункті призначення. Тобто декодує початковий файл і створює нову гіфку замість просто копіювання байтів.

І прочитати воно може не тільки гіфки, а купу різних форматів. І один з них — це пдф. Пдф прикольний тим, що взагалі пишеться на майже тьюрінг-повній мові, але за багато років там наставили достатньо вже обмежень. Але! Код, який використовується у iOS - це код Xpdf, написанний у 80-х роках, і виглядає так, що там багато цікавого. :)

Наприклад, є там всередині реалізація формату картинок під назвою JBIG2. Це такий спеціальний формат, який дуже добре стискає чорно-білі картинки, у головному зі сканерів і ксероксів — раніше канали і сховища були скромніші і треба було економити. І ефективний він через те, що блоки зображення кодуються хитрим чином з використанням логічних операцій - and, or, xor, nor.

Потім чік-чік, невеличке переповнення буферу, замість крешу коррумпування початкової картинки і раптово ці операції можна виконувати над (майже) будь-якою коміркою пам‘яті.

І далі найкраще. За допомогою 70 000 операцій чуваки зробили віртуальний комп‘ютер, який вміє ходити по пам‘яті телефону і читати все, що завгодно. Ну як ото люди у майнкрафті роблять, тільки у айфоні. :)

Фантастично елегантний хак, просто капець. Не те шо та дитяча підстановка у лог для же. :)

Епл це пофіксила ще у вересні, але NSO явно юзали його на початку року. NSO - це автори експлоіту, ізраїльська контора, яка допомагає урядам слідкувати за громадянами. Вікіпедія каже, що вони відіграли якусь роль у вбивстві Джамаля Хашогджі. :( Елегантно, але все інше як завжди...
Сьогодні чи не найкращі умови в Буковелі, які я бачив. Мінус 2, вночі насніжило, людей зранку взагалі немає — кайф просто. Прийшли на відкриття підйомника і проїхалися по свіжому снігу, ммм...

Взагалі шось в ресурсі, зійшлися умови з настроєм, і лижі взяли у прокаті непогані — бо власні черевики то важливо, а лижі... ліньки всюди таскати. :) Катаємося що дурні, 60 км нагасали за день, хаха.

Буковель може не найкращий лижний курорт у світі, але він як зручні капці, особливо коли люди ще не наїхали. :)
Є така річ, як веб-аналітика: зберігаємо інфу про те, що робить користувач, у БД, а потім можемо дивитись на те і щось собі вирішувати. БД — це Google Analytics, чи Firebase, чи, у нашому випадку, власне сховище.

Скажімо, користувач щось додав у кошик? Відправимо подію «кошик». Перейшов на оформлення - «чекаут», зробив замовлення - «ордер».

І з цим «ордером» є цікавий момент. Річ у тому, що реально завершення замовлення відбувається у різні моментуиу залежності від того, який спосіб оплати ти обрав: чи то кеш, чи картка, чи кредит. Тож коли ми робили свою аналітику, я чомусь психанув і зробив так, що ця подія відправляється не з клієнтів, як зазвичай, а з бекенду. Для того у замовленні зберігаються всі потрібні додаткові дані, і при настанні умови «отут ми вважаємо замовлення живим», відправляється ця подія.

Я встиг пару разів пожалкувати, що так зробив, бо воно дуже неочікувано для всіх, хто перший раз там колупається... але ж мала і нагорода колись прийти?!

Прилітає баг від аналітиків: близько 20% замовлення карткою з аппок (айос/андроїд) не попадають в аналітику Firebase. У нашій аналітиці тим часом все файно... 🤔 Трохи деталей: в наших апках є кілька різних аналітик (бо в них різні використання і іноді дуже важко це змінити), і всі вони отримують події виключно з апки.

А подія у файрбейз коли відправляється? Ну вірно, коли користувач повертається з оплати карткою, яка у вебв‘ю. Тобто ідеш платити, вносиш дані картки, якийсь може 3д-сек’юр, і ось тоді вже... ач тільки KastaPay показує своє «дякую за оплату», і користувач, вдоволений вдалою справою, закриває апку і йде по своїм справам. Ніколи не потрапляючи в апці на сторінку, де відправиться та подія. 😬

Цю тему вже виправляємо, але приємно, що наша власна аналітика нічого не губила. 👌
Знаєте, що таке Follow Focus? Це така система наведення фокусу для знімання відео, коли оператор знімає кадр, а фокус йому наводить асистент, Focus Puller.

Автофокус всі серйозні фільмування не використовують — бо якщо на фотках виходить результат роботи автофокуса, на відео буде процес його роботи, і це не найприємніша для ока людини ситуація. Буде ламати четверту стіну. :)

Але тут DJI (так, той, що коптери робить) показав нову, дуже інноваційну камеру - Ronin 4D. Це повноцінна камера зі змінними об‘єктивами, вбудована у стабілізатор (gimbal), з окремим дісплеєм.

Тєма: ти тримаєшся за дві ручки, а під правим великим пальцем колесо для фокуса. А додатково зверху на камері - LIDAR. І на моніторі зверху на картинці (вочевидь двомірній) показується карта глибин того, чого ти знімаєш.

От подивіться тут трохи, це просто фантастика. Там є й інші цікаві рішення (як от змінний байонет, безпровідний монітор), але це — найцікавіше.

Воно все трошки недешево коштує, понад 7 тисяч, але за хайтек треба платити. Файний девайс. :)