Cіпласпластик
Я вже якось згадував, що почав користуватись Warp як терміналом на macOS. Вирішив його спробувати, бо сподобалася (читайте — зійшлася з моєю) ідея блоків: фактично він просто групує команду з її аутпутом, що, втім, доволі зручно. Проте я ніяк не міг позбутися…
Хотів, було, розповісти вам, як я успішно перейшов з #zsh остаточно на #fish пару тижнів тому, бо останній значно прикольніший: більш людяний синтаксис, легший для сприйняття, ну й в цілому цікавий чи що. Проте на 😢
Колись давно я дізнався про #PowerShell від Microsoft і був до глибини душі вражений, що вони реалізували передачу структурованих обʼєктів замість тексту через пайп, адже і сам мріяв про таке давно🙂 Але з павершелом врешті не зайшло, хоча я навіть книгу прочитав. Не тому, що він поганий абощо — ні, він навпаки чудовий, а ті, хто стверджує протилежне, просто жодного разу ним не користувалися, мабуть. Мені, наприклад, дуже подобається їх схема імен а ля
Я натрапив на Nushell! Він також передає структуровану інформацію через пайп, але є й інші цікавинки. Наприклад, змінні там по дефолту immutable, що спонукає писати в більш функціональному стилі. Загалом відчувається якась атмосфера Haskell трохи. Синтаксис лямбд при цьому скоріше як в Ruby. Іще цей шел не POSIX-сумісний, що безперечно є додатковою перевагою😉 Окремо варто згадати, що він не інтерпретує вирази, а компілює: з перевіркою типів, нормальними повідомленнями про помилки — з усіма ніштяками отже.
Той факт, що через пайпи передаються структуровані дані, наприклад той же JSON, також означає, що потенційно нарешті не потрібен
Серед читачів безперечно є хтось, хто зараз може вийти зі своїм магічним ванлайнером на баші, седі, перлі та
Спробую пожити з #Nushell як з дефолтним, бо цікава штука.
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.
Які ваші юзкейси?
Для автоматизації, ага, але автоматизації чого?
Наприклад, у мене завжди виникала проблема початкового налаштування операційної системи після установки. Ну, ви знаєте… Поставити потрібні програми, підкинути пару конфігів, створити якісь змінні оточення, прописати шляхи. І я, коли ще був на вінді, почав з простого BAT-файлу, який згодом перетворився на #PowerShell-скрипт. Потім набридло це підтримувати авжеж, бо я вінду з нуля ставив раз на пʼять років.
Однак зараз у мене є три серваки: один хатній NAS та 2 VPS на погратися — і проблема знов виникла. Найгірше, це коли треба щось змінити в конфігурації, а ти вже не памʼятаєш, як взагалі щось налаштовував (бо знов-таки робиш це раз на декілька років). Отож, щоб з цим розібратися, я нарешті опанував #Ansible на базовому рівні минулого тижня, про існування котрого знаю давно, але все ліньки було зайнятися. І це прям гейм-чейнджер — я тепер навіть локально буду все ним налаштовувати, мабуть.
З адмініструванням розібралися. Білди? Знов-таки, краще використовувати нормальну білд-систему, яке не тільки більш контрольована, ніж шел-скрипт, але й швидше працюватиме вірогідно.
Обробка даних? Не можу уявити випадок, коли шел-скрипт став би правильнішим рішенням за написання простої програми на #Python.
Лишаються тільки ad hoc адміністрування якесь (хоча в залежності від деталей, може навіть тут краще використати Ansible) та, власне, композиція пайпа з декількох тулів в одній команді. І тут якнайкраще показує себе згаданий в попередньому дописі #Nushell.
Які ваші юзкейси?
Udemy
Udemy Course Completion Certificate
My course completion certificate for "Ansible for the Absolute Beginner - Hands-On - DevOps"
Короч, я все-таки успішно перейшов повністю на #Nushell. Користування ним реально прискорює мені деякі речі, але не тому, що він там працює якось швидше або дозволяє зробити те, чого не дозволяє зробити #Bash, а просто тому, що я інтуїтивно значно швидше знаходжу спосіб досягти своєї мети саме в ньому.
Я виріс на #DOS та #Windows, тож мене вся ця ваша #unix-ідеологія завжди трохи піддратовувала: зокрема через лицемірність щодо того, наче краще мати на кожну маленьку дію окрему штуку, яка її виконує і яку можна легко компонувати з іншими такими штуками, але на практиці у нас є десяток команд, зате в кожній по сотні
А ось Nushell залетів аж бігом, бо він дуже схожий на мови програмування, якими я й так користуюся. Врешті, як відомо, інтуїція = знання + досвід. Ну й оперувати структурованими даними завжди приємніше, ніж масивом неструктурованого тексту.
Були авжеж і труднощі. Найголовніше: про Nushell ніхто не знає🙂 Тож якщо вам треба якось інтегрувати собі #pyenv чи може #homebrew, то доводиться робити це вручну (а для цього інколи доводиться читати bash-скрипти 😭 ), але в принципі у мене працює все, що мені було потрібне.
І ВСЕ Ж! Найкорисніше покращення, що я колись впроваджував у термінал, насправді працює в будь-якому шелі:
Не дякуйте )
Я виріс на #DOS та #Windows, тож мене вся ця ваша #unix-ідеологія завжди трохи піддратовувала: зокрема через лицемірність щодо того, наче краще мати на кожну маленьку дію окрему штуку, яка її виконує і яку можна легко компонувати з іншими такими штуками, але на практиці у нас є десяток команд, зате в кожній по сотні
--ключів
. Ну короч, не зміг я себе змусити цим користуватися. А ось Nushell залетів аж бігом, бо він дуже схожий на мови програмування, якими я й так користуюся. Врешті, як відомо, інтуїція = знання + досвід. Ну й оперувати структурованими даними завжди приємніше, ніж масивом неструктурованого тексту.
Були авжеж і труднощі. Найголовніше: про Nushell ніхто не знає
І ВСЕ Ж! Найкорисніше покращення, що я колись впроваджував у термінал, насправді працює в будь-якому шелі:
alias учше=exit
Не дякуйте )
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
Cіпласпластик
Хотів, було, розповісти вам, як я успішно перейшов з #zsh остаточно на #fish пару тижнів тому, бо останній значно прикольніший: більш людяний синтаксис, легший для сприйняття, ну й в цілому цікавий чи що. Проте на fish я надовго не затримався, бо виявилося…
Читав днями допис (до речі дуже подобається канал, рекомендую!), де чувак пише, як він підходить до завантажень відео з вебсайтів. А у мене як раз була подібна ситуація, коли я теж хотів щось злити з сайту, а там відоса як такого не було, і щось я не второпав, як це зробити.
Так ось я згадав, що то було. Дружина колись давно купила курс, який хоститься на сайті 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
Якось розмовляли з друганом про можливість зробити 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
Вирішив трохи доналаштувати собі #Nushell. У процесі відкрив для себе деякі нові #тулзи.
По-перше, це vivid, яка підбирає кольори
По-друге, це carapace. Як ви розумієте, під Nushell мало хто з розробників тулів робить custom completions на відміну від Bash/Zsh. Для деяких популярних штук типу ґіта існують доповнення, написані на Nu, але їх дуже незручно встановлювати, бо якийсь пекедж-менеджмент в Nushell досі на етапі зародження. А
Нагадую, що Nushell — це досі найкращий шел, котрим я користувався.
По-перше, це vivid, яка підбирає кольори
$env.LS_COLORS
під вашу кольорову схему. Я собі це зробив, бо раніше виглядало ще гірше, проте, якщо чесно, це лайно якесь. Воно все барвисте, але ці кольори для мене нічого не значать, тож виникає питання: а навіщо? Думаю, що в ідеалі я б собі лишив можливість відрізняти теки, файли та симлінки — й вистачить. Але впадлу розбиратися.По-друге, це carapace. Як ви розумієте, під Nushell мало хто з розробників тулів робить custom completions на відміну від Bash/Zsh. Для деяких популярних штук типу ґіта існують доповнення, написані на Nu, але їх дуже незручно встановлювати, бо якийсь пекедж-менеджмент в Nushell досі на етапі зародження. А
carapace
— це, грубо кажучи, кросплатформний доповнювач, що вміє під різні шели генерувати доповнення з якогось узагальненого опису. Результат за якимсь хєром знов-таки різноколірний для деяких команд, та все ж це зручніше, ніж постійно набирати --help
, щоб згадати, що там є.Нагадую, що Nushell — це досі найкращий шел, котрим я користувався.