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

Мої емоджі:
https://t.me/addemoji/AdaptiveDevIcons
https://t.me/addemoji/VehicleBrands
Download Telegram
О ні, здається, я вже знаю, до чого все йде…

Пан Соловйов такий якось: «Он ту книжку по 💻 Clojure почитай», — каже. Й ось у мене вже 📝 імакс на компі! 😰
Please open Telegram to view this post
VIEW IN TELEGRAM
Є у мене значить плагін для MkDocs, який перетворює посилання виду
[[some folder/some page]]

у посилання виду
[some folder/some page](full-path/to/some%20folder/some%20page.md)

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

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

А от з відосами в обсідіані працює, а у мене ні. Це тому, що MkDocs на синтаксис виду ![alt](url) генерує
<img src="url" alt="alt" />

Звісно, браузер тільки зображення так вбудовувати вміє.

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

Роблю приблизно таке: якщо знаходжу <img>, в якому src вказує на відео, наприклад, video.mp4, то заміняю його на
<video>
Формат не підтримується
<a href="video.mp4">video.mp4</a>
<source src="video.mp4" type="video/mp4" />
</video>

Ну, так воно мало б працювати принаймні, але ж ні! Натомість було
<video>
Формат не підтримується
<a href="../video.mp4">video.mp4</a>
<source src="video.mp4" type="video/mp4" />
</video>

Бачите? Воно ../ додало. І прикол у тому, що це як раз правильний URL згідно з тією структурою, яку генерить MkDocs.

Я дуже довго дуплився і не міг збагнути, в який момент і хто це робить, аж доки не втямив, що в самому MkDocs на цей випадок свій додатковий Treeprocessor, котрий відносні посилання адаптує, от тільки робить він це виключно для <a> та <img>, але не для <source>. Наразі просто захардкодив додавання ../, але треба зробити аналогічним чином, як у них, мабуть.

Та допис насправді навіть не про це, бо це був вступ 😅

Спробував я тут ваш хвалений uv замість poetry, якщо вже нагода випала. Він типу на расті написаний, все вміє, мовляв, дуже швидкий і все таке (як з рекламного буклета). І знаєте шо? Виявляється, що він і справді норм!

Але є певні «але».

По-перше, не всі #тулзи можна ним поставити. От наприклад, ansible — поки що ні на відміну від pipx. По-друге, білд-система все одно потрібна, тож наразі використовую hatch, бо poetry не по стандарту пише у pyproject.toml.

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

Та що я точно можу сказати про uv: працює ця падлюка напрочуд швидко. Мені як раз друган днями жалівся, що доки тестував автоматизації робочих процесів у своїй 💻-репі на GitHub Actions, то виюзав всі халявні 2000 хвилин. І ось тут ця тула прям стане в пригоді, бо, думаю, можна на порядок пришвидшити встановлення всіх залежностей.

Думайте, що вам важливіше 🎤
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Ух, як же я ненавиджу, коли хтось наламує юзкейси, що у користувачів вже буквально у мʼязовій памʼяті!

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

Короч, раніше як було, якщо хочеш посилання додати в текст? Виділяєш, тиснеш ⌘K, відкриваєтся попап, в ньому вставляєш лінку через ⌘V, тиснеш Enter. Все.

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

От тільки текст посилання в попапі не виділений, тому якщо суто механічно натиснути ⌘V, то воно його ще раз додасть в кінець 🤬 Уїбанство.

(Ну принаймні скопійовані з 1Password паролі не світить — я перевірив. Схоже, фільтрує по майм-типам вміст буфера, перш ніж вставляти).
Please open Telegram to view this post
VIEW IN TELEGRAM
Якщо хтось чекав на можливість нарешті використовувати #QML у ваших WPF-програмах під 💻 (вже ніхто не чекав), wait no more.

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

Можливо, #QML — це наразі одна з найвагоміших причин, чого я досі тримаюся C++. Я просто дуже полюбляю робити UI, і саме завдяки цим двом мовам я здатен досягати найшвидших та найякісніших результатів. Python відштовхує своєю повільністю виконання та труднощами розповсюдження готових програм. А під інші мови всі байндінги сумнівної якості й написані хтозна-ким.

