PHP7: функции → опкоды

Как известно, в ПХП7 некоторые функции будут заменены на опкоды для ускорения работы. Вызов функции — дорогая операция в этом интерпретаторе, а опкоды — дёшевы. Я заглянул в исходные коды (см. функцию zend_try_compile_special_func, если интересно) и нашёл там список функций, которые заменяются в текущей версии «семёрки».

Это strlen, все функции is_* (is_float, is_string и прочие), defined, call_user_func_array, call_user_func и assert.
2 комментария
3 марта 2015 15:29

Goracle

В прошлом году немного рассказывал о взаимодействии языка «Гоу» и «Оракла» — я тогда выбирал из двух драйверов и выбрал в итоге ГОракл. Всё в нём хорошо, да вот незадача — некоторые запросы не выполнялись, падало всё с невнятной ошибкой ORA-22060.

Разбирательство привело меня к мысли, что дело в числовых значениях — если запрос возвращал только строки, всё было нормально. Я тогда преобразовал всё при помощи TO_CHAR, разбирая внутри «Гоу» строку в число и успокоился.

На прошлой неделе мне пришлось озаботиться увеличением производительности получившего и разобрался в проблеме чуть детальнее. Не скажу, что понимаю в чём дело (в код драйвера не смотрел), но выглядит всё так, как будто драйвер падает, если на месте числа из «Оракла» может прийти NULL. Например, агрегатные функции (я пробовал сумму и среднее) падения не вызывают. Опять же, если «защитить» все числа функцией NVL — тоже всё хорошо.

