Cіпласпластик
471 subscribers
147 photos
32 videos
2 files
242 links
🇺🇦 Про айті та дотичні теми загалом, ну й трохи про C++.

Мої емоджі:
https://t.me/addemoji/AdaptiveDevIcons
https://t.me/addemoji/VehicleBrands
Download Telegram
Є якийсь такий прикол у мене, що я завжди віддаю перевагу водонепроникним виробам та виробам з титану. Ну тобто якщо поряд будуть два пристрої, й один з них буде з титану або водонепроникний, або водонепроникний з титану 🤩, то я оберу його!

Це, мабуть, з тих часів пішло, коли я вирішив готуватися до зомбі-апокаліпсиса років 12 тому 😐 (Мені тоді ще складно було уявити, що zомбі на наші землі реально прийдуть).

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

І ось сьогодні — вже навіть не памʼятаю як — я дізнався про такий формат як ZIM, який призначений для збереження вебсайтів-баз знань на кшталт Вікіпедії чи Stack Overflow для офлайн-перегляду. А з моїм прагненням колись повністю перейти на local-first та self-hosted штуки, виглядає доволі цікаво. Є ось опенсорс-прога для завантаження та перегляду zim-файлів: Kiwix.

#TIL
Please open Telegram to view this post
VIEW IN TELEGRAM
Я усвідомлюю, що мені просто впадлу вчити #Rust, тож я й не вчу, але все одно лишалося це відчуття, що може весь хайп не з порожнього місця і що може варто було б звернути увагу.

Друган в коментарях до іншого допису вже наводив приклади, і ось зараз рєпа cve-rs нарешті закрила для мене це питання остаточно. Memory safety — це брехня, розходимося 😂
Please open Telegram to view this post
VIEW IN TELEGRAM
В плюсах доволі нерідко перевантажують метод залежно від того, чи сталим є сам обʼєкт, чи ні. Ну, наприклад, контейнер може оголошувати метод, що повертає ітератор на початок якось так (спрощено):
T* MyContainer::begin();
const T* MyContainer::begin() const;

тобто якщо обʼєкт сталий, то і вказівник повертає такий, через який не можна поміняти те, на що він вказує, а якщо обʼєкт мутабельний, то і вказівник теж.
(Якщо ви не в темі, то отой const, що після дужок, фактично відноситься до неявного this, який потрапляє в метод).

Але в QHash (хеш-мапа в #Qt) оператор для доступу до елемента по ключу, як ми сьогодні з друганами виявили в ході обговорення, якогось хєра оголошений отак:
T& operator[](const Key& key);
const T operator[](const Key& key) const;


На перший погляд, все ок 🙂 Окрім того незначного факту, що константний оператор якогось хєра повертає не const T& (тобто не референс), а const T 🤯 Іншими словами, воно щоразу те значення, яке ви дістаєте з хеш-мапи по ключу для читання, зайвий раз копіює.

Фішка в тому, що ніхто в C++ ніколи не повертає const T, бо це безглуздо. Повертають або просто T, або const T&. Тож я вангую, що це баг, про який компілятор вам ніколи нічого не скаже, бо з його погляду все в порядку.

Зайве нагадування про те, що всі ці бібліотеки, котрими тисячі або навіть мільйони людей користуються, пишуть не якісь суперпрограмісти, а такі ж посередні, як ми всі з вами 😎😂
Please open Telegram to view this post
VIEW IN TELEGRAM
Дуже подобається мені, коли домовляєшся, наприклад, про співбесіду, а тобі одразу кидають запрошення в календар, де і час заповнений, і адреса або посилання на онлайн-нараду.

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

Або бачиш новину про прийдешню конференцію, де написано: «Ось тоді-то й тоді-то відбудеться — save the date!». І хоп, кнопку тиснеш, завантажуєш ics-файл, щоб в календар собі швидко додати з усіма деталями.

І знаєте, хто так робить? Ніхто, блядь. Ну може 1 з 10 випадків буває, що хтось аж настільки «досвідчений». У решті ж — бери та створюй сам.

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

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

Але буває, що комусь щось треба від тебе, а не навпаки. Проте вона чи він тобі одразу фігак посилання, мовляв, «обери час, коли ти мені зможеш допомогти». В принципі нічого не маю проти, але тут варто усвідомлювати, що це один з психологічних гачків: ти власноруч заходиш на сторінку, щоб обрати таймслот для бесіди — інвестуєш свої зусилля фактично. А люди дуже неохоче втрачають інвестиції 🤑 Тож коли ти так робиш, то шанси, що ти погодишся допомогти, зростають (бо вже вклався часом). Звучить як дрібниця, але це реально працює 🙂
Please open Telegram to view this post
VIEW IN TELEGRAM
Тримайте одну з найперших же ознак, що менеджер(ка) не справляється зі своїми обовʼязками: вона чи він постійно спізнюється на наради або в останню мить їх скасовує, а інколи взагалі не приходить.

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

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

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

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

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

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

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

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

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

Іншим разом керував командою на 30+ людей декілька років. Було цікаво і корисно, але не моє. Все-таки найбільшу радість мені зараз приносять якісь маленькі затишні проєкти на команду до восьми людей плюс-мінус.

Знаю також людей (навіть серед моїх підписників є), кого я особисто дуже поважав у ролі менеджерів, бо реально круті, але вони повернулися до «чистого» програмування і з того часу не жаліються ніби 🙂

Отож, якщо ви постійно спізнюєтеся на наради, то може варто тойво…? ))
Please open Telegram to view this post
VIEW IN TELEGRAM
Cіпласпластик
Тримайте одну з найперших же ознак, що менеджер(ка) не справляється зі своїми обовʼязками: вона чи він постійно спізнюється на наради або в останню мить їх скасовує, а інколи взагалі не приходить. Чому мова саме про менеджерів, а не якихось програмістів?…
До речі на деякі наради з іншими менеджерами я цілеспрямовано спізнююсь на декілька хвилин, бо якщо цього не робити, то комусь може хибно спасти на думку, що ти недостатньо зайнятий.

