пятница, августа 27, 2010

Brand new service - a live image widget with actual IMDB rating

We all use torrents to download movies and so on. The best rating for the movies is IMDb.com, but torrent releasers copying an IMDb rating at the moment of the post. Often issue is rating has been changed after posting (when you're looking for a movie to download).

So, I create a service to make rating in post actual. The thing is pretty simple - service will re-check movie rating on IMDb periodically and change it if needed.

Check this out: http://imdb.snick.ru

To find or add movie you should follow a few steps:
1. Find a movie on IMDB.com
2. Paste link of a movie to a search field on imdb.snick.ru frontpage
3. Examine rating and use one of export options

Example for a "Machete" (2010) movie:

среда, октября 07, 2009

Open Petition to Adobe (FP40 issue)

This is a notes on Adobe Flash Player FP-40 issue

If you'll try to create simple text input field in Adobe Flash and will type non-latin characters --- you'll fail if: you're using Linux, FreeBSD, Mac OSX, some Windows (Vista too), or swf-file was published with wmode=transparent or wmode=opaque options.

This is an known bug (know as FP-40). It was created two or more years ago in Adobe bugtracker.

Why it not fixed? I don't know. May be Adobe don't know how fix it. May be Adobe don't want fix it. Who knows? Who cares?

We care. We all spent many hours, day, week and months to find workaround for issue with no luck. There is no solution I seen! And many developers decide to switch to Java FX or Silverlight/Moonlight technologies. But it's impossible when you develop shared Flash application for posting in blogs, livejournal, facebook, myspace, etc - swf-embed support only.

So, I've started online petition to Adobe: http://www.petitiononline.com/3YUJUPHx/petition.html

This petition helps Adobe to change priority of FP40 issue and fix it faster than few years =)

If you, your friends or friend's of your friend is familiar with Flash/Flex - give link to this post, please.

Thanks a lot!

Открытая петиция к Adobe

Речь пойдет о баге FP-40 в Adobe FlashPlayer'e.

Если вы попробуете создать во флеше текстовое поле и ввести в него что-то по-русски и у вас получится, значит вам повезло и в вашей версии или сборке Windows текстовое поле нормально работает. В противном случае (некоторые Windows и любой юникс, включая OSX) вы увидите "персидскую вязь" =)

Под виндами это чаще проявляется когда флешку запускают в нестандартном режиме, который регулируется параметром wmode=transparent или wmode=opaque.

В общем, давно известный баг, года два точно, а то и больше - номер бага равен 40 =) Посмотрите на текущие номера багов в трекере Adobe =)

Беда в том, что Adobe либо не умеет исправлять это баг либо не хочет. Невозможность создавать на флеше кросс-платформенные приложения с текстовым вводом заставляет массу разработчиков извращаться со своими workaround'ами этой проблемы либо использовать другие технологии типа Java FX, Silverlight/Moonlight.

Мне это надоело и я открыл петицию к Adobe: http://www.petitiononline.com/3YUJUPHx/petition.html

Это американская система и я рассчитываю, что популярность петиции позволит Adobe ускориться в плане исправления бага. Это в наших силах.

Если у вас есть знакомые flash-разработчики или они есть у ваших знакомых - покажите им эту запись. Это здорово поможет нам всем. Хватит тратить время на исправление чужих ошибок.

вторник, февраля 10, 2009

PHP Array and Object Magic

Sometimes it will be useful to convert object to array or array to object: iterate, store, modify, etc.

It's simple with PHP5:
$myItem = array(
    "color" => "black",
    "size" => "medium",
    "pieces" => 100,
    "cost" => 44.99
);

$myItemObject = (object) $myItem;

echo "Array as object:\n";
print_r($myItemObject);
echo "\n";

$myItemArray = (array) $myItemObject;
echo "Object as array:\n";
print_r($myItemArray);

Output:
Array as object:
stdClass Object
(
[color] => black
[size] => medium
[pieces] => 100
[cost] => 44.99
)

Object as array:
Array
(
[color] => black
[size] => medium
[pieces] => 100
[cost] => 44.99
)

Be careful with protected and private class members:
class Casting
{
    public $pub = "I'm a public member";
    protected $pro = "I'm a protected from outlanders";
    private $pri = "I'm a hidden property";
}

$casting = new Casting();

print_r($casting);
print_r((array) $casting);

Output:
Casting Object
(
[pub] => I'm a public member
[pro:protected] => I'm a protected from outlanders
[pri:private] => I'm a hidden property
)
Array
(
[pub] => I'm a public member
[*pro] => I'm a protected from outlanders
[Castingpri] => I'm a hidden property
)

вторник, июля 31, 2007

Ubuntu 7.04 (Feisty): PHP installation with MSSQL

Ubuntu is a great Linux distribution, but MSSQL support is poor. There is nothing about MSSQL in apt-get or Synaptic package manager. This small HOWTO fixes problem. See HOWTO: PHP with MSSQL on Ubuntu 6.06 if you are using Ubuntu 6.06 or want to try another way to reach PHP with MSSQL.



