Полезности | Кирилл Павлюков
Мар 20

Самое неприятное в работе с Google AdSense – это собственно получение оплаты за выполненные работы (оказанные рекламные услуги). Вернее, получить ее в безналичном виде не сложно, а вот обналичить – проблематично. Не работают наши банкиры, как их западные коллеги. Лично мне попадалось несколько руководителей филиалов крупных банков, которые при виде чека делали круглые глаза и спрашивали, что это.

В этом посте я расскажу о нескольких вариантах обналичивания чеков от Гугла, которыми я лично пользовался. Читать запись полностью »

Share

Автор: Кирилл Павлюков \\ Метки: , , ,

Мар 11

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

Share

Автор: Кирилл Павлюков

Мар 06

Эти правила писал не я,
с автором лично не знаком
(и вообще не знаю, кто он),
но точку зрения полностью разделяю.

  1. Нужно ТЗ.
  2. Нет, без ТЗ я не смогу сказать, сколько это будет стоить, и возьмусь ли я.
  3. ТЗ — это не только название того, что надо сделать.
  4. Да, обязательно надо указать срок.
  5. Очень прошу, НАВСЕГДА ЗАБУДЬТЕ фразу «чем быстрее, тем лучше».
  6. «Как сможете» — это тоже не срок. Я смогу через пять лет. Вряд ли Вас это устроит :-)
  7. На фразы по аське «сейчас отошлю новый заказ» — я могу зарычать.
  8. У меня проверка почты настроена на каждые 10 минут. Ни одного шанса пропустить письмо.
  9. Фразу «Послал новый заказ» следует писать после отсылки, а не до :-)
  10. Если заказ не требует выполнения в течение часа, зачем напоминать об ответе на письмо каждые 5 минут? Я отвечу при первой возможности. Когда-нибудь было по-другому?
  11. Каждый ответ «Нормально» на вопрос «Ну, как там дела?» удлиняет срок присылки готового заказа примерно на 30 секунд и портит заказчику карму.
  12. Требование другого ответа на вопрос «Ну, как там дела?» удлиняет срок присылки готового заказа на 5 минут минимум и портит заказчику карму.
  13. Карма некоторых заказчиков уже похожа на решето :-)
  14. Я беру деньги за свое время, а не только за объем работы.
  15. Мое время стоит не дешевле времени других специалистов моего уровня.
  16. Я не умею читать мысли.
  17. Я НЕ УМЕЮ ЧИТАТЬ МЫСЛИ.
  18. Если заказчик о чем-то думал, но умолчал — это  не «фрилансер накосячил », а платная доделка.
  19. Изменения в ТЗ после отсылки заказа — это не « фрилансер накосячил », а платная  доделка.
  20. Посредники — чаще всего, зло.
  21. Если посредник забыл передать фрилансеру какие-то детали — это не «фрилансер накосячил», а платная доделка.
  22. Дорого — не заказывайте.
  23. Дорого — не заказывайте.
  24. ДОРОГО — НЕ ЗАКАЗЫВАЙТЕ.
  25. Вы ДЕЙСТВИТЕЛЬНО надеетесь меня убедить в том, что «это стоит дешевле, потому что это сущий пустяк»?
  26. Почему бы в таком случае не сделать самостоятельно?
  27. Это не первый мой заказ. И даже не сотый. Может, хватит уже торговаться? :-)
  28. Да, иногда я не беру заказы, просто потому что они мне не нравятся.
  29. Без этого заказа я не умру с голоду.
  30. Если принимает заказ третья сторона, комментарии посредника меня не интересуют.
  31. Не интересуют.
  32. НЕ ИНТЕРЕСУЮТ.
  33. Кстати, сколько таких заданий посредник сам сделал? Ну-ка ссылочку на портфолио.
  34. «Все неправильно!!!!!» — это не претензия. Это истерика.
  35. Идеальный формат для претензий — «Исправить строку 4 на странице 16, вместо “а” поставить “б”».
  36. Да, я работаю не только с Вами :-)
  37. А также у меня полно знакомых фрилансеров моего профиля.
  38. Поэтому если Вы подтвердили мне заказ и продолжаете искать «где подешевле», Вы можете попасть в черный список у кучи народу. И здорово испортить себе карму.
  39. Нет, я не могу прислать готовый заказ сегодня, если срок послезавтра.
  40. Нет, я не круглосуточно в онлайне. Я, как и все homo sapiens’ы, ем, сплю и хожу в туалет. И делаю это в соответствующих местах, а не перед монитором.
  41. Нет, я не выполняю заказы по программированию, если я психолог. И наоборот тоже.
  42. Не выполняю. Не выполняю. Не выполняю.
  43. В принципе, конечно, могу и выполнить, мне не жалко. А за последствия не боитесь? :-)
  44. Если мы с Вами когда-то работали, это не повод для душевных излияний по аське в три часа ночи.
  45. Я не проверяю чужие работы.
  46. Я не дорабатываю заказ по замечаниям левого человека, проверившего мою работу.
  47. Если мне еще раз в 2 часа ночи придет SMS «отправил новый заказ на мыло» — я отправлю Ваш мейл в блек-лист. :-)
  48. Прежде чем звонить мне с вопросами, прислал ли я то, что требовалось, проверьте почту и прочитайте новые письма.
