Ярославль

Ярославль — город, входящий в Золотое кольцо России, наверняка, один из красивейших городов России, жаль у меня не было времени в этом убедиться. Надо будет приехать туда летом.

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

Любить окружающую действительность мне в такую погоду трудно, а город, который в такой момент является частью этой действительности — ещё сложнее. Ярославлю — 1000 лет, об этом в городе написано на каждом столбе, но праздника в городе не ощущается.

Я помню празднование наглого тысячелетия в Казани (в 2005-м), кругом новый асфальт, урны, покрашенные заборы и прочее,… с Ярославля либо не пытались сдуть пыль, либо было ещё хуже.

Синий флаг с гербом, изображающим чёрного медведя на белом фоне, развевается на столбе на фоне серого неба и голых ветвей деревьев.
Баннер с гербом Ярославля (медведь с копьем) и надписью «Ярославль» на фасаде здания, перед ним припаркованы автомобили.
Граффити с гитарой и надписью «1000 мелодий» на стене здания, вид из-за припаркованного автомобиля в дождливый день.
Вход в ателье с вывеской «РЕМОНТ ПОШИВ» и списком услуг: одежда, изделия из кожи, меха, ткани. Слева — табличка с режимом работы.
Флаг с гербом и надписью «Архангельск» на фоне серого неба, прикрепленный к столбу с проводами.
Белая входная дверь с синим логотипом «Аромакафе» в виде трёх кофейных зёрен и надписью, установленная в розовой стене.

Я люблю думать, гуляя по улицам какого-либо города — что если мне завязать глаза и повозить 5-6 часов, а потом выпустить, отличил бы я — вывезли меня из Москвы или я ещё в её пределах? Мне показалось, что, выпусти меня в Ярославле, я бы понял, что я не в Москве. Но я так и не понял, на чём это ощущение основано.

Кажется, в Ярославле всё те же не прополотые корни прошлого, что и в Москве…

Фасад здания с надписью «ЮНЫЙ ТЕХНИК» и абстрактной мозаикой из геометрических фигур и слов «САНТЕХНИКА», «МАТРИЦА», «ОБЩЕСТВЕННОЕ
На фасаде здания вывеска «IDEA ГИПЕРМАРКЕТ МЕБЕЛИ» с надписью «СКОРО ОТКРЫТИЕ», адрес: Полушкина роща, д. 9, телефон: 67-17-67, логотип «ТАНДЕМ».
Белая статуя мальчика на колонне в саду среди хвойных деревьев с желтой листвой и цветущих кустарников.
Бронзовый памятник сидящему мужчине на высоком каменном постаменте с надписью «В.И. Ленин» на фоне здания с арочными окнами и деревьев.

То же народное творчество на стенах…

Мурал на кирпичной стене: реалистичное изображение головы собаки в окружении стилизованных цветов и листьев, частично скрыто деревьями, на земле — опавшие листья и лужи.
Заброшенное здание с разбитыми окнами и кондиционерами, вдоль которого тянется бетонная стена, покрытая граффити, на фоне зелёной травы.

Те же однообразные и одинаковые по всей стране пятиэтажки и старые дворики…

Детская площадка с качелями и качалкой-балансином, огороженная рядом разноцветных покрышек, на фоне жилого дома и деревьев.
Мокрая городская улица с движущимися автомобилями, пешеходным переходом и жилыми домами с магазинами на первых этажах под дождём.
Два человека идут по осеннему парку мимо жёлтого многоэтажного дома с магазинами на первом этаже; на переднем плане — деревья и упавшие листья, на дороге — чёрный внедорожник.
Черный автомобиль припаркован на асфальтированной дороге между двумя желтыми жилыми домами, окружёнными высокими деревьями с желто-зелёной листвой в солнечный день.

Те же памятники старины…

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

То же самое разгильдяйство везде — даже на кладбище…

Надгробие с портретом и цветами на фоне других памятников и ржавой решётки среди осенних листьев.
Погребальный памятник с табличкой «Ефимов Владимир Прокофьевич 28.04.1943–2017», окружённый зелёной растительностью и чёрной металлической оградой.

Конечно, может быть я узнал о том, что не в Москве по многочисленным упоминаниям названия города…

Фасад здания Дома культуры железнодорожников узла Ярославль-Главный с красной лентой «Россия живет дорогами» и логотипом РЖД
Жёлтое здание вокзала с часами на башне и надписью «Казанский вокзал», перед ним — автомобили, автобусы и пешеходы на улице под облачным небом.

Или по реке, разве река Москва течёт так же несуетно?

