Механический мир

Обращение к REST-сервисам из JavaScript

Posted by: kuroikaze85 on: 5 Ноябрь, 2009

В предыдущем посте я обещал рассказать почему я выбрал именно такой способ обращения к REST API — через прокси-скрипт. Here goes:

В JavaScript есть такая вещь как Same Origin Policy. Вкратце она означает что JavaScript в окне браузера может делать запросы только к страницам находящимся на том же домене которому принадлежит объект окна (а не файл скрипта, заметьте). Причём два окна могут обмениваться информацией только если у них совпадают домен, порт и схема (окна http не могут общаться с окнами https). Впрочем, тут есть одна лазейка. Скрипт может менять URL фреймов и самого верхнего окна, уже без ограничений по домену.
Прочтите эту запись до конца »

Общая архитектура Spore Fortress

Posted by: kuroikaze85 on: 5 Ноябрь, 2009

Вкратце посмотрим на архитектуру SF. Вот так выглядит workflow:

Процесс работы SF

Итак, нам надо получить с сервера список созданий (лучших, случайных, созданий конкретного пользователя — в данном случае не так важно). Потом мы этот список красиво показываем пользователю, он выбирает нужных существ, они преобразовываются в формат DF (нет смысла преобразовывать всех подряд), и отдаются пользователю в стандартном для DF текстовом виде.
Прочтите эту запись до конца »

Maxis Spore API

Posted by: kuroikaze85 on: 3 Ноябрь, 2009

Random Spore creature

Сейчас мы по быстрому рассмотрим Spore API, который я использую в маленьком проекте. API построена на протоколе REST, постоянно дорабатывается и развивается, и возможности его, хоть и ограничены, но довольно неплохи. Документация пока скудная и частично разбросана по форумам Maxis в ответах разработчиков компании. Вот сводка о Spore API на ProgrammableWeb.

Прочтите эту запись до конца »

При множестве мелких запросов к MySQL сам overhead запроса может занимать значительную часть времени. Например, нам нужно создать алиасы для элементов:

	$elements_result = db_query("SELECT
			`element_id` AS `id`,
			`element_name` AS `name`
		FROM `web_elements` WHERE 1");

	while ($element = db_fetch_object($elements_result)) {
		$alias = create_element_alias($element->name);
		$result = db_query("INSERT INTO `element_aliases` VALUES ('%d', '%s')", $element->id, $alias);
	}
	unset($elements_result);

На первый взгляд, обычный код. Но при большом количестве элементов выполняться он может довольно долго. Как вариант можно собирать значения в пакеты и отправлять их по 100-1000 штук. Попробуем:

Прочтите эту запись до конца »

pear.php.net is using a unsupported protocal

Posted by: kuroikaze85 on: 29 Октябрь, 2009

Некоторые инсталляции PEAR, как оказывается, получаются изначально нерабочими. На pear.php.net написано что этому подвержены PHP 5.2.9 и 5.2.10, но я столкнулся на 5.2.11. Официальное решение простое:

cd `pear config-get php_dir`
rm -r .channels
pear update-channels

Правда это удалит все дополнительные каналы, которые придётся ставить заново. Как вариант – можно скопировать сожержимое каталога .channels из рабочей инсталляции (или скачать – например тут)

#1030 – Got error -1 from storage engine

Posted by: kuroikaze85 on: 23 Октябрь, 2009

А всего то надо было – выставить innodb_force_recovery в 0. Innodb_force_recovery – режим только для восстановления данных!

Метки: ,

parser error : Input is not proper UTF-8, indicate encoding !

Posted by: kuroikaze85 on: 21 Октябрь, 2009

При использовании SimpleXML для обработки уже принятого xml может возникнуть вышеуказанная ошибка. Это значит что XML вам подсунули не первой свежести не в той кодировке. Лечится очень просто:

$data = mb_convert_encoding($data, 'UTF-8');

Для mb_convert_encoding указывать исходную кодировку необязательно.

Я с этим столкнулся когда обнаружил что Spore REST API отдаёт некоторые файлы в UTF-8, а некоторые – в UTF-16.

Метки: , ,

Состояние ‘Sending data’ в MySQL

Posted by: kuroikaze85 on: 20 Октябрь, 2009

Состояние «sending data«, которое можно увидеть в профайлере или SHOW PROCESSLIST означает что данные читаются из таблицы в процесс (а не отсылаются пользователю, как можно подумать). Взято из комментария Heikki Tuuri, одного из разработчиков MySQL. Это довольно обычное состояние при запросе, затрагивающем «тяжёлые» таблицы.

Как узнать, определена ли функция в JavaScript

Posted by: kuroikaze85 on: 16 Октябрь, 2009

	if (typeof myfunc == 'function') {
		myfunc(1,2);
	}
    

Точно так же работает для методов.

Специфичность правил в CSS

Posted by: kuroikaze85 on: 13 Октябрь, 2009

Сегодня довелось познакомиться поближе с понятием CSS specificity. Началось всё со странного (с моей точки зрения) поведения браузеров. Код был примерно таким:

Прочтите эту запись до конца »