Share

Автор: Кирилл Павлюков \\ Метки:

Сен 09

Недавно на нашем основном сайте упала посещаемость. При этом поток с поисковых систем был на прежнем уровне, а количество посетителей с новостных информеров пошло вниз. Сверив статистику, мы были удивлены, что одному из партнеров мы отдавали в день около 300-500 посетителей, что, в принципе, очень мало.
Учитывая то, что недавно этот партнер (якобы случайно) нарушил достигнутые между нами договоренности, нам присланная статистика показалась заниженной. Я начал думать, как можно посчитать количество переходов, если информер – это яваскрипт, который отрабатывается на стороне клиента.

И в этом на помощь пришел jQuery!
Несколько строк кода – и переходы по внешним ссылкам считаются нашим сервером!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// подключаем jQuery
<script src="http://code.jquery.com/jquery-latest.js"></script>
// подключаем класс для работы с base64
<script src="http://www.zavtra.com.ua/jscripts/base64.js"></script>
 
<script>
// при загрузке документа...
$(document).ready(function(){
// получить массив все ссылки, которые содержат текст "xxx.yyy" в аттрибуте href
var x= $("a[href*='xxx.yyy']");
// для каждой найденной ссылки...
jQuery.each(x, function() {
  // url - это старый адрес закодированный по Base64
  url = Base64.encode($(this).attr("href"));
  // назначаем новый аттрибут href: адрес PHP-скрипта на нашем сервере,
  // и в качестве строки запроса - полученный в прошлой строке урл
  $(this).attr("href", "http://www.zavtra.com.ua/go2un.php?" + url);
});

});
</script>

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

Share

Автор: Кирилл Павлюков \\ Метки: , , , ,

Авг 11

SEO – это Search Engine Optimization, или, говоря по-русски, оптимизация под поисковые машины. Именно этим делом я занимаюсь в последние дни и недели. В этой заметке я не расскажу ничего нового или неизвестного ранее опытному оптимизатору. Но начинающему СЕОшнику, надеюсь, эта заметка окажется полезной.
Рецепт первый – блоги
Для продвижения основного сайта я создал блог на Blogspot. Почему именно там? Почему не на своем хостинге?
Во-первых, потому что хотелось, чтобы блог и сайт висели на разных айпишниках. Где-то читал, что ссылки с сайтов, которые висят на одном айпиадресе с основным, учитываются меньше, чем с сайтов, разнесенных по разным уголкам сети.
Во-вторых, заметки с блогохостингов очень быстро попадают в поисковый индекс. Иногда – в течение нескольких минут. В то же время, если бы блог магазина был сам по себе, то пришлось бы потратить немало сил и на его продвижение, чтобы он стал регулярно посещаться ботами поисковиков.
В третьих, также роль играет то, что на блогохостинге тебя могут найти другие пользователи этой службы, стать подписчиком…
В четвертых, на блогохостингах (ЖЖ, Ли.Ру) можно создавать сообщества. Путем перелинковки блога с сообществом, сообщества с другим сообществом или основным сайтом, я надеюсь прибавить ТИЦ и ПР. Кроме того, если писать хорошо (и главное – не только рекламу товаров, а и то, что интересно пользователям) вполне реально найти постоянных читателей, и, как следствие, – посетителей основного сайта.
В общем, чем больше блогов разных и клевых – тем лучше!
Но писать надо везде только эксклюзивный контент! Если будете тупо кросс-постить одно и тоже сообщение в несколько блогов – результат если и будет, то скорее всего негативный.

