2010/12/28

Денвер для Линукс

Зачекаутил дед свн-ку - притянулась репка большая-пребольшая...
Опосля стал дед репку комитить: комитит-комитит, не может смёрджить. Позвал дед на помощь бабку-тимлида. Бабка за дедку, дедка в репку: мёрджат-комитят, вымёрджить не могут.
Позвала бабка внучку-практикантку. А Внучка что может сказать? Она этого свна не нюхала ещё, совсем зелёная. Спряталась за бабку, бабка за дедку, дедка снова за репку: стирают-переписывают, не могут закомитить.
Кликнула внучка Жучку из соседнего отдела. Жучка давай отпираться, мол, не трогали мы вашу репку, нафиг оно нам сдалось, у нас у самих недавно новый свн запилили, потому что в старом бардак, до сих не разобрались.
Кликнула Жучка кошку Машку в свидетели. А что Машка? Машка две недели в отпуске была и ничего ни за какие репы не знает.
Кликнула Машка мышку-файтера... Извините, это из другой сказки.
Кликнула Машка мышку-менеджера, потому что дело к вечеру и никого вообще не осталось, только дизайнеры укуреные чертей гоняют, но с них спрос маленький, а позвать кого-то надо, потому что ну ваааще край!
А сколько мышку ни кликай, она всё равно в угол смотрит. Потому что она только что от дизайнеров, а у них там ха-ра-шоооо =;) Они все хором давай её врубать в тему, что, мол, мы эту репку качнули, потом комитить надо, свн говорит: мёрдж! ну мы согласные, конечно, а он в отказ: не могу мёрдж, потому что какая-то скотина комитнула раньше, а кто это был уже ни разу не понятно. Мышка в это дело, понятно, не врубается, но откуда-то из нирваны им отвечает: апдейтнитесь, чуваки, полегчает =;)
Пипл удивился, но апдейтнулся. Потом мигом копию резервную сверху накатил и пошёл комит! Вытянули репку!


Это был эпиграф. С середины меня немного занесло, признаю. Но пост из одной строки про страшное вуду мод_реврайта вроде бы и не пост.
Сегодняшнее вуду я назвал "денвер для линукса". Лежит здесь http://code.google.com/p/angry/source/browse/#svn%2Ftags%2FDenwer4Linux
Ясно, что никакой это не денвер, это .htaccess, который ищет субдомены по подкаталогам. Без участия скриптового "роутера".
Однажды мне стало совсем лень на каждый тестовый проект заводить отдельный вхост и перегружать апач - в результате получилось это. Можно использовать как на виндовс, так и на линукс, не требует изменения hosts, желательны вайлдкард-настройки днс и апача. И не используйте это на продакшене. Хотя у меня оно трудится не только на девелоперской машине, но и на домашнем серверочке и на внешнем вдс. Сама сборка старая и многократно обкатанная, просто выложил только сейчас.

энжой!
=;)

зы: использование представленных скриптов исключительно на ваш страх и риск

2010/12/24

PostgreSQL, PL/PHP, Debian

Как всем известно (обожаю этот оборот ;) ), PostgreSQL - самая мощная из ныне существующих свободнораспространяемых баз данных...

Попробуем другое вступление. Всё началось когда, собирая хоть сколько-нибудь рабочий вариант web-API Storage::ETC, дело подошло к середине. Выяснилось, что замечательные функции _delete() и _update() на PL/PGSQL, написанные некоторое время назад, взлетать не хотят и сыпят ошибками. После некоторых сомнений они были заменены в коде на аналогичные обычные запросы, но осадочек остался. И тут я вспомнил про PL\PHP!

Скачать его можно запросто с командпромпта https://public.commandprompt.com/projects/plphp/wiki
Посмотрев в суперинформативные доки, можно обнаружить известные рекомендации: ./configure && make && make install
Вы могли догадаться по ходу сюжета, что сейчас появятся грабли. Пожалуйста:

Грабли раз. Первое сообщение говорит, что для плпхп нужен PHP SAPI embed. То есть, идём на php.net/downloads, качаем, компилим.
Полуграбли два: необходимо вовремя вспомнить, что мы крутые веб-разработчики, и Server API Apache Handler у нас уже поставлен, а пых работает только с одним апи. Следовательно, необходимо компилить отдельную копию.

Минимально необходимые опции ./configure --enable-embed --prefix=~/php-embed - префикс определяет тот каталог, куда будет ставится копия. Капитан Очевидность подсказывает, что лучше было б ставить в /usr/local, но этот пилотаж для бородатых одминов; если голова холодна - sudo вам в твёрдые руки.

Так как мы крутые веб-разрабы, то опции вроде --enable-libxml --with-pcre-regex --with-curl --with-xsl кажутся естественными. По той же самой причине у нас не стоят *-dev пакеты, которые предоставляют эти библиотеки. Их придётся ставить. Более-менее полный перечень граблей по ссылке >> http://vijaylad.com/?p=42 Почти все библиотеки в *buntu ставятся в через apt-get install lib%name%-dev, разве что курл выделился своим libcurl4-gnutls-dev.
Предупреждая полуграбли три: выключите весь sqlite, его собирать - ещё два часа потерять и не включайте safe-mode от зенда.
(Чисто по приколу подключите mysql и pdo ;) - дальше увидите, зачем)

Если не забыли указать --prefix, то make && make install поставит красиво в ~/php-embed. Можно переходить к компиляции самого plphp. Попробовали? Правда ведь, вкусно, как Орбит - Свежие грабли?

Не помню, какие именно вылезают первыми, но они обескураживают.
Я не сразу нашёл хаутушку с процессом установки. Весьма доходчиво он изложен в презентации от (ВНЕЗАПНО!) группы разработчиков. Хотя на сайте - ни слова. Установка PL\PHP и примеры использования http://www.slideshare.net/xzilla/intro-to-plphp-oscon2007-presentation
Процесс установки - с 20-го слайда, с 32-го - грабли.

./configure --with-php=~/php-embed --prefix=~/pl-php
Здесь также я заюзал префикс, на всякий случай; всё равно библиотека переставится сама ближе к постгре.
make && sudo make install - заметьте sudo, оно для разрешения записи со-шника в либы постгри.

Ничего, что дальше командами?
sudo su postgres -c psql
INSERT INTO pg_pltemplate VALUES ('plphpu','f','f','plphp_call_handler','plphp_validator','$libdir/plphp',null); - проверяйте структуру таблицы! различается в разных версиях.
Заметьте ещё две штуки: plphpu - unsafe php, $libdir/plphp - путь к библиотеке.

После CREATE LANGUAGE plphpu; идут последние грабли: plphp.so не может найти libphp5.so . Воспользуемся приведённым советом и сообразим софтлинк на libphp5.so. НО! не к апачу, как показано в презентации, а к свежесобранному - зря, что ли, делали?
ln -sf ~/php-embed/lib/libphp5.so /usr/lib/
Ещё раз CREATE LANGUAGE plphpu;

Всё. Радуемся.

CREATE FUNCTION php_rock(text)
RETURNS text
LANGUAGE plphpu
STRICT
AS $$
$ret = 'PHP ROCK YOU, %' . $args[0] . '%!';
return $ret;
$$;

SELECT php_rock('username');

энжой!
=;)

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

зы2: ПОЛЬЗА??? польза в том, что через js-сокеты можно будет запрашивать view напрямую из базы модели и скинуть контроллер бизнес-логику инсайд. Как нам и говорит методика MMVC.
И заставить mysql просраться кирпичами популяризация такой замечательной СУБД среди веб-разработчиков!

2010/08/02

Базовая авторизация, винды, пых и соломинка, или Немного программерского трипа из ничего

...Волна и камень,
Стихи и проза, лед и пламень
Не столь различны меж собой.
(c) Наше почти что всё

Базовая авторизация сцуко хитрая. Вот казалось бы, принципы и технологии отработаны не один десяток лет, ан нет, и тут не без прикола.
Всем известен такой (или примерно такой) код:

if ( isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW']) )
{
//здесь работаем
} else {
//здесь авторизуем
header('WWW-Authenticate: Basic realm="pedo mellon a minno"');
header('HTTP/1.1 401 Unauthorized');
print 'bad idea';
die;
}
и как он должен работать, тоже все представляют: появляется окошечко с надписью, туда вбиваем логин\пароль, жмём ентер, опач выставляет заголовки $_SERVER['PHP_AUTH_USER'] && $_SERVER['PHP_AUTH_PW'], мы их ловим в коде, всё ништяк.
Не тут-то было.

Пункт "а"; то бишь "о" - Опера.
Опера - как конфета, как старая карамелька: сверху красивая, внутри пустая. С ней много и очень много приколов. К примеру, пара: Опера не отправляет заголовки авторизации и вышеприведённый код сразу переходит на строку print 'bad idea'; Точнее будет сказать, не отправляет с первого раза - жмём F5 и ВНЕЗАПНО получаем авторизованного юзера.
Вторая забавность даже не в том, что "дебагер"-дом-инспектор (ну, как файрбаг в фф) работает через сторонний сервер (да-да, о_О нет коннекта - нет инспекта), а в том, как он визуально организован. Можно перемещаться стрелочками, но нельзя стрелочками же раскрыть ветку; также не работают комбинации Ctrl+Arrow, Ctrl+PgUp\PgDn, Ctrl +\-... Короче, сумрачный оперный проектировщик интерфейсов навесил тоггле-коллапсинг на Enter. Поувольнял бы.

Пункт "х"; Хромой и клоны, возвращаемся к авторизации.
Не буду долго томить, скажу сразу. Заголовок header('HTTP/1.1 401 Unauthorized'); хрому не указ. Не то чтоб совсем... Но как-то неадекватно он себя ведёт: не каждый раз изволит показать модальное окно, отслеживая по каким-то своим хитрым алгоритмам активность юзера и отправляя заголовки минуя ввод логина.
Не верите - проверяйте сами. До меня это дошло за много, много часов.

А глубинах этого сурового трипа поджидала внутренняя малая игра: "переставь мускуль на винде" ;)
Началась она с того, что php5.3 не увидел mysql5.1. Одинаковый mysql_connect('localhost','login','password'); на пыхе 5.2 (оставил-таки себе ;) коннектит, а на 5.3 даёт
Warning: mysql_connect(): [2002] Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера
и вылетает по таймауту в 30 секунд. Вот здесь скорость отъезда крыши начала приближаться к световой и воображаемые друзья начали казаться не такими уж и воображаемыми. Пока они сейшенили, я решил немного вздремнуть.

После чего был проверен и перепроверен мускуль, пых, переставлен мускуль на более новый, потому что грамотно обновляться виндовые версии до сих пор не научились. Результата ноль.

Секретный секрет заключался в том, что пых5.3 не резолвит localhost. Ибо в замечательной системе Windows Vista в известном файле hosts строка localhost 127.0.0.1 закоменчена. Ну вы поняли. Спасибо Безумному доктору http://drcreazy.com/art/8


Ах да, зачем мне всё это было надо? После беседы с Коджи я так восхитился ;) их движком, что решил написать своё поделие. Ещё один кусок набора веб-инструментов называется "Web Mysql Console". Смотреть здесь http://code.google.com/p/angry/source/browse/#svn/tags/WebMysqlConsole

Такой вот получился трип вместо нескольких часов простого кода

2010/05/20

твитер такой твитер

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

во-вторых, была подмечена одна хитрая методика и другая подтверждена. вариант а) няшка, №следуй, №следуй, няшка, реф, твит, няшка, твит, реф, твит, сиськи, твите.ру х5, няшка, твит, нувыпонели?.. ПРОФИТ!!1111
вариант б) больше похож на какой-то эксперимент: твитится провокационная фраза с персональным тегом в надежде на ретвит, вероятно; потом очень просто отыскать и подфоловить всех по списку - потенциальные живые люди.
социнженерия инэкшн, хуле. пользуйтесь, дарю =;)

