среда, 28 июля 2010 г.

Как узнать насколько две строки похожи?

Для того, что бы узнать на сколько похожи две строки, можно использовать алгоритм - "расстояние Левенштейна". О нем я сегодня узнал от Алены C++.

Я же хочу предложить вариант реализации на языке программирования php:

function levenshtein_distance($s, $t)
{
 $n = strlen($s); 
 $m = strlen($t); 
 
    /* if used russian or other UTF-8 characters 
    change above code with this 
 $n = mb_strlen($s, 'UTF-8'); 
 $m = mb_strlen($t, 'UTF-8');
 */
 
 if ($n == 0) 
  return $m;
 if ($m == 0) 
  return $n;
  
 $d = array();
 
 for ($i = 0; $i <= $n; $i++) {
  $d[$i][0] = $i;
 }
 
 for ($j = 0; $j <= $m; $j++) {
  $d[0][$j] = $j;
 }
 
 for ($i = 1; $i <= $n; $i++) {
  $sI = $s[$i - 1];
  for ($j = 1; $j <= $m; $j++) {
   $tJ = $t[$j - 1];
   $cost = ($tJ == $sI) ? 0 : 1;
   $d[$i][$j] = min(
    $d[$i - 1][$j] + 1, 
    $d[$i][$j - 1] + 1 , 
    $d[$i - 1][$j - 1] + $cost);
  }
 }

 return $d[$n][$m];
}

echo levenshtein_distance('gumbol', 'gambo');

В результате мы увидим "2", так как необходимо заменить u на a и удалить l.

воскресенье, 11 июля 2010 г.

Инициализация Zend_Translate из файла конфигурации приложения.

Мне больше нравиться настраивать все в файле конфигурации приложения(далее конфиг), хотя конечно встречаются моменты, когда необходимо воспользоваться bootstrap`ом. Сегодня, мне необходимо было инициализировать Zend_Translate из конфига. В документации, я не нашел информации по этому поводу. Поэтому порылся минут 5 в исходниках, после чего у меня получился такой код в .ini файле:

; Translate
resources.translate.adapter = "array"
resources.translate.data    = 
    APPLICATION_PATH  "/languages/ru/Zend_Validate.php"
resources.translate.locale  = "ru"

Код вполне работоспособный.

понедельник, 29 марта 2010 г.

О стандартизации различных CMS.

Последняя версия статьи здесь.

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

Что меня забавляет - так это, то что почти каждый программист пишет свою CMS, это уже как будто обязанность какая-то. А знаете, что обидно? Аргументируются самодельные CMS так:
  1. Я получу опыт. 
  2. Я сделаю лучше, чем Drupal/Wordpress/Joomla!/etc. 
  3. Моя CMS узкоспециализирована.
Конечно, кому-то удается и кто-то пишет CMS лучше, чем существующие. А кто-то загибается и прекращает свою работу на пол. пути.

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

Я пишу о проблеме совместимости модулей CMS. А также шаблонов и прочих компонентов. Почему я вижу в этом проблему?
  1. Потому, что хочется иметь одно решения, и не выбирать из множества. Как бы хочется "постоянства".
  2. Хочется, что бы то, что есть в Joomla, нажатием пары кликов, а то и одного, было и в Drupal. 
Вы просто посмотрите, выходит  модуль для Wordpress и тут же его "копируют" для Drupal. Копируют, имеется ввиду реализовывают схожий функционал. И так постоянно. А что если бы этого не нужно было делать?

Как я вижу решение данной проблемы? На данный момент я вижу два пути:
  1. Создание CMS, которая будет поддерживать модули, шаблоны и т.п. других CMS. На основе неких адаптеров, которые будут подстраивать "инородные" модули. 
  2. Создание единого стандарта CMS, который будет поддерживать каждая CMS.
Возможно есть еще варианты, но их я пока не вижу. О первом варианте, хочется сказать следующее, его реализация будет неимоверна сложная и в любом случае придется привлекать сторонних разработчиков. Конечно, кто-то уже видит в 1-ом варианте коммерческую изюминку. О втором варианте, здесь будет другой подход. Нужно будет уговорит сообщество разработчиков различных CMS сделать такой шаг. 

В любом случае, мне это кажется шагом вперед, шагом в будущее.