Pull to refresh
44
0
Игорь Щербин @ischerbin

*nix админ, увлекающийся программированием

Send message
Согласен, пример не самый удачный. Для более наглядной демонстрации результата стемминга привожу топ 10 слов из всей базы:
tasks=# SELECT * FROM ts_stat('SELECT fti_txt FROM texts') ORDER BY nentry DESC, ndoc DESC LIMIT 10;
  word  | ndoc | nentry 
--------+------+--------
 сдела  | 1286 |   1507
 сервер |  628 |    830
 сегодн |  667 |    725
 дан    |  573 |    723
 эт     |  579 |    689
 нов    |  525 |    629
 дела   |  524 |    595
 работ  |  522 |    589
 файл   |  382 |    544
 1      |  256 |    538
(10 rows)
Если не лезть в дебри того, что такое «семантический поиск» и какой софт умеет его выполнять, но говорить исключительно о tsearch2 vs sphinx и ему подобных то с чего Вы взяли, что первый ничего не умеет? Желательно для начала бегло почитать что пишут, например здесь.
Добавил trim и в этот раз без спешки проверил. Теперь работает как положено.
Спасибо! Заменил строку:

$_query_array = explode(' ', $_GET['term']);

на:

$_query_array = explode(' ', Yii::app()->db->quoteValue($_GET['term']));

ts_stat по сути не предназначена для решения прикладных задач, она задумана для целей отладки и мониторинга. Она выдает статистику по тому, какие слова как часто и где встречаются. В качестве параметра она принимает текст SQL запроса, возвращающего набор полей типа tsvector, только так она сработает. В противном случае будет:

ERROR:  ts_stat query must return one tsvector column
Это как ответить на вопрос
— Как пропатчить KDE под FreeBSD?
— Ставь винду!
Вроде бы и ответ и даже должно сработать, но чего то все-таки не хватает.
tsearch2 встроен в базовод, не надо ничего отдельно ставить, настраивать и запускать. Но в любом случае на вкус и цвет…
Да, я сам запутался, wataru прав, я выполнял задание в январе — детали забываются, но достаточно посмотреть на код:

((yp <= y and y < yp_prev) or (yp_prev <= y and y < yp))

как становится понятно что если один конец грани лежит на луче, а второй выше (визуально, учитывая что точка отсчета координат в левом верхнем углу) — такая грань не будет считаться пересечением.
Отрицательные индексы в питоне валидны и означают отсчет с конца массива, то есть [-1] — это последний элемент, [-2] — предпоследний и так далее.
Да, Вы правы, признаю, грань, лежащая на луче не будет засчитана, а прилегающие к ней грани посчитаются 2 раза, что выльется в результат «вне полигона». Такая ситуация требует отдельной проверки.
Не могу точно сказать проверяет ли интерпретатор python все условия или прекращает дальнейшую проверку если одна часть and конструкции является False, но скорей всего прекращает. А это значит что ((yp <= y and y < yp_prev) or (yp_prev <= y and y < yp)) будет False и до деления на 0 не дойдет. Исключение — случай когда одна из граней имеет одинаковые координаты на обоих концах, то есть точка.
В данной реализации попадание в вершину или на грань (даже если грань лежит на луче) будет считаться вхождением в полигон.
Именно этот метод и описан в статье:
Последовательно проверяются все грани полигона на пересечение с лучом, идущим из точки, куда кликнул пользователь. Четное количество пересечений или нет пересечений вовсе — точка за пределами полигона. Количество пересечений нечетное — точки внутри.
С математической точки зрения правильнее так: https://habrahabr.ru/post/125356/
Сам удивляюсь, по сравнению со сверстницами попроще пластик почти не желтеет и кнопки не так интенсивно «полируются». Буквы нанесены лазером, не стираются, сделано на века в общем, хоть и не механика.
Однако для доказательства возраста и что вообще «ничто не вечно» привожу фото с менее выгодного ракурса:

image
Вот она собственной персоной, минус на мой взгляд один — белая.

Пользуюсь Cherry G83-6303LPNRG (мембрана), всему перечисленному соответствует, не знаю только есть ли еще в продаже, моему экземпляру почти 10 лет.
Насчет разных контроллеров. Я понимаю, что у вас сейчас пример и заготовка. Но когда приложение обрастет функциональностью, добавятся специфичные проверки для конкретных сущностей (одна валидация для пользователей, но другая для постов), то вы получите один большой файл ответственный за всё. Да и управление доступом к сущностям странное. Какая бы сущность не существовала в приложении, я могу передать ее имя в API и иметь доступ к созданию/изменению/удалению/чтению.


Согласен, именно потому привел в статье ссылку на готовое решение restfullyii. Там в числе прочего есть и кастомный роутинг и подкатегории.

Также можно расширить мой пример, передав выбор и загрузку модели в action-ы отдельному компоненту. API контроллер разгрузится, а во внешнем компоненте мы можем городить, что угодно.

Information

Rating
Does not participate
Location
Кемерово, Кемеровская обл., Россия
Date of birth
Registered
Activity