Bite the Byte
2.58K subscribers
24 photos
1 video
231 links
Download Telegram
Кілька років тому я подивився офігезний доклад Гіла Тене (це CTO Azul Systems, виробника кастомного і крутого JVM) про затримку — latency — зі StrangeLoop. Ця розповідь трішечки відкрила мені очі на те, що дуже велика кількість показників, які ми дивимось на роботі, це ті ж самі лаги з кваки. :) І коли тебе бісить те, що через нестабільний пінг ти з рельси не можеш попасти в жодну скакучу ціль, то це те ж саме відчуття, коли ти висиш на лінії в колл-центрі, або чекаєш, коли ж там вже посилочка приїде.

І одна частина цієї розповіді була про те, що на перший погляд здається, що 50 перцентиль затримки - це те, що відчувають 50% твоїх клієнтів, а 95 перцентиль - це те, що відчувають (негативно) 5% твоїх клієнтів. Але це зовсім не так! Якщо в нас поганий 95 перцентиль, то це значить, що з кожних ста запитів до сервера 5 будуть поганими. І якщо сесія клієнта складається з 20 запитів до сервера, то статистично всі клієнти відчують повільний сервіс.

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

Тригернуло мене це написати сьогоднішне обговорення. Виявився інтересний факт: швидкість привезення наших (Касти) товарів людям не впливає на їхню лояльність до нас. Тобто чи це день-в-день, чи 5 днів - у всіх цих груп лояльність практично однакова. Але чому?! Здавалося б, коли ми тобі привозимо день-в-день, ти повинен бути щасливий и постійно в нас замовляти, так?

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

Отак чувак, який займається розробкою віртуальної машини з дуже низькими затримками, допомагає нам розібратися у поведінці нормальних покупців. :) Якщо комусь недостатньо подробиць, то ось сама його розповідь: https://www.youtube.com/watch?v=lJ8ydIuPFeU
В деяких банкоматах Аваля є NFC, куди можна прикладати картку, замість того, щоб сувати її всередину. Ці панельки я вже давно бачив, однак минулого року вони запрацювали.

І тіки що був біля банкомату і до мене дішла проста істина: спробував телефон туди тицьнути і так і є, воно працює! :)

Ото вже прогрес, тепер можна ті картки взагалі не носити, кайф!

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

Ну тож маємо апку на React Native, написану людьми, які вже не працюють в нас. Вона ще з півроку тому точно на якомусь з телефонів працювала, але зараз щось немає і apk теж кудись загубилася. Погана новина - вона типу не збирається. Всі зайняті так, що немає слів, тож я трішки пороздвигав зустрічі і зайнявся тим сам. Засетапив середу для розробки, скомпілював в емулятор, воно запускається, показує сплеш і відбувається одразу дві цікаві речі: мій ноут починає ревіти кулерами як той морж, а апка через дві хвилини крешиться, так і не показавши нічого, окрім сплеша.

Ну ок, дістав я справжній Андроїд, хоч ноут не реве. Але в adb logcat все пусто, ніякі дебагери не коннектяться, щось там якихось тулз познаходив і одна каже "я так не вмію, це надто старий реакт". Дивлюся — так і є, з 2018 ніяких апдейтів, 0.58. Добре, думаю, давай я тебе на останній хлам оновлю, підуть якись помилки компіляції, якось воно буде.

Так і сталося, і я навіть був готовий, що в мене буде пригорати, але це можна йобу датися, насправді. Мало того, що в самого React Native такий churn коду та апі. Це я через три релізи реакти стрибнув і воно оре що те не те і то не так. Так щє й змінилися всі плагіни для Babel'я. А без нього ніяк. React Native - на Flow, треба компіляти. Половина бібліотек на тайпскрипті некомпільовані і ти повинен компіляти сам. Але й вся апка написана з синтаксисом, який якби ще не стандартний для жс-двигуна всередині реакту. Тобто щє якийсь плагін.

І ось оце все гівно починає конфліктувати і я півдня вбив на те щоб зрозуміти, що треба пресет (неважливо що це) в бабеля розкуркулити на плагіни (теж неважливо), щоб я міг ці плагіни між собою відсортувати.

А потім починається, кожна ліба не вміє новий реакт, тож оновлюй і їх. І кожна ліба — це найспеціальніша у світі квітка, яка вважає, що окрім неї нічого не буває. Тож вони одне й те саме то перейменують, то переміщають між різними модулями, а в мене один хєр undefined is not a function, can't access variable of undefined. Хто тут андефайнед, підійміть руки?! Як тебе скотиняко знайти серед модуля на кілька сотень рядків?!!

