✙rozho)))k✙🇺🇦


Kanal geosi va tili: Ukraina, Ukraincha


Про автора: www.rozhkov.me/about
Про канал: www.rozhkov.me/about-full-of-hatred
Канал про все що не ІТ: @daily_rozhok
дірект: @xrozhokx
блог: rozhkov.me

Связанные каналы  |  Похожие каналы

Kanal geosi va tili
Ukraina, Ukraincha
Statistika
Postlar filtri


Підсумки 2024 😑

🤝Величезна подяка людям які підтримували збори та допомагали мені.

💸Дякую всім підписникам які залишились з @Donate1024Bot.

Багато чому навчився, десь потерпів, десь разом з колегами наробив суєти. Живий здоровий як польський цвєх квадратовий, а це у нашому ділі головне.

🫡Цього року загинуло декілька бійців, з ким я був знайомий особисто та ділив побут. Честь.

🥳Зібрав бінго — день народження, Різдво та новий рік зустрічатиму на підвалі чергуванні.

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

🥹Дякую всім читачкам та читачам які залишаються зі мною.

🎄Щасливого Нового Року та веселих свят!🎄

#війна
permalink | @full_of_hatred
👇Щоденні донати💰на ЗСУ🪖
🫡@Donate1024Bot


Втомився боротися з лінтерами

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

На всіх своїх проєктах я використовую статичний аналізатор коду RuboCop. За замовчуванням він досить затягнутий, і я трохи попустив правила.

Врешті за стільки років користування я помітив що він мені більше не допомагає, а заважає.

Бо методів які збирають докупи великий реквест у мене багато. Бо рядків більше за 140 символів у мене теж трохи є.

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

😤Одним словом, я втомився вимикати інспекції інлайново, та ультанув:

Metrics/ClassLength:
Enabled: false

Metrics/AbcSize:
Enabled: false

Layout/LineLength:
Enabled: false

Metrics/MethodLength:
Enabled: false

Нарешті можна розслабитись та писати весь код в одному файлі😌

#інструменти
permalink | @full_of_hatred
👇Щоденні донати💰на ЗСУ🪖
🫡@Donate1024Bot


Телеграм-бот для скриншотів bluesky

Доробив свого бота який робить скріншоти твітів, щоб підтримував також скриншоти з bluesky.

Прикольно що в мікроархітектурі сервісу скриншотів, тобто враперу селеніуму, я подумав про майбутнє та зробив API яке приймає url та css-селектор. Тому сам врапер переписувати не потрібно було, а лише додати в телеграм-бот регексп який дістає посилання на bsky.

Як і у твітері, в Bluesky розробники зробили спеціальний HTML-атрибут який видає div з власне постом. Єдиний нюанс — в твітері цей атрибут завджи однаковий, а в Bluesky унікальний для кожного користувача та має формат data-testid="postThreadItem-by-#{bsky_profile}", наприклад data-testid="postThreadItem-by-maxua.com". Тому довелося додатково ще парсити й це.

Можна було б рендерити пост самостійно, ATProto дозволяє це зробити, але набагато простіше дописати кілька рядків коду😅

Бот — @chat_keeper_bot. Ви можете додати собі його в будь-який чат, і він теж буде працювати.

#проєкти
permalink | @full_of_hatred
👇Щоденні донати💰на ЗСУ🪖
🫡@Donate1024Bot


Як зробити, щоб http://localhost:8080 було видно в інтернет

🎄Всіх з Різдвом!🎄

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

Розумні люди придумали для цього тунелі. Ви підключаєтесь до машини в інтернеті та створюєте тунель. Машина відкриває 443 порт та проксує всі запити на ваш комп'ютер.

Та ж машина в інтернеті може подбати про доменне їм'я та SSL-сертифікати, щоб гугол не сварився на ваш http://localhost.

Якщо ви раптом ще не використовуєте в роботі такі інструменти то я наполегливо раджу спробувати.

Найпопулярнішою тулзою раніше був ngrok. Пишеш у терміналі щось типу ngrok http http://localhost:8080 і він відкривав тунель, створював вам домен виду randomstring.ngrok.io та підіймав вебсторінку з логом запитів. Дуже зручно.

