Get Mystery Box with random crypto!

Wild Wild Web

Логотип телеграм -каналу wild_wild_web — Wild Wild Web W
Логотип телеграм -каналу wild_wild_web — Wild Wild Web
Адреса каналу: @wild_wild_web
Категорії: Без категорії
Мова: Українська
Передплатники: 809
Опис з каналу

Особистий канал Web-розробника з України, який з часом став Wild Wild. Частіше всього пишу про всякі цікавинки зі світу web, але бувають й інші теми, відірвані від web й не менш цікаві.

Ratings & Reviews

1.50

2 reviews

Reviews can be left only by registered users. All reviews are moderated by admins.

5 stars

0

4 stars

0

3 stars

0

2 stars

1

1 stars

1


Останні повідомлення 2

2022-06-11 19:29:59 OWASP ZAP та Burp Suite

Ми з вами поговорили про nmap, про те як з його допомогою аналізувати мережеві сервіси. І знати цю інформацію це дуже круто, а ще краще, знати які дані бігають між клієнтом та сервером! Знати, які запити йдуть на API, наприклад. Бачити весь трафік між клієнтом та сервером.

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

Але просто проксі це не цікаво. Я б не сів писати пост, якби питання було тільки в проксі

Що за OWASP ZAP чи Burp Suite?
Це інструментарій, який надає не тільки проксі, а й купу інших корисних (для хакерів) можливостей. В нього входять fuzzing атаки (про них я ще напишу окремий пост), можливість записувати історію запитів та показувати її в вигляді дерева, пасивне сканування на відомі вразливості та багато іншого — це комбайни у світі тестування вебаплікацій. Про це, навіть, говориться в самій назві одного з них - ZAP (Zed Attack Proxy).

Як виглядає процес на прикладі OWASP ZAP?
Ви запускаєте ZAP в себе на машині, та налаштовуєте його проксі на порту 8080, наприклад. Після цього, налаштовуєте свій браузер (чи не тільки браузер, за допомогою proxychains можна весь трафік перевести) на роботу через проксі. Для цього, в браузерних налаштуваннях вказуєте роботу через проксі 127.0.0.1:8080.

Маючи такі налаштування, ви можете починати переглядати вебаплікацію, шукати різні цікаві місця для можливих атак, а ZAP буде вести історію всіх запитів. Пізніше, ви зможете переглядати цю історію, бачити всі HTTP запити в чистому вигляді.

З історією запитів, які вам цікаві, ви можете їх редагувати. ZAP надає купу зручних інструментів для того, щоб перехоплювати запити, модифікувати їх по вашому бажанню і відсилати далі. А якщо вам треба буде кодувати зміст запиту, наприклад URL Encode-ом чи Base64, то в нього також це все передбачено і дуже зручно робиться в "пару кліків".

Як на практиці використовується ZAP?
Змоделюємо ситуацію, коли Frontend розробники витратили час на валідацію та захист даних, які передаються на сервер. Тобто, через форму в браузері, передати якийсь поганий запит не вийде.

Але Backend розробники, вони ті ще ліниві дупи (суджу по собі, впевнений що є нормальні), не захотіли робити всі валідації в себе, тому що Frontend розробники зробили ж.

В цій ситуації, ми за допомогою ZAP перехоплюємо всі запити на API. Маючи запит в історії, відкриваємо його в редакторі запитів і міняємо зміст на, наприклад, SQL ін'єкцію. Модифікований запит відправляється на сервер і ми отримуємо доступ до бази даних, завдяки цій ін'єкції. А якщо база даних криво налаштована, то і взагалі доступ до всієї машини, але це окрема історія на майбутнє.

Тобто, ZAP виконує роль посередника між клієнтом та сервером, інколи заміняючи клієнта повністю.

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

Коли у вас є історія запитів, ви просто вибираєте з неї цікавий endpoint, який має всі ознаки бути вразливим. Після чого, по натиску на "Active Scan", ви просто йдете пити каву. Якщо на цьому endpoint буде щось давно відоме та банальне, ZAP вам про це скаже і ви зможете це використати у своїх цілях.