Step 1. Get the sources and packages

You must have a php5, php5-dev, php5-src and freetds.

sudo apt-get install php5 php5-dev freetds
sudo apt-get source php5


Step 2. Building MSSQL module

Apt-get will unpack php5 sources into php5-5.x.x directory. Navigate to php5-5.x.x/ext/mssql:

sudo phpize
sudo ./configure --with-mssql
sudo make

After make you will see something like this:
...
Libraries have been installed in:
/home/snick/Software/php5-5.2.1/ext/mssql/modules
...

PHP modules located in /usr/lib/php5/20060613+lfs/ (change last directory if differs). Just copy new module:
sudo cp php5-5.2.1/ext/mssql/modules/mssql.so \
/usr/lib/php5/20060613+lfs


Step 3. Configuring PHP

Setup PHP to use new module:

sudo vim /etc/php5/conf.d/mssql.ini

Add text extension=mssql.so and save the file. Restart Apache.


Make sure that you correctly setup /etc/freetds/freetds.conf for your servers.

пятница, марта 02, 2007

JCal Pro - Russian language

Натолкнулся недавно на CMS Joomla. Симпатичная штука, задачи свои решает, обросла множеством плагинчиков и является веткой известной CMS Mambo. Понадобился мне календарь с хорошим внешним видом и с возможностью публикации событий пользователями. После нескольких дней перелопачивания всевозможных JEvents, Easy Calendar и т.п., я натолкнулся на JCal Pro.

Выглядит замечательно, функционирует нормально, но русского нет в принципе. Пара часов и этот недостаток устранен =)

Один момент: потребовался небольшой фикс самого JCal Pro. В файле JOOMLA_ROOT/components/com_jcalpro/config.inc.php есть вызов setlocale(LC_TIME, ...). Перед ним нужно добавить setlocale(LC_CTYPE, ...).

Файл с переводом (надо положить в JOOMLA_ROOT/components/com_jcalpro/languages/russian): http://www.snick.ru/jcalpro/russian_v1.5.0.1.zip

Файл с переводом и фиксом (надо положить в JOOMLA_ROOT/components/com_jcalpro): http://www.snick.ru/jcalpro/russian_with_fix_v1.5.0.1.zip

Анонс на сайте JCal Pro

UPD (en): I've moved files to GoogleCode availale at http://code.google.com/p/ru-jcalpro. As bonus - pre-encoded Windows-1251 (aka CP1251) and UTF-8 versions.

UPD (ru): Файлы теперь хостятся у гугла http://code.google.com/p/ru-jcalpro. В качестве бонуса там две версии - под виндовую CP1251 и универсальную UTF-8 кодировки.

PS: Спасибо Юре Духничу - я уж думал, что вместе со snick.ru мой перевод канул в лету =)

пятница, января 19, 2007

Кириллица и php_json

Поддержка UTF-8 в PHP весьма слабая, то же касается и кириллицы. Начав использовать javascript-библиотеку Prototype и AJAX я столкнулся с тем, что модуль php_json, который включен в PHP с версии 5.2.0 (для остальных доступен в виде extension), категорически отказывается воспринимать русский язык. Кириллица просто вырезается.

Дело в том, что php_json обрабатывает только ISO-8859-1, а остальные символы отбрасывает. Функция utf8_encode() тоже не подходит из-за того, что неправильно определяет код символа. Например, русская буква "а" имеет код \u0434, а utf8_encode() кодирует ее как \u00e4. В итоге - на странице кракозябры.

Положение спасает iconv(): iconv('cp1251', 'utf-8', $string). Преобразование корректное. Но, к сожалению, это исключает использование функции json_encode() "как есть" - придется написать свою функцию json_safe_encode() для кодирования данных в формат JSON:
function json_safe_encode($var)
{
return json_encode(json_fix_cyr($var));
}

function json_fix_cyr($var)
{
if (is_array($var)) {
$new = array();
foreach ($var as $k => $v) {
$new[json_fix_cyr($k)] = json_fix_cyr($v);
}
$var = $new;
} elseif (is_object($var)) {
$vars = get_object_vars($var);
foreach ($vars as $m => $v) {
$var->$m = json_fix_cyr($v);
}
} elseif (is_string($var)) {
$var = iconv('cp1251', 'utf-8', $var);
}
return $var;
}

PS.
На www.json.org масса полезных ссылок.

UPD 2008-02-06: $vars = get_object_vars($var); instead of $vars = get_class_vars(get_class($var));. Thanks to Pascal Martineau

понедельник, августа 21, 2006

Работа PHP4 и PHP5 на одном сервере

PHP-программисту порой требуется иметь на своем компьютере несколько версий PHP. Чаще всего это последние версии PHP4 и PHP5. Полностью переустанавливать PHP неудобно и долго - это замена файлов в системных каталогах, настройка веб-сервера и PHP.