Це те, що називається культура компанії 😁
Please open Telegram to view this post
VIEW IN TELEGRAM
Одна з моїх найулюбленіших серій ігор — ігри про Ori. На цей факт вже мало що може вплинути, бо ігри справді чудові та якісні.

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

Отож склав собі діаграму прийняття рішень, може вам теж стане в пригоді. Окремо наголошую, що розвиток українського контенту, зокрема перекладів ігор, вважаю значно пріоритетнішою задачею, ніж малоефективну боротьбу з росіянським.
Media is too big
VIEW IN TELEGRAM
Сів я, значить, у суботу надвечір спробувати себе у програмуванні мікроконтролерів, чим останній раз займався років 14 тому на лабах в універі. Вдалося навіть поблимкати світлодіодом.
Media is too big
VIEW IN TELEGRAM
А за вчора зробив робочий прототип свого нового проєкту. Це мої майбутні кухонні ваги з бездротовим дисплеєм. Кодова назва — Терези. (Так, я знаю, що терези — то інший тип ваг, але слово крутецьке).

Калібрування пачкою печива відбулося успішно.

Думав, писатиму на Python, але почав осьо на плюсах і чогось прям кайфонув.
Сьогодні у нас не Pathfinder, а так званий «ваншот» у «Поклик Ктулху». Тож я вчора витратив трохи часу, щоб підготуватися.

На (першому) зображенні те, що я отримав від ДМа — PDF-ку зі статами готового персонажа. А на (другому) відосі — те, що цього разу вийшло у мене.

Процес створення був приблизно наступним:

Спочатку я заскріншотив портрет з PDF. В кращій якості знайти це фото не вдалося, тож я закинув його у #Photoshop та зробив upscale і розфарбування за допомогою тамтешньої ШІ-шки. Генеративною ШІ-шною заливкою додав якесь тло до фото.

В такому вигляді перекинув його у #Figma, де зробив невдалий закос під фотокартку (білі поля + тінь) та додав імʼя персонажа (шрифт Copperplate ніби пасує).

Далі знайшов на Unsplash.com фотографію старого паперу, закинув у фотошоп, видалив тло, перекинув у фігму.

Павучу діаграму мені ліньки було малювати, тож я попросив ШІ-шку (#Claude) згенерити мені код на #Python з використанням Plotly, який би малював потрібний мені radar chart. Закинув цей код в #Jupyter. Розбиратися з кольорами в тій лібі було впадлу, а ШІ-шка мені якусь хєрню парила, тож натомість я просто експортнув результат в SVG з того ж блокноту та теж закинув у фігму.

Фігма на ізічах імпортує SVG як рідні векторні меші, тож вже там розфарбував, як мені було треба, налаштував товщину ліній тощо.

Поклацав різні шрифти у фігмі та натрапив на Kyiv*Type Serif. Щось він мене приколов, тож вирішив використувувати його для всього тексту (окрім імені, так).

На цьому ліва частина була готова.

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

Kyiv*Type — це варіабельний шрифт, тож довелося проапгрейдитися до Qt 6.7, адже вони тільки-но додали підтримку нещодавно.

Потім щось раз-два, наговнячил туди-сюди (завдяки нашій з друганом лібі easy.reload), і вуаля! Як вам? ))

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

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

