• Как сделать анализатор и поиск по прямому тексту?

    ruFelix
    @ruFelix
    Предсказание будущего по руке, таро, кофе.
    Всё же sphinxsearch.

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

    Неоднократно решал задачу поисковых запросов на естественном языке к различным структурированным данным. И замечу, что если источником запроса служит текстовое поле то пользователи тупят, не пользуются этим т.к. хотят видеть сложную форму с кучей селект боксов галочек и т.д. Ни кто не хочет писать: "чёрный лексус 2 литра не старше 2000 года". Зато если источник ввода это распознанная устная речь на мобильнике то это работает.
    Ответ написан
    Комментировать
  • Попросили проверить код, на что смотреть нужно?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Смотря зачем)). Я когда делаю Code Review критерии следующие:

    * Безопасность:
    - Каждый аргумент метода простого типа должен проверяться на тип в случае его проксирования и на граничные значения в случае обработки. Чуть что не так - бросается исключение. Если метод с кучкой аргументов на 80% состоит из поверки из аргументов - это вполне норм))
    - Никаких trigger_error, только исключения.
    - Исключения ДОЛЖНЫ быть человеко-понятны, всякие "Something went wrong" можно отдавать пользователю, но в лог должно попасть исключение со стектрейсом и человеко-понятным описанием, что же там пошло не так.
    - Каждый аргумент (объект) метода должен быть с тайпхинтингом на этот его класс, или интерфейс.
    - За eval как правило шлю на **й.
    - @ допускается только в безвыходных ситуациях, например проверка json_last_error.
    - Перед работой с БД - обязательная проверка данных.
    - Никаких == и !=. Со swtich - единственное исключение, по ситуации.
    - Если метод возвращает не только bool, а еще что-то - жесткая проверка с ===, или !== обязательна.
    - Никаких условий с присваиваниями внутри. while($row = ...) - тоже идет лесом.
    - Магические геттеры/сеттеры разрешаются только в безвыходных ситуациях, в остальном - запрещены.
    - Конкатенации в sql - только в безвыходных ситуациях.
    - Параметры в sql - ТОЛЬКО через плейсхолдеры.
    - Никаких глобальных переменных.
    - Даты в виде строки разрешаются только в шаблонах и в БД, в пхп коде сразу преобразуется в \DateTimeImmutable (в безвыходных ситуациях разрешено \DateTime)
    - Конечно зависит от проекта, но как приавло должно быть всего две точки входа: index.php для web и console(или как-то по другому назваться) - для консоли.

    * Кодстайл PSR-2 + PSR-5 как минимум, + еще куча более жестких требований (для начала все то что в PSR помечено как SHOULD - становится MUST)
    - В PhpStorm ни одна строчка не должна подсвечиваться (исключением является typo ошибки, например словарик не знает какой-то из аббревиатур, принятых в вашем проекте). При этом разрешается использовать /** @noinspection *** */ для безвыходных ситуаций.
    - Если кто-то говорит, что пишет в другом редакторе и у него не подсвечивается, на эти отговорки кладется ВОТ ТАКЕЕЕНЫЙ мужской половой **й и отправляется на доработку)).

    * Организация кода:
    - Никаких глобальных функций.
    - Классы без неймспейса разрешаются только в исключительно безвыходных ситуациях.

    * Тестируемость (в смысле простота тестирования) кода должна быть высокая.
    - Покрытие кода обязательно для всех возможных кейсов использования каждого публичного метода с моками зависимостей.

    * Принципы MVC:
    - Никаких обработок пользовательского ввода в моделях, от слова совсем.
    - Никаких ***ть запросов в БД из шаблонов.
    - Никаких верстки/js/css/sql-ин в контроллерах.
    - В моделях НИКАКОЙ МАГИИ, только приватные свойства + геттеры с сеттерами.
    - В моделях разрешено использовать метод save(при наличии такого разумеется) только в исключительных ситуациях. Во всех остальных - либо insert, либо update.

    * Принципы SOLD:
    - Никаких божественных объектов умеющих во все.
    - Если метод для внутреннего пользования - private, никаких public.
    - Статические методы разрешаются только в случае безвыходности.

    * Принцип DRY разрешено нарушать в случаях:
    - Явного разделения обязанностей
    - В тестах (каждый тест должен быть независимым, на сколько это возможно)

    * Работа с БД:
    - Запрос в цикле должен быть РЕАЛЬНО обоснован.
    - За ORDER BY RAND() - шлю на***й.
    - Поиск не по ключам (конечно если таблица НЕ на 5 строк) запрещен.
    - Поиск без LIMIT (опять же если таблица НЕ на 5 строк) запрещен.
    - SELECT * - запрещен.
    - Денормализация БД должна быть обоснована.
    - MyISAM не используется (так уж)) )
    - Множественные операции обязательно в транзакции, с откатом если чо пошло не так.
    - БД не должна содержать бизнес логики, только данные в целостном виде.
    - Не должно быть нецелесообразного дерганья БД там, где без этого можно обойтись.

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

    * О людях:
    - "Я привык писать так и буду дальше" - не вопрос, ревью пройдешь только когда поменяешь свое мнение.
    - "Я пишу в vim-е и мне так удобно" - здорово, код консолью я тоже в нем пишу)) но есть требования к коду, если в них не сможешь - не пройдешь ревью.
    - "Я скопировал этот страшный метод и поменял 2 строчки" - это конечно замечательно, но по блейму автор всего этого метода ты, так что давай без говняшек, хорошо?
    - "Оно же работает!" - вот эта фраза переводится примерно так: "да, я понимаю, что пишу полную хрень, но не могу писать нормально потому, что руки из жо", я правильно тебя понял?))
    - "У меня все работает!" - рад за тебя, а как на счет продакшна?
    - "Там все просто" - не используй слово "просто", от слова "совсем". Вот тебе кусок кода (первого попавшегося с сложной бизнес логикой), где там ошибка (не важно есть она, или нет)? Ты смотришь его уже 2 минуты, в чем проблема, там же все "просто"))

    * Всякое:
    ActiveRecord (это я вам как в прошлом фанат Yii говорю) - полное говно, примите за исходную. По факту у вас бесконтрольно по проекту гуляют модельки с подключением к БД. Не раз натыкался на то, что в тех же шаблонах вызывают save, или update (за такое надо сжигать).
    То, что используется Laravel - это печально((. Что бы выполнить требования приведенные выше, приходится "воевать" с фреймворком.

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

    UPD

    Формализировал данные критерии по ссылочке: https://github.com/index0h/php-conventions
    Ответ написан
    55 комментариев
  • Как хранить время последней активности пользователя в MySQL?

    ruFelix
    @ruFelix
    Предсказание будущего по руке, таро, кофе.
    Общее для всех mysql:
    Проверить какой запрос отрабатывает система если replace то плохо если update или insert on duplicate key update - то ок.
    Если в action_history есть индексы кроме примари кей то их скорее всего стоит убрать т.к. вероятно запросы ( сортировки или агрегации) по этим полям будут приводить в любом случае к фулскану и индекс не будет иметь смысла, а при апдейте перестройка будет постоянно всё класть.

    Для Maria: убедиться, что в Maria XtraDB не сломана построчная блокировка (всё таки опыт продакшена у марии неё вялый ). Потом вызывает опасение реализация внешнего индекса в таблицах разного типа, возможно это как то может ломать построчную блокировку. Если у вас лок всей таблицы разберитесь откуда, так не должно быть

    В общем и целом, поразмышлять что INSERT DELAYED VALUES (1,2,3),(..,..,..),(N,N,N) для записи всех действий будет работать заметно веселее особенно без индексов и в одном потоке, а после некоторых шаманств с агрегацией по крону ещё не будет деградировать от распухания. Что можно про крону парсить access.log (понимать что он не рилтайм), в этом случае будет одна пачка апдейтов допустим раз в минуту и user_id будет заапдейчен только один раз, это будет пожалуй самой простой реализацией задачи упорядочивания и фильтрации потока апдейтов к mysql. Парсинг лога можно заменить на RabbitMQ, или написать своего демона который будет висеть на соке и рулить.

    Но смотрите если у вас задача в стиле показать последние 10 пользователей сделавших, что то, то это решается сильно иначе.
    Ответ написан
    2 комментария
  • Как заработать на youtube и монетизировать свои видео на нем же?

    WarEnek
    @WarEnek
    Ленивый freelance'ер
    1) Только от прямых рекламодателей.
    2) Пока популярность недостаточна, то вряд ли кто-то найдёт. Кидай холодные запросы на рекламу у себя в роликах потенциальным рекламодателям.
    3) Трудно сказать, всё зависит от тематики, региона и аудитории. Смотри по аналогии со своим каналом на socialblade.com
    4) Нет.
    5) Платят только за просмотры, на кол-во подписчиков всем наплевать. Платят рекламодатели через google. Т.е. между тобой и рекламодателем идёт google в качестве прокладки, которая забирает себе приличную часть прибыли.
    6) Смотрим п. 3
    7) В нашем мире всё продаётся и покупается.
    8) Если умеешь продавать, то ты сможет и продать свои сюжеты. Но не частая практика.
    9) Зависит от того, какую лицензию поставишь.
    10) Всё зависит от тематики. Всякие бродвеи фигарили по 20 роликов в день, но они были не больше 30 сек. За счёт этого он и поднялся. Ларин выкладывает в день по ролику и хронометраж обычно 5-15 мин. Кстать посмотри видео www.youtube.com/watch?v=qPauuSVDTeI многие вопросы затронуты.
    11) Конкретно с цифрами и т.д. не припомню.
    12) Не отвечу.
    Ответ написан
    Комментировать
  • Как хранить и искать цвет в MySQL?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Если вам нужно искать по оттенку логичнее было бы конвертировать RGB в HSV (Hue, Saturation, Value) и искать по компоненте HUE (оттенок). И никакой математики в запросах, индексы, быстро и просто. Вообще RGB плохо подходит для задачи поиска цвета. Его хорошо понимает видиокарта и монитор. Принтеры вот тоже не любят RGB, им больше нравится cmyk.

    И хоть я и против RGB для такой задачи и вообще для хранения оного для выборов...
    3 столбца - плохая идея (ИМХО)

    3 колонки TINYINT и все unsigned. Это 3ubyte. Три значение [0-255]. То что нужно.
    Ответ написан
  • В чем отличие phalcon-micro от phalcon?

    deadbyelpy
    @deadbyelpy
    веб-шмеб
    Тем что в micro - урезанный функционал. Вам недоступно большая часть событий.
    Встроенный router, dispatcher, и соответственно только их (но и не все) события. Запрос обработанный через микро не уйдет дальше него.
    Это что-то похоже на приложение где 1 контроллер и больше ничего.
    Уже инициализированные request, response, и отдельно стоит view, его надо инициализировать, но микро сможет его использовать без лоадера и DI.
    Но все еще можно включить нормальный DI, автозагрузку файлов, модели, и все прочее, кроме Dispatcher, Router.
    Также есть microCollection, используя его можно уже писать и использовать более 1 контроллера, причем запрос может быть обработан с помощью 2 и более контроллеров.

    А по скорости отличаются потому как, что будет быстрее более нагруженное или менее нагруженное приложение? - ответ очевиден.
    Ответ написан
    Комментировать
  • Какие впечатления от Phalcon по сравнению с Symfony / Yii?

    deadbyelpy
    @deadbyelpy
    веб-шмеб
    Все собираюсь написать про это статью, да никак.
    если кратко имхо то: Phalcon лучше чем Symfony, который лучше чем Yii
    какие критериии отбора? Symfony имеет больший порог входа чем Phalcon, Yii же имеет порог входа еще меньше, но он отстает по архитектуре "внутри"
    Phalcon имеет Volt (шаблонизатор), у SF - Twig, Yii - ничего (но никто не мешает ставить туда Twig)
    У Ph,SF есть вменяемый DI, а Yii это Yii->app()
    SF поставляется с ACL, Yii - RBAC + ACL, Phalcon - ACL.
    Ph, SF2 (Doctrine) есть AR, у Yii же еще есть и DAO
    Ph на шаред хостинге не развернешь, но кто делает проекты для шаред хостингов на SF2? На Yii знаю т.к. достаточно быстро можно развернуть бложик.
    Больше написать просто неуспеваю, напоследок. делать сложные приложения на Phalcon уже можно, он готов к проду, он проще чем SF2 и удобнее, при этом архитектура у него продуманная как и у SF2
    Продвинул идею Phalcon в компании где работаю, его с радостью встретили и с радостью пользуются для сложных, enterprise проектов.
    все конечно только исходя из моего опыта работы с ними. не навязываю никому свое мнение
    Ответ написан
    6 комментариев
  • Почему не видна команда exim?

    @neol
    exim должен был удалиться при установке sendmail, это конфликтующие пакеты.

    Файлы настроек удаляются только при apt-get purge exim4-config, логи менеджер пакетов вообще не трогает. Так что exim у вас скорее всего не установлен.
    Ответ написан
    4 комментария
  • Как исправить основание ветки в Git?

    @DancingOnWater
    Баг отображения? Начало ветки Sidebar не привязано ни к одному коммиту.
    Ответ написан
    Комментировать
  • Почему стала появлятся такая ошибка

    toxa82
    @toxa82
    Похоже что, сервер перестал видеть ";" как разделитель запросов. Может у вас где-то в коде используется DELIMITER и забыли вернуть обратно ";"?
    Также можно переписать в один запрос:
    INSERT IGNORE INTO `tags_list` (`word`) VALUES ('рыба'), ('мясо'), ('птица');
    Ответ написан
    1 комментарий
  • Что понимать под словом back-end?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Если очень примитивно, то пользователь работает с frontend, который собирает и отправляет данные backend-у, который, в свою очередь, делает что-то с этими данными. В контексте клиент-серверного ПО, то клиент это frontend, а сервер - backend. Между ними http (обычно restfull или soap интерфейс, которые служат транспортном для данных).

    В более общем смысле, front-end является интерфейсом, который подготавливает данные для передачи на нижестоящий уровень (back-end). Причем уровней может быть сколь угодно много, так что на сервере так же может быть свой front-end и back-end к нему.
    Ответ написан
    Комментировать
  • Как защитить сайт от прямого перехода?

    hell0w0rd
    @hell0w0rd
    Просто разработчик
    Вам нужно брать значение referer. В php оно лежит в $_SERVER['HTTP_REFERER']
    Но знайте, это значение можно подделать, это просто заголовок внутри http запроса.

    Также возможно контакт отправляет какие-то свои заголовки, или просто не дает доступ к js АПИ - тут уже со стороны JS можно посмотерть
    Ответ написан
    Комментировать
  • Как перенести часть javascipt на сервер?

    demimurych
    @demimurych
    Несколько раз перечитал вопрос.
    И ничего не понял.
    Ответ написан
    3 комментария
  • Как сделать домашний сервер видимым из интернета?

    Пробросить 80 порт с внешнего IP на 192.168.0.87.
    Как?
    Инструкция по настройке проброса портов
    первая строка в выдаче google - www.dlink.ru/ru/faq/246/1035.html
    P.S.
    Только если у вас есть нормальный (белый) внешний IP, если же у вас подключение к интернет через NAT провайдера - то нормально этого вообще не сделать.
    Ответ написан
    2 комментария
  • Как реализовать приватный чат на сайте?

    Вам в помощь node.js и angular.js
    Пример можно подсмотреть на GitHub
    Ответ написан
    1 комментарий