в третьих, наш дорогой ЧПУ завёл себе виртуала, который однозначно робот, у него вся выдача состоит из блоготопа йандыкса. что интересно: без первичного фоловинга семь фоловеров, из которых пять - знакомые авки, а двое - тысяник и 30-титысячник - отлипли сами. две седьмых = 28.6% - примерно так я себе и представлял долю человеческого населения этих ваших интернетов.

у меня пока всё... оставайтесь с нами

#twitterday! RT pls :)

#UPD: ещё бывают аккаунты-аккумуляторы, которые тянут с нескольких других, а ещё аккаунты-разветвители, которые делят выдачу рсс разного времени, а ещё есть неумелые виртуалы, которые постят одно и тоже с разницей в минуту по-сеошному через синонимайзер, и ещё много всего удивительного в этом странном твиторе

upd 21/05 14:45 только что видел линк на этот пост в ленте виртуала, которая чуть менее, чем полностью... ну вы помните

2010/05/16

Жизнь и приключения ЧПУ в картинках

Наш дорогой человекоподобный друг продолжает заводить друзей на ярушечке, не осилил интерфейс лира, заработал 1 (одну) коп. на рефералах (двух, но заработал на одном) со всем известного тви-спам-ресурса и так далее, и так далее. Чему я всемерно восхитился и решил ознакомить соучастнегов со статистикой за истекший срок. все шоке, я гарантирую это


Первая прекрасная картинка показывает, что число фоловеров и число френдов (взаимных фоловеров) неуклонно и стабильно растёт. "Скачок" был сделан ручным фоловингом - полчаса нажимал кнопу.

Вторая картинка неинтересная: на ней сверху подтверждающее отношение, снизу абсолютное число постов - равномерность это гуд - это я иногда пишу руками что-то типа "утро тви".

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

Из представлено материала делаем простые выводы:
  • роботы фоловинга работают стабильно
  • большинству твипла абсолютно пофигу, кто их фоловит
  • твипл в массе не читает ленту
  • количество нечеловеческих тви-аккаунтов over9000
  • относительное количества разума в интернетах неуклонно сокращается
  • в протоплазме можно обнаружить роботов, овощи, смошников и хомячков.
Let's PANIC?!!!11111

ps: К.О. заявляет, что @altosz, который первый отретвитил про этот пост, тоже пользуется ботами и зафоловил ЧПУ примерно до 50-го твита. так-то!

2010/05/12

Установка Disqus на блогспот

  1. регистрируемся сразу с сайтом или другой вариант http://disqus.com/profile/
  2. все самые вкусные опции типа Akismet и FB через API-key (взял ВП-кей у ЧПУ)
  3. знакомое по установке AddThis предложение отредактировать шаблоны; но услужливый дискас предлагает всё сам заапдейтить и пропатчить
  4. варнинг! не забываем переключить радиобатон на Use Disqus Comments on all blog entries. Any existing comments can be imported in чтобы подключились старые каменты
  5. на следующей странице цапаем пропатчаный шаблон и копипастим на блогспот
  6. внимание ещё раз! дискас предупреждает, чтобы в блогспоте галочка "расширенные параметры шаблона для виджетов" была установлена! (она справа над текстареа)
  7. и попробуем сразу импортнуть каменты...
  8. Keep comments on Disqus synced with Blogger, кажется, включает обратную синхронизацию дискаса в блогер, но у меня не включилась сразу
  9. смотрим, что получилось
  10. ничего не получилось, приостановлено на обед
  11. Viola! мы сделали это! Ничего сложного, просто не надо слушать вредных советов =;) со сторонних сайтов, не надо изменять настройки комментариев, как советует Blogohelp.
Теперь у меня появилась уютненькая формочка для каментов :)

2010/05/08

Человеко-Подобный Уникум

Однажды - мне всегда нравились такие начала: "однажды...", хоть и было это с неделю назад - ранней майской ночью под щебетание зануды-соловья мне подумалось, что интернет стал настолько хитроввёрнутой штукой, что отличить анонимуса от %юзернейм% стало практически невозможно.

