Home

Заметки нетакогоужтупого программиста

Корея / сова

Возвращаясь сегодня из лабы, обнаружил, что на нашем этаже поселилась сова =)

Read more... )

Корея / такие дела

Проспал завтрак и обед.
Эти дни
С утра льет дождь...

http://alexpak.name/ru/news/?id=185


музей клонов?

Кредит-стандарт бай Eravarnvs.rnNomos Bank бай ArtLebedev

http://alexpak.name/ru/news/?id=184


анти-спам

Honey-pots в виде лишних элементов форм не работают.. уменьшают количество спама, но не фильтруют на 100% =( Проверено на этом блоге.. Все таки CAPTCHA гораздо эффективнее, но прикручивать лень :-/

http://alexpak.name/ru/news/?id=183


PHP, foreach и reference

Угадайте с одного раза, что выведет следующий скрипт:rn
rn<?phprn$a = array('a', 'b', 'c');rnforeach ($a as &$e) {};rnforeach ($a as $e) {rn    echo ' ' . $e;rn};rn?>rn
rnЕсли вы думаете, что "a b c", вынужден вас огорчить, будет - "a b b" =)rnПричину этого можно проследить на следующем примере:rn
rn<?phprn$a = array('a', 'b', 'c', 'd', 'e');rnforeach ($a as &$e) {};rnforeach ($a as $e) {rn    echo $e;rn    print_r($a);rn};rn?>
rnКак видите - после первого цикла в переменной $e осталась ссылка на последний элемент массива $a, поэтому во время второго цикла по адресу $e записываются элементы массива $a, а в последнец итерации там остается предпоследний элемент..rnХотел уже на радостях постить баг, но оказалось это богус еще с 5.0.1rnЧтобы избавиться от этой проблемы достаточно сделать unset($e) после первого цикла.

http://alexpak.name/ru/news/?id=182


аналогично

http://simanyay.livejournal.com/199634.html

http://alexpak.name/ru/news/?id=180


i = ++i + ++i

НавеяноrnrnPHP:rn<?phprn$i = 5;rn$i = ++$i + ++$i;rnecho $i; // 13rn?>rnrnJS:rnvar i = 5;rni = ++i + ++i;rnalert(i); // 13rnrnMySQL:rnrnmysql> set @i = 5;rnQuery OK, 0 rows affected (0.00 sec)rnrnmysql> select @i := ++@i +++@i;rn+------------------+rn| @i := ++@i +++@i |rn+------------------+rn| 10 |rn+------------------+rn1 row in set (0.00 sec)

http://alexpak.name/ru/news/?id=179


предзащита..

не.. ну такого подвоха, как "а почему MySQL вы не сами написали? скачали из интернета что ли?" я не ожидал..

http://alexpak.name/ru/news/?id=178


диплом

Pearls before swinernОригинал от 22.04.2007rnОригинальный перевод

http://alexpak.name/ru/news/?id=177


^..^

разодрала туалетную бумагу
играет с фисташками
пытается закопать блюдце с кефиром (в линолиум)
жрет только китикет, со всем остальным играет
царапаетсо..

http://www.alex.erava.com/ru/news/?id=176


мяу

На неделе, наконец, обзавелся телефоном и кошкой.
cat
Кошке нужно выбрать имя, хотелось бы что-нибудь компьютерное..
Предложения поступили следующие:
1. Миранда, сокращенно Мира
2. Аська
3. Пэрис Хилтон
4. Иннеса Юрьевна (с какого-то сайта)
5. Что это за пидор сзади?

Принимаю варианты =)

http://www.alex.erava.com/ru/news/?id=175


Объекты vs. Хеши

Кому как больше нра?


$Config->load($PTH['configs'] . 'site.ini', 'CNF');
$db = Database::instance(
$CNF['database']['host'],
$CNF['database']['user'],
$CNF['database']['pass'],
$CNF['database']['name'],
'0111'
);

или

$Config->load($PTH['configs'] . 'site.ini', 'CNF');
$db = Database::instance(
$Config->CNF->database->host,
$Config->CNF->database->user,
$Config->CNF->database->pass,
$Config->CNF->database->name,
'0111'
);

http://www.alex.erava.com/ru/news/?id=174


PHP и переменные

Ночью не хочется работать.. хотя надо.. открываю редактор и эксперементирую всякой ерундой..
В начале выдержка из мануала:

Basics

Variables in PHP are represented by a dollar sign followed by the name of the variable. The variable name is case-sensitive.

Variable names follow the same rules as other labels in PHP. A valid variable name starts with a letter or underscore, followed by any number of letters, numbers, or underscores. As a regular expression, it would be expressed thus: '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'

Note: For our purposes here, a letter is a-z, A-Z, and the ASCII characters from 127 through 255 (0x7f-0xff).


1. Переменная транслируется сама в себя..:
Для начала, что-нибудь простое..
<?php
$a = 'a';
echo $$a; // 'a'
echo $$$$a; // 'a'
echo $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$a; // 'a'
?>


2. Переменная c именем - цифрой:
В мануале сказано, что имя переменной должно начинаться с буквы? Вам наврали =)
<?php
$a = '1';
$$a = 'one';
echo ${1}; // 'one'
?>


