2012/01/15

Человек информационный, часть третья: Нооматрица

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

Я сразу смазал карту будня,
плеснувши краску из стакана;
я показал на блюде студня
косые скулы океана.


Продолжим с последней цифры капитанства. У нас есть порт[ал] обзора V (View) всё равно где и в какой реализации, по старинке именуемый экраном или, например, тачскрином. Текущее состояние в конечный момент времени содержит фокус внимания. Фокус, в общем случае, не тоже самое, что инфопятно P (Point), которое локализуется возле точки контакта (рассматривается интерфейс с управлением руками).
Пятно само по себе является интерфейсом. Его можно продавливать. И "реальность" портала V прогнётся. Очень похоже на лупу, только с синусовым краем. Таким образом можно просмотреть другие рядом лежащие слои Hi = ∫dSdt, и перемещаться по ним в песочнице, изменяя параметр глубины h. Здесь формула носит показательный характер, где H - человек, ковыряющийся в песочнице, i - признак информации, Hi - слой портала V на некоей глубине h, S(Si) - история поиска, t - время, (dSi×dt) инфобит.

Когда мы начинаем условно "подниматься", уменьшая видимые в портале размеры объектов, в конечном итоге мы достигнем уровня, когда точечным инфообъектом останется сам человек Hi. В этот момент совершается качественный выход из личной инфопесочницы в публичную нооматрицу. Потому что в портале мы видим объекты системы "человек" и связи между ними. Подкладывая карту мира и дальше "поднимаясь" в нооматрице мы выходим на размеры городских кварталов, городов, и так далее... :) Остаются только связи между объектами и характеристики этих связей.

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

Это всё.
Текстом выглядит, думаю, непритязательно. Когда я рассказывал словами и рисовал картинки, мне даже предлагали денег под внедрение. Отказался; мало денег, несопоставимо с затратами.

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

2011/11/27

Юзабилити не существует x2


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

Пару недель назад в южной столице прошла товарищеская встреча #wudru с помпой и бойлерами. И в качестве обещанного примера попинаем сайт конференции. В самом деле, хватит уже издеваться же над уй-тринити всея рунета, они как тот сапожник совсем же, и сайты их вы знаете: "купи винду", "вырви глаз" и "многа букв".
Про саму конфу пусть другие пишут. "Открывающих" копылова и ветрова не было слышно вообще, после отжигов роцк-дезигнера и павлова от тестирования народ вздремнул под колыбельную бескова, и вышел на обед. Бодрячковски затусив вместе с человеком-киборгом и не менее прекрасными парнями "компута шоу май пича" и "ошибайся, жди ответного гудка" народ перешёл к разного рода мимими и печенькам.
Хм, расписав предудущий абзац, даже как-то невольно проникаешься красотой и внутренней гармоничностью расписания...

Так вот, для проверки сайтегов у меня есть специальнозаточенный огнелис с плагинами. Они легли таким образом, прям по Маркову, что одна загрузка показывает практически все типические проблемы: скролинг, шрифт, вёрстка, загрузка итд; здесь всего лишь убежала кнопка регистрации, но это просто неприятная мелочь, это через гугл, это не лечится.

И под закрытие сладкая-сладкая вкусняшка - "место проведения". У меня мгновенно случается приступ острого когнитивного диссонанса со страстью к укладочными работам. Приведу целиком федевр
От метро Новослободская выход к Селезневской улице. Около ресторана «Елки-Палки» переходите улицу Селезневская на другую сторону, идете по направлению движения транспорта. Через 600 метров справа будет магазин «Богатырь», располагающийся на первом этаже жилого дома. Идете вдоль этого здания, проходите 2 арки, ведущие во двор. После Аптеки поворачиваете направо в третью арку.
От метро Достоевская по указателю на ул. Селезневская (из перехода направо), 30 метров из перехода вперед и налево в арку между магазином "Немецкая обувь" и кафе "Зам-Зам".

ЧТО ЭТО?! КТО МНЕ ГОВОРИТ ПЕРЕХОДИТЬ УЛИЦУ?! МНЕ НУЖНО СЧИТАТЬ АРКИ?! да вы там все ебанулись!
Если вы попробуете найти схему проезда на сайте "многабукв" компании У, вы узнаете стиль. Помня, что по той схеме невозможно попасть в их офис (который располагается в шиномонтаже), я просто записал названия улиц. Кстати, соционическое замечание: в офисе ведущей в отрасли компании нет ни одного нормального сенсорика; компания занимается удобствами - сенсорика нет. радость веселье острые углы уёбищные решения.

