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

Мої емоджі:
https://t.me/addemoji/AdaptiveDevIcons
https://t.me/addemoji/VehicleBrands
Download 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
👍7👀1
#TIL в С++ є спецові функції для порівняння знакових та беззнакових чисел (починаючи з C++20 😂).
Please open Telegram to view this post
VIEW IN TELEGRAM
👀1
Свій перший код на #BASIC я написав в шість років (А ви? Розкажіть, може?) на якомусь радянському клоні спектрума, хоча в ті часи цього ще не усвідомлював. Я був у «компьютерно-англійському» першому класі, проте, вже за півтора року він став звичайним, а інформатику нам перестали викладати. Свій же компʼютер у мене зʼявився аж за вісім років від першої написаної програми — коли мені було 14.

Жили ми доволі бідно, тож у мене не те що компʼютера не було, а навіть «денді», не кажучи вже про «сегу». Якийсь час був Brick Game aka «тетріс», який на жаль зник (найбільш ймовірно його спиздив сусід по поверху, мати-алкоголічка якого варила ширку для наркоманів).

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

А ще існувала радянська книжка «Энциклопедия профессора Фортрана» (росіянською звісно). У мене її не було, але мені друган давав почитати, тож я її мільйон разів прочитав, мабуть.

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

Отже, це все був вступ. Я просто натрапив на сайт з паперовими (кольоровими!) моделями різних старих пристроїв, і мені згадалося ) Треба якийсь гештеґ на кшталт «дід знов забув про таблетки».
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8😁31❤‍🔥1
😩
Please open Telegram to view this post
VIEW IN TELEGRAM
😁13🔥1
Якось розмовляли з друганом про можливість зробити GUI/TUI для роботи з логами, зокрема в JSON-форматі.

І якщо ви досі не перейшли на #Nushell, як це зробив я, то вам може стати в пригоді його плагін для Neovim, що дозволяє наживо фігачити jq-запити. Не забудьте поставити зірочку на репу.
🔥6👍3👀1
Зараз буде багато тексту.

Вчора раптом отримав інсайт щодо код-ревʼю, коли мені робили дизайн-ревʼю слайдів для презентації.

Я вже писав про це раніше, але передісторія така:
Робив програмістам-плюсовикам на роботі доповідь під назвою «Want to get better at C++? Learn other languages». Ну, не скажу, що ідея капець яка свіжа, але це те, в що я сам вірю: доволі складнувато, якщо взагалі можливо, стати професійним програмістом, коли ти нічого окрім C++ не бачив, бо знання мови хоч і важливе, але точно не на першому і навіть не на другому місці за пріоритетом. А серед плюсистів воно ж часто як: пишуть на плюсах, можливо навіть бачили Python, який зневажають, а решту взагалі ігнорують.

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

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

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

Наведу декілька прикладів своїх слайдів та коментарів на них:
👀1
Занадто величезний шрифт. Презентація аж «кричить».

(У мене в принципі в презентації всюди великий).

Я поставив тут будильник на слайд, бо він і в списку є, і взагалі доволі лаконічна та впізнавана штука.
👀1
Це картина якась, — каже. — Не підходить по стилю до будильника. Треба прибрати й вставити щось ліпше.
(Будильник, до речі, в презентації насправді на декілька слайдів пізніше поточного, тож ще питання, що до чого не підходить).
1👀1
Аніме… ми в компанії не використовуємо аніме… Краще прибрати й використати щось більш підхоже.

(Я опущу те, як у мене підгоріла дупця з «аніме»).

Але… що саме тут пасуватиме краще, ніж персонаж з мультфільму, який є автором цих слів? Цитата ж буквально двічі доводить правильність того, про що я розповідаю в презентації. По-перше, напряму: сам сенс цитати про це. А по-друге, на метарівні: мені треба було зробити слайди під презентацію, я не знав, що туди писати, а потім раптом збагнув, коли займався зовсім іншою справою — дивився «Аватара» 🙂
Please open Telegram to view this post
VIEW IN TELEGRAM
😁62👀1
Отож про що це я? А, ну так, про дизайн-ревʼю та про код-ревʼю.

Річ у тім, що у нас в компанії є шаблон для презентацій. Це, можна сказати, такий собі style guide, як у програмістів для коду.

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

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

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

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

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

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

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

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

Чи є користь від перегляду коду, не пірнаючи в контекст та не намагаючись зрозуміти логіку? Ну, дивлячись на те, як було зроблене дизайн-ревʼю — ні. Ба більше! Це може навіть зашкодити.

На жаль у мене немає остаточно сформованої думки з цього приводу. Але я вкотре здивувався, як якась одна подія спровокувала роздуми на іншу, відносно далеку тему 🤔
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7👀1
Щойно дізнався від @dmytrish про таку крутецьку штуку як Kaitai Struct. Це декларативний парсер бінарних даних, який вміє генерувати код під різні мови, зокрема для C++ (а не C! 😌).

Мені буквально нещодавно треба було запарсити віндовий ico-формат в JavaScriptʼі, й у npmʼі авжеж є якісь готові ліби, але в тому середовищі, під яке я писав, дуже старий JS-рантайм (ECMAScript 5). Вручну все писати також впадлу.

А Kaitai, схоже, генерує код під ES5 як раз, бо я не побачив там якогось свіжішого синтаксису. Доведеться знов дістати ту ініціативу зі скрині відкладених проєктів.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥1👀1
Кому #ШІ-шку прям в телеграмі? Microsoft розробила офіційний телеграм бот для Copilot: так і називається, їй-богу — @CopilotOfficialBot. Якось працює, навіть доволі непогано, хоча просить номер телефона з ними зашарити.