Де про це можна детальніше почитати?
На Hack The Box академії є повноцінний курс, який розбирає ці два інструменти більше детально і надає вам практичні заняття. Посилання на цей курс - https://academy.hackthebox.com/course/preview/using-web-proxies.

Епілог
Я зловив себе на думці, що я зараз просто розказую про інструменти, які є у світі зломів. То я оце думаю, може краще піти не з наявних інструментів, які автоматизовують атаки, а про самі атаки розповідати? Спочатку розповісти про LFI, RCE, SSTI, та інші атаки. Як вони концептуально працюють. А потім вже, розповідати про автоматизацію? Що скажете? Чи може вам легше буде йти від інструментів до атак?
1.0K views16:29
Відкрити / Коментувати
2022-06-05 11:57:38 Збір інформації про мережеві сервіси

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

Що за nmap?
Nmap (Network MAPper) - це open source інструмент, який значно облегшує досліджування мереж. За його допомогою можна не лише подивитись які порти відкриті на машинці, а й багато другої корисної інформації: яка операційна система, який сервіс, чи є вразливості.

А ще, він досить ефективний, завдяки тому що він працює з "сирими" IP пакетами. Це дозволяє йому робити сканування по різних векторах: TCP SYN, TCP Connect, UDP Scan та багато інших. Коротше — це класика зі світу "дізнатись про мережеві сервіси та порти".

Що за вектори сканування?
Коли ми вибираємо вектор сканування, ми говоримо nmap які пакети варто використовувати при аналізі цілі.

Якщо нам цікаво перевірити, чи є порт 4444 активним TCP портом, то беремо TCP Connect, який тягне за собою весь процес зʼєднання з ним, що вартує нам часу. Якщо хочемо швидко перевірити всі порти від 1 до 65К, то можемо обрати TCP SYN, який лише відправляє SYN пакет і перевіряє чи була відповідь.

Знаючи про які пакети йде мова, ми можемо обʼєктивно обрати потрібний нам вектор. Наприклад, щоб просканувати всі відкриті TCP порти на цілі за вектором TCP SYN, достатньо викликати nmap з -sS (Scan SYN) та -p- (всі порти):

sudo nmap -p- -sS

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

Аналіз сервісів та їх версій
Nmap також має достатньо велику базу даних відбитків різних сервісів. Це дозволяє йому ідентифікувати який сервіс працює на порту. Сам процес ідентифікації називається probing або fingerprinting.

Для того, щоб ввімкнути цей режим, достатньо передати прапорець -sV (Scan Version). Після цього, nmap починає аналізувати інформацію, яку він здатний зібрати з сервісу. Наприклад, інформація з банера, який ви бачите на SSH сервісах, має достатньо інформації про те, щоб сказати що за операційна система і що за SSH сервіс працює:

sudo nmap -p 22 -sV

Результатом цієї команди буде інформація про те, що працює на 22 порту та яку версію має. Звісно ж, якщо в нього є на цей сервіс відбиток.

Скрипти на Lua?
Так, скрипти на Lua! В nmap є можливість писати свої скрипти на Lua, в нього є свій Scripting Engine. Більш того, в нього багато вбудованих скриптів, які можна викликати не вдаючись до написання своїх.

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

До прикладу, якщо ви знаєте, що на порту 80 працює HTTP сервер Apache httpd, то за допомогою скриптів із категорії http ми можемо дізнатись більше інформації. Для цього, використовується прапорець --script та * (wildcard для запуску всіх скриптів із цієї категорії):

sudo nmap -p 80 --script=http*

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

В нього є також і стандартний набір скриптів по замовчуванню, який можна викликати за допомогою -sC (те саме що й --script=default):

sudo nmap -p 80 -sC

Що за операційна система?
Так, в nmap це також є. Ви можете за допомогою прапорця -O попросити nmap проаналізувати яка операційна система та якої версії крутиться на сервері:

sudo nmap -O

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