Нет, я пытаюсь разобраться.
Почему я должен идти от метро? Я уже вышел на поверхность? Тогда почему я иду по указателям "выход"? Ну это случается. иногда. успокаиваю я себя.
Зачем мне искать ресторан и переходить проезжую часть около него? я неплохо знаю правила дорожного движения и умею их применять. я способен самостоятельно определиться с местом перехода. может, быть это часть для людей с ограниченными возможностями? успокаиваю я себя дальше
почему я должен ориентироваться на направление движения? может быть, оно там одностороннее? пытаюсь догадаться я
600метров... мне нужен лазерный дальномер?! тихо матерюсь я
ах, может быть, описание составлял человек на машине и с навигатором! внезапное озарение! ну конечно, именно в таком случае он издалека заметит магазин, как бы идя по его же стороне, а на самом деле передвигаясь в другой области обзора. но это, сцуко, описание для пешеходов! оторви жопу, пройдись пешком

Здесь я устал. Я выбрал ближайшее с поверхности решение - (м)Достоевская и включил автопилот, запомнив арку между магазином и кафе. Часть про то, что дырку в доме для проезда транспорта во внутренний двор аркой называют чаще в питере, а в москве - подворотней, и то что "арка" оказалась на поверку тоннелем, мы опустим.
Пройдя по длинному переходу я вышел из метро и пошёл вперёд, выискивая кафе. Пройдя половину пути до перекрёстка, я повернул обратно. Конечно же, прилежный читатель уже обо всём догадался! И не важно, что кафе оказалось баром, а "немецкая обувь" "европейской обувью", это же мелочи, правда?
Тридцать сука метров - это сорок одинарных (непарных) шагов, я померял потом специально.
Какой нормальный человек будет считать шаги при ходьбе?
При средней скорости московского пешехода в шесть-семь километров в час, вылетая из метро, тридцать метров проскакиваешь за восемь секунд. Восемь секунд, чтобы сориентироваться в интерфейсе и принять верное решение. в действительности ещё меньше. после ёлок остаётся пара секунд, чтобы заметить кафе, и то, если вам хочется повернуть голову влево.

Мытарства закончились только тем, что, пока я медленно пробирался по двору, я успел узнать одинэсный домик, когда-то я там уже был, и связать его с рекламой 1с на гуглокарте.

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

И эти люди учат нас чему? нувыпонели. юзобыдлити.


зы: юзабилити не существует, ч.1

2011/09/10

Человек информационный, часть вторая: Инфопесочница

-What do you read, my lord?
-Words, words, words.

┌────────────┐
│ ╔════════╗ │
│ ║        ║ │ 
│ ║        ║ │ 
│ ║        ║ │ 
│ ╚════════╝ │ 
└────────────┘ 

══╤════════╤══
  │        │

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

А теперь внимание, концепт! Я берусь утверждать, что этот предмет представляет собой ни что иное, как модель работы человека с информацией.
Надо ли напомнить, что делает ребёнок в песочнице? Правильно! он в ней ковыряется. Сколь угодно долго, то бишь, пока не надоест переворачивать песок руками и ногами, засовывать его в рот и карманы, и искать "сокровища" типа крупных песчинок, гальки, ракушки и чего туда могло ещё прилететь.
Стоит дать лопатку - и копание пойдёт эффективней.
Стоит дать пасочку - и на бортах выстроятся рядами куличики.

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


Слегка изменим пропорции
┌──────────────────┐
│ ╔══════════════╗ │
│ ║              ║ │ 
│ ║              ║ │ 
│ ║              ║ │ 
│ ╚══════════════╝ │ 
└──────────────────┘ 
Не правда ли, знакомый формат тачскрина?
Из чего и формируется принцип работы с инфопесочницей, он внедрён и известен. Но только в горизонтальной плоскости.

