• Стоит ли указывать Vagrant и Chef в резюме?

    copist
    @copist
    Empower people to give
    1. вагрант и шеф - это серьёзные штука для тех, кто умеет линукс и виртуалки
    денвер и опенсервер - это поделки для тех, кто наоборот :)

    2. денвер и оперсервер - это для себя и только
    вагрант и шеф - это масштабируемые автоматизируемые решения, причём сначала у себя, а потом поработить весь мир ;)
    Ответ написан
    1 комментарий
  • С чего стоит начать веб-программисту?

    copist
    @copist
    Empower people to give
    copist.ru/blog/2014/03/14/need-knowledge-mind-map карта знаний для веб-разработчика - там есть и программирование и не программирование
    Ответ написан
    Комментировать
  • Как вы (программисты) учились в ВУЗах?

    copist
    @copist
    Empower people to give
    Учился три раза: до академ отпуска как попало, после академ отпуска - на отлично, после ВУЗА - правильно.

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

    Своим умишком предположил, что нужна корочка и я, после восстановления из академотпуска, стал делать всё на отлично - оказывается, что это не так уж и сложно. "Легенда факультета - двоечник-отличник". Меня пригласили работать при кафедре веб-программистом - ВУЗу нужно было своё представительство в Интернет, и каждому факультету и каждой кафедре - своё. Я предположил, что дизайн для журналов и веб-дизайн в чём-то схожи. Попутно выучил языки программирования для веб.

    Окончил ВУЗ, получил корочки, но кайфа от этого факта или бешенной зарплаты не получил :(

    Только после я понял, что ВУЗ учил меня не тому, что мне нужно. А я не знал, как правильно учиться самостоятельно.

    1. Способ приобретения знаний был неправильный. Знания нужны не затем, чтобы знать, а затем, чтобы действовать.
    Подход к изучению раньше: "О, клёво! Думаю, в будущем может пригодиться". Иногда такой: "Ой как сложно... страшно даже пробовать - вдруг ничего не получится".
    А сейчас такой: "О клёво! Это решает задачи совсем другим способом. Какие именно? Да хотя бы вот эту...". Или так: "Эта штука решает такие классы задач. Возьму сферического коня в вакууме и попробую решить, ну хотя бы начну".
    Иллюстрация: copist.ru/?attachment_id=430
    На моё текущее положение повлияли не корочки, а работа веб-мастером при кафедре за копейки.

    2. У меня не было цели. У меня была какая-то условная идея: если хорошо закончу обучение, то буду жить хорошо. Идея не сработала. "Нас невозможно сбить с пути, нам пофигу куда идти". Нужна явно выраженная цель, чтобы знать, куда направить силы. В реальной жизни пригодились алгоритмы решения типовых вычислительных задач, вычислительные методы, статистика, анализ данных и знание нескольких языков программирования, а не физика с химией, и уж тем более не естествознание и правила оформления курсовых работ. Когда я сформулировал цель, я определил способы её достичь. Если по ВУЗовски, то "я определил вектор силы" :)

    Если бы я сейчас пошёл в ВУЗ преподавателем и начал рассказывать, что знаю, меня бы уволили :)
    Может пойти в школу и не дать выпускникам запудрить себе мозги?
    (анекдот) Я спросил одного кадровика, почему все непременно требуют высшего образования. Он ответил: - Чтобы была гарантия, что человек в состоянии пяти лет бесплатно заниматься неинтересной ему фигнёй.
    Ответ написан
    1 комментарий
  • Текстовый файл содержащий свой хеш - возможно ли такое?

    copist
    @copist
    Empower people to give
    Первое: если ты увидел алгоритм - попробуй и убедись.

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

    Третье: файл может содержать хэш не самого себя, а какой нибудь части своей файла.
    Например, первые N байт могли бы быть хэшем всего файла за исключением этих N байт.
    В какой-то мере контрольные суммы файлов в ZIP являются хэшами от файлов, а хранится-то всё это в одном зипе.
    Всё это может пригодиться если нужно проверить целостность документа (идентичное значение повторно вычисленного хэша по тому же файлу означает отсутствие потерь при передаче) или удостовериться в подлинности источника данных (хэш вычислен известным отправителем).
    Ответ написан
  • Полезен ли свой блог веб-разработчику?

    copist
    @copist
    Empower people to give
    blog = binary log - это просто журнал, дневник в электронном виде. Веди его как тебе удобно.

    А вот нужно ли?

    Изучение веб-технологий в общем и языков программирования в частности похоже на изучение обычного иностранного языка: нужны вокабуляры (ключевые слова и их значения), синтаксис, морфология, идиомы (устойчивые выражения в языке), фразеологизмы (типовые решения) и много чего ещё.

    Нужны ссылки на материалы, которые надо прочитать. Да, не запишешь в "склерозник" - не прочтёшь. Да, есть закладки в браузерах, но к закладкам нельзя написать свою личную аннотацию или вставить свою личную иллюстрацию.

    Нужно место для публикации выводов по прочитанному. После ознакомления с новым материалом нужно отжать воду и лирику, составить краткие выводы. Без выводов изучение значительно менее эффективное. Вот пример: в книге Том ДеМарко “Deadline. Роман об управлении проектами” на стр 43 автор сам делает выводы - что авторы делают очень редко, а на хабре я нашёл и личные выводы - очень кратко и по существу. Ещё стало популярно делать mindmap по прочитанному, вот опять же по Deadline.

    Нужно место для публикации велосипедов, которые изобретаешь. Даже если есть gist для страничек или github для проектов, нужно где-то держать реестр этих страниц и проектов. Строка "очень знаю яву" в резюме не эквивалентна записи в блоге, где опубликована ссылка на твое решение интересной проблемы, даже если ты на самом деле его "скомуниздил". По крайней мере нашёл откуда "поделиться".

    Конечно, можно засрать свой профиль в соц сети своими публикациями, но френды могут не обрадоваться, особенно те, что далеки от информационных технологий :(

    Техники самообучения прогр...
    Ответ написан
    Комментировать
  • Существуют ли продвинутые php-курсы на русском языке?

    copist
    @copist
    Empower people to give
    1. Определи область интересов в программировании
    2. Поставь задачу или две в этой области
    3. Решай задачи
    4. Ищи решение лучше: на фреймворках, на шаблонах, на других языках
    5. Удали решение к чёрту, чтобы не мешало
    6. Повтори с пункта 3

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

    http://copist.ru/.../need-knowledge-self-study-tec...
    Ответ написан
    Комментировать
  • Почему неправильно срабатывает запись в БД MySQL PHP?

    copist
    @copist
    Empower people to give
    Не по теме, но

    mysql_query("UPDATE `rating_db`.`girls` SET `ROUNDS` = '$winRounds ' + 1, `RATING` = '$winNewRate' WHERE `girls`.`ID` = '$plus';");

    небезопасно

    используйте PDO и биндинги параметров
    Ответ написан
    2 комментария
  • RegExp доллар в скобках - корректно ли выражение?

    copist
    @copist
    Empower people to give
    Посмотри сервис https://www.debuggex.com/ там разбор регулярки показан наглядно

    take.ms/i1hL6

    С моей точки зрения бакс лишний или стоит не там
    Обычно после адреса идёт либо кавычка, либо двойная кавычка, либо пробельный символ, либо конец строки

    ~http[s]*://[^\s]+\.(jp[e]*g|png|gif)[\s\"\'$]~i
    Вот так выглядит разбор take.ms/73PMy
    Ответ написан
  • Может ли в highload проекте c архитектурой frontend + REST backend использоваться PHP на обеих сторонах?

    copist
    @copist Автор вопроса
    Empower people to give
    Для всех, кто подписан на вопрос - текущее решение: многослойное приложение https://icons8.com/

    Всё сложно.

    1. бакенд https://api.icons8.com/ на PHP Yii MySQL Memcached RabbitMQ Sphinx CouchBase. Занимается хранением и организацией информации об иконках и их файлах. Работает по HTTP RPC-style API - принимает и выдаёт данные в форматах JSON/XML
    2. фронтенд https://icons8.com/ на PHP Yii Memcached Gulp - занимается хранением JS, CSS, реализует авторизацию, личный кабинет и некоторые другие страницы, сборкой JS/CSS, выдаёт изображения для оформления страниц. Для личного кабинет работает с https://api.icons8.com/ через HTTP.
    3. фронтенд (Reach Client Application) https://icons8.com/web-app/ https://icons8.com/responsive-icons/ и другие страницы, на которых что-то "шевелится" :) на AngularJS SCSS Jade
    4. Приложения на ObjectveC для MacOC и С# для Windows https://icons8.com/app - реализуют то же, что https://icons8.com/web-app/ помощью CouchBase и https://api.icons8.com/
    5. внутренние приложения по обработке файлов иконок PHP Yii RabbitMQ и много утилит для работы с графическими и векторными файлами - обрабатывает файлы SVG, конвертирует в другие форматы - работает с https://api.icons8.com/ через HTTP и очереди RabbitMQ
    6. блог на PHP Wordpress icons8.com/blog который прозрачно стыкуется с icons8.com (описание habrahabr.ru/company/dataart/blog/236635/#comment_...
    7. генератор страниц в формате HTML из страниц на JS на NodeJS PhantomJS с помощью https://github.com/icons8/impresser - это для успешной индексации поисковыми роботами

    Любую часть системы можно размножить, но пока всё крутится на двух машинах: VDS для пунктов 1...6 и dedicated для пункта 7. Был ещё выделенный сервер Mac под пункт 5 чтобы выдавать иконки в формате PSD AI, но сломался слегка.

    Планируется, что фронт на JS станет также работать с https://api.icons8.com/ через WebSocket
    Ответ написан
    Комментировать
  • Дадите пару советов по организации online трансляции?

    copist
    @copist
    Empower people to give
    Сегодня было на хабре Делаем свой персональный Skype, пошаговая инструкция создания WebRTC приложения
    Ну и другие решения на базе RTC
    Ответ написан
    Комментировать
  • Генерация JSON с вложенными объектами

    copist
    @copist
    Empower people to give
    А вот так бы выглядело в ORM Propel (PHP)

    <?php
    $propelQuery = PostsQuery::create()
    	->joinWith('users') // join c включением джойненой таблицы в SELECT ...
    ;
    $propelCollection = $propelQuery->find();
    
    $result = array(); $index = 0;
    foreach($propelCollection as $post) {
    	$result[$index] = $post->toArray();
    	$result[$index]['user'] = $post->getUserss()->toArray();
    	$index++;
    }
    
    var_export($result);
    
    Ответ написан
    Комментировать
  • Генерация JSON с вложенными объектами

    copist
    @copist
    Empower people to give
    В дополнение к Fesor:

    Язык вы не указали, поэтому велосипед на PHP

    // описание таблиц
    $tableMap = array();
    
    // $postsFields и $usersFields - это описание таблиц - в каком точно порядке
    //   поля
    $tableMap['posts'] = array( // описание таблицы `posts`
    	'fields' => array('postid', 'title', 'post', 'date', 'userid'), // перечисление колонок
    	'primary' => 'postid', // primary ключ, для упрощения - несоставной
    	'relations' => array( // внешние ключи
    		'fk_userid' => array('userid', 'users', 'userid'), // ключ на таблицу `users` по полю `userid`
    	),
    );
    
    $tableMap['users'] = array( // описание таблицы `users`
    	'fields' => array('userid', 'username', 'usermail'), // перечисление колонок
    	'primary' => 'userid', // primary ключ, для упрощения - несоставной
    	'relations' => array( // внешние ключи
    	),
    );
    
    // $posts и $users - это два хранилища сущностей
    $posts = array();
    $users = array();
    
    // $resultSet = это имитация результата выборки по запросу
    // select
    //   p.postid, p.title, p.post, p.date, p.userid,
    //   u.userid, u.username, u.usermail
    // from posts p
    // join users u on p.userid = u.userid
    // -- все колонки в этом запросе обязаны следовать в том же порядке, что и в описании таблиц $postsFields и $usersFields
    
    $resulSet = array(
    	array(1,'post1_title','post1_content', '2013-10-16', 1, 1, 'login1', 'login1@domain'),
    	array(2,'post2_title','post2_content', '2013-10-16', 1, 1, 'login1', 'login1@domain'),
    	array(3,'post3_title','post3_content', '2013-10-16', 2, 2, 'login2', 'login2@domain'),
    	array(4,'post4_title','post4_content', '2013-10-16', 3, 3, 'login3', 'login3@domain'),
    	array(5,'post5_title','post5_content', '2013-10-16', 3, 3, 'login3', 'login3@domain'),
    	array(6,'post6_title','post6_content', '2013-10-16', 4, 4, 'login4', 'login4@domain'),
    );
    
    // теперь - перебор результатов выборки, составление сущностей с учётом повторения
    foreach($resulSet as $row) {
    	reset($row);
    
    	// выбор из строки результата всех значений, относящихся к `posts`
    	$post = array();
    	foreach($tableMap['posts']['fields'] as $key) {
    		$post[$key] = current($row);
    		next($row);
    	}
    	// сохранение сущности в хранилище, если ещё не было сохранено
    	$pk = $post[$tableMap['posts']['primary']];
    	if (!isset($posts[$pk])) {
    		$posts[$pk] = $post;
    	}
    
    	// выбор из строки результата всех значений, относящихся к `users`
    	$user = array();
    	foreach($tableMap['users']['fields'] as $key) {
    		$user[$key] = current($row);
    		next($row);
    	}
    	// сохранение сущности в хранилище, если ещё не было сохранено
    	$pk = $user[$tableMap['users']['primary']];
    	if (!isset($users[$pk])) {
    		$users[$pk] = $user;
    	}
    }
    
    // последнее - составление массива с нужной структурой
    $collection = array();
    $index = 0;
    foreach($posts as $post) {
    	$collection[$index] = $post;
    
    	// здесь надо воспользоваться $tableMap['posts']['relations']['fk_userid'], но мне лень
    	$fkUser = $post['userid'];
    	//echo '$fkUser=',$fkUser,PHP_EOL;
    	$collection[$index]['user'] = $users[$fkUser];
    
    	$index++;
    }
    
    var_export($collection);
    
    Ответ написан
    Комментировать
  • Логирование действий пользователя. Есть готовое решение?

    copist
    @copist
    Empower people to give
    Поищи на поисковиках «mouse tracking tools» — есть онлайн и оффлайн решения


    Вот одна из первых ссылок выдала «полу-серьёзную» статью на английском: htp://www.usefulusability.com/24-usability-testing-tools/

    Ещё вот тут в коментах несколько ссылок habrahabr.ru/post/102689
    Ответ написан
    Комментировать
  • Как правильно написать счётчик посещений работающий на стороннем сайте?

    copist
    @copist
    Empower people to give
    1. Ифреймы использовать совершенно не обязательно, они по большому счёту нужны только при отключенном javascript. Можно написать такой код, что при отключенном JS будет iframe а при включенном — генерация через JS. Могу показать как.

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

    3. Да какая разница как ссылка выглядит. Юзер на картинку тыкает, ему графическое содержание понравилось, а не ссылка.

    Яндекс директ использует мегассылки вида htp://yandex/qEMYmHbj0u40000ZhEWQYK5KfK1cm9kGxS198YpH9dW0echwWm2c1gTeNq-3wOjYgVjb9gg0QMgrs82ZG6HkamEg0YJGPa5GeoGaYAsa5yAjP3A2A2LQIQla98Yiv342RIGoWYKctGWfvOn7QYZeOCFfC00002H0Qxu6Zvfh-DYw0In0R84kQ5zFW-xvRwxDVIWzXDv4G00 (ссылка намеренно битая — содержит какой-то код, сервер его идентифицирует с рекламируемым сайтом)

    У гугля ещё длинее: htp://google/aclk?sa=L&ai=mdsgdqpWUpL_GOHvwQOHyYCwBJy5l-MDnPS642D-otjqCQgAEAFQotfL2P7_____AWCEje2F7B3IAQGpAlkUaNTdn2A-qgQjT9AbkFvZ_XabH5e-rqXVV6spN4fHO_3LZ1m_avwqG-bK8ZGAB5yo7iCQBwI&sig=AOD64_3Zwt8-zurwnz52xCBJyhofu6octA&rct=j&q=%D0%BF%D0%B0%D0%BB%D0%B0%D1%82%D0%BA%D0%B8+%D0%BD%D0%BE%D1%80%D0%BC%D0%B0%D0%BB&ved=0CCwQ0Qw&adurl=ТУТ_РЕАЛЬНЫЙ_URL_САЙТА (ссылка битая — содержит какой-то код ссылки, по которому идентифицирует рекламируемый сайт и, неизвестно зачем, текст поискового запроса и URL сайта)

    4. Защита от накруток — это самая сложная тема. Могу только предположить как, но 100% защиты не обеспечит
    Иногда реализуют не подсчёт кликов, а подсчёт завершённых сделок (регистрация пользователя, или первая продажа товара пользователем, или первое добавление контента пользователем, или подписка на рассылку). В этом случае сайт, куда ведёт ссылка, сообщает рекламной службе о факте по какому-нибудь API. Вот этом могу рассказать.
    Ответ написан
    1 комментарий
  • Как узнать текст выражения, на котором eval() закончился с фатальной ошибкой?

    copist
    @copist Автор вопроса
    Empower people to give
    Вот умные товарищи подсказали следующее:

    $evalResult = @eval('$result = (bool)(1<2);');
    
    $evalResult = null если выражение выполнилось
    $evalResult = false если не выполнилось
    


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

    У меня php 5.3.15, на проме 5.3.23
    Ответ написан
  • Знакомство школьников с git и github… Стоит ли? И с чего начать?

    copist
    @copist
    Empower people to give
    Нет, дайте им общую информацию о принципах версионности, задачах, которые решают средства контроля версий.
    Ответ написан
    2 комментария
  • При переходе с любой ссылки поисковика — просмотр с главной страницы. Возможно ли?

    copist
    @copist
    Empower people to give
    1. Таблица трансляции старых адресов в новые и редирект с кодом 301

    Если в таблице трансляции не нашлось правил, то
    2. Редирект на внутренний поиск с кодом 302
    по умолчанию в строку поиска подставить предположительный вариант искомого…
    2.1. если пришёл с поисковика, то строку для поиска можно взять из заголовков (реферер) — посмотрите как гугль аналитикс это выковыривает
    2.2. если искомая ссылка в формате ЧПУ ( /stranitca_o_chem_nibud ) — то обратное преобразование из транслита
    можно ещё разбить URL по слэшу ( / ) и полученную строку дать скушать google или яндексу через API — они могут выдать варианты той же строки для альтернативных попыток поиска
    есть и другие варианты

    Если не получилось найти, то
    3. Со страницы поиска дать возможность уйти на карту сайта
    Ответ написан
    Комментировать
  • Создание теговой системы

    copist
    @copist
    Empower people to give
    CREATE TABLE POST (
      ID DECIMAL(20,0), -- AUTOINCREMENT
      CONTENT VARCHAR2(1024)
    );
    
    CREATE TABLE TAG (
      ID DECIMAL(20,0), -- AUTOINCREMENT
      TAG VARCHAR2(100)
    );
    
    CREATE TABLE POST_TAG (
      POST_ID DECIMAL(20,0),
      TAG_ID DECIMAL(20,0)
    );
    -- FOREIGN KEY FK_POST_TAG_POST ON POST(ID);
    -- FOREIGN KEY FK_POST_TAG_TAG ON TAG(ID);
    
    CREATE UNIQUE INDEX UQ_POST ON POST(ID);
    CREATE UNIQUE INDEX UQ_TAG ON TAG(ID);
    CREATE INDEX IDX_POST_TAG ON POST_TAG(POST_ID, TAG_ID);
    CREATE INDEX IDX_POST_TAG_R ON POST_TAG(TAG_ID, POST_ID);
    
    INSERT INTO TAG(ID, TAG) VALUES(1, 'foo');
    INSERT INTO TAG(ID, TAG) VALUES(2, 'boo');
    INSERT INTO TAG(ID, TAG) VALUES(3, 'goo');
    INSERT INTO TAG(ID, TAG) VALUES(4, 'doo');
    INSERT INTO TAG(ID, TAG) VALUES(5, 'too');
    
    INSERT INTO POST(ID, CONTENT) VALUES(1, '...');
    INSERT INTO POST_TAG(POST_ID, TAG_ID) VALUES(1, 1 /* foo */);
    INSERT INTO POST_TAG(POST_ID, TAG_ID) VALUES(1, 2 /* boo */);
    INSERT INTO POST_TAG(POST_ID, TAG_ID) VALUES(1, 3 /* goo */);
    INSERT INTO POST_TAG(POST_ID, TAG_ID) VALUES(1, 4 /* doo */);
    INSERT INTO POST_TAG(POST_ID, TAG_ID) VALUES(1, 5 /* too */);
    
    INSERT INTO POST(ID, CONTENT) VALUES(2, '...');
    INSERT INTO POST_TAG(POST_ID, TAG_ID) VALUES(2, 2 /* boo */);
    INSERT INTO POST_TAG(POST_ID, TAG_ID) VALUES(2, 3 /* goo */);
    INSERT INTO POST_TAG(POST_ID, TAG_ID) VALUES(2, 5 /* too */);
    
    INSERT INTO POST(ID, CONTENT) VALUES(3, '...');
    INSERT INTO POST_TAG(POST_ID, TAG_ID) VALUES(3, 1 /* foo */);
    INSERT INTO POST_TAG(POST_ID, TAG_ID) VALUES(3, 5 /* too */);
    
    INSERT INTO POST(ID, CONTENT) VALUES(4, '...');
    INSERT INTO POST_TAG(POST_ID, TAG_ID) VALUES(4, 4 /* doo */);
    INSERT INTO POST_TAG(POST_ID, TAG_ID) VALUES(4, 5 /* too */);
    
    INSERT INTO POST(ID, CONTENT) VALUES(5, '...');
    INSERT INTO POST_TAG(POST_ID, TAG_ID) VALUES(5, 5 /* too */);
    
    
    SELECT POST.ID, TAG.TAG
    FROM POST, TAG, POST_TAG
    WHERE POST.ID = POST_TAG.POST_ID AND TAG.ID = POST_TAG.TAG_ID
    ORDER BY POST.ID, TAG.ID;
    
    
    SELECT DISTINCT ID, POST_TAG_COUNT, POST_TAGS_MATCHED_COUNT, POST_TAG_COUNT - POST_TAGS_MATCHED_COUNT POST_TAGS_EXTRA
    FROM (
      SELECT
        POST.ID,
    
        ( -- количество тегов всего
          SELECT COUNT(POST_TAG.TAG_ID) CNT
          FROM POST_TAG
          WHERE POST_TAG.POST_ID = POST.ID
        ) POST_TAG_COUNT,
    
        ( -- количество найденных по точному совпадению
          SELECT COUNT(POST_TAG.TAG_ID) CNT
          FROM POST_TAG
          JOIN TAG ON POST_TAG.TAG_ID = TAG.ID
          WHERE TAG.TAG IN ('boo', 'too') AND POST_TAG.POST_ID = POST.ID
        ) POST_TAGS_MATCHED_COUNT
      FROM POST
      JOIN POST_TAG ON POST_TAG.POST_ID = POST.ID
      JOIN TAG ON TAG.ID = POST_TAG.TAG_ID
      WHERE TAG.TAG IN ('boo', 'too')
    )
    WHERE POST_TAGS_MATCHED_COUNT > 0
    ORDER BY POST_TAGS_MATCHED_COUNT DESC, POST_TAG_COUNT - POST_TAGS_MATCHED_COUNT ASC;



    Смысл запроса на выборку:

    Найти общее количество тегов у постов и количество совпавших тегов, вывести в порядке убывания количества совпадений, затем в порядке возрастания «лишних тегов».


    Если нужен вывод именно в таком порядке, то практически полный перебор

    Базы в 100 гигов текста тоже под рукой пока нет. Не замерял. Вес (оценка сложности исполнения) запроса с индексами небольшой, вполне возможно — миллисекунды.

    Это только поиск ID постов.


    И надо на всякий случай лимит на запрос поставить.
    Ответ написан
    5 комментариев
  • Сравнение строк

    copist
    @copist
    Empower people to give
    * Нечёткий поиск на клиенте и Soundex habrahabr.ru/post/125617/
    * Фонетический поиск habrahabr.ru/post/28752/ и его модификация: Soundex по-русски p2k.ru/archives/57
    * и ещё один htmlweb.ru/php/example/soundex.php (см середину статьи)
    Ответ написан
    1 комментарий
  • Где заказать проверку сайта на уязвимости?

    copist
    @copist
    Empower people to give
    Если не найдёте исполнителя и будет свободное время — подборка ссылок с хабра на тему проверки уязвимости:
    * Плагины firefox для аудита безопасности сайтов habrahabr.ru/post/157311/
    * Егор Хомяков продолжает взломы habrahabr.ru/post/141277/ (в частности, ссылка на примеры homakov.blogspot.com/2012/03/hacking-skrillformer-moneybookers.html )
    * CSRF уязвимости на примере ХабраХабра habrahabr.ru/post/134150/
    * Множественные CSRF уязвимости в крупнейших порталах Рунета habrahabr.ru/post/126409/

    Мне по работе очень помогла
    Ответ написан
    1 комментарий