Судите сами: акк на фейсбуке, линкедине, вконтактиге и всё - живой человек. Плюс ещё твитор, ярушечка, жежешечка и засвет в каких-нибудь форумах и бложиках - и уже не отличить от биологического старомодноделаного человечка. Добавить вебмани, йанденьги, скайп (с хардварным вариатором голоса;) , мобилу для смсок, виртуальную визу, "восстановить" хоть какой-нибудь из документов, чтоб потом "восстановить" остальные и абсолютно легально готова новая личность.

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

ИД ЧПУ пока не скажу =;)
Разве только тем, кто чем поможет. Помощь нужна, по большей части, в плане информации по автоматизации процессов: есть сервисы репостинга бложиков или самому велосипедить скрипт, как лучше настроить интеграцию соцсервисов и тому подобные штуки; и с фотошопом, конечно - надо бы некоторое количество непротиворечивых фоточек класса "я и моя кошка на фоне ковра" только без кошки и без ковра.

Жизнь и творчество HAL ;) будут освещаться здесь и в твитере по тегу #XGE. RT plz!

зы: со вчерашнего поста можно пользоваться кнопой под текстом для массшаринга

2010/05/07

Про социальные кнопки

Все делают вид, что интернеты социализируются, становятся ближе к людям, так сказать, и придумывают разного рода кнопочки, штучечки, ИДешечки... Так вот и у этого бложека объявился второй и, надеюсь, постоянный читатель из твитора @zkonstantin. Который и попенял мне, что мол, жаль нет ружья красивой кнопки "затвитить". Так вот, теперь такая кнопа есть! (см. внизу поста)

Из всех рассмотренных вариантов я выбрал AddThis только потому, что у них есть подробная инструкция "как поставить кнопу на ваш уютненький" с картинками; смотреть здесь http://www.addthis.com/help/blogger. А кто посоветует дефолтные варианты, тому спасибо.

В общем, мы к вам ближе, оставайтесь с нами =;)

зы: чем на самом деле занимаются интернеты, мы вам пока не скажем ;)
а себя называем на "вы" исключительно от мании величия

2010/04/18

Немного о ботах и репах дебиана

Мы строили-строили и наконец построили! :) (Ц)все знают

Вштырилось мне как-то написать твиттер-бота для игры "Мафия". И я его написал, почти. А потом ещё одного...
Как всем известно, программист - существо ленивое, так и мне стало лень копипастить пачку свич-кейсов из одного бота в другого. Пришлось рефакторить (переписывать, да), выделять сущности, строить модель... И получился класс Bot, который реагирует на поток строковых команд. Так как он вызывает колбеки с параметрами, то оказалось, что его можно использовать как роутер, или интерпретатор, или как вам фантазия подскажет ;)

В качестве небольшой хаутушки кусок кода из погодного бота @WeaTwi
$bot = new WeaTwiBot($config['username'],$config['password']);

$bot->addBatch(
array(
Bot::COMMAND => '~!info|!help|!about~i'
,Bot::ACTION => array($bot,'updateStatus')
,Bot::PARAMETER => array('%s %s',
'~^(@[a-z0-9_]+):~i'=>1,
$bot->URL_INFO
)
,Bot::LAST => 1
)
);
$bot->addBatch(
array(
Bot::COMMAND => '~.+~'
,Bot::ACTION => array($bot,'getWeather')
,Bot::PARAMETER => array('~^@[a-z0-9_]+:(.+)~i'=>0)
,Bot::LAST => 1
)
);

$s = array();
foreach ($bot->getLastMentions() as $m)
$s[] = '@'.$m->user->screen_name.':'.preg_replace('~@'.$config['username'].'~i','',$m->text);

$bot->setQueue($s);
$bot->run();
die;
Вот так и живём =:)

Ах да, про дебиан и пхп. Оказывается, в репах дебиана нет такого вкусного php5.3! Как подсказывает гугл и http://www.openkazan.info/node/3515 обновиться можно из http://packages.dotdeb.org
$ nano /etc/apt/sources.list
...
deb http://packages.dotdeb.org stable all
deb-src http://packages.dotdeb.org stable all
#
deb http://php53.dotdeb.org stable all
deb-src http://php53.dotdeb.org stable all
...
$ apt-get update
$ apt-get install php5
, о чём продвинутый юзер и так знает

