strtr vs. str_replace

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

Кроме того, часто выход какой-то новой версии обесценивал результаты большинства исследований в этой области. Недавний выход «семёрки» с блеском это продемонстрировал.

Среди подобных текстов есть и вредные. Речь об одном из них и пойдёт. Впервые на сравнение производительности функций str_replace и strtr (с одним параметром) я наткнулся очень много лет назад, тогда с ним разобрался и тему для себя закрыл.

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

Итак, есть две функции, которые ведут себя очень похожим образом — заменяют в строке что-то одно на что-то другое. Велик соблазн объявить их совершенно одинаковыми (что часто и происходит), тем более их описание в руководстве по языку не акцентирует внимание на различиях. Но они есть, и очень важные.

Обратите внимание на этот код:

$r = ['xo' => 'xaxе', 'xa' => 'xo'];
$s = 'xoxo';

var_dump(str_replace(array_keys($r), array_values($r), $s)); // xoxеxoxе
var_dump(strtr($s, $r)); // xaxеxaxе

Очевидно результаты разные, но почему? Потому что str_replace делает замену «в лоб» — проходя строку несколько раз, по числу заданных замен. Поэтому получается «xoxo» → «xaxexaxe» → «xoxexoxe».

Функция strtr куда более хитрая, но работает более… естественным что ли образом — т. е. так как обычно человек ждёт от функции множественной замены. Самое главное — в сделанной замене она уже ничего не заменяет.

Есть и другое отличие:

$r = ['user1' => 'one', 'user11' => 'eleven'];
$s = 'user11';

var_dump(str_replace(array_keys($r), array_values($r), $s)); // one1
var_dump(strtr($s, $r)); // eleven

Мой пример выглядит несколько искусственно, но это часть случая из жизни, правда очень упрощённого. Тут беда в том, что str_replace применяет свои замены слева направо — в порядке перечисления, тогда как strtr сначала сортирует их по длине.

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

3 комментария

В последний раз о Кандауровых

О своих предках Кандауровых (или Кондауровых) я писал несколько раз ([1], [2], [3]), сегодня, видимо, напишу в последний, чтобы поставить символическую точку, так как источники кончились, продвижения дальше не будет.

Кандауровы (38.96КиБ)

Эта ветка выделяется тем, что она у меня рекордсменка — самый дальний предок жил аж в 16-м веке. Точных дат у меня нет, но по понятным ограничениям Данила Кандауров не мог родится в 17-м веке.

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

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

Дерево в цепочках

Дерево в цепочках (120.20КиБ)

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

В общем, там где мне совсем сильно жмёт, я пишу иногда небольшие скрипты. Недавно написал очередной и решил поделиться. Этот скрипт (написан на ПХП7) позволяет развернуть дерево в формате GEDCOM (это общепринятый формат для хранения информации о родословной) в цепочки — то есть простраивает все пути от указанного человека до каждого его предка.

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

Для запуска требуются два параметра: нужно указать путь до файла дерева и идентификатор человека, от которого нужно простроить цепочки, его надо посмотреть внутри файла (GEDCOM текстовый формат). Для этого нужно найти внутри запись нужной персоны и выше неё — строку вида «0 @буквыцифры@ INDI», вот часть «@буквыцифры@» и будет требуемым идентификатором.

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

Первые социальные сети

Итак, первый брак, заключенный дистанционно, с трансляцией в режиме реального времени, по итогам знакомства в социальной сети, — это брак Сары Ортен из Питтсбурга и Томаса Уэлша из Цинцинатти, познакомившихся в телеграфном «чате» (популярное развлечение тех лет) в 1883 году. Приглашение на виртуальную свадьбу получили все, кто в тот момент находился «он-лайн».

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

И обо всем об этом пишет Джей Клейтон в замечательной книжке «Dickens in Cyberspace: The Afterlife of the Nineteenth Century in Postmodern Culture».

Проблема «в интернете никто не знает, что ты кот» существовала уже в 19 веке.

2 комментария

🎈 Он улетел, но обещал вернуться

График постов в блог (46.23КиБ)