А тепер все разом!
На цей випадок в nmap також є прапорець - -A. Якщо ви хочете провести повний аналіз порту, то ви можете використовувати цей прапорець і він зробить все те про що ми тут поговорили:

sudo nmap -p 80 -A

Багато іншого!
Я вже не влізаю, тому скажу що це не все, що вміє nmap. З його допомогою можна обходити фаєрволи, IDS (Intrusion Detection System) та IPS (Intrusion Prevention System) системи та інше. Про це все можна почитати на його сайті.
1.1K views08:57
Відкрити / Коментувати
2022-06-02 12:21:20 The curse of strong typing

Всім привіт! Сьогодні не буде лонгріду на 4096 символів, які зазвичай телеграм дозволяє відправити одним повідомленням. Але буде посилання на лонгрід від другого розробника - fasterthanlime

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

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

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

https://fasterthanli.me/articles/the-curse-of-strong-typing

P.S. В наступних постах я буду потрохи писати про різні тули, якими користуються пентестери для того, щоб автоматизовувати процес хакінгу. Так що буде і про nmap, і про sqlmap, і про ZAP та багато іншого, коротше має бути цікаво.
1.1K views09:21
Відкрити / Коментувати
2022-05-26 18:17:30 Penetration Testing Lifecycle

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

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

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

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

Які сервіси працюють? Чи є там FTP сервер? На якій CMS працює їх блог? І купа інших питань такого формату.

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

Threat Modelling
Маючи записи в нотатнику про систему, ми вже можемо починати робити припущення про вектори атаки. Чому я кажу "припущення"? Тому що, до прикладу, робочий FTP сервер ще не означає, що його можна буде зламати. Але ми можемо припустити, що цей сервер вразливий і на основі цього побудувати вектор атаки.

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

Vulnerability Analysis
На цьому кроці, відбувається детальний аналіз можливої вразливості. Для перевірки правдивості наших припущень існують так звані PoC (Proof of Concept) скрипти. Зазвичай вони не агресивні й не ставлять за ціль зламати систему (DoS) чи видалити всі дані. Вони лише перевіряють, чи вразливість дійсно існує.

До прикладу, PoC для перевірки RCE (Remote Code Execution) базується на викликах команд id, whoami або cat /etc/passwd. Якщо ви отримали результат — вразливість підтверджена.

Exploitation
Маючи підтверджену вразливість, її можна почати використовувати. Не відходячи далеко від прикладу з SMB сервером, ми отримуємо доступ до операційної системи без аутентифікації себе, як користувача (посилаюсь на EternalBlue вразливість).

А якщо ми можемо виконувати наші команди на цілі, то ми можемо й отримати дані для подальшої ескалації. До прикладу, прочитати приватні ключі користувачів для підʼєднання до SSH від їх імені.

Post Exploitation
Як тільки ми успішно експлуатували певну вразливість і отримали доступ до користувача, ми, скоріш за все, опинимось користувачем з обмеженими привілеями в системі.

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

У випадку успіху, ми отримуємо доступ від імені рута і, якщо нам це потрібно, ми можемо продовжувати Post Exploitation від імені рута і далі, до тих пір, поки ми не отримаємо те що нам потрібно.

Reporting
Остання фаза із циклу — звітність. Ми всі люди виховані, просто так ніхто нікого не атакує і не має цього робити. Якщо пентестери почали когось атакувати, то лише через legal consent тої сторони, яка дала на це згоду.

А ви, як професіонал, в кінці даєте їм звітність про їх вразливості, щоб вони могли їх закрити й таким чином вберегти себе від Black Hat хакерів. Робота виконана — переходимо знову на пункт 1.

Епілог
Пишіть в коментарях, що вам було б цікаво дізнатись про сферу кібербезпеки. Більше про конкретні вразливості, може історії зламів? Чи, наприклад, якісь практичні сценарії? От нещодавно дізнався про історію, як через кондиціонер викрали декілька сотень мільярдів доларів. Думаю, я про неї якось розкажу.
1.3K views15:17
Відкрити / Коментувати
2022-05-18 13:03:39 Всім привіт! Сьогодні вже 18 травня, але війна все ще в країні та дуже важко просто ось так взяти й повернутись до звичного життя, яке колись в нас було.

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

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

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

