среда, мая 28

Запукаю новый блог: jakulov.ru

Прошло время, мои программистские скилы росли и я решил обзавестись собственным. Который хочу посвятить рассказам о программирование на PHP, JavaSript и прочих прелестных языках веб-разработки. В ближайшее время выпущу цикл статей про разработку собственного php фреймворка - отличный способ пересмотреть свое видение php-программирования, подходу к разработке веб-приложений. Также будет несколько обзоров полезных или просто прикольных JavaScript/jQuery виджетов и прочие статьи и обзоры по веб-программированию. Заинтересовавшихся и просто любопытных жду здесь: jakulov.ru

Блог о веб-программировании на PHP

суббота, июня 16

Запускаю свой новый проект - "Десятка Лучших". Тольятти - первый город, в котором открывается проект.

Мы собираем на одном сайте всех профессионалов города в сфере потребительских услуг, даем им возможность иметь полноценное представительство в сети, целевую аудиторию, перспективы развития своего бизнеса.

Также для всех есть отличная возможность заработать вместе с нашим проектов. Для этого достаточно просто посоветовать знакомому специалисту участие в "Десятке Лучших", за что вы получите вознаграждение. Подробности акции смотрите в нашем блоге.

четверг, февраля 4

Получаем курсы валют (класс для PHP)



В очередном проекте встала тривиальная задача вывода курсов валют на страницах сайта. Но стандартные информеры курсов валют очень портили дизайн сайта, вследствие чего я решил написать парсер курсов валют с сайта Центрального Банка Российской Федерации.

В последнее время, я перешел на разработку проектов на Zend Framework, поэтому представленная реализация заточена для использования в PHP приложениях на ZF.

Итак, начнем с самого класса. Здесь все просто:
  • есть public метод getValuta, который принимает буквенный код валюты и выдает ее курс относительно рубля
  • он обращается к защищенному методу getXML, который инициализирует объект класса Zend_Rest_Client для обработки XML данных с курсами валют
  • getXML проверяет наличие закэшированной копии данных и в зависимости от результата проверки создает новый кэш данных и читает оттуда курсы, либо обращается к существующему; делается это с помощью методов getNewXML и getOldXML соответственно.
Исходный код файла Kursi.php
  1. /**
  2. *
  3. * @author Jacob Akulov (Яков Акулов)
  4. * @desc Модель получения курсов валют по данным ЦБ РФ
  5. *
  6. */
  7. class Kursi {
  8. protected $_name = 'Kursi';
  9. protected $valutaClient;
  10. // определяем допустимые коды валют
  11. protected $valutaCodes = array(
  12. 'R01235'=>'USD',
  13. 'R01239'=>'EUR',
  14. 'R01035'=>'GBP',
  15. 'R01090'=>'BYR',
  16. 'R01335'=>'KZT',
  17. 'R01375'=>'CNY',
  18. 'R01720'=>'UAH'
  19. );
  20. //контруктор класса
  21. public function __construct() {}
  22. // получение курса вылют по коду
  23. public function getValuta($code) {
  24. self::getXML(); // получаем данные в виде XML (заносятся в объект Zend_Rest_Client, $this->valutaClient)
  25. // проверяем допустимость кода валюты
  26. if (!in_array($code, $this->valutaCodes)) {return false;}
  27. else {
  28. if($this->valutaClient) {
  29. $values = $this->valutaClient->key('Valute')->get()->Value(); // получаем значения курсов всех валют
  30. $codes = $this->valutaClient->key('Valute')->get()->CharCode(); // получаем их коды
  31. $currency = array_combine($codes, $values); // совемещаем все это в один масссив
  32. return $currency[$code]; // и выдаем результата
  33. }
  34. else {
  35. return false;
  36. }
  37. }
  38. }
  39. // создание клиента для обработки XML с курсами валют
  40. private function getXML() {
  41. // проверяем наличие кэшированной XML
  42. if(file_exists('public/kursi/valuta-'.date('Y-m-d').'.xml') && file_exists('public/kursi/metall-'.date('Y-m-d').'.xml')) {
  43. self::getOldXML(); // берем данные из кэша
  44. }
  45. else {
  46. self::getNewXML(); // иначе загружаем данные с сайта ЦБ РФ и кэшируем их
  47. }
  48. }
  49. // получение данных с сайта ЦБ РФ и создание локального кэша
  50. private function getNewXML() {
  51. $val = file_get_contents('http://www.cbr.ru/scripts/XML_daily.asp'); // читаем данные из ЦБ РФ и пишем их в кэш
  52. file_put_contents('public/kursi/valuta-'.date('Y-m-d').'.xml', $val);
  53. // создаем REST клиента и получаем данныые
  54. $this->valutaClient = new Zend_Rest_Client('http://sitename/public/kursi/valuta-'.date('Y-m-d').'.xml');
  55. }
  56. // получение данных из кэша
  57. private function getOldXML() {
  58. $this->valutaClient = new Zend_Rest_Client('http://sitename/public/kursi/valuta-'.date('Y-m-d').'.xml');
  59. }
  60. }
* This source code was highlighted with Source Code Highlighter.


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