Це не значить, звісно, що я зараз раптово перейду на 💻, але може вони нарешті подивляться в бік чогось зручнішого та сучаснішого.
Please open Telegram to view this post
VIEW IN TELEGRAM
«Цікава» штука тут у мене трапилася. Є проєкт, в якому прописані деякі депенденси на пакети в #Conan:
fmt/9.1.0
spdlog/1.11.0

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

А сьогодні я сів його зібрати, а він мені каже: «Хєр тобі! Конфлікт версій, йопта!» — Типу fmt/9.1.0 конфліктує з вимогою fmt/10.0.0, що вписана в spdlog.
WHAT. THE. ACTUAL. FUCK⁉️

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

І тепер я ставлю fmt/10.0.0, а воно не збирається, бо там зник якийсь template, від якого ми наслідувалися. Оце жесть. Щиро дякую за можливість вбити зайвий день на рівному місці.

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

Нагадую, що єдине адекватне рішення для депенденсі-менеджера — це:
1) не давати можливості заливати різні пакети під однією й тією ж версією: якщо версія вже існує — то або інкременти її й роби нову, або досвідос;
2) не давати можливості вказувати в залежностях діапазони версій на кшталт pkg/[>=6.4 <6.8], pkg/[~1] тощо — тільки повна версія;
3) бажано ще й не давати видаляти 😄

«А як же автоматично отримувати мінорні оновлення?» — спитаєте ви. А ніяк! У ваші semver я не повірю доти, доки у прийнятті рішення, яку частину (major/minor/patch) версії треба інкрементити, бере участь людина.

Хтось тут може сказати, що це давно автоматизується за допомогою conventional commits, по яких потім воно нарощує версію в залежності від наявності feat: або fix:. Але ж рішення, що ставити, feat чи fix, все одно приймає людина, тож яка різниця?

Скоро так дограємося, що пральна машинка не ввімкнеться, якщо два тижні нею не користувався через відпустку.
Please open Telegram to view this post
VIEW IN TELEGRAM
Розповім ще невеличку історію про 💻 та #QML, але не стільки з технічними деталями, скільки з архітектурними.

Отже, частиною Qt є UI-фреймворк під назвою Qt Quick. Він звісно на С++ написаний, але користувачі переважно на QML пишуть. Всі візуальні елементи там є нащадками Item. Ну й за роки розвитку він вже добряче навбирав у себе різних спільних властивостей та став дещо важкеньким.

Серед базових важливих властивостей, що були там з самого початку, є так звані anchors — механізм дуже легко робити flexible UI. Наприклад, пишете
height: 35
anchors.bottom: parent.bottom

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

Хоч на анкорах майже будь-що можна зробити, та не завжди це зручно. Якихось більш високорівневих лейаутів не було, й згодом їх додали окремим модулем QtQuick.Layouts. Відтоді стало можна писати якось отак:
RowLayout {
TextField { Layout.fillWidth: true }
Button { text: 'Submit' }
}

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

Та весь кайф був у тому, що ніхто QtQuick.Layouts не навʼязував. Не подобається, як вони працюють? То напиши свій (на C++)! Так і зробив мій друган, що тоді був девелопером у моїй команді. І тепер його лейаут «катається» у сотнях тисяч Мерседесів з MBUX.

Та, схоже, не всім це було до душі. Виявилося, що комусь занадто складно розставляти fillWidth/fillHeight у потрібних місцях 🤦🏻‍♂️ Це, як на мій погляд, не велика проблема, бо QML дозволяє це суперлегко вирішити створенням нових компонентів. Для цього треба або новий файл створити (1 компонент = 1 файл), або прям inline написати на кшталт:
component FormField: TextField {
Layout.fillWidth: true
}

RowLayout {
FormField {}
Button {}
}

Ну, типу… все! Що може бути краще?

