dzz: Dizzy の冬 (Default)
[personal profile] dzz
В мире есть вещи, понимание которых выводит тебя на новый уровень осознания Вселенной.

Например, регулярные выражения

:)

Хм-ммм...

Date: 2024-06-17 12:55 pm (UTC)
de_nada: (Default)
From: [personal profile] de_nada


В смысле — постоянная потребность/необходимость/практика высказывать то, что хочется/нужно, не слишком заморачиваясь тюнингом вокабуляра?? ;))

С одобрением.

p.s. Ага, я в курсе, что такое "регулярки" (regexp`ы)... :)))

Date: 2024-06-17 02:00 pm (UTC)
From: [identity profile] dzz.livejournal.com

Ну, вроде того :)

Вообще, я сегодня открыл для себя новую сторону PCRE и победил nginx, заставив его делать одну очень нестандартную вещь. Вот прямо горд собой :)

Date: 2024-06-17 04:59 pm (UTC)
From: [identity profile] a-konst.livejournal.com

Такие достижения очень духоподьемны.

Date: 2024-06-17 07:43 pm (UTC)
From: [identity profile] dzz.livejournal.com

Точно так :)

Хм-ммм...

Date: 2024-06-18 09:28 pm (UTC)
de_nada: (Default)
From: [personal profile] de_nada


А не будет ли столь любезен многоуважаемый джин приоткрыть завесу тайны над своей ачивкой? :)
Что там такого интересного-нестандартного произошло?

А то я сам не чужд прекрасного и тоже в данный момент домогаюсь от nginx`a не самого распространённого — а именно проброса через него (в роли реверс-прокси) https`a до внутреннего RDG.
Ну вот надо мне! ;)


"Прежде чем писАть, буду читать комментарии"(с) :))
Уже увидал в этой "перловке" ниже по бороде комментариев — разбор nginx`ом URI.
Ну ОК, богоугодное занятие. :)

С интересом.

Edited Date: 2024-06-18 09:31 pm (UTC)

Re: Хм-ммм...

Date: 2024-06-18 09:51 pm (UTC)
From: [identity profile] dzz.livejournal.com
Приоткрываю. Есть некий веб-сервер, отдающий файлы по URI вида http://my_server.com/Userfile/Blablabla/1234567-89012.png.

При этом, источник файлов приходит в виде структурированного архива с совсем другой иерархией (например, files/png/1234/1234567-89012.png), а если файла нет на месте, то его нужно запросить у внешнего сервера, находящегося не под моим контролем, по URI исходного вида, но сохранить в ту же иерархию, что и остальные файлы.

В итоге, конфиг nginx-а для обработки запроса выглядит так:
# --== API runner ==--

upstream service_corn {
        server 127.0.0.1:8000 fail_timeout=0;
}

# --== URI mapping ==--

map $request_uri $file_suffix { # File name suffix
    default "";
    "~.\.(?<suffix>.{3})$" $suffix;
}

map $request_uri $file_name { # File name
    default "";
    "~.+/(.+)$" $1;
}

map $file_name $file_prex {
    default "";
    "~^(?<prex>.{4})" $prex;
}

server {    # Storage server

    listen 80;
        server_name my_server.com;
        root /opt/storage;
        index index.html;

        location / {
                # rewrite URI
                rewrite ^/Userfile.+ /files/$file_suffix/$file_prex/$file_name;
                #return 200 "uri=$uri path=/files/$file_suffix/$file_prex/$file_name";
                try_files /$uri @getfiles;
        }

        location @getfiles {
                proxy_set_header Host $http_host;
                proxy_redirect off;
                proxy_pass http://service_corn;
                rewrite .+ /api/get_file?uri=$request_uri&path=$uri break;
        }
}


Логика обработки: Путь к файлу из URI трансформируется в корректный при получении запроса (тут работает многопоточность nginx-а), а если файла нет, то исходный URI и реальный путь передаются для скачивания и сохранения процессу, обслуживающему API-запросы (см. upstream и proxy_pass). "Blablabla" просто вырезается, так как не влияет на определение реального пути к файлам.
Edited Date: 2024-06-18 10:05 pm (UTC)

Date: 2024-06-17 02:13 pm (UTC)
From: [identity profile] geladen.livejournal.com
травматизм от перла, идеальным выражением которого являются pcre — да, весьма специфический, и глубокий.
прорывается через любой синтаксис — хоть жабу, хоть питон. я даже знаком с чуваком, который способен писать перловые программы на лиспе.
(так, по лёгкому флёру write-only, мы, люди 20го века, узнаём друг друга)

Date: 2024-06-17 04:22 pm (UTC)
From: [identity profile] dzz.livejournal.com

LISP сам по себе требует вывернутых мозгов. Я не говорю, что это плохо, наоборот, выверт похож на тот, что нужен для pcre, так что тут полная синергия :)

Скажу честно, я, несмотря на нехилый опыт применения RE, только недавно узнал про синтаксис (?'groupname'...). Обычно "матч-немачт", и все дела.

Date: 2024-06-17 04:43 pm (UTC)
From: [identity profile] geladen.livejournal.com
тут могу только процитировать классика
https://xkcd.com/224/

Date: 2024-06-17 07:42 pm (UTC)
From: [identity profile] dzz.livejournal.com

Этот стрип висел у меня над рабочим столом с 2012 года :)
Автор XKCD временами гениален.

Date: 2024-06-17 08:42 pm (UTC)
From: [identity profile] geladen.livejournal.com
всю дорогу гениален!
у меня к его творчеству отдельная сентиментальная привязка — немало неловких ситуаций в моей жизни связаны с моим неудержимым желанием поделиться гиковской радостью XKCD с цивилами.