Я поняття не маю про що я буду писати. В мене є ідеї в беклозі, я можу їх дописати, але потім я не знаю що буде. Можливо, не буде ніяких постів про TypeScript. Можливо, я почну писати про кібербезпеку трішки. Взагалі поняття не маю, коротше.

Тому в мене буде до вас прохання. Допоможіть мені зрозуміти, чи буде вам цікаво, якщо я почну писати пости не обмежуючись TypeScript-ом? Це все ще канал про програмування, комп'ютери й таке сяке, але може б не обмежуватись чимось одним? Якщо, на мою думку, буде підійматися якась цікава тема навколо програмування, компіляторів, ОС, кібербезпеки чи ще чогось, то я міг би про це писати. Що ви скажете?

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

Коротше, думка кожного з вас важлива, буду радий її побачити в коментарях. Як на мене, то ідея з розширенням тематики непогана, а для вас?
1.6K views10:03
Відкрити / Коментувати
2022-02-27 15:51:19 Привет! Это небольшой пост, призванный осветить происходящее в Украине

24 февраля, рано утром, Россия открыла огонь по нескольким мирным городам Украины. Я был вынужден покидать свой дом под звуки сирен авиационной тревоги. Сегодня 27 февраля, полномасштабная война всё ещё идёт полным ходом. Россия нарушает все возможные конвенции, открывает огонь по мирным жителям, расстреливает мирных граждан в спины, не дает возможности организовать "зеленый коридор".

Поэтому, сообщаю следующее. Это мой последний пост на этом канале на русском языке. Если вы не согласны с политикой Путина - выходите на протесты. Если вы не согласны с моей политикой - отписывайтесь от этого канала. Если вы хотите высказаться о "я же не нападаю, это всё власть" - даже не пытайтесь, я буду игнорировать такие комментарии.

UPD: вимкнув коментарі, тому що русні багацько
UPD2: видавил групу обговорень, так як вони і туди знайшли шлях
2.3K viewsedited  12:51
Відкрити / Коментувати
2022-02-15 13:16:38 Type Classes

Всем привет! Хочу поднять сегодня последнюю тему из запланированных по системам типов. В прошлый раз мы говорили об алгебраических структурах, как о концепции, "интерфейсах", что можно сделать над множеством элементов. А сегодня, мы поговорим о классах типов.

Что такое "классы типов"?
Классы типов это конструкция системы типов, которая позволяет вам создавать типы, содержащие в себе другие типы (я пытался перефразировать, честно). Да, как обычные классы, к которым мы привыкли, только для типов.

Подчеркну, что в отличие от алгебраических структур, которые являются чем-то абстрактным, классы типов это вполне реальная возможность системы типов в языке программирования. Они или есть в языке, или их нет. Это уже не про шаблоны поведения и не про контракты.

Давай пример, опять поток сознания
В прошлый раз, мы рассматривали алгебраические структуры на примере функтора. Через неё мы выражали необходимость в наличии функции map().

Эту алгебраическую структуру мы реализовали в TypeScript используя интерфейс. А вот в других, более функциональных ЯП, это реализовывается как раз через классы типов. На примере Haskell, это выглядит так:

class Functor f where
    map :: (a -> b) -> f a -> f b


Мы говорим, что у нас есть функтор, в котором должна быть функция map(). И мы накладываем ограничения на map(), говорим что она должна работать так, как, собственно, работает map() (ваш капитан). Ну описали и что такого?

Параметрический полиморфизм
Всё это не имело бы смысла писать, если бы не один момент с классами типов. А именно, благодаря им можно реализовать параметрический полиморфизм. Что это такое?

Мы все знаем, что мы не можем сделать две функции map() в одной области видимости в TypeScript\JavaScript. Ошибкой будет наличие дублирующих идентификаторов. Но с помощью классов типов, можно указывать сколько угодно функций map(). До тех пор, пока сама сигнатура функции будет отличаться по типам.

