#%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%83%D0%B2%D0%B0%D0%BD%D0%BD%D1%8F

Найменшенькийbalaraz@social.net.ua
2025-10-17

error та undefined це не звичайні функції. Крім того, що вони поліморфні, та ще й переривають виконання.

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

Їхній поліморфізм полягає в типі повернення, й потрібен для того, щоб можна було їх викликати будь-де.

λ> error "Упс, щось не так."
*** Exception: Упс, щось не так.
CallStack (from HasCallStack):
  error, called at <interactive>:4:1 in interactive:Ghci1
λ> undefined
*** Exception: Prelude.undefined
CallStack (from HasCallStack):
  undefined, called at <interactive>:5:1 in interactive:Ghci1

#ukrhaskell #haskell #error #undefined #поліморфізм #програмування

Найменшенькийbalaraz@social.net.ua
2025-10-14

Окрім виразу let in є ще схожа конструкція where. Вона виконує ту ж функцію, але трохи по інакшому.

g n = x+2*x where x = n^3+2

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

f x | x > 0 = y * 2
    | x < 0 = y / 2
  where y = cos x^2

На жаль приклад дуже не дуже, але є що є.

Тут оголошені функції після whare можна використовувати в усіх визначеннях f, й навіть в охоронних виразах. let in такого не дозволяє.

#ukrhaskell #haskell #where #letin #вираз #конструкція #підфункції #охоронні_вирази #програмування

Івась Тарасикtivasyk@social.net.ua
2025-06-02

#щоденник | експерименти з yq.

практичне використання yq для спрощення обробки дописів із yaml-заголовками.