Коли я кажу людям, що девелоперські #тулзи не мусять бути лайном, вони мені у відповідь:
🤪 «IDE не потрібна» 🤪 «я грепаюсь по логах» 🤪 «а що не так з гітом?» 🤪 «проєкт збирається всього лише за 40 хвилин на тредріппері» 🤪 тощо 🤪

Тим часом компанія з трьох людей, що робить дуже офігезні ігри:
• оновлюють асети без перезавантаження програми;
• компілюють код у файлі на 13к рядків(!) на кожне натискання клавіші(!!) та оновлюють його теж у рантаймі(!!!)
• у будь-який момент можна поставити брякпоїнт будь-де та пройтися по кроках вперед та назад!
• завдяки хот-релоаду кода, вони компілюють код для профайлінга за потреби вже на запущеній програмі;
• всі дії з моменту запуску програми зберігаються у повністю reproducible послідовність включно зі всіма рекомпіляціями та перезавантаженнями коду або ресурсів, яку можна переносити на інші компи, й воно працюватиме;
• можна тегнути будь-яке місце в коді якимсь додатковим контекстом (timestamp, наприклад), щоб потім швидко знайти саме те місце в коді та саме той момент часу, коли це трапилося;
• все це інтегровано з білд-системою та системою контролю версій.

Я хз, що тут ще додати. Мій поточний тулсет на тлі цього — це наче бричка з кіньми поряд з зорельотом.
Please open Telegram to view this post
VIEW IN TELEGRAM
Cіпласпластик
#Ідея для стартапа: сервіс, в який ви логінитеся своїм обліковим записом #Spotify, щоб він щотижня пробігався по «Тижневій добірці», перевіряв за допомогою #ШІ-шки кожного виконавця, чи не має той звʼязків з рашкою, та автоматично дизлайкав тих, хто має.…
Окей, трохи навчив Perplexity зʼясовувати походження та звʼязки виконавців. Потестив на якихось назвах, що знайшов у #Spotify — не вгадало тільки CHAINY. (ДахаБраха та Ragapop — це 🇺🇦 звісно, а Paul Sabin ніби хвранцуз).

Цікаво, що на цій задачі Claude 3 Opus показує себе вкрай жахливо, а от GPT-4 Turbo ніби норм.
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Нефігова така анімація іконки burger menu.

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

UPD: Важливий момент до речі, що вона програється на сайті всього один раз, а не постійно мерехтить в очах, програючись по колу.
Please open Telegram to view this post
VIEW IN TELEGRAM
Цікаво, як за допомогою #emoji виразити прізвище автора вірша 🤨 (Так, я ще той жартівник 😁 Проте вірш ще зі школи памʼятаю, бо саме він мені на екзамені трапився).

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

Річ у тім, що emoji містять у собі купу якогось непотребу, й одночасно там бракує багатьох важливих штук. У часи #ICQ я користувався найкращим чат-клієнтом — Miranda IM, і навіть тамтешні стандартні смайли (емотікони, точніш) були більш експресивні. Ну а краще за анімовані скайпівські, здається, досі ніхто нічого не зробив. У Microsoft взагалі зі смаком все в порядку, тож я emoji також їхні використовую, як ви давно зауважили.

Та мова не про це. Емодзі — далеко не перша спроба «стандартизувати» спілкування символами за останні роки, але найуспішніша. Наприклад, ще була iConji, яка проіснувала з 2010 до 2012.

Та мало хто знає (а ті хто знає, вже забули), що ще у 2004 зʼявилася така штука як Zlango 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
Cіпласпластик
Цікаво, як за допомогою #emoji виразити прізвище автора вірша 🤨 (Так, я ще той жартівник 😁 Проте вірш ще зі школи памʼятаю, бо саме він мені на екзамені трапився). Взагалі emoji — штука доволі дивна, як на мене. Я проґавив їхнє глобальне пришестя, бо, мені…
Отож зустрічайте, піктографічне письмо моєї юності 😄

Zlango, створений ізраїльською компанією, як і #ICQ до речі, спочатку був плагіном для останнього, але згодом зʼявилася й окрема програма для телефонів. Чи може навпаки все було.

Так чи інакше, в Україні серед мобільних операторів Zlango тільки Київстар розповсюджував: там на djuice можна було майже на халяву завантажити це з WAP-сайту, а потім слати замість смс-ок — але у мене був JEANS 😐

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

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

А гугл-он ще вісім років тому стверджував, що їхня #ШІ-шка в Google Translate буцімто виробила свою проміжну мову.