Необходимо, пожалуй, особо отметить одну важную особенность: в сознании ребёнка песочница бесконечна вниз, она не имеет дна - и между прочим, это отражено в эскизе.
Так появляется третий пространственный параметр инфопесочницы - глубина (В некоторых местах глубина будет названа высотой, но это не имеет принципиальной разницы в реализации, только в мозгу.) Работа с глубиной, в принципе, тоже известна - для неё подходит двухпальцевый зум (zoom).

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

И чтоб не томить, третье ограничение: в каждый момент времени объём рассматриваемой человеком информации ограничен не сколько фреймом просмотра, но и фокусом внимания. Это в большей степени касается, конечно, матмодели и реализации интерфейса.
В части третьей, про нооматрицу, попробую рассказать про инфолупу и трёхпальцевые жесты. Часть первая должна была представлять общий вид формул матмодели; сделаю, как найду матредактор с интегралами.

на этом пока всё.

комментарии:
Концепты и всё-всё-всё было придумано за время гугло-хакатона 27-28 августа 2011 года с подачи Данилы Корнева, интегралы нарисованы чуть позднее; на тот момент я не был знаком с его наработками.

Является ли уменьшение энтропии врождённым или социальным инстинктом целовека - пусть антропологи разбираются :)

2011/09/09

NOSQL, MySQL и AJAX

Каким бы интригующим ни был бы заголовок, код посвящён программерской пятнице. Вот он http://code.google.com/p/angry/source/browse/#svn%2Ftags%2FajaxSQL
В спасаемой отрасли давно наметилось разделение веб-мастеров на тех, кто больше предпочитает серверный кодинг (пхп и мускл, на мейнстриме) и кто - клиентский (яваскрипт и дом). Плюс к тому, клиентсайд - пользовательские машины и их браузеры достигли такого уровня мощностей, что позволяют перекладывать большую часть технологических процессов (бизнес-логики, ага) на свои нехрупкие плечи (да-да, вспомните: сейчас мощность клиентского десктопа превышает, а планшетника - примерно соответствует мощности среднего VDS по 300 руб. в месяц).
Так вот, я не первый догадался делать цмс на аяксе. Но, наверное, мне стало больше всех лень писать RESTовые обвязки на пхп, и я написал враппер к SQL. Он принимает специфичный формат данных, формирует запрос, обрабатывает плейсхолдеры, и результат запроса отправляет JSONом клиенту. Сто строк вместо двадцати мегабайт пхпшного фреймворка.
При некотором напряжении, можно даже исключить монструозные апачи и допилить сокет-сервер (см. где-то в этом бложике), и\или вкомпилить код сразу в постгрю.
Как обычно, не советую пихать на продакшн в миллионы запросов, советую сформировать в базе виды (view) и рекомендую озаботиться секьюрностью передачи данных. Хотя защита от тупого лома уже инсайде и её хватит на 97%; кто найдёт - тому плюшки радость веселье ;)

Оставайтесь на нашем канале :)

зы: требует PHP::PDO и, если хотите, jQuery

2011/06/30

Темны дела твои, эйчар, в отрасли

Билли, можно тебя буквально на два слова?!
// Гарри


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

Попалось давече мне на глаза совершенно типическое-типическое для отрасли объявление (цитируется с произвольными выдержками)
Вакансия: Проектировщик интерфейсов
Департамент: коммерческий
Задачи: проектирование интерфейсов Web\iOS\Android\etc, анализ пользовательских требований и составление сценариев, опыт, проведение оценок и тестирования,
Профессиональные требования: понимание психологии пользователей, знание методик анализа и проектирования п\и, знание стандартов п\и, прикладных систем анализа и проектирования...
Молодая демонично развивающаяся компания, дружный коллектив, чай, кофе, печеньки...

По традиции, любая вакансия от МДРК идёт сразу в известно куда. Понятно же? Компания, которая предлагает коллектив и печеньки, ничего иного предложить просто не в состоянии. Но эти могли, про оформление написали, страховку, спортклуб, просто прибедняются. Но дело тут в другом! Из-за ещё одной МДРК я б не стал блогспот открывать.

Читаем сначала и внимательно:
Позиция: Проектировщик. Хорошо.
Департамент: коммерческий. Допустим, что там везде коммерческий, что люди деньги делают.