tl;dr — півскрипта можна замінити одним рядком… але воно в 20 разів повільніше (бо версія yq в arch — на python'і).

https://codeberg.org/tivasyk/blog.text/src/branch/master/posts/2025/2025-06-01-yq.markdown

про #програмування на #bash #українською

@rada

2025-05-21

Тести, дебаг та обережність

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

Спочатку я рухався дуже обережно — рядочок тут, перевірочка там. Щоб нічого не поламати. Згодом збагнув, що поки я запускаю тести локально, я нічого ніколи не поламаю, та можна робити будь-які зухвалі зміни, аби швидше знайти причину.

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

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

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

А наприкінці виявилось, що я забув, що go test ./... запускає пакети тестів паралельно. І тільки з опцією -p 1 - ні. Так що на цей раз моя проблема мала дуже просте рішення — яке я не бачив через власні переконання. (І ще через купу інших можливих причин, які довелося відкинути.) 😅

#Програмування

2025-05-20

Асемблер та машинний код

В продовження поста про мови, якими пишуться інші мови, все ж залишається питання: а що в самому низу? Які інструкції розуміє компʼютер — що таке машинний код? Та чим він відрізняється від асемблера (мови програмування)?

Це взагалі цікаво, бо машинний код не складається з "найпростіших" інструкцій, тобто він не є "в самому низу" (хоча що це взагалі означає?) Зокрема, інструкції Intel x86 взагалі можуть містити в себе цілу підпрограму, як-от мені колись допомогла інструкція POPCNT для підрахунку бітів. І вона не найскладніша. Але — машинний код це найнижчий рівень, на який може залізти програміст, тому не більше й не менше, він розмежовує програмне та "апаратне".

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

(Те, що він є "двійковим", мало що змінює. В компʼютері все "двійкове". Як є редактор для тексту, так само може бути редактор для машинного коду. І є — наприклад, ImHex це вміє.)

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

Але чого в машинному коді дійсно не вистачає, це імен. Та ти недооцінюєш, наскільки імена важливі в програмуванні! Бо в машинному коді всі посилання як на дані (змінні), так і на код (розгалуження, цикли, процедури) відбуваються за адресою. А адреса — річ не стала. Захотіли додати інструкцію до гілки — та вже всі адреси нижче треба зсувати. Додали змінну — треба знайти, куди її пристроїти. До того ж — ніяких назв, а одні чисельні адреси (ще й інколи — абсолютні, інколи — відносні). Все це — надзвичайно ускладнює розробку.

Тобто в цілому машинний код можна писати, але гарно б доповнити можливістю призначати імена, а також залишати коментарі. Вітаю, ми винайшли найпростішу мову програмування - асемблер!

#Програмування

2025-05-17

Якою мовою пишуться мови програмування?

Отримав (від дружини!) таке цікаве запитання. Бо, власне, чи є тут якась драбина мов, та якщо є — то де вона закінчується?

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

Втім, як вийти з цього парадоксу курки та яйця? Тут зазначу, що є два різновиди мов. Компільовані мови перетворюються в машинний код, який вже не залежить від самої мови. А значить, достатньо першу версію компілятора написати іншою мовою, а згодом, маючи скомпільований компілятор, переписати його "рідною". Так було з С, C++, Go, Rust, Haskell тощо.

Інтерпретовані мови завжди виконуються в контексті іншої програми — інтерпретатора. Тому інтерпретатор доведеться написати компільованою мовою — за власні підтяжки себе не витягнеш. Наприклад, Ruby та Python написані на C - матері всіх мов. Але більша частина інструментів та бібліотек все одно пишеться рідною мовою.

Є ще мови з віртуальною машиною — це дещо посередині. Їхній код компілюється не в машинний, а в код віртуальної машини (байт-код). Та компілятор цей пишеться рідною мовою. А сама віртуальна машина — повноцінною компільованою мовою. Наприклад, машини Erlang та Java написані знову на C.

Отже, виходить так: зрілі компільовані мови написані самі собою, а інтерпретовані — зазвичай на C/C++. Мови із віртуальною машиною - 50 на 50.

#Програмування

2025-05-16

OpenAI представила Codex – нову ШІ-систему, що допомагає програмістам писати код швидше та ефективніше. Дізнайтеся, як працює цей "ШІ-парний програміст" та які його перспективи.

Детальніше: newsua.us/node/6902

2025-05-14

OpenAI, розробник ChatGPT, веде переговори про придбання популярного ШІ-інструменту для програмістів Windsurf за $3 млрд. Дізнайтесь деталі потенційної угоди.

Детальніше: newsua.us/node/6672

2025-05-14

Чому копіпаста — це погано?

Метою написання коду завжди є те, щоб він був зрозумілим. З нуля ми пишемо код один раз, а дописуємо — всю решту часу. Незрозумілий код — це не краще, ніж невірний (бо, по-перше, звідки ти знаєш, що він вірний?) Отже, всякий код повинен насамперед легко читатись, а потім вже все інше.

Копіпаста (а саме, скопійований багато разів код) погана не тільки тим, що вона повторюється. Тоді можна було б її більш-менш ігнорувати. Значно гірше, що копіпаста рідко повторюється дослівно, та ми ніколи не знаємо, чи це так. Доводиться серед нудних повторюваних рядків "знайти 10 відмінностей". Або — скоріше — просто проґавити.

З появою ШІ це тільки стало гостріше, бо ШІ, на відміну від людини, обробить весь текст з рівною увагою, а значить, найважливішими стануть ті рядки, що повторюються, хоча повинно бути навпаки. ШІ взагалі майстер "згладити нерівності". А з іншого боку, ШІ залюбки згенерує вам скільки завгодно копіпасти, створивши собі ж пастку на майбутнє. Цьому треба активно запобігати.

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

#Програмування #ПомічникШІ

2025-05-03

Синдром непотрібного узагальнення

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

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

Або приклад, який я й помітив: оцінка тривалості задачі. Теоретично, вона може бути будь-яка. Але фактично, мене цікавить: чи встигну я зробити задачу десь в перерві (5-10 хвилин), або чи встигну за "підхід", тобто за одну-дві години. А якщо довше, то її вже можна розбивати, бо фактично більшого безперервного відрізка часу в мене не буде. Отже, немає сенсу думати про точну тривалість у хвилинах.

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

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

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

#Програмування

Пан Орестуняforesle@wrong.city
2025-04-01

Я ж вникаю у Qt6 (PySide6, QML, Qt Quick). Пишу додаток про який згадував раніше в контексті обмежень у першій версії на Go. Пройшов найпершу, вхідну частину курсу про QML на Qt Academy. Як завжди курс був спрямований для новачків, що пояснював очевидні речі, але я повискубував важливі речі і намагаюся ліпити головний QML документ мого застосунку, опираючись на документацію. Складно писати на QML, бо давно проєктував щось на Qt чи Gtk. Інколи важко згадати, як називається той чи інший елемент інтерфейсу. Думаю спробувати зліпити потрібний інтерфейс у форматі UI в Qt Designer і вже потім знову спробувати написати QML документ враховуючи потрібні відступи і тому подібне без постійного вгадування та перевірки як воно виглядатиме, бо це займає багато часу. Тут як з HTML+CSS з часом вже підсвідомо розумієш, як воно виглядатиме та швидкість верстання значно зростає.

#Програмування #GoLang #Python #Qt #QML #PySide6 #QtQuick

Без Купюр Кропивницькийkypurnet
2025-03-29

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

kypur.net/sydiv-u-shahti-z-nou

Новини Українськоюrss_ukr_news
2025-01-26
Йоте :verified_blue:joter@social.net.ua
2025-01-23
Поцікавився Elixir мовою програмування і трохи в захваті від слів що якщо раніше треба було 100 серверів то з elixir достатньо 2. З веб фреймворком Pheonix можна легко обслуговувати 2_000_000 користувачів одночасно. Якщо це дійсно так, то для social.net.ua зараз це крапля в морі, так як має тільки 50 активних користувачів, з потенціалом на мою думку 20_000 має потягнути.

https://youtu.be/lxYFOM3UJzo

#Elixir #мовапрограмування #програмування
2024-10-25

#ПідпишітьсяУПʼятницю або #ПідпишітьсяУСуботу на @justine в неї неймовіний опис.

Друг, кохана, сестра, мати та дружина
Любить готувати
Linux, BSD chick (каченя)
Мобільні телефони: #Fairphone4 #OnePlus6T #OnePlus6 #PinePhonePro
Годинник PineTime
Hand wired #Pico #QMK #Keyboard builder
#ThinkPad власниця
Щоденне використання - #ChimeraLinux з #RiverWM та #Eww оскільки моя панель працює на рідній зашифрованій файловій системі #ZFS

Редактор: #HelixEditor
HomeLab: #FreeBSD

Цей екземпляр працює на #Snac, тому не відображатиме жодних показників щодо тих, на кого я підписався, або моїх підписників.

Git: ✔ git.smithies.me.uk
Блоґ: ✔ justine.smithies.me.uk
Місце проживання: Cruden Bay, Scotland
Pronouns: She / Her

-------------------------
> Профайл був перекладений. А хотів просто написати про #snac з ґіт репозиторія codeberg.org/grunfink/snac2 який підримує ActivePub. Він мені сподобався простотоу і Мастоґон API можна повивчати і C мову програмування і покомпилювати.

#програмування #Лінукс #ГарніЛюди #ЧудовіЛюди #ЦікавіЛюди #ГарніЧудовіЦікавіЛюди #ПідпишисьУПʼятницю #ПідпишисьУСуботу

@ua @rada

Привіт. Я вже давно зробив бота @bot що генерує феді статус на основі посилання на пост у твітер. Але тепер ще є twima.knightpp.cc/. Це сайт що допомагає згенерувати пост і опублікувати його від вашого феді акаунту.

Але! Я не хочу підтримувати його, тому якщо це комусь цікаво прошу переписати :)

p.s. для використання треба ввійти у свій акаунт, двічі подумайте перед тим як уводити свій пароль.

#еліксир #еліксір #вільнепз #програмування

2024-10-17

37/365 Запровадження стріми в Java — це була помилка. Я ще ніколи не бачив такого зловживання стрімами як сьогодня. Повсюдно офНулайбл, мап, форЕатч, іфПрезент(Юсер::сетНаме). Так плюс ще і методи по одному рядку коду. Бажаю не захоплюйтесь клін кодом і не зловчивайте стрімами.

#291день #темадня #ОдинДеньОднаТема #програмування

Client Info

Server: https://mastodon.social
Version: 2025.07
Repository: https://github.com/cyevgeniy/lmst