Кажется со мной происходит одна вещь, которую очень трудно оценить изнутри. Трудно настолько, что я не понимаю — происходит ли это на самом деле. Вроде какие-то звоночки есть, но они в целую картину складываются настолько с трудом, что это выглядит натяжкой.

Кажется я теряю интерес к окружающему миру и ухожу в себя. Наверху я вывел график постов в блог (строка кода наверху — это я Пайтоном считал статистику, блог у меня на текстовых файлах работает), снижение отчётливо видно после переезда в Казань. На провал 2005—2007 можно внимания не обращать — если я ничего не путаю, тогда я на ЖЖ переключался.

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

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

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

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

34 комментария

☭ Антисоветская шутка

Шутка во всей красе (105.47КиБ)

На картинке нарисована старая антисоветская шутка. Сможете расшифровать смысл?

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

👅 Болтун — находка для шпиона

Я тут английским занялся плотно в конце прошлого года, репетитор, сериалы с субтитрами, вот это всё. Вчера смотрел очередную серию «Друзей» на английском и, может не к месту, вспомнил свой самый первый опыт устного общения с носителем английского.

Было это в примерно в самом конце 90-х, когда я ещё в Университете учился, параллельно лаборантил на своём же факультете.

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

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

Осталось за малым — облечь моё соображение в слова. К сожалению, и это на тот момент мне далось с огромным трудом. Я потерпел полное фиаско, попытавшись сформировать в голове фразу.

Но отвечать что-то было надо — как-то невежливо было молчать, поэтому я выдавил из себя наиболее смысловое из бесформенного бардака английских слов, который никак не мог сгрести в осмысленную фразу:

— Slowly!  — «Slowly»? Hm… «slowly»… — удивился иностранец.

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

3 комментария

🏠 Дом Микляева в Казани (17 век)

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

Сегодня благодаря Олесе Балтусовой (за что ей огромное спасибо) побывал в так называемом «доме Михляева» (правильно — Микляева).

Во многих современных источниках это здание называется самым старым гражданским зданием Казани и её первым каменным жилым домом. Его постройка датируется концом 17 века, хотя есть мнение, что дом мог достраиваться, а значит некоторые его части могут иметь другую датировку.

Иван Афанасьевич Микляев был настоящим олигархом своего времени — крупнейший в Среднем Поволжье подрядчик вина, крупный заводчик (несколько собственных предприятий и паи), аграрий, речной судовладелец, ростовщик.

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

Сейчас Микляева чаще вспоминают как человека, благодаря которому был построен Петропавловский собор — красивейший в Казани, один самых ярких образцов стиля петровской эпохи.

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

Но вернёмся к дому. В настоящее время он находится на территории швейной фабрики «Адонис» и попасть в него с улицы не так-то легко. Здание сейчас не эксплуатируется, поскольку находится в аварийном состоянии — в одном месте уже провалилась крыша, сейчас проводятся работы по его спасению.

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

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

Интерьер старого помещения с облупившейся белой штукатуркой, кирпичной кладкой, арочными нишами, ржавыми трубами и строительным мусором.
Заложенное окно и проём — такое встречается часто

Впрочем, дом, очевидно, достраивался и ранее — в одном из углов дома видны клеймённые кирпичи с инициалами «МЧ» («Мария Челышева» — она владела кирпичным сараем при деревне Малые Клыки в конце 19 века), которые в других частях дома на глаза мне не попадались, а в подвале вообще часть стен сложена из тёсанного камня, в отличие от другой, кирпичной части.

Крупный план старой кирпичной кладки с остатками снега в швах; на двух кирпичах видны выбитые буквы «МЧ».
Кирпичи с клеймом производителя — «МЧ». Их довольно много на левом углу со стороны фасада
Угловое пространство подвала с каменными стенами, покрытыми солями и облупившейся штукатуркой, ржавыми трубами и деревянным потолком.
В подвале есть стена из тёсанного камня