Звісно гроші за щось треба брати, тому у безплатній версії з кожним перезапуском апки або по таймауту в декілька годин домен змінювався. Дуже незручно, наприклад щоб тестити oauth доводилося постійно змінювати callback url.

За гроші всі проблеми вирішувалися, але хіба ми не програмісти, щоб витрачати 5$ на таку просту задачу?

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

Ось мені знову знадобилося затестити телеграм бота, і я вже зібрався запустити ngrok, але він кудись пропав з лептопу. А може його там взагалі не було.

Тому я згадав про вищезазначений список та подивився що там є. А там першим пунктом йде рекомендація Cloudflare Tunnel. Ставиш собі в систему бінарник, реєструєш ключик, створюєш в адмінці тунель, даєш йому домен і все працює!

Повністю безкоштовно, без дурних обмежень. Звісно лог запитів не такий зручний як в ngrok, але все ж.

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

#інструменти
permalink | @full_of_hatred
👇Щоденні донати💰на ЗСУ🪖
🫡@Donate1024Bot


Купив новий смартфон

У виборі техніки я максимально консервативний. «Працює — не чіпай». Я не страждаю ADHD тому телефони та екрани не розбиваю, не топлю та не ламаю. З 2003 року, коли отримав перший телефон, я міняв їх тільки з причини застарівання. Приблизно 1 раз на 4-5 років.

Перший смартфон я купив у 2013. Це був Jiayu G4S, на той момент «конкурент флагманам». Він служив мені вірою і правдою, але нездала робота тачскріну в дощ, низька точність GPS, а невдовзі й недостатня потужність процесора для нових апок, які ставали все повільнішими, поставили мене перед питанням вибору нового смартфону.

Мій товариш тоді якраз купив OnePlus 3 і нахвалював його.

Тому взимку 2018 року пішов у магазин «Кокос» де купив OnePlus 3T — на той момент вже не конкурент флагманам, але все ще достойний апарат. Все з ним було добре — і 3.5 джек, і фізична кнопка, і потужність. Звісно, з часом апки ставали працювати все повільніше. Я не бачу які цьому можуть бути об'єктивні причини. Пошта як показувала пошту, так і показує, галерея — фото, а мапи — мапи. Чому ж з часом все починає псуватися?

На війні у тебе немає часу чекати поки телефон з 6 гігабайтами пам'яті роздуплиться та перемкнеться з сігналу на мапи, тому я прийняв рішення про заміну.

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

Тому я потицяв туди-сюди та й зупинився на OnePlus 11. На OLX швиденько був знайдений та придбаний «біток з америки» за помірний прайс (17 000 грн).

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

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

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

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

Велика перевага OnePlus — це пропрієтарний формат зарядки, комплектна має потужність 100 Вт, та повністю заряджає телефон за пів години.

Абсолютно незрозуміла для мене річ в андроїдофонах — це бажання «оптимізувати» всі програми підряд. Дійсно, нафіга мені отримувати пуш нотифікації від месенджерів та інших апок якщо їх можна не отримувати? Ми напихаємо в телефон купу пам'яті, ставимо потужний процесор та GPU, щоб потім нічого на ньому не запускати, бо о Б-же, сідає батарея!

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

Туди ж т.зв. Sleep Time Optimization, це телефон вночі все вимикає ну бо ти спиш, нема шо комусь тебе турбувати. Ох телефон, як би я хотів, щоб воно так і було насправді😓

Пишіть чому мені треба було купити айфон в коментарях👇

#інструменти
permalink | @full_of_hatred
👇Щоденні донати💰на ЗСУ🪖
🫡@Donate1024Bot


wtf is corepack?

Я регулярно оновлюю всі залежності всіх проєктів на найновіші. Оскільки в мене в основному Rails та Java то це тривіальні процедури: оновити версію рубі на найновішу що вийшла, а потім зробити bundle update. Жодна з версій залежностей в мене не залочена, тому я постійно живу на всьому останньому. В Java трішки складніше, там версії лочаться, тому треба піти й перевірити що зараз останнє, бо автокомпліт IntelliJ щось перестав працювати.

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