Карочі, я цю гідру замочив і сиджу зара такий, ніндзею себе відчуваю - пішов у чужий замок, всіх прибив, принцесу забрав і зробив з нею те шо хтів.

Але ж не повинно так бути, якого біса воно таке все крихке? В мене тепер чітке відчуття, що ми зі своїм фронтом на ClojureScript'і як в якомусь інкубаторі сидимо...

А як в вас життя, нічого за останній час не нападало? :)
Вчора з Ромою Лютіковим та Єгором Львівським у рамках конфи React Fwdays обговорювали, чи потрібен реакт, і як бути з тим, що він усюди (посилання не даю, бо воно за пейволом). А ще за тиждень до того мали схожу розмову у Клабхаузі.

І по питанням і коментарям що там, що там, мені стало зрозуміло, що одного поста і вересневого виступу недостатньо, щоб пояснити, що ми робимо з Кастою, і чому це насправді не повна маячня. :)

Тож у наступний четвер, 1 квітня, о 19 годині за Києвом, приходьте послухати, чому ми викидуємо React, та що буде замість нього (спойлер: TwinSpark, але ви напевно і так це знали). УВАГА: все це зовсім не жарт!

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

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

Посилання на відео: https://www.youtube.com/watch?v=uNF7QmFiQaw
Вирішив якось що мені для мікрофона вкрай потрібен жовтий кабель — це я ще Worker Bee користвувався, тож дуже підходило за кольором. А все шо є в магазах та всяких промах виключно сумних кольорів.

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

І ось приходить нотіфікашка, що кабель їде, а паралельно в месенджер олх з 15 фоток подібного змісту, і з вимірами ємності, etc...

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

Осьо він, якщо вдруг знадобиться (не реклама, я просто вражений максимально): https://instagram.com/goodcable
Знаєте шо? Не дивлячись на таке западло зі сторони погоди, я все одно зроблю стрім, бо точність — це ввічливість, стабільність — це культурність, фідошніки сабжів не міняють... це мене кудись понесло. Просто вибір вечора чогось складний для мене, не дивлячись на карантін, тож плюйте у те вікно і приходьте о сьомій послухати і потім прийняти участь у срачі^Wдискусії.

Ось тут: https://www.youtube.com/watch?v=uNF7QmFiQaw
Те, що у програмуванні все на соплях тримається — звично всім, хоча й дратує трішки. Люди, буває, собі програми на Хаскелі пишуть, щоб гарантувати, що воно працює, типизація там, все інше — а потім воно виходить у реальний світ, йому приходять реальні дані, і всі гарантії розвалюються, тому що хтось той JSON збирає в 1С і забуває екранувати лапки у строках.

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

Але увесь цей стрімінговий сетап, особливо якщо використовувати опенсорсні/безкоштовні рішення, типу OBS та obs.ninja, Streamlabs, і таке інше, воно взагалі дуже складне, незрозуміле і ламається так хитро, що в мене опускаються руки. Ну тобто вчора в Роми, якого я підключив через ніндзю, дублювався звук мікрофона із затримкою (тобто відлуння). Чому - хоч вбийте, я не знаю. Взагалі те, як я ловив його звук - це смішно, і я навіть не хочу писати сюди подробиці, тому що йшов він зовсім не разом з відео (ррррррр). Хочеться якогось рішення простіше. :))

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

Хух, наче пару випустив, можна піти підкинути кілька разів малу, чи ще щось продуктивне зробити. 😁
Хочу розповісти пригоду сьогоднішню. :) Ви мабуть бачили по всьому місту веліки BikeNow — їх реально розставили всюди, і мені було дуже цікаво спробувати, які вони. А сьогодні поїхали зі Степаном покататися у парк Пушкіна, і там декілька стояло на вході, тож ось і видалась нагода. Велосипед, як суто міський, дуже непоганий. Єдиний мінус — це його вага, але ж він зроблен з товстезної сталі, щоби витримати всі негаразди свого важкого життя. :)

Але це не пригода. Пригода те, що в кінці я його припаркував, закинув Степанів у багажник і ми поїхали додому. А через чотири години я згадав, що я його просто поставив на підножку, навіть замок не зачинив. Ну, думаю, капець... Почитав хелп: якщо не здаси впродовж 12 годин, то штраф 10к, а якщо впродовж 24, то це вважається крадіжкою і коштує 15к. Не знаю, чи додатково, мені що так, що так не подобається.