Выдаёт какие-то работы по изменению дома и форма окон — на фасаде есть три их различных типа. То ли дом в своё время от чего-то пострадал и реставрировался, то ли состоял из нескольких разных секций и позже был объединён. Или возможно использование в левой части дома кирпичей конца 19-го века и более простая форма окон там же выдают более поздний пристрой к дому.

Фрагмент фасада старого кирпичного здания с декоративной кладкой, окнами в резных наличниках и черной водосточной трубой под ясным голубым небом.
Очень хорошо видно, что на фасаде встречаются окна нескольких типов

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

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

Очень хочется, чтобы дом получил второе рождение и радовал жителей Казани ещё ни одну сотню лет.

Оставить комментарий

Подпилил переподсоединялку вайфая

Чуть поменял «переподсоединялку вайфая» для Мака — теперь пингуется не 8.8.8.8 (это ДНС Гугла), а адрес гейта, что более надёжно. Правда с конца октября, когда я её написал много воды утекло — вайфай у меня отваливается теперь очень редко, уж не знаю что изменилось.

2 комментария

Пуговица с острова сокровищ

Пуговица (134.59КиБ)
Пуговица с завода Бухъ

Как-то, в седьмое «посещение острова сокровищ» выкопал пуговицу со ржавым задником — там смутно угадывались какие-то буквы, но и только. Ничего определённого видно не было.

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

Это оказалась фабрика Бух. Надпись полностью выглядит следующим образом (буквы «эс» неясно по какой причине оборотные):

«БУХЪ Buch 1 Сортъ Ƨ PETERƧBURG»

Фабрика Бух — одна из самый известных пуговичных фабрик России. Была основана в 1816 году в Санкт-Петербурге Иоганом Траншелем и Бургардом Бухом, 1840 гг. была перешла Агатону Карловичу и Герману, которые основали фирму «Братья Бух» — с такой надписью я пуговицу уже как-то находил.

Фабрика ещё потом несколько раз меняла владельцев и название (но фамилия «Бух» в нём неизменно сохранялась), пока не наступила революция.

2 комментария

🐱 Кот и весы

Кот (65.09КиБ)

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

Недавно в нераспознанных значениях появился ещё один участник — коту почему-то нравится время от времени садиться на весы, уж не знаю почему. Теперь мы точно знаем динамику веса нашего кота.

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

🌊 Поверка счётчиков воды

Подошёл срок замены водяных счётчиков дома. Дело длительное, да и не из дешёвых — у меня четыре счётчика, за всё около 5 тысяч. Интересно стало — так ли необходима их замена и какие есть альтернативы.

Оказалось, вместо замены можно втрое дешевле выполнить поверку счётчиков, причём это довольно быстро, делается на дому и даже не требует их снятия. Мне эту процедуру провели специалисты «Казметрологии». 

Подключение прибора поверки (92.12КиБ)
Установка поверочная переносная УПСЖ 3 ПМ

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

Крепление трубки (83.18КиБ)
Вот так крепится трубка установки

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

Засекает отсчёт (62.89КиБ)
Мастер засёк начало поверки кнопкой на выносном пульте

Для каждого напора погрешность должна быть в пределах нормы. У меня все счётчики безбожно врут, придётся всё же менять. Как мне сказали, примерно половину счётчиков на вызовах меняют — не проходят поверку.

Погрешность моего счётчика (48.68КиБ)
Погрешность одного из моих счётчиков — почти 8,5%

На фото выше результат одного из моих счётчиков в ванной — 8,4%, это слишком высоко, надо менять. У меня установлены счётчики «Бетар» СГВ-15, их средний срок службы — 12 лет.

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

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

⛪ Деревня, которой ранее не было, а потом появилась

д. Что была пустошь… (154.66КиБ)
Деревня, что была пустошь на горе, вниз по горе, меж речек

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

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

Куюк (29.06КиБ)
Деревня, что была пустошь на горе, а стала Куюк

Как бы то ни было, стало интересно как этот населённый пункт называется теперь. Искать было непросто, так как ни один из населённых пунктов на этом куске карты не сохранил в точности то же название, но тем не менее, нашёл. Это теперь деревня Куюк Сабинского района.

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

Оставить комментарий

← сюда туда →