Рецепт номер 2. Ссылок больше, но меньшими дозами.
Есть у меня сайт, который замечательно индексируется Гуглом. На сайте порядка 150 тысяч страниц, и если поставить сквозную ссылку – то на ссылочная масса продвигаемого сайта возрастет очень резко.
А поисковики такого не любят. Ибо как-то неестесственно смотрится, что до определенного дня на сайт было, условно, 10 ссылок, а за сутки добавилось 99990 новых… Поэтому я решил кормить Яшу и Гугля «с ложечки». Для этого пришлось написать небольшой скриптик. Вряд ли он вас устроит в том виде, в котором я его публикую здесь, но идея должна быть понятна.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?php
// в качестве идентификатора страницы, на которой будет размещена ссылка,
// используем md5-хеш строки запроса
$page = md5($_SERVER['REQUEST_URI']);
// количество ссылок, которые будут добавляться в течение дня
$maxLinksPerDay = 100;
// количество ссылок, которое будет добавляться на 1 страницу
$linksPerPage = 1;
// "клей" нужен если ссылок на странице больше 1
$glue = ', ';
// временных массив для хранения ссылок до их вывода
$linksToDisplay = array();

// Для начала проверим, имеются ли ссылки, которые уже
// добавлены на запрашиваемую страницу.
$mresult = @cms_query("SELECT `".$_CONFIG['sql_pref']."Links`.`Link`
FROM `"
.$_CONFIG['sql_pref']."LinksPages`
LEFT JOIN `"
.$_CONFIG['sql_pref']."Links` ON `".$_CONFIG['sql_pref']."Links`.`LID` = `".$_CONFIG['sql_pref']."LinksPages`.`LID`
WHERE `"
.$_CONFIG['sql_pref']."LinksPages`.Page = '{$page}'");
if (mysql_num_rows($mresult) > 0) {
    // если есть - сохраним их во временный массив
    while ($mline = mysql_fetch_object($mresult)) {
        $linksToDisplay[] = $mline->Link;
    }
} else {
    // если ссылок нет - проверим, сколько ссылок уже добавлено за сегодня
    $mresult = @cms_query("SELECT COUNT(id) AS Count FROM `".$_CONFIG['sql_pref']."LinksPages`
    WHERE Created = CURDATE() GROUP BY Created"
);
    $mline = mysql_fetch_object($mresult);
    if ($mline->Count < $maxLinksPerDay) {
        // Если меньше, чем разрешено в настройках, добавим новые
        $mresult = @cms_query("SELECT LID, Link FROM `".$_CONFIG['sql_pref']."Links`
        ORDER BY `Times_used`, RAND()
        LIMIT 0, $linksPerPage"
);
        if (mysql_num_rows($mresult) > 0) {
            while ($mline = mysql_fetch_object($mresult)) {
                $mmresult = @cms_query("INSERT INTO `".$_CONFIG['sql_pref']."LinksPages` (`Page`, `LID`, `Created`)
                    VALUES ('{$page}', '{$mline->LID}', CURDATE())"
);
                $mmresult = @cms_query("UPDATE `".$_CONFIG['sql_pref']."Links`
                    SET `Times_used` = `Times_used` + 1
                    WHERE LID = {$mline->LID}"
);
                $linksToDisplay[] = $mline->Link;
            }
        }
    }
}

// Выводим то, что насобирали :-)
if (count($linksToDisplay) > 0) echo join($glue, $linksToDisplay);

?>

Вот дамп структуры базы:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE TABLE `Links` (
`LID` int(11) NOT NULL auto_increment,
`Link` varchar(255) NOT NULL,
`Times_used` int(11) NOT NULL,
PRIMARY KEY (`LID`),
KEY `Times_used` (`Times_used`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

CREATE TABLE `LinksPages` (
`id` int(11) NOT NULL auto_increment,
`Page` varchar(64) NOT NULL,
`LID` int(11) NOT NULL,
`Created` date NOT NULL,
PRIMARY KEY (`id`),
KEY `Page` (`Page`),
KEY `Created` (`Created`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

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

Share

Автор: Кирилл Павлюков \\ Метки: , , ,

мая 14

Сегодня обнаружил замечатальную на мой взгляд вещь - Zend Framework появился в коллекции портов FreeBSD. Вернее сказать, он и раньше такм был, но присутствовал лишь в виде самой первой редакции - Zend Framework 1.0. А теперь имеется возможность установить самый последний продакшн-релиз: 1.8. 

Надеюсь, так будет и в будущем, и что следующие релизы можно будет устанавливать с помощью portupgrade.

Установка порта предельно проста:

1
2
s1# cd /usr/ports/www/zend-framework
s1# make install clean
Share

Автор: Кирилл Павлюков \\ Метки: , ,

мая 14

Есть у меня книга «FreeBSD. Подробное руководство». Покупалась она довольно давно, примерно в 2004 году, когда жесткий диск размером в 80 гигабайт считался роскошью. Книга хорошая, но на сегодняшний день морально устаревшая (Хотя, возможно, вышли ее дополненные переиздания). Одна из ее глав посвящена вопросу разбивки жесткого диска во время установки FreeBSD, а в частности – размеру создаваемых слайсов.

В 2006 году, когда я впервые устанавливал Фрю на сервер, который планировалось пустить в продакшн, по совету автора книги я оставил под корневой раздел аж 256 Мб диска… И вчера имел из-за этого проблему.

Как известно, хорошим тоном считается оставлять успешно работающие ядра системы, чтобы в случае проблем можно было загрузить машину со старого ядра. Но GENERIC-конфигурации ядер FreeBSD 7.x стали собираться с флагом отладки. А следовательно, ядро с модулями стало прибавлять раза в 3 в весе.

До вчерашнего дня наш сервер крутился на ядре 7.0, которое было собрано с отладкой и весило около 115 Мб. При попытке установить GENERIC-ядро релиза 7.2 я столкнулся с нехваткой места в корневом разделе. То есть, получается, что 2 GENERIC-ядра забивают почти все место в разделе.

Поэтому хочу предостеречь вас от подобной проблемы: отводите под корневой раздел FreeBSD не меньше 1-2 Гб. Благо, жесткие диски сейчас недорогие.

Share

Автор: Кирилл Павлюков \\ Метки:

Апр 21

В последнее время с phpMyAdmin мне стало не очень удобно работать. Хотя в интерфейсе изменений и нет, но хотелось чего-то более удобного. С этим желанием я обратился в Гугл. И нашел вот что:

dbForge Studio for MySQL

Интегрированная среда разработки баз данных для MySQL. Довольно удобный инструмент для разработки БД под Windows. С ее помощью можно управлять пользователями, таблицами, представлениями. Кроме того, с помощью этой программы вы сможете создавать, редактировать и удалять процедуры, функции, триггеры и UDFы.

Еще плюсы:

  • приятный, удобный интерфейс;
  • удобные инструменты для отладки;
  • русская версия dbForge Studio for MySQL бесплатна для частного некоммерческого использования.

Скачать можно здесь: http://www.datasoft.com.ua/projects/db_ide

wSQL-FRONT

Это не приложение, а набор скриптов для управления БД МуSQL, которые нужно устанавливать на сервер. Аналог phpMyAdmin, но с более удобным интерфейсом.

Правда, пока эта вещица умеет только отображать структуру данных и ее свойтва. Добавления и редактирование НЕТ.

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

То есть, на данном этапе развития пользы от этого продукта ждать не стоит. Но в будущем (если конечно разработчик не остановятся на достигнутом) он может свободно претендовать на роль аналога phpMyAdmin.

Поэтому я решил поддержать этот проект хотя бы ссылкой: http://wsql-front.ho.ua/

Share

Автор: Кирилл Павлюков \\ Метки: , , , ,

Апр 18

Набрел я на блог Антона Шевчука. Безумно понравилась статья jQuery для начинающих. Написано очень просто и доходчиво. Рекомендую для прочтения всем.

Еще нашел сайт Visual jQuery. Это весьма толковый визуальный справочник, который будет полезен как начинающим, так и опытным разработчикам на jQuery. Всегда полезно иметь под рукой подобную шпаргалку.

А вот статья о том, как сделать AJAX-пейджинацию с использованием Cake PHP. Хотя, ИМХО, примеры на столько понятны, что даже человек не знакомый с Cake PHP Framework сможет разобраться, о чем идет речь.

Еще один полезный сайт – JStoolbox. Здесь можно найти множество статей посвященных как jQuery, так и другим JS-библиотекам и фреймворкам. В частности, рекомендую вам статью, посвященную новому методу live(), которая появилась в jQuery 1.3.

И последняя моя находка – плагин jQuery Timers, который, как видно из названия, позволяет работать с таймерами. Мне он пригодился при написании мини-чата для админ-панели. А вообще вариантов применения может быть уйма.

Share

Автор: Кирилл Павлюков \\ Метки: , ,