Компилятор, в котором есть их поддержка, на этапе компиляции сможет понять какой из map() ему нужно вызвать, основываясь на типах параметров. Поэтому это и называется параметрический полиморфизм.

На примере того же функтора выше, мы можем добавить сколько угодно функций map(), но для компилятора это всё будет одна функция map(), полиморфизм которой будет достигаться за счёт отличия в параметрах.

Итог
Вот такая небольшая заметка о классах типов (Type Classes). Это одна из возможностей языка (Haskell, Scala?), которая используется для реализации алгебраических структур. Конечная цель такой конструкции - параметрический полиморфизм.

Пишите в комментариях, сильно ли вы "рады" тому, что я немного отклонился от TypeScript? Мне эта тема показалась интересной, поэтому захотелось поделиться с вами. А пока, больше мне по этой теме нечего будет добавить, так что я вернусь к постам около TypeScript.

P.S. И, да, я не привёл полезных кейсов и примеров с TypeScript, потому что в нём нету классов типов
2.3K views10:16
Відкрити / Коментувати
2022-02-08 16:02:29 Алгебраические типы данных

В прошлый раз я заикнулся об алгебраических структурах. В комментариях выяснилось, что есть небольшая путаница между алгебраическими структурами и алгебраическими типами данных. Поэтому давайте попробуем разобраться со вторым термином.

Что у нас по определению?
Как оказалось, сложных определений здесь нет. Алгебраические типы данных - это типы, собранные из других типов данных. Всё. Буквально. Это конец определения.

Я почти уверен, что вы все используете алгебраические типы данных, но не подозреваете об этом. Или подозреваете, если вы знакомы с этим, конечно же. И, да, давайте дальше будем использовать сокращенную форму Algebraic Data Type (ADT), так меньше букв.

Так вот, любой тип, который состоит из других типов - ADT. Это объект? Массив? Кортеж? Все они типы данных, которые содержат в себе другие типы. Следовательно, их можно назвать ADT. И можно было бы закончить, но нет... Рассмотрим две категории ADT.

Product Types
Первая из них - Product Types. Это типы, которые позволяют хранить в одной структуре разные типы. Например, возьмем MyStruct(bool). Это тип, который хранит в себе другой тип - булевый. Булевых значений может быть два: true или false.

Сколько можно создать "корректных" структур MyStruct? Всего два: один с MyStruct(true) и второй с MyStruct(false).

А если мы добавим ещё один тип? В итоге у нас получится MyStruct(bool, bool). Структура уже держит два булевых типа внутри, а вариантов создания "корректной" структуры у нас становится 4. Это (true, true), (true, false), (false, true) и (false, false).

Поэтому они и называются product types. Чтобы посчитать количество возможных вариантов структуры, нам нужно умножать варианты между собой. В нашем случае 2 * 2. Получаем 4 возможных варианта.

Sum Types
Есть ещё вторая категория - Sum Types. В отличие от Product Types, их задача хранить какой-то один тип из заранее известных. Да, те самые enum-ы или tagged unions - это sum types. Вы указываете какие варианты могут быть и выбирается только одно, не все сразу.

Например, мы можем сказать, что у нас есть 4 стороны света: north, east, west, south. И у нас есть структура Side(direction). В direction мы можем указать только что-то одно из этого. А значит, вариантов всего может быть 4.

Но что произойдёт, если мы позволим в direction указывать это ещё и в виде чисел от 0 до 3? В таком случае, direction будет либо строкой, либо числом. Но так как это всё ещё один вариант, мы не можем указать разные одновременно, то и количество вариантов остается 4 (north, east, west, south) + 4 (0, 1, 2, 3).

Поэтому эти типы и называют sum types, потому что они суммируют варианты, чтобы узнать количество возможных.

И к чему это всё?
Интересный момент здесь в том, что компилятор, зная о возможных вариантах, может за вас проверить все возможные случаи и предотвратить ошибку ещё на этапе компиляции.