Дальше, после создания модели (класса) в реализации на Zend Framework мы создаем контроллер и вьюху (просто для наглядног представления результата). Они очень простые и не требует дополнительных пояснений:

Контроллер:
  1. class KursiController extends Zend_Controller_Action
  2. {
  3. function init() {
  4. $this->config = Zend_Registry::get('config');
  5. // загружаем класс для получения курсов
  6. Zend_Loader::loadClass('Kursi', $this->config->path->models_dir);
  7. // создаем его объект
  8. $this->kursi = new Kursi();
  9. }
  10. // экшн
  11. function indexAction() {
  12. // передаем во view сразу значения валют
  13. $this->view->assign('USD',$this->kursi->getValuta('USD'));
  14. $this->view->assign('EUR',$this->kursi->getValuta('EUR'));
  15. }
  16. }
* This source code was highlighted with Source Code Highlighter.





View:
  1. <ul class="kursi">
  2. <h3>Курсы валютh3>
  3. <li><span>$ Доллар СШАspan> <b>=$this->USD?>b>li>
  4. <li><span> ЕВРОspan> <b>=$this->EUR?>b>li>
  5. ul>
* This source code was highlighted with Source Code Highlighter.




В результате при обращении к созданному контроллеру получаем такой вывод:


Вы также можете скачать класс Kursi.php. С удовольствием приму ваши замечания и улучшения для описанного скрипта.

Реализация получения и вывода курсов валют (дополненная курсами драгоценных металлов) мою использована на сайте самарских ломбардов.

среда, января 27

Результаты эксперимента с хостингом картинок



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


И простой поиск по тому же запросу ("румба в тумбочке"):


Везде выше в поиске ранжируется страница, на которой размещена картинка, которая хостится на самом сайте. А страничка с картинкой, которую я залил на Яндекс.Фотки (т.е. внешний хостинг) в поиске оказалась ниже.

Вот собственно и весь эксперимент с его результатами.


Кстати, я сменил место работы - теперь я занимаюсь честным продвижением сайтов :-)

четверг, декабря 3

Где хостить картинки для сайта?

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



Так как встретился с проблемой high-load проектов, которые при этом должны быть грамотно спроектированы с точки зрения SEO, то решил проверить все в очередном эксперименте:
на известном нам подопытном сайте сделали две странички:
1. про
блюдо румба в тумбочке,

На первой странице иллюстрация грузится на сайт с моего аккаунта Яндекс.Фоток, а на второй - с самого сайта.

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

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

понедельник, июня 8

Первые результаты эксперимента с формами и SEO


Есть первые результаты эксперимента с использование атрибутов alt и title в тегах input, расположенных в формах на страницах. Результат подтвердил предположения того, что поисковики могут учитывать текст в таких атрибутах при ранжировании результатов поиска.

Такая вот выдача присутствует в Яндексе на данных момент:

На первом месте страница, где были использованы атрибуты alt, на втором - title, а на третьем страница, где не использовались атрибуты у тегов input. В атрибутах встречалось слово механизм, что и повлияло на выдачу.

Для чистоты эксперимента теперь переставим атрибуты alt на третью заявку, а title - на первую, тогда как вторая заявка останется без атрибутов. И после переиндексации страниц посмотрим на изменения в выдаче.

Далее еще планируется поэкспериментировать с тегом label

воскресенье, июня 7

Результаты эксперимента по <H1>, <H2>


В эксперименте мы задались вопросом о том, как правильно с точки зрения SEO располагать теги заголовков на страницах, ну и стоит ли их вообще использовать.

Результаты выдачи по исследуемому запросу приведен ниже.
На первом месте стоит страница, где тег H1 стоит внизу, после тегов H2. На втором страница с последовательным использованием заголовков. На третьем ожидаемо - страница без заголовков.

Также хочется отметить особенности формирования сниппета. Обратите внимание на первую позицию: в сниппете два пассажа, один из которых не содержит ни одного ключа (вероятно он попал в описание из-за того, что выделен жирным). А если взглянуть на саму страницу, то мы увидим такую картинку:
Очевидно, что заголовок H1 содержащий только фразу "Трассировка нечеткого графа" выделен Яндексом в одельный пассаж (хотя и не отделен разделителем). Но данный пассаж не включен в сниппет, скорее всего из-за того, что в большой степени повторяет title страницы, или еще из-за того, что не содержит других слов, кроме как слов поискового запроса (или слов, содержащихся в title).

Если посмотреть на сниппеты других страниц, то видно, что там пассажи, содержажиеся в заголовках H2 включены в сниппет - они содержат слова, которые не содержутся в title страницы (или в запросе).

Вобщем результат эксперимента показал, что Яндекс не имеет предпочтений относительно расположения тегов заголовков на старнице. Хотелось бы посмотрет на выдачу Google, но им до сих пор проиндексировано лишь 4 странички подопытного сайта.

суббота, июня 6

<strong>, <b>, <i>


Есть рузультат эксперимента с тегами выделения ключевых слов. Яндекс таким образом распределил результаты:

Если вы взлянете на код страничек, то найдете следующий порядок следования тегов:
<strong>, <b>, <i>

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

Постоянные читатели