Ось я вирішив оновити докерфайл проєкту, бо колись давно виникла проблема з alpine та однією з версій рубі, щось там крашилось, довелося змінити базовий імедж на debian-slim. Разом зі зміною я втратив jemalloc, але тоді це було не таким критичним.

Отже, я вирішив повернути все назад. Для rails є гем (бібліотека), який генерує докерфайл, вже оптимізований, з шарами та усякими оптимізаціями щодо розміру імеджу на виході. Запустив-перегенерив.

Звернув увагу що у мене не змінилась версія yarn. Хто пам'ятає — це така альтернатива npm яку написали у фейсбуці коли npm був ще неоптимальним. З якоїсь причини це є дефолтний пакетний менеджер js-залежностей в Rails. І от я дивлюся що він у мене версії типу 1.22.11 чи щось таке. Дивно, думаю, йду на офіційний сайт, а там пише що вже є 4.x.x. Дивлюся як його оновити, а там corepack enable⁣, а потім yarn set version stable та yarn install. WTF? Читаю далі, а виявляється що «we don't tell you to run npm install -g yarn to install Yarn - we even recommend against it».

Короче в джаваскрипті придумали якусь штуку що зветься corepack і тепер треба робити через неї. Також, вже досить давно додали npx, але я не розумію чим це відрізняється від npm.

Все як завжди. Поки в джаві нічого не змінюється вже 10, а то й більше років і ти як запускав ./gradlew build, так і запускаєш, поки в рубі ти як робив bundle install, так і робиш, джаваскріптери знову видумують щось нове.

Ну гаразд, ще можна відзначити python, де vc-backed контора написала заміну pip, pyenv, virtualenv, poetry, setuptools та ще бозна-чому на расті — uv. Зараз вона на хайпі, всі пісяють кіпятком крім ортодоскальних пітоністів які незадоволені тим що пакетний менеджер пітона написаний не на пітоні.

І це я ще не торкався теми фронтенду! Бо я так розумію що вебпак уже давно потьмянів, і новий shiny object фронтендерів це Vite. То я ще не згадую про rollup (?), parcel(??) та esbuild (???) які можна використовувати для збірок фронтенду.

Зовсім забув про Bun та Deno! Що це, кому, навіщо?

Одним словом, джаваскріптова екосистема як була клоун фієстою 10 год тому, так такою й залишилась і навіть стала гірше.

В чому причина? Популярність платформи? Ну так подивіться на джаву або на PHP — там такої шляпи немає. Новизна? Камон, 10 год уже SPA-непотріб впевнено крокує по куцим просторам 8 гігабайт вашого макбуку а ви так і не можете визначитися чим ставити пакети.

🤦‍♂️

#спостереження
permalink | @full_of_hatred
👇Щоденні донати💰на ЗСУ🪖
🫡@Donate1024Bot

2.4k 0 16 115 92

Страхи збуваються

Телеграм-бот @Donate1024Bot щоранку розсилає всім підписникам новий збір. Щоб уникнути випадкового подвійного спрацювання, цикл розсилки схований всередину select for update.

Коли робив інтеграцію з Bluesky, то додав код, який також публікує збір у Bluesky. Звичайно, я не перевіряв E2E виклик, і просто скопіпастив рядок з реплу. Виглядало це якось так:

Lock.find_by(key: "daily_post").with_lock do
random_post = Post.random_post

TgUser.pluck(:tg_id).each do |tg_id|
SendDailyPostToUserJob.perform_later(tg_id, random_post.id)
end
random_post.update(posted_count: random_post.posted_count + 1)
SendDailyPostToBskyJob.perform_later(post_id)
end

Запушив код опівночі та й ліг спати.

І звичайно що я побачив наступного ранку? Вірно, 6 однакових постів у себе.

Справдився мій найбільший страх — зациклити відправку однакових повідомлень клієнтам.

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

Уважний читач звісно помітить тривіальну помилку.

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

Добре що я помітив це достатньо швидко та мав можливість виправити, погано що недостатньо швидко і всім таки прийшло шість однакових повідомлень.