3. Переменная без имени =)
Ну, и гвоздь нашей программы - переменная без имени:

<?php
$a = '';
$$a = ':)';
echo $${''}; // ':)'
?>


или так:

<?php
$a = null;
$$a = ':)';
echo ${null}; // ':)'
?>


Не верьте мануалам ;)

http://www.alex.erava.com/ru/news/?id=173


PHP сюрпризы / NULL

is_scalar(NULL) == false

http://www.alex.erava.com/ru/news/?id=171


экспромт 2 / скроллинг

Курумизава попросил сделать скользящий контент при выборе пунктов меню.. ушел в общей сложности час.

PS: кстати, ссылки кликабельны, открываются в новом окне тоже

http://www.alex.erava.com/ru/news/?id=170


js/задачка..

Даны два элемента списка (<LI>), как узнать который из них выше (левее/первее) наиболее простым способом?

http://www.alex.erava.com/ru/news/?id=169


Обработка PUT/DELETE и т.п. запросов в PHP

Возьмем модную архитектуру построения веб-сервисов REST и попробуем построить серверную часть на PHP.
И тут сразу же облом - PHP пока что не умеет обрабатывать другие запросы помимо POST и GET, поэтому PUT, DELETE и остальные (о которых я впервые услышал) идут лесом. Этот факт сразу же дал мне повод плюнуть в сторону RESTа и поглядывать на XML-RPC, SOAP и другие способы взаимодействия веб-сервисов, однако потом подумалось "чем мы хуже рельсов", если рельсы могут - то и мы запросто. Открываю любимый зенд и начинаю эксперементировать.

Эксперимент 1. Отправка PUT запроса.
Для начала нужно отправить этот самый PUT запрос. Проблема #1 - не только PHP не умеет принимать PUT, но и браузеры не умеют его отсылать (за исключением всяких вымерших монстров, типа нетскейпа.. и то не уверен), поэтому поставить в форме method="PUT" не получится, она все равно отошлет GET запрос. Но не для того же мы используем REST, чтобы принимать данные из формы простым сабмитом. Поэтому отправляем PUT запрос через XHR, при этом данные посылаем также как и в случае с POST запросом, а метод при этом ставим PUT.

XHR.open('PUT', '/path/to/api', true);
XHR.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
XHR.send(data);

XHR - думаю, понятно, что это XMLHttpRequest объект (или ActiveX компонент в ИЕ).

На принимающей стороне выводим следующие переменные:

print_r($_REQUEST, 1);
print_r($_SERVER, 1);

при этом наших данных нет, зато $_SERVER['REQUEST_METHOD'] = 'PUT'.. уже кое-что.. но куда подевались данные? Я их честно пытался найти в переменной $_SERVER, однако там содержатся данные только по серверным переменным и полученным заголовкам.

Эксперимент 2. Ищем данные.
В принципе данные оказалось найти несложно, они ведь посылаются в теле запроса, а не в заголовках. Следовательно, нужно открыть входящий поток и оттуда получить данные. Побродив, по php.net нахожу этот входящий поток: php://input называется.
Пробуем:

if ($put = fopen('php://input', "r")) {
while (!feof($put)) {
$data = fgets($put, 1024);
}
fclose('php://input');
} else {
echo 'nope';
}

Получаем что-то вроде: a=1&b=2, что нам и требовалось получить.. теперь используем магическую функцию parse_str и кладем данные в массив $_PUT, а также присоединяем к $_REQUEST. Единственная проблема заключается в том, что массив $_PUT не будет суперглобальным, однако, это уже не такая большая помеха.
В итоге получаем код:

$_PUT = array();
if ($put = fopen('php://input', "r")) {
while (!feof($put)) {
$data = fgets($put, 1024);
}
fclose('php://input');
parse_str($data, $_PUT);
$_REQUEST += $_PUT;
}


Осталось добавить свитч (или еще как-нибудь) на $_SERVER['REQUEST_METHOD'] и добавить обработку DELETE, HEAD, OPTIONS etc. запросов. Спасибо за внимание.
PS: с терминологией у меня неважно, прошу простить, если допустил ошибки и указать в комментах.. буду исправляться.

http://www.alex.erava.com/ru/news/?id=167


Ищу PHP-разработчиков

Требуются 2 PHP программиста для участия в оплачиваемом проекте.
Условие работы: в офисе или удаленно - на выбор (но в Ташкенте).
Требование к кандидатам:
- знать следующие слова и словосочетания: intranet, framework, MVC, API, AJAX, DOM, шаблонизатор, кеширование, командная разработка, спиральная модель..
- стойко переносить следующие реплики: "поиграйте со шрифтами", "эту надпись надо сделать кликабельной" и т.д.
Вопрос об оплате решается следующим образом: по результату собеседования выясняется роль в проекте и определяется оплата.
Заинтересованным стучать в ICQ: 244849584, кидать CV на irokez@gmail.com

http://www.alex.erava.com/ru/news/?id=166


PHP framework

Кто какой посоветует/не посоветует?

http://www.alex.erava.com/ru/news/?id=165


утро

morning
Встретили Куру

http://www.alex.erava.com/ru/news/?id=164