четверг, 10 сентября 2009 г.

Немного о контроле версий.

Всегда у меня была проблема с хранением разрабатываемых проектов. Точнее проблемы-то никакой и не было. Есть задача: имеется несколько рабочих мест - домашний десктоп, ноутбук, и рабочий компьютер. Есть флэшка, на которой хранятся разработки. На каждом рабочем месте я мог доработать любой из своих проектов. Казалось бы - работай сразу с флэшки и будет тебе счастье, однако счастья не было. Бывали моменты, когда нужно было просмотреть внесенные изменения, или откатить уже сделанные. При работе напрямую приходится делать копии проекта для доработок, при этом становится уже практически невозможно отследить сделанные изменения. Я использовал вариант хранения, когда после каждой доработки проекта, я создавал архив с названием, содержащим имя проекта и дату в формате ггггммдд. Такой формат даты позволял сортировать данные файлы по старшинству и вроде был порядок. Всегда можно было посмотреть состояние проекта на какую либо дату.
Однако, по какому-то наитию, я наткнулся на систему котроля версий SubVersion. Эта система захватила меня целиком и полностью. Я создал репозитории для всех своих проектов на флешке, все рабочие места оборудовал клиентом TortoiseSVN (Очень удобный клиент, интегрируется в среду Windows, содержит инструменты для просмотра изменений). Все эти продукты имеют подробную документацию на русском языке. Кстати говоря, при установке клиента TortoiseSVN, не требуется наличия SubVersion, она включена в установку. Однако, я так и не смог выполнять команды администрирования SubVersion с командной строки.
Дальше меня захватила идея - поднять дистанционный репозиторий, доступный по интернету. Немного "плясок с бубном" и это получилось. (О том, как это происходило, следует написать отдельный пост). Надо сказать, что в дальнейшем я планирую все свои проекты перевести на дистанционный сервер, а еще вызревает идея создания SubVersion хостинга.
Возможно, эта задача не по силам одному программисту, поэтому если кто-то считает целесообразным открытие подобного сервиса, прошу обращаться в асю 66двенадцать11, или на почту odmin@odmin.name

вторник, 8 сентября 2009 г.

Пара граблей в MySQL, на которые часто любят наступать при разработке CMS

Неоднократно сталкиваюсь с такими ситуациями, что CMS рассчитаные на широкий круг вебмастеров и включающие в себя ненужную кучу дополнительных возможностей, начинают тормозить при количестве статей более 1000.
Конкретные примеры организации баз данных показывают, что либо у разработчиков нет понимания процессов, либо просто, как это часто бывает, модернизация и расширение функциональности делается непродумано и наспех.
В результате таких спешек появляются таблицы, содержащие текстовые поля, информация в которых неоднократно дублируется. Например, таблица статистики показа банеров.


CREATE TABLE `test`.`baner_stat` (
`id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`url` VARCHAR(255) NOT NULL DEFAULT '',
`baner_id` INTEGER UNSIGNED NOT NULL DEFAULT 0,
PRIMARY KEY(`id`)
)
ENGINE = InnoDB;

Очевидно, что поле url в данной таблице используется для идентификации страницы, на которой был показан банер. Например будет 10000 показов банера на странице /the_most_popular_chapter/very_delicious_page_in_most_popular_chapter.html
Тогда url этой страницы будет записан 10000 раз в это поле.
При создании отчетов по статистике, с группировкой по странице просмотра, такой запрос будет выполнятся крайне долго. Однако, если вы хотите еще более ухудшить ситуацию, тогда следует создать индекс по полю url.
При каждом просмотре банера, при такой организации хранения данных, будет создаваться команда на вставку строки, следовательно будет происходить построение индекса и вставка замедлится в разы. Очевидно, это плохая идея.
В данном случае есть несколько вариантов решения. Если нас интересуют только просмотры и гибкая сатистика нам не нужна, то следует добавить в эту таблицу целочисленное поле счетчика просмотров. Тогда нам будет необходимо сделать два запроса к базе - 1-й нахождение ID строки по URL (здесь целесообразно использовать индекс), если мы нашли ID, то делаем UPDATE данной таблицы, увеличивая счетчик просмотров на единицу, в противном случае - вставляем новую строку с новым URL.
2-й вариант сводится к разнесению данных на две таблицы - словарную и регистрационную. На мой взгляд, данный вариант более красивый и логичный. Словарная талица:


CREATE TABLE `test`.`baner_url` (
`id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`url` VARCHAR(255) NOT NULL DEFAULT '',
PRIMARY KEY(`id`),
INDEX `Index`(`url`)
)
ENGINE = InnoDB;


и таблица регистрации просмотров:


