?

Log in

No account? Create an account

Previous 10

May. 6th, 2011

free_bin

Bitrix vs. Здравый смысл

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

Тблица users:
| id | login| ... |

Таблица: groups
| id | title | ... |

И таблица связи user_to_group:
| user_id | group_id | ... |


Пока всё хорошо. И вот тут на сцену выходит наш сегодняшний лауреат премии "зато красиво": группа пользователей "Зарегистрированные пользователи". То есть все, кто есть в базе -- они зарегистрированные. Но мало того, мы это группой должны подтвердить. Я понимаю, что это цена гибкости. Но кто-нибудь когда-нибудь РЕАЛЬНО этой гибкостью пользовался?!

Судите сами. Проекту три месяца. Таблица связи:

SELECT `GROUP_ID`, COUNT(*) FROM `b_user_group` GROUP BY `GROUP_ID`;

GROUP_IDCOUNT(*)
1 3
3 35233
4 1
5 1
6 13
7 10
8 4
11 4

Как вы уже догадались группа с ID = 3 -- это и есть "Зарегистрированные пользователи"...

Feb. 18th, 2011

free_bin

Платёжные системы типа Яндекс/WM/RBK/Mail

Товарищ! Будь на чеку!

Во всех указанных в сабже платёжках используется примерно один алгоритм:
  1. Формируем форму, отправляем в ПС.
  2. ПС проверяет асинхронным запросом к нам корректность. (Не все ПС)
  3. Клиент платит
  4. Нам приходит подтверждение от ПС либо мы запрашиваем его.

Во всех манах для выкуривания написано русским по белому, красным по монитору: ПРОВЕРЯЙТЕ СУММУ.

Так вот её действительно нужно проверять. Ибо пользователь, вооружённый FireBug`ом или его близким родственником беспрепятственно меняет сумму на 1 у.ё. и у.ё. бывает довольным.

И самое западло: в системе-то заказ остаётся неизменным. И если бухгалтерия в выписке не обратит внимания на заказ в 1 рубль -- всё. Хвостов не найдёшь.

Очевидно? Обзовёте Кэпом? Не страшно. Страшно так в лужу сесть. Находил такие дырки на весьма и весьма распальцованных сайтах компаний, занимающихся безопасностью в IT-сфере.

Jan. 24th, 2011

DMakeev

dmakeev

Определяем загруженность сервера из PHP

Есть скрипт, который запускается по крону и что-то там делает. Это "что-то" не срочное и, когда серверу и без того хреново, лучше бы это "что-то" отложить до лучших времен. Соответственно нужно просто и немудрено получить в PHP загруженность сервера. Решается в общем виде так:

$loadLimit = 5; // Значение load average, больше которого выполняться не нужно
$uptime = exec('uptime');
if(preg_match('!load average: ([\d\.]+), [\d\.]+, [\d\.]+!si', $uptime, $cpu)) {
if((float)str_replace(',', '.', $cpu[1]) > $loadLimit) {
die('Не до тебя, болван');
}
}

При этом можно ориентироваться по первому значению, но, если сервер склонен к быстрым пиковым нагрузкам, то, вероятно, лучше использовать более долгосрочное второе значение.
Tags:

Oct. 7th, 2009

wolverene

stekar

php pcre segfault

Если мы прогоняем текст (около 4 киб) через такую регулярку:
$tpl = "/<ins[^>]*>((.*|^(<\/ins>))*)<\/ins>/simx";
то все нормально.

А если такую:
$tpl = "/<ins[^>]*>((.*?|^(<\/ins>))*)<\/ins>/simx";
PHP валится в segfault.

Причем проблема известна аж с 2003 года и версии PHP 4.3.3
Пруфлинк: http://bugs.php.net/bug.php?id=26219

И вроде как даже ее поправили, о чем говорится в конце треда на тему.
Вот только на PHP 5.2 и PCRE 7.2 оно по-прежнему валится =(
Tags:

Sep. 30th, 2009

DMakeev

dmakeev

Как защитить e-mail от спам-ботов

Задача: защитить от спам-ботов e-mail на сайте.


Условия: мест где может быть мыльник вагон, поэтому хочется более-менее универсального решения.
Метод защиты: при генерации страницы все адреса электронной почты конвертируются в "обычные" ссылки, которые при отображении страницы у клиента яваскриптом возвращаются к исходному виду.




Итак, решение:
PHP - тут все просто — вылавливаем адреса и приводим в божеский вид. После генерации всей страницы, естественно:

$output = preg_replace('!(mailto:)?([a-z0-9\.\-]+)@([a-z0-9\.\-]+)\.([a-z]{2,6})!si', '/$2.m.$3/$4/', $output);



Яваскриптовая часть в трех вариантах — каждый волен выбирать понравившийся:
Don`t fuck my brain:

  window.addEvent('load', function() {
    var regEmail = /\/([a-zA-Z0-9\-\.]+)\.m\.([a-zA-Z0-9\-\.]+)\/([a-zA-Z]{2,6})\//g;
    $document.body.innerHTML = document.body.innerHTML.replace(regEmail, '$1@$2.$3');
  });



