Євгеній Гизила
328 subscribers
39 photos
1 file
79 links
Автор @hyzyla

Пишу про різне зі світу веб розробки: власний досвід, Python, React, TypeScript, стартапи і власні думки
Download Telegram
Freenom драма

Сервіс Freenom це чи не єдиний реєстратор доменів, де можна було зареєструвати безплатно домени другого рівня для країн .tk (Токелау), .ml (Малі), .ga (Габон), .cf (ЦАР) і .gq (Екваторіальна Гвінея). Країни залишали за собою право власності на ці домени, а Freenom по договору з кожною країною займався їх адмініструванням.

Недавно вийшла новина, що Габон 🇬🇦 повністю повертає свій TLD .ga собі в управління. Основною причиною вказують незадовільне обслуговування домену і власні потреби країни. Новий адміністратор видалив декілька мільйонів доменів .ga через зловживання.

Слід за Габоном, уряд Малі 🇲🇱 відмовився продовжувати контракт з Freenom, термін дії якого вийшов 17 липня 2023 року. Всі безплатні .ml домени були видалені при переїзді. Також до слова варто згадати, що Малі товаришує з росією 💩 і має цікавий TLD, який схожий на домен .mil Міноборони США 🦅

Додатково до всіх цих подій, компанія Meta 🌐 подала в суд на Freenom за сприяння кіберсквотингу і порушенню авторських прав на товарні знаки. У відповідь Freenom припинив реєстрацію доменів для всіх п'ятьох TLD.

Ця вся ситуація навколо Freenom вкотре нагадує, що безплатний сир тільки в мишоловці і, обираючи TLD для вашого сайту, варто глянути чи не належить цей домен, якійсь країні і чи впевнені ви в її геополітичній позиції
Please open Telegram to view this post
VIEW IN TELEGRAM
XY problem

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

The XY problem is asking about your attempted solution rather than your actual problem

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

Далі вигаданий приклад діалогу з таким питанням:

— як зробити декілька паралельних запитів в react-query?
— […поснює як це зробити…]. А для чого тобі це?
— у мене є API, щоб дістати інфо про користувача і мені треба для кожного повідомлення на форумі показати телефон автора цього повідомлення.
— давай краще в API, яке повертає список повідомлень, додамо потрібні тобі поля і тоді тобі взагалі не треба буде робити паралельні запити. Тим паче, що ми вже так повертаємо імʼя автора.
— точно! піду зроблю це на бекенді!
На вихідних привів у порядок свій невеличкий JS пакет @hyzyla/pdfium — обгортка навколо бібліотеки PDFium від Goolge для роботи з PDF. Створив сайт з документацією, добавив тести, добавив типи, поміняв API, налаштував автоматичне оновлення і зарелізив нову версію.

Поки бібліотека вміє лише рендерити PDF в картинки, але планую додати й інші методи, такі як дістати текст з PDF, об’єднати 2 PDF, накласти картинку і тд 🖥

До речі, документацію розмістив на домені .js.org про який писав декілька дописів назад — pdfium.js.org
Please open Telegram to view this post
VIEW IN TELEGRAM
PKI

Знайшов гарну статтю Everything you should know about certificates and PKI but are too afraid to ask в якій автор розповідає про Web PKI (Public Key Infrastructure) і що означає PEM, DEM, OCSP, CA, CRL і т.д. В мене з цим завжди було тяжко. Коли треба налаштувати HTTPS для сайту, то я робив це майже на осліп, копіюючи бездумно якісь команди зі статті на Medium або Digital Ocean.

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

На додачу, цікавий факт зі статті:

You can't fully appreciate X.509 without a small history lesson. X.509 was first standardized in 1988 as part of the broader X.500 project under the auspices of the ITU-T (the International Telecommunications Union's standards body). X.500 was an effort by the telcos to build a global telephone book. That never happened, but vestiges remain. If you've ever looked at an X.509 certificate and wondered why something designed for the web encodes a locality, state, and country here's your answer: X.509 wasn't designed for the web. It was designed thirty years ago to build a phone book:

Subject: C=US,ST=CA, L=San Francisco, 0-Slack Technologies, Inc.,CN-slackcom
Python-JS birdge

Натрапив на новину про реліз deno_python — модуль для deno (альтернатива node.js), який дозволяє імпортувати Python пакети прямо в JS коді. І який такий: “ОГО! а чому так просто?”

Я дуже мрію, щоб можна було в JS імпортувати якусь бібліотеку написану на Rust, чи Java, навіть не розбираючись, як писати binding між цими мовами — хочу, щоб цю магію повністю за мене автоматично робив якийсь інструмент, по типу цього ж deno_python. Мені ОК, навіть якщо під капотом код буде виконуватися в окремій VM, назви методів будуть не по канону чи спілкування між мовами буде через якийсь неефективний RPC — головне, що можна було швидко поєднати мови без головного болю
PDF debugger

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

Сервіс тут 👉 pdf.hyzyla.dev
Мова і прапор

Те, що прапор не позначає мову, наче й очевидна річ, але я часто помічаю сайти, де перемикач мови має прапор навпроти мови. Але майже завжди це погана ідея, бо мова може бути поширена в декількох країнах (англійська 🇺🇸🇬🇧🇦🇺🇨🇦🇳🇿…, французька 🇫🇷🇧🇪🇨🇦🇲🇨…, іспанська 🇪🇸🇨🇴🇲🇽🇦🇷🇻🇪…) або навпаки країна може говорити декількома мовами одночасно (🇨🇦 – французька і англійська, 🇧🇪 – нідерландська і французька, …). Не говорячи, проте як блювати хочеться від виду триколору навпроти російської мови 🤢  

Цікаво, що компанія Apple в macOS прибрала прапор біля перемикача мов лише в травні минулого року
Public Suffix List

Випадково натрапив на проєкт publicsuffix.org, який створили й підтримують в компанії Mozilla. Цей проєкт збирає в один великий файл усі домени, які є публічними, тобто такі домени, до яких будь-хто може отримати субдомен і опублікувати під ним свій сайт. Для прикладу, це можуть бути локальні домени другого рівня, по типу org.ua чи kyiv.ua, або домени хостинг провайдерів, які роздають субдомени своїм клієнтам, як от vercel.dev чи herokuapp.com

Основна ідея проєкту, це дати можливість браузерам відрізняти такі публічні суфікси, щоб уникнути суперреп'яхів. Для прикладу, щоб я зі свого сайту directory.org.ua не зміг поставити репʼях на домен org.ua, але й водночас щоб залишалася можливість поставити репʼях на домен directory.org.ua з сайту admin.directory.org.ua

Попри те, що весь інтернет — це десятки протоколів, стандартів і алгоритмів, але інколи, щоб вирішити проблему достатньо просто захардкодити перелік доменів для яких треба зробити виключення. Хоча рішення далеко не ідеальне і створює нові проблеми і вразливості [1], [2]
Kafka Queue 🪲

Остання гаряча тема у світі Kafka — це пропозиція додати вбудовану підтримку черг KIP-932: Queues for Kafka. Для контексту, зараз топіки в Кафці можуть мати декілька партицій, на кожну партицію може бути максимум один конс'юмер і він міг лише послідовно комітити повідомлення як оброблені, зсуваючи offset. Якщо треба було збільшити паралелізм для обробки одного топіка, то це можна було зробити лише збільшивши кількість партицій. Також, якщо треба було якесь повідомлення повторити через декілька хвилин, не затримуючи інші повідомлення у черзі, то це можна було зробити або переклавши це повідомлення в іншу партицію чи топік або робити якусь складнішу логіку з тим, щоб зберігати й обробляти коміт на кожне повідомлення в окремому сховищі даних.

Основна ідея цієї пропозиції полягає в тому, що повідомлення з однієї партиції тепер зможе читати декілька конс'юмерів одночасно і кожне з повідомлень можна буде окремо закомітити, відхилити чи відкласти. В першу чергу це дає можливість динамічно збільшувати чи зменшувати кількість конс'юмерів при пікових навантаженнях. Але, напевно, основне що ця зміна спрощує використання Кафки для черги асинхронних задач, бо тепер набагато легше буде відкласти повідомлення у черзі на деякий час, не блокуючи обробку інших задач. Виходить така собі альтернатива RabbitMQ або Apache Pulsar на мінімалках.
Please open Telegram to view this post
VIEW IN TELEGRAM
ReDoS

