19 листопада 2009

SEO things

Я не специалист по SEO, потому в этой статье могут встретиться ошибки и неточности. Но я лишь хотел описать то, с чем мне пришлось столкнуться на личном опыте, то, что мне лично пришлось делать для оптимизации сайта по просьбе моего начальства на сайте savevid.com. Следующие пункты я попытался отсортировать в порядке важности.

Первое, что делается при оптимизации сайта – это проставление мета-тегов на страницах. В частности keywords и description. Я не буду рассказывать, как подбирать содержимое этих тегов, потому как я не специалист в этом. Я лишь вставлял в них то, что требовал SEO-специалист. Насколько я знаю, для этих целей есть множество сервисов, но зачастую подбор этого содержимого – «танцы с бубном». От меня же, как от программиста, требовалось написать админку, с помощью которой можно было бы редактировать содержимое этих мета-тегов. Опираясь на личный опыт, скажу сразу, что этого недостаточно. Часто SEO-специалисту требовалось или исключить вообще какой-нибудь мета-тег (например, robots или copyright), или же поменять порядок их следования. Поэтому админка должна заранее учитывать эти возможности. Но нельзя предоставлять возможность специалисту SEO полностью вручную редактировать head страницы, поскольку в нём еще содержатся важные script и stylesheet – так однажды SEO-специалист вынес стили, предназначенные для IE за специальный тег-комментарий, применяющий код только к IE. Естественно, надо не забывать про кэширование этих мета-тегов, плейсхолдеры, но это уже отдельные темы.

Дубликаты. Очень важно, чтоб ни один заголовок на страницах вашего сайта не повторялся. Также не должен повторяться текст в мета-теге description. Для отслеживания дубликатов на вашем сайте можно воспользоваться сервисом Google Webmaster Tools. Этот сервис также поможет отследить страницы на вашем сайте, открывающиеся слишком долго, а также содержащие ссылки на 404 страницу, что тоже полезно для оптимизации сайта.

Site maps. Проще всего гуглу дать знать о том, какие страницы есть на вашем сайте с помощью карты сайта. Для этого создаётся и регулярно обновляется файл с картой сайта в формате XML. На нашем сайте было 2 файла с картами сайта: sitemap.phpXML формат и sitemap.txt. В последнем файле было просто множество самых часто посещаемых ссылок сайта, каждая в новой сточке – честно, не знаю, зачем нужен этот файл.

W3C validation. Сейчас уже почти все сайты следят, чтоб их HTML код был «валидным». Как минимум, это помогает правильному одинаковому отображению страниц во всех браузерах. Но не стоит забывать, что на SEO оптимизацию это также влияет. С «невалидным» кодом мне пришлось столкнуться в теге embed. Это ошибка, которую часто можно встретить на сайтах – в тег embed вставляют атрибуты, которые не предусмотрены спецификацией. Как правильно преобразовать embed в object можно прочитать здесь.

Иерархия HTML тегов, в частности, заголовков h1-h7. В зависимости от структуры сайта могут быть нюансы. Так, например, заказчик требовал, чтоб подзаголовок страницы, который у нас находился в теге h2 также не повторялся на разных страницах.

Статьи. Давно уже не секрет, что уникальный контент приветствуется поисковиками. Именно потому важно иметь на сайте «качественный» вручную наполненный текст. Это могут быть статьи, блог, форум. Но главное, чтоб текст больше не встречался нигде в интернете.

Правильные url. Часто можно видеть на сайтах ссылки вида http://example.com/dir/subdir/subsubdir/sssdir/ssssdir/1/2/3. Но это неправильно с точки зрения SEO. Допустим, pagerank страницы http://example.com/ будет 4, тогда pagerank страницы http://example.com/dir/ будет не больше 4, а pagerank страницы http://example.com/dir/subdir/ не больше, чем pagerank страницы http://example.com/dir/ и т. д. То есть, если мы хотим увеличить pagerank наших страниц, достаточно просто вынести их на внешний уровень. Нашу ссылку можно, например, сделать такой: http://example.com/dir-subdir-subsubdir-sssdir-ssssdir-1-2-3.