Але якийсь черговий геній в Qt знайшов можливість «пакращєння»:
1) він додав у базовий Item властивість sizePolicy, яка має вказувати кьютовому лейауту, чи розтягувати елемент, чи він мусить мати фіксований розмір.
2) Потім він нахуєвертив «sensible defaults» в усі контроли, що наслідують Item, тобто всі кнопки, текст-філди, слайдери й таке інше.
3) Ці sensible(!) defaults миттєво наламали KDE Plasma, де все поплило, бо не такі вони й sensible виявилося.
4) І на додачу, sizePolicy ще й частина private API, тобто для своїх кастомних лейаутів це буде проблематично використати. Отже, QtQuick.Layout тепер прибитий цвяхами до QtQuick.
Наразі вирішили цю фічу зробити тимчасово opt in, однак, проперті вже там, тож кожен Item позаяк займає більше памʼяті, ніж раніше.

А які задачі ви вигадуєте собі на роботі, щоб не складалося враження, що сидите без діла? 🤣
Please open Telegram to view this post
VIEW IN TELEGRAM
Всі кинулися писати (раз, два) про свій олімпіадний досвід програмування, а у мене такого немає (я тільки був на олімпіадах з історії, української мови та правознавства 😅).

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

Це був Sapka Contest, який влаштувала українська компанія Stanfy, що нині вже наче навіть не існує. На все відводився тиждень, під час котрого ми майже не спали та трохи підзабивали на універ 😄

Цікавинкою було те, що вони просто дали jar-ник без зайвих деталей. Тобто жодного завдання не було. Але хтось доволі швидко виявив, що до нього можна підʼєднатися Telnetʼом. Коли ти це робиш, програма тебе вітає та вимагає ввести пароль. Звісно, паролем було слово «пароль» (password). Та програма потребувала ще! )) Підійшли деякі відомі чіти на кшталт iddqd та show me the money.

Коли ти вводив якийсь пароль, програма «активувала» якісь додаткові підсистеми типу «engine» або «satellites». Що це значило, ми не розуміли, та продовжували копати. Окрім цього, на кожен пароль вона видавала якусь нову додаткову інфу. Тут стало зрозуміло, що для пошуку решти паролів доведеться вирішувати алгоритмічні задачки по типу кубика Рубіка, яку вони закодили неправильно 😁, та купи інших (на жаль вже не згадаю конкретніше). Це все через telnet відбувалося, нагадую.

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

І зʼясувалося, що цей jar-ник — сервер для мультиплеєрної гри на кшталт Bomberman 💣🤯 (always has been, так би мовити). А всі ті «підсистеми», що ми активували кодами — це ввімкнення capabilities для вашої апішки. Наприклад, engine дозволяє вашому гравцю рухатися, а satellites дозволяє орієнтуватися у просторі (грубо кажучи, запитувати, що в сусідніх клітинках). HOW COOL IS THAT⁉️

Отже, справжньою задачею цього контесту було перемогти у поєдинку bomberman-ботів! І ми сіли писати власного бота: BFS й ось все це. Деякі коди активували бонуси, що рандомно зʼявлялися на полі: на швидкість переміщення, кількість бомб, розмір вибуху і т.і. — як у справжньому бомбермені. Чомусь ми зробили ставку на кількість бомб, до того ж наш алгоритм переміщення був трохи глючний, тож врешті ми зайняли всього шосте місце.

Фінальне змагання проходило в Києві. Ми не могли цього пропустити, тож, звісно, поїхали. Там була купа народу, і якщо дивитися відос дуже уважно, то можна навіть побачити нас і ще багато кого. Макса Іщенко, наприклад )

Перемогла врешті команда THIRTEEN, один з представників якої пізніше писав на Haskell транслятор з Pascal у JS, а з іншим я згодом працював в одній компанії. І їхня перемога була максимально епічною.

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

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

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

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

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

Раніше у мене на NAS стояв GitLab, і це жесть. Я через нього навіть додав оперативи та 2 SSD вставив для кешування операцій, бо інакше воно ледве ворушилося. Там Docker-контейнер, в якому одразу усе: база якась, купа коду на #Ruby ♦️ чи шо там, конфіг на дохуїльйон рядків, Grafana(!) тощо. Потім створюєш собі репу на якийсь прототип, який шкода викинути, а воно там одразу якісь авто-DevOps врубає, ще купу непотрібної хєрні, налаштувань 10 сторінок…

