2010/05/20
твитер такой твитер
вот не удержлася, решил написать. во-первых, с ростом общего кол-ва фоловеров кривая фоловинга принимает вид параболы имхо. а так как я гуманный, хоть и злобный, как правило, фоловлю взаимно, о чём потом жалею. думаю, уже не секрет, что я жоска выпиливаю клиентуру с подписью одного массовоизвестного сайтега. и буду продолжать это делать.
во-вторых, была подмечена одна хитрая методика и другая подтверждена. вариант а) няшка, №следуй, №следуй, няшка, реф, твит, няшка, твит, реф, твит, сиськи, твите.ру х5, няшка, твит, нувыпонели?.. ПРОФИТ!!1111
вариант б) больше похож на какой-то эксперимент: твитится провокационная фраза с персональным тегом в надежде на ретвит, вероятно; потом очень просто отыскать и подфоловить всех по списку - потенциальные живые люди.
социнженерия инэкшн, хуле. пользуйтесь, дарю =;)
в третьих, наш дорогой ЧПУ завёл себе виртуала, который однозначно робот, у него вся выдача состоит из блоготопа йандыкса. что интересно: без первичного фоловинга семь фоловеров, из которых пять - знакомые авки, а двое - тысяник и 30-титысячник - отлипли сами. две седьмых = 28.6% - примерно так я себе и представлял долю человеческого населения этих ваших интернетов.
у меня пока всё... оставайтесь с нами
#twitterday! RT pls :)
#UPD: ещё бывают аккаунты-аккумуляторы, которые тянут с нескольких других, а ещё аккаунты-разветвители, которые делят выдачу рсс разного времени, а ещё есть неумелые виртуалы, которые постят одно и тоже с разницей в минуту по-сеошному через синонимайзер, и ещё много всего удивительного в этом странном твиторе
upd 21/05 14:45 только что видел линк на этот пост в ленте виртуала, которая чуть менее, чем полностью... ну вы помните
2010/05/16
Жизнь и приключения ЧПУ в картинках
- роботы фоловинга работают стабильно
- большинству твипла абсолютно пофигу, кто их фоловит
- твипл в массе не читает ленту
- количество нечеловеческих тви-аккаунтов over9000
- относительное количества разума в интернетах неуклонно сокращается
- в протоплазме можно обнаружить роботов, овощи, смошников и хомячков.
2010/05/12
Установка Disqus на блогспот
- регистрируемся сразу с сайтом или другой вариант http://disqus.com/profile/
- все самые вкусные опции типа Akismet и FB через API-key (взял ВП-кей у ЧПУ)
- знакомое по установке AddThis предложение отредактировать шаблоны; но услужливый дискас предлагает всё сам заапдейтить и пропатчить
- варнинг! не забываем переключить радиобатон на Use Disqus Comments on all blog entries. Any existing comments can be imported in чтобы подключились старые каменты
- на следующей странице цапаем пропатчаный шаблон и копипастим на блогспот
- внимание ещё раз! дискас предупреждает, чтобы в блогспоте галочка "расширенные параметры шаблона для виджетов" была установлена! (она справа над текстареа)
- и попробуем сразу импортнуть каменты...
- Keep comments on Disqus synced with Blogger, кажется, включает обратную синхронизацию дискаса в блогер, но у меня не включилась сразу
- смотрим, что получилось
- ничего не получилось, приостановлено на обед
- Viola! мы сделали это! Ничего сложного, просто не надо слушать вредных советов =;) со сторонних сайтов, не надо изменять настройки комментариев, как советует Blogohelp.
2010/05/08
Человеко-Подобный Уникум
2010/05/07
Про социальные кнопки
2010/04/18
Немного о ботах и репах дебиана
$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;
2010/03/03
Twitter и его 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 - пары ключ\секретный ключ, гугл зовёт их маркерами
Решаем обратиться к первоисточникам, то бишь мануалу самого твиттера. Это мрак. Родной ман твиттера ещё хуже мана жКвери. Если захотите почитать, то польза начинается отсюда http://apiwiki.twitter.com/Twitter-API-Documentation. Всё, что находится по ссылкам, ещё менее информативно, чем ман зенда.
К слову, http://hueniverse.com/oauth/, куда сходятся большинство отсылок по OAuth, вполне соответсвует своему названию.
Ситуацию выручил программер нерусской национальности Абрахам, но почему-то Вильямс, с рассказом о том, как это работает https://docs.google.com/View?docID=dcf2dzzs_2339fzbfsf4
Перевожу и дополняю:
- Надеюсь, вы уже зарегистрировали своё приложение? здесь https://twitter.com/oauth_clients
- получите оригинальные идентификаторы и выучите их наизусть $consumer_key, $consumer_secret
- далее выполняем первичную авторизацию приложения на провайдере $to = new TwitterOAuth($consumer_key, $consumer_secret);
- и получаем ключи запроса $token = $to->getRequestToken();
- токены реквеста нужно указывать в адресе авторизации $request_link = $to->getAuthorizeURL($token);
- и выполнить пересылку по этому адресу header('Location: '.$request_link); die;
- у твиттера существует два типа авторизации oauth/authorize и oauth/authenticate; кому важно, разберётся сам
- в тви-интерфейсе юзер приложения выполняет хитрые действия по нажиманию кнопок пальцами
- и если вы всё сделали правильно, то твиттер должен прислать токены доступа, как большим
- но этого не происходит, потому что тви не прост: если в пункте 0 вы не указали адрес обратного вызова, то тви считает приложение десктопным и сам переключает режим, и в пункте 8 пересылку не делает, а показывает пин-код; адрес колбека, удивительно, можно указать\переназначить в запросе токенов реквеста, п.3.
- получаем ключи доступа $tok = $to->getAccessToken($_GET["oauth_verifier"]);
- ой, какая неприятность, у нас новый объект, и он сбивает весь процесс!
Внимание! объект из п.2 необходимо сохранить! для пхп проще воспользоваться сессиями - всё. ключи доступа получены и можно что-нибудь спросить у твиттера, например: $to->OAuthRequest('https://twitter.com/account/verify_credentials.xml', 'GET', $token)); ах да, у Абрахама в этом месте ошибка в параметрах
- пытливый читатель попросит добавки в виде описания процесса для десктопных. пожалуйста: пин-код из п.9 нужно использовать как oauth_verifier из п.10
- voila!
На прощание ссылка для базовой авторизации - красиво выглядит класс http://github.com/jdp/twitterlibphp
зы: внимательный читатель заметил, что твиттер не требует обязательного указания сигнатуры ;)
upd: когда гугл включил статистику для блогспота, я был весьма удивлён огромной для такого скромного бложика посещаемостью этой статьи...
читатель! не стесняйся благодарить автора переводом любой суммы в йандекс-кошелёк 410011133049553 :) (https://money.yandex.ru/shop.xml?scid=1269)
2010/02/13
OpenID, Zend И все-все-все
Рекомендую означенный блог к ознакомлению, масса информации для нубов в зенде; многого вы не найдёте в официальной документации.
Забавность произошла у меня с зендом. Есть у них такое место, как 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) ;
зы: Другие типы сдвигов делаются аналогично. Развивая тему, можно даже связать сдвиги с колбеками и завернуть в класс.
Успехов
2009/12/27
Попадаются ж такие удивительные личности
2009/12/19
Не могу молчать!
2009/12/16
йаСМИ в логах
2009/12/09
ubuntu и macos
2009/11/30
Разное, текущее
2009/10/31
Как написать фреймворк за два часа, часть 1, про Сущности и Хранилища
Наше тело получает жизнь из пустоты. Существование там, где ничего нет, составляет смысл слов: "Форма есть пустота". Слова же: "Пустота есть форма" свидетельствуют о том, что пустота содержит в себе вещи. Не следует полагать, что пустота и вещи суть различны.
interface CRUD{public function & create();public function & read($criteria);public function update();public function delete($criteria);}
abstract class StorageEngine implements CRUD{protected $__entity;function __construct($what){ $this->__entity = $what; }function __destruct(){ $this->update(); }// здесь ещё раз список методов, т.к. конкретную реализацию оставим для неабстрактных классов}
Возврат значений по ссылке обеспечивает обратную связь сущности (ещё не объявленной) с хранилищем, которое деструктором закрывает сущность, сохраняет её на физическом уровне.
interface XML{function asXML();function XPath();}
class Entity extends SimpleXMLElement implements XML{// здесь меня ожидало несколько весьма занятных ээ... особенностей реализации языка. например, нельзя переопределить конструктор. пришлось изобретать конструкцию загрузки сущностей из схем и других источников, типа такойstatic function load($source){if (isXML($source)) $xml = $source;if (is_file($source)) $xml = file_get_contents($source);return new self($xml);}}
2009/10/20
OpenID + php
Очень хорошо написано здесь http://www.oneid.ru/info/openid-php/ про библиотеку http://openidenabled.com/php-openid/ самая большая с обширной документацией. Много кода, требует cURL и матэкстеншн GMP
Но есть и альтернативные решения вроде http://www.phpclasses.org/browse/package/3290.html
upd: php-openid поддерживает и pgsql тоже =:)
upd2:
Не стал писать новую заметку, но увиденное слегка шокировало
файл примера из библиотеки:
// For OpenID 1, send a redirect. For OpenID 2, use a Javascript
// form to send a POST request to the server.
и оно действительно делает
$form_html = $auth_request->htmlMarkup(getTrustRoot(), getReturnTo(),false, array('id' => $form_id));
// otherwise, render the HTML.
print $form_html;
бред какой-то. мощнейшая библиотека, и столько хлама. надо переписывать, срочно.
там ещё и втф встречается типа
function & fn($param){ ... return new someClass($param) }
зы: документация уг, либо я её неправильно читаю. кста, если кому-нить захочется почитать доки, надо начать с класса Auth_OpenID_AuthRequest, а потом перейти к Auth_OpenID_Consumer. Auth_OpenID включить, разумеется, забыли; он находится в файле OpenID.php
2009/10/14
Как написать фреймворк за два часа, часть 0
- доступность понимания структуры и кода, чтобы начинающий программист мог его освоить
- некоторый уровень технологий, чтоб джыдаю было не скучно
- не изобретать велосипедов
- зы: совсем забыл! заложить в архитектуру максимально возможный уровень расширяемости и не заниматься преждевременной оптимизацией
Маленькое лирическое отсутпление. Во время работы в %COMPANYNAME% в среде программистов был изобретён принцип JMS Just Make Simple - Просто сделай проще. От часто прозносимых фраз: "Давай сделаем это проще", "Я знаю как проще". Стали ли они продолжать линейку JMS CMS, я не в курсе.
- уже упомянутый PHP в связке с Apache. Тип связи с веб-сервером и сам веб-сервер могут быть любыми, это пока не принципиально, но Apache + mod_php весьма распространены, будем ориентироваться на такой тип.
- т.к. XML клиенту (пользователю) не интересен, подключим XSLT и нагрузим преобразованиями клиента (браузер) - проверено, работает
- добавим к этому грамотный CSS и какой-нибудь javascript framework: не мудрствуя долго, остановим выбор на jQuery
- выбор физического воплощения хранилища представил некоторую проблему. Основное требование: нативное хранилище объектов. Но объектно-ориентированные базы весьма нетривиальны и не удовлетворяют требованию простоты фреймворка.
Ещё одно лирическое отступление. В процессе поиска наткнулся на одно интересное решение: база не имеет собственного клиента, доступ через http RESTful или через API, возвращает xml или json, обращаться можно хоть из javascript. Оригинальное решение и достаточно старое. Но я не поставил вовремя закладку, а название забыл! %( Но в этот фреймворк тоже не подходит в виду излишней оригинальности.
Остановился на PostgreSQL с дополнением для XML, кстати, прекрасно работает.
Не забываем переложить бизнес-логику на базу, это её прямое назначение.
2009/10/09
Программисты, моноширинные шрифты и виндовс
На этот курьер я смотрю лет десять, наверное. Надоело. Бесповоротно.
Было выяснено, что тру-джыдаи давно используют нормальные шрифты, как то: Terminus и Consolas; затем, в процессе сёрфинга, к ним добавились Liberation, Bitstream Vera, и вспомнился Monaco. Выгуглено было страниц под сотню и выяснено, что:
- Consolas свободно сливается с сайта производителя. Но представляет собой Clear-Type шрифт, что мне не подходит технически: на ЖК с невысоким разрешением клеартайп размазывается между пикселями. Но кому глаз не режет - в принципе, хвалят.
- Туда же, кстати, ушёл Bitstream Vera, который вроде бы и есть в поставке висты, но можно слить с гнома.
- Monaco ищется достаточно легко, шрифт старый, известный. Но не нашёл русских букв.
- Terminus я искал долго. В смысле, чтоб с кириллицей. Так и не нашёл. Без кирилицы - "первая ссылка в гугле". Если у кого вдруг есть terminus-cyr.ttf, пришлите, пожалуйста на почту.
- В процессе поисков были обнаржуны залежи полезного, но буржуинского http://stackoverflow.com/questions/4689/recommended-fonts-for-programming, http://www.codeproject.com/KB/work/FontSurvey.aspx, http://damieng.com/blog/2007/11/14/droid-sans-mono-great-coding-font. А также поставлен растровый фонт из этой ветки. Первая удача! он заработал. Мне понравилось
- И Liberation - это шрифт от RedHat. Можно взять с официального сайта. Было ли это ошибкой, но сначала я слил и поставил файл с самым большим номером версии, но шрифт в списке не показался. И я пошёл искать всё прочее, о чём выше. А потом я слил файл с самым коротким названием ;) и заработал Liberation Mono, остальные из пакета почему-то отказались.
Не прощаюсь
2009/10/07
Юзабилити не существует
Среди свитков, висящих на стене у господина Наосигэ, был свиток со словами: "К важным делам следует относиться легко".
Как я написал в каком-то каменте, меня не перестают удивлять люди, занимающиеся как бы "юзабилити". Хабрапипл вполне представляет, чем чреваты подобные хабразаявления.
Казалось бы, толпы народов съезжаются, устраивают конференции, изводят тонны макулатуры и человеко-лет. На что? А ни на что. Сейчас в очередной раз посмотрим, как получать деньги из воздуха.
Ведь и правда, нельзя делать подобные заявления голословно, нето
Университетов мы кончали, распишем всё по трафарету.
Начнём с названия. Юзабилити - us-ability use-ability - хмм... возможность использования? в приниципе, это бинарное состояние: можно пользоваться \ нельзя пользоваться. Но километры копий не даром же сломаны?
Хорошо, вспомним, что "абилити" имеет характеристический оттенок, а "юз" может служить мерилом полезности. Наверное, предполагаем дальше, эти замечательные люди изучают степень пользибельности ээ... объектов окружающего мира, замеряют её специальными полезнометрами, строят кучу графиков и схем, по которым оказывается, что лимон, выращенный на солнечной стороне холма на 5 полезнопоинтов полезней.
На таком материале делают докторские.
Включив немного мозга и обратившись к
Оно не является научной дисциплиной по причине отсутствия аксиоматического аппарата, объекта исследования и подхода изучения - это почти основные элементы, отличающие (характеризующие) науку от прочих сфер человеческой жизнедеятельности. (Не лезем в философию и проблему демаркации, ок?)
Но оно и не является сферой человеской деятельности!
Словцо это обозначает всего лишь определение понятия в подразделе эргономики - микроэргономике. ("обозначает определение понятия" это я красиво загнул ;) вообщем, вы поняли, да?)
...the extent to which a product can be used by specified users to achieve specified goals with effectiveness, efficiency and satisfaction in a specified context of use.
Э-э! посвятить всего себя изучению одного понятия - задача, достойная философа. Ещё раз к месту слово "докторская". Но я подозреваю малое количество мизантропов-отшельников среди этих удивительных людей.
Увидев этот свиток, мастер Иттэй добавил: "К несущественным делам следует относиться серьёзно".
Пойдём с другой стороны, попытаемся сформулировать род занятий "юзабелист" через перечисление (грязный антинаучный хак). Занятие представляет собой попытку предсказать реакцию (удовлетворённость) и поведение (продуктивность) определённых групп людей при попытке взаимодействия (эффективность) с продуктом.
Вот для чего сотни мегабайт букв, озаряет нас внезапная догадка! Юзабелист подобен древнему врачу, практически вслепую ведущего команду инженеров, проектировщиков, маркетологов, художников и рабочих сцены к светлому приятию конечным пользователем светлых идей, воплощённых в качественном продукте.
Метод блондинки и динозавра, на мой взгляд, даёт большую вероятность сразу, чем метод проверки сайта по продаже эксклюзивных скрепок магнатам в красных штанах, применённый на магнатах в синих штанах.
Не надо быть тонким знатоком человеческих душ, чтобы доказать, что у плотников нет интернета.
Попробуем дать хоть какое-то научное обоснование.
По моему скромному мнению, человеческими деяниями управляют два фактора. Точнее, даже один. Инстинкты. Не будем опускаться до полной павловщины, это сильное такое допущение, но остановимся, как на одном из самых понятных.
Так вот, люди всё делают либо по привычке, либо по глупости. По привычке выполняются знакомые операции, уже повторенные несколько раз: свет вкл\выкл, зубная щётка на полке слева, крестик справа сверху, ссылка - синяя и\или подчёркнутая, центр-клик = опен ин нью таб, поиск где-то рядом, в меню можно выбирать, между абзацами обычно отступ два\полтора интервала, колбаса хороша в салате. Это не только приобретённые инстинкты, но и врождённые, типа частоты дыхания, изменения состояния от воздействия определённых цветовых сочетаний, инстинкт слежения [взглядом], моргание, зевание.
По глупости делается все остальное. Не именно от безрассудства, а в собирательном смысле: по незнанию, из шалости, из любопытства. Все эти лягушачьи лапки на железных подносах, яблоки, эврики, байтики и смайлики.
Повторим схему поведения людей: когда человек сталкивается с неизвестным, он: а) пугается б) призывает на помощь сильные стороны личности (что-либо одно): память, силу, ловкость,
Таким образом получается, что юзабилити, как наука, могла бы располагаться на стыке физиологии, психологии, философии, инженерии и архитектуры, изучая психомоторные реакции контрольных групп на цветоформовые раздражители. Что-то я не наблюдаю в сообществе подобных выкладок. Но только советы, свалку несистематизированных правил (хорошо, их можно назвать эмпирическими), и предложения обучить, исправить,
Это как с консультантами по семейным проблемам: вроде и проблема есть, и человек, её решающий, и некоторым даже помогает. Или с гербалайфом: и вещь вроде полезная, не придерёшься, но стал нарицательным не просто так. Вот так и с юзабилити: схемы, графики, советы, конференции, все пироги...
[здесь должен был быть для примера разбор сферического сайта, но пока хватит. если будет нужда, дополню. да, я оказываю консультации за деньги, в том числе и по юзабилити]
Успехов и до новых встреч.
Юзабилити не существует! =;)
2009/10/01
Торвальдс о GIT
Смотреть и слушать на хабре или ютубе