Длинный металлический мост через реку под пасмурным небом, с набережной и перилами на переднем плане.
Вид на реку с набережной: вдали белое теплоходное судно, берег с осенними деревьями и зданиями, на воде два буя, на переднем плане — чёрное ограждение и фонарь.
Металлический железнодорожный мост через реку на фоне осеннего берега и пасмурного неба.
Белый теплоход стоит у берега реки на фоне осенних деревьев и моста; в воде видны три буя под пасмурным небом.
Вид на набережную с мокрой асфальтированной дорожкой, зелёными газонами, фонарями и перилами вдоль реки; на воде — буйки и теплоход, на заднем плане — мост и осенние деревья.

Может отличаются люди? Или они везде одинаковые?

Прогулка по осенней аллее у белого здания с колоннами: люди идут по мокрому тротуару, деревья в жёлто-зелёной листве, на заднем плане — припаркованные машины.
Большой рекламный щит с надписью «МАРИЯ» и логотипом ASUS на фоне осенних деревьев и мокрой дороги с автомобилями и светофором.
Жёлтое здание с вывеской «РОСТЭК» и информационным стендом, рядом — серебристый автомобиль, пешеход и деревья на фоне другого здания под облачным небом.
Четверо людей идут по тротуару вдоль здания с розово-белым фасадом и вывеской «Книжный магазин», рядом — ряд деревьев и припаркованные автомобили.
Осенняя улица с деревьями, покрытыми жёлтыми листьями, и металлической рамой на тротуаре; справа — здание с вывеской «Интер Кафе», слева — парковка с автомобилями.

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

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

7 комментариев

PHP4 без XML-парсера, плюс XPath

Я недавно написал простенький парсер XML для PHP 4.3+, для случаев, когда никакого встроенного парсера XML на хостинге не оказалось.

А вчера мне подумалось, что парсить XML в дерево это, конечно, замечательно, но пользоваться этим всё равно неудобно. Было бы неплохо дать возможность получать произвольные узлы так же просто, как это делается при помощи XPath.

Весь XPath я, конечно, реализовывать не буду, да мне столько и не надо. В общем, написал класс, который используется в паре VerySimple_XMLParser. Реализованы получение потомков тега, «*», «node()» и «text()». Это всё, но мне хватит.

// Simple XPath for VerySimple_XMLParser
// /
class VerySimple_XMLParser_Tree
{
    var $path;
    var $counter;
    var $xpath;
    
    function VerySimple_XMLParser_Tree()
    {
        $this->path = array('/');
        $this->counter = 0;
        $this->xpath = array();
    }


    function collect($type, $args)
    {
        $path = implode($this->path);

        switch ($type) {
            case 'TEXT':
                $this->xpath[$path . $this->counter . '/text()/'] = $args;
                $this->counter++;
                break;

            case 'TAGOPEN':
                list($name, $attributes) = $args;

                $tag = $this->counter . '/' . $name . '/';

                $this->xpath[$path . $tag] = $attributes;
                $this->counter = 0;

                $this->path[] = $tag;
                break;

            case 'TAGCLOSE':
                $this->counter = 1 + (int) array_pop($this->path);
                break;
        }
    }

    function halfxpath($path)
    {
        $keys = array_keys($this->xpath);
        $trans = array(
            '\/'       => '\/\d+\/',
            '\*'       => '[^\/()]+',
            'node\(\)' => '[^\/]+',
        );

        $filter   = strtr(preg_quote($path, '/'), $trans);
        $filtered = preg_grep("/^$filter\/$/su", $keys);

        $nodes = array();

        foreach ($filtered as $key) {
            $nodes[$key] = $this->xpath[$key];
        }

        return $nodes;
    }
}

// а вот так это можно использовать:
$xml =<<<XML
<root>
    <a>
        <b><c>Xa!</c></b>
        <b>Hello</b>
    </a>
    <a name="value"/>
</root>
XML;

$tree = &new VerySimple_XMLParser_Tree();

$sax = &new VerySimple_XMLParser(array(&$tree, 'collect'));
$sax->parse($xml);

echo '<plaintext>';
var_dump($tree->halfxpath('/*/a/b/text()'));
var_dump($tree->halfxpath('/*/a/b/node()'));
var_dump($tree->halfxpath('/*/a/b/*'));
var_dump($tree->halfxpath('/root/a'));

Метод для запросов я назвал «halfxpath», намекая, что это не настоящий XPath, а лишь неполноценная эмуляция.

Основная идея, как видно из кода — не парсить XML в дерево, а помещать каждый элемент по специального вида пути, который потом будет проверен на совпадение по регулярному выражению, приготовленному из запроса.

5 комментариев