CREATE TABLE `test`.`baner_stat` (
`id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`url_id` INTEGER UNSIGNED NOT NULL DEFAULT 0,
`baner_id` INTEGER UNSIGNED NOT NULL DEFAULT 0,
PRIMARY KEY(`id`)
)
ENGINE = InnoDB;


Далее, регистрация просмотра банера сопровождается хитрым запросом:


INSERT INTO `test`.`baner_stat` (`url_id`, `baner_id`)
SELECT `id`, константа_id_банера FROM baner_url b
WHERE url='константа_URL_страницы'


Потом, в коде PHP, следует проверить количество вставленных строк (для этого есть оператор mysql_affected_rows), а если вдруг оно равно нулю, то вам следует обновить словарь:


INSERT INTO `test`.`baner_url` (`url`) VALUES ('константа_URL_страницы')


и повторить первый запрос. Таким образом, до заполнения словаря, у нас будет использоваться 3 запроса к базе, но по мере того, как все страницы, существующие на нашем сайте, будут занесены в таблицу, у нас останется 1 запрос для регистрации просмотра банера.
Такая схема должна применяться во многих вещах, например в таблице статей (категория, тип) или коментариев.

Во второй части статьи будет рассмотрена частая ошибка организации счетчика просмотров статей.

понедельник, 7 сентября 2009 г.

Почти год молчания

Вспоминается один бородатый анекдот, когда сорвался один добрый человек со скалы, и как-то умудрился уцепиться за выступ. Висит, значит, внизу - скалы, пальцы уже соскальзывают, и, вдруг, перед глазами появляется маленький мужичек в красной шапочке. И говорит - Я Кудесник, ты прыгай, тебе ничего не будет. Ну ладно, решает мужик, закрывает глаза, отцепляется и летит вниз. Естественно разбивается вдребезги. Маленький мужичок смотрит вниз с сожалением - мдаа.. хреновый из меня кудесник.
Однако, каким бы я не был хреновым "кудесником", хочется исправиться, да и написать есть о чем. Вкратце.
1. Возродил сайт krewedko.ru, давно хотел поэкспериментировать с почтовыми алиасами и оценить перспективы данного рынка. Судя по текущему положению вещей - перспективы не радужные.
2. Открыл сайт, посвященный CMS Krewedko, на коем в данный момент выложена рабочая версия и немного документации.
3. Выиграл пятничный конкурс у Master-X

Было немало неплохих вариантов, но меня просто взорвало от истории про маркетинг: "Применили маркетинг не по назначению". Автору в аську или скайп за призом.

Участвовал не для приза, просто по приколу :)

четверг, 4 декабря 2008 г.

Ахтунг! е107!

Хитрожопый двиг забанил пауков яндекса.
Сегодня утром залезаю в Йа Вебмаста и наблюдаю картину на одном из новых сайтов на е107 - ошибки 403 при обходе роботом, в индексе 3 страницы. Что за хуйня!
Начинаю разбираться. Прежде всего проверка заголовков от страниц - 200 ОК, затем роботс, там все в порядке.
Голова пухнет, начинаю грешить на хостинг..и тут в голове возникает спасительное слово "антифлуд". Блять. Вот оно!
Заходим в пользователи -> список запрещенных. Вот они паучки Яндегза как на ладони, забанены как один за попытки кликать многократно на странички. Эх.. когда в системе много интеллекта но нет ума - это страшно. Ладно, сам виноват. Срочно заходим в Настройки -> настройки сайта, находим пункт:
Авто-запрет
Если кто-нибудь пытается взломать ваш сайт множественными запросами, его IР будет автоматически запрещен ! Не изменяйте правильные настройки сервера !!!

и выбираем выкл. Вздыхаем с облегчением и ждем появления станичек в индексе.

вторник, 26 августа 2008 г.

Победа над ноуиндекс!

После 3-х месяцев пребывания в глубокой Ж, наконец-то вылез в индекс мой старый любимый сайт. Пузомерка 2/30, контент смешанный (рерайт, копирайт, копипаст).
Методы вытаскивания:

1. В первую очередь была куплена сотня одно-двухцентовых внутренних ссылок в сапе, ссылающихся на внутренние страницы пациента. Анкоры старался брать такие, чтоб обеспечивали хорошее вхождение по тексту. Ссылки загнал в индекс при помощи угс-генератора - отличная вещь!

2. Во вторую очередь были выбраны 3 довольно плотные мордашки, ТИЦ 120, ПР 2-3, с обязательным наличием в ЯК и тематики соответствующей пациенту. Нашел недорогие, по 5 уемес.

3. Немного добавил контента, освежил морду.

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

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

суббота, 26 июля 2008 г.

УГС - генератор

Сегодня хотелось бы поговорить о делах оптимизаторских. Ни для кого не секрет, что в данный момент для продвижения сайтов используется несколько систем, такие как sape.ru, seozavr.ru и другие.
Когда мы хотим поднять свой сайт по определенным, запросам, то даже школьник скажет, что необходимо закупить как можно больше внешних ссылок. Существует много споров, о том что эффективнее - закупить несколько дорогих, жирных и лоснящихся морд, или побольше недорогих страниц третьего уровня. Не буду ни кого убеждать, но у меня есть сложившееся мнение, что выгоднее в финансовом плане именно внутряк.
Однако, при закупке внутренних ссылок есть один ньюанс - нам придется долго ждать, пока наша любимая поисковая система придет и скушает ссылки на страницах третьего уровня. Надо этот процесс ускорить. Есть вариант! Экспортировать список урлов страниц, на которых размещены наши ссылки, навести кофе, забить трубочку и бомбардировать адурелку яндекса, добавляя руками линки по одному. Как говорится, ненене.. не надо нам такого счастья.
Вариант второй. Тут нам понадобится УГС. Что же это такое? Да вобщем то, чем заполнен интернет, чуть более чем наполовину. Сейчас все станет понятно.
Необходимо сделать небольшой сайт, желательно на несколько страниц уникального (или не очень) контента, где по тексту будут размещены ссылки на нужные нам страницы. Теперь в адурелку можно добавить только один урл - урл нашего унылого.

УГС - Унылый Говно-Сайт
Унылый Говно-сайт - это набор страниц, размещенных в сети. Как правило УГС уже забанен всеми поисковыми системами, никогда не имеет ТИЦ > 20, завален ссылками и банерами и не имеет никакой практической ценности, для случайно забредшего посетителя.
Для создания унылого говно-сайта не нужно утруждать себя, и тратить много времени. В нашем случае УГС должен выполнить одну полезную функцию - дать яндексу информацию о страницах, на которых размещены наши ссылки и благополучно умереть.
И вот на этой лирической ноте мне пришла мысль создать инструмент, который позволит одним кликом мышки генерировать то, что на все 100 процентов подходит под определение УГС.
Подробности на ugs-generator.ru
А теперь подведем итог:
Для быстрой индексации недавно купленных ссылок необходимо:
1. Экспортировать список урлов страниц, на которых эти ссылки закуплены
2. Достать из заначек несколько тыщ знаков любого более менее уникального контента
3. Прогнать эти ссылки и контент через УГС - генератор и получить на выходе унылый говно-сайт
4. Разместить на народном хостинге (или на свое усмотрение)
5. Добавить урл сайта в аддурелку яндекса
Через пару апов большинство ваших купленных ссылок будут в индексе.

Примеры УГС: первый второй

понедельник, 7 июля 2008 г.

Бесполезный мануал или как поднять WIndows 95 на WMWare

На днях очень уж сильно приспичило поднять сию ОС, необходимо было запустить старую игрушку. Делюсь опытом.
Дано:
WmWare 4.0 (какая была в заначках, хотя можно было взять и поновей)
Дистрибутив Windows 95 (тоже был в заначках).

После создания новой виртуальной машины в WMWare встала задача - как загрузиться. Диск с дистрибутивом Windows не загрузочный. Чешем репу и насилуем интернет, в результате где-то здесь находим образ загрузочного диска Windows 95. Скармливаем этот образ виртуальной машине, и она чудесным образом его успешно хавает, причем не менее успешно маунтит CD-привод. Стартуем нашу виртуальную машину, обнаруживаем что дистрибутив находится в одном архиве на CD, а задача по перенесению разархивированного дистрибутива кажется просто невыполнимой. Очередной раз чешем репу и находим гениальный выход.
1. Распаковываем архив в папку на диске нашего настоящего компьютера.
2. Запускаем nero
3. Вместо нашего рекордера выбираем Image Recorder
4. Создаем новый CD и добавляем на него дистрибутив винды
5. Нажимаем запись, назначаем файл образа и тип iso
6. Полученный образ скармливаем WmWare... Ура!
Кстати не забудьте в виртуальной машине подготовить диск. Сначала после загрузки с дискеты выполняем команду A:\fdisk
Создаем основной раздел, перезагружаем машину, потом форматируем диск С
Теперь можно запускать setup, предварительно сменив диск на R:
Откинувшись на спинку кресла, наслаждаемся процессом установки (кто-то может пустить скупую мужскую слезу умиления). Далее, отбросив сентиментальности в дальний угол, понимаем, что на новой винде совсем нет драйверов видео и звука. Ай-ай-ай, счастье было так возможно... Чешем репу и не сдаемся, запускаем наш карманный Windows 95 и ставим WmWare Tools. После успешной установки и пары перезагрузок появляется драйвер экрана WmWare SVGA.... неплохо...
Насилуем интернет и где-то здесь находим драйвера для звука. Всего 4.5 Мб
Перекидываем на виртуальную машину описанным выше способом через образ CD и наслаждаемся.
Удачи в освоениии старых игрушек! :)

В завершении инструкция на английском для тех кто плохо понимать по-русски