Long tail keywords. Есть много статей, посвященных этой оптимизации. Поэтому останавливаться на ней отдельно не буду. Подчеркну лишь, что это способ завоевать трафик благодаря более специфическим для сайта запросам.

Pagination. Каждый сайт, имеющий достаточно большое количество страниц, наверняка имеет пейджизацию. Здесь я не скажу ничего нового – всё уже сказано выше, только специфика пейджизации объединяет несколько пунктов:
  • дублирование страниц; у вас не должно быть две первых страницы, как это есть на многих сайтах; например, http://example.com/archive/ и http://example.com/archive/1 – одна и та же страница, а url разный, соответственно, поисковик считает, что у вас на сайте 2 одинаковых страницы; выход – убрать с сайта одну из двух страниц, не забыв, где надо, подредактировать ссылки;
  • дублирование заголовков; чтоб избежать этого, часто добавляют в заголовок страницу, например, “Альбом песен”, “Альбом песен – 2” и т. д.
  • правильные url; например, лучше http://example.com/archive-2, чем http://example.com/archive/2/ и т. д.
  • «пустой» контент; не должно быть страниц, не имеющих содержательной части; например, если у вас за 21е число нет ни одной записи (видео/объявления – в зависимости от того, чем наполнен сайт), то вместо страницы за 21е число должна быть 404 страница, и ссылок на неё не должно быть также.

Nice/Clean urls. Суть этого пункта состоит в том, чтоб делать url-ы в браузере более «человечными». То есть, имея на сайте базу с видео, правильным будет использовать в url-ах страниц на видео названия этих видео, а не id из базы. Например, ссылка http://example.com/when-it-was-me-paula-deanda.htmlболее удачная, чем http://example.com/video-702032.

Есть еще много вещей в SEO, о которых я здесь не написал. Поскольку, во-первых, всё, что есть в SEO в одну статью поместить нереально, во-вторых, как я говорил, я не специалист в SEO, потому о многих вещах могу не знать. Так, например, у нас на сайте были ссылки “previous/next day”, которые SEO-специалист попросил изменить на “previous/next day videos” (поскольку сайт был посвящен видео). Потому я не советую полностью отказываться от помощи специалистов по SEO, им лучше знать, что на вашем конкретном сайте можно еще улучшить.

19 серпня 2009

Взлом "Счастливого Фермера"

Многие зарегистрированы на сайте В Контакте (если верить их данным, больше 40 миллионов). А среди них почти 6 миллионов играют в "Счастливого фермера". Эта статья предназначена для тех, кто хоть немного интересовался интерактивными играми В Контакте и имеет представление о HTTP запросах в браузере.
Меня, как программиста, в первую очередь интересовало написание программы, которая бы играла автоматически. Как-то раз я уже взломал приложение "Коктейль другу", "напоив" себя и друзей до отказа коктейлями (при чем, отправителя и коктейль можно было задать абсолютно любыми). Так, например, ради прикола напоил знакомую коктейлем "Рыжая шлюшка". Но в этом приложении всё было легко: id отправителя, получателя и коктейля были заданы прямо в запросе к серверу, без какой-либо авторизации и проверки на наличие средств на коктейль. Как побочный эффект, деньги снимались у получателя этих коктейлей.

Я пытался много раз взяться за "Счастливого фермера". Но раньше меня останавливала незнакомая мне библиотека AMFPHP, которая используется в этом приложении. Дело в том, что для написания роботов я всегда пользовался Firebug-ом (plugin-ом для Firefox). Этот плагин отображает все посылаемые серверу запросы и ответы сервера (с помощью этого плагина также можно определять ссылки на все видео и аудио, которые Firefox загружает на странице). Но в случае с AMFPHP Firebug при любом запросе отображал:

http://vkfarm.elex-tech.us/myfarm/data/gateway.php
amfphp and this gateway are installed correctly. You may now connect to this gateway from Flash.
AMF C Extension is loaded and enabled.
Note: If you're reading an old tutorial, it will tell you that you should see a download window instead of this message. This confused people so this is the new behaviour starting from amfphp 1.2.
View the amfphp documentation
Load the service browser

Именно это меня раньше и останавливало. Я долго не мог найти библиотеки, работающей с AMF. LupineDreamer посоветовал мне поискать среди framework-ов, в частности symfony и zend framework. В обоих framework-ах уже реализованы plugin-ы, работающие с AMF, и базируются они на библиотеке SabreAMF. Установил, разобрался в необходимых для моего скрипта вещах (кодирование своих данных для запроса на сервер, декодирование посланного на сервер запроса запроса).

Исходники "Фермера"
После первого запроса приложения на сервер возвращается некий secretid, который в последующих запросах передаётся на сервер в переменной auth или ca. Так же в последующих запросах на сервер посылаются переменные t и k, где t - локальное время, а k - MD5 подпись, сгенерированная приложением на основании id пользователя, t, auth и результата функции Encrypt.getKey (мне так и не удалось узнать, что она возвращает). Потратил много времени для поиска способа автоматической генерации k: искал на форумах, компилировал исходники - у меня результат функции Encrypt.getKey был всегда null, но, судя по всему, в приложении он не null. Привожу код, декомпилированный с помощью Flash Decompiler Trillix:

...
loc6 = getSystemTimestamp();
arg3["k"] = MD5.calcMD5(FarmModel.instance.uid + FarmModel.instance.authcode + Encrypt.getKey(Command) + loc6);
...