На днях прочитав гарну статтю “A comprehensive guide to the dangers of Regular Expressions in JavaScript” про те, що регулярки можуть містити приховану небезпеку і стати причиною відмови сервісу. Подібні вразливості навіть мають окрему назву regular expression denial of service (ReDoS).

Якщо двома реченнями описувати статтю — не складно помилитися і написати таку регулярку, що вона буде мати в найгіршому випадку експоненційну алгоритмічну складність 2^n. Навіть відносно невеликий рядок разом з такою регуляркою може покласти ваш сервіс на лопатки. Винуватим у такій алгоритмічній складності роблять процес backtracking, коли двигун регулярних виразів, окрім того, що проходиться по рядку зліва направо, може піти назад, щоб перевірити чи збігається рядок з умовою. Ситуацію, коли регулярка створює експоненційну складність, часто ще називати catastrophic backtracking.

Основні ідеї зі статті як уникнути catastrophic backtracking:
- писати правильні регулярки🗿
- перевіряти регулярки лінтерами 🔎
- використовувати двигуни регулярних виразів, які не використовують backtracking. Для прикладу, re2 від Google 🦅
Please open Telegram to view this post
VIEW IN TELEGRAM
Authenticated encryption

Authenticated encryption: why you need it and how it works — гарна стаття в якій автор крок за кроком пояснює як працює шифрування і які проблеми мають вирішувати сучасні алгоритми шифрування. Для прикладу, шифрування алгоритмом AES ECB працює швидко, але якщо зашифрувати ним картинку, то зловмисник по патернах зможе з якось точністю відновити цю картинку з зашифрованого повідомлення 🏛. Або ще одна проблема, що певні алгоритми шифрування можуть бути вразливими до malleability, властивості за якої зловмисник буде мати змогу замінити частину зашифрованого значення на якесь інше, навіть не знаючи секретного ключа (наприклад змінити суму переказу) ✏️. Подібними прикладами автор доходить до того чому варто використовувати authenticated шифрування і які проблеми воно вирішує.

Попри те, що стаття досить поверхнева, але вона значно підживила мій інтерес до цієї теми, тому рекомендую, якщо ви в цьому всьому шифруванні повний нуль як я🐤
Please open Telegram to view this post
VIEW IN TELEGRAM
ruff formatter

Автор Python лінтера ruff, Charlie Marsh, анонсував, що ruff тепер вміє форматувати код і робить це в 30 раз швидше за black ⚡️

Ruff це досить новий (1 рік) лінтер для Python, написаний на rust і фокусується на швидкості й вбудованих перевірках. Автор дуже швидко робить нові фічі і пів року тому отримав $4m інвестицій на розробку інструментів для Python.

Це дуже добра новина, бо в порівнянні з Typescript (друга моя найулюбленіша мова), інструменти якості коду для Python працюють відносно повільно. Особливо це помітно в режимі "Format/Fix on save" в редакторах коду. Тому я радо вітаю інструменти, такі як ruff formatter, які фокусуються на швидкості і повертають задоволення від написання Python коду 🖥
Please open Telegram to view this post
VIEW IN TELEGRAM
Plasmo

Недавно побачив цікавий фреймоворк Plasmo для розробки розширень для браузері. З коробки він підтримує Typescript, React, Hot reloading, env файли, інструменти для публікації розширень і так далі.

Вирішив спробувати Plasmo, перевівши власне мінірозширення Kibana Clicker на цей фреймворк. Дуже сподобалося, що Plasmo не намагається ізолювати від того як працюють браузерні розширення зараз, а натомість додає зручні інструменти для розробки. Для прикладу, фреймворк не робить ніякої магії для того, щоб приховати background і content скрипти, а натомість дає Messaging API, щоб зробити спілкування між ними більш приємним.

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