Подзвонив у сапорт і він каже, що якби я на замок закрив, то він міг би й завершити мою оренду, а так треба спасати. А велосипед вже не біля парку, а на Смоленській, навпроти будівлі Інкому. Ну мені тут кілька кварталів, тож я стрибнув у машину і поїхав його закривати. :) Якийсь поц його знайшов (як? ходить і мацає всі велосипеди?), покатався, і навіть на підніжку не поставив, так, опер на якийсь паркан. Я його відвіз у зону парковки (до проспекту Перемоги), та й залишив.

Мені за таку свідому поведінку ще й скинули увесь той "накатаний" час до години, тобто 35 грн замість 160 — теж не смертельна сума, але приємно. Взагалі і сам сервіс сподобався, і сапорт добре працює, але ж якихось нагадувань не вистачає, бо це ж яким уважним треба бути, щоб не провтикувати. :)
Перекладення інтерфейсу програм історично робилося за допомогою функцій, якій ти даєш на вхід ключ (скажімо, 3232 чи index-page.welcome-banner), а вони під час роботи програми йдуть у словничок (напевно, в якийсь файл, що лежить рядом), і беруть справжню строку (типу Привіт, %s) — у яку потім щє підставляють змінні.

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

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

Висновок: переїжджайте на геттекст, якщо ви ще ні, досить з підходами 80-х жити. :)
Macbook Air M1

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

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

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

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

Тепер в мене CLJS білд збирається не 9.5, а 6.3 секунди. Але це покращення в 30% не дає реального розуміння, наскільки швидше працює інтерфейс. Я такий довольний, шо капець, ггг. Тепер під час стрімів не буде мені волати у вухо і підпалювати пальці. :)
Рік тому написав я пост про те, як перемикаю різні розкладки клавіатури. Років 15 тому я користувався капслоком, який клацав між англ та рос розкладками. Українська у такому випадку, вочевидь, страждала. А кілька років тому я відкрив для себе Karabiner, і зараз по натисканню лівого команда вмикається англійська, правого - російська, а правого альту - українська.

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

Вочевидь, можна було і не писати цього, кому треба — міг би піти пост почитати. :) Але ж більшість з вас або не читала, або не занепокоїлася достатньо, а це ж кожень день приходиться сотні разів дивитися на те, яка зара мова увімкнена, щоб знати, куди перемкнути. Ну просто ідеальне місце щоб задешево трішечки покращити життя. :)
Написав статтю місяць тому і забув опублікувати, це капець. :) Кароч історія в тому, що показування HTML'ю користувачу після того, як він нажав кнопку "назад" - це не дуже тривіальна операція. З реактом історія була у тому, щоб заново відрендерити йому те, на що урл вказує, а без реакту... без реакту можна або зберігати верстку десь, або заново ходити на сервер. Друге робить HTMx, а перше робить TwinSpark: https://solovyov.net/blog/2021/history-snapshotting-in-twinspark-js/
Ось обговорювали с Вовою, чому ж Дія Сіті — це погано. Мої думки про це ось такі:

1) Інженерно вони дуже слабкі. Дія, як аппка, дуже погано працює: то є там мої права, то немає, тупо час від часу як повезе. Розлогінює часто.
2) Продуктовий віжн в них поганий. Він може і сильний, але поганий, тому що роблять вони централізованний реєстр документів, який дуже вразливий до корупції та кібер-атак. Нам, як країні, треба навпаки. От ID-картки в цілому у вірному напрямку рухалися, а єдиний реєстр — це дуже-дуже погано. Якщо хочете дізнатися наочно чому — подивіться на ютубі розслідування Навального про те, хто його травив.
3) Менеджмент в них дуже поганий. На надзвичайно тупу і надзвичайно небезпечну дірку вони відреагували максимально тупо: мовчанням. Це просто неприпустимо для будь-якої публічної компанії, я вже не кажу про державі установи.
4) Все, що робиться за кошти громадян для країни, повинно робитись з відкритим кодом з відкритою ліцензією. Тому що, по-перше, це наш софт, ми за нього заплатили, і не треба його від нас ховати. По-друге, це справа національної безпеки: мати не security through obscurity, а публічний контроль цієї самої безпечності ПО.

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