Оставайтесь с нами, фоловьте ботов ;)
А кто предложит лучший алгоритм для мафиозного бота, тому плюшка

ps: чем бы таким код нормально отформатировать?..

2010/03/03

Twitter и его OAuth

Все, кто ещё не уверен, что OAuth придумали безумные люди, посмотрите на процесс авторизации

Это из самого полного мана http://oauth.net/core/1.0/#anchor9

Вспомнив успех Zend для OpenID, снова обратился к нему. На этом месте должна была быть некая бодрая шутка, но её не будет, так как слова закончились через несколько часов попыток извлечь пользу. Заглянув на http://framework.zend.com/manual/1.10/en/zend.oauth.html можете сами убедиться в полной бесполезности зенда в вопросах хитрой авторизации в твиттере через OAuth. Короче, оно тупо не работает.

Когда ничего не помогает, можно уже наконец читать инструкцию. Загуглив тему, Вы точно так же не обнаружите того, чего не обнаружил я: нормальных хавтушек системы "как установить эту хрень?!"
Зато гугл доставил собственный ман http://code.google.com/intl/ru/apis/accounts/docs/OAuth.html. Блеснул слабый луч надежды.
Но блестел он не долго. Почему? Потому что надо понимать, как именно работает OAuth. Это не "пара логин\пароль". Аутентификация происходит после получения авторизационных ключей, после обмена на них ключей доступа, которые можно получить после предоставления уникальной идентификационной пары. Кто хочет окончательно запутаться, сверху есть замечательная картинка.

Теперь ещё раз и вдумчиво. Немного терминологии:

  • application - приложение, втч веб-ресурс, которое пользуется услугами провайдера
  • provider - сервер авторизации
  • consumer - потребитель услуги, юзер, которого приложение авторизует через провайдера
  • tokens - пары ключ\секретный ключ, гугл зовёт их маркерами
Процесс кажется поначалу весьма простым. Запутанным, но не особенно сложным: ключи запроса, ключи доступа, сигнатура, доступ, оппа! Берём простейший класс-обёртку cURL, за полчаса ваяем шедевр и обламываемся на ответе: "Failed to validate oauth signature and token". Что это? Ищем ключевое слово сигнатура и обламываемся ешё раз: сигнатура вычисляется по RSA-SHA1, но из чего - науке неизвестно; по другим источникам она составляется перекомпоновкой из пары токенов доступа, но их тоже надо ещё получить, а у нас ключи запроса не принимаются. Короче, это тоже тупиковая ветвь.

Решаем обратиться к первоисточникам, то бишь мануалу самого твиттера. Это мрак. Родной ман твиттера ещё хуже мана жКвери. Если захотите почитать, то польза начинается отсюда http://apiwiki.twitter.com/Twitter-API-Documentation. Всё, что находится по ссылкам, ещё менее информативно, чем ман зенда.

К слову, http://hueniverse.com/oauth/, куда сходятся большинство отсылок по OAuth, вполне соответсвует своему названию.

Ситуацию выручил программер нерусской национальности Абрахам, но почему-то Вильямс, с рассказом о том, как это работает https://docs.google.com/View?docID=dcf2dzzs_2339fzbfsf4

