Задать вопрос
  • Самый простой способ выдавать мобильную версию сайта на php

    @egorinsk
    Правильно — сделать это средствами CSS. Например, так это сделано на сайте W3C. Но это не все умеют. Неправильно (но этоn способ работает) — костылем в PHP через проверку User-Agent.
    Ответ написан
    Комментировать
  • Счетчики элементов большой древовидной структуры?

    @egorinsk
    Еще, если речь об интернет-магазине, можно кешировать число товаров в каждой категории, или кроном раз в 5 минут пересчитывать и сохранять (через запрос SELECT COUNT(*) GROUP BY category_id), но мне подход L0NGMAN нравится больше.

    > Была попытка реализовать на mysql-триггерах обновление счетчика каждой категории при изменении/добавлении/удалении товара, но при загрузке большого количества товара такая система работает крайне не стабильно, точнее долго.

    Знаичт, у вас плохой код, надо его оптимизирвать, возможно, сделать то же самое без триггеров.
    Ответ написан
  • Как добавить индексы не очень маленькой InnoDB таблице?

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

    > Если просто попробовать выставить индексы через ALTER TABLE то я боюсь что у меня сервер повиснет в процессе.

    Так и будет. Это очень медленная операция, на огромных таблицах она займет часы или даже дни.
    Ответ написан
    Комментировать
  • XCP(Xen Cloud Platform) и Dynamic Memory Control?

    @egorinsk
    Вам надо это с хабраюзером amarao обсудить, у него вроде как целое облако на зене работает, и он на этом собаку съел.
    Ответ написан
    1 комментарий
  • Uncomplicated Firewall(ufw)?

    @egorinsk
    > Подскажите решение — как дать доступ 127.0.0.1(localhost'у) к порту 8080, исключив доступ всех остальных(извне) к нему, с помощью утилиты ufw в ubuntu?

    Может быть, биндить сервис, который слушает на этом порту, только на локальный интерфейс (lo)? Тогда даже без фаерволла нельзя будет к нему снаружи подключиться. У многих стандартных сервисов (apache, nginx, FTP демоны) есть опции в настройках, выбирающие сетевые интерфейсы, на которых они слушают сокеты.
    Ответ написан
    1 комментарий
  • Проектирование и разработка системы обработки информации?

    @egorinsk
    Зачем проектировать свой, плохой поиск (потому что не так-то просто найти специалистов, способных сделать хороший, они все в Гугле давно работают), когда может быть можно, например купить яндекс-сервер для локальной сети? Или он вам не подойдет?

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

    Или разбиение на слова. Многие системы при индексации разбивают текст на слова. Разбивать ли текст по знаку «минус»? будет ли находиться слово, разбитое переносом: «обык-новенный»? Будет ли разбито на части слово RMT-2600? И будет ли поиск по нему работать? Будут ли находиться слова с опечатками? «обыкновеный» и «Обыкновенный»? А поиск цифр (кодов), если в тексте он в виде 3-123-124, а пользователь вводит без дефисов?

    Отдельная песня — поиск фамилий. Johansonn, Йохансон, Иогансон, Йохансонн. Обработка юникодных символов вроде ́́́a?

    Сможете ли вы индексировать например DOC, PDF и другие форматы, которые используются.

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

    Также, есть проблема ранжирования. Искомое слово встречается в 300 документах. Естественно, все 300 никто смотреть не будет, будут смотреть первые несколько десятков, вопрос, как ранжировать эти 300 документов, чтобы вначале шли более релевантные?

    Если в запросе несколько слов, надо ли искать каждое слово отдельно? Или обязательно присутствие всех слов на определенном расстоянии?

    Вот смотрите, сколько сложнорешаемых проблем выскакивает после 10 минут раздумий.

    Я бы понял, если у вас задача распилить какой-нибудь бюджет, но вы пишете «чтобы пользователи смогли быстро и эффективно выполнять поиск по базе, не имея знаний в указанной области» — такой поиск просто так не сделать. Надо делать разные варианты, изучать фидбек, сохранять неудачные поиски, делать эксперименты, тесты, и т.д.

    А то, что пишут выше, про LIKE % и Windows Search, вообще ничего, кроме огорчения не вызывает.

    И вам не нужны какие-то знания по архитектуре и базам данных на этом этапе. Очевидно, что должен быть какой-то компонент, извлекающий структурированный (разбитый на поля) текст из исходных документов, компонент, индексирующий их, компонент, ищущий по созданному индексу и компонент, отображающий найденные документы в удобном виде, подсвечивающий слова в них (если получится).

    То, что в вашем вопросе не упомянуты слова «индекс», «ранжирование» и прочее, меня настораживает.

    Вы, кстати, можете посмотреть, как устроена посиковая система sphinx, но я сомневаюсь, что сфинкс сам по себе способен решить описанные мной проблемы. Он скорее способен выполнить (средненько) роль индексирующего и ищущего компонентов.
    Ответ написан
    2 комментария
  • Zend: Cache чистится сам по себе

    @egorinsk
    Но кеш не предназначен для хранения данных. Нафига вы там что-то храните? Так сложно поставить какой-нибудь редис или что-нибудь в этом роде? Или, что еще проще — сделайте в MySQL базу данных с типом MEMORY, она работает, говорят, со скоростью, аналогичной мемкешу.

    Также, вопрос! Если вы работаете через UDP, там нет ограничений на размер пакета и размер данных?

    Сам мемкеш трет ключи либо когда истекает время хранения, либо когда его попросят, либо когда заканчивается память. Так что скорее всего баг в вашем коде, ну что — пишите в лог все обращения к мемкешу и потом разбирайте этот лог и смотрите, где накосячили.
    Ответ написан
    Комментировать
  • Используются ли в update запросах mysql индексы?

    @egorinsk
    Сделайте InnoDB таблицу из 10 млн записей и сравните например скорость SELECT по индексу/без и скорость UPDATE. Подозреваю, что при выборке участвуют, так как UPDATE предполагает в начале выборку изменяемых строк.
    Ответ написан
  • Markdown, Dropbox и Hosting/Blogging платформа для перфекционистов?

    @egorinsk
    Что удобного в маркдаун? Я вот вчера писал текст в Google Docs, с картинками, таблицами и кусками кода, и понял, что это крайне удобно, вставлять картинки перетаскиванием (жаль, пока нельзя из буфера обмена вставлять). Я поймал себя на мысли, что делать то же самое в HTML (несмотря на то, что я его отлично знаю), Markdown или любой другой системе гораздо муторнее и неудобнее, чем в визивиге.
    Ответ написан
    2 комментария
  • Чем лучше обновлять версии cms?

    @egorinsk
    А если клиент после установки сайта там что-то менял, например, вы своим обновлением снесете это или вообще сломаете сайт, вас это не пугает?
    Ответ написан
    2 комментария
  • Прямоугольник на прозрачной форме или прямо на экране

    @egorinsk
    Форма не нужна. Надо создать окно, без рамки, со свойством всегда поверх, и со свойством (не помню, как оно называется), которое в WinAPI включает offscreen rendering для окна, позволяет его делать полупрозрачным, и т.д. Изменять размеры и таскать окно, вручную ловя события и обрабатывая.
    Ответ написан
  • Видимая яркость разных цветов у светодиодов?

    @egorinsk
    Скорее всего, большей, так как спектр белого света шире, и несет больше энергии, чем красного.
    Ответ написан
  • Как вычислить хулигана, звонящего через IP-телефонию (Skype)?

    @egorinsk
    Вряд ли тут есть технические способы борьбы с этим, разве что в саппорт скайпа написать. Но там ведь аккаунты анонимные.

    Интуиция подсказывает, что в таком случае проще поговорить с звонящим и наглядно объяснить ему, насколько он глупо себя ведет. Если ему не 12 лет и он не полный идиот (полный идиот не смог бы настроить скайп), я думаю, можно его как-то словесно унизить например и ему не захочется больше звонить. Также можно попросить знакомого мужчину с волевой хорошо поставленной речью поговорить с хулиганом.

    Но вообще, это печально.
    Ответ написан
  • Интернет логгер с возможностью поиска [UPD]?

    @egorinsk
    В Опере есть возможность сделать историю размером 10 000 записей например и включить индексирование страниц — будет индексироваться текст на них и мгновенно искаться при наборе слова в адресной строке. Динамически подгружаемые страницы и диалоги вконтакте работать конечно не будут, но все равно, попробуйте, вы удивитесь, какая у Оперы хорошая память.
    Ответ написан
  • Короткий номер для приема sms без снятия платы с абонента, или со стандартной стоимостью

    @egorinsk
    Есть номера со стоимостью около 3 российских рублей, все уходит аггрегатору, вы ничего не получаете, в принципе это примерно соответствует цене отправки СМС. Если вы хотите точно такую же цену, как и обычная отправка СМС, то надо наверно напрямую договариваться с крупным аггрегатором каким-нибудь, и они пойдут на это только при больших объемах сообщений.
    Ответ написан
    Комментировать
  • REST API и язь много-ко-многим

    @egorinsk
    Мне кажется, надо не усложнять API и возвращать категории товара (их id и название например) вместе с товаром, по ссылке /products/id. А если есть реальная потребность получать какие-то свойства товара отдельно (только цена и описание например), добавьте параметр ?fields=field1,field2

    Проектировать API стоит не из каких-то абстрактных соображений, а из планируемых сценариев использования, и из соображений простоты.
    Ответ написан
    Комментировать
  • Выбор города на сайте?

    @egorinsk
    Вы делаете неправильно. Во-первых, идеология Web подразумевает, что у разного контента разные адреса, а показывать людям по одному УРЛ разные вещи в зависимости от города — неверно. У каждой страницу должен быть свой, уникальный, адрес.

    Теперь представьте себе пользователя. Он зашел в Qooqle, набрал «купить мопед москва» и видит: «Продам мопед, недорого, Москва», кликает по ссылке — а вы ему вместо мопеда показываете объявления из его города Замкадовска (где максимум можно купить подержанный велосипед). Это неправильно. Мы же делаем сайт для людей, а не для СЕО, верно?

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

    Надо сделать отдельные папки или домены для разных городов: saint-peterburg.objava.ru/list например. Или objava.ru/saint-peterburg/list. Если юзер из одного города зашел на домен другого города — можно показать ему в шапке предложение перейти на домен его города, но не навязывать и не заставлять переходить. Может, я еду в какой-то город и хочу посмотреть объявления оттуда.

    Что же касается главного домена — objava.ru — то можно показать на нем карту России или список городов (нормальными ссылками, без яваскрипта и прочей дряни), и например, ярко выделить в нем город пользователя и предложить перейти. Например, как это сделано на главной сайта avito.ru. Человек перейдет в свой город, а робот обойдет все.

    А вот за показ разного контента для разных IP по одному УРЛ и за редирект, не спрашивая желания пользователя, я считаю, сайты надо банить (что иногда и происходит). Нам не нужен колхозный интернет. Давайте все делать в соответствии со стандартами, руководствами по юзабилити и лучшими практиками, а не пытаться обхитрить поисковые системы и пользователей.
    Ответ написан
    6 комментариев
  • Возможно ли наказать мошенников рассылающих java вирусы?

    @egorinsk
    В теории у нас в стране есть статьи про мошенничество (попытка путем обмана вывести деньги с мобильного счета абонента) и создание и распространение вредоносных программ. То есть с точки зрения УК, по авторам вирусов (кто это писал), распространителям и партнеркам (=соучастники, через которых проходят СМС и деньги) тюрьма плачет.

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

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

    @egorinsk
    Во-первых, вы путаете в тексте понятия «ошибка PHP» и «исключение». В частности, исключение нельзя проигнорировать и продолжить выполнение программы.

    Идея заворачивать все в блоки try/catch — тоже маразм, исключения были прижуманы как раз для ухода от необходимости проверять результат работы всех функций.

    Вот, как надо делать правильно:

    1) Делаем set_error_handler, который превращает все ошибки/варнинги/нотисы/стрикт стандартс в исключения
    2) Ставим error_reporting(-1)
    3) Делаем set_exception_handler(), который логгирует исключение (неважных исключений не бывает) и выводит красивую страничку 503 (не на продакшене тут же выводятся детали ошибки).
    4) Получаем через некоторое время приложение без ошибок

    Приложение не должно игнорировать ошибки и исключения, так как в этом случае оно может выдать пользователю неверные данные. лучше выдать страницу ошибки, чем неверные данные.
    Ответ написан
    4 комментария
  • Обновление Select'а?

    @egorinsk
    У HTMLSelectElement (http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-94282980 ) есть методы add()/remove() для очистки списка опций и добавления опций, а appendChild, если мне не изменяет память? криво работает в разных браузерах.

    Еще вариант — тупо заменять селект на новый селект через замену innerHTML на обертке — скорее всего будет работать быстрее.
    Ответ написан
    Комментировать