public class Encrypt extends Object
{
...
public static function getKey(arg1:Class):String
{
var loc2:*;
var loc3:*;
var loc4:*;
var loc5:*;
var loc6:*;
var loc7:*;
var target:Class;
var xml:XML;
var xmlList:XMLList;

xml = null;
xmlList = null;
target = arg1;
xml = describeType(target);
loc4 = 0;
loc5 = xml;
loc3 = new XMLList("");
for each (loc6 in loc5)
{
with (loc7 = loc6)
{
if (hasOwnProperty("@key"))
{
loc3[loc4] = loc6;
}
}
}
xmlList = loc3;
if (xmlList.length() > 0)
{
return xmlList[0].value;
}
return null;
}
...

Всех, кто добьётся хоть каких-то результатов в автоматической генерации k, большая просьба связаться со мной.
Без правильного ключа k сервер отдаёт ошибку "auth code error". Потому мне приходилось использовать значения k, t и auth, сгенерированные браузером. Как я уже говорил, Firebug не помогает при работе с AMFPHP. Потому я воспользовался другим приложением: Charles. Очень советую это приложение всем, кому нужно перехватывать запросы браузера. Вот только незарегистрированная версия работает 30 минут, потом приходится перезапускать. Из Charles я брал значеня k, t и auth, вставлял в свой скрипт, после чего получал возможность выполнять запросы. Но после выхода из аккаунта В Контакте или повторной загрузке страницы с приложением "Счастливый Фермер" ключи переставали быть действительными. Поскольку запуск Charles и копирование k, t и auth занимали много времени, я воспользовался другим способом: установил Tamper Data (plugin для Firefox), который перехватывает все запросы. Копировал запрос, содержащий k, t и auth в свой скрипт, потом с помощью SabreAMF вытягивал k, t и auth. Это занимало намного меньше времени, чем запуск Charles. Я думал, что большего не смогу добиться, но тут у меня появилась идея!

Plugin для Firefox
Да, идея до ужаса простая - написать plugin для , который будет сам отправлять мне запрос, содержащий k, t и auth. Потратив несколько дней, разобравшись с ANT-ом, XUL-ами, некоторыми class-ами и interface-ами компонентов Firefox, покопавшись в коде plugin-ов Tamper Data, LiveHTTPHeaders, QuickProxy, (потому не удивляйтесь, если вам покажется, что мой plugin вам покажется похожим визуально на QuickProxy и целый класс моего plugin-а взят из Tamper Data) мне удалось создать то, что я хотел. Итак, мой plugin в фоновом режиме запросы, посылаемые к приложению "Счастливый Фермер", а также некоторые настройки пересылает на мой сервер. На моём сервере сохраняются: id пользователя, k, t и auth, настройки пользователя. На сервере (на самом деле это мой локальный компьютер пока что) у себя я установил службу Cron NT service, которая периодически запускает робота на сервере. На данный момент робот на сервере проходит по всем друзьям пользователя и (в зависимости от настроек, выставленных в plugin-е) помогает (выпалывает, поливает грядки, уничтожает вредителей) и/или крадёт товар (фрукты, овощи, яйца, молоко). Робот работает только для тех пользователей, которых я сам добавлю в свою базу данных.

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

В дальнейшем планирую:
1. Увеличить объем возможностей робота (добавить кормление живности и т. д.)
2. Перенести всю серверную часть в plugin.

23 липня 2009

Get score from WAV - ноты любой песни на вашем компьютере

Искал в интернете корверторы аудио форматов под Linux. Очень удивился, когда нашел конвертор Waon: WAV -> MID. Решил побаловаться с этой штукой.

Первый тест был на инструментальной фортепьянной музыке
1. Ehma - Crysalida
Поскольку почти вся музыка на моём компьютере в формате MP3, то сначала мне приходилось конвертировать MP3 -> WAV. Делал это я другим найденным конвертером под Виндой t@b Media Converter (думаю, можно найти немало других). Тест могу назвать успешным. Отклонения, конечно, есть, но их не так много, как было в следующих моих тестах.

Потом я решил усложнить задачу, попробовал сконвертить
2. The Prodigy - Omen
3.
Pendulum - Hold Your Colour
4. Timo Maas - First Day

Если во 2-ой и 4-ой композиции хоть как-то можно было узнать мелодию, то конвертация 3-ей композиции завершилась полным провалом: ничего общего с оригиналом я не нашел. Но на этом я не остановился. Я вспомнил про такую чудесную программу, как Finale 2003 (сейчас уже есть более новая версия Finale 2010), которая умеет отображать MID-файлы нотами. Дополнительное удобство состоит еще в том, что Waon при конвертации делает только один инструмент - фортепиано, что позволяет партитуре выглядеть не очень громоздкой (для сравнения, я когда-то пытался открыть этой программой "навороченный" MID-файл - партитура выглядела устрашающе). Могу с уверенностью заявить, что даже во 2-ой и 4-ой композиции можно в этой партитуре отыскать основную мелодию, не говоря уже о 1-ой композиции, которую, подредактировав, можно сыграть полностью.


Итак, подводим итоги. Указанный метод позволяет:
а) производить конвертацию MP3 -> WAV -> MID.
б) получать качественные результаты для инструментальных треков (особенно фотрепьянных), с ярко выраженными партитурами инструментов.
в) получать ноты ваших любимых песен.

Для указанного метода использовались:
ОС: Windows XP Home Edition, Linux Ubuntu 9.04
Software: t@b Media Converter (Windows), Waon (Linux), Finale 2003 (Windows)
А также VirtualBox 3.0.2 для совмещения Linux и Windows на одном компьютере и обмена данных между ними.

26 червня 2009

Хреновая страна!

Началось всё с обходного листа, который надо подписать для получения диплома. Первый "ляп" был в ректорате. В обходном листе есть пункт "Бухгалтерія (корпус ректорату)". Ну мы с одногруппником, как культурные люди, решили искать этот самый кабинет бухгалтерии. Он оказался в 4м кабинете! В корпусе ректората мы раза 2 обошли все этажи, так и не найдя этого самого 4го кабинета. Зашли в 5й кабинет, спросили, где находится 4й. Нам сказали, что соседняя дверь... Тут без комментариев - фотка прилагается:



В результате оказалось, что в этот кабинет нам не надо, и все 4 пункта обходного в ректорате заполняются в одном единственном кабинете - в 17м (в том числе и бухгалтерия). Естественно, печати нам не поставили, поскольку приказа на отчисление выпускников с нашего факультета еще не передали...

Следующим пунктом надо получить справку со второго оттела красного корпуса (написано "для чол." - значит, военкомат и т. п.). Приёмные дни в военкомате - вторник (с 10 до 14) и четверг (с 15 до 18), перерыв с 13 до 14. Имею опыт получения загран. паспорта: оформлялся где-то в марте, и знаю, что заняв очередь в 7 утра во вторник можно надеяться, что до 13:00 успеешь попасть в кабинет. А люди у нас в стране организованные - находятся энтузиасты, создающие список, по которому потом и формируется очередь. Насколько я помню, за день в военкомате в марте принимали не больше 50 человек. Сделав поправку на то, что сейчас у всех выпуск, потому призывников там будет больше, решили приехать с друзьями в военкомат к 6 утра. Встали в 5 утра, в 5:30 выехали, в 6 были там. Возле военкомата застаём следующую картину:



Естественно, список был. Мы записались в список... я был 116м. На вопрос у одного человека "со скольки здесь стоишь" был получен ответ "с часу ночи - в списке 44й". Тогда мы поинтересовались, во сколько же пришел первый человек, на что нам ответили, что очередь начала формироваться в 11 часов вечера, в понедельник. На фотке можно видеть людей, играющий на покрывале в карты, а чуть дальше за столбом парень спит прямо на асвальте, подложив под голову рюкзак. И я не буду говорить о том, что автоматизировать эту всю систему очень просто. Только это никому не нужно: будет потеря рабочих мест и денежные доходы от коррупции уменьшатся.

Как вы считаете, это нормально? Да мы в этой стране никогда не будем жить хорошо, пока у нас будут такие очереди! Да, я знаю - я не патриот. Но разве можно любить страну, которая о тебе лично НИКАК не заботится?

"Кто сказал, что моя отчизна Украйна? Кто дал мне ее
в отчизны? Отчизна есть то, чего ищет душа наша, что милее для нее всего.
" (с) Гоголь "Тарас Бульба"

27 квітня 2009

Bonnie & Clyde

...
У меня в машине тонированные стёкла. Поэтому ночью вообще не видно, что в машине происходит. Сидели мы вместе, слушали музыку. Тут рядом останавливается машина, и я четко слышу стук в наше стекло. Так как было темно, то я тоже не мог разглядеть, что именно за машина стояла рядом. Решил немного выждать. Стук повторился. Пришлось открыть окно. Рядом стояла ментовка. Мент попросил предъявить документы. После получаса препираний с ментами, они всё-таки уехали. Даже не смотря на то, что у Альки не было документов при себе. Они, наверное, еще раньше бы уехали, если бы Алька на них не орала ("На каких основаниях?" и т. п.). А причина приезда ментов была до ужаса проста: кто-то из прохожих, увидев мою машину, позвонил в милицию и сказал, что стоит подозрительная машина, возможно в ней происходит что-то противозаконное. Вот такие у нас сознательные граждане в Киеве живут. А милиция у нас тоже хорошая - проверили и уехали, не требуя даже взятки! Они просто выполняли свою работу. Только угрожали, правда, что заберут в участок - наверное, просто хотели запугать. После этого случая Алька называет нас Бонни и Клайдом.

01 квітня 2009

"Первоапрельская шутка может стать новогодним подарком"...

