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

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

А ещё, если считать Россию, то сегодня мы посетили свою двадцать пятую страну — Францию. В первый раз мы поехали за границу как раз на свадебное путешествие, так что это тоже связанные между собой события.
Про загар
Скоро кончается отпуск, вернусь в Казань, друзья и коллеги обязательно начнут сочувственно спрашивать — почему же я так мало загорел?
Загорел я так мало, потому что не понимаю ценности загара.
Для меня смысл лежания на пляже только один — откинуть заботы и ничего не делать пару часов. Так же я могу поваляться и в постели, у пляжа есть плюсы — солёный воздух и тёплое солнце, но и у кровати они есть — мягко, тихо и нет людей. Я за разнообразие.
Эстетической стороны вопроса для меня не существует. Вообще я вижу в этом
С вопросом здоровья ещё сложнее. Принято считать, что загар даёт
Что там ещё упоминается? Улучшение иммунитета? Это неправда, он ухудшается, а кроме того длительное пребывание на солнце способствует старению кожи и вызывает мутации ДНК.
Говорят ещё, что это приятно само по себе. Тут надо отделить одно от другого. Приятно что? Загар или пребывание на пляже? Я могу поваляться на пляже с хорошей книгой — это может быть приятным. Но я буду намазан предохранительными мазями по самые уши. Загорю или нет — дело десятое (за неделю отдыха немного загорел), зато гарантированно не обгорю, что куда важнее для меня — обгорать и больно, и опасно.
Санта-Сусанна
Я не привык ждать многого от городков с огромной отельной зоной. Город
Поскольку мы иногда пару часов катались на арендованных велосипедах, то я придумал нам квест — разыскать все смотровые башенки (их оказалось шесть), обозначенные на карте достопримечательностей, скачанной
Город получается трёхслойным — зона отелей у моря, дальше запутанная историческая часть, а выше в горы — зелёная зона. Её тоже планировали застроить отелями, но повезло — местные «зелёные» добились запрета. В зелёной зоне есть несколько интересных мест — башня Монтгаут
Улицы в исторической части кривые, узкие, а карта у нас была только примерная, потому в поисках этого замка, мы натыкались на самые разные объекты, в том числе, почти на выезде (кстати, дальше по этой дороге находятся «Парк Приключений» и уже упомянутый музей Сельского Быта), наткнулись и на водопровод
Кстати, в замке есть очень неплохой, довольно ухоженный парк, где можно прогуляться — он открыт для посещения в утренние часы, кроме того, там есть бассейн, который
Рядом с водопроводом есть ещё один интересный объект — башня с солнечными часами, к сожалению, никаких подробностей про неё я в интернете не нашёл.
Вернёмся к смотровым башням. Проще всего найти башню
Труднее всего далась упомянутая в начале
Эту башню мы искали два дня подряд, в итоге нашли, но по дороге заблудились — оказывается карты, которые есть тут на автобусных остановках, грешат неточностью. Зато какое было удовольствие, упоров не в ту сторону по жаре, найти в ближе к тупику ошибочной дороги, источник ледяной воды, из которого местные набирали воду! Блаженство!
К сожалению, местные
Меня, кстати, сильно удивляет, что такие исторические объекты находятся в частных руках, но это, наверное, просто потому, что у нас в стране это редкость
Замыкает список башня
Вообще, интересных объектов
Пожалуй, стоит закругляться. Хочется ещё упомянуть последнюю в моём рассказе постройку — часовню
Часовня
В общем, чудесный городок, я очень рад, что мы тут провели две недели. Очень жаль, что уже завтра придётся отсюда улетать.
Передача массива как аргументов в конструктор
Одна из вещей,
$result = call_user_func_array('myfunc', $args); // старый синтаксис
$result = myfunc(...$args); // PHP 5.6+Но помимо приятности, он решает две проблемы.
switch (count($params)) {
case 0:
$instance = new $class();
break;
case 1:
$instance = new $class($params[0]);
break;
case 2:
$instance = new $class($params[0], $params[1]);
break;
// и так далее…
default:
$refClass = new \ReflectionClass($class);
$instance = $refClass->newInstanceArgs($params);
break;
}В новом же синтаксисе код невероятно упрощается:
$instance = new $class(...$params);А, кроме того, становится более явным и простым. Так что очень радуюсь этому новому синтаксису.
ANSI-коды в имени точки вайфай
Давно интересно было посмотреть отфильтруются ли

