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

Мої емоджі:
https://t.me/addemoji/AdaptiveDevIcons
https://t.me/addemoji/VehicleBrands
Download Telegram
Cіпласпластик
Я вже якось згадував, що почав користуватись Warp як терміналом на macOS. Вирішив його спробувати, бо сподобалася (читайте — зійшлася з моєю) ідея блоків: фактично він просто групує команду з її аутпутом, що, втім, доволі зручно. Проте я ніяк не міг позбутися…
Хотів, було, розповісти вам, як я успішно перейшов з #zsh остаточно на #fish пару тижнів тому, бо останній значно прикольніший: більш людяний синтаксис, легший для сприйняття, ну й в цілому цікавий чи що. Проте на fish я надовго не затримався, бо виявилося, що є ще крутіші альтернативи. Навіть трохи шкода 😢

Колись давно я дізнався про #PowerShell від Microsoft і був до глибини душі вражений, що вони реалізували передачу структурованих обʼєктів замість тексту через пайп, адже і сам мріяв про таке давно 🙂 Але з павершелом врешті не зайшло, хоча я навіть книгу прочитав. Не тому, що він поганий абощо — ні, він навпаки чудовий, а ті, хто стверджує протилежне, просто жодного разу ним не користувалися, мабуть. Мені, наприклад, дуже подобається їх схема імен а ля Verb-Noun. Не дуже лаконічно, зате зрозуміло. Але в якийсь момент я відчув, що для ефективного використання треба глибше пірнати в .NET, а мені воно було не в тему. Та годі про PowerShell.

Я натрапив на Nushell! Він також передає структуровану інформацію через пайп, але є й інші цікавинки. Наприклад, змінні там по дефолту immutable, що спонукає писати в більш функціональному стилі. Загалом відчувається якась атмосфера Haskell трохи. Синтаксис лямбд при цьому скоріше як в Ruby. Іще цей шел не POSIX-сумісний, що безперечно є додатковою перевагою 😉 Окремо варто згадати, що він не інтерпретує вирази, а компілює: з перевіркою типів, нормальними повідомленнями про помилки — з усіма ніштяками отже.

Той факт, що через пайпи передаються структуровані дані, наприклад той же JSON, також означає, що потенційно нарешті не потрібен jq. Я тут щойно погрався і за пару хвилин зміг порахувати кількість рядків коду та ін., що ми написали в останньому тримісячному проєкті:
> let excludes = [**/3rdparty/** **/node_modules/**]
> glob **/*.{cpp,hpp,qml,js} --exclude $excludes | each { |f|
open $f | str stats
} | math sum
╭───────────┬────────╮
│ lines │ 22169 │
│ words │ 44291 │
│ bytes │ 516740 │
│ chars │ 516714 │
│ graphemes │ 516714 │
╰───────────┴────────╯

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

Спробую пожити з #Nushell як з дефолтним, бо цікава штука.
Please open Telegram to view this post
VIEW IN TELEGRAM
А які взагалі юзкейси шел-скриптів? Нащо люди їх пишуть?

Для автоматизації, ага, але автоматизації чого?

Наприклад, у мене завжди виникала проблема початкового налаштування операційної системи після установки. Ну, ви знаєте… Поставити потрібні програми, підкинути пару конфігів, створити якісь змінні оточення, прописати шляхи. І я, коли ще був на вінді, почав з простого BAT-файлу, який згодом перетворився на #PowerShell-скрипт. Потім набридло це підтримувати авжеж, бо я вінду з нуля ставив раз на пʼять років.

Однак зараз у мене є три серваки: один хатній NAS та 2 VPS на погратися — і проблема знов виникла. Найгірше, це коли треба щось змінити в конфігурації, а ти вже не памʼятаєш, як взагалі щось налаштовував (бо знов-таки робиш це раз на декілька років). Отож, щоб з цим розібратися, я нарешті опанував #Ansible на базовому рівні минулого тижня, про існування котрого знаю давно, але все ліньки було зайнятися. І це прям гейм-чейнджер — я тепер навіть локально буду все ним налаштовувати, мабуть.

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

Обробка даних? Не можу уявити випадок, коли шел-скрипт став би правильнішим рішенням за написання простої програми на #Python.

Лишаються тільки ad hoc адміністрування якесь (хоча в залежності від деталей, може навіть тут краще використати Ansible) та, власне, композиція пайпа з декількох тулів в одній команді. І тут якнайкраще показує себе згаданий в попередньому дописі #Nushell.

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

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

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

Були авжеж і труднощі. Найголовніше: про Nushell ніхто не знає 🙂 Тож якщо вам треба якось інтегрувати собі #pyenv чи може #homebrew, то доводиться робити це вручну (а для цього інколи доводиться читати bash-скрипти 😭), але в принципі у мене працює все, що мені було потрібне.

І ВСЕ Ж! Найкорисніше покращення, що я колись впроваджував у термінал, насправді працює в будь-якому шелі:
alias учше=exit

Не дякуйте )
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
Якось розмовляли з друганом про можливість зробити GUI/TUI для роботи з логами, зокрема в JSON-форматі.

І якщо ви досі не перейшли на #Nushell, як це зробив я, то вам може стати в пригоді його плагін для Neovim, що дозволяє наживо фігачити jq-запити. Не забудьте поставити зірочку на репу.
Вирішив трохи доналаштувати собі #Nushell. У процесі відкрив для себе деякі нові #тулзи.

По-перше, це vivid, яка підбирає кольори $env.LS_COLORS під вашу кольорову схему. Я собі це зробив, бо раніше виглядало ще гірше, проте, якщо чесно, це лайно якесь. Воно все барвисте, але ці кольори для мене нічого не значать, тож виникає питання: а навіщо? Думаю, що в ідеалі я б собі лишив можливість відрізняти теки, файли та симлінки — й вистачить. Але впадлу розбиратися.

По-друге, це carapace. Як ви розумієте, під Nushell мало хто з розробників тулів робить custom completions на відміну від Bash/Zsh. Для деяких популярних штук типу ґіта існують доповнення, написані на Nu, але їх дуже незручно встановлювати, бо якийсь пекедж-менеджмент в Nushell досі на етапі зародження. А carapace — це, грубо кажучи, кросплатформний доповнювач, що вміє під різні шели генерувати доповнення з якогось узагальненого опису. Результат за якимсь хєром знов-таки різноколірний для деяких команд, та все ж це зручніше, ніж постійно набирати --help, щоб згадати, що там є.

Нагадую, що Nushell — це досі найкращий шел, котрим я користувався.