Читав днями допис (до речі дуже подобається канал, рекомендую!), де чувак пише, як він підходить до завантажень відео з вебсайтів. А у мене як раз була подібна ситуація, коли я теж хотів щось злити з сайту, а там відоса як такого не було, і щось я не второпав, як це зробити.
Так ось я згадав, що то було. Дружина колись давно купила курс, який хоститься на сайті Gurucan (який, схоже, має росіянське коріння до речі), а ті прям хизуються своїм video content protection🙄
Короч. Чувак своїм дописом мене надихнув розібратися. І він мав рацію! Мені як не веб-девелоперу трохи складніше, але я посидів на вкладці Мережа в девтулах, познаходив там якісь лінки. Спочатку думав взагалі просто дампанути з девтулів сесію та парсити її, але згодом знайшов там виклики API. Після логіну прилітає токен, який можна потім просто передавати в куках разом з
Усі відоси розділені на шматки по 4 секунди й лежать на CDN, де також є
Написав все на #Nu (так, це мова в #Nushell) з використанням вбудованих засобів, тож єдина зовнішня залежність — це, власне,(жодних блядь jq!) . Дуже подобається, що все статично типізоване та компілюється, тож ще до виконання отримуєш пачку помилок.
І вкотре наголошую, в якому я захваті від передачі обʼєктів через пайп. Є, наприклад у мене команда з отакою сигнатурою:
Необовʼязковий параметр — це
Чому необовʼязковий? Бо натомість URL можна передати через пайп. І саме про це каже тип цієї команди, який можна читати так: якщо через пайп приходить
При цьому авжеж тепер ліва частина може бути аутпутом з іншої команди. За бажання структуру
Лайна в процесі також похавав. В якийсь момент мій код почав видавати отаку помилку:
І пиздець — ані туди, ані сюди. Причому це тупо в😵💫
Втім все одно я в захваті! Nushell — вогонь, причому він активно розвивається.
Так ось я згадав, що то було. Дружина колись давно купила курс, який хоститься на сайті Gurucan (який, схоже, має росіянське коріння до речі), а ті прям хизуються своїм video content protection
Короч. Чувак своїм дописом мене надихнув розібратися. І він мав рацію! Мені як не веб-девелоперу трохи складніше, але я посидів на вкладці Мережа в девтулах, познаходив там якісь лінки. Спочатку думав взагалі просто дампанути з девтулів сесію та парсити її, але згодом знайшов там виклики API. Після логіну прилітає токен, який можна потім просто передавати в куках разом з
User-Agent
, і все працює. Усі відоси розділені на шматки по 4 секунди й лежать на CDN, де також є
*.m3u8
плейліст, по якому воно їх і збирає. Я роблю те саме: завантажую всі шматки локально та комбіную їх ffmpeg
ʼом.Написав все на #Nu (так, це мова в #Nushell) з використанням вбудованих засобів, тож єдина зовнішня залежність — це, власне,
ffmpeg
І вкотре наголошую, в якому я захваті від передачі обʼєктів через пайп. Є, наприклад у мене команда з отакою сигнатурою:
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
Please open Telegram to view this post
VIEW IN TELEGRAM
Свій перший код на #BASIC я написав в шість років (А ви? Розкажіть, може?) на якомусь радянському клоні спектрума, хоча в ті часи цього ще не усвідомлював. Я був у «компьютерно-англійському» першому класі, проте, вже за півтора року він став звичайним, а інформатику нам перестали викладати. Свій же компʼютер у мене зʼявився аж за вісім років від першої написаної програми — коли мені було 14.
Жили ми доволі бідно, тож у мене не те що компʼютера не було, а навіть «денді», не кажучи вже про «сегу». Якийсь час був Brick Game aka «тетріс», який на жаль зник (найбільш ймовірно його спиздив сусід по поверху, мати-алкоголічка якого варила ширку для наркоманів).
Але потяг до компʼютерної тематики у мене з дитинства. Тож коли була змога, я ходив по друзях, у котрих вже були компи (дякую вам, до речі🥰 ) або хоча б приставки. Решту ж часу з розваг у мене були походи в компʼютерні магазини, де можна було подивитися на свіжі технологічні надбання, а також набрати прайс-листів, щоб скласти собі черговий (чи не щотижневий) конфіг своєї мрії. В деяких магазах мене навіть в обличчя вже знали 😁
А ще існувала радянська книжка «Энциклопедия профессора Фортрана» (росіянською звісно). У мене її не було, але мені друган давав почитати, тож я її мільйон разів прочитав, мабуть.
І короч в книзі була схема, яку можна було перенести на папір, вирізати та склеїти собі мале-е-е-енький паперовий компʼютер! Я це також неодноразово робив, уявляючи, як офігезно буде мати колись справжній.
Отже, це все був вступ. Я просто натрапив на сайт з паперовими (кольоровими!) моделями різних старих пристроїв, і мені згадалося ) Треба якийсь гештеґ на кшталт «дід знов забув про таблетки».
Жили ми доволі бідно, тож у мене не те що компʼютера не було, а навіть «денді», не кажучи вже про «сегу». Якийсь час був Brick Game aka «тетріс», який на жаль зник (найбільш ймовірно його спиздив сусід по поверху, мати-алкоголічка якого варила ширку для наркоманів).
Але потяг до компʼютерної тематики у мене з дитинства. Тож коли була змога, я ходив по друзях, у котрих вже були компи (дякую вам, до речі
А ще існувала радянська книжка «Энциклопедия профессора Фортрана» (росіянською звісно). У мене її не було, але мені друган давав почитати, тож я її мільйон разів прочитав, мабуть.
І короч в книзі була схема, яку можна було перенести на папір, вирізати та склеїти собі мале-е-е-енький паперовий компʼютер! Я це також неодноразово робив, уявляючи, як офігезно буде мати колись справжній.
Отже, це все був вступ. Я просто натрапив на сайт з паперовими (кольоровими!) моделями різних старих пристроїв, і мені згадалося ) Треба якийсь гештеґ на кшталт «дід знов забув про таблетки».
Please open Telegram to view this post
VIEW IN TELEGRAM
Якось розмовляли з друганом про можливість зробити GUI/TUI для роботи з логами, зокрема в JSON-форматі.
І якщо ви досі не перейшли на #Nushell, як це зробив я, то вам може стати в пригоді його плагін для Neovim, що дозволяє наживо фігачити
І якщо ви досі не перейшли на #Nushell, як це зробив я, то вам може стати в пригоді його плагін для Neovim, що дозволяє наживо фігачити
jq
-запити. Не забудьте поставити зірочку на репу.GitHub
GitHub - kri4er/telescope-jq.nvim: Telescope plugin providing jq functionality for neovim
Telescope plugin providing jq functionality for neovim - kri4er/telescope-jq.nvim
Зараз буде багато тексту.
Вчора раптом отримав інсайт щодо код-ревʼю, коли мені робили дизайн-ревʼю слайдів для презентації.
Я вже писав про це раніше, але передісторія така:
Робив програмістам-плюсовикам на роботі доповідь під назвою «Want to get better at C++? Learn other languages». Ну, не скажу, що ідея капець яка свіжа, але це те, в що я сам вірю: доволі складнувато, якщо взагалі можливо, стати професійним програмістом, коли ти нічого окрім C++ не бачив, бо знання мови хоч і важливе, але точно не на першому і навіть не на другому місці за пріоритетом. А серед плюсистів воно ж часто як: пишуть на плюсах, можливо навіть бачили Python, який зневажають, а решту взагалі ігнорують.
Потім треба було мені зробити пʼятихвилинний lightning talk вже на ширшу аудиторію, де і різних програмістів більше, та й інші тестувальники та ПМи присутні. Але моя тема масштабується на будь-що насправді, бо я особисто постійно вбачаю паралелі у всьому та намагаюся використовувати всі свої знання з різних сфер.
Так короч, я свої слайди трохи спростив та адаптував. По-перше, не хотів робити їх занадто технічними, а по-друге, хотів зробити свою доповідь більш легковажною та фановою.
А тут контора вирішила зробити публічне ревʼю презентацій від охочих. Я звісно одразу зголосився, бо люблю отримувати фідбек. І от дизайнерка сиділа та коментувала різні помилки та можливості покращити.
Наведу декілька прикладів своїх слайдів та коментарів на них:
Вчора раптом отримав інсайт щодо код-ревʼю, коли мені робили дизайн-ревʼю слайдів для презентації.
Я вже писав про це раніше, але передісторія така:
Робив програмістам-плюсовикам на роботі доповідь під назвою «Want to get better at C++? Learn other languages». Ну, не скажу, що ідея капець яка свіжа, але це те, в що я сам вірю: доволі складнувато, якщо взагалі можливо, стати професійним програмістом, коли ти нічого окрім C++ не бачив, бо знання мови хоч і важливе, але точно не на першому і навіть не на другому місці за пріоритетом. А серед плюсистів воно ж часто як: пишуть на плюсах, можливо навіть бачили Python, який зневажають, а решту взагалі ігнорують.
Потім треба було мені зробити пʼятихвилинний lightning talk вже на ширшу аудиторію, де і різних програмістів більше, та й інші тестувальники та ПМи присутні. Але моя тема масштабується на будь-що насправді, бо я особисто постійно вбачаю паралелі у всьому та намагаюся використовувати всі свої знання з різних сфер.
Так короч, я свої слайди трохи спростив та адаптував. По-перше, не хотів робити їх занадто технічними, а по-друге, хотів зробити свою доповідь більш легковажною та фановою.
А тут контора вирішила зробити публічне ревʼю презентацій від охочих. Я звісно одразу зголосився, бо люблю отримувати фідбек. І от дизайнерка сиділа та коментувала різні помилки та можливості покращити.
Наведу декілька прикладів своїх слайдів та коментарів на них:
Щойно дізнався від @dmytrish про таку крутецьку штуку як Kaitai Struct. Це декларативний парсер бінарних даних, який вміє генерувати код під різні мови, зокрема для C++ (а не C! 😌 ) .
Мені буквально нещодавно треба було запарсити віндовий
А Kaitai, схоже, генерує код під ES5 як раз, бо я не побачив там якогось свіжішого синтаксису. Доведеться знов дістати ту ініціативу зі скрині відкладених проєктів.
Мені буквально нещодавно треба було запарсити віндовий
ico
-формат в JavaScriptʼі, й у npmʼі авжеж є якісь готові ліби, але в тому середовищі, під яке я писав, дуже старий JS-рантайм (ECMAScript 5). Вручну все писати також впадлу.А Kaitai, схоже, генерує код під ES5 як раз, бо я не побачив там якогось свіжішого синтаксису. Доведеться знов дістати ту ініціативу зі скрині відкладених проєктів.
Please open Telegram to view this post
VIEW IN TELEGRAM
kaitai.io
Kaitai Struct: declarative binary format parsing language
Kaitai Struct is a formal language for binary format specification that can be compiled into parser code
Cіпласпластик
Свій перший код на #BASIC я написав в шість років (А ви? Розкажіть, може?) на якомусь радянському клоні спектрума, хоча в ті часи цього ще не усвідомлював. Я був у «компьютерно-англійському» першому класі, проте, вже за півтора року він став звичайним, а інформатику…
Please open Telegram to view this post
VIEW IN TELEGRAM
Кому #ШІ-шку прям в телеграмі? Microsoft розробила офіційний телеграм бот для Copilot: так і називається, їй-богу — @CopilotOfficialBot. Якось працює, навіть доволі непогано, хоча просить номер телефона з ними зашарити.
Мене вразило не стільки те, що до телеграму прикрутили ШІ-шку у вигляді бота (бо самописних на ґітгабі вистачало й до того), скільки той факт, що Microsoft написала щось для Telegram.
Це як акт визнання існування останнього великими компаніями. Тобто серйозні справи вже пішли, серйозна гра. А значить, надалі ставатиме тільки гірше🙂 — час шукати, куди звідси ливати 🧐
Мене вразило не стільки те, що до телеграму прикрутили ШІ-шку у вигляді бота (бо самописних на ґітгабі вистачало й до того), скільки той факт, що Microsoft написала щось для Telegram.
Це як акт визнання існування останнього великими компаніями. Тобто серйозні справи вже пішли, серйозна гра. А значить, надалі ставатиме тільки гірше
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
Microsoft Copilot
Your everyday AI companion, here to make life easier and talk about anything. Always here for you!
Media is too big
VIEW IN TELEGRAM
Мені трапився черговий «веббраузер»(?) — Kosmik. Цього разу маємо безкінечне полотно, на яке можна пхати різні зображення, PDF-ки, посилання, текст, наліпки тощо. Тобто в принципі те саме, що вже 20 років є у OneNote, тільки вебкліпер раніше був у браузері, а тепер навпаки браузер вбудований у програму. Хоча сама програма на електроні — тож теж браузер. А ще її можна запустити всередині звичайного браузера 😵💫 Kosmik ще й не зовсім безплатний до того ж.
Я потикався і бачу, що користуватися не буду, але сюди вирішив скинути. Тиждень був важкий, а я давно сюди нічого не писав — ще відписуватися почнете🙁
Я потикався і бачу, що користуватися не буду, але сюди вирішив скинути. Тиждень був важкий, а я давно сюди нічого не писав — ще відписуватися почнете
Please open Telegram to view this post
VIEW IN TELEGRAM
Намагаюся частіше використовувати фічі останніх стандартів C++, зокрема ranges. Тож у мене доволі багацько коду на кшталт такого:
Але рядок швидко стає немаленьким завширшки, особливо з плюсовим синтаксисом, як ви можете собі уявити. А clang-format форматує код отак:
Тобто пайп ставить в кінці рядка, а наступний рядок починає під початком першого слова у виразі. Тут для краси
Для clang-format
Дратувало мене це — просто жах, але як так налаштувати його, щоб у мене око не тіпалося — хз. Вирішив спитати #ШІ, бо думав, може, пропустив якесь спеціальне налаштування на цей випадок. А ШІ-шка мені: «так ти просто коментар порожній в кінці рядка лишай»🤯
Тепер clang-format бачить, що між операндом та пайпом ще токен коментаря стоїть, і йому доводиться писати пайп з нового рядка )
Так, ШІ-шка цьому десь навчилася теж, але я сам щось не допетрав до такого рішення.
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
Сьогодні компілятор мене тролить. Пишу, знач, у себе в коді:
А він мені:
«Не можу», — каже, — «справа від
А він у відповідь:
Короч, зліва теж не можна. Чого одразу не сказати щось на кшталт «не пиши initializer list в тернарніку»‽ Як у тому анекдоті про програмістів — максимально точна відповідь, яка, втім, не несе жодної користі.
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 в тернарніку»‽ Як у тому анекдоті про програмістів — максимально точна відповідь, яка, втім, не несе жодної користі.
This media is not supported in your browser
VIEW IN TELEGRAM
Зацініть мою знахідку: черговий клієнт для #Git — debase!
Цього разу це не просто #CLI чи прога з ненависним графічним інтерфейсом. Цього разу це #TUI, тож взяли все ваше найулюбленіше з обох підходів: неможливість показувати нормальну деталізовану графіку + необхідність користуватися мишкою🤡 План надійний, як швейцарський годинник.
Втім виглядає симпатично )
Цього разу це не просто #CLI чи прога з ненависним графічним інтерфейсом. Цього разу це #TUI, тож взяли все ваше найулюбленіше з обох підходів: неможливість показувати нормальну деталізовану графіку + необхідність користуватися мишкою
Втім виглядає симпатично )
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Ну добре, а тепер вже без жартів корисна #TUI-прога, яку я років пʼять назад знайшов — pgcli. Це REPL для Postgres з автодоповненням та табличками.
З цікавого: виявилося, що основна розробниця — родом з Харкова!
А взагалі ця прога є частиною більшої організації, в якій є подібні #тулзи під різні бази даних: https://www.dbcli.com.
До речі хороших і при цьому безплатних GUI-аналогів я може і не знаю навіть. Якщо вам спадає щось на думку, закидайте мене посиланнями, плз.
З цікавого: виявилося, що основна розробниця — родом з Харкова!
А взагалі ця прога є частиною більшої організації, в якій є подібні #тулзи під різні бази даних: https://www.dbcli.com.
До речі хороших і при цьому безплатних GUI-аналогів я може і не знаю навіть. Якщо вам спадає щось на думку, закидайте мене посиланнями, плз.
Cіпласпластик
Окей, трохи навчив Perplexity зʼясовувати походження та звʼязки виконавців. Потестив на якихось назвах, що знайшов у #Spotify — не вгадало тільки CHAINY. (ДахаБраха та Ragapop — це 🇺🇦 звісно, а Paul Sabin ніби хвранцуз). Цікаво, що на цій задачі Claude 3…
Лишу це тут без зайвих коментарів https://stopru.in.ua/ (хоча у мене особисто проблеми з ютубом як раз немає на відміну від спотіфая)
stopRU
stopRU - дерусифікатор YouTube
Розширення для браузера, яке допоможе вам натренувати Youtube не рекомендувати російські відео.
Cіпласпластик
До речі щодо ютубу. Готуючи свою презентацію, я покладався зокрема на ось цю чудову лекцію від професора Патріка Вінстона з MIT (який на жаль помер пʼять років тому, як я щойно дізнався 😢 ). Дивовижний приклад того, як чувак, розмовляючи доволі помірно й тихо, все одно зумів захопити мою увагу на цілу годину (хоча зазвичай у мене вже за пʼять хвилин починає дупа зудіти від нудьги). Я це відео вже двічі дивився навіть.
Зокрема, його рекомендації з оформлення слайдів для доповіді мені здалися вельми логічними, тож я їх прийняв для себе також, про що вже згадував раніше.
Зокрема, його рекомендації з оформлення слайдів для доповіді мені здалися вельми логічними, тож я їх прийняв для себе також, про що вже згадував раніше.
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
How to Speak
MIT How to Speak, IAP 2018
Instructor: Patrick Winston
View the complete course: https://ocw.mit.edu/how_to_speak
Patrick Winston's How to Speak talk has been an MIT tradition for over 40 years. Offered every January, the talk is intended to improve your…
Instructor: Patrick Winston
View the complete course: https://ocw.mit.edu/how_to_speak
Patrick Winston's How to Speak talk has been an MIT tradition for over 40 years. Offered every January, the talk is intended to improve your…
Натрапив на вправи для вивчення #Zig, в яких треба фіксити поламаний код. Доволі цікавий підхід для знайомства з мовою.
Codeberg.org
exercises
Learn the ⚡Zig programming language by fixing tiny broken programs.