Дальше смешнее: проектирование интерфейсов для etc... Веб, Андроид, иОС, хоть как-то понятно и оправданно, пусть даже хотят многостаночника, но etc? Для мобилочек штоле? Или тумбочек системы телеящик? там тоже бывают интерфейсы, я слышал.
Анализ пользовательских требований хорошие красивые слова. Человека, который ни разу не пытался анализировать пользовательские требования...
Мимоходом заметим, что опыт отнесён к задачам - это типа постановка опытов над многострадальными пользователями?..

Внимание! переходим к профессиональным требованиям, то есть требованиям компании к профессионалу: три однотипных запроса и "понимание психологии пользователей". Здесь мой мозг тормознул и пошёл юзом. Позиция проектировщик, требования психология. Проектировщик - психология. Психология - проектировщик. Проектировщик-психолог?! о_О
Здесь читатель с богатым воображением сам способен представить верстальщика-специалиста по вопросам семьи, или с небогатым - вспомнить месильщика карамельной массы из списка смешных профессий.

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

Автор академиев кончал, но с трудом может вспомнить что-то из психологии; способен предположить поведение некоторой группы пользователей, но с ними ж, как с динозаврами - 50/50.
Возвращаясь к айтишным вакансиям: разного рода оксюмороны, ляпы в описании, запросы, несовместимые с профессией - обычным стали делом. Это говорит нам о чём? О том, что так называемые специалисты по кадрам не понимают, чем же эти кадры на самом деле занимаются. А раз не понимают суть работы компании, то (делаю я вывод) разоряют компанию, которая им доверяет поддержание себя в рабочем состоянии. Такое моё мнение.
HR не существует.

а в следующий раз я вам за скрамный, пр-ти г-ди, аджайл расскажу

2011/03/05

Сервер на ПХП

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

Однажды мне понадобился быстрый сервер-преобразователь, только не спрашивайте для чего, что-то вроде фильтрующего прокси: принял один контент - выдал другой. Я уже начал присматриваться к mod_proxy и mod_filter апача, но большие мощные штуки тем и хороши, что они большие мощные штуки. Здесь затраты не стоят результата.
Поискал маленькие сервера... Но в самом деле, не вешать же ещё один веб-сервер, когда есть апач?

И идея вернулась на круги своя: сделать сервер на самом php - сокеты есть в каждой операционке. По сокетам вполне внятный ман с несколькими примерами эхо-серверов. Но в задаче требуется не эхо-сервер, а обработчик контента, в задаче-максимум - с запуском внешних утилит.
Следующим этапом гугления был гайд от http://i-novice.net/sokety-v-php/, но и там эхо, хотя уже расширенный. Кстати, рекомендую закинуть сайт в закладки: интересно, доступно и практично.
Сервер из примера я и взял за основу для работы. Программирование "от ошибок" показало, что:
  • необходимо помнить и правильно указывать параметры при socket_create - типы сокетов, и socket_bind - действительно свободный порт;
  • вложенные циклы выбраны не просто так, а socket_accept выполняет очень важную миссию как бы клонирования ресурса сокета.
Результаты смотрим в известном месте. (upd: просто сложил все примеры кучей)

Несомненно порадовал свежак веб-сервера встроенного в пхп http://wiki.php.net/rfc/builtinwebserver ;) Но это для тех, кому не лень ещё раз скомпилить ядро. Также в процессе работы не раз всплыл нановеб с известного казахского сайта. Но сто строк своего родного велосипеда выглядят гораздо приятней против 43кб его исходников.

Как можно использовать это чудо природы пока без названия?
По прямому назначению после допиливания конфигов и массивов заголовков: как веб-сервер. Может быть также полезен работникам клиент-сайда для проверки аяксов, как фейковый сервер при падении основного, ибо для работы требует только php-cli.
Как MyNoSQL сервер - прокси между клиентским аяксом и MySQL базой - есть такая модная тенденция.
Как PostNoSQL сервер - через PL\PHP из прошлых постов я запущу его прямо в постгре и получу прямой доступ к XML-хранилищу.

На сегодня всё.
Оставайтесь с нами

ps: поделюсь демотиватором на прощанье: http://habrahabr.ru/blogs/lisp/114981/
и хитрые задачи по SQL http://www.xt-r.com/2011/03/1.html

2011/02/01

