Проблемы с установкой iMagick на FreeBSD

Устанавливал расширения к php.
Установил GD, установил imagick из портов.

Оказалось, что iMagick использует старую версию библиотеки JPEG.

Fatal error: Uncaught exception ‘ImagickException’ with message ‘Wrong JPEG library version: library is 70, caller expects 62

Сначала рыл инет на эту тему, поставил portmaster, обновил JPEG и все зависимые либы

1
portmaster -dRrf jpeg-7

Не помогло Оо.

Решил обновить само pecl’овское расширение imagick.

Скачал imagick 2.3.0, установил по инструкции.

1
2
3
4
5
6
7
8
wget http://pecl.php.net/get/imagick-2.3.0.tgz
tar -xzf imagick-2.3.0.tgz
cd imagick-2.3.0
phpize
./configure
make
make install
echo "extension=imagick.so" >> /usr/local/etc/php/extensions.ini

Теперь у нас выскакивает проблема:

Fatal error: Uncaught exception ‘ImagickException’ with message ‘Wand contains no images `MagickWand-1′ @ magick-image.c/MagickSetImageFilename/9326′ in …

Хорошо, переустанавливаем ImageMagick!

Заходим сюда: http://www.imagemagick.org/script/install-source.php#unix, тащим последнюю сборку и устанавливаем себе.

1
2
3
4
5
6
wget ftp://ftp.imagemagick.org/pub/ImageMagick/ImageMagick.tar.gz
tar -xzf ImageMagick.tar.gz
cd ImageMagick-6.5.6-2
./configure
make
make install

Рестартим апач и ура!

FreeBSD 7.2 64 bit.


21.09.2009

Тэги: , , ,

Комментарии19 Есть что сказать?

Апалка объявлений на кубань.ру

Всем колхозникам посвящается.

Попросили меня как-то подать объявления на форум местный, но темы там быстро уходят в /dev/null и их постоянно надо апать, чтобы у людей мелькало перед глазами.

Руками заходить каждые несколько минут и писать «up!» — это не для нас, ведь?

Отличный повод заюзать DudeCurl, подумал я :) (дуд, с тебя 1000$, постпроплачен ^_^)

Вобщем, подключаем всеми нами любимый дуд курл, заводим тестовый файл с ID топика на каждой строчке, пишем пару строк кода и ставим на крон.

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
// подключаем дуд курл
include_once(dirname(__FILE__) . '/DudeCurl.php');
// считываем ID-ы топиков
$topics = file(dirname(__FILE__) . '/topics.txt');

// ваши авторизационные данные
$login = 'login';
$password = 'password';

// урл страницы форма (надо, чтобы вытащить некий «kodun» для авторизации)
$url = 'http://forums.kuban.ru/forum/index.php';
// урл авторизации
$login_url = 'http://forums.kuban.ru/forum/login_new.php';
// урл постинга
$post_url = 'http://forums.kuban.ru/forum/posting_new.php?page=1';

// пошли по всем топикам
foreach ($topics as $topic_id) {
    $topic_id = intval(trim($topic_id));

    // если еще не авторизовались, то делаем это
    if (!isset($curl)) {
        $curl = new DudeCurl($url);
        $html = $curl->exec();
   
        preg_match('#kodun" type="hidden" value="(.*?)"#i', $html, $m);
        if (!isset($m[1])) { die('can\'t find kodun :('); }
        $kodun = $m[1];
       
        $auth = array("username"=>$login,"password"=>$password, "kodun"=>$kodun);
   
        $curl->init($login_url);
        $curl->post = $auth;
        $curl->exec();
    }
   
    // постим сообщение
    $data = array("visible_mail"=>'OFF', "message"=>'up!', "kodun"=>$kodun, "add_post"=>$topic_id);
    $curl->init($post_url);
    $curl->post = $data;
    $curl->exec();
   
    // эту тему мы апнули
    print 'http://forums.kuban.ru/forum/viewtopic_new.php?t=' . $topic_id . '<br />';
   
    // т.к. на этом мегафоруме стоит антифлуд, то мы немного посмпим
    sleep(rand(35,40));
}

Исходнички + DudeCurl 0.2.5 Beta

Всем кубаньрушникам привет! :)


11.09.2009

Тэги: , , ,

Комментарии12 Есть что сказать?

Рейтинг игроков, рейтинг Эло. Немного математика есть в каждом Оо

Ссылка на официальный ман по рейтингу эло — Рейтинг Эло.

Применим на практике?

Допустим, у нас 2 команды с рейтингами:

1
2
$rating_a = 800;
$rating_b = 500;

Расчитаем вероятность победы первой команды:

1
$e = 1/(1+pow(10, ($rating_b-$rating_a)/400));

Дальше опишу простую функцию для расчета коэффициена, необходимого для участия в финальном рейтинге:

1
2
3
4
5
6
7
8
9
10
11
12
function EloK($rating)
{
    if ($rating >= 2400) {
        return(10);
    }
    elseif ($rating >= 1000) {
        return(15);
    }
    else {
        return(25);
    }
}

Простая хуйня, иллюстрирующая, что значение равно 10 для сильнейших команд (рейтинг от 2400), 15 — для команд с рейтингом меньше чем 2400 и 25 — для новичков.

Ну и получим новый рейтинг по самой формуле:

1
2
3
4
5
6
$new_rating_a = $rating_a + EloK($rating_a) * (1 - $e);
$new_rating_b = $rating_b + EloK($rating_b) * (0 - (1-$e));

print $new_rating_a;
print ' / ';
print $new_rating_b;

Результат:

803.77448893 / 496.22551107

Вот такие пироги. Да, будет введено на Live-CS…


05.09.2009

Тэги: , , ,

Комментарии12 Есть что сказать?

Создание юзербаров с помощью php и Imagick

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

Здесь опишу способ создание юзербаров для пользователей всемирно любимой пыхи.

Для начала возьмем фон для юзербара, любезно предоставленный нашим почетным пользователем Frozzeg (и мною немного дополненный):
bg

Как Вы уже догадались, в правой части будем вписывать имя пользователя, которое мы будем передавать скрипту GET’ом (например, bar.php?user=md5). Ну и так как мы модные типочки — будем их кешировать следующим образом:

1
2
3
4
5
6
7
8
9
$text = isset($_GET['user']) ? urldecode($_GET['user']) : '';

$cache_file = dirname(__FILE__) . '/cache/' . md5($text) . '.gif';

if (file_exists($cache_file)) {
    header("Content-Type: image/gif");
    print file_get_contents($cache_file);
    exit;
}

Итак, сама отрисовка юзербара. Сначала мы будем накладывать текст-тень (на 1 пиксель ниже и правее текста), а затем сверху сам текст.

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
// Возьмем какой-нибудь шрифт (у нас это Candara Bold)
$font = dirname(__FILE__) . '/candara.ttf';
$bg = dirname(__FILE__) . '/bg.gif';

// установим цвет текста и тени
$font_color = '#666666';
$shadow_color = '#fefefe';

// создаем объект
$im = new Imagick($bg);

// рисуем тень
$draw = new ImagickDraw();
$draw->setFont($font);
$draw->setFontSize(12);
$draw->setFillColor(new ImagickPixel($shadow_color));
$draw->annotation(258, 14, $text);
$im->drawImage($draw);

// рисуем текст (на пиксель выши и левее тени)
$draw = new ImagickDraw();
$draw->setFont($font);
$draw->setFontSize(12);
$draw->setFillColor(new ImagickPixel($font_color));
$draw->annotation(257, 13, $text);
$im->drawImage($draw);
$draw->destroy();

// записываем в кеш и выводим
$im->setImageFormat('gif');
$im->writeImage($cache_file);

header("Content-Type: image/gif");
print $im;

$im->destroy();

Результат работы (bar.php?user=md5):
barphp


18.08.2009

Тэги: , ,

Комментарии18 Есть что сказать?

Капча (captcha) на php под Imagick

В связи с мистическими событиями, все GD скрипты приходится переписывать под Imagick.

Самое интересное, в сети практически не найти ни нормальной документации по нему, ни примеров (особенно на русском, но нам впринципе пох). Поэтому выложу свою капчу, которая использует простой алгоритм MultiSwirl, описанный на сайте captcha.ru.

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
// Это строка, которую мы будем рисовать на изображении
$str = rand(1000, 999999);
$_SESSION['captcha'] = $str;

/*
** Здесь можно указать путь к своему шрифту
** $font = dirname(__FILE__) . '/MyriadPro-Bold.otf';
*/


/*
** Задаем углы закручивания
** и сдвиг, относительно центра перед закручиванием
*/

$corner1 = rand(30,50);
$corner2 = rand(30,50);
$roll = rand(20, 50);


// Создаем объект
$image = new Imagick();
$draw = new ImagickDraw();  
$image->newImage(150, 50, new ImagickPixel('#ffffff'));  

/*
** Если используем свой шрифт, передаем его в ImageDraw
** $draw->setFont($font);  
*/


// Задаем размер шрифта
$draw->setFontSize(40);  
// Накладываем нашу надпись
$image->annotateImage($draw, 10, 40, 0, $str);

Далее пошло уже закручивание изображения: сначала в одну сторону, потом в другую.

1
2
3
4
5
6
// Двигаем изображение и закручиваем его
$image->rollImage($roll,0);
$image->swirlImage(-$corner1);
$image->rollImage(-$roll*2,0);
$image->swirlImage($corner2);
$image->rollImage($roll,0);

Ну и собственно, выдача:

1
2
3
$image->setImageFormat('png');  
header('Content-type: image/png');  
echo $image;

Как это выглядит:
captchaphp

Что можно еще:
1. поиграться с углами
2. поставить пизданутый шрифт
3. уменьшить межбуквенный интервал
4. выводить не только цифры
5. Добавить несколько полос и также свирлом вместе с символами


18.08.2009

Тэги: , , ,

Комментарии4 Есть что сказать?
Страница 1 из 212