Мы воспользовались sum types и указали, что у нас может быть 3 состояния в системе? Компилятор посчитал возможные варианты, проверил что все три состояния обрабатываются вашим кодом.

Мы воспользовались product types и указали, что мы можем одновременно указать стороны света и текущую температуру? Компилятор проверит что стороны света это строки из четырех вариантов, указанными нами, и что текущая температура это число.

Подытожим
Алгебраические типы данных (ADT) могут быть двух типов: product types и sum types. Product types используются тогда, когда вы хотите выразить возможность указывать данные одновременно с другими данными в рамках одной структуры. Sum types используются, когда вы хотите указывать данные из определенного списка и только что-то одно.

Disclaimer
Друзья из Framework Days делают конференцию по React 26 февраля. Планируется, в том числе, и offline формат (наличие теста или вакцинации). Так что забегайте на сайт, смотрите программу, есть толковые спикеры. Там ещё могут моменты поменяться, но не думаю что кардинально что-то. Постараюсь и я попасть на offline формат, может увидемся.
1.7K views13:02
Відкрити / Коментувати
2022-02-02 13:54:26 Алгебраические структуры

Всем привет! Появилось желание немного поговорить о системах типов, и в частности, поговорить об алгебраических структурах. Не то, чтобы я очень хорошо разбирался в этой теме, но попробую рассказать то, как я это понимаю, а мы обсудим в комментариях. Надеюсь, это поможет лучше структурировать знания и больше узнать.

Что за зверь?
Хочу начать с самого простого. Что такое вообще "алгебраическая структура"? Алгебраическая структура - это свод правил, который определяет, какие операции возможны на элементах из условного множества элементов. Это если говорить "по определению". Лично мне, мало что понятно из такого определения. Есть какое-то множество элементов и есть какая-то структура, которая определяет операции над этими элементами.

Поэтому я вдался в поиск аналогий. Мне понравилось как James Sinclair провёл аналогию с шаблонами проектирования. Шаблоны проектирования появились благодаря наблюдению за проблемами и выведению общих шаблонов решения этих проблем. Аналогично и с алгебраической структурой. Алгебраические структуры представляют собой общие шаблоны решения проблем. Но разница между ними в том, что алгебраические структуры имеют базис в виде математики. В то время как шаблоны проектирования это просто наблюдения.

Пример бы...
Абстрактно об этом проговорили, скорее всего всё ещё ничего не понятно. Давайте приведём примеры алгебраических структур, так будет лучше. Все же слышали эти модные словечки "функтор", "моноид" и прочее? Так вот это и есть те самые алгебраические структуры.

Если смотреть на алгебраическую структуру "Functor", то она нам говорит, что должна быть операция - map(). Это операция в качестве аргумента получает функцию, которая берёт что-то типа А и возвращает что-то типа B. На примере TypeScript-а это выглядело бы как-то так:

interface Functor {
map(fn: (a: A) => B): Functor;
}


И если наш объект реализует данный свод правил (интерфейс), то мы можем сказать, что наш объект является функтором. Но не одним же функтором живём.

Их много
Алгебраических структур на самом деле много: функторы, апликативы, моноиды, профункторы и так далее. Это всё алгебраические структуры - свод правил, описывающий возможные операции над элементами.

Это становится намного проще понимать, если говорить об этом как об "интерфейсах" над множествами элементов. Разумеется, это "не по терминологии", за такое мне могут поломать руки, но как в попытках отыскать аналогии для лучшего понимания, я считаю вполне ок.

Пишите в комментариях, как вы понимаете термин "алгебраическая структура"? Согласны ли вы с этими аналогиями или они всё же принципиально разные? В следующих постах я бы ещё хотел поднять такие темы как тайп-классы и алгебраические типы данных, так что будут пересекаться с этим постом.
1.5K views10:54
Відкрити / Коментувати
2022-01-25 13:20:07 TypeScript Features to Avoid