Ймовірно через це декілька людей відписались та не задонатили гроші, і тепер сума зборів впала на 3-5 тисяч гривень😔

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

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

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

P.P.S.: можете порадувати ріжка та підписатися на бот @Donate1024Bot і донатити щоденно хоча б по сотні гривень — то вже буде досить потужно🥺

update: після того, як я написав пост, натрапив на таку штуку в Rails як запуск джоб після коміту транзакції🤯. Хтось уже не раз зіткнувся з проблемою як у мене і написав для неї коробочне рішення. Читайте доки!

#donate1024 #кулсторі
permalink | @full_of_hatred
👇Щоденні донати💰на ЗСУ🪖
🫡@Donate1024Bot


☝️Нагадую вам про регулярне зарплатне опитування ДОУ.
Цього разу додали опцію для тих хто тимчасово🥲 не в ІТ, тому я заповнив і заохочую вас скористатися нагодою поки є можливість👇
Анкета → https://tally.so/r/wA62By


Bluesky

Прийнявши факт що для розробки нативних апок я недостатньо розумний, вирішив зробити щось простіше.

Послухав черговий епізод подкасту Startups are hard Макса Іщенко, де той схвально відгукується про відкритість Bluesky. Мені ще давно дали туди інвайт, але я не заходив. Вирішив подивитися.

Bluesky — це твітер на відкритому протоколі, без алгоритмів та сумнівних власників. Зараз він потроху відвойовує аудиторію в тих місцях, де твітер заблокували, або серед тих людей, яким не подобається політика твітеру.

Коли я робив Donate1024, то хотів, щоб збори публікувались не тільки в телеграм бот, телеграм канал та на сайт, а ще й у твітер, фейсбук та інстаграм.

Але, на жаль, зробити це дуже складно через закритість екосистем. Тому я навіть не намагався, і просто забив.

Протокол Bluesky, AT Proto,  відкритий, а для доступу до API не потрібно проходити через пекельні кола верифікації та отримання токенів. Реєструєшся і твої логін та пароль і є ключами доступу.

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

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

Спільнота вже створила цілу купу апок під Bluesky, ось, наприклад, добірка: https://www.growbluesky.com/

Офіційний SDK для AT Proto є тільки тайпскрипиту та пітону, для вашої мови теж швидше за все буде щось від ком'юніті. Donate1024 написаний на Ruby on Rails, під Ruby є декілька SDK, найживіший серед яких це minisky. Його я й взяв. Трішки повозився, щоб передати логін та пароль, а далі все просто — методи описані в документації, бери й роби. Єдина особливість це те, що для форматування тексту AT Proto використовує не розмітку, а так звані фасети. Тобто замість тут буде [посилання](https://..) передається просто текст тут буде посилання і окремо об'єкт фасету, який вказує індекси початку та кінця фасету та тип (посилання, хештег, юзернейм):

{
index: {
byteStart: 6,
byteEnd: 15
},
features: [{
$type: 'app.bsky.richtext.facet#link',
uri: 'https://example.com'
}]
}

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

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

Щоб прикріпити до поста картинку потрібно її спершу завантажити на сервер, отримати посилання, а потім вставити його у пост. Дещо незручно, але вже як є. Не знаю чи можна завантажувати через API відео, здається що вже так, але я ще не пробував. Через вебклієнт можна.

Також випадково натрапив на рейтліміт. Через те що в мене не зберігалась сесія між постами, я перевищив ліміти на логін (хоч і коректний) і система мене заблокувала. Мусив чекати добу поки відпустить.

API дозволяє вказати дату коли було зроблено пост. Дуже зручно, щоб перегнати у Bluesky всю історію, що я й зробив.

Результат: https://bsky.app/profile/donate1024.org

Як і в боті, кожного дня на акаунті буде публікуватися новий збір та новий звіт. Підписуйтесь, донатьте.

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

Також підписуйтесь на https://bsky.app/profile/rozhkov.me. Хоч в мене ніяк не ходить займатися мікроблогінгом, буду пробувати.

