6 декабря 2012 г.

Маленькие сюрпрайзы PHP PDO.


На днях ковыряясь в mysql при помощи pdo сделал для себя маленькое открытие.
В методах prepere(), execute() не могут использоваться переменные (именованные не именованные  через которые в запрос подставляются название таблиц и колонок. Вот так никакого exception, ни Fatal error, Kernel demage и т.п. Все тихо пропускаем и переходим к следующим инструкциям.

Вот такое не сработает:

$preQuery = $this->pdo->prepare('SHOW ?');
$preQuery->execute(array("tables"));
К вашим услугам конкатенация строк и хранимые процедуры

12 июля 2012 г.

Какое в вашей форме поле ввода номера телефона?

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

Лично я считаю, что чем проще форма тем лучше - просто оставить текстовое поле и попробовать сделать одним из двух вариантов:
  1. Задать шаблон в виде регулярного выражения атрибута pattern текстового поля (доступны в HTML5);
  2. Уже отправляя или получая данные, удалять из введенного пользователем значение, к примеру, все не цифровые знаки, распарсивая и приводя к нужной форме.
Начиная с HTML5 тесктовое поле input обзавелось атрибут pattern и сделало возможным проверку введенного значения регулярным выраженнием. (Если бы я не написал регулярное выражение для проверки корректности ввода номера телефона, то и начинать этот пост не было бы смысла.)
Но чтобы распарсить номер телефона надо иметь  модель "типового" номера телефона.
Поэтому приведу сразу какими могут быть номера телефона:
  • С или без указания кода страны +7, 28 или просто 8;
  • С или без указания кода оператора или кода города - 3 цифры (В Санкт-Петербурге других не встречал);
  • 7 цифр номера телефона c пробелами, через тире или все слитно (что то вроде 123-45-67, 1234567, 123 45 67).
Согласно этой модели привожу регулярное выражение которое удовлетворяет озвученным требованиям:
\s*(?:\+\d{1,2}|\d)?\s*(?:\(\s*\d{3}\s*\)\s*|\-?\d{3}(?:\-|\s)?)?\d{3}(?:\-|\s)?\d{2}(?:\-|\s)?\d{2}\s*
Описание с комментарием:
/\s*
(?:\+\d{1,2}|\d)? # +7, +38 или 8 или ничего из этого
\s* # пробелы, или ничего
(?:\(\s*\d{3}\s*\)\s*|\-?\d{3}(?:\-|\s)?)? # код города или оператора, может быть даже в скобочках
\d{3} # 3 обязательных числа
(?:\-|\s)?
\d{2} # 2 обязательных числа
(?:\-|\s)?
\d{2} # 2 обязательных числа
\s*/x
Регулярное выражение это можно использовать для выделения номеров телефона в произвольном тексте (Например если стану sms-спамером и буду писать граббер номеров телефонов с сайтов). Модифицировав выражение, можно извлекать различные части номера телефона.

Чтобы проверить работоспособность регулярного выражения мне нужна была большая выборка примеров номеров телефонов согласно созданной модели номера телефона. Для этой цели я использовал программу генератор seo текстов Seo Anchor Generator. Программа Seo Anchor Generator позволяет по заданному шаблону составить выборку всех возможных комбинаций по заданному шаблону.
Пример используемого в программе шаблона:
{+{7|38}|8|}{| }{({ |}012{ |}){ |}|{-|}012{ |-|}|}345{-| |}67{-| |}89{ |}
Таким образом я собрал 2160 примеров правильных комбинаций написания телефонов.

Javascript код для тестирования:
function isFormattedTelefon(str){
    return /^\s*(?:\+\d{1,2}|\d)?\s*(?:\(\s*\d{3}\s*\)\s*|\-?\d{3}(?:\-|\s)?)?\d{3}(?:\-|\s)?\d{2}(?:\-|\s)?\d{2}\s*$/.test(str);
}
// массив с различными комбинациями написания одного телефона
var testArray2=[ "+7( 012 ) 345-67-89","+7( 012 ) 345-67-89", ... , "345 67-89" ];
for(var i=0, len=testArray2.length;i<len;i++){
    console.log("#%s is: %s",i,isFormattedTelefon(testArray2[i]) );
}
Осталось только обкатать все это дело.

28 июня 2012 г.

Почему я больше не делаю мобильные версии сайтов


Мобильная версия будет отвлекать силы и время на ее поддержание. Смартфоны с удобным выходом в интернет сделают эту работу просто бессмысленной. Они стали доступнее, их качество выросло.
Вот, какие гейши...
Мобильные устройства быстро развиваются, в 2010 году смартфон с разрешением экрана 320 на 480 пикселей стоил около 9 тыс. руб. в 2012 около 4,5 тыс (мой телефон смартфон обесценился в 2 раза! и он все еще продается в магазинах). По собственному опыту могу сказать, что комфортное просматривание страниц начинается именно с этого разрешения экрана. Браузеры  для  смартфонов выполнены на более высоком уровне, чем для обычных мобильных телефонов, которые с малой вероятности вообще будут обновляться. Смартфоны уже  позволяют совмещать  функции некоторых уже привычных устройств, таких как навигаторы, электронные читалки, медиа плееры и будильники, органайзеры, калькуляторы и др, что позволит смартфонам занять место в карманах людей.  Стандартные браузеры для устройств на Android до 4.0 и IOs, Windows Phone, скорее всего, обновляться не будут, но будут доступны устанавливаемые альтернативные браузеры, что позволяет предположить, что качество отображение страниц в браузере будет повышаться.
К тому же, всякая попытка «пересаживать» посетителей на урезанную мобильную версию будет вызывать раздражение у них.
Что будет с мобильными телефонами
Мобильные телефоны с номинальной возможностью выхода в интернет существуют, но их доля среди владельцев будет снижаться и останется на определенном нишевом уровне. Выход в интернет с этих устройств не рассматривается их владельцами в качестве приоритетных опции телефона.
Что делать с сайтом
Теперь сайт будет необходимо тестировать для отображения на мобильных устройствах, применять техники адаптивной верстки с явным использованием viewport-а.

20 июня 2012 г.

Ruby, регулярные выражения и Windows XP


Ruby хоть и является одним из наикроссплатформейших языков общего назначения с которыми мне приходилось работать, но в нем то и дело спотыкаюсь о грабли ее реализации на разных платформах.
Так сегодня мне потребовалось написать скрипт на ruby, который должен был запускаться на Windows XP (При этом я еще хотел его запускать дома, уже на Linux).  Проблема заключалось в том что регулярные выражения, которые я применял к импортируемому тексту из стороннего файла напрачь не работали. Как заведено, в опенсорсе, раскажу о своей проблеме и как ее решал, кому нибудь пригодиться.
Что было:
  • Windows XP
  • ruby (MRI v1.9.3)
  • Большой текстовый файл в кодировке utf-8, почти все содержимое набрано кириллицей.
Соответственно требовалось написать консольный скрипт, который бы потрашил этот злополучный файл регулярными выражениями. Регулярные выражения, конечно же были с модификатором "u", ибо содержали все бе кириллические символы.
Как иследовало ожидать проблемы в Windows XP были в двух кодировках. Консоль в Windows XP в IBM866 (соответственно импортируемый текст тоже был в ней), сам файл в utf-8.

Вообщем пришел к такому варианту:
# coding: utf-8
# Попутно, в Windows, импортированный utf-8 текст (через File) будет в utf-8 (а не IBM866)
Encoding.default_internal = 'UTF-8'
Encoding.default_external = 'UTF-8'
# регулярное выражение:
FIOPATTERN=/^Имя:\s*([^\n^\r]+)/u

31 мая 2012 г.

Депозитный калькулятор


Если Вы ищете легкий инструмент с помощью, которого можно посчитать доход по вкладу.
Представляю общественному вниманию свою недавнюю работу, приложение для браузера Chrome - депозитный калькулятор Deposit Calculation Tool.
Приложение создано, чтобы помочь определить вероятный доход по вкладу. В приложение cуществует возможность расчета дохода:

  • с ежемесячной капитализации;
  • с пополнениями вкладов (с частичным снятием я делать не стал, так как не встречал людей, которые такое планировали, но пожеланию такую возможность можно добавить);
  • с различным сроком (с точностью до нескольких дней).
Внешний вид Deposit Calculation Tool 

Результаты вычиления выводятся в виде сводных данных и в виде графика.
Приложение доступно в магазине Chrome по ссылке и распространяется бесплатно.
Приятного использования.
Вывод результата вычисления


23 мая 2012 г.

Все разумно в пределах потребностей


Сегодня в обеденный перерыв мне пришло озарение, очередное. Так часто бывает. Я как обычно вышел на улицу подышать воздухом. Взглядом пробежался по округе - машины, одуваньчики, девушки. Так вот, все на месте, только  с одуваньчиками было не все в порядке. В виду того, что снег в этом году растаял на месяц раньше чем в прошлом году и одуваньчики начали во всю цвести и заполонять собой все газоны и пустыри. Не заметить аномалию с поведением одуваньчиками было не возможно.
Я даже с фотографировал.
Часть газона, которая освещена солнцем, в отличие от той что находиться в теньке, вся усеяна одуванчиками с раскрывшимися цветками. В пику им, те что в теньке, наоборот собрали свои бутончики.

Вот она растительная жизнь. Есть у них чувство хода событий. Растения может быть и не чувствуют ход времени, но меряют свой день солнечными лучами.
П.С. В конце осени видел голубя, который прыгал через водосливной проем в бардюре. Одназначно, он "на глаз" мерил расстояние и необходимые усилия своим мозгом. Хотя как бы иначе они вообще летали.

П. П. С. Вообщем занят был я последнее время. Совсем недавно запустил сайт клининговой компании "Северный блик". Люди, если кому-нибудь, потребуются чистые окна или радующий глаза, диван заходите  http://www.blik-cleaning.ru/ .

30 марта 2012 г.

Поле для форматированного ввода числа

Вступление
Вам никогда не требовалось контролировать пользователя при вводе данных в форму на сайте? На этой недели такую задачу я получил на работе. Имелось поле для ввода ссумы. Но чтобы ввод был форматированным не "100000", а "100 000". И соответстенно только цифры.

Что нам Google подскажет
Как Google(Yandex) не борется за хороший поиск, а оригинальные варианты он не отбирает. Получается список почти идентичных вариантов контроля ввода через событие keypress. Html5 тоже не помог type="number" даже не контролирует ввод только цифр. Не много отвлекусь, поиск по блогам Google или Яндекса частично помогает разрядить выдачу однотипных решений. Но все равно чтобы найти хороший метод в выдаче нужно постараться.

Что нам понадобится
В стартное html поле ввода input можно ввести данные тремя спосбами:
  1. с клавиатуры. Это можно отловить слушая события keypress, keydown, keyup;
  2. вставить из буфера обмена;
  3. автоподстановка в браузере. 
Почти все найденные мной в поисковике решения борятся с первым способом, неучитывая два других. Для борьбы с вставкой из буфера обмена я воспользовался JQuery плагином jQueryTextChange (ссылка1, ссылка2).  Для борьбы с автоподстановкой в тег input можно добавить атрибут autocomplete со значением off:
<input autocomplete="off" autofocus="" id="principal_amount" name="principal_amount" required type="text">
Как это выглядит
Представляю свое решение
if (!Array.prototype.indexOf){// Привет IE
    Array.prototype.indexOf = function(elt/*, from*/){
        var len = this.length,
            from = Number(arguments[1]) || 0;
        from = (from < 0) ? Math.ceil(from) : Math.floor(from);
        if (from < 0) from += len;
        for (; from < len; from++){
            if (from in this && this[from] === elt)
                return from;
        }
        return -1;
    };
}
function numberFormat(str){ // форматируем строку 12000 -> 12 000
    var     str_array=[],
            length=str.length;
    var undefined2string=function(val){
        return val?val:"";
    }
    for(var i=length-1; i>=0;i-=3){
        str_array.unshift(
            undefined2string(str[i-2])+undefined2string(str[i-1])+undefined2string(str[i])
        );
    }
    var resStr=str_array.join(" ");
    return resStr;
}
function createFormatControl(element,onchange_callback){
    if (!(element instanceof HTMLInputElement))
        throw("Wrong type of node, need HTMLInputElement");
        
    onchange_callback=onchange_callback||function(){};
    /*
    @e.keyCode:
        9 - Tab
        8 - Backspace
        46 - Del
        48-57 - 0-9
        13 - Enter
        37-40 - arrow: left,top,right,bottom
        35 -Home
        36 -End
    */
    $(element).bind("keydown",function(e){//контролируем ввод с клавиатуры
        var     keyCodeArray=[8,9,13,46];
        if(
            (e.keyCode>47 &&  e.keyCode<58) ||
            keyCodeArray.indexOf(e.keyCode) >= 0 ||
            (e.keyCode>34 &&  e.keyCode<41)
        ){
            return true;
        }else{
            return false;
        }
    }).bind("textchange",function(e){// Контролируем изменение текста (вставку из буфера обмена.)
    
        var     $this=$(this),
                origStr=$this.val().replace(/\D+/g,""),
                str=numberFormat(origStr);
        if(!(e.keyCode>34 &&  e.keyCode<41)){
            $this.val(str);
        }
        onchange_callback(str);
    });
}
$(document).ready(function(){
    var     in2 = document.getElementById("in2"),
            $deb3=$("#deb3");
    createFormatControl(in2,function(e){$deb3.text(e);});
});
Верстка:
<script type="text/javascript" src="jquery-1.7.1.min.js"></script>
<script type="text/javascript" src="jquery.textchange.min.js"></script>
<p>
    <label>#2: </label>
    <input type="text" id="in2" autocomplete="off"/>
</p>
<p id="deb3"></p>

Скачать архив с исходниками