Нано-роутер в одну строку, или ЧПУ на PHP за пять минут

RTFM!
//непереводимая игра идиоматических выражений

Давно обещал написать и показать. Сейчас выложу в одно известное место, и можете там посмотреть. Но если вы посмотрите, будет неинтересно читать. Как обычно случается с функциями подобных объемов, каментов в файле больше, чем кода =;)

Так вот, каждый пхпшник в своё время узнаёт три волшебные буквы "ЧПУ". Если мне не изменяет мой склероз, впервые в рунете их произнёс дядька Спектатор и вложил в них смысл "человекопонятный урл". Такие урлы удобно набирать ручками через слеш. Но не очень удобно подстраивать систему каталогов.
Настоящий пхпшник - существо ленивое и поэтому изобретает велосипеды не для того, чтобы кататься, а потому, что они красиво выглядят, просты в изобретении и ближе к телу. Как только мысль про ЧПУ внедряется в межушный нервный узел, тут же изобретается обработчик и кладётся в докрут. Задача обработчика элементарна: ловить урл и по табличке соответствий запускать метод из очередного Class Pager extends GodObject.

Постановка задачи, думаю, уже ясна. И функция, которая запускает колбек, как реакцию на шаблон, в пхп есть. Остальные двадцать девять строк кода это обвязка: сборка данных в массивы, обработка параметров и прочие хитрые штуки. Если ещё не открывали, предупреждаю: в коде присутствуют хаки и много си-стайла.
https://code.google.com/p/angry/source/browse/#svn%2Ftags%2Fnano.router%40ETC
Специальный нано-роутер, для тех кто не осилил большого красивого бота-обработчика потоковых команд. Функция выполняет примерно те же задачи - то есть, реагирует на подаваемые строки, но проще и без вкусных пост- и предобработчиков.

По сложившейся традиции, функция упрятана в "рамку", начинается с подчёркивания и занимает не больше двух экранов. Работает не просто, а очень просто. С вариативным количеством параметров.
Сначала набираются два массива: регулярок - которые мы юзаем в качестве фильтров, ведь ничего проще не придумаешь, а именованные плейсхолдеры, по здравому размышлению, оказывают не нужны; и колбеков - которые, собственно, и вызываются на попадание в регулярку. Специально для ленивцев сделан финт ушами про загрузку массивов и имен конфигурационных ini-файлов.
Затем, когда роутер вызывается с одним строковым параметром или без параметра, массивы всей пачкой скармливаются той самой волшебной, я бы даже сказал уникальной в своём роде, функции. Нашли? Правильно, это preg_replace($regexp_route_array, $callback_array, $URL);

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

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

Хорошая, кстати, идея со словом "нано"; я и так слил все хелперы, функции и фильтры в один каталог, теперь переименую - и будут наниты вместо хелперов.
Оставайтесь с нами =;)

зы: в роутере трёхэтажный мат с call_user_func и explode\implode это своеобразная защита от совсем дурака и такое нужное обкавычивание, которое легко забывается особенно в ини-шках.

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

2011/01/01

фильм соцсеть кг\ам социальная сеть скачать бесплатно без смс смотреть онлайн

ПАДКАТ!
боевой клич карма-наци

Один из немногих, кто не посмотрел "соцсеть" в предыдущем году - это я. Я его смотрел уже в наступившем году.
Впечаление унылости, которое он поначалу производит, немного размешивается драйвом, но сохранется до конца просмотра.
Фабула всех сюжетных линий (будем считать, что они там всё-таки есть) вкратце описывается лозунгом: Кинул пацана - по ебалу на! Зачин и эпилог фильма представляют штамп псевдозамкнутости сюжета: паренёк сидит и надрачивает клавиатуру. Дорога от безнадёги через кражи, подставы, тяжёлые наркотики, лживых друзей, предательство и прочие милые сердцу каждого социопата вещи ведёт к безысходности. Применённая техника сепии известных оттенков как бы подчёркивает режиссёрскую мысль и эффектно передаёт атмосферу.
Фильм может понравится любителям гарипотеров и... даже не знаю, кому ещё. Пожалуй, социально-активным элементам. В эпоху после цукенберга "быть социально активным" означает срать на форумах и много писать на стенах в социалочках.

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) ;


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

Успехов