понедельник, 9 апреля 2012 г.

Импрувмент

Я предлагаю модифицировать кнопку "Сброс" в формах (<input type="reset" />). Первый клик по кнопке сбрасывает содержимое формы до изначального состояния (если форма была заполнена серверными скриптами). После этого надпись меняется, а последующий клик полностью стирает все значения в форме.

среда, 5 октября 2011 г.

Проверка float-значения в PHP

По работе потребовалось проверить получаемое из формы значение на предмет плавающей точки. В частности, в форме вводится площадь и цена в деньгах. Проект разрабатывается на Zend Framework, поэтому совершенно логично в голову придет решение навскидку - использовать родной валидатор Zend_Validade_Float. Однако практика показала, что он ведет себя очень странно, и это не фича, а баг, тянущийся уже долгое время.

Ок, можно сделать собственный валидатор и подключить его к форме. Но тогда мы возвращаемся к исходной теме - проверки введенного значения. Первая же мысль - is_float. Увы и ах, эта функция лишь проверяет ТИП переменной, а любое значение из формы возвращается типом string. Так что мимо кассы.

Перерыв половину интернетов, я нашел оптимальное решение - проверка регулярными выражениями. Они медленные, да. Но и момент не очень тонкий, хайлоадности в нем нет, так что можно смело использовать. А проверка вот:

function isfloat($val) {
return (bool)preg_match("/^[+-]?(([0-9]+)|([0-9]*\.[0-9]+|[0-9]+\.[0-9]*)|(([0-9]+|([0-9]*\.[0-9]+|[0-9]+\.[0-9]*))[eE][+-]?[0-9]+))$/", $mval);
}

понедельник, 6 июня 2011 г.

О мотивациях.

Только что почитал отчет о рынке смартфонов в мире. Натуральным образом вырос Андроид (за год в четыре раза), где-то на десять процентов вырос айос. Остальные штуки я не учитываю — блекберри это совершенно отдельный собственный мир, симбиан будет падать по случаю прекращения поддержки, а виндавз фон еще не окуклился как следует.

Поэтому поговорим об Андроидах. Дело всё в том, что гугл науськал производителей смартфонов против Эппла. Дескать, вот вам мобильная ось, делайте под неё что хотите (да и с ней самой делайте что хотите). Оттого устройств с андроидом так много и все они такие бестолковые. Нет системы. Да, я не спорю, в них по десять ядер и гигабайты оперативной памяти, но что стоят эти терафлопсы, если этот телефон под управлением Андроида не в состоянии обеспечить высокий FPS для энгри бёрдз и тормозит нещадно? Что стоит стилус, телевизор и карта памяти, если устройство садится и у него плохой экран? (а экраны сейчас плохие у всех, кроме догадайтесь-какой-фирмы) (хотя это и ненадолго) (а когда у всех будут одинаковые экраны, эппл придумает что-то еще).

Вы говорите, что айос закрытая система (ПРОПРИЕТАРНАЯ БЛЕАТЬ), айфон нельзя использовать как флешку и у него нет микроусб-порта. Безусловно, айфон в виде флешки (или наоборот?) — это его ключевой фичюр реквест, разумеется. Вы говорите, что айфон можно синхронизировать только в айтюнсе. Вы говорите, что эппл следит за юзерами посредством айфонов.

А я скажу, что уже есть девелоперский API для синхронизации айос устройств. Я скажу, что айфон можно использовать как флешку с помощью того же айтюнса или альтернативного софта. Я скажу, что многие отказывают в обслуживании рутованных андроидных устройств. Что открытость андроида — всего лишь филькина грамота и по сути ничего не стоит. Зачем вам эта открытость? Вы в этой открытости не смогли углядеть слежку за вами же. Мне всё равно — открытая система или закрытая. Лишь бы она хорошо и быстро работала.

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

суббота, 8 мая 2010 г.

Авторизация через логин или адрес почты в Django

Привожу кусок исходного кода модуля авторизации сайта TrentaQuattro.ru. Он позволяет авторизовать пользователя по логину или электронному адресу без использования дополнительных бэкендов, которые и установить-то смогут не всякие, а хостеры уж подавно никогда не установят в здравом уме и трезвом рассудке.
if re.compile("^.+@.+\..{2,3}$").match (login) != None:
try:
login = User.objects.get (email = login).username
except:
#authorization fail
else:
try:
login = User.objects.get (first_name = login).username
except:
#authorization fail
Как по мне, весьма изящно и быстро. При желании можно оформить в виде просто отдельной функции, бэкенда (нежелательно) или встроить в ядро Джанго (крайне нежелательно).

четверг, 12 ноября 2009 г.

Поисковая экспедиция

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

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

Для начала я решил пройтись по гуглю — во-первых, как там это устроено (так сказать, взглянуть глазами девелопера, а не юзера), а во-вторых — поискать разных поисковых движков. Sphinx был слишком суров: мне не нужен атомный ледокол, если я ищу рыбацкую лодку. Яндекс-Сервер — уже не ледокол, это корабль Энтерпрайз из Стар Трека, что мне уж точно не нужно. Мои самые худшие опасения подтвердились, прийдется делать всё самому. Так, сперва нарисуем схему работы. Пользователь вводит поисковый запрос, он аяксом передается на сервер, там каленым железом и святой водичкой из запроса вытравливаются все кул-хацерские символы, потом поиск, отправка результатов браузеру в виде JSON. Вроде просто. Как мне тогда казалось.

Что из себя представляет JSON-ответ? Код ответа (нашлось, не нашлось, мало символов), количество найденного, количество показанного и сами результаты. Очень хотелось сделать поиск в один MySQL запрос, но выяснилось, что ничего не получится — нужно минимум два запроса: один поисковый, а второй похожим запросом считает общее количество найденного. Ну это-то просто, а вот как быть с самим поиском? Делать всё через like? Отчего же, давайте попробуем... Первый образец уже работал, когда я наткнулся на спецификацию родного полнотекстового поиска в MySQL — через match-against. Выглядело очень вкусно — сортировка по релевантности, низкое время выполнения запроса. На всякий случай забэкапив старый запрос, я быстренько составил новый. Потестировал в PHPMyAdmin — не работает. Почему? Ах, да. Таблицы в InnoDB, а он не поддерживает полнотекстовый поиск. Быстренько смотался в гугл, начал набирать "InnoDB..." и тут оно мне выдало возможные запросы, первым из которых — "InnoDB vs. MyISAM". В этот момент я выпал — именно это мне и было нужно, узнать о подводных камнях MyISAM, может, ну его нафиг. Но откуда гугл узнал, что я собираюсь искать именно это?.. Чудеса. Выяснив, что MyISAM ничего чудовищного в себе не содержит, я забэкапил базу данных вне очереди (обычно я делаю это по утрам) и перевел нужные таблицы на новый движок. Отлично, запрос работает... Но ничего не возвращает. Тут я запаниковал — вдруг этот поиск понимает только английские символы, а русские нет? Но пронесло. Выяснилось, что я выставил кодировку utf8_bin в полях body, где хранились тексты постов. А это значит, что регистр имеет значение ©. Следующий запрос уже выдал мне искомый результат.

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

Интересная эта штука, полнотекстовый поиск.

пятница, 3 апреля 2009 г.

пятница, 20 февраля 2009 г.

K-Lite Codec Pack не понадобился, оно и так отлично проигрывает видео-файлы.
Плюс великолепно работает Python+wxPython.