Мене вразило не стільки те, що до телеграму прикрутили ШІ-шку у вигляді бота (бо самописних на ґітгабі вистачало й до того), скільки той факт, що Microsoft написала щось для Telegram.

Це як акт визнання існування останнього великими компаніями. Тобто серйозні справи вже пішли, серйозна гра. А значить, надалі ставатиме тільки гірше 🙂 — час шукати, куди звідси ливати 🧐
Please open Telegram to view this post
VIEW IN TELEGRAM
👏5👍2👀1
Media is too big
VIEW IN TELEGRAM
Мені трапився черговий «веббраузер»(?) — Kosmik. Цього разу маємо безкінечне полотно, на яке можна пхати різні зображення, PDF-ки, посилання, текст, наліпки тощо. Тобто в принципі те саме, що вже 20 років є у OneNote, тільки вебкліпер раніше був у браузері, а тепер навпаки браузер вбудований у програму. Хоча сама програма на електроні — тож теж браузер. А ще її можна запустити всередині звичайного браузера 😵‍💫 Kosmik ще й не зовсім безплатний до того ж.

Я потикався і бачу, що користуватися не буду, але сюди вирішив скинути. Тиждень був важкий, а я давно сюди нічого не писав — ще відписуватися почнете 🙁
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4😁4🤔1😱1
Намагаюся частіше використовувати фічі останніх стандартів C++, зокрема ranges. Тож у мене доволі багацько коду на кшталт такого:
return mimeData->formats() | views::transform(toMimeSlice) | to<Clip::MimeContainer>();

Але рядок швидко стає немаленьким завширшки, особливо з плюсовим синтаксисом, як ви можете собі уявити. А clang-format форматує код отак:
return mimeData->formats() | 
views::transform(toMimeSlice) |
to<Clip::MimeContainer>();

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

Для clang-format | — це просто бінарний оператор. Можна, мабуть, налаштувати, щоб він у довгих виразах починав рядок з нього, але тоді він це буде робити і для якогось +, а мені так не подобається.

Дратувало мене це — просто жах, але як так налаштувати його, щоб у мене око не тіпалося — хз. Вирішив спитати #ШІ, бо думав, може, пропустив якесь спеціальне налаштування на цей випадок. А ШІ-шка мені: «так ти просто коментар порожній в кінці рядка лишай» 🤯
return mimeData->formats()            //
| views::transform(toMimeSlice) //
| to<Clip::MimeContainer>();

Тепер clang-format бачить, що між операндом та пайпом ще токен коментаря стоїть, і йому доводиться писати пайп з нового рядка )

Так, ШІ-шка цьому десь навчилася теж, але я сам щось не допетрав до такого рішення.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥3😁1😭1🙈1
Сьогодні компілятор мене тролить. Пишу, знач, у себе в коді:
QHash<int, QByteArray> roles = sourceModel() ? sourceModel()->roleNames() : {};

А він мені:
PaddingProxyModel.cpp:695:76: error: initializer list cannot be used on the right hand side of operator ':'
QHash<int, QByteArray> roles = sourceModel() ? sourceModel()->roleNames() : {};
^ ~~

«Не можу», — каже, — «справа від : поставити {}». Ну ок, спробуймо зліва!
QHash<int, QByteArray> roles = !sourceModel()? {} : sourceModel()->roleNames();

А він у відповідь:
PaddingProxyModel.cpp:695:49: error: initializer list cannot be used on the right hand side of operator '?'
QHash<int, QByteArray> roles = !sourceModel()? {} : sourceModel()->roleNames();
^~

Короч, зліва теж не можна. Чого одразу не сказати щось на кшталт «не пиши initializer list в тернарніку»‽ Як у тому анекдоті про програмістів — максимально точна відповідь, яка, втім, не несе жодної користі.
2😁2
This media is not supported in your browser
VIEW IN TELEGRAM
Зацініть мою знахідку: черговий клієнт для #Gitdebase!

Цього разу це не просто #CLI чи прога з ненависним графічним інтерфейсом. Цього разу це #TUI, тож взяли все ваше найулюбленіше з обох підходів: неможливість показувати нормальну деталізовану графіку + необхідність користуватися мишкою 🤡 План надійний, як швейцарський годинник.

Втім виглядає симпатично )
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6😁6🥰1
This media is not supported in your browser
VIEW IN TELEGRAM
Ну добре, а тепер вже без жартів корисна #TUI-прога, яку я років пʼять назад знайшов — pgcli. Це REPL для Postgres з автодоповненням та табличками.

З цікавого: виявилося, що основна розробниця — родом з Харкова!

А взагалі ця прога є частиною більшої організації, в якій є подібні #тулзи під різні бази даних: https://www.dbcli.com.

До речі хороших і при цьому безплатних GUI-аналогів я може і не знаю навіть. Якщо вам спадає щось на думку, закидайте мене посиланнями, плз.
🔥11👍4
Cіпласпластик
Отож про що це я? А, ну так, про дизайн-ревʼю та про код-ревʼю. Річ у тім, що у нас в компанії є шаблон для презентацій. Це, можна сказати, такий собі style guide, як у програмістів для коду. І в цьому шаблоні шрифт доволі маленький, а я у своїх слайдах…
До речі щодо ютубу. Готуючи свою презентацію, я покладався зокрема на ось цю чудову лекцію від професора Патріка Вінстона з MIT (який на жаль помер пʼять років тому, як я щойно дізнався 😢). Дивовижний приклад того, як чувак, розмовляючи доволі помірно й тихо, все одно зумів захопити мою увагу на цілу годину (хоча зазвичай у мене вже за пʼять хвилин починає дупа зудіти від нудьги). Я це відео вже двічі дивився навіть.

Зокрема, його рекомендації з оформлення слайдів для доповіді мені здалися вельми логічними, тож я їх прийняв для себе також, про що вже згадував раніше.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5