#проєкти #donate1024
permalink | @full_of_hatred
👇Щоденні донати💰на ЗСУ🪖
🫡@Donate1024Bot


Захотів зробити апку для скрінкастів

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

Дуже проста функція — екран + кружечок з вебкамери + мікрофон. Розумні люди для цього зробили Loom та йому подібні, професіонали користуються OBS.

Але Loom не має апки для лінукса і працює лише як аддон у браузері. Я побачив тут opportunity та подумав — а чому б мені не зробити таку нативну апку? Задача звучить досить просто — іконка в треї, натискаєш на неї — починається запис, натискаєш ще раз — запис завершується і відкривається віконечко з посиланням на твоє відео, яке можна пошарити кому треба.

Чому нативну? В мене є незакритий гештальт. Дуже дратує веб-bloatware.

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

Поліз робити, і...

Виявилося що все не так просто.

Я хотів взяти rust, ui бібліотеку egui, там зробити одну кнопку.

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

Мені вдалося зробити мікропрототип запису екрана, але я так і не зміг прокинути параметри кодування ffmpeg які регулюють якість і також зіткнувся з несумісністю версій.

Якщо пошукати, то є програми для запису екрана, які враплять виклики до бінарника ffmpeg, наприклад Blue Recorder. В принципі це те, що мені треба, туди тільки додати кружечок з вебки й аплоад на сервер.

Врешті через високу складність цю ідею я закинув.

Потім знову повернувся, з менш амбітною ціллю. Просто зробити клон Loom. Браузер дає високорівневе API яке ховає всі складності.

Давай думаю зроблю апку на електроні. Електрон — вчорашній день, розумні люди написали на расті Tauri, який швидший та компактніший. Ну, думаю, зараз заживемо, на джаваскріпті я вже точно подужаю зробити задачу.

Розгорнув хеловорлд, згенерував через Claude мінімальну версію запису екрана, запускаю, і... нічого. Дивлюся в чому справа — апка не може запитати дозвіл на запис. Йду на github, щоб дізнатися що Tauri не підтримує WebRTC і поки що не планує це робити🤦‍♂️

Потім я пішов ще раз подвитися як працює Loom та інші веб-додатки для запису екрану. Мені дуже не сподобалося що воно завжди запитує дозволи та також показує бейджик «ви шарите ваш екран». Я ж хочу нативне рішення, тому відмовився від електрону.

Давай думати далі, я ж Java-розробник? Напевне там щось має бути. Ось JetBrains зробили Compose Multiplatform, візьму його, а вже якесь АРІ в джаві має бути. Почав шукати — та ж проблема, є біндинги до ffmpeg якими хз як користуватися.

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

Ще раз подивився на Loom. Ще раз подивився на ffmpeg.

Зібрав однорядкову команду на ffmpeg яка записує одночасно відео екрана, вебкамеру та звук з вебкамери в один файл і накладає вебкамеру власне на запис екрана.

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

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

Думаю що робити далі.

update: читач підказав рішення, автори якого вже пройшли увесь шлях та написали нативну апку на расті: Cap.

#проєкти
permalink | @full_of_hatred
👇Щоденні донати💰на ЗСУ🪖
🫡@Donate1024Bot


Супераппи

Неймовірно дратує що кожна маленька апка на телефоні прагне заполонити собою все і стати всім.

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

Альо, додаток Київстар, мені від тебе треба тільки статистику по витратах та можливість заплатити, мені не треба пхати «завдання» та «винагороди». Ти просто труба для передачі трафіку!

Уклон, я просто хочу доїхати з одного місця в до іншого. Мені не потрібні «медіатори», не потрібні пропозиції від твоїх партнерів, не потрібен кешбек.

Ачівка «пральня» у монобанку перший раз виглядає дотепно, але потім дратує. Аватари? У банкінгу? Зробіть десктопну версію, бо я вже задовбався копіпастити реквізити ібанщиків. Тим часом ріжок: купує сталкер 2 спеціально через моно картку, щоб отримати ачівку та костюм для аватара.

Хто придумав сторіз в апках? Здається вперше ця «іновація» перетекла з інстаграмів до наших ворогів з тіньков банку ще дуже давно, але можу помилятися.