Естественно, в графическом интерфейсе ничего такого нет:

Судя по спецификации, в имени должна быть строка до 32 байт, заканчивающаяся символом с кодом ноль. Других ограничений нет, так что и такое странное имя можно задать.
Короткий способ определять IE
А какой сейчас самый короткий способ определять Эксплорер? Я понимаю, что привязываться к браузеру нехорошо, но у меня конкретная задача, которую никак не обойти — нужно проиграть звук в браузере (PCM wave), а ИЕ на запрос «сможешь проиграть?» к тегу AUDIO, говорит maybe. Т. е. давайте сюда свой звук, может и смогу.
Все короткие способы, которые раньше работали (условная компиляция, сравнение вертикального пробела с буквой v, хитрый хак с массивом и прочее)
В общем, я пока остановился на такой версии:
if (top.VBArray) {
// IE
} else {
// остальные браузеры
}Но буду признателен
Странное с Флешем
Я с «Флешем» в последние годы не сталкивался, но и прежде подобного поведения не наблюдал. В общем, решил я вчера обновить в нашем продукте библиотеку ВебКамДжиЭс, она у нас для получения фотографии с камеры используется. Прежняя была 0.9, а тут я случайно обнаружил, что релиз вышел.
В прежней изображение с камеры получалось через Флеш, а релизная умеет использовать АПИ браузера, если таковое имеется. Правда, в «Сафари», которым я пользуюсь, этого АПИ нет и всё равно используется Флеш. Вот
В принципе, можно было откатиться на предыдущую версию, но смущало, что
У нас сервер отдавал Флеш с типом
Беглое гугление света не пролило, но если столкнётесь с похожей проблемой, имейте ввиду, возможное решение — смена типа для отдаваемого
PHP7
Всё, PHPNG отправился в «мастер», по всей видимости, это означает, что он появится сразу после версии 5.6, которую мы увидим буквально на днях (я уже немного писал о том, что в ней нового).
PHPNG — новая версия интерпретатора, которая, по всей видимости, будет носить номер семь, чтобы избежать путаницы с PHP6 — неудавшейся попыткой перевести ПХП на Юникод, которую широко в своё время освещали, но сообщество решило от неё отказаться — большинство разработчиков англоязычны и выгоды от этого трудоёмкого процесса не видели.
Новая версия ПХП интересна переработанными внутренностями, изменение которых связано со скоростью. Установленный «ВордПресс» работает на новой версии в два раза быстрее, что впечатляет, конечно. Плохая новость — придётся переделать бо́льшую часть модулей (если не вообще все). Процесс этот сейчас движется, но только для модулей, входящих в язык, несколько модулей (в том числе важный для меня OCI8) пока ещё не поправлены.
Думаю, что миграция авторских модулей произойдёт довольно быстро.
Короткий способ определить есть ли поддержка dataURI
Придумал короткий способ определить поддержку data URI в браузере:
<script src="data:text/javascript,self.dataURI=1"></script>Потом просто проверяете у window свойство dataURI, если оно есть, то есть и поддержка. Способ не работает в IE8 и IE9 — тот и другой не умеют загружать Джаваскрипт этим образом. Собственно, меня это не волнует — мне как раз и нужно определить, что Джаваскрипт так работает, но если вам нужно не это, то должен работать вот такой способ:
<link rel="stylesheet" href="data:text/css,html{font-size:99px}">То есть устанавливаем у тега HTML
/99/.test($('html').css('font')); // true, если есть поддержка dataURIНедокументированные возможности модулья Memcached (для PHP)
Читая на досуге исходники модуля Memcached для ПХП, наткнулся на неожиданное: оказывается этот модуль поддерживает соединение по протоколу UDP, причём документация молчит об этом.
Делается это вот так:
$udp = new Memcached();
$udp->setOption(Memcached::OPT_USE_UDP, true);
$udp->addServer($host, $port);В частности, это позволит нам перейти на
Другая вещь, которая никак не раскрывается документацией — пользовательские флаги (UDF — user defined flag). К каждому значению можно прикрепить один или несколько флагов, которые при получении значения будут складываться в заданную переменную:
const FLAG = 1;
const ANOTHER_FLAG = 2;
$m->set($key, 'value', 0, FLAG | ANOTHER_FLAG); // установили флаг
$m->get($key, null, null, $flags); // флаги будут лежать в переменной $flagsУ каждой функции установки и получения значений (а их несколько, этих функций) в конце есть необязательный параметр для работы с флагами. Так что во всех вариантах использования значения можно
Позднее дополнение: похоже memcached больше не нуждается в multiport UDP patch, он и без него теперь с UDP работает нормально.
Велодорога домой
Бо́льшая часть моих велопрогулок — это примерно 15 километров совокупной дороги с работы и на неё. Езжу почти каждый день, если нет дождя, а они пока ещё не так уж и часты. Сегодня случился своеобразный рекорд — моя средняя скорость была 20 км/ч. Учитывая пешеходов, светофоры и пересечённый характер местности, совсем немало.