pure JS:

  window.addEvent('load', function() {
      var regEmail = /\/([a-zA-Z0-9\-\.]+)\.m\.([a-zA-Z0-9\-\.]+)\/([a-zA-Z]{2,6})\//g;
      var list = document.getElementsByTagName('a');
      for(var i=0; i      if(list[i].href.match(regEmail)) {
        var str = list[i].href.replace(document.location.protocol + '//' + document.location.hostname, '');
        str = str.replace(regEmail, '$1@$2.$3');
        list[i].href = 'mailto:' + str;
        list[i].innerHTML = el.innerHTML.replace(regEmail, '$1@$2.$3');
      }
    }
    if(document.body.innerHTML.match(regEmail)) {
      $document.body.innerHTML = document.body.innerHTML.replace(regEmail, '$1@$2.$3');
    }
  });




Mootools:

  window.addEvent('domready', function() {
    var regEmail = /\/([a-zA-Z0-9\-\.]+)\.m\.([a-zA-Z0-9\-\.]+)\/([a-zA-Z]{2,6})\//g;
    $$('a').each(function(el) {
      if(el.href.match(regEmail)) {
        var str = el.href.replace(document.location.protocol + '//' + document.location.hostname, '');
        str = str.replace(regEmail, '$1@$2.$3');
        el.href = 'mailto:' + str;
        el.innerHTML = el.innerHTML.replace(regEmail, '$1@$2.$3');
      }
    });
    if(document.body.innerHTML.match(regEmail)) {
      $document.body.innerHTML = document.body.innerHTML.replace(regEmail, '$1@$2.$3');
    }
  });

Tags:

Sep. 4th, 2009

DMakeev

dmakeev

дао оптимизатора

Оптимизация SQL это дао — нужно пропустить это через себя, оставив ключевые ощущения.

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


PS Зато после у меня было ощущение как у героя тов. Ривза в известном фильме — "Кхм... я знаю Джиу-Джитсу" ))

Aug. 14th, 2009

DMakeev

dmakeev

Ассоциативные массивы в JavaScript

Все мы немножко грешим шаблонностью мышления — привыкли пользоваться одними методами в одном языке и пробуем их же в других. Есть в JavaScript такая штука как ассоциативные массивы. В книгах/мануалах пишут что да, их есть у нас, велкам. А на практике не всегда получается хорошо. Если опустить весь мат последних трех часов то сухой остаток следующий:

- ассоциативные массивы есть
- использовать ассоциативные массивы в JavaScript можно, но крайне осторожно
- если ключи ассоциативного массива — числа, массив перестает быть ассоциативным.
На практике это приводит к не...му дебагу — почему это у меня в массиве не то что нужно.

Вывод: использование new Object вместо new Array везде где предполагается ассоциативность массива. Это чуть изменяет JSON — описание всего хозяйства, но на практике работает гораздо корректнее.

PS JS это ДАО. Пока не прочувствуешь на своей шкуре нифига хорошего не получится.
 


May. 27th, 2009

DMakeev

dmakeev

Битрикс. Массовая загрузка фотографий в админке

Задача: сделать малой кровью возможность загрузки пачки фотографий в админке Битрикса.

Суть: грузим архив, распаковываем и вставляем. Можно грузить несколько архивов параллельно.

Почему так хреново: да, конечно лучше было бы прикрутить хороший мультизагрузчик, но а) не до того б) есть ощущение что Битриксы когда-нибудь это сделают стандартным функционалом.

Итак, собсно решениеCollapse )


PS: Использует библитоечку Zip (класс ZipArchive)..

PPS: Косяк, до которого руки не дошли: для удаления архива после обработки свойству присваивается первая из загруженных фотографий. Не бог весть какое решение, но в качестве костыля попрет. Кто поправит - скажу спасибо.

May. 26th, 2009

DMakeev

dmakeev

Генератор паролей

Запустил генератор паролей: mypas.ru

Что есть:
  • 8 символов, маленькие-большие символы и цифры. С вероятностью процентов 60 пароль удобочитаем и удобозапоминаем
Что будет:
  • возможность заслать понравившийся пароль себе по почте (чтобы не нужно было записывать)
Что вероятно/возможно/когда-то будет:
  • открытое API в виде JS и GET-запроса (с наработкой небольшого запаса на случай отвала сервера). Нафик оно нужно еще не придумал, но забавно.
  • Возможность менять количество символов, сложность пароля

Благодарности: stekar за алгоритм, free_bin за финальный пинок

Apr. 24th, 2009

DMakeev

dmakeev

Проверяем сайт на битые ссылки


Если у Вас есть сайт, рано или поздно на нем появятся битые ссылки. Можно закрывать на них глаза, но это врядли эффективный подход — посетители не будут находить необходимую информацию. Искать битые ссылки вручную — занятие долгое и не продуктивное. Бесплатные решения, в том числе инструментарий Яндекс.Вебмастер и Google, решают задачу лишь отчасти (см http://badlinks.ru/page/faq/#faq4).


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


Как это работает:
Поисковый робот обходит все страницы сайта и проверяет доступность всех страниц, изображений и файлов, а также любых сторонних сайтов, на которые есть ссылки. После завершения проверки на e-mail высылается отчет о проверке со списком найденных битых ссылок.

Сколько сие чудо стоит:
* тестовая проверка (максимально проверяется 20 страниц) бесплатна.
* полная проверка сайта стоит 30 рублей
* регулярные проверки от 350 рублей в год


Дальше и больше: badlinks.ru

PS Репост приветствуется

Previous 10