Так что если вы видите при использовании этого драйвера ошибки похожие на те, что ниже
ERR=&oracle.Error{Code:22060, Message:"[-1] ORA-22060: argument [2] is an invalid or uninitialized number
ORA-22060: argument [2] is an invalid or uninitialized number
Попробуйте обернуть все числовые возвращаемые значения функцией NVL, должно помочь.
Комментировать
1 марта 2015 20:05

Мир — иллюзия

Платье (78.01КБ) Ребята, какого цвета платье? Ближе к бело-золотому или к чёрно-синему? Варианты оставляйте в комментариях.
21 комментарий
27 февраля 2015 20:44

Toki!

Десять лет назад я, с подачи Ильи Бирмана, выучил смешной язык (не программирования) — «токипона». Я редко о нём вспоминал, но послевкусие он оставил отличное — это был приятный опыт. Язык вполне реально выучить за 2—3 дня целиком, собственно ровно этим он и интересен.

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

На «токапоне», естественно. Причём, у Светы книга была с собой — в рюкзаке, поэтому у меня есть возможность показать фотографию. Токи пона (121.45КБ) Поделился этим с Ильёй, а он (напоминаю — десять лет прошло!) ответил мне на «токепоне», да ещё и удивился, что я ничегошеньки не помню. Заодно помог перевести надпись на книге: «Светлана! Солнце греет нас всех. Люби и твори добро. Соня».

Кстати, мы когда-то внесли свой вклад в язык — придумали слово «неделя» («tenpo pi pali ali»), правда в словари оно не вошло.
4 комментария
24 февраля 2015 00:02

PHP: бесполезная микрооптимизация

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

Выигрыш был мал, как по мне, но многим и этой разницы было достаточно.

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

Сегодня проверил — примерно так оно и есть (ниже — опкоды ПХП):
line     #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   2     0  E >   ADD_STRING                                       ~0      'double+'
         1        ADD_VAR                                          ~0      ~0, !0
         2        ADD_STRING                                       ~0      ~0, '+quotes'
         3        ECHO                                                     ~0
   4     4      > RETURN
Нет никакой разницы какой вид кавычек использован (в моём примере — двойные с переменной посередине) — внутреннее представление не различается.

Вывод такой: можно спокойно использовать двойные кавычки везде, кроме мест, где вам важно экранирование — там можно использовать одинарные, если это удобнее.
Комментировать
20 февраля 2015 09:03

PHP7: spaceship operator

В ПХП7 вошёл новый оператор — «космический корабль». Я его помню со времён программирования на Перле. Наиболее частое применение он, по всей видимости, найдёт в сортировках:
usort($data, function ($o1, $o2) {
    return $o1->value <=> $o2->value;
});
Комбинация «меньше», «равно» и «больше» — и есть «космический корабль». Результат его выполнения следующий — если левое меньше, получается «-1», если правое — «1», если значение равны, вернётся ноль. Для строк уже сейчас (с чётвертой версии языка) существует функция strcmp, которая делает то же.

Новый оператор сравнивает даже массивы и объекты, в RFC есть соответствующие примеры:
echo [1, 2, 3] <=> [1, 2, 1]; // 1
echo [1, 2, 3] <=> [1, 2, 4]; // -1

$a = (object) ["a" => "b"];
$b = (object) ["a" => "c"];
echo $a <=> $b; // -1
 
$a = (object) ["a" => "c"];
$b = (object) ["a" => "b"];
echo $a <=> $b; // 1
 
// only values are compared
$a = (object) ["a" => "b"];
$b = (object) ["b" => "b"];
echo $a <=> $b; // 0
В общем, какой-то особенной пользы в язык конструкция не принесёт, но в в неких частных случаях читаемость улучшится.
7 комментариев
19 февраля 2015 09:19

Частичный индекс в «Оракле»

В «Оракле», в отличие от «Постгреса», частичных индексов в чистом виде нет, но есть возможность их сэмулировать — достаточно построить функциональный индекс и возвращать NULL на значениях, которые нам в индексе не нужны. Например:
CREATE INDEX resolution_notice_d_o_r ON resolution_notice(
    CASE WHEN is_send_paper = 1 THEN org_id END,
    TRUNC(rdate)
)
Это немного видоизменённый реальный пример — таблица хранит море метаинформации, но нас намного чаще (в логике приложения) интересуют те записи, у которых флаг is_send_paper в значении «истина».

Чтобы «Оракл» узнал искомое в индексе, сравнение в запросе должно выглядеть так же. В общем, всё как в случае любого функционального индекса (лишнее я убрал):
SELECT …
     FROM …
INNER JOIN resolution_notice rn ON …
    WHERE dn.n = 0
      AND CASE WHEN is_send_paper = 1 THEN dn.org_id END = :org_id
     AND TRUNC(rn.rdate) BETWEEN :start_date AND :end_date
GROUP BY …
ORDER BY rdate DESC, …
Мне стало интересно — если попробовать сунуть условие индекса в сам индекс, догадается ли «Оракл» дальше не дофильтровывать по нему? Ну, то есть, сделать что-то такое:
CREATE INDEX resolution_notice_d_o_r ON resolution_notice(
     org_id,
     TRUNC(rdate),
     CASE WHEN is_send_paper = 1 THEN 1 END
)
А в запрос добавить:
… CASE WHEN is_send_paper = 1 THEN 1 END = 1…
Оказалось, «Оракл» не догадывается (у нас он 11-й, может 12-й тут сможет оптимизацию сделать): Условие (34.98КБ) Несмотря на то, что в выборке по индексу значений с is_send_paper других значений, кроме единицы нет, «Оракл» всё равно дофильтровывает по этому значению.
11 комментариев
16 февраля 2015 20:20

Julien Douvier

Анимированные фотография (3351.83КБ) Хочу посоветовать к просмотру великолепные анимированные фотографии Жульена Дувье. Завораживающее зрелище.
3 комментария
15 февраля 2015 18:59

Fitbit Surge

Давно присматривался к фитнесс-часам и браслетам, что-то читал, выбирал, пока жена разом не разрубила этот гордиев узел, подарив на февральские праздники «Фитбит Сёдж» — часы с кучей датчиков на борту. Для меня очень немаловажно, что их создатели много внимания уделили дизайну корпуса — сидят у меня на руке они просто отлично (это редкость — у меня тонкие запястья), приятный на ощупь браслет не доставляет дискомфорта. Фитбит Сёдж (93.70КБ) На борту — ГПС, трёхосевой акселерометр, трёхосевой гироскоп, цифровой компасс, оптический измеритель пульса, высотомер, датчик освещённости и вибрационный мотор.

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

Основные показатели (а так же некоторые настройки) можно посмотреть прямо на дисплее (перелистываются пальцем), остальное (включая статистику за предыдущее время) доступно в клиенте смартфона или компьютера. Клиент на смартфоне (141.26КБ) Со смартфоном синхронизация выполняется через блютуз, а с компьютером (что странно) — через небольшой модуль, вставляемый в ЮСБ и никак иначе. Собственно, клиента на смартфоне мне более чем хватает, так что это неудобство я не ощущаю.

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

Так же не работают уведомления о звонках и СМС, но тут объяснение другое — нет поддержки русского языка, поэтому часы просто не в состоянии отобразить информацию о человеке.

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

Самое ценное и любопытное же для меня в этих часах — отображение моей суточной активности. Я в последнее время всерьёз обеспокоен тем, хватает ли моему телу движения. Оказалось, что до нормы я не потягиваю. В день мне нужно ходить примерно на 2,5 тысячи шагов больше и проводить, в среднем, ещё минут 10 в фазе высокой активности (например — бегая по ступенькам).

Поймал себя на мысли, что стал чаще подниматься с рабочего места, чтобы пройтись до программистов, а то и просто постоять в кабинете, пока размышляю. Это дорогого сто́ит.
7 комментариев
14 февраля 2015 17:21

Сами́чка

Посмотрел прекрасный фильм «Игра в имитацию» про взлом шифра «Энигма», использовавшегося фашистами во Вторую Мировую и Алана Тьюринга, решил побольше почитать о предмете и наткнулся на интересную историю одного специфичного термина, связанного с расшифровкой «Энигмы».

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

Это приводило к неким повторениям, которые позже стали называть «females» (буквально — «женщины»). Откуда же такой название? В книге «Decrypted Secrets: Methods and Maxims of Cryptology» Фредриха Л. Бауэра есть объяснение:
В жаргоне Блетчли-парка термин «females» появился как производная от польского каламбура te same («the same») ↔ samiczka («female»). Большинство людей в Блетчли-парке не знали, фактически и не могли знать, польского оригинала и находили собственные объяснения…
То есть поляки из словосочетания «te same» (с польского — «то же самое») сделали жаргонное «сами́чка» (слово, по всей видимости, родственник нашей «самочки»), которую потом американцы перевели совершенно буквально («female»), не вдаваясь в этимологию.
3 комментария
11 февраля 2015 08:06

Трип

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

Ехал вчера поездом в Москву с коллегами, смотрели фильм по ноуту. Вероятно он мне что-то навеял и я вспомнил немного странную историю, которая приключилась со мной на позапрошлой конференции «404».

На этой конференции есть некоторое количество друзей и знакомых, которых я вижу раз в год или реже, естественно, общение с ними происходит после содержательной части конференции, поэтому спать я обычно, в продолжение всего «404», ложусь очень поздно, а встаю очень рано. Пробуждению способствует бассейн и сауна в отеле («404» каждый год проходит в «Холидей Инн Самара»).

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

До сих пор не знаю что на меня так повлияло — температура и недосып или психика среагировала на стресс, взяв за образец когда-то прочитанную статью — всё-таки это могло быть и самовнушение.
6 комментариев
6 февраля 2015 13:37

Говорящие часы

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

Во-первых, помогает ориентироваться в собственной скорости (уже 11 часов, а я так мало сделал!), во-вторых, позволяет выйти из состояния «залипания» — когда мысли распозлись, взгляд расфокусировался.

По кнопке «Настроить голос…» открывается меню, в котором можно выбрать русский голос, если это требуется.

Если у вас «Мак», рекомендую включить эту настройку!
8 комментариев
5 февраля 2015 11:08

Параллельные прямые в геометрии Лобачевского

Геометрия Лобачевского (147.71КБ) Из Университета я выпустился, не растеряв уверенности, что параллельные прямые в геометрии Лобачевского пересекаются. Не помню, чтобы мы за пять лет обучения хоть как-то затрагивали этот вопрос (что странно для Университета, где Лобачевский шесть раз избирался ректором), а может я просто прогулял ту лекцию.

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

Я далеко не один такой. Заблуждение это столь распространённое, что сегодня в музее-усадьбе Лобачевского (г. Козловка Чувашской республики) директор музея лично его повторил под немой укор портрета бывшего владельца.

Сам я узнал истину только лет пять назад — это была конференция «404», кажется мы сидели в номере Ильи Бирмана и в разговоре затронули эту тему. Меня тогда поправила Таня Бибикова, тогда ещё Танька Мисютина, за что ей спасибо, конечно.

Истина же в том, что даже в геометрии Лобачевского параллельные прямые не пересекаются, но ведут себя несколько иначе, не так как в евклидовой геометрии — у Лобачевского «через точку, не лежащую на заданной прямой, можно провести более одной прямой, параллельной этой заданной прямой». А в евклидовой — только одну. Вот в чём разница.
24 комментария
1 февраля 2015 18:18

Производительность PHP 7 на уровне HHVM?

PHP-NG vs HHVM (60.34КБ) Если изображённое на графике хоть отчасти правда, то я очень жду выхода ПХП 7 — куда больше, чем нового сезона «Игры Престолов». Автор графика сравнил производительность разных интерпретаторов ПХП на движке «ВордПресс».

По результату видно, что производительность новой версии находится на уровне HHVM!

Значительное отставание HHVM до четвёртого прогона объясняется «прогревом» ДжИТ-компилятора, на это можно не обращать внимание, поскольку основная область применения ПХП — сайты, а на них не заходят только пару раз.
3 комментария
31 января 2015 11:26

Тихоходки

Многие наверное что-то слышали о тихоходках из-за потрясающей возможности выживать в самых жёстких условиях — 6000 атмосфер, 20 месяцев при температуре -193 °Ц, 100 °Ц в течение часа, 570 000 рентген убивает только половину популяции (человек клеит ласты при 500 рентгенах) и так далее. Тихоходка (фото взято из вьетнамской «Википедии») (86.82КБ) Оказывается есть и своя легенда о этих удивительных созданиях, она описана даже в «Википедии»:
Известен случай, когда мох, взятый из пустыни спустя приблизительно 120 лет после его иссушения, поместили в воду, и находившиеся в нём тихоходки ожили и были способны к размножению.
На деле же, как оказалось, результат того эксперимента куда меньше потрясает воображение. В статье «Факты и вымысел о длительности выживании тихоходок» биологов Йоннсона и Бертолани есть больше подробностей эксперимента вместе с прямой цитатой описанных результатов.

В 1948 году итальянский биолог Тина Франчески получила от итальянского же музея образец 120-летнего мха с «законсервированными» в нём тихоходками того же возраста. Когда мох стали отмачивать в воде, тихоходки не подали никаких признаков жизни за небольшим исключением. Тина пишет:
После двенадцати дней отмачивания в частично расширевшимся образце (вид образца с трудом поддаётся идентификации, порядок следует отнести к Eutardigrada, а род, очень вероятно, к Macrobiotus) было замечено дрожжание в нескольких зонах его тела.

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

Это движение привело нас к выводу о проявлении жизнедеятельности, пусть и незначительном. Впоследствии движений у тихоходки больше не наблюдалось, хотя ещё несколько дней внутренние органы были по-прежнему распознаваемы.
То есть после 120 лет тихоходки не «ожили и были способны к размножению», а некий образец дёрнул копытами, прежде чем их окончательно отбросить.
2 комментария
25 января 2015 08:30