пятница, 11 декабря 2009 г.

Фотографии от Panoramio на своем сайте

Случайно наткнулся на cайт компании Panoramio. Разработчики этого сайта создали сервис привязывания фотографий к географическим координатам. Т.е. сделал прекрасный снимок, зашел к ним на сайт и опубликовал его, не забыв привязать к географическим координатам. Так же есть API, которое позволяет получать информацию о фотографиях, относящихся к географическим объектам, находящимися в заданном квадрате.
Сейчас я работаю над вторым сайтом созданным для самостоятельного бронирвоания путешествий - БукТрип.ру. Для предоставления возможности бронирования отелей собрал достаточно большую базу географических названий. Но вот для взаимодействия с API от Panoramio нужны координаты этих объектов. И эти координаты можно получить, воспользовавшись сервисом Google Geocoding. Чтобы определить координаты, надо сделать запрос к сайту maps.google.com следующего вида:
http://maps.google.com/maps/geo?q=Paris,fr&output=csv&key=ABQIAAAALkH7z-
7Yg6rN5Wgtte6WQxRhFePxzidMXG8dHw849BemzMV9YxRakAkV291BmrgJ5R_LgrNfgigIOQ

где q — адрес искомого объекта, output — формат ответа, key — ключ для работы с Google Maps, который можно получить на сайте регистрации ключа к API Карт Google. Ответом на запрос в примере будет строка
200,4,48.8566667,2.3509871
200 — код ответа (200 — успешно, 403, 602 и прочие — нет), 4 — точность определения (страна, город, улица, дом и т.п.), 48.8566667,2.3509871 — искомые широта и долгота.
Получив координаты объекта остается определить только «диаметр» зоны, фотографии объектов в которой и будут показываться. Для получения крайних точек можно просто вычесть и прибавить к координатам центра какие-то константы. Но Земля-то круглая, и точка, находящаяся на расстоянии 10 км от заданной должна вычисляться по более сложной формуле, которую я и нашёл.
Получив от Panoramio список фотографий, путем несложных манипуляций с данными, я их вывел в виде слайд-шоу (скрипт для создания слайд-шоу можно посмотреть на http://www.phatfusion.net/slideshow/).

пятница, 27 ноября 2009 г.

Аналитические функции в MySQL

Всем хорош язык MySQL, но вот в некоторых случаях надо делать запросы, которые, благодаря наличию аналитических функций, в Oracle делаются весьма просто.
Рассмотрим на примере. Скажем, есть у нас 2 таблицы: товары с полями goods_id — идентификатор, grp — группа, name — наименование, и обобщенная таблица с продажами sales с полями goods_id — идентификатор товара, period — период, summa — суммарная стоимость проданных товаров за указанный период.
И вот требуется вывести по 10 самых продаваемых товаров из каждой группы за заданный период. В Oracle запрос бы выглядел вот так:

SELECT grp, name, summa
FROM (
SELECT g.grp
,g.name
,s.summa
,row_number()
OVER (PARTITION BY g.group
ORDER BY s.summa) as rn
FROM goods g
,sales s
WHERE g.goods_id = s.sales_id
AND s.period = 2009101
)
WHERE rn <= 10
ORDER BY grp, name
А в MySQL вот так:

SET @rows_count = 0;
SET @grp = NULL;
SELECT grp, name, summa
FROM (
SELECT g.grp
,g.name
,s.summa
,CASE WHEN IFNULL(@grp, '#') != grp THEN
@rows_count := 0
END q1
,CASE WHEN IFNULL(@grp, '#') != grp THEN
@tp := tp
END q2
,@rows_count := IFNULL(@rows_count, 0) + 1 as rn
FROM goods g
,sales s
WHERE g.goods_id = s.sales_id
AND s.period = 2009101
)
WHERE rn <= 10
ORDER BY grp, name

среда, 22 апреля 2009 г.

1000 меньше чем за 3

Я уже писал я 300 уникальных посетителях в сутки по самому консервативному счетчику LiveInternet. Вчера уникальных посетителей было 1031.

Еще в начале апреля количество посетителей подбиралась к 1000 (6 апреля - 977, 7-го - 971), но "рубеж" был взят только вчера, хотя я надеялся, что это произойдет немного раньше. Но, почему-то, количество посетителей с 8-го апреля начало падать, сначала не очень быстро, потом падение ускорилось. Я это связываю с изменением алгоритмов выдачи Yandex'а, сайта, который "поставляет" большую часть посетителей. Самое дно было достигнуто в эту субботу 18 апреля - 502 посетителя, а в воскресенье начался стремительный рост.

Я уже получил больше 10 статей с момента опубликования формы для ввода новых отзывов, причем 5 из них от постоянного автора, который, точнее которая, помимо интересных текстов публикует изумительные фотографии.

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

В общем, "рубеж" в 1000 посетителей достигнут менее чем за 3 месяца. Для привлечения большей аудитории надо добавлять новые разделы, например, новости или что-то в этом роде. Может быть у кого-нибудь будут интересные предложения, которые я смогу реализовать?

пятница, 10 апреля 2009 г.

Ajax как способ показа информации из БД на статических html-страницах

Страницы моего сайта - статический html, который создается на основе информации, хранящейся в БД на моем компьютере. Затем специальными скриптами я делаю html-страницы и выкладываю их на сервере. При таком способе нельзя оперативно показывать комментарии, которые посетители оставляют, после ознакомления со статьями.

Для отображения комментариев к статьям я решил воспользоваться технологией Ajax. А именно, в каждом html-документе создать div, и javascript-программой выводить в этом div'е комментарии, которые хранятся в БД на сервере, где и находится сайт.

Сначала я ознакомился с документацией по Ajax, сделал простейший скрипт, который работал только в IE, а ведь есть еще Opera, Firefox и т.д. И у всех браузеров свои особенности. Конечно, можно покопаться в интернете, изучить варианты для всех браузеров, установить у себя каждый из браузеров для отладки и т.д. Но мне нужно всего лишь добавить возможность отображения комментариев, а не изучать особенности интерпретации javascript браузерами!

Решение было найдено случайно, на каком-то из форумов кто-то писал про JsHttpRequest-библиотеку. Библиотека - это громко сказано, но решение, действительно стоящее.
Итак, что же из себя представляет JsHttpRequest - это 2 файла JsHttpRequest.js и JsHttpRequest.php, соответственно первый включаем в каждый html-документ, второй - в скрипт, который на сервере обрабатывает запросы.

Покажу на примере, как несложно пользоваться этим. Есть форма, состоящая из 2-х полей, при нажатии на Submit надо показать сумму значений в этих полях.

В text.html:
<html>
<script src="JsHttpRequest.js"></script>
<script type="text/javascript">
function cmnt(frm)
{
JsHttpRequest.query('/test.php',
{
'a1': document.getElementById('a1').value,
'a2': document.getElementById('a2').value,
},
function(result, errors)
{
if(result)
{
str = result["str"];
alert('Сумма: ' + str);
}
else
{
alert('Не удалось получить данные: ' + errors);
}
}
,false // do not disable caching
);
return true;
}
</script>
<form>
<input name="a1" id="a1" value="" type="text">
<input name="a2" id="a2" value="" type="text">
<input value="Отправить" type="button" onclick="cmnt();">
</form>
</html>

И test.php:
<?php
require_once "JsHttpRequest.php";
$JsHttpRequest =& new JsHttpRequest("windows-1251");

if($_REQUEST[a1] && $_REQUEST[a2])
{
$GLOBALS['_RESULT'] = array(
"str" => $_REQUEST[a1] + $_REQUEST[a2]
);
}
?>

Разумеется, с сервера получать сколь угодно много параметров, просто добавьте их в массив $GLOBALS['_RESULT'] в php-файле и обработку этих параметров в javascript.

воскресенье, 5 апреля 2009 г.

Добавление RSS

Для ускорения индексации сайта поисковиками мне порекомендовали добавить rss.
Для начала я попробовал воспользоваться библиотеками perl, предназначенными для этого. Но ни XML::Atom::SimpleFeed ни XML::RSS стабильно работать не желали. Да и инталляция через cpan для camelbox perl не проходила. Пришлось исходные тексты библиотек просто переписывать в директорию site/lib.
И тогда я решил написать все сам, знал бы насколько это окажется быстрее, по сравнению с возней с указанными выше библиотеками, вообще бы с теми библиотеками не связывался.
Ознакомившись со статьей "Как сделать RSS ленту за пять минут", я действительно за 5 минут сделал rss-ленту.
Осталась сущая малость - преобразовать текущую дату в нужный формат. Т.е. в формат Tue, 31 Mar 2009 23:29:48 +0300. Сделать стандартными средствами в Windows это не получается. В Unix-е без проблем, а в Windows - нельзя. Даже гуру из xpoint.ru не смогли помочь мне в этом. Решение пришлось находить самому, а именно, в запрос на получение данных из MySQL я добавил еще одно поле date_format(now(), "%a, %d %b %Y %H:%i:%S") dt_cur.
Теперь поисковые боты могут пользоваться моей rss-лентой.

вторник, 17 марта 2009 г.

300 за 1.5

Вчера впервые счетчик liveinternet перешел за отметку 300, точнее было 302 уникальных посетителя, вычтем из них 2 своих посещения из дома и с работы, как раз получится 300. Вообще-то я планировал выйти на такое количество «уников» за 3 месяца, получилось за 1.5. Причем, среднее количество просмотров на посетителя больше 3-х, т.е. сайт заслуживает внимания. Самой большой популярностью пользуются статьи с отзывами о путешествиях по России, следом с полуторным отставанием идут Греция, потом с заметным отставанием Египет, Испания, Турция.

Что нужно делать для раскрутки сайта лучше прочесть на специализированных блогах. От себя только добавлю, что title и description для страниц за эти 1.5 месяца я менял 2 раза. Т.е. уже стоит 3-й вариант, на мой взгляд самый удачный. Хотя поисковики еще и показывают страницы со 2-м вариантом, который больше похож на набор ключевых слов, а не на осмысленный текст.

Все никак не отважусь «открыть» для посетителей страницу для добавления своих отзывов, хотя сам ею пользуюсь больше 2-х недель. Не знаю как лучше на нее сделать ссылки внутри сайта. Может кто-нибудь подкинет идею?

понедельник, 2 марта 2009 г.

Антиспам-фильтр для русских людей

Наткнулся на забавную историю, которой спешу поделиться.
Включил антиспам-бота, написал в качестве вопроса следующее:
«Вас приветствует Анти-спам бот! Меня люто и бешено затрахали предложения увеличить член, купить айфон за 50 рублей, посмотреть „клёвые фотки студенток“ и многие другие, исходящие от спам-роботов. Докажи, что ты живой РУССКИЙ человек. Ответь на простой вопрос: Сколько будет десять раз по сто грамм? (буквами ответ пиши)»

Вот ты бы что ответила? А ко мне человек пробиться не мог, аж позвонил, он долго, в разных вариациях со всеми возможными ошибками писал в ответ «килограмм».

Смех-смехом, а идея-то интересная. Не думаю, что бот сможет сообразить что надо написать «литр» :)