Виконувати завдання? Я тобі гроші плачу ти, тупа відрижка недолугого менеджера, а ти мені ще вказівки будеш давати?

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

Цікаво, який реальний ROI у того всього. Звісно у відверто шахрайських схем київстара по підключенню мелодій дзвінків та іншого непотребу від яких треба відмовлятися то великий, а у решти?

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

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

#спостереження
permalink | @full_of_hatred
👇Щоденні донати💰на ЗСУ🪖
🫡@Donate1024Bot

3.7k 1 33 151 179

Продовжую збирати на шини. Половина суми є, кілька комплектів вже в дорозі.

Банка: https://send.monobank.ua/jar/2aVg7SJEso

Кому не довподоби шини, також збираю на 20 допоміжних батарей для мавіків: https://send.monobank.ua/jar/4rxDYvLFDE

Приват: 4627055113374002
PayPal: xpunkerx@gmail.com

🇺🇦Дякую всім за допомогу!🇺🇦


Реклама в уклоні

Замовив оце вчора таксі, і на екрані очікування з неймовірним подивом побачив рекламний блок.

WTF???

Я плачу гроші уклону, не маленькі гроші, а мені за мої ж гроші показують рекламу?

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

Мало того що водії з невідомих причин занижують мені рейтинг (4.82 наразі), попри те що я вчасно виходжу, не бикую, в дорозі мовчу, і завжди залишаю чайові, мало того що прайс на послуги в порівнянні з убером та болтом вище, мало того що воно мені шле промо пушки постійно, так тепер ще й рекламу пхають.

Хто тут серед підписників є з Уклону, передайте продактам проносних променів. Я колись з ними сидів у коворкінгу в Астарті, але зараз не сиджу.

Дизвподобайка, відписка.

Свої крінжові історії про уклон пишіть у коменти (у твітері це цілий жанр)👇

#спостереження
permalink | @full_of_hatred
👇Щоденні донати💰на ЗСУ🪖
🫡@Donate1024Bot

4.3k 1 20 132 106

Дауншифтери

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

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

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

Якщо у цивільній роботі уникати відповідальності та «підвищення» у менеджмент середньої ланки це правильна стратегія яка мінімізує ризики та максимізує прибуток, то на війні від цього залежить боєздатність.

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

P.S.: Ну гаразд, я теж принципово не хотів йти на ЗСУшні ІТ-галери, але то окрема історія.

#армія
permalink | @full_of_hatred
👇Щоденні донати💰на ЗСУ🪖
🫡@Donate1024Bot


Збір на зимові шини для підрозділу БпАК

Вітаю товариство! Зима близько і нашим залізним коням потрібні нові підкови.

4 × R16 205/55
4 × R15 265/70
4 × R16 245/70
4 × R16 225/75
2 × R17 225/70 + 2 × диски R17

Загальна вартість ~94,000₴

Банка: https://send.monobank.ua/jar/2aVg7SJEso
Приват: 4627055113374002
PayPal: xpunkerx@gmail.com

🇺🇦Дякую всім за допомогу!🇺🇦


Agency