Тож може зараз з LLM справа краще піде. Але гарантую, що скоро ще схожі спроби будуть. А може й вже є )
Please open Telegram to view this post
VIEW IN TELEGRAM
Мене аж тіпає, коли пишуть C/C++, поєднуючи дві різні мови, відмінні не тільки концептуально, але й синтаксично (так!). Щось я не бачу, щоб писали C/Objective-C або QBasic/Visual Basic десь у вакансіях.

З очевидних відмінностей є, наприклад, автоматичне приведення в сішці void-вказівника void* до вказівника на будь-який інший тип, наприклад, int*. А неявні касти в результаті приносять значно більше болю, ніж необхідність робити це явно. В Haskell немає неявних приведень типу, і жоден розробник з десяти у світі від цього не вмер.

Але у зворотному боці я також отримав декілька WTF-моментів. Наприклад, в C++ можна написати
int i = 0; 
(i = 10) = 42;

і воно це схаває, бо в C++ operator= повертає lvalue, але в C — ні, тож там це не спрацює. Це ж буквально один з пунктів, на які я жалівся у статті. Неприємно здивований.

Це з цікавого. Кажуть: «Майже будь-який код на C може бути скомпільований як C++» — проте не кажуть, що це ще не гарантує його коректність. Наприклад, в C sizeof('a') повертає розмір int, а в C++ — розмір char 🥱

Короч, між C та C++ ще безліч «прикольних» відмінностей. Аж на цілу пдф-ку назбиралося.
Please open Telegram to view this post
VIEW IN TELEGRAM
Читав днями допис (до речі дуже подобається канал, рекомендую!), де чувак пише, як він підходить до завантажень відео з вебсайтів. А у мене як раз була подібна ситуація, коли я теж хотів щось злити з сайту, а там відоса як такого не було, і щось я не второпав, як це зробити.

Так ось я згадав, що то було. Дружина колись давно купила курс, який хоститься на сайті Gurucan (який, схоже, має росіянське коріння до речі), а ті прям хизуються своїм video content protection 🙄

Короч. Чувак своїм дописом мене надихнув розібратися. І він мав рацію! Мені як не веб-девелоперу трохи складніше, але я посидів на вкладці Мережа в девтулах, познаходив там якісь лінки. Спочатку думав взагалі просто дампанути з девтулів сесію та парсити її, але згодом знайшов там виклики API. Після логіну прилітає токен, який можна потім просто передавати в куках разом з User-Agent, і все працює.

Усі відоси розділені на шматки по 4 секунди й лежать на CDN, де також є *.m3u8 плейліст, по якому воно їх і збирає. Я роблю те саме: завантажую всі шматки локально та комбіную їх ffmpegʼом.

Написав все на #Nu (так, це мова в #Nushell) з використанням вбудованих засобів, тож єдина зовнішня залежність — це, власне, ffmpeg (жодних блядь jq!). Дуже подобається, що все статично типізоване та компілюється, тож ще до виконання отримуєш пачку помилок.

І вкотре наголошую, в якому я захваті від передачі обʼєктів через пайп. Є, наприклад у мене команда з отакою сигнатурою:
def "api get" [url?: string]: [nothing -> record, string -> record] { 
...
}

Необовʼязковий параметр — це url, щоб можна було викликати отак:
api get https://some.domain/api/call

Чому необовʼязковий? Бо натомість URL можна передати через пайп. І саме про це каже тип цієї команди, який можна читати так: якщо через пайп приходить nothing, то команда поверне record (але в цьому випадку треба вказати url, що на жаль в сигнатурі не відображене), і якщо через пайп приходить string, то також повертає record. Жодні інші типи через пайп не прийматиме. Тож альтернативний виклик отакий:
'https://some.domain/api/call' | api get

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

Лайна в процесі також похавав. В якийсь момент мій код почав видавати отаку помилку:
  × Variable not found
╭─[~/megamodule/mod.nu:137:1]
137 │
138 │ ╭─▶️ api purchases | each {|p|
139 │ │ api course $p._id | download course
140 │ ├─▶️ }
· ╰──── variable not found
141 │
╰────

І пиздець — ані туди, ані сюди. Причому це тупо в main на верхньому рівні. Довелося коментувати код шматками, щоб докопатися до суті. Врешті виявилося, що десь в іншому модулі на хз якому рівні вкладеності я не перевірив одну зі змінних на null перед використанням 😵‍💫

Втім все одно я в захваті! Nushell — вогонь, причому він активно розвивається.
Please open Telegram to view this post
VIEW IN TELEGRAM