Date: 2024-06-18 10:11 am (UTC)
From: [identity profile] dzz.livejournal.com

Из любимого — https://xkcd.com/673/

:)

Date: 2024-06-17 10:39 pm (UTC)
From: [identity profile] 14op.livejournal.com
pcre — жалкое кастрированое подобие настоящих перловых регулярок, в которые можно половину самого перла запихнуть (вторую нельзя только потому, что это вызовет сатану)

Date: 2024-06-18 07:50 am (UTC)
From: [identity profile] dzz.livejournal.com

Угу, и из-за этого перловый код, написанный в "хорошем перловом стиле" относится к категории write only. Через полгода сам автор не всегда вспомнит, как оно работало :)

Date: 2024-06-18 12:34 pm (UTC)
From: [identity profile] 14op.livejournal.com
Ну почему же write-only, код от пейсателей, чересчур серьезно воспринявших perl cookbook и иже с ними, оченно приятно почитывать (темным зимним вечером, завернувшись в плед и укрывшись котом). Читаешь и ахаешь от авторской креативности, неожиданных находок и красивых хаков. На работе, понятно, подобное лучше обходить стороной, во избежание десятикратного перерасхода времени на расшифровку.
Edited Date: 2024-06-18 12:35 pm (UTC)

Date: 2024-06-18 12:48 pm (UTC)
From: [identity profile] dzz.livejournal.com

У меня есть печальный опыт восстановления алгоритма по такому перловому коду с оригинальными находками. Травма на полжизни :)

Date: 2024-06-17 03:56 pm (UTC)
From: [identity profile] parakhod.livejournal.com

regex101 dot com.


Нехай железное машыно их понимает.
А наше дело их написать так чтобы оно их поняло (и желательно не превратно).
Самим же нам их понимать глубоко необязательно.

Date: 2024-06-17 04:14 pm (UTC)
From: [identity profile] dzz.livejournal.com

Ну... надо ж понимать, что ты написал :)))

У меня была хитрая задачка с конфигурацией nginx-а, и я её, в итоге, решил. Так, что URI два раза преобразуется налету по условиям, и многопоточность не пришлось в двух местах сооружать.

Edited Date: 2024-06-17 04:15 pm (UTC)

Date: 2024-06-17 05:37 pm (UTC)
From: [identity profile] parakhod.livejournal.com

Ну зачем понимать... Главное чтоб оно работало ))

А такие задачки люблю, да.
Я однажды шелл-скриптик написал который при деплое контейнера с nginx генерил для него из темплейта конфиг (в зависимости от выданных переменных) и он тоже с помощью регекса генерил регекс собсна для конфига. И на удивление оно работало. До сих пор не понимаю как.
Оно ещё статический конфиг для эликстирного бэка генерило для полного веселья своим копипастным близнецом в другом контейнере.

Date: 2024-06-17 07:07 pm (UTC)
From: [identity profile] jno2004.livejournal.com

Я воздерживаюсь от них пока возможно. А так-то пипл строку по пробелам делит ими...

Date: 2024-06-17 07:10 pm (UTC)
From: [identity profile] logizmo.livejournal.com

Там вообще ничего сложного

Date: 2024-06-17 07:41 pm (UTC)
From: [identity profile] dzz.livejournal.com

Там есть некоторое количество фишек, до которых сразу не допрёшь.
Когда знаешь — "ничего сложного", но ты уже вышел на новый уровень ;)

Ну и синтаксис не так чтобы очень человекочитаемый.

Date: 2024-06-17 08:03 pm (UTC)
From: [identity profile] jno2004.livejournal.com

У них производительность ниже плинтуса. А в тяжёлом случае ещё и варьируется сильно.

Date: 2024-06-17 08:31 pm (UTC)
From: [identity profile] dzz.livejournal.com

Конкретно у PCRE невысокая, да. Есть более быстрые реализации.

Но мне в данной задачке не нужна была высокая производительность, нужно было в цикле обработки запросов nginx-а разобрать URI и перегруппировать его по определённым правилам динамически.

Date: 2024-06-18 06:28 am (UTC)
From: [identity profile] jno2004.livejournal.com

Потому и "пока можно". Так-то grep/sed/awk/vim - там без них никуда.

Date: 2024-06-18 07:52 am (UTC)
From: [identity profile] dzz.livejournal.com

Жень, это там, где можно воткнуть grep/sed/awk. Поддерживал бы nginx в конфигах какой-нибудь процедурный язык, я бы на нём и написал. Уже смотрел в сторону модуля lua, пока не допёр, как сделать на регулярках.

Date: 2024-06-18 07:56 am (UTC)
From: [identity profile] jno2004.livejournal.com

ну, nginx — он такой, да.


тут думаю не свалить ли с него на лайти для домашних нужд…

Date: 2024-06-17 08:01 pm (UTC)
From: [identity profile] jno2004.livejournal.com

При чём тут "сложность"?

Date: 2024-06-17 08:03 pm (UTC)
From: [identity profile] logizmo.livejournal.com

Просто лень? Все ясно

Date: 2024-06-17 10:16 pm (UTC)
From: [identity profile] kholod.livejournal.com
Тот самый случай, когда вслепую перебираешь заклинания, иногда добиваясь нужного ответа. Колдовство, не иначе. И так до сих пор

Date: 2024-06-18 07:53 am (UTC)
From: [identity profile] dzz.livejournal.com

Ну... Я вот радуюсь, что часть магии по имени grouping осилил :)

December 2025

S M T W T F S
  12 3456
7 8 9 10 11 1213
14151617181920
21222324252627
28 29 3031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Dec. 31st, 2025 08:36 pm
Powered by Dreamwidth Studios