neudor

log

Entries Comments



Category: PHP

Всё просто отлично

6 December, 2008 (01:13) | PHP | By: neudor

Ничто не поднимает настроение так, как бегущие вверх цифры баланса на аккаунте партнёрки. А особенно, когда за один день зарабатываешь столько же, сколько за предыдущую неделю. Кажется, в своих бесконечных попытках и начинаниях я всё-таки нашёл золотую жилу. Самое приятное в том, что разработку её (жилы) можно автоматизировать. Ну всё, пойду фигачить свою мега-лопату.
Приходите через месяцок — очень вероятно, что я её буду продавать!

Ух! Как же отлично, когда всё отлично!

Автоматическая регистрация google-акаунтов

7 November, 2008 (17:36) | PHP | By: neudor

Иногда сидишь и думаешь – как было бы хорошо… И только капча нам мешает. Что же делать? Накодить тулзу, которая будет автоматом регить список ников, аяксом выдавая капчу на ввод. Процесс кодинга уже начат.

Скоро всё будет.

Конвертация дерева в nested sets

9 October, 2008 (11:17) | PHP | By: neudor

Я кодю кое-чего крупное на CakePHP. Ну то есть код с нуля, а базы кое-какие остались от прошлой системы. И есть в этих базах дерево категорий. Обычное иерархическое дерево, где у каждого элемента есть parent_id:

id	name		parent_id

1	first		0
2	second		0
3	third		1

Случилось так, что в CakePHP есть встроенный функционал для работы с деревьями, но работает он только для структур вида nested sets. Что это такое довольно хорошо описано здесь.

Итак, на данном этапе сформировалась задача перевести существующее дерево к виду nested sets, а это значит у каждой записи в таблице проставить значения left и right. Гуглению было посвящено около часа. Сплошные вопросы, и ни одного работающего решения. Собственно такое положение и явилось причиной, по которой я выкладываю свою функцию. Вникайте.

$table = 'categories';
$number=1;

make_nested(0);

function make_nested($parent_id = 0) {
    global $db, $table, $number;
    $c = $db->selectCell("SELECT COUNT(*) from ".$table." \
    where parent_id=".$parent_id."");
    for($i=0; $i< $c; $i++) {
        $newrow = $db->selectRow("SELECT * FROM ".$table." \
        where parent_id=".$parent_id." order by sort, id \
        LIMIT $i, 1");

        $db->query("UPDATE `".$table."` SET lft=".$number." \
        WHERE id=".$newrow['id']."");
        $number++;

        make_nested($newrow['id']);

        $db->query("UPDATE `".$table."` SET rght=".$number." \
        WHERE id=".$newrow['id']."");
        $number++;
    }
}

Собственно функция — это как бы тот самый “червячок”, обходящий все вершины против часовой и размечающий их. Ничего сложного. Пользуйтесь и радуйтесь!

Генератор строк по маске

6 September, 2008 (21:37) | PHP | By: neudor

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

function randomString($mask) {
    $null = 'e u i o a y';
    $one = 'q w r t p s d f g h j k l z x c v b n m';
    $full = 'e u i o a y q w r t p s d f g h j k l z x c v b n m';

    $null = explode(" ", $null);
    $one = explode(" ", $one);
    $full = explode(" ", $full);

    $out = "";
    for($i=0; $i<strlen($mask); $i++) {
        switch($mask{$i}) {
            case '0': {
                $out .= $null[rand(0, count($null)-1)];
                break;
            }
            case '1': {
                $out .= $one[rand(0, count($one)-1)];
                break;
            }
            case '?': {
                $out .= $full[rand(0, count($full)-1)];
                break;
            }
        }
    }

    return $out;
}

$str = randomString("01??01");

Если кто не понял, рандомность строки рандомна не совсем. Просто задаётся маска из гласных и согласных букв.
0 – гласная
1 – согласная
? – любая буква

Получается не то чтобы прям уж благозвучие, но вполне похоже на чей-то ник. Как это нам пригодится? Следите за публикациями!

Умный поиск в гугле

5 September, 2008 (11:53) | PHP, seo | By: neudor

Сегодня после обеда в качестве отвлечения от кодинга больших скриптов решил наваять кое-чего небольшое, то, что мне всегда нехватало.

Вам никода не хотелось заняться сбором в гугле толстых сайтов? Чтоб указываешь запрос, указываешь порог PR, а скрипт парсит выдачу и собирает подходящие по весу ссылки? Применений у этой штуки может быть много, но я для себя определил одно — сбор жирных страниц, на которые разрешён trackback. Проще говоря, много толстых халявных бэков,по которым можно спамить. И к вам тоже начнуть заглядывать посетители. Крутота?

Не буду долго томить — всю эту красоту уже можно качать. Всё свободно и бесплатно.

Схема работы предельно проста. В начале скрипта есть три конфигурационные переменные, отвечающие за запрос к гуглу (я использовал “TrackBack URI -intitle:trackback -intitle:uri”), минимальное значение PR, с которым искать ссылки и количество ссылок, которые нужно найти. Скрипт собственно парсит выдачу и затем смотрит PR страниц. Дальше 50 страниц выдачи не опускается, ибо страшно =). Нужные результаты сохраняет. Можно потом смотреть в файле. Вот вам, например, список толстых страниц, у которых указан Trackback URI:

7 : http://wordpress.org/development/2008/05/birthday-party/
6 : http://www.arnebrachhold.de/projects/wordpress-plugins/google-xml-sitemaps-generator/
5 : http://the-notebook.org/12/01/2006/openid-comments-for-wordpress/
5 : http://www.pinktentacle.com/2008/06/21-leaf-clover/
5 : http://www.isoc-ny.org/?p=214
5 : http://segala.com/blog/emerging-technology-presentation-on-powder/
5 : http://content.ksg.harvard.edu/blog/jeff_frankels_weblog/2008/05/12/white-house-confidence-that-us-is-not-in-recession-is-misplaced/
5 : http://scobleizer.com/2007/12/12/first-look-semantic-web-app-twine/
6 : http://www.alternet.org/rights/87665/
5 : http://www.der-prinz.com/2008/01/20/wordpress-magazine-style-theme-branfordmagazine/

Собственно всё волшебство заключено в строке запроса, с которой нужно играться и искать ту золотую жилу, которая принесёт максимально релевантные ссылки.

Сейчас подумал, что логично было бы проводить ещё и поиск на сайтах, где уже нашлись подходящие ссылки. Но сейчас большой надобности нет. Если народ откликнется — напишу.
А ещё можно парсить страницу и смотреть ставится ли в каментах nofollow. Информацию об этом тоже включать в отчёт.

Короче много чего ещё можно. Но где бы время на всё это взять?

Анализатор кода

4 September, 2008 (08:51) | PHP | By: neudor

Последние два дня насиловал гугл запросами о том, как можно проанализировать структуру php проекта. Гугл же упорно отказывался понимать, что я хочу, а предложенный им Eclipse оказался здоровенной монстрятиной. И вот сегодня я достучался до него!

http://phpxref.sourceforge.net/

Что оно умеет? Скармливаем ему каталог с php скриптом, а он пробегает по файлам, записывает себе информацию о переменных, функциях, классах и константах — где определены, откуда и сколько раз вызываются. Всё это выдаётся в виде статичного хтмл. Очень удобная штука. Лично для меня главных применений два: выдирать куски кода для standalone функционирования и анализировать чужой код на наличие багов и уязвимостей.

Уникализация контента. Перевод на английский и обратно.

30 July, 2008 (14:29) | PHP, Splog | By: neudor

Итак, будем переводить тексты. Поскольку инструмент в предыдущем посте довольно бесполезен сам по себе, необходимо накатать скрипт. Но для начала скажу ещё об одном способе перевода.

Это Yahoo pipes. Я накатал простейшую трубу для перевода текста с русского на английский и обратно. И всё бы хорошо, но есть две проблемы. Первая — при переводе яху тупо убирает все html теги. И как их восстанавливать — это отдельный вопрос. Я бы даже сказал, нетривиальная задача. Ну и второе — модуль перевода иногда бывает банально не работает. Я нашёл жалобы в саппорт по этому поводу на форуме про yahoo pipes, и вроде всё починили. Но у меня всё равно из 10 запусков трубы в разное время суток нерезультативными оказываются примерно 6.

Подводя итог можно сказать, что yahoo pipes — это хороший и быстрый инструмент, но я его не использую. Может вам повезёт больше, а для меня очень критично наличие тегов и стабильная работа сервиса.

Подходим ко второму способу — через AJAX API от гугла. Собственно скрипт. Я там в самом начале оставил set_time_limit(5) для отладки. Это чтоб сначала всё хорошо проеврить, а уже потом запускать на сутки (ну или у кого как), убирая ограничения set_time_limit(0).

И есть ещё две тонкости, без которых скрипт работать не будет. Во-первых, предполагается что все входные и выходные строки будут в юникоде. Так что если будете редактировать, убедитесь что ваш редактор умеет сохранять в UTF-8 (я юзаю notepad++). И второе — для работы с БД вам понадобится библиотека dbsimple. Ну, то есть я её использую, а вы вполне можете приспособить все её вызовы под свои нужды. Там всё просто и прозрачно.

У гугловского API есть одно существенное ограничение — это длина строки, которую вы будете переводить. Вроде как она составляет 700 символов, но иногда вываливаются ошибки при запросе на перевод строки в 600 символов, а иногда нормально проходят строки по 690 символов. Закономерность явлений установить не удалось. Опытным путём установлено, что всё железно работает при длине строки до 545 символов. На ней я и остановился.

Основная функция в скрипте — это string translate(string $src, string $langpair).
string $src — это строка для перевода (строка в полную длину)
string $langpair — это языковая пара перевода. Например, “ru%7Cen”. Именно в таком виде, поскольку эта строка подставляется без изменений в url запрос.

Ну и вот. Строка переводится один раз туда, а второй раз — обратно. Скрипт мал, изящен, открыт и даже как-то там прокомментирован. Любые изменения и дополнения приветствуются.

В достоинствах скрипта то, что мне так необходимо. Это надёжность и сохранение тегов. Но вот время выполнения оставляет желать лучшего. Хотя я не пробовал запускать его на хостинге — только дома на локалхосте, на не очень толстой выделенке.

P.S. Для себя в процессе написания скрипта выделил одну вещь. Уникализация контента путём превращения его в нечто нечитаемое — это не труъ. Гораздо лучше фигачить мешапы. =)

Класс для работы с RSS

26 June, 2008 (13:18) | PHP | By: neudor

Делюсь, так сказать.
lastrss

Творение не моё, но меня полностью устраивает.