Хэндлим тему | Дерепко
274 subscribers
51 photos
3 videos
1 file
56 links
Discussion group @handle_topic_chat
Contact with me @xepozz
Download Telegram
XML Clark Notation

Не так давно пришлось столкнуться с парсингом XML на JS.
С виду всё просто:
- Берем парсер из браузера, либо ставим свой
- Создаем парсер: new DOMParser()
- Запускаем parseFromString(string)

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


...
<m:r>
<w:rPr>
<w:Fonts w:ascii="Cambria Math" w:hAnsi="Cambria Math" />
<w:w w:val="105" />
</w:rPr>
<m:t {http://www.w3.org/XML/1998/namespace}space="preserve">,
</m:t>
</m:r>
...



Я не сразу увидел, но потом как увидел!

<m:t {http://www.w3.org/XML/1998/namespace}space="preserve">


Сначала я подумал, что это какой-то невалидный XML и с парсером всё ОК. Однако, попробовал другие документы и обнаружил, что баг всё-таки не в XML, а в парсере.

Такая запись называется Clark Notation, она представляет из себя "inline" неймспейма документа прямо в место использования этого атрибута/тега.
Вместо объявления xmlns, namespace пишется прямо в фигурных скобках: {http://example.com}element.

Если сделать обратное преобразование, то результат будет примерно такой:

<m:t xmlns:ns="http://www.w3.org/XML/1998/namespace" ns:space="preserve">


Т.е.:
- Мы вытащили содержимое в фигурных скобках в отдельное указание неймспейса
- xmlns=NS_NAME="NS_VALUE"
- И заменили эти символы на использование этого неймспейса
- NS_NAME:space

Такое преобразование можно делать в обе стороны и даже иметь несколько инлайнов в одном теге, либо даже неймспейс тега заинлайнить:

Например, было:

<cars:part xmlns:cars="http://www.cars.com/xml"/>


Стало:

<{http://www.cars.com/xml}part/>


Выглядит короче (иногда), но JS парсер с таким не справился!

А как же PHP?

PHP Warning:  simplexml_load_string(): Entity: line 1: parser error : Couldn't find end of Start Tag tag line 1 in php shell code on line 1


Еще пыха сходит с ума и выводит эту ошибку раз 10!

А вот что получилось в Kotlin!

Element type "tag" must be followed by either attribute specifications, ">" or "/>".


В общем, стандартные средства не понимают этого Кларка.
Я сделал небольшую функцию на регулярке и циклах с заменой подстрок {...}attr на xmlns:nsN="..." nsN: и теперь всё работает как надо.

Кто-то сталкивался с этим Кларком? Как решали подобное?

——

Небольшая статья от того самого Кларка: http://www.jclark.com/xml/xmlns.htm
Вроде даже есть библиотека на PHP: https://sabre.io/xml/clark-notation/

——

@handle_topic
1👍72🔥2
Так и живем 🤷‍♂️
1😁23
Работа с кодом в презентациях

Кто хоть раз создавал презентации в которых нужно показать код, тот может вспомнить, насколько плохо это сделано в редакторах презентаций.

Не так давно нашел инструмент для помощи создания контента для презентаций: SlidesCodeHighlighter

Что он позволяет делать:
- Выбрать язык для подсветки
- “Авто” язык тоже хорошо работает
- Есть возможность выбрать тему, как светлую, так и темную
- Шрифты, размеры шрифта
- Мультикурсоры
- Возможность выделить текст и повлиять на текст “рендера”: сделать его жирным, сделать текст ярким, а все остальное бледным и тп

Как это работает:
- Заходишь на сайт инструмента
- Вставляешь код, который нужно подсветить
- Текст генерируется с обёртками вокруг слов, который подкрашиваются через <span style=“color: …”>
- При копировании копируются все стили текста
- При вставка ваш редактор парсит эти стили и текст, создает своё представление и вы получаете раскрашенный код

Работает с Keynote и Arc на Mac.

——

Ссылка: https://romannurik.github.io/SlidesCodeHighlighter

——

@handle_topic
19👍8🔥4
Новости из мира #PHP

В последнее время я много уделяю времени контрибьютингу в PHP Core. Решил поделиться новостями за последнее время. Довольно много всего вылилось.

Single Expression Functions (SEF) перевел на стадию голосования.

Честно говоря, думаю его никто не лайкнет. Вопросов было мало, хоть и изменение в пару строк. Предыдущая попытка была от Larry Garfield несколько лет назад, но не прошло из-за нерелевантных вопросов и утверждений.
В общем, через 2 недели узнаем итоги.

Обсуждение: https://externals.io/message/127423
RFC: https://wiki.php.net/rfc/single-expression-functions
GitHub: https://github.com/php/php-src/pull/17677



CHIPS RFC
Столкнулся на работе с отсутствием поддержки CHIPS в PHP при использовании setcookie, который используется в Yii2.
Пришлось сделать PR. Спросил нужно ли готовить RFC, а мне сказали, что был уже предыдущий заход от Niels Dossche.
Списался с ним, пообщались, сделали совместный RFC. Нильс выражает опасение: даже ради такой плёвой штуки подстраховался и накинул в RFC объяснений. Видимо тоже отвергали сотню раз уже.

Мой PR: https://github.com/php/php-src/pull/19054
Обсуждение: https://externals.io/message/128047
RFC: https://wiki.php.net/rfc/chips
GitHub: https://github.com/php/php-src/pull/12652



Async Engine API вышел на обсуждение.

Я думаю, это какая-то база для асинк фреймворков, чтобы они смогли адаптировать свои реализации под стандарты.

Комментарий от Edmond Dantes, инициатора этого RFC: Это базовое апи для расширений, которые будут предоставлять async возможности.

Можно поиграться с докером:

# Build the image
docker build -t true-async-php .

# Run interactively
docker run -it true-async-php bash


Dockerfile: https://github.com/true-async/php-async/blob/34eaee6a28d9c27a2f579e7cece28877c5e7666d/Dockerfile
Обсуждение: https://externals.io/message/128053
RFC: https://wiki.php.net/rfc/true_async_engine_api
Оригинальный RFC: https://wiki.php.net/rfc/true_async
GitHub: https://github.com/php/php-src/compare/master...true-async:php-src:true-async-api-stable



Short Constructor
Случайно всплыл Records RFC и я вспомнил о крутой фиче в Kotlin – короткий конструктор
Долго не думая, запилил бетку, практикуясь писать сишный код.
Закинул на обсуждение всем с возможным развитием в создание RFC.
Поговаривают, что изменение синтаксиса не сильно любят в Core.

Обсуждение: https://externals.io/message/128060
Обсуждение Records: https://externals.io/message/125975
GitHub: https://github.com/php/php-src/pull/19133

——

@handle_topic
1👍11🔥85
Junie on Github!

Jetbrains выкатили возможность использовать джуна на гитхабе:
- Создаете Issue
- Назначаете исполнителем Junie
- Идёте заваривать кофе, ведь скоро останетесь без работы и нужно привыкать к беззаботной жизни
- Проверяете решение

Можно еще и тегать в ревью, чтобы он пришел ревьювить сам.

Если вы поддерживаете Open Source, то прямо сейчас можете подать заявку на получение бесплатного 6 месячного пробного периода!

Я подался, надеюсь получится двигать свои проекты быстрее и не проехать остановку!

Лендос и форма: https://www.jetbrains.com/junie-github/



@handle_topic
1🔥8👍3
Python Console Plugin

Увидел сегодня такой плагин для питона в IDEA.
Скорее всего он идет от базового плагина для питона, но всё же.

Выглядит прикольно, в питоне консоль по сути является REPL (Read, Eval, Print, Loop).
Помню проект PsySH (псих), где можно писать практически как в IDE.

Так вот, может поделать таких плагинчиков?)

В PHP есть Interactive shell: php -a, может сделать аналог Python Console?

Кстати, в Python есть Jupyter Notebook. А что в Kotlin?
Kotlin Notebook!

В Kotlin нет Interactive shell из коробки, но есть решения отдельно.

——

@handle_topic
1👍5🔥21
PHP жив?

Если вы любите PHP или просто хотите повидаться со мной, погнали на Пых.Конф!

19 сентября (уже через пару месяцев) в Москве пройдет первая конфа по PHP, которую организовывает Валентин Удальцов. Будет очень жирно и мясисто:
- 28 докладов
- Фейл-митап и открытый микрофон (без записи)
- Конкурсы и мерч

Программа на конфе настолько насыщенная, что придется обедать прямо в лекториях. Обсуждаться будет всё: от Drupal до Bitrix, от Symfony до Yii3, от ФП до Event Sourcing. К сожалению, Laravel тоже будут обсуждать, но только про то, как с него перешли на другой фреймворк!

Завтра последний день перед очередным повышением цены. Чем ближе к конфе, тем будет дороже.

К сожалению, я билет брать не буду, потому что буду выступать 🤔

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

Если есть что-то, что хотели бы в этом докладе узнать или есть идеи чем его дополнить, то можем обсудить.



Кстати, я даже на сайте есть: conf.phpyh.ru/speakers/dmitrij-derepko

Сайт конфы: conf.phpyh.ru
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥17👍87
Developer Survey 2025 от StackOverflow.

Хайлайты:
- 1 из 4 разрабов счастлив на своей работе
28% людей не счастливы. Но зато с работой, пока что.

- GitHub хотят использовать для коллабораций чаще, чем Jira
На втором месте Markdown File, а потом GitLab

- Около 32% работают удалённо

- Большинство разрабов имеют 10+ лет стаж
С каждым годом таких людей будет всё больше и больше 🤣

- 84% юзают AI
В прошлом году было 76%. Подписка стала дешевле?

- Python увеличивается по использованию
И встает на 4 место. А на втором месте HTML/CSS. Классные ЯП!

- 66% разрабов разочарованы AI решениями, хоть они и практически правильные
На втором месте проблема траты уймы времени на дебаггинг.

- Claude Sonnet любимчик разрабов
Сам пользуюсь. Объясняет даже когда нет оффициальной доки.

- Visual Studio и VS Code в топах
На третьем месте Notepad++, потом уже IDEA. Серьёзно?

Там еще половина вопросов про AI и какой крутой стал SA.

Выводы делайте сами.

Ссылка на результаты: https://survey.stackoverflow.co/2025

——

@handle_topic
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍82🔥2😁2
File System Info

Время от времени сталкиваюсь с нужной посмотреть размер конкретной директории и узнать её вес и количество файлов внутри.

Часто бывает такое, что есть какая-то директория, а в ней под сотню файлов, которыми никто давно уже не пользуется.

Для своего же удобства я предпочитаю держать файлы в тонусе:
- Не создавать под каждый "тип" файла отдельную папку
- Не класть в одну папку 20+ файлов

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

В общем, превратил ручной труд в механический и сделал новый плагин для Intellij IDEA.

Плагин уже доступен в маркетплейсе, становится в любую IDE от 23 года.
Фидбек и пожеланию принимаются. Можно писать в коменты или в отдельном чате.

——

Маркетплейс: https://plugins.jetbrains.com/plugin/28300-filesystem-info
Исходники: https://github.com/j-plugins/fs-info-plugin
Чат для обсуждения: https://xn--r1a.website/jb_plugins/100

——

@handle_topic
1👍115🔥4
Git Churn

В добавку к плагину File System Info @samdark предложил идею сделать подсчет и подсветку файлов, которые часто меняются.

Алгоритм следующий:
- git log с определенного времени до текущего
- Группировка и подсчет количества файлов

Теперь у нас есть карта "путь до файла" <-> "сколько раз был комит с файлом".

Так как директории в git не хранятся, то дополнительно требуется собрать список директорий и высчитать максимальное количество.
В зависимости от количества изменений нужно привести строчку с файлов в Project View к красному оттенку. Для этого можно высчитать формулу градиента и наложить такой цвет поверх элемента в Project View.

Что дает знание о количестве изменений файла:
- Кажется, что файл выполняет несколько функций и его стоит разбить на несколько
- Частые изменения файлов – потенциальное место конфликтов git merge
- Есть файлы, которые будут меняться часто и это нормально: конфиги, переменные, id и другое.

В остальных случаях точно стоит посмотреть на файл еще раз.

Плагин уже доступен в маркетплейсе

——

Маркетплейс: https://plugins.jetbrains.com/plugin/28319-git-churn
Исходники: https://github.com/j-plugins/git-churn-plugin
Чат с обсуждением: https://xn--r1a.website/jb_plugins/102

——

@handle_topic
1👍13🔥9👏31
Рейтинг языков программирования IEEE

Вышел новый рейтинг IEEE 2025

Из наблюдений:
- PHP популярнее Kotlin
- Kotlin поднялся на несколько позиций вверх
- JavaScript и Rust идут на спад
- Python всё еще держит всех в страхе

——

Ссылка: https://spectrum.ieee.org/top-programming-languages-2025

——

@handle_topic
1👍10🔥54
Обзор плагинов IntelliJ IDEA.

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

За год было создано достаточно плагинов, набито огромное количество шишек и time to market сведен практически к нескольким часам.

Я завтра буду рассказывать про создание плагинов для IDEA с нуля. Просто база, которую мне никто не рассказывал когда я начал все это изучать год назад.

Приходите завтра на митап, думаю мой доклад будет вам полезен. Регистрация бесплатная, записи тоже будут, скорее всего в ютубе.

Если кому-то будет сложно понимать мою английскую речь, может быть потом сделаем ещё небольшой воркшоп на русском?
Собирайте вопросы, проблемы, может быть запишу отдельный ролик как работать с плагинами и платформой.

——

Ссылка на митап

Ссылка на статью

——

@handle_topic
1🔥175👍3
Немного искусства.


DeadOS Band выпустил песню про PHP,
Я считаю, что конференции по PHP теперь должны начинаться под эту песню, живое исполнение, или хотя бы с хештегом #пхпжив, #пхпвмоемсердце.

Больше всего мне понравилось вот это:

Вместо точек пишу тире стрелочка с детства
Умирал вместе с пыхой чтобы снова воскреснуть


Кстати, я в этом парте подумал, что 3 секунды – это дофига.
Где 3 секунды у ларки, там 1 у Symfony и 0 у Yii3.

У нас многопоточность, скорость и мощь
Компиляция, типизация всегда рады помочь
Плюю им в лицо - это громоздкий хлам
Laravel за три секунды разрушит ваш храм


Есть еще более крутая песня про ООП, поэтому велком слушать кто любит репчик.



Ссылка на DeadOS



@handle_topic
1🔥74👍2
🖼️ PHP 8.5 🐘

На днях вышла новая версия PHP 8.5

Обзор новых возможностей сделал Валентин Удальцов еще месяц назад на Стачке.
PHP не стоит на месте, развивается уже 30 лет маленькими шагами. В этом году даже я принял участие в развитии и запилил пару PR с улучшением доки для старта, RFC с внедрением CHIPS и еще пяток идей / RFC которые закрылись на моменте обсуждений / голосований / локальных переписок.

Пока все обсуждают какие фичи вошли в релиз, подсвечу что не вошло в релиз:
- PFA: Partial Function Application
- True Async
- OOP cURL
- Data Classes
- SEF: Single Expression Function
- Алиас fn для function

Я думаю, что в новый релиз тоже что-то притащу, в этот раз что-то более существенное. Может быть перезакину свои прошлые идеи еще раз, но с большей подготовкой.

Из интересностей:
- Кажется, что TrueAsync проект так и не выйдет в мир
Голосование с перевесом в нет, Edmond Dantes уже написал свои мысли в internals.
Я сильно не погружался в код, но там обещалась база для работы корутин и/или event loop. Пока различные команды делают свои корутины на генераторах, файберах, экстеншенах, мы могли бы пользоваться хотя бы более производительной версией из коробки.

- Обсуждение обновлении политики обсуждения RFC заняло 3 месяца. База для internals.

- Роман Пронский уходит с позиции СЕО the PHP Foundation.
Боюсь представить как может измениться фонд и разработка PHP, если на его позицию найдут какого-нибудь “деда”, который будет обсуждать все идеи так же, как и обновление политик обсуждений.
Спасибо Роме за проделанную работу!



Выступление Валентина
Обсуждения разработки PHP
Список RFC
Письмо Дантеса



@handle_topic
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍105🔥3
Call plugin

Недавно изучал SDK для одного сервиса и в комментариях к методам увидел ссылки на конечные урлы:


// /api/v1/users
function users() {…}


Или что-то в этом духе.

Хоть апи и было закрытым под авторизацией, я подумал, что было бы очень круто дёрнуть эту апишку прям из редактора!

Мы знаем, что придет JSON ответ.
Мы знаем, что от GET запроса ничего страшного не случится (правда ведь, разработчики?)
Мы знаем пароли, хосты и ориентиры.

И теперь мы можем это сделать. Куда вывести ответ? Да прям там же.
Мне понравилось как в Database плагине делается режим запросов с выводом данных в таблицу под этим же запросом.

Я пока что придумал 3(4) сценария:
- консольные команды, люблю писать в коментах php yii command/name
- HTTP API запросы: HTTP Verbs + URI/path
- просто урлы, чтобы открыть их тут же
- SQL запросы, почему бы и нет, но не в первой очереди

Оцените полезность плагина от “ну норм” до “пушка гонка”.
Есть ли мысли что еще можно добавить?
Как назвать плагин? Так как оно будет “вызывать” что-то я назвал его пока что “Call”, но нужно понятное и продаваемое имя.

——

@handle_topic
1🔥10👍31
Intellij IDEA 2025.3

Вышла новая версия IDEA и IDE на этой платформе.
IDEA довольно хорошо оптимизируется в последнее время, раскатывая оптимизации на всех IDE.

Я, кстати, пользуюсь IDEA + PHP плагин, вместо PHPStorm.

Самое сочное:
- Islands design release. Мне очень нравится, использую еще с 2025.1, когда она появилась в бетке
- Unified distribution, теперь Community и Ultimate в одной IDE, разруливается подпиской
- Еще появился какой-то Agent/Client Protocol, что-то на MCPшном, пока не попробовал

Советую обновиться.



@handle_topic
1👍9👏21
Forwarded from Пых (Валентин Удальцов)
🐘 PHPeople

Ребята, мы с Данилом с CutCode запускаем новый проект для PHP-сообщества!

🧩 Проблема

С одной стороны, в сообществе есть куча крутых ребят, готовых делиться опытом, обозревать тулинг и контрибьютить в экосистему PHP. Но без материального поощрения на это трудно выделить время и силы. Условный Boosty обходится дорого, а страницу там ещё как-то надо продвигать.

С другой стороны, есть вы — аудитория, которой в 2024 не хватило онлайн-контента. И вы наверняка готовы поддержать авторов, заплатив разумные деньги за хорошие материалы, которые можно прочитать и обсудить в Телеге, "не отходя от кассы".

💡 Решение

Мы с Данилом разработали платформу по модели подписки на базе Telegram — PHPeople.

Подписка двухуровневая:
1. обязательная на общий чат — "лобное место" для всех участников, тут периодически публикуется часть контента авторов и можно обсуждать вопросы широким кругом;
2. опциональная на любые авторские чаты — собственное пространство каждого автора и его подписчиков.

Стоимость каждой подписки — 150₽. То есть, например, чтобы подписаться только на Дмитрия Дерепко, вам нужно внести 300₽ (общий чат + авторский). На Кирилла Несмеянова и Алексея Гагарина — 450₽ (общий чат + 2 авторских).

👨‍🏫 Авторы

Пока их пятеро:

Кирилл Несмеянов уже набросал всякой хардкорной дичи,
Алексей Гагарин начал писать про разработку Testo — убийцу PHPUnit,
Олег Мифле придумал отрефаторить старый ball of mud на Symfony и микросервисы,
Дима Дерепко расскажет про свои плагины и разработку Language Server.

Я тоже автор. На PHPeople буду проводить закрытые стримы и публиковать посты для Пыха на пару недель раньше. В моём чате уже есть несколько постов про типизацию и нюансы Docker Compose и запись стрима про скаффолдер репозиториев Thesis и Typhoon.

🚀 Давайте пробовать!

Мы провели закрытое бета-тестирование и теперь готовы пригласить всех! Залетайте в @phpeople_bot, там можно подробнее со всем ознакомиться и присоединиться.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥62👍2👎1
Полезности сегодняшнего дня.

Visitor – удобный паттерн, чтобы пройтись по родительским элементам и дочерним, при это сохраняя какой-то контекст для выполнения действий.

Задача:
- Написать валидатор минут, часов, дней, месяцев, дней недель для крон выражений

Решение №1
- Получает выражение
- Берем первый элемент
- Понимаем что в нем содержится
- Отправляем в валидатор

Минусы в том, что в выражении конкретной позиции может быть несколько типов:
- Перечисление: 1,2,3
- Диапазон: 1-5
- Шаг: 2/3
- Комбинация: 1-5,10-15/2,3,4,5

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

Таким образом, решение №2 очень элегантным:
- Создаем визитор на весь файл, чтобы пройти по всем выражениями
- При заходе в минутный паттерн, создаем новый визитор для минут, описываем нужную логику: разрешены цифры 0-59
- При заходе в часовой паттерт, создаем новый визитор для часов. Разрешены 0-23 числа
- При заходе в месяц можно дополнительно проверить еще и строковое представление
- И так далее

Таким образом, если мы будем парсить минутный диапазон 1-10/2, то наш минутный визитор пройдет через: 1, 10 и 2.
Любое из этих чисел ни при каком условии не должно быть вне диапазона 0-59.

Если мы захотим написать валидатор для диапазона, вы знаете как это можно будет сделать :))))

Пост был в PHPeople еще месяц назад, подписывайтесь через @phpeople_bot
1👍84🔥2