Я расскажу об одном из способов иметь на Windows XP две версии PHP одновременно. В результате у вас будет рабочий компьютер с Apache 2, PHP4 и PHP5. Если у вас уже установлены веб-сервер Apache и обе версии PHP, то переходите к третьему шагу.

Первый шаг: Установка Apache 2.

Скачайте последнюю версию Apache 2.0. На данный момент это версия 2.0.59. Во время установки в качестве хоста укажите localhost, порт 80, электронный адрес webmaster@localhost, место для установки C:\usr\local\apache2.
Программы, которые были портированы с Linux я рекомендую устанавливать в X:\usr\local и придерживаться этого правила. Множество веб-приложений написаны с расчетом на то, что они будут работать под управлением веб-сервера на Linux или FreeBSD. Руководства по установке для таких веб-приложений написаны с учетом отличной от Windows струкруты каталогов. Вам будет проще их настраивать если структруа ваших каталогов будет близка к Linux.
Остальные настройки оставьте по-умолчанию. Убедитесь, что Apache будет установлен как сервис.

Второй шаг: Установка PHP.

Скачайте PHP4 (на данный момент 4.4.4) и PHP5 (5.2.0) в zip-архивах. Распакуйте файлы в C:\usr\local\php4 и C:\usr\local\php5 соответственно. Выполните необходимые действия по настройке PHP, описанные в install.txt, глава Manual Installation Steps.

Третий шаг: Включаем обе версии.

Идея заключается в том, что в конфигурационном файле Apache (httpd.conf) можно указать местоположения php.ini с помощью директивы PHPIniDir, а так же из httpd.conf можно загружать другие конфигурационные файлы. Эти два факта позволяют сделать два конфигурационных файла, которые будут отличаться значением LoadModule и PHPIniDir, а остальные директивы (те, которые одинаковы для PHP4 и PHP5) брать из других файлов.

Так как Apache не может загрузить модули PHP4 и PHP5 одновременно, мы сделаем два разных конфигурационных файла: httpd-php4.conf и httpd-php5.conf.

Переименуйте httpd.conf (находится в C:\usr\local\apache2\conf) в httpd-common.conf. Создайте пустой файл httpd-php4.conf и скопируйте в него:

## PHP 4 Apache configuration

#
# ServerRoot: The top of the directory tree under which the server's
# configuration, error, and log files are kept.
#
ServerRoot "C:\usr\local\apache2"

# PHP Settings
PHPIniDir "C:\usr\local\php4"
LoadModule php4_module C:\usr\local\php4\php4apache2.dll
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

# Load default Apache settings
Include conf/httpd-common.conf


Обратите внимание, что файл C:\usr\local\php4\sapi\php4apache2.dll необходимо скопировать в C:\usr\local\php4!

Теперь создайте httpd-php5.conf:

## PHP 5 Apache configuration

#
# ServerRoot: The top of the directory tree under which the server's
# configuration, error, and log files are kept.
#
ServerRoot "C:\usr\local\apache2"

# PHP Settings
PHPIniDir "C:\usr\local\php5"
LoadModule php5_module C:\usr\local\php5\php5apache2.dll
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

# Load default Apache settings
Include conf/httpd-common.conf


Закомментируйте в файле httpd-common.conf сроку с директивой ServerRoot:

...
#
# Do NOT add a slash at the end of the directory path.
#
# ServerRoot "D:/usr/local/Apache2"
...


Теперь настроим сервисы. Остановите Apache если он запущен. Сначала удалим сервис, который был добавлен во время установки веб-сервера (Пуск->Выполнить, наберите cmd, затем нажмите OK):

C:\usr\local\apache2\bin\apache.exe -k uninstall

Установка для PHP4:

С:\usr\local\apache2\bin\apache.exe -n apache2-php4 -f "C:\usr\local\apache2\conf\httpd-php4.conf" -k install

Установка для PHP5:

С:\usr\local\apache2\bin\apache.exe -n apache2-php5 -f "C:\usr\local\apache2\conf\httpd-php5.conf" -k install

Если возникли ошибки, то обратитесь к документации Apache или поищите решение в Google.

Проверим установку. Создайте файл C:\usr\local\apache2\htdocs\info.php:

<?php

phpinfo();

?>


Запустите Apache с PHP4:

net start apache2-php4

Откройте свой браузер и наберите http://localhost/info.php. Вверху сраницы вы увидете текст PHP Version 4.x.x. Теперь запустите Apache c PHP5:

net stop apache2-php4
net start apache2-php5


Обновите страницу в браузере. Вверху сраницы вы увидете текст PHP Version 5.x.x. Вы можете переключаться между версиями вручную либо создать файлы для быстрого переключения.

start-php4.cmd:

net stop apache2-php5
net start apache2-php4


start-php5.cmd:

net stop apache2-php4
net start apache2-php5



Заключение.

С помощью этого метода можно иметь несколько версий Apache и несколько версий PHP в различных комбинациях. Для того, чтобы PHP4 и PHP5 работали одновременно, потребуется сделать копию веб-сервера, например, в C:\usr\local\apache2_another и настройить его на другой IP или порт.