tag:blogger.com,1999:blog-20603043706947556602024-02-08T02:01:04.694+03:00Как я создавал свой первый сайтNobyhttp://www.blogger.com/profile/10936346631597571315noreply@blogger.comBlogger21125tag:blogger.com,1999:blog-2060304370694755660.post-57305830163888632122013-01-04T19:51:00.002+04:002013-01-04T19:53:43.178+04:00Краткие итоги 2012За 2012 год удалось побывать во многих странах и городах Европы, в некоторых был даже не один раз.
Вот список всех маршрутов:
<ol><li>Февраль в Бельгию (летал Люфтганзой <a href="http://www.skybooker.ru/fmow_aviabilety_iz_moscow/">Москва</a> - <a href="http://www.skybooker.ru/tfra_aviabilety_v_frankfurt/">Франкфурт</a> - <a href="http://www.skybooker.ru/tbru_aviabilety_v_brussels/">Брюссель</a> и по этому же маршруту обратно).
<li>Март в Мадрид (летам Алиталия <a href="http://www.skybooker.ru/fmow_aviabilety_iz_moscow/">Москва</a> - <a href="http://www.skybooker.ru/trom_aviabilety_v_roma/">Рим</a> - <a href="http://www.skybooker.ru/tmad_aviabilety_v_madrid/">Мадрид</a>).
<li>Апрель - в <a href="http://www.skybooker.ru/tham_aviabilety_v_hamburg/">Гамбург</a> (Люфганзой без пересадок).
<li>Май - в <a href="http://www.skybooker.ru/ttiv_aviabilety_v_tivat/">Тиват</a> (Монтенегро Эйрлайнз без пересадок).
<li>Июнь - в Прагу и Вену на 8 часов (<a href="http://www.skybooker.ru/fmow_aviabilety_iz_moscow/">Москва</a> - <a href="http://www.skybooker.ru/tfra_aviabilety_v_frankfurt/">Франкфурт</a> - <a href="http://www.skybooker.ru/tprg_aviabilety_v_prague/">Прага</a> туда и <a href="http://www.skybooker.ru/fprg_aviabilety_iz_prague/">Прага</a> - <a href="http://www.skybooker.ru/tvie_aviabilety_v_vienna/">Вена</a> - <a href="http://www.skybooker.ru/tmow_aviabilety_v_moscow/">Москва</a> обратно).
<li>Июль опять в <a href="http://www.skybooker.ru/ttiv_aviabilety_v_tivat/">Тиват</a> (Монтенегро Эйрлайнз без пересадок).
<li>Сентябрь в Португалию и Брюссель на сутки (Брюсель Эйрлайнз туда <a href="http://www.skybooker.ru/fmow_aviabilety_iz_moscow/">Москва</a> - <a href="http://www.skybooker.ru/tbru_aviabilety_v_brussels/">Брюссель</a> - <a href="http://www.skybooker.ru/tfao_aviabilety_v_faro/">Фаро</a>, обратно <a href="http://www.skybooker.ru/topo_aviabilety_v_porto/">Порто</a> - <a href="http://www.skybooker.ru/fbru_aviabilety_iz_brussels/">Брюссель</a> - <a href="http://www.skybooker.ru/tmow_aviabilety_v_moscow/">Москва</a>).
<li>Октябрь во Францию с небольшой остановкой в Таллине (туда Эстониан Эйрлайнз <a href="http://www.skybooker.ru/fmow_aviabilety_iz_moscow/">Москва</a> - <a href="http://www.skybooker.ru/ttll_aviabilety_v_tallinn/">Таллин</a> - <a href="http://www.skybooker.ru/tpar_aviabilety_v_paris/">Париж</a> <a href="http://www.skybooker.ru/tcdg_aviabilety_v_charles_de_gaulle/">Шарль де Голь</a>, обратно Эйр Берлин <a href="http://www.skybooker.ru/fpar_aviabilety_iz_paris/">Париж</a> <a href="http://www.skybooker.ru/fory_aviabilety_iz_orly/">Орли</a> - <a href="http://www.skybooker.ru/tber_aviabilety_v_berlin/">Берлин</a> - <a href="http://www.skybooker.ru/tmow_aviabilety_v_moscow/">Москва</a>).
<li>Декабрь в <a href="http://www.skybooker.ru/trix_aviabilety_v_riga/">Ригу</a> (Трансаэро без пересадок).</ol>
Как-то не слабо, то ли еще будет в следующем году.Nobyhttp://www.blogger.com/profile/10936346631597571315noreply@blogger.com0tag:blogger.com,1999:blog-2060304370694755660.post-20797194837530083932012-12-01T12:54:00.002+04:002012-12-01T12:54:33.154+04:00Авиасейлз объявил конкурс на разработку туристического сайта за три месяца. Сделать и раскрутить за 3 месяца что-то нормальное, по-моему, не реально. Приходится каждый день по несколько часов что-то программировать. Правда, авиасейлз всячески содействуют конкурсантам, дорабатывают API по запросам, предоставляют различную информацию информацию, типа кодов аэропортов или список авиакомпаний.
Новый сайт с авиабилетами пока не готов, правда, за последнее время сделал <a href="http://www.hotel-phuket.ru/">отели Пхукета</a>, <a href="http://www.rome-hotel.ru">отели Рима</a> и <a href="http://www.hotel-finland.ru">отели Финляндии</a>. Пользуйтесь, цены на отели правда очень хорошие. Яндекс, правда, почему-то не хочет индексировать <a href="http://www.hotel-phuket.ru/">отели Пхукета</a>. По этому домену когда-то был совсем другой сайт, но с нормальным содержимым. Подождем, или придется все переносить на другой домен.
Nobyhttp://www.blogger.com/profile/10936346631597571315noreply@blogger.com0tag:blogger.com,1999:blog-2060304370694755660.post-42079813106438705242012-10-03T22:40:00.002+04:002012-10-03T22:40:21.427+04:00Работа кипитКак-то давно я не писал, все работаю и путешествую. Успел пару раз побывать в Черногории, в Праге и Вене, а так же объехал всю Португалию, прилетев в Фаро и улетем из Порту, по пути заехал на сутки в Брюссель.
Так же за это время было сделано несколько новых сайтов, надеюсь, они помогут путешественникам найти <a href="http://www.hotel-madrid.ru/">отели Мадрида</a>, подобрать <a href="http://www.barcelona-hotel.ru/oteli-na_more/">отель в Барселоне у моря</a> или <a href="http://www.hotel-new-york.ru/">найти отель в Нью-Йорке</a>.
Nobyhttp://www.blogger.com/profile/10936346631597571315noreply@blogger.com0tag:blogger.com,1999:blog-2060304370694755660.post-66549329121123837602012-03-13T23:36:00.002+04:002012-03-13T23:40:37.266+04:00Отели ВеныПробыв неделю с 18 по 26 февраля в Бельгии и посетив Брюссель, Гент, Брюгге, Зиибрюгге, Антверпен, Льеж, Лёвен и Дамме я на мартовские праздники слетал позагорать в Мадрид, заодно посетив Сеговию.<br />Но пост сделан по другому поводу. Мы сделали новый сайт - <a href="http://www.hotel-wien.ru/">Отели Вены</a>. Так что, если соберетесь в этот красивый славный город на Дунае, заходите к нам, чтобы выбрать отель и приобрести авиабилеты по лучшим ценам.Nobyhttp://www.blogger.com/profile/10936346631597571315noreply@blogger.com0tag:blogger.com,1999:blog-2060304370694755660.post-61802760158861162302011-12-07T23:26:00.002+04:002011-12-07T23:36:30.985+04:00Сайтов уже 5Давно не писал ничего, много работал. За прошедший год сделал 2 новых сайта: <a href="http://www.sepoda.ru">Сервис поиска дешевых авиабилетов</a> и <a href="http://www.hotel-praga.ru">Отели Праги</a>.<br />Как не трудно догадаться, на первом удобно искать <a href="http://www.sepoda.ru">дешевые авиабилеты</a>, а на втором выбирать и бронировать <a href="http://www.hotel-praga.ru">отели в Праге</a>. <br />Что примечательно, что оба сайта делал в партнерстве с другими людьми, получилось, по-моему, не плохо. <br />Из того что не получилось сделать в этом году - это сайт по сравнению цен на хостелы по аналогии с hotelscombined, только hotelscombined сравнивает отели. К сожалению, не смог найти еще одного партнера, который бы предоставил XML-поиск по предлагаемым этим партнерам хостелам.<br />В планах на следующий год сделать еще несколько узкоспециализированных сайтов по поиску отелей в различных городах Европы и США.<br />Желаю всем хорошо встретить Новый год и конечно же удачи и счастья в новом году. Жизнь продолжается не смотря ни на что.Nobyhttp://www.blogger.com/profile/10936346631597571315noreply@blogger.com0tag:blogger.com,1999:blog-2060304370694755660.post-69494146242254232492010-11-04T22:33:00.003+03:002010-11-04T22:45:45.828+03:00Как я создавал свой 3-й сайтВ начале октября совсем случайно узнал о существовании сайта по бронированию отелей hotelclub.com. Они предлагали лучшие цены на отель в одном из американский городов, если сравнивать через hotelscombined. Как оказалось, у них есть партнерская программа. Да и домен <a href="www.hotelclub.su">hotelclub.su</a> оказался свободен.<br />Я не долго думая купил домен, подобрал <a href="http://templates.arcsin.se/" rel="nofollow">шаблон сайта у Arcsin</a>, переработал его под себя.<br />Много времени ушло на то, чтобы корректно обработать информацию, предоставляемую hotelclub своим партнером, еще больше на разработку самого сайта. И сегодня я его выложил на всеобщее обозрение. <br />Теперь <a href="http://www.hotelclub.su/oteli-Parizha/">отели Парижа</a> или <a href="http://www.hotelclub.su/oteli-Rima/">отели Рима</a> бронируем на hotelclub.su.<br />Конечно же остались некритичные доработки, например, добавление на страницу <a href="http://www.hotelclub.su/Normandy-Hotel-Paris/">отеля Normady</a> возможности выбора дат в календаре, но в целом все работает.Nobyhttp://www.blogger.com/profile/10936346631597571315noreply@blogger.com0tag:blogger.com,1999:blog-2060304370694755660.post-52114476934301117782010-08-30T00:11:00.006+04:002010-08-30T13:48:56.341+04:00Вирусы<p>В конце прошлого года мой сайт впервые подвергся вирусной атаке. Какая-то гадость, которая проникла на мой компьютер, стащила пароль к ftp-доступу и дописала в конец каждого файла index*.* строку с вредным кодом, а так же заразила все файлы с расширением js. Лечится все это довольно просто, либо вручную удаляется вредноносный код, либо просто заново заливаются файлы из архива. В том году это было не критично, т.к. проект только стартовал, и посещаемость была так себе.</p><p>Повторной атаке я подвергся в пятницу, 27 августа. Открыл одну из страниц в Mozilla Firefox и комп как-то стал притормаживать, примерно через минуту антивирус Avira стал сильно пищать, какие-то скрипты остановил, но главную заразу не убил. В течение часа были заражены все файлы по описанному выше сценарию.</p><p>Последствия я заметил только в субботу. При открытии страниц сайта <a href="http://reviews.bloged.org">Firefox выдавал предупреждение о заражении</a>. Я поменял пароль доступа, перезалил файлы из архива, и успокоился. Как оказалось, зря.</p><p>Зараза осталась на моем компьютере. Ни Касперский, ни DrWeb ее не убили. И заново все файлы на сайте были заражены.</p><p> Теперь <a href="http://www.booktrip.ru/hotel/kz/astana/">это заметил и Yandex</a>, и стал выдавать угрожающие предупреждения. Поток посетителей, приходящих от Yandex'а иссяк. </p><p>Я еще раз восстановил файлы из архива. Больше атак не было. А окончательно победить заразу помогли ребята из <a href="http://virusinfo.info/showthread.php?p=698059">virusinfo.info</a>, за что им большое спасибо.</p><p>Кстати, <a href="http://reviews.bloged.org/fr/paris/">google довольно оперативно отреагировал на очистку сайта</a>, и уже снял все свои ограничения, FireFox больше не ругается. А вот Yandex все думает, и сильно предостерегает от открытия страницы типа <a href="http://www.booktrip.ru/hotel/it/rome/">забронировать гостиницу в Риме</a>. И ждать его еще несколько дней. Мало того, что среагировал с дневным, по сравнению с google, опозданием, так теперь еще и повторную проверку надо ждать. Обидно.</p><p>Теперь, при открытии подозрительный сайтов, буду всегда отключать JavaScript, а в случае заражения быстро восстанавливать файлы из архива на сайте.</p>Nobyhttp://www.blogger.com/profile/10936346631597571315noreply@blogger.com0tag:blogger.com,1999:blog-2060304370694755660.post-87109809434464143122009-12-11T15:33:00.004+03:002009-12-11T16:24:46.373+03:00Фотографии от Panoramio на своем сайтеСлучайно наткнулся на cайт компании <noindex><a rel="nofollow" href="http://www.panoramio.com">Panoramio</a></noindex>. Разработчики этого сайта создали сервис привязывания фотографий к географическим координатам. Т.е. сделал прекрасный снимок, зашел к ним на сайт и опубликовал его, не забыв привязать к географическим координатам. Так же есть <noindex><a rel="nofollow" href="http://www.panoramio.com/api/">API</a></noindex>, которое позволяет получать информацию о фотографиях, относящихся к географическим объектам, находящимися в заданном квадрате.<br />Сейчас я работаю над вторым сайтом созданным для самостоятельного бронирвоания путешествий - <a href="http://booktrip.ru">БукТрип.ру</a>. Для предоставления возможности <a href="http://booktrip.ru/hotel/">бронирования отелей</a> собрал достаточно большую базу географических названий. Но вот для взаимодействия с API от Panoramio нужны координаты этих объектов. И эти координаты можно получить, воспользовавшись сервисом Google Geocoding. Чтобы определить координаты, надо сделать запрос к сайту maps.google.com следующего вида: <pre>http://maps.google.com/maps/geo?q=Paris,fr&output=csv&key=ABQIAAAALkH7z-<br />7Yg6rN5Wgtte6WQxRhFePxzidMXG8dHw849BemzMV9YxRakAkV291BmrgJ5R_LgrNfgigIOQ</pre><br />где <em>q</em> — адрес искомого объекта, <em>output</em> — формат ответа, <em>key</em> — ключ для работы с Google Maps, который можно получить на сайте <noindex><a rel="nofollow" href="http://code.google.com/intl/ru/apis/maps/signup.html" >регистрации ключа к API Карт Google</a></noindex>. Ответом на запрос в примере будет строка <pre>200,4,48.8566667,2.3509871</pre> <em>200</em> — код ответа (200 — успешно, 403, 602 и прочие — нет), <em>4</em> — точность определения (страна, город, улица, дом и т.п.), <em>48.8566667,2.3509871</em> — искомые широта и долгота.<br />Получив координаты объекта остается определить только «диаметр» зоны, фотографии объектов в которой и будут показываться. Для получения крайних точек можно просто вычесть и прибавить к координатам центра <nobr>какие-то</nobr> константы. Но <nobr>Земля-то</nobr> круглая, и точка, находящаяся на расстоянии 10 км от заданной должна вычисляться по более сложной формуле, которую я и <noindex><a rel="nofollow" href="http://js-php.ru/web-development/distance-from-dot-to-dot/">нашёл</a></noindex>.<br />Получив от Panoramio список фотографий, путем несложных манипуляций с данными, я их вывел в виде <a href="http://booktrip.ru/hotel/fr/paris/#photo">слайд-шоу</a> (скрипт для создания слайд-шоу можно посмотреть на <noindex><a rel="nofollow" href="http://www.phatfusion.net/slideshow/">http://www.phatfusion.net/slideshow/</a></noindex>).Nobyhttp://www.blogger.com/profile/10936346631597571315noreply@blogger.com0tag:blogger.com,1999:blog-2060304370694755660.post-837676129938882832009-11-27T15:16:00.005+03:002009-11-27T19:28:23.785+03:00Аналитические функции в MySQLВсем хорош язык MySQL, но вот в некоторых случаях надо делать запросы, которые, благодаря наличию аналитических функций, в Oracle делаются весьма просто.<br />Рассмотрим на примере. Скажем, есть у нас 2 таблицы: товары с полями goods_id — идентификатор, grp — группа, name — наименование, и обобщенная таблица с продажами sales с полями goods_id — идентификатор товара, period — период, summa — суммарная стоимость проданных товаров за указанный период.<br />И вот требуется вывести по 10 самых продаваемых товаров из каждой группы за заданный период. В Oracle запрос бы выглядел вот так:<pre><br />SELECT grp, name, summa<br /> FROM (<br /> SELECT g.grp<br /> ,g.name<br /> ,s.summa<br /> ,row_number() <br /> OVER (PARTITION BY g.group <br /> ORDER BY s.summa) as rn<br /> FROM goods g<br /> ,sales s<br /> WHERE g.goods_id = s.sales_id<br /> AND s.period = 2009101<br />)<br />WHERE rn <= 10<br />ORDER BY grp, name</pre>А в MySQL вот так:<pre><br />SET @rows_count = 0;<br />SET @grp = NULL;<br />SELECT grp, name, summa <br /> FROM (<br /> SELECT g.grp<br /> ,g.name<br /> ,s.summa<br /> ,CASE WHEN IFNULL(@grp, '#') != grp THEN<br /> @rows_count := 0<br /> END q1<br /> ,CASE WHEN IFNULL(@grp, '#') != grp THEN<br /> @tp := tp<br /> END q2<br /> ,@rows_count := IFNULL(@rows_count, 0) + 1 as rn<br /> FROM goods g<br /> ,sales s<br /> WHERE g.goods_id = s.sales_id<br /> AND s.period = 2009101<br />)<br />WHERE rn <= 10<br />ORDER BY grp, name</pre>Nobyhttp://www.blogger.com/profile/10936346631597571315noreply@blogger.com2tag:blogger.com,1999:blog-2060304370694755660.post-21785680380601500972009-04-22T09:16:00.003+04:002009-04-23T10:36:03.095+04:001000 меньше чем за 3<p>Я уже <a href="http://nobyru.blogspot.com/2009/03/blog-post_17.html">писал</a> я 300 уникальных посетителях в сутки по самому консервативному счетчику <a href="http://www.liveinternet.ru/">LiveInternet</a>. Вчера уникальных посетителей было 1031.</p><p>Еще в начале апреля количество посетителей подбиралась к 1000 (6 апреля - 977, 7-го - 971), но "рубеж" был взят только вчера, хотя я надеялся, что это произойдет немного раньше. Но, почему-то, количество посетителей с 8-го апреля начало падать, сначала не очень быстро, потом падение ускорилось. Я это связываю с изменением алгоритмов выдачи Yandex'а, сайта, который "поставляет" большую часть посетителей. Самое дно было достигнуто в эту субботу 18 апреля - 502 посетителя, а в воскресенье начался стремительный рост.</p><p>Я уже получил больше 10 статей с момента опубликования формы для ввода новых отзывов, причем 5 из них от постоянного <a href="http://reviews.bloged.org/it/sicily/17761.html">автора</a>, который, точнее которая, помимо интересных текстов публикует изумительные <a href="http://reviews.bloged.org/es/mallorca/17725.html">фотографии</a>.</p><p>Так же не обошлось без неинтересных статей рекламного характера, которые я публиковать не стал. Хотя ничего не имею против рекламы, которая должна органично включаться в статью, т.е. статья должна быть именно статьей, а не рекламным объявлением. И если автор пишет, что ему понравился отель, или экскурсия, и оставляет координаты экскурсовода, то я оставляю эту информацию, т.к. она может быть полезной для моих читателей, для которых, собственно, <a href="http://reviews.bloged.org/">все</a> и создавалось.</p><p>В общем, "рубеж" в 1000 посетителей достигнут менее чем за 3 месяца. Для привлечения большей аудитории надо добавлять новые разделы, например, новости или что-то в этом роде. Может быть у кого-нибудь будут интересные предложения, которые я смогу реализовать?</p>Nobyhttp://www.blogger.com/profile/10936346631597571315noreply@blogger.com0tag:blogger.com,1999:blog-2060304370694755660.post-209852908617761862009-04-10T10:43:00.005+04:002009-04-10T15:37:05.013+04:00Ajax как способ показа информации из БД на статических html-страницахСтраницы моего <a href="http://reviews.bloged.org/">сайта</a> - статический html, который создается на основе информации, хранящейся в БД на моем компьютере. Затем специальными скриптами я делаю html-страницы и выкладываю их на сервере. При таком способе нельзя оперативно показывать комментарии, которые посетители оставляют, после ознакомления со статьями.<br /><br />Для отображения комментариев к статьям я решил воспользоваться технологией Ajax. А именно, в каждом html-документе создать div, и javascript-программой выводить в этом div'е комментарии, которые хранятся в БД на сервере, где и находится сайт.<br /><br />Сначала я ознакомился с документацией по Ajax, сделал простейший скрипт, который работал только в IE, а ведь есть еще Opera, Firefox и т.д. И у всех браузеров свои особенности. Конечно, можно покопаться в интернете, изучить варианты для всех браузеров, установить у себя каждый из браузеров для отладки и т.д. Но мне нужно всего лишь добавить возможность отображения комментариев, а не изучать особенности интерпретации javascript браузерами!<br /><br />Решение было найдено случайно, на каком-то из форумов кто-то писал про JsHttpRequest-библиотеку. Библиотека - это громко сказано, но решение, действительно стоящее.<br />Итак, что же из себя представляет <a href="http://en.dklab.ru/lib/JsHttpRequest/">JsHttpRequest</a> - это 2 файла JsHttpRequest.js и JsHttpRequest.php, соответственно первый включаем в каждый html-документ, второй - в скрипт, который на сервере обрабатывает запросы.<br /><br />Покажу на примере, как несложно пользоваться этим. Есть форма, состоящая из 2-х полей, при нажатии на Submit надо показать сумму значений в этих полях.<br /><br />В text.html:<br /><pre><html><br /><script src="JsHttpRequest.js"></script><br /><script type="text/javascript"><br />function cmnt(frm)<br />{<br /> JsHttpRequest.query('/test.php',<br /> {<br /> 'a1': document.getElementById('a1').value,<br /> 'a2': document.getElementById('a2').value,<br /> },<br /> function(result, errors)<br /> {<br /> if(result)<br /> {<br /> str = result["str"];<br /> alert('Сумма: ' + str);<br /> }<br /> else<br /> {<br /> alert('Не удалось получить данные: ' + errors);<br /> }<br /> }<br /> ,false // do not disable caching<br /> ); <br /> return true;<br />}<br /></script><br /><form><br /><input name="a1" id="a1" value="" type="text"><br /><input name="a2" id="a2" value="" type="text"><br /><input value="Отправить" type="button" onclick="cmnt();"><br /></form><br /></html></pre><br />И test.php:<br /><pre><?php<br />require_once "JsHttpRequest.php";<br />$JsHttpRequest =& new JsHttpRequest("windows-1251");<br /><br />if($_REQUEST[a1] && $_REQUEST[a2])<br />{<br /> $GLOBALS['_RESULT'] = array(<br /> "str" => $_REQUEST[a1] + $_REQUEST[a2]<br /> );<br />}<br />?><br /></pre><br />Разумеется, с сервера получать сколь угодно много параметров, просто добавьте их в массив $GLOBALS['_RESULT'] в php-файле и обработку этих параметров в javascript.Nobyhttp://www.blogger.com/profile/10936346631597571315noreply@blogger.com0tag:blogger.com,1999:blog-2060304370694755660.post-60917057629985094422009-04-05T10:35:00.002+04:002009-04-05T10:54:52.651+04:00Добавление RSSДля ускорения индексации <a href="http://reviews.bloged.org">сайта</a> поисковиками мне порекомендовали добавить <a href="http://ru.wikipedia.org/wiki/Rss">rss</a>. <br />Для начала я попробовал воспользоваться библиотеками perl, предназначенными для этого. Но ни XML::Atom::SimpleFeed ни XML::RSS стабильно работать не желали. Да и инталляция через cpan для camelbox perl не проходила. Пришлось исходные тексты библиотек просто переписывать в директорию site/lib.<br />И тогда я решил написать все сам, знал бы насколько это окажется быстрее, по сравнению с возней с указанными выше библиотеками, вообще бы с теми библиотеками не связывался.<br />Ознакомившись со статьей "<a href="http://www.caseclub.ru/articles/webrss.html">Как сделать RSS ленту за пять минут</a>", я действительно за 5 минут сделал rss-ленту. <br />Осталась сущая малость - преобразовать текущую дату в нужный формат. Т.е. в формат Tue, 31 Mar 2009 23:29:48 +0300. Сделать стандартными средствами в Windows это не получается. В Unix-е без проблем, а в Windows - нельзя. Даже <a href="http://xpoint.ru/forums/programming/perl/nursery/thread/44052.xhtml">гуру из xpoint.ru</a> не смогли помочь мне в этом. Решение пришлось находить самому, а именно, в запрос на получение данных из MySQL я добавил еще одно поле date_format(now(), "%a, %d %b %Y %H:%i:%S") dt_cur.<br />Теперь поисковые боты могут пользоваться моей <a href="http://reviews.bloged.org/rss.xml">rss-лентой</a>.Nobyhttp://www.blogger.com/profile/10936346631597571315noreply@blogger.com0tag:blogger.com,1999:blog-2060304370694755660.post-22717717711702287122009-03-17T08:54:00.005+03:002009-03-17T22:34:52.261+03:00300 за 1.5Вчера впервые счетчик <a href="http://www.liveinternet.ru/">liveinternet</a> перешел за отметку 300, точнее было 302 уникальных посетителя, вычтем из них 2 своих посещения из дома и с работы, как раз получится 300. Вообще-то я планировал выйти на такое количество «уников» за 3 месяца, получилось за 1.5. Причем, среднее количество просмотров на посетителя больше 3-х, т.е. <a href="http://reviews.bloged.org/">сайт</a> заслуживает внимания. Самой большой популярностью пользуются статьи с <a href="http://reviews.bloged.org/ru/">отзывами о путешествиях по России</a>, следом с полуторным отставанием идут <a href="http://reviews.bloged.org/gr/">Греция</a>, потом с заметным отставанием <a href="http://reviews.bloged.org/eg/">Египет</a>, <a href="http://reviews.bloged.org/es/">Испания</a>, <a href="http://reviews.bloged.org/tr/">Турция</a>.<br /><br />Что нужно делать для раскрутки сайта лучше прочесть на специализированных блогах. От себя только добавлю, что title и description для страниц за эти 1.5 месяца я менял 2 раза. Т.е. уже стоит 3-й вариант, на мой взгляд самый удачный. Хотя поисковики еще и показывают страницы со 2-м вариантом, который больше похож на набор ключевых слов, а не на осмысленный текст.<br /><br />Все никак не отважусь «открыть» для посетителей <a href="http://reviews.bloged.org/new.phtml">страницу для добавления своих отзывов</a>, хотя сам ею пользуюсь больше 2-х недель. Не знаю как лучше на нее сделать ссылки внутри сайта. Может кто-нибудь подкинет идею?Nobyhttp://www.blogger.com/profile/10936346631597571315noreply@blogger.com0tag:blogger.com,1999:blog-2060304370694755660.post-10288445535849002832009-03-02T10:10:00.002+03:002009-03-02T10:48:31.683+03:00Антиспам-фильтр для русских людейНаткнулся на забавную историю, которой спешу поделиться.<br /><blockquote>Включил антиспам-бота, написал в качестве вопроса следующее:<br />«Вас приветствует Анти-спам бот! Меня люто и бешено затрахали предложения увеличить член, купить айфон за 50 рублей, посмотреть „клёвые фотки студенток“ и многие другие, исходящие от спам-роботов. Докажи, что ты живой РУССКИЙ человек. Ответь на простой вопрос: Сколько будет десять раз по сто грамм? (буквами ответ пиши)»<br /><br />Вот ты бы что ответила? А ко мне человек пробиться не мог, аж позвонил, он долго, в разных вариациях со всеми возможными ошибками писал в ответ «килограмм».</blockquote><br />Смех-смехом, а идея-то интересная. Не думаю, что бот сможет сообразить что надо написать «литр» :)Nobyhttp://www.blogger.com/profile/10936346631597571315noreply@blogger.com0tag:blogger.com,1999:blog-2060304370694755660.post-27460126569986446072009-02-25T22:23:00.002+03:002009-02-26T14:40:54.280+03:00Про perl, или применение на работе полученных знаний в процессе разработки сайтаНа работе возникла задача - "вытащить" запросом из базы информацию о сотрудниках нашей организации. Причем вытащить из системы, разработанной подрядчиками, правда по системе есть документация. Нашел в документации обзор который показывает нужную информацию, выполнил запрос, посмотрел что получилось. Оказалось, что запрос показывал не все записи, но вот как понять, по каким полям фильтрует данные подрядчик, в документации этого нет, на "рытье" в исходниках времени нет. Попробовал открыть на портале страницу, возвращающую все доступные записи в виде таблицы. Скопировал эту таблицу в буфер обмена, отрыл Excel, нажал Paste и ... Процессор ушел в 100% загрузку, Excel минут 10 пытался вставить информацию из буфера обмена, но безрезультатно. Мне надоела ждать, "срубил" Excel. Открыл исходник страницы с этой таблицей, вырезал из него только таблицу, попробовал открыть получившийся документ в Word'е. Результат аналогичный Excel'ю. Вот незадача, но надо же понять почему на портале отображается на 10 записей больше чем в запросе. Перебирать все 1500 фамилий сотрудников в поисках несовпадений глазами весьма затруднительно. Как же выбрать из портальной страницы только фамилии, чтобы их сопоставить с найденными запросом.<br />Задача была решена меньше чем за 5 минут. Я написал маленький скрипт на perl, который "вырезал" из html-ой таблицы фамилии сотрудников. Еще через 5 минут, после использования функции ВПР в Excel я нашел недостающие в запросе фамилии и понял, что всего-то надо было поставить NVL(value, 0) на одно из фильтруемых полей.<br />Кстати, perl-овый обрабатывал html-ную таблицу размером примерно 3.5 мегабайта около 3-х секунд. Word и Excel отдыхают. Вот этот код:<br /><pre>require HTML::TokeParser;<br />my $p = HTML::TokeParser->new('c:\qqq.html');<br />while (my $token = $p->get_tag("a"))<br />{<br />print $p->get_trimmed_text . "\n"<br /> if($token -> [1] -> {onclick} eq 'showEmployee(); return false;');<br />}<br /></pre>Небольшой оффтопик. Случайно набрел на <a href="http://wasting-money.blogspot.com/">блог праздного небогача</a>, в котором наткнулся на превосходную идею тиражирования блога. Скоро появятся <a href="http://nobyru.blog.ru/">http://nobyru.blog.ru</a>, <a href="http://nobyru.ya.ru/">http://nobyru.ya.ru</a>, <a href="http://nobyru.livejournal.com/">http://nobyru.livejournal.com</a>. Ссылки на сайт <a href="http://reviewss.bloged.org/">Отзывы о путешествиях</a> никогда не будут лишними.Nobyhttp://www.blogger.com/profile/10936346631597571315noreply@blogger.com1tag:blogger.com,1999:blog-2060304370694755660.post-41168688477796145082009-02-17T20:15:00.008+03:002009-02-18T09:03:22.309+03:00Склонение русских словПосещаемость моего <a href="http://reviews.bloged.org/">сайта</a> пока не высока. Не более 100 человек в день. Просматривая статистику <a href="http://www.liveinternet.ru/">посещения</a> наткнулся на рекламу организации, предлагающей услуги по продвижению сайта. Эти услуги я пока не готов заказывать, но полезную информацию о <a href="http://1ps.ru/articles/seostories/">раскрутке сайта</a> я нашел.<br />Для автоматической генерации ключевых слов, по которым пользователи <a href="http://wordstat.yandex.ru/advq?rpt=ppc&shw=1">производят поиск информации</a>, требовалось проспрягать названия <a href="http://reviews.bloged.org/eg/" title="Египет отзывы">стран</a> и <a href="http://reviews.bloged.org/eg/sharm_el-sheikh/" title="Египет Шарм Эль Шейх">курортов</a>. Найти подходящие классы или пакеты для perl или php не удалось. Но зато один <a href="http://community.livejournal.com/ru_eludia/">опытный программист</a> прислал ссылку на <a href="http://www.opennet.ru/prog/info/59.shtml">Russian ispell</a>. Скачав оттуда последнюю версию словарей, обнаружил файл с географическими названиями (жаль, что не со всеми, имеющимися в моем <a href="http://reviews.bloged.org/gr/" title="Греция отзывы">каталоге</a>) и правила для склонения слов. Через несколько часов я смог автоматически проскланять большинство <a href="http://reviews.bloged.org/tr/" title="отзывы Турция">стран</a> и <a href="http://reviews.bloged.org/tr/marmaris/" title="Турция Мармарис">курортов</a>, жаль что не <a href="http://reviews.bloged.org/">все</a>.<br />Большое спасибо <a href="http://scon155.phys.msu.su/eng/lebedev.html">Александру Лебедеву</a> за предоставленный специальным образом закодированный орфографический словарь русского языка. Кстати, в общем словаре примерно 130 тысяч русских слов, и, теперь, у меня есть код, которых может их склонять.Nobyhttp://www.blogger.com/profile/10936346631597571315noreply@blogger.com1tag:blogger.com,1999:blog-2060304370694755660.post-69215142126186548642009-02-10T22:22:00.005+03:002009-02-18T09:04:56.237+03:00Добавление на поисковые сервера и в каталогиСайт готов. По крайней мере информацию можно смотреть. Возможность вносить статьи постараюсь сделать в ближайшее время.<br />Надо сообщить о своем существовании. Самым первым сообщением была первая публикация на этом блоге. Но блог-то мало кто пока читает.<br />Добавить о себе информацию я решил в <a href="http://www.google.ru/">гулг</a> и в <a href="http://www.ya.ru/">яндекс</a>. Да, есть еще русскоязычные поисковики, но эти самые распространенные.<br />Прочел на гугле о рекомендации для <a href="https://www.google.com/webmasters/">вебмастеров</a>, создал у себя <a href="http://www.google.com/support/webmasters/bin/answer.py?answer=93641&hl=ru">страницу 404</a>, т.е. страницу, которая отображается, когда запрашиваемая пользователем страница не найдена. Затем добавил свой сайт в список сайтов, создал файл для ботов - <a href="http://www.robotstxt.org/orig.html">robots.txt</a>, а так же файл sitemap.xml, точнее <a href="http://www.google.com/support/webmasters/bin/answer.py?answer=40318&hl=ru">sitemap.xml.gz</a>. Кстати, генерация и сжатие этого файла у меня занимает всего 1.11 секунды, причем в файл добавляется 9065 ссылки на страницы со <a href="http://reviews.bloged.org/cn/khajjnan/10576.html">статьями</a>, <a href="http://reviews.bloged.org/cn/khajjnan/">индексные файлы</a> я решил не включать. Эти файлы постоянно меняются, да и служат только для показа <a href="http://reviews.bloged.org/at/wien/10027.html">ссылок на статьи</a>.<br />Затем проделал аналогичную регистрацию на <a href="http://webmaster.yandex.ru/">яндексе</a>. Интересно, что на в описании не сказано, что можно указывать заархивированые файлы sitemap.xml.gz, но яндекс их легко понимает и разбирает. Правда, гугл намного оперативнее яндекса обрабатывает файлы sitemap.<br />На следующий день гугл в поиске выводил 2 мои страницы, причем те, на которые были ссылки в этом блоге, яндекс молчал. Через неделю гугл показывал 10 страниц, а яндекс почти все!!! Ура. Я появился в поисковых системах.<br />Правда узнал об этом с 3-х дневным опозданием, мой провайдер трое суток не мог устранить проблему, из-за которой несколько домов нашего района остались без интернета.<br />И у меня начали появляться посетители. В воскресенье 37 уникальных сайтов, в понедельник уже 52! Интересно, когда их количество добежит до сотни. Надеюсь к концу февраля.<br />Один из приятелей посетовал, что нет возможности поиска внутри сайта. Свой поиск в силу ограничений, описанных в предыдущих статьях, я сделать не могу. Значит надо воспользоваться решениями, предоставляемыми профессионалами. <a href="https://www.google.com/adsense/">Поиск от гугл</a> делается за несколько минут. Получаемый код встраивается в готовую страницу и сразу же начинает работать. Но только одна проблема, гугл пока что показывает на этой странице поиска всего 18 страниц, т.е. менее 0.2%. Поиск от яндекс сделать не сложно, только вот результаты поиска не совсем меня устроили. Во-первых, окно с результатами открывается уже на сайте яндекса, а во-вторых, если результат на сайте не найден, то выдается информация с других сайтов, что тоже не привлекает. По-этому буду ждать когда же гугл захочет показать в своем поисковике большинство моих <a href="http://reviews.bloged.org/do/punta_cana/bavaro_princess/10090.html">страниц</a>, потому что проиндексировал он их очень давно. Причем, первая индексация была сразу после публикации первой статьи на блоге. Жаль, что я не знал о такой его прыти, потому что при первой индексации было обнаружено больше 1000 ошибочных ссылок. Ну да, я же при отладке делал только первые 20 страниц, а не все 10900 (<a href="http://reviews.bloged.org/eg/hurgada/sun_rise_garden_beach/17546.html">статьи</a> + <a href="http://reviews.bloged.org/eg/hurgada/" title="отзывы Хургада">индесные файлы</a>).Nobyhttp://www.blogger.com/profile/10936346631597571315noreply@blogger.com2tag:blogger.com,1999:blog-2060304370694755660.post-57170602742248404822009-02-02T11:00:00.007+03:002009-02-03T17:57:18.809+03:00Оптимизация запроса в MySQLУ <a href="http://www.bloged.org/">сервера</a>, любезно предоставленного мне для размещения <a href="http://reviews.bloged.org/">сайта</a>, были довольно средние характеристики. Поэтому было решено все страницы, за исключением feedback, делать статическими. Для генерации страниц был разработан скрипт на perl. После отладки скрипта оказалось, что на генерацию 24 <a href="http://reviews.bloged.org/in/goa/17543.html">отзывов</a> вместе с <a href="http://reviews.bloged.org/in/goa/">индексными файлами</a> уходит примерно 120 секунд. На мой взгляд, непростительно много. После анализа времени функцией, которое тратится на производство одной страницы, выяснилось, что построение ссылок на страны, курорты, отели, относящиеся к опубликованному отзыву занимает больше всего времени.<br />Но почему? Вот запрос, получающий эту информацию:<pre>SELECT MIN(p.name) name, count(*) cnt, p.id<br /> FROM props p<br /> ,article_props ap<br /> ,articles a<br /> WHERE p.up_id = 171<br /> AND p.tp = 'P'<br /> AND p.id = ap.prop_id<br /> AND ap.art_id = a.id<br /> AND a.is_can_show = 'Y'<br /> GROUP BY p.id<br /></pre>Для таблицы props (в дальнейшем p) есть индекс по полям up_id и tp, для таблицы article_props (в дальнейшем ap) — индекс по полю prop_id, ну а у таблицы articles (a) — первичный ключ по id. Но запрос сначала шел по таблице a (по индексу по полю is_can_show), затем по ap и по p. В таблице ap записей примерно в 5 раз меньше, чем в p, может быть по-этому анализатор выбирал сначала эту таблицу.<br />Знаток MySQL рекомендовал мне:<br /><ol><li>переписываем с оракловского синтаксиса на общечеловеческий, расставляя таблицы в желаемом порядке <pre>SELECT MIN(p.name) name, count(*) cnt, p.id<br /> FROM props p<br /> INNER JOIN article_props ap ON p.id = ap.prop_id<br /> INNER JOIN articles a ON (ap.art_id = a.id AND a.is_can_show = 'Y')<br /> WHERE p.up_id = 171<br /> AND p.tp = 'P'<br /> GROUP BY p.id<br /></pre></li><li>Применить хинт <blockquote>SELECT /*+ORDERED*/ ...</blockquote></li><li>А лучше переделать все на LEFT JOIN <pre>SELECT /*+ORDERED*/<br /> MIN(p.name) name, count(*) cnt, p.id<br /> FROM props p<br /> LEFT JOIN article_props ap ON p.id = ap.prop_id<br /> LEFT JOIN articles a ON (ap.art_id = a.id AND a.is_can_show = 'Y')<br /> WHERE p.up_id = 171<br /> AND p.tp = 'P'<br /> AND a.id IS NOT NULL<br /> GROUP BY p.id</pre></li></ol>И добавил: «вообще я INNER JOIN стараюсь не применять вообще никогда.<br />Потому что LEFT JOIN как раз диктует порядок построения запроса и не даёт оптимизатору умничать. <b>ВСЕГДА ставьте LEFT JOIN. Почувствуйте себя хозяином положения</b>».<br />И действительно, после этих манипуляций запрос «пошёл» по нужным индексам, и стал отрабатывать за 0.6 секунды, вместо 9.6.<br />Я создал все страницы, на что ушло около 15 минут, начал проверять что получилось, и заметил, что запрос-то ошибочный. При его выполнении выдаются все записи из таблицы p, даже те, для которых нет ссылок в ap. При замене первого LEFT JOIN article_props ap ON p.id = ap.prop_id на INNER JOIN и эта проблема была решена. Но все же, использование LEFT JOIN меня сильно коробило. Не красиво это.<br />И элегантное решение было найдено. Оказывается, в MySQL есть возможность указания <a href="http://dev.mysql.com/doc/refman/5.1/en/index-hints.html">индексов в хинтах</a>. В результате запрос стал<br /><pre>SELECT MIN(p.name) name, count(*) cnt, p.id<br /> FROM props p,<br /> article_props ap,<br /> articles a IGNORE INDEX(art_is_can_show_i)<br /> WHERE p.up_id = 171<br /> AND p.tp = 'P'<br /> AND p.id = ap.prop_id<br /> AND ap.art_id = a.id<br /> AND a.is_can_show = 'Y'<br /> GROUP BY p.id</pre>24 отзыва вместе с индексными файлами созданы менее чем за 12 секунд (сравните со 120 секундами до оптимизации).Nobyhttp://www.blogger.com/profile/10936346631597571315noreply@blogger.com1tag:blogger.com,1999:blog-2060304370694755660.post-89625261203571785072009-01-29T11:17:00.010+03:002009-02-18T09:18:11.564+03:00Выбор шаблона для сайтаИнформации я набрал, данные привел в порядок, настало время самой творческой, по крайней мере, для меня, работы — рисовании сайта. Оказалось, что в интернет много ресурсов с бесплатными шаблонами сайтов. Мне посоветовали <a href="http://www.oswd.org/">www.oswd.org.</a> Просмотрев более 200 различных вариантов, я выбрал около 20 и отправил ссылки на них своей жене. На мой взгляд, лучше девушки никто не определит дизайн, а за мной останется самая малость — воплотить выбранный дизайн в жизнь. Жене больше всего приглянулся <a href="http://www.oswd.org/design/preview/id/3134">MultiFlex-2</a>. Действительно, баннер с пальмами и морем у кого угодно ассоциируется с отдыхом. Но как-то не трогала меня эта картинка. Прошлым летом мы отдыхали в <a href="http://reviews.bloged.org/me/" title="отдых Черногория">Черногории</a> в деревушке <a href="http://travel.bloged.org/prcanj.html">Прчань</a>, расположенной в Которском заливе. Замечательное место, великолепная погода, теплое море, простая и вкусная еда, а самое главное — потрясающие виды. Один из них на моем рабочем столе, бывает, что все сильно достанет, так свернешь все окна, посмотришь на картинку, и дальше за дело.<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgs-5IkFYo2Ii7nWcgYPa7Fe4O1pXBkYJEL7AtBo8VeoigQfB51A-9YuAxLUqGx7m43sAGwf0-pvU-y5ZyKAUvCtYv23xA24d2_5VFvnXjtvDtLaMuhc6A4Uwn3eIltQ3CZhCv4YNVar8X7/s1600-h/panorama_1024.jpg"><img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 400px; height: 316px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgs-5IkFYo2Ii7nWcgYPa7Fe4O1pXBkYJEL7AtBo8VeoigQfB51A-9YuAxLUqGx7m43sAGwf0-pvU-y5ZyKAUvCtYv23xA24d2_5VFvnXjtvDtLaMuhc6A4Uwn3eIltQ3CZhCv4YNVar8X7/s400/panorama_1024.jpg" alt="" id="BLOGGER_PHOTO_ID_5296639990264196114" border="0" /></a><br />Почему бы не сделать из этой картинки основной баннер. <a href="http://www.panoramafactory.com/">Склеил</a> из 4-х фотографий одну панорамную, обрезал крыши домов и побережье снизу, облака и небо сверху получил основное — море и горы. Глядя на баннер слоган <a href="http://reviews.bloged.org/">сайта</a> родился сам собой — «Побывал — поделись впечатлениями».<br />Бесплатный шаблон был для разрешения 800×600. Попробовав сгенерить на нем начальные страницы увидел, что почти половина экрана пустая, и, из-за маленькой ширины страницы очень длинные по вертикали. К сожалению, у <a href="http://1234.info/">автора шаблона</a> не оказалось версии для большего разрешения. Но ничего, немного покопавшись с css-файлом, я сделал это самостоятельно. По-моему, <a href="http://reviews.bloged.org/" title="отзывы о путешествиях">получилось</a> неплохо!Nobyhttp://www.blogger.com/profile/10936346631597571315noreply@blogger.com1tag:blogger.com,1999:blog-2060304370694755660.post-64488986705689768292009-01-28T10:38:00.010+03:002009-02-18T09:16:29.678+03:00Связывание информации из разных сайтовКак сделать так, чтобы мой сайт стал лучше, чем тот, с которого я забирал первоначальную информацию? Скачивать информацию еще с одного сайта. Тогда у меня будет информации больше, глядишь, и пользователям будет интереснее у <a href="http://reviews.bloged.org/">меня</a>, т. к. теперь не надо посещать 2 сайта, а все есть на <a href="http://reviews.bloged.org/">одном</a>.<br />Я даже не предполагал, насколько много в интернете ресурсов с отзывами. Причем большинство из них на низах <a href="http://www.liveinternet.ru/rating/ru/tourism/">рейтинга</a>. Выбрав новую «жертву», я довольно быстро подготовил скрипты для «выкачивания» информации из нее (всего несколько часов, по сравнению с днями, потраченными на первый источник, правда и опыт у меня уже был), запустил, выкачал. И началось самое геморройное... Надо как-то связать классификаторы статей из первого источника с классификаторами статей из второго источника, чтобы на моем сайте статьи про одинаковые места отдыха, полученные из разных источников, «лежали» в одном разделе. Т. е. курорт <a href="http://reviews.bloged.org/cu/varadero/" title="отзывы Варадеро">Варадеро</a> на острове <a href="http://reviews.bloged.org/cu/" title="отзывы Куба">Куба</a> с первого сайта, это тот же курорт <a href="http://reviews.bloged.org/cu/varadero/" title="Варадеро отели">Варадеро</a> с острова <a href="http://reviews.bloged.org/cu/" title="Куба отдых">Куба</a> со второго сайта. А что делать, если на одном сайте Куба пишется «<a href="http://reviews.bloged.org/cu/" title="отели Кубы">Куба</a>», а на втором — «<a href="http://reviews.bloged.org/cu/" title="отдых на Кубе">Cuba</a>»? И какая <a href="http://reviews.bloged.org/cu/" title="курорты Кубы">Куба</a> правильнее? В общем, надо создавать свой справочник курортов, содержащий как можно больше информации по странам, курортам, отелям, и привязывать к нему все ссылки на эти страны-курорты-отели. Опять же, откуда взять все это, чтобы информации было много, и чтобы она более менее была нормально упорядочена. Потому что меня не устраивает ссылка на <a href="http://reviews.bloged.org/vn/" title="отдых Вьетнам">Вьетнам</a> — Вся страна — Отель супер-пупер, а надо <a href="http://reviews.bloged.org/vn/" title="отели Вьетнам">Вьетнам</a> — <a href="http://reviews.bloged.org/vn/hanoi/" title="отели Ханой">курорт</a> — отель.<br />Побродив по интернету, нашел 3-й сайт, на котором больше есть информация о 35 тысячах отелей, причем отели упорядочены именно по странам и городам. Закачал. К сожалению, в этих 35 тысячах не обошлось без задвоений как городов, так и отелей. Но сильно на эту тему я заморачиваться не стал. Будут статьи, ссылающиеся на эти города-отели — вычищу.<br />Из информации, полученной с 3-го сайта, сделал «идеальный» справочник. К которому попробовал привязать классификаторы из первых двух сайтов. Примерно 70% информации удалось связать запросами к базе данных, для оставшихся 30% сделал форму и вручную прокрыжил. Долго, конечно, но что делать. Не хочется, чтобы у меня был мусор.<br />Заодно обратил внимание, что для многих статей есть ссылка только на страну, без привязки к городам и отелям. Непорядок. Несложным INSERT'ом попробовал исправить эту несправедливость, т. е. если статья ссылается только на страну Великобритания, а в тексте встречается слово Лондон, то надо добавить еще и ссылку на <a href="http://reviews.bloged.org/gb/london/" title="отзывы Лондон">Лондон</a>, чтобы пользователь не просматривал все статьи о <a href="http://reviews.bloged.org/gb/" title="отзывы Великобритания">Великобритании</a>, когда ему интересны впечатления только о <a href="http://reviews.bloged.org/gb/london/" title="отели Лондон">Лондона</a>. И натолкнулся на особенность MySQL, в Oracle такого рода ошибки не было. Оказывается, если в MySQL запрос <pre>SELECT instr('Москва — столица нашей Родины', 'МОСКВА')</pre> выдает 1, а в Oracle — 0. Но «<a href="http://reviews.bloged.org/ru/moscow/" title="отзывы Москва">МОСКВА</a>» и «<a href="http://reviews.bloged.org/ru/moscow/" title="отели Москвы">Москва</a>» — это ведь 2 разных слова, по крайней мере по написанию, а MySQL оптимизирован для поиска без учета case sensitive. Но проблема, как оказалось, решается просто. Если в запросе<br /><pre>SELECT 1<br /> FROM articles a, cities c<br /> WHERE a.text LIKE CONCAT('%', c.name, '%')</pre> после LIKE поставить BINARY, то все ищется отлично. Таким образом, мне удалось не наделать лишних ссылок из статей на города, которые в этих статьях не упоминаются.Nobyhttp://www.blogger.com/profile/10936346631597571315noreply@blogger.com1tag:blogger.com,1999:blog-2060304370694755660.post-59873630153630221402009-01-27T14:12:00.003+03:002009-02-03T18:01:34.290+03:00Как все начиналосьИдея создания сайта с отзывами обо всем возникла еще в мае, я даже удосужился сделать <a href="http://reviews.bloged.org/">первую страницу</a> содержащую слова, о том, как круто здесь все когда-то будет. Но дальше первой страницы дело не пошло...<br />А осенью начался кризис. Хотя с работы пока что не гонят, но вылететь можно в любой момент, никто же не может гарантировать тебе рабочее место вечно. Поэтому, надо искать какие-нибудь дополнительные источники заработка. <a href="http://www.bloged.org/">Мой друг</a> предложил поискать подработку на сайте <a href="http://http/www.rentacoder.com/">http://www.rentacoder.com</a>. Я зарегистрировался и обнаружил, что по спрос на кодеров, которые работают только с БД Oracle не очень-то и велик. Зато работы с php, perl и MySQL хватает. Осталась самая малость — более-менее освоить эти средства. Предварительный опыт был только с php.<br />Читая умные книжки и выполняя примеры из них, не сильно продвинешься в изучении новых средств разработки. На реальной задаче новый материал усваивается гораздо лучше. Тут-то <a href="http://reviews.bloged.org/">сайт с отзывами</a> и пережил свое второе рождение.<br />Сайт, конечно, дело хорошее. Но на нем должна быть какая-то информация. Причем информация должна быть полезной, чтобы кому-то было это интересно. А пока народ «прочухает», что надо именно на <a href="http://reviews.bloged.org/">моем сайте</a> оставлять отзывы пройдет не один месяц. Если у меня информации нет, а у кого-то другого она есть, надо ее позаимствовать. Заодно, научусь как на perl’е «качать» страницы и разбирать информацию в них содержащуюся.<br />Первой жертвой для заимствований выбрал большой туристический портал, на котором было полно информации. Не меньше недели ушло на то, чтобы научится нормально «забирать и разбирать» с него страницы.<br />Следующим шагом стала загрузка информации в базу данных. Т.к. на <a href="http://reviews.bloged.org/">сайте</a>, любезно предоставленном мне <a href="http://www.bloged.org/">моим другом</a>, была только MySQL, то и информацию надо хранить в ней. Я-то по наивности думал, что коль с Oracle более 10 лет работал, то и с этим зверем справлюсь одной левой... Счаз!!! Непонятки начались с момента инсталляции. Оказалось, что на винде (ноутбук, который у меня дома, с windows, вести разработку я предпочитаю на локальном компьютере, перекладывая отлаженный код на конечный сайт) сначала надо установить драйвер к этой базе, потом саму базу. Если создаешь базу в кодировке, отличной от latin1, предлагаемой по умолчанию (а зачем мне latin1, если информацию храню в cp1251), то надо еще и внести правки в my.ini... В общем, базу установил, под root’ом даже удалось зайти. Но не будешь же под root’ом создавать таблицы и т.п., нужен свой пользователь. Честно создал пользователя в MySQL Administrator, создал для него схему. А вот зайти под ним не могу. Пароль правильный, а не пускает... Долго бился я с этим змеем, пока мне не посоветовали забить на все администраторы и создать пользователя в командной строке. Причем создать именно такой командой<br /><pre>create user ’qqq’@’localhost’ identified by ’qqq’;</pre>Я бы в жизни не допер, что пользователи qqq и qqq@localhost — это два разных человека. Зато со вторым проблем вообще никаких.<br />Теперь надо виндовым perl’ом залезть в базу. У меня на тот момент стоял <a href="http://strawberryperl.com/">Strawberry Perl</a> — первый из перлов для windows, которые я увидел на <a href="http://www.perl.com/download.csp">www.perl.com</a>. Надо-то всего ничего, доустановить библиотеку DBD::mysql. Только вот командой<br /><pre>cpan install DBD::mysql</pre>результата не добьешься. Вылезает куча ошибок... Бился я с установкой этой библиотеки не один день. Победить не удалось. В инете нашел информацию про другую версию perl для windows — <a href="http://www.activestate.com/activeperl_pro_studio/">ActivePerl</a>. И действительно, в этой версии perl’а установка новых модулей — милое дело. Выбрал в окне модулей нужный, кликнул мышкой, он и установился. Но вот DBD::mysql там не было, была библиотека DBD::mysqlPP, посредством которой отлично можно работать с базой MySQL, только вот разработку-то я веду на компьютере с windows, а на <a href="http://reviews.bloged.org/">сайте</a> — linux. Как-то не хочется делать по 2 версии каждого скрипта, меняя в нем только название библиотеки. Хорошо, что нашелся <a href="http://code.google.com/p/camelbox/">Camelbox</a>, включающий в себя эту библиотеку. У Camelbox, правда нашелся другой грешок, я так и не смог для него установить DBD::Oracle, которая понадобилась на работе, пришлось на работе ставить ActivePerl.<br />Итог первого месяца: научился скачивать и разбирать страницы, получил опыт работы с регулярными выражениями, с которыми до этого не сталкивался, классная штука, однако, научился помещать найденную информацию в БД MySQL.Nobyhttp://www.blogger.com/profile/10936346631597571315noreply@blogger.com1