В цілому досвід позитивний і я радий, що зʼявився такий зручний інструмент, щоб робити розширення для браузерів.
JS tagged templates


На днях вийшла нова версія Next.JS, яка наробила багато шуму. Розробники на перезентації показали скріншот з новою можливістю server actions в дії. Хтось в коді на скріншоті побачив повернення php, але також було чутно зауваження, що мовляв в тому коді є SQL ін’єкція і як взагалі таке можна показувати дітям на ніч 😱:

await sql`INSERT INTO Bookmarks (slug) VALUES (${slug});`;

Чи server actions це добре чи погано покаже час, але про tagged templates в JS розказати ніколи не пізно, бо за межами JS я не знаю де ще є подібна концепція і про неї багато хто може не знати.

Для початку, в JS рядки-шаблони позначаються в форматі `hello, ${name}!`, де ${name} буде замінено на значення зі змінної name — все дуже просто і схоже на f-string в Python. Але також в JS є складніші рядки-шаблони, які помічаються тегом перед лапками, для прикладу, myTag`hello, ${name}!`. Такі шаблони називаються tagged templates. Тег у цьому випадку має бути функцією, яка на вхід буде отримувати частини рядка ["hello, ", "!"] і окремо значення змінної name. У відповідь ця функція може повернути будь-що, що їй заманеться: може повернути зовсім інший рядок, може повернути об’єкт або навіть promise.

function myTag(strings, …parameters) {
return strings[0] + parameters[0] + strings[1];
}

Якщо повернутися до прикладу на презентації, то перед сирим SQL запитом є тег sql з пакету @vercel/postgres, який і є тією самою тег-функцією, що формує параметризований запит і виконує його. Тому в тому прикладі немає SQL ін’єкції і переконатися в цьому можна, переглянуши код цієї функції на Github
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Ринок browser extensions

На днях натрапив на посилання, де автор безкоштовного розширення для браузерів Hover Zoom+ (400 тис. користувачів)
зібрав в одному місці всі листи, які йому приходили з пропозицією монетизувати чи продати розширення. Пропонують від 2k$ на місяць і до 1k$ в день пасивного доходу 💸. Знайшов також статті інших розробників, які діляться схожими історіями [1], [2]

Основні причини для чого купують розширення це:

- 🔍 збирати й перепродавати дані про вас: по яких сайтах ходите, які фотки лайкаєте, які магазини відвідували і т.д. В першу чергу для маркетингових цілей.
- ⚡️ вбудовувати рекламу на випадкових сайтах, навіть на тих на яких її не мало б бути.
- ⚖️ і найчорніше: викрадати акаунти чи робити якісь інші зловмисні дії від вашого імені.


Рішення чи висновків до цієї проблеми у мене немає. Продати чи монетизувати свою роботу це нормально, якщо вона не порушує ніяких законів. Але й розумію людей, які не хочуть платити за браузерні розширення 🤷
Please open Telegram to view this post
VIEW IN TELEGRAM
Вашій увазі коротка стаття (4 хв) з конкретними порадами як покращити славнозвісні soft skills в письмовій комунікації в команді. Ділюся з вами, бо в більшості згоден з усіма порадами в цій статті.

6 tiny wording tweaks to level up your communication as a software engineer
Forwarded from Навколо розробки (DN)
На днях Rust-ентузіасти у лиці команди Astral Software написали у своєму блозі про uv, черговий інструмент для екосистеми Python, написаний на Rust - https://astral.sh/blog/uv
Якщо коротко - прирости швидкості у визначенні та встановленні залежностей колосальні (від 7 до 115 разів!)
Як то водиться, поки що uv у стадії розробки, і для ваших важливих речей краще користуватися перевіреними рішеннями, в котрих фокус на стабільності та сумісності (я про умовний pip).
Але - у Astral Sofrware амбіційні цілі, роудмап та, начебто, непогано все поки виходить, тому можна стежити та (можливо) експериментувати в очікуванні нових версій uv та інших корисностей.
👆 До слова, підписуйтеся на канал @this_is_pythonic Дмитра , автора попереднього допису. Має гарний канал про Python і розробку в цілому