Перевожу и дополняю:

  1. Надеюсь, вы уже зарегистрировали своё приложение? здесь https://twitter.com/oauth_clients
  2. получите оригинальные идентификаторы и выучите их наизусть $consumer_key, $consumer_secret
  3. далее выполняем первичную авторизацию приложения на провайдере $to = new TwitterOAuth($consumer_key, $consumer_secret);
  4. и получаем ключи запроса $token = $to->getRequestToken();
  5. токены реквеста нужно указывать в адресе авторизации $request_link = $to->getAuthorizeURL($token);
  6. и выполнить пересылку по этому адресу header('Location: '.$request_link); die;
  7. у твиттера существует два типа авторизации oauth/authorize и oauth/authenticate; кому важно, разберётся сам
  8. в тви-интерфейсе юзер приложения выполняет хитрые действия по нажиманию кнопок пальцами
  9. и если вы всё сделали правильно, то твиттер должен прислать токены доступа, как большим
  10. но этого не происходит, потому что тви не прост: если в пункте 0 вы не указали адрес обратного вызова, то тви считает приложение десктопным и сам переключает режим, и в пункте 8 пересылку не делает, а показывает пин-код; адрес колбека, удивительно, можно указать\переназначить в запросе токенов реквеста, п.3.
  11. получаем ключи доступа $tok = $to->getAccessToken($_GET["oauth_verifier"]);
  12. ой, какая неприятность, у нас новый объект, и он сбивает весь процесс!
    Внимание! объект из п.2 необходимо сохранить! для пхп проще воспользоваться сессиями
  13. всё. ключи доступа получены и можно что-нибудь спросить у твиттера, например: $to->OAuthRequest('https://twitter.com/account/verify_credentials.xml', 'GET', $token)); ах да, у Абрахама в этом месте ошибка в параметрах
  14. пытливый читатель попросит добавки в виде описания процесса для десктопных. пожалуйста: пин-код из п.9 нужно использовать как oauth_verifier из п.10
  15. voila!
У меня работает. Можно продолжать монетизировать твиттер :)
На прощание ссылка для базовой авторизации - красиво выглядит класс http://github.com/jdp/twitterlibphp
зы: внимательный читатель заметил, что твиттер не требует обязательного указания сигнатуры ;)

upd: когда гугл включил статистику для блогспота, я был весьма удивлён огромной для такого скромного бложика посещаемостью этой статьи...
читатель! не стесняйся благодарить автора переводом любой суммы в йандекс-кошелёк 410011133049553 :) (https://money.yandex.ru/shop.xml?scid=1269)

2010/02/13

OpenID, Zend И все-все-все

Внимание! позавчера вышла распрекрасная версия зенда 1.10.1, о чём нам сообщает доверенный источник в лице http://zend-framework.ru/zend-framework-1-10-1-release/
Рекомендую означенный блог к ознакомлению, масса информации для нубов в зенде; многого вы не найдёте в официальной документации.
Забавность произошла у меня с зендом. Есть у них такое место, как Developer Zone http://devzone.zend.com/. Резонно было бы ожидать, что статья http://devzone.zend.com/article/3581 "Getting Started with OpenID and PHP" содержит инфу про Zend_OpenID... А вот и нет! В статье описывается работа с библиотекой The PHP OpenID Library, by JanRain Inc.
Так-то!
Искренне ваш,
и.о. К.О.

зы: в упомянутом блоге описан баг зенд-оид и гугла и хак к нему http://zend-framework.ru/google-zend_openid/ Надеюсь, в новой версии баг исправили, надо глянуть.
Также не забываем про первую в РФ конфу ЗФ; предварительная регистрация http://www.zfconf.ru/pre-registration.php ; твитор @zfconf

2010/02/07

PHP и циклический битовый сдвиг

Возник на канале вопрос про циклический сдвиг в пхп... В качестве послеобеденного фана набросал концепт; надеюсь, кому-нибудь пригодится. Заметьте, функция для любой разрядности, хотя принимает и возвращает только десятичные.


function
circular_shift($what,$direction='<<',$steps=1,$wordlength=32)
{
$bits = base_convert((string)(int)$what,10,2);

for (
$i=0; $i < $steps; $i++)
{
$length = strlen($bits);

if (
'<<'==$direction)
{
if (
$length == $wordlength && '1' == $bits[0] )
// overflow
$bits = substr($bits,1).'1';
else
$bits = $bits.'0';
}
elseif (
'>>'==$direction)
{
if (
$length < $wordlength )
// shortage
$bits = $bits.'0';
else
$bits = $bits[$length-1].substr($bits,0,$length-1);
}
else
die(
'WTF?!');
}
return (int)
base_convert($bits,2,10);
}

print
circular_shift(8) ;


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

Успехов