Мокрая вода, твёрдый алмаз, быстрый фотон
Ребята, ну нет никакого «нижнего подчёркивания». Подчёркивание всегда внизу, под
is_numeric
Функция is_numeric одна из традиционно неверно понимаемых программистами на ПХП. Её, обычно, понимаю как «посмотреть содержится ли в переменной
Беда в том, что понятия числа у ПХП и человека различаются. Посмотрите, все эти вызовы рассматриваемой функции вернут «true»:
var_dump(is_numeric("123e123")); // true — десятичное число в экспоненциальной записи
var_dump(is_numeric("0123")); // true — восьмеричное число
var_dump(is_numeric("0XDeadBeef")); // true — шестнадцатеричное число
var_dump(is_numeric(NAN)); // true — специальное численное значение «не число»Особенно не везёт восьмеричным числам, которые во многих языках (и в ПХП) тоже начинаются с нуля: формально выглядят как обычное десятичное (только начинается с нуля), проходят все проверки, а после преобразования теряют ведущий ноль и это может быть важно.
С незапамятных времён существует хак, который позволяет убедиться, что перед нами именно десятичное число, пусть и в строковой форме:
function is_number($var) { return (string) (int) $var === (string) $var; }Принцип очень простой — переменная преобразуется в целый тип (можно преобразовывать и в тип с плавающей точкой, если это нужно), потом берётся строковое представление получившегося числа. На этом этапе восьмеричные, шестнадцатеричные и прочие виды записи чисел будут преобразованы в целочисленный тип, строковое представление которого — десятичное число. Справа же пришедшее остаётся в первозданном виде.
Далее мы сравниваем левую и правую часть и, если они совпадают, значит к нам пришло именно десятичное число, так как никаких преобразований с ним не произошло.
Добавлено позднее: в документации к функции написано, что она так же понимает двоичную форму записи введёную недавно (число должно начинаться с «0b»), к сожалению, это неправда — в коде поддержки нет, баг заведён и в нём написано, что это проблема документации, а не функции.
Интересно ещё, что is_numeric пропускает любое количество пробельных символов слева, но плохо относится к ним справа:
var_dump(is_numeric("\f\f\t0xBadBabe")); // true
var_dump(is_numeric("1\t")); //false