Заметки за 2017 год
20 December 2017, 06:30 MSK
Это продолжение первой части рассказа про поездку в Доминиканскую республику.
Итак, продолжаем исследование острова и направляемся в место, которое называется Альтос-де-Чавон.
IMG_4254
2 August 2017, 15:15 MSK
Перефразируя известного тревел-блогера: захотелось отдохнуть на море без аниматоров, руссо-туристо и приставучих арабов (в результате не было только аниматоров).
IMG_4173
28 July 2017, 18:47 MSK
Ещё одна раздражающая проблема многих сайтов — это когда сайт заставляет вводить тебя телефонный номер в понятном ЕМУ формате. Часто разработчики таких сайтов впридачу не удосуживаются сообщить пользователю, в каком формате сайт хочет видеть номер. Совсем клиника — когда ты видишь голое поле ввода номера, вводишь номер, жмёшь «Отправить» и получаешь сообщение типа «Телефон введён неправильно». Блин, а как правильно-то? И начинаешь перебирать разные форматы...
Сегодня рассмотрим простой способ валидации (проверки правильности ввода) телефонных номеров при условии того, что все посетители сайта — из России (или Казахстана). Российские номера телефонов начинаются с +7 и имеют далее 10 цифр. При этом, все люди привыкли вводить телефонные номера по-разному. Кто-то пишет +79219710296, кто-то +7 921 971 02 96, кто-то ставит скобки и тире: +7 (921) 971-02-96, кто-то пишет через восьмёрку: 89219710296, кто-то пишет просто 10 цифр: 921 971 02 96, ну и так далее. В нашем способе проверки все эти примеры будут считаться валидными, а на выходе мы будем иметь телефон в едином формате +7xxxxxxxxxx для удобного хранения номера в базе данных.
Код PHP-функции проверки телефонного номера:
function validate_russian_phone_number($tel)
{
    $tel = trim((string)$tel);
    if (!$tel) return false;
    $tel = preg_replace('#[^0-9+]+#uis', '', $tel);
    if (!preg_match('#^(?:\\+?7|8|)(.*?)$#uis', $tel, $m)) return false;
    $tel = '+7' . preg_replace('#[^0-9]+#uis', '', $m[1]);
    if (!preg_match('#^\\+7[0-9]{10}$#uis', $tel, $m)) return false;
    return $tel;
}
Функция принимает на входе строку с телефонным номером в произвольном формате, а возвращает либо телефонный номер в формате +7xxxxxxxxxx, либо false в случае, если номер не прошёл проверку (и об этом следует сообщить пользователю).
Спасибо за внимание. Делайте удобные сайты!
Тэги: PHPwebdev
27 July 2017, 11:28 MSK
Часто в интернете на сайтах можно встретить тексты вроде «2 комментариев» или «в вашей корзине 3 товаров». Так происходит, потому что веб-мастерам лень заморачиваться и писать нормально, склоняя слова по числам: они выводят переменную с количеством записей и пишут слово в какой-то одной форме рядом.
В английском языке эта проблема решается проще — нужно всего лишь проверить переменную на единственное или множественное число и, при необходимости, подставить букву «s» (1 comment, >1 comments). В русском языке слова приходится склонять. Но, на самом деле, это делается не сложнее проверки на множественное число. Для этого можно использовать простую функцию. Код на PHP:
function sklonyalka($n, $v1, $v2, $v5)
{
    return $n % 100 < 10 || $n % 100 > 20 ? ($n % 10 == 1 ? $v1 : ($n % 10 >= 2 && $n % 10 <= 4 ? $v2 : $v5)) : $v5;
}
Сюда нужно передать параметры: $n — число записей, $v1 — форма слова для количества «1», $v2 — форма слова для количества «2», $v5 — форма слова для количества «5». Ниже пример использования:
В вашей корзине <b><?php echo $items_number; ?></b> <?php echo sklonyalka($items_number, 'товар', 'товара', 'товаров'); ?>.
Естественно, разумнее использовать шаблонизатор, а не встраивать php-тэги в html-код, но пример приведён чисто для того, чтобы показать принцип работы.
Функция легко переписывается на другие языки. Например, на JavaScript:
function sklonyalka(n, v1, v2, v5)
{
    return n % 100 < 10 || n % 100 > 20 ? (n % 10 == 1 ? v1 : (n % 10 >= 2 && n % 10 <= 4 ? v2 : v5)) : v5;
}
На этом всё, спасибо за внимание. Делайте сайты для людей. :-)
Тэги: JSPHPwebdev
13 July 2017, 13:32 MSK
Год назад я писал, как Мегафон списывает деньги просто так. На этот раз расскажу об ещё одном вопиющем случае.
Началось всё с того, что мне позвонил один старый клиент и сообщил, что у него на айпаде не работает его сайт. Я попросил скриншот, посмотрел его и понял, что на сайте как будто бы отключён джаваскрипт. Причём, такая проблема возникала только у клиента, у меня всё было нормально, многочисленные попытки воспроизвести ошибку не приводили к успеху. Программистам знакомо такое понятие как Гейзенбаг (в честь принципа неопределённости Гейзенберга) — ошибка, которая меняет свои свойства при попытке её обнаружения.
В процессе долгих мучительных поисков было установлено, что эта ошибка возникает на мобильных девайсах, на которых оператор — Мегафон. Причём мне ещё пришлось отключить VPN на айфоне и айпаде, чтобы увидеть этот баг. Сначала я думал, что это на сайт пробрался какой-то хитрый вирус, но всё оказалось куда проще.
Оказалось, что Мегафон вставляет свои скрипты в незащищённый HTTP-трафик своих клиентов.
Тэги: JSVPNМегафонненависть
25 May 2017, 23:05 MSK
Руки дошли дописать небольшой рассказ об однодневной поездке в Выборг зимой.
IMG_3239
24 May 2017, 00:15 MSK
Фотоотчёт о прогулке по питерским крышам в начале апреля 2017.
Лично я не знаю ни одного человека, который бы не мечтал побывать на крыше в центре Петербурга. При этом, что удивительно, огромное количество петербуржцев только мечтает об этом, но не делает. Собственно, до недавнего времени я был таким же. Этот недостаток было решено исправить. :)
Внизу Невский, за мной — Гостинка:
IMG_3906
IMG_3894
Тэги: крышиПитерРоссия
7 May 2017, 23:55 MSK
Одним из последних сходил на Форсаж 8. Обычно я не комментирую фильмы, но настолько тупого кино я не видел уже очень давно. Если Форсаж 7 в открытую противоречит законам физики, то Форсаж 8 противоречит законам физики, логики, здравому смыслу, адекватности и вообще всему. Начиная с 5-ого по счёту фильма, я воспринимаю Форсаж не как фильм про гонки, а как фантастический боевик. Тем не менее, я уверен, сценарий к 8-ому писал трёхлетний ребёнок.
(внимание: дальше будут спойлеры)
17 April 2017, 01:50 MSK
Небольшой рассказ о поездке в мой любимый пригород Санкт-Петербурга на минувших выходных.
В апреле в Питере ВНЕЗАПНО настала зима, а я давно хотел съездить в Петергоф зимой. Решено — сделано. :)
IMG_4064
12 January 2017, 09:24 MSK
Решил я тут давече запилить у себя в блоге возможность вставки математических формул прямо в тексте заметок. Например, вот так:
\Huge\frac{1}{\sigma\sqrt{2\pi}}\exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)
Естественно, рисовать формулы вручную совсем не круто, но ведь есть же \huge\LaTeX{}! Латех — это инструмент для вёрстки сложных документов, статей и т.д., в котором есть встроенный рендерер для формул. То, что нужно! Но как подружить его с сайтом?
Я решил использовать веб-сервис от Гугла. Для этого надо открыть соответствующий URL: http://chart.apis.google.com/chart?cht=tx&chl=..., куда вместо многоточия вписать нужную формулу, после чего вы увидите отрендеренное изображение. Пример выше — формула плотности вероятности для нормально распределения, на языке латеха она выглядит так:
\frac{1}{\sigma\sqrt{2\pi}}\exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)
Не стоит забывать, что символы в URL нужно экранировать, поэтому проще всего для автоматизации данных действий использовать простенькую PHP-функцию:
function latex2image($text)
{
    return 'http://chart.apis.google.com/chart?cht=tx&chl=' . urlencode($text);
}
Также можно сделать сохранение изображений на своём сервере (как сделано в этом блоге), для этого следует воспользоваться функцией file_get_contents, но данное задание оставим читателю для самостоятельной работы.
Кстати, если отрендеренные картинки кажутся вам слишком маленькими, добавьте в начало формулы текст \Huge.
Тэги: LaTeXPHPwebdevблог
11 January 2017, 12:29 MSK
Небольшой утилитарный пост с инструкцией, решающий проблему «Как сайт, разрабатываемый под MAMP в MacOS, локально протестировать на Windows, запущенной через Parallels Desktop».
И так, я занимаюсь разработкой сайтов и в качестве инструментов использую Мак с сервером MAMP PRO на борту. MAMP — это аббревиатура от Mac, Apache, MySQL, PHP. Естественно, часто возникает вопрос, как протестировать создаваемый сайт из-под Винды (например, в Интернет Эксплорере, которого под Маком нет).
Обычно для разработки сайтов создаются локальные хосты, например, localhost или figaroo.local. К сожалению, открыть их из вне не получится, на то они и локальные. Можно, конечно, выгрузить сайт куда-нибудь в интернет, но это слишком долго для процесса отладки. Здесь на помощь нам приходят виртуальные машины, например, самая удобная для Виндоуса под Маком — Параллелс (Parallels Desktop). Но, «из коробки» открыть из виртуальной машины локальные сайты также не выйдет. Для этого придётся проделать несколько простых действий. Скажу сразу, забудьте про домен localhost, создайте какой-нибудь другой, например, у меня это будет kirkizh.local.
Тэги: MacMAMPParallelswebdevWindows