Є такий термін в англійській який я не знаю як нормально перекласти («суб'єктність» — шляпа). Зазвичай під цим мається на увазі здатність людини активно діяти та змінювати світ довкола себе.

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

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

Отримати в команду тіпа який буде сам шось робити — це неймовірна вдача. На цивільній роботі я був наполовину таким тіпом, бо друга половина — то ріжок-антикапіталіст який постійно ригав від необхідності працювати на дядю (та й працювати в принципі). Оцієї половини якраз і не вистачило, щоб стати VPoE або повноцінним CTO у великій конторі, а не залишитися hands-on-architect.

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

Ну а в армії? В армії таких людей як ви розумієте небагато, і на них все й тримається.

За можливості, будьте саме такою людиною. Якій треба більше інших, яка наводить двіж, суєту, мутиться.

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

#робота
permalink | @full_of_hatred
👇Щоденні донати💰на ЗСУ🪖
🫡@Donate1024Bot


Звіт по збору на РЕБ для РУБпАК

На банку було зібрано 78,311.19₴
Зі збору на наземку було додано 8,585.10
На PayPal зібралось 60$
Всього зібрано: 86,896.29₴ та 60$

Витрати:
-83,591.27₴ для переказу 2,144.25$
60$ переказав з того що було на PayPal
215.75$ переказав мій колега Віктор Данилюк
Всього витрачено 2,300.00$

Залишок: 3,305.02₴ піде у наступні збори.

🙆‍♂️РЕБ уже у бійців та буде прикривати їх дупи від підступних кацапських фпв-шок.

Дякую всім за допомогу!

🫶Особлива подяка моїм колегам — Саші Грабу та Віктору Данилюку, які постійно та потужно підтримують збори💰


Local-first dev environments

Найбільше мене харить коли код проєкту неможливо запустити локально.

Коли є мільйон залежностей, кафки-хуяфки, редіси-хуєдіси, бридка трійця S3/SQS/SNS, мерзенний OAuth 2.0 та інша шляпа яка не запускається або складно запускається на вашому комп'ютері.

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

Коли їхав мікросервіс через стаб і моком поганяв, а половина тестових даних складені в YAML файли які останній раз оновлювалися за першого коміта у той мікросервіс.

Коли на старті проєкту лід видає тобі вагон кредів та інструкцій де отримати ще вагон кредів щоб потім захардкодити їх в дотенв-файлі.

Коли тобі пропонується піднімати на ноуті, прости Г-ди, кубернетіс🤮

∈)☼(∋. Очко.

Найцікавіше, що для спрощення розробки міленіали придумали мейнфрейми з тонкими клієнтами — ваш код запуститься на потужному кластері десь в клауді, а ви зі свого IDE будете давати команди. Дуже круто, дякую. Один з найабсурдніших стартапів минулих років це Mightyapp — «Mighty makes Google Chrome faster & use 10x less memory. Mighty speeds up Chrome on your laptop by streaming it from a more powerful computer in the cloud—that makes your browser & other apps run significantly faster.» Просто вдумайтесь, браузер(!) в клауді(!!!)! Ідея звісно не полетіла і фаундер запівотився (хоча це не назвеш півотом) в AI-генерацію логотипів та дизайнів.

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

E2E тести які проганяються по ночам тому що «тест suite займає 2 години» забивають ще один цвях у труну продуктивності. Як щодо того, що запустити їх локально? Ой, не можна? А як мені тоді продебажити тест що падає?

Проєкт має збиратися та запускатися локально без усіх цих хоботів. Цикл read-evaluate-print має бути настільки коротким, наскільки це можливо.

Зовнішні залежності мають бути мінімізовані. Звісно за роки роботи працьовиті міленіали навигадували різних стабів для хмарних сервісів типу DynamoDB Local. Але менше ж з ним — відсутня залежність ліпша за стаб.

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

Без порад.

#робота
permalink | @full_of_hatred
👇Щоденні донати💰на ЗСУ🪖
🫡@Donate1024Bot

7.3k 3 73 145 131

Звіт по зборах на станцію керування TORO Partyphone та 4 радіостанції HIMERA та 2 щогли для екіпажу РУБпАК

Дякую всім небайдужим хто допоміг зібрати кошти!

📺На наземну станцію

Було зібрано 165,171.95₴
Зі збору на рації та щогли додано 236.54₴
Зі збору на плати підриву (один з моїх попередніх) додано 1,866.61₴

Всього зібрано: 167,275.10₴

Витрачено:

Наземна станція: -155,000.00₴
Комісія за платіж: -190.00₴
Тестер РЕБ від фірми gedz.tech: -3,500.00₴

Всього витрачено: -158,690.00₴

Залишок: 8,585.10₴ був переказаний у збір на РЕБ

Станція обійшлась нам на 10,000.00₴ дешевше, тому що у виробника в наявності не було пультів Radiomaster Boxer. Ми маємо запасні TX16, тому то було некритичним.
Станцію вже протестували, незабаром вона поїде робити справи 😎 Крута розробка, все як заводське, на відміну від звичних хлипких та так сяк зліплених на 3д-принтері кріплень та елементів монтажу. Особливо мене радує кейс, бо все FPV обладнання дуже крихке, і погнути або пошкодити антени та кабелі дуже просто.

Тестер РЕБ ще чекаємо, обіцяли відправити в середині листопада.

📻На 4 рації та 2 щогли

Було зібрано 44,816.54₴

Витрачено:
2 щогли «Плечі Атласа» висотою 10.5 м за кеш: -28,500.00₴
4 радіостанції HIMERA G1: -16,000.00₴
Комісія за платіж: -80.00₴

Всього витрачено: -44,580.00₴

Залишок: 236.54₴ переказав на збір на наземку.

🫡Щогли та радєйки теж уже передані бійцям, можете бачити їх на фото.

🇺🇦Дякую всім хто вірить у Сили Оборони та долучився до збору! Без вашої підтримки було б набагато складніше.🇺🇦

💪💰окрема подяка за потужні донати Віктору Данилюку, Ігору Бондаренко, Віталію Ратушному, Роману Бойчуку, Михайлу Глібі, Антону Страчкову. Дякуємо вам!

🫶ще одна окрема подяка моїй подрузі Лайті з БФ «Котики по-київськи» за допомогу з оплатою послуг НП, так, доставка наземки обійшлась б нам у 960.00₴. Лайті дуже багато допомагає нам з оплатою коштовних посилок🫶

😬І нарешті особлива подяка дорогому брату Георгію Кавецькому та підписникам його каналу @sampleName32 за поширення збору. Швидкого вам відновлення, пане!


100% coverage тести, які нічого не тестують

В далекому 2010 році, коли долар був по 8, я працював на ентерпрайзному проєкті разом з консультантами з компанії Thoughtworks. Тієї, звідки Мартін Фаулер, тієї, що публікує Technology Radar, за яким, ви, ймовірно стежите.

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

Консультанти звісно відразу ж прийнялись виправдовувати свій рейт у 3000$ за день роботи та заявили що для успіху проєкту неодмінно потрібно мати високе покриття тестами.

Наш код у 90% випадків виглядав приблизно так:

class Action {
public void doThing(Context context) {
ResultOne resultOne = ServiceOne.getInstance().doThing(context);
ResultTwo resultTwo = ServiceTwo.getInstance().doThing(context, resultOne);
context.setResult(resultTwo);
}
}

Типова імперативно-процідурна ентерпрайзна локшина, де всі та все ходять у бази та зовнішні інтеграції.

Звісно, з коробки такий код не є тестабельним, через статичні методи. Тому спочатку консультанти винесли сервіслукап в окремі методи, а згодом ми зробили там вже нормальний DI.

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

class ActionTest {
@Test
public void testDoThing() {
ServiceOne mockServiceOne = mock(ServiceOne.class);
ServiceTwo mockServiceTwo = mock(ServiceTwo.class);
Action action = new Action(mockServiceOne, mockServiceTwo);
Context context = mock(Context.class);
ResultOne mockResultOne = mock(ResultOne.class);
ResultTwo mockResultTwo = mock(ResultTwo.class);
when(mockServiceOne).doThing(eq(context)).thenReturn(mockResultOne);
when(mockServiceTwo).doThing(eq(context), eq(mockResultOne)).thenReturn(mockResultTwo);

action.doThing(context);
verify(mockServiceOne).doThing(context);
verify(mockResultTwo).doThing(context, mockResultTwo);
verify(context).setResult(mockResultTwo);
}
}

Таких тестів ми писали сотні. Цілі спринти були присвячені ретельному моканню. Каверадж відразу полетів у небеса.

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

Згодом, я зустрічав такі «тести» в інших компаніях на інших проєктах.

Формально каверадж є, а по факту ні.

Писали такі тести? Згодні з тим що вони марні чи вважаєте що все правильно нам консультанти сказали? Діліться у коментах👇

#робота
permalink | @full_of_hatred
👇Щоденні донати💰на ЗСУ🪖
🫡@Donate1024Bot

8.9k 4 36 90 84
20 ta oxirgi post ko‘rsatilgan.