Disclaimer
Всем привет! Меня не было на канале почти 2 месяца. Но оно того стоило, скажу я вам. Я ушел в отпуск перед Новым годом, не прикасался ни к каким ноутбукам, пет проектов никаких не делал. В итоге я очень хорошо отдохнул и вернул себе эмоциональное спокойствие (наконец-то!)

У меня постепенно получается вернуться в привычный режим работы, так что скоро я начну писать на канале дальше. Пока меня не было, накопилось очень много интересных блог постов от других авторов, которыми я бы хотел поделиться и обсудить. Ну а теперь, к посту!

Пролог к посту
18 января 2022 вышел пост с названием "TypeScript Features to Avoid". В нём автор упоминает некоторые возможности языка которые, по его мнению, стоит избегать. Давайте по ним и пройдёмся, я добавлю своё мнение, а вы пишите в комментариях, что вы думаете.

Избегайте enum-ов
Есть лагеря которые, в целом, против использования enum-ов. Лично нам они помогают моделировать некоторые ситуации и очень хорошо их моделировать. Но у них и правда есть пара нюансов.

Автор в статье упоминает, что использование enum-ов приводит к дополнительному коду в конечном JavaScript коде, который и реализует сам enum. Это дополнительный объект со значениями, которого не было в изначальном коде (кроме типа).

И это действительно может стать проблемой, если вы используете другие инструменты, помимо TypeScript, например Babel или Webpack. Эти инструменты изначально делались для JavaScript и если по какой-то причине, они не поймут что за enum-ы и как с ними работать, то они просто сделают type stripping, что сломает код в runtime. Если же вы используете только TypeScript, то вряд ли с этим могут быть проблемы.

Лично от меня ещё одно замечание, что у enum-ов неявно присваиваются значения. Пока вы не трогаете порядок его элементов, всё хорошо. Но как только вы начнёте перемешивать или сортировать ваш enum, TypeScript неявно присвоит порядковые номера и вследствие этого, в runtime будут уже не те числа, которые вы ожидали. Об этом можно подробнее почитать вот в этом ESLint правиле.

Избегайте namespaces
Полностью поддерживаю и даже добавить нечего. Мало того что они, как и enum-ы, добавляют "своего" JavaScript-а в runtime. Так это ещё и артефакт прошлого, когда не было EcmaScript Modules и каждый писал свою систему модулей.

На сегодняшний день, namespaces считается артефактом. Он также не рекомендуется использоваться и самой командой TypeScript. Используйте вместо них обычный ESM и не делайте никому жизнь хуже.

Избегайте декораторов
И здесь тоже полностью поддерживаю автора. Хоть декораторы и открывают новые возможности для тех кто любит мета программирование всякое, они всё ещё далеки от попадания в спецификацию и много чего может в них поменяться.

Мы уже попадали в некоторые ситуации, когда декораторы были бы интересным решением, и мы хотели их начать использовать. Но каждый раз нас останавливало то, что это не установившийся стандарт. А поддерживать (потенциально) меняющийся API не сильно хочется.

Избегайте private модификаторов
Ну тут уже вкусовщина чистой воды. Автор говорит о том, что вместо использования private, лучше используйте приватные свойства самого JavaScript (который через # обозначается).

Лично для меня, каких-то больших аргументов "за" я не увидел. А ломать стилистику кода, когда у тебя public используется, а рядом # - ну... глаз дёргаться будет. Поэтому мы используем public, private, protected и никаких проблем с этим не имеем.

Эпилог
Хотелось бы подытожить следующее:

- Если у вас только TypeScript, используйте enum-ы, ничего плохого в этом нет. И лишний раз удостоверьтесь, что ничего не ломается, если есть другие инструменты.
- Избегайте namespace-ов и декораторов - полностью поддерживаю.
- Не навязывайте вкусовщину (кроме своих коллег, конечно же ).

Пишите в комментариях, что вы думаете об этих возможностях языка. Нужны они, не нужны, полезные, не полезные, в общем - набрасывайте - подискутируем
1.6K views10:20
Відкрити / Коментувати