Цього року змігрував на Forgejo, про який згадував, коли писав про Tailscale. А ще це той, на якому Codeberg.org хоститься. Спочатку за звичкою фігачнув у docker-compose сам Forgejo + базу Postgres 🐘 + Tailscale 💠 + nginx… А потім подумав: а нащо мені той Postgres взагалі? З моїми обʼємами даних це 100% оверкіл. І перевстановив з дефолтним SQLite 🪶.

І знаєте, що? Та офігезно взагалі!

По-перше, воно літає. Дуже легке та швидке навіть на моєму Intel Celeron.

По-друге, по фічах мені взагалі нічого не бракує. Майже GitHub зразку пʼятирічної давнини. Але навіть CI вбудований є.

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

По-четверте, ґітлаб дуже всрато зберігає дані. Там стопіцот тек вкладених і взагалі хтозна-що діється. А у Forgejo просто все розкладене по <org>/<repo>.git. Схоже, тупо голі (bare) репи лежать — легше бекапити, чи, точніш, потім відновлювати.

Ну й наостанок: віддзеркалення працює ізічно, й не треба для нього там якусь Super Pro Enterprise версію за всі гроші планети. Я так налаштував собі декілька мірорів «важливих» репозиторіїв з публічного GitHub, і воно їх само постійно сінкає без проблем. Навіть yt-dlp туди закинув чисто на всяк, бо хто знає, коли «правовласники» знов викрутять ґітгабу яйця.

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

Короч, Gitea/Forgejo — рекомендую.

P.S. Зі святом всіх, хто боронить Україну будь-яким доступним чином.
Please open Telegram to view this post
VIEW IN TELEGRAM
Я схиляюся до думки, що загалом залізо розвивається значно швидше та краще за софт, хоч це й не дуже видно через Закон Вірта. Та для будь-якого правила знайдуться виключення.

Важко знайти щось стосовно заліза, що дратуватиме мене більше за оцих двох хлопців: відео та аудіо (і я, до речі, навіть не про Bluetooth)!

Вирішив я у відпустці зробити на своєму ігровому віндовому компі так, щоб Dolby Atmos працював. Телевізор Samsung, саундбар Samsung, вінда підтримує — що може бути легше?
(Правильна відповідь: легше не вийобуватися вмикати Atmos. Але це нецікаво.)

Значить, схема така: комп через HDMI-дріт йде в саундбар, а саундбар через інший HDMI — у телевізор. Не працює

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

Тоді комп одним HDMI-дротом йде в телевізор чисто заради відео, а іншим — у саундбар для аудіо. Починаються танці з налаштуваннями, в один момент яких комп взагалі відмовився виводити кудись картинку, а у мене навіть монітора немає. І по RDP почав помилку писати. Ще й Switch тепер на саундбар звук не виводить

Ок, вирішив замовити нові кабелі. Ви ж в темі, що вони всі різні, хоча виглядають однаково? З якимись у вас буде 4K, з іншими ні. 120 Hz? HDR? — Як пощастить. Не забуваємо про довжину ще!

Гірше ситуація тільки з USB-C — ось там взагалі найгірший прояв динамічної типізації прямо у залізі‼️, бо може бути USB 3.0, а може бути 3.2… а може бути чисто живлення… або живлення, але не з тим струмом… а може й живлення в інший бік… або навіть не USB, а HDMI! Чи якийсь Display Port через Thunderbolt. Дуже зручно короч, дякую.

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

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

Інша проблема: перехід з тиші у стан, коли є звуки. Якогось хєра це займає ну секунди 4, їй-богу. Тобто ці чотири секунди звуку просто нема! Для ігор це зазвичай не суттєво, бо там завжди хоча б фонова музика є, але якого хєра‽ Знаєте, що допомогло? Зайти в налаштування звукового пристрою та поміняти драйвер з NVIDIA на вбудований віндовий 🤡🎪