Многим известна шутка о том, что розыгрыш первого апреля может оказаться неожиданным новогодним подарком (подсказка - 9 месяцев). Но я хочу рассказать совершенно другую историю, которая со мной сегодня произошла.
Общался я в аське вчера вечером с девушкой - и тут вижу, что на часах уже 00:14. И тут я вспомнил "1 апреля!!!". Думаю, надо как-нибудь её жёстко разыграть. Надо ведь что-то такое сказать, чтоб она смогла поверить, чтоб повелась!.. Сказать, что люблю? Не поверит, еще не время таких больших чувств. После нескольких минут раздумий меня посетила гениальная мысль! А давай-ка я ей предложу руку и сердце! Из переписки:
Black Akula (00:13:03 1/04/2009)
Аля, а давай на этих выходных подадим заявление в загс
La BonBon (00:13:11 1/04/2009)
вау
La BonBon (00:13:57 1/04/2009)
неожиданно
La BonBon (00:14:01 1/04/2009)
можно
La BonBon (00:14:03 1/04/2009)
на досуге
Black Akula (00:14:15 1/04/2009)
ну так что?
La BonBon (00:14:55 1/04/2009)
ты так хочешь секса со мной?
Black Akula (00:15:02 1/04/2009)
лан... шутка не удалась... с первым апреля, Алька!!!
(с) Alamix
На самом деле я пожалел, что так быстро шутку раскрыл - надо было еще её помучать ;) Но ей, кажется, и этого хватило. То ли она на меня обиделась, то ли я чего-то не понял, но мне показалось, что эта шутка на неё плохо повлияла. Я решил извиниться. Сегодня утром я заехал за ней и сказал, что я абсолютно серьёзно говорил насчет свадьбы. В доказательство своих слов я повёз её в загс "Бермудский треугольник" возле цирка, где мы и подали заявление на регистрацию брака. Можете меня поздравить! Теперь мы с ней официально помолвлены! Я невероятно счастлив! Свадьба состоится 14 сентября (к сожалению, раньше всё было забито). К её словам на блоге "Не шутите так, мужчины" хочу сказать "Шутите - и будет вам счастье, как и мне". Я сейчас невероятно счастлив!!! Я ЖЕНЮСЬ!

28 березня 2009

Validation. Smile



"You are awesome!"
"You have amazing face!"
"You are great!"
"That is a fantastic suit... that really flatters you!"
Each of us will be pleasured to hear such phrases. And when we hear it, we smile. Smile! Just smile!
I just want to see your SMILE!

22 січня 2009

Car driving

Я просто обожаю водить автомобиль!

По-моему, с тех пор как у меня появилась машина, я еще ничего про неё не написал. Хотя произошло на самом деле очень много. Моей машинке уже годик исполнился. По этому случаю я прошел уже ТО-1, на котором мне поменяли там в моторе какую-то масляную втулку, а после этого регулировали клапана. В общем, вопреки ожиданиям, мне пришлось провести на ТО весь день.

Для меня безопасность на дороге превыше всего. Поэтому летом я прошел курсы контраварийного и экстремального вождения в Альфа-Щит. Там меня научили многим вещам: регрессивное торможение, прогрессивное руление, разворот на 180 градусов задним ходом, разворот на 180 градусов передним ходом, прохождение поворота в силовом скольжении и многое-многое другое. Я на самом деле получил невероятное удовольствие от прохождения этих курсов. Правда, цены у них немного кусаются. Но это того стоит.

Да, забыл сказать, у меня Daewoo Lanos 1.4. Как бы не жаловались на нашего отечественного производителя, всё же Daewoo намного лучше, чем Жигули (у родителей есть "копейка"). Правда, мощности на моей машинке не хватает, чтоб порезвить, но всё же вполне достаточно, чтоб расход бензина был приемлемым. В общем, машиной я доволен. Единственный минус - это наши сервисы обслуживания - приходиться очень долго ждать, пока сделают ТО твоей машинке. Радует то, что это приходится делать не чаще, чем раз в 10 тыс. киллометров.

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

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

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

В общем, я рассказал про мою Дэушку. Я не говорю, что она лучшая, но у меня другой нет. Когда-нибудь, может, накоплю на другую, а сейчас я доволен и этой. Главное на дороге - это безопасность. Будьте внимательны за рулём! Удачи!