Я дуже сподіваюся, що люди, які це все вигадали, вимушені щодня з цим стикатися і так само страждати!
Please open Telegram to view this post
VIEW IN TELEGRAM
Cіпласпластик
Я схиляюся до думки, що загалом залізо розвивається значно швидше та краще за софт, хоч це й не дуже видно через Закон Вірта. Та для будь-якого правила знайдуться виключення. Важко знайти щось стосовно заліза, що дратуватиме мене більше за оцих двох хлопців:…
Забув сказати, що в процесі ще оновив прошивку саундбара. Вона важила півтора гігабайти! І для цього треба було вставити флешку в дно саундбара. Самсунг і тут у епла трохи притирив крутецьких інженерних рішень. До речі, це не допомогло.

А щойно взагалі «відпав» сабвуфер сам по собі. Я зазвичай пультом користуюся, але деякі налаштування зручніше з телефону робити — через так званий «Smart»Things.

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

Але з телевізором схожа штука. Тільки воно мені прямим текстом пише: «Ви давно не керували цим пристроєм з телефону, тому ми його відконектили зовсім» 🤯🙊 Ви там йобнуті всі чи шо? Нащо ви взагалі розробляли таку «фічу»?
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Кінотортури
Please open Telegram to view this post
VIEW IN TELEGRAM
Дивна штука зі мною трапилася.

Пройшов днями по приколу перекладацький тест, який підготувала локалізаційна спілка «Шлякбитраф». Це ті, що зокрема зробили офіційний переклад українською гри Baldur's Gate 3 та багато чого іншого.

Набрав 27/31 загалом. Було б 28, але тупанув з пунктуацією в прямій мові. Написав їм. Вони надіслали мені тестове завдання з тридцятьма шістьма рядками (в сенсі strings, а не lines — ≈700 слів) тексту з BG2, які я переклав, витративши 6,5 годин. Це було нереально важко, до речі.

І короч зі вчора я в їхній команді 🤯 Тож тепер я про це писатиму сюди значно більше… нічого, бо NDA 😉

Ставте вподобайку, якщо «бісин» вам здається милозвучнішим за «тіфлінг»!

P.S. Непогано як для хлопака, що 30+ років розмовляв москальською, еге ж? Ірино Дмитрівно, Олено Анатоліївно, Катерино Геннадіївно та «Альф» на телеканалі ICTV, дякую, що навчили!
Please open Telegram to view this post
VIEW IN TELEGRAM
Дивився півроку тому панів Соловйових (так, їх щонайменше два) у подкасті, чого зазвичай не роблю, але тут тямущі хлопаки — не нудно розповідають. І там той, що з менш позерським мікрофоном (Всеволод — у нього й канал свій є), порадив книжку «Never Split the Difference», або в українському перекладі «Ніколи не йдіть на компроміс», яку я не так давно якраз нарешті прочитав.

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

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

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

P.S. Дякую за пораду! 🙏
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Тримайте топовий інтерактивний(!) мануал з кривих Безьє.

Треба якось буде його українською перекласти. Але тексту там багацько.
Media is too big
VIEW IN TELEGRAM
Де це Сіпласпластик знов подівся? Працює, мабуть…

Ще б пак працює!

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

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

Що роблять нормальні люди у такому випадку? — Виправляють все файнд-реплейсом у ноутпаді.
Що роблять адекватні люди з навичками програмування? — Пишуть скрипт на 💻 у три рядки, який виправлятиме все автоматично.

Що роблю я? — Я пишу рушій для запуску «правил», написаних на #QML 😅

Отож правила + опціональний логотип (гри) + додаткові файли для копіювання лежать в бандлі. Концепція бандлів з #macOS мені дуже подобається: це така тека з різноманітним мотлохом, але система відображає її як файл і, коли дабл-клікаєш, відкриває відповідну програму. На вінді, звісно, так не працює, тому я просто всередину бандла поклав ще один додатковий порожній файл з кастомним розширенням, і дабл-клікаю там вже по ньому.

QML-рушій крутиться в UI-треді, тож коли йшла обробка файлу, все завмирало, чим дуже мене дратувало. Але виявилося, що можна мати декілька рушіїв в одному процесі! Мені так навіть краще. Я в окремому треді запускаю рушій для опрацювання правил, а в UI-ному тільки… UI. І вони один з одним комунікують там якось сигналами. На одному з етапів розробки у мене так летіло 50к сигналів в секунду 😄, тому UI все одно не реагував — довелося трохи оптимізнути. Зараз там, думаю, ну сотня тих сигналів, може, якщо не менше.

Користувач просто драг-н-дропає файл у вікно, й воно фігачить. Наразі є декілька видів правил:
FileRule отримує на вхід чисто імʼя файлу й далі робить з ним ті перевірки, що хоче, в колбеці ensure.
ItemRule запускається для кожного рядку тексту, тож отримує цей рядок та його індекс. Окрім того, можна задефайнити ще fix, який автоматично щось виправлятиме.
InstallCurrentFile дозволяє поточний файл закинути у якусь теку, опціонально під іншим імʼям.
InstallFiles — майже те саме, але копіює якісь статичні файли з бандлу.
• Окрім того, існує Group, щоб можна було групувати декілька рулів, а значить — виносити їх в окремі реюзабл-файли! Їх можна вкладати одна в одну, й воно врешті просто «розчиняє» їх, роблячи щось на кшталт flatten.

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

Думаю згодом ще додати можливість порівнювати рядок з оригіналом + підтримку інших форматів на кшталт XLIFF + автоматичний апдейт з Crowdin, щоб руками ото не качати. Але поки що мені й так норм.
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Як же замахав кривий софт… Особливо софт, який йде з якимись пристроями, які без нього нормально не здатні працювати.

Найкраще це видно по компаніях, що заробили собі імʼя на розробці периферійних пристроїв — їхній софт найгірший!

Візьмемо, наприклад, Logitech. (Памʼятаєте «неймовірні історії» про те, як їхня служба підтримки просто надсилала новий пристрій, коли ваш поточний ламався? Виявляється, в Європі так будь-яка поважна компанія робить). У мене зараз їхня мишка MX Master 3, і вона прям класна. Дуже подобається основне колесо, яке скоріш за все електромагнітне і контролюється прошивкою. Але мова якраз не про прошивку, а про те лайно, яке заведено називати «драйверами». Насправді сам драйвер там крихітний, підозрюю, але до нього ще йде прога-конфігуратор на 250 МБ. Коли я цю мишку на роботі отримав та намагався початково налаштувати, то воно навіть не завжди її детектило.

А зараз, бува, анлочиш комп, а деякі додаткові кнопки не працюють взагалі because fuck you thatʼs why. Якщо пощастить, то після наступного сліпа запрацюють знов.

Ще у мене є їхній Logitech Harmony Elite. Так, це той самий «універсальний пульт», софт якого хтось колись реверсив та познаходив там купу прикладів геніального інжинірінгу в якомусь дикому міксі технологій від флеша до вбудованого Apache чи шо там було у них — зараз вже важко знайти (а кажуть, наче інтернет все памʼятає). Чудовий пристрій: подобаються кнопки, підсвітка, екран за наших часів вже не вау, але нормальний, навіть з тачем, та навіть акселерометр є, підозрюю, якщо вже він якось реагує, коли в руки його береш. Але софт — це пиздець. За всі роки я так і не зміг його сконфігурувати так, як хотілося б. Навіть тупо комбінація телевізор+саундбар — це вже біль, бо саундбар вмикати-вимикати окремо не треба — його телевізор контролює. А якщо додати, що у мене телевізор можна «вимкнути» так, щоб він прикидався картиною, а можна вимкнути повністю, то все — капець! Good luck with that.

Або візьмемо RØDE. Вони заробили собі імʼя тим, що роблять чудові й не дуже дорогі мікрофони. Але суто мікрофоном в наш час покупців вже не знайдеш, треба ж фічі. Є от їхній Wireless Go (ну або Me/Pro), який вміє звук прям в себе писати. Але впродовж довгого часу їхня прога дозволяла експортувати записи з внутрішньої памʼяті тільки по одному 🤯

А зараз RØDE вирішили задовольнити потреби стрімерів та ютуберів усіляких. І так вийшло, що у мене є їхній Streamer X. Хардварно пристрій мені дуже подобається (коли працює): кнопки норм, дві крутилки й все таке. Але софт — це жах. По-перше, прогу навіть не можна в трей сховати — постійно маячить відкрита. Інколи не детектить пристрій взагалі, який, до речі, раніше через мій thunderbolt-док працював норм, тепер ні — тільки напряму. Інколи кораптить звук з ніхуя, причому про це неможливо дізнатися, адже на монітори виводить все ок. Під макось навіть раутінгу звуку з програм немає. Кнопками можна генерити MIDI-сигнали, щоб контролювати інші штуки, але саму цю прогу контролювати через MIDI не можна 🤦‍♂️ Але найжахливіше, що він не вимикає підсвітку, коли комп йде в сліп, а хуячить, як прожектор на стадіоні — я вирішив це папірцем, зацініть відос.

Ще у мене є два Stream Deck від Elgato. До цих хлопаків питань майже нема: все працює, як того очікуєш. Хіба що трохи дивнувато, що їхній конфігуратор важить 860 МБ! Наша тулза, що ми з командою на роботі зробили за 2,5 місяці, важить майже 190 МБ, причому сам бінарь — 1 МБ з копійками, а решта — то Qt-ліби 🤡 І то я там напакував все, не розбираючись зайвий раз: думаю, можна до сотки збити загалом. Так ось окрім того, що наша тулза має низку функцій, заради яких ми її розробляли, вона також має свій конфігуратор для Stream Deck! І це не плагін до офіційної проги: нам офіційна прога взагалі не потрібна — ми з пристроєм напряму через USB працюємо.

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

Та питання лишається відкритим: якого хєра‽ Ви не можете нормальних програмістів найняти чи шо?
Please open Telegram to view this post
VIEW IN TELEGRAM
Продовжуючи вчорашню тему, але вже в більш творчому напрямі…

Зараз той етап, коли люди раптом згадали, що взагалі-то пристрій зробити не так і складно. Не мені, звісно, бо я як не тямив, так і не почну. Але ж від розумніших людей щодня з'являються якісь гаражні, часто опенсорсні поробки, адже будь-хто може купити собі мікроконтролерів по 10 баксів за відро та зробити з ними щось путнє. А сучасні мікроконтролери — це потужність. Ті ж STM-ки, мабуть, крутіші за всі ігрові консолі мого дитинства разом узяті. В ESP32 ще й WiFi є. В їхньому останньому(?) P4 взагалі двоядерний проц на 400 МГц, та ще й додаткові інструкції для AI. На крайняк можна взагалі просто Raspberry Pi Zero взяти — то взагалі жир. Існує купа фреймворків, купа тулів. Береш та робиш.

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

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

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

Отож… моя проблема яка? У мене руки криві, щоб зробити дійсно компактний, приємний на дотик, зручний та цілісний пристрій. А їхня проблема яка? Що на розробку софта бюджетів вже наприкінці не лишилося… Ну то дайте мені пристрій та SDK! Так, я готовий за це заплатити (але не 500 баксів)!

Ті ж універсальні пульти взяти… На кікстартері щомісяця новий, кожен обіцяє підтримку тисяч пристроїв від сотень вендорів, а врешті це все виливається в прогу в Google Play на 2,1⭐️ рейтингу, а за пів року компанія перестає існувати. На що ви розраховували? Що Logitech ледь-ледь змогла, а ви-то точно зможете краще? Не треба мені суперуніверсальний конфігуратор — краще дайте мені можливість робити те, що я хочу, під мої конкретні юзкейси. Цільова авдиторія звісно інша, менша, зате спроможна заплатити більше.

Безумовно, зробити зручний та простий високорівневий SDK — задача чи не складніша за написання прикладного софту. Але це також можна перекласти на користувачів вже. Хтось зробить фреймворк, хтось щось на ньому, а хтось і до #lowcode доведе, щоб люди без програмерської освіти змогли творити. А вони це можуть! Подивіться, які дашборди роблять не програмісти для Home Assistant: та вони кращі, ніж будь-що, що колись зроблю я 😅

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

Купили б щось таке? Чи може вже?
Please open Telegram to view this post
VIEW IN TELEGRAM
Писати на 💻 у VS Code 💻 — це, звісно, класно і зручно, але блять… Треба було брати комп зі 128 ГБ оперативи.

(Другий рядок з java — це SonarLint, до речі, теж з VS Code).
Please open Telegram to view this post
VIEW IN TELEGRAM