Хроники лаборатории
Вкратце о текущем состоянии дневника:

В связи с загруженностью очень интересной работой, почти перестал вести блог. Но, как легко убедиться, пролистав блог слегка назад, так было не всегда.
рубрика приемчики // все рубрики
страница: 1 1, 2
Сказ о том, как я вирус обхитрил-2

Прошлый метод объегоривания php-вирусов продержался три года. Экземпляр, отловленный недавно, сканировал все .php-файлы и дописывался после каждой мантры «<php». Специально для него был придуман еще один способ: регистрация еще одного .php-расширения в .htaccess. Например, так: AddHandler application/x-httpd-php .zero (строго говоря, прием придуман, конечно, не мной, но применить его именно для этих целей я додумался сам). Теперь во всех ссылках внутри скриптов надо заменить .php на .zero и переименовать файлы. Думаю, этот способ проработает еще полгода, прежде чем вирусы начнут сканировать содержимое всех файлов. Но на этот случай я уже разрабатываю более хитрый ответ...


комментарии: 7 RSS HTML рубрики: приемчикиjuick twitter facebook вконтакте
Логин из Facebook. Как это работает.

Вспомнил, что совсем забыл рассказать, как я сделал авторизацию из Фейсбука. Итак, как это делается?

Во-первых, надо создать свое приложение (получить «секретный ключ» и идентификатор приложения). Я с трудом нашел ссылку, по которой это делается, так что делюсь: http://facebook.com/developers.

Во-вторых, куда-то на сайте воткнуть ссылку вида https://www.facebook.com/dialog/oauth?client_id=ID-приложения&scope=email&redirect_uri=адрес-куда-вернется-результат-запроса.

По сути, при нажатии на эту ссылку Facebook смотрит, залогинен ли пользователь, спрашивает пользователя разрешения предоставить вашему приложению требующуюся информацию (выставляются права доступа для приложения) и возвращает кодированный ответ. Код мы снова гоним к Фейсбуку, получая token (типа временный аусвайс на работу), а затем получаем данные пользователя. Все довольно просто:

$app_id='ID-приложения';
$app_secret='секр-ключ-приложения';

$code=$_REQUEST["code"];
$token_url="https://graph.facebook.com/oauth/access_token?client_id=".$app_id."&redirect_uri=".urlencode($my_url)."&client_secret=".$app_secret."&code=".$code;
// Получаем token
$access_token=file_get_contents($token_url);

// А теперь, с token'ом наперевес, считываем информацию
$graph_url="https://graph.facebook.com/me?".$access_token;
$e=file_get_contents($graph_url);


А теперь можно сделать $e=json_decode($e); и использовать данные, как заблагорассудится. Я, например, беру свойства $e->link, $e->name и $e->email.

Если кому-то поможет (или, наоборот, что-то не получится) - пишите.


комментарии: 3 RSS HTML рубрики: приемчикиjuick twitter facebook вконтакте
Логин из вконтакта. Как это работает.

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

Во-первых, надо создать свое приложение. Можно не загружать SWF-файл, достаточно получить так называемый «секретный ключ» и идентификатор. Это делается вконтакте, на вкладке с приложениями.

Во-вторых, куда-то на сайте воткнуть кнопку «войти вконтакте» (я ее вынес на отдельную страницу, нечего скриптами страницы блога нагружать).

Под приложение после логина установится куки вида vk_app_ID-приложения. Осталось только ее «поймать» и разобрать:

$vk_auth=trim($_COOKIE["vk_app_ID-приложения"]);
$secret_id='секр-ключ-приложения';
$vk=explode("&",$vk_auth);
$md5_vk=md5($vk[0].$vk[1].$vk[2].$vk[3].$secret);
list($a,$vk_login)=explode("=",$vk[1]);
$vk=explode("=",$vk[4]);

if ($md5_vk==$vk[1]) { // если подпись сходится...
$api_id = "ID_приложения";
$method = "getProfiles";
$uids=$vk_login;
$v="3.0";
// сигнатура для проверки
$sig=md5("api_id=".$api_id."method=".$method."uids=".$uids."v=".$v.$secret_id);
$e="http://api.vkontakte.ru/api.php?api_id=".$api_id."&method=".$method."&uids=".$uids."&v=".$v."&sig=".$sig;

// посылаем запрос, чтобы получить данные о пользователе
$p=file_get_contents($e);
}


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


комментарии: 2 RSS HTML рубрики: приемчикиjuick twitter facebook вконтакте
Картинка-счетчик на PHP

Есть у меня одна абсолютно бесполезная, но забавная фигулька для LiveInternet.ru: счетчик возраста дневника. Некоторые начали спрашивать, как он устроен. Спрашивали - отвечаем. Сегодня я расскажу вам, как сделать подобный счетчик самостоятельно. Приступим?

Хотя перед тем, как начать, уточню: у вас должен быть в распоряжении хостинг и поддержка на нем PHP с включенным модулем GD. Уже страшо? То ли еще будет. Поехали.

Для начала выберем, что будет отсчитывать счетчик. Я за пример взял одно давнее свое ожидание, выход «StarCraft 2». Blizzard обещает выпустить его двадцать седьмого числа, вот до этого дня и будем считать секунды.

Исходя из темы выбираем фоновую картинку:


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


комментарии: 15 RSS HTML рубрики: приемчикиjuick twitter facebook вконтакте
oEmbed, YouTube и все-все-все

В процессе копания в HTML-коде ютубовских страниц (с недавнего времени старые методы получения прямых ссылок на видео перестали работать, хочется узнать, как это делать в новых условиях) я наткнулся на забавнейшую строку:

<link rel="alternate" type="text/xml+oembed"
href="http://www.youtube.com/oembed?url=http%3A//www.youtube.com/watch?v%3D8w8SofAkClg&format=xml"
title="Трейлер "Там, на неведомых дорожках", версия 2009г" />

Интересно, думаю, что за «xml+oembed» такой? Да еще и «&format=xml»? Оказалось все довольно просто: в нашу жизнь тихо и незаметно вошла новая технология - oEmbed. А в этой alternate-ссылке указывается адрес, где можно получить роботоориентированную информацию о самом главном, находящемся на данной странице (в данном случае - о видеоролике), вплоть до HTML-кода для встраивания. Немного поизучав новую интернетную игрульку, я сделал на ее основе новый тег для дневника: [youtube=адрес ролика]. Например, [youtube=http://www.youtube.com/watch?v=8w8SofAkClg]. Движок блога лезет на указанную страницу и получает оттуда код для вставки. В идеале надо бы сделать универсальный тег [oembed=адрес страницы], но тогда есть риск недобросовестного использования: мало ли кто что пришлет под видом кода размещения интересного контента.



комментарии: 3 RSS HTML рубрики: приемчикиjuick twitter facebook вконтакте
Предъявите частоту.

У каждого дела - запах особый... Тьфу, то есть я хотел сказать, у каждого человека свой письменный стиль, свой словарный запас, соответственно своя частота употребления тех или иных слов и букв. Но если словарный запас в блогах разных людей мне лень анализировать, то частотную картину по буквам представить довольно легко. Я взял три своих записи и три записи другого блоггера, и построил немножко графиков:



V.exeRALEXRUS

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

При определенной доле фантазии можно объявить, что дневники со схожими частотными характеристиками имеют схожих по мышлению хозяев. Исходя из этих соображений, я попробовал найти записи, коррелирующие на 98 и более процентов с моими. Но сначала из-за ошибки в коде я нашел гнездо англоязычных спамеров. А потом нашел пару знакомых, которых и так читаю. А потом... В общем, пока ничего путного еще не придумал. Зато после того, как объяснил Сами Знаете Кому, как я отловил новых спамеров, на Одном Блогосервисе по ошибке оказались удаленными десяток сообществ - видимо, ввиду малого количества текста характеристики записей жутко выбивались из стандартной характеристики осмысленного текста и были приняты за спам.

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


комментарии: 21 RSS HTML рубрики: приемчикиjuick twitter facebook вконтакте
Переводчик на язык Йоды. Изнанка.

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

Итак, на вход приходит текст. Например, такой:
Однажды, в студеную зимнюю пору, я из лесу вышел; был сильный мороз. Гляжу, поднимается медленно в гору лошадка, везущая хворосту воз.

Что дальше?

В первую очередь надо привести его к удобоваримому виду: убрать двойные пробелы, символы перевода строки, спустить регистр в нижний. Затем надо «приклеить» предлоги к словам, идущим за ними (чтобы получилось одно «слово», окруженное пробелами) с помощью какого-нибудь специального символа, который потом можно будет убрать. Например, символ подчеркивания. Еще желательно «приклеить» прилагательные к существительным. Но другим «клеем» (я выбрал знак плюса), я потом поясню почему. Это надо, чтобы при перемешивании слов смысл не сильно искажался:

однажды, в_студеную+зимнюю+пору, я из_лесу вышел; был сильный+мороз. гляжу, поднимается медленно в_гору лошадка, везущая+хворосту воз.

Далее аккуратно расчленяем текст на предложения, запоминая чем заканчивается каждая строка:

1. однажды, в_студеную+зимнюю+пору, я из_лесу вышел;
2. был сильный+мороз.
3. гляжу, поднимается медленно в_гору лошадка, везущая+хворосту воз
.

При грубом приближении каждое предложение состоит из субпредложений, разделенных запятыми:

1.1 однажды
1.2 в_студеную+зимнюю+пору
1.3 я из_лесу вышел;

2.1 был сильный+мороз.

3.1 гляжу
3.2 поднимается медленно в_гору лошадка
3.3 везущая+хворосту воз


Обращу еще раз внимание - «склейки» из прилагательного с существительным считаются одним словом.

Перемешиваем внутри каждого субпредложения слова. Для этого бьем субпредложение на слова, используя пробел как разделитель, перемешиваем слова, затем случайным образом переставляем местами слова в «склейках» и склеиваем обратно субстроки:

1.1 однажды
1.2 в_студеную+пору+зимнюю
1.3 вышел из_лесу я;

2.1 был мороз+сильный.

3.1 гляжу
3.2 в_гору поднимается лошадка медленно
3.3 хворосту+везущая воз


Склеиваем обратно строки, возвращая знаки, которыми заканчивались строки (правда, точку с запятой возвращаем простой точкой), заодно первую букву каждой строки делаем строчной:

1. Однажды в_студеную+пору+зимнюю вышел из_лесу я;
2. Был мороз+сильный.
3. Гляжу в_гору поднимается лошадка медленно хворосту+везущая воз


Склеиваем строки вместе, убираем служебные символы:

Однажды, в студеную пору зимнюю, вышел из лесу я. Был мороз сильный. Гляжу, в гору поднимается лошадка медленно, хворосту везущая воз.

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


комментарии: 8 RSS HTML рубрики: приемчикиjuick twitter facebook вконтакте
Быть iPhone'ом.

Рускоязычный сегмент Интернета начинает подстраиваться под iPhone. Причем версии под этот мобильник могут заявить, что стесняются показываться на большом мониторе и предназначены для интимного, доверительного просмотра на свежеприобретенном аппарате от Apple. А что делать, если природное любопытство (нет, ну все-таки, как оно для iPhone смотрится?) не дает покоя, а только ради этого покупать навороченный девайс не дает жаба-симбионт? Выход, разумеется, есть.

Я уже писал о программе Proxomitron (где взять, где посмотреть, как настраивать), позволяющей фильтровать весь HTTP-трафик. Ее-то мы и будем использовать.

Откроем главное окно программы и зайдем в меню «Headers»:


Там выберем какой-нибудь фильтр, связанный с User-Agent (например, как показано на рисунке) и нажимаем «Dupe» (создаем дубликат фильтра):


Дубликат переименовываем в User-Agent: iPhone и вписываем в Replacement text следующую строку:
Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A537a Safari/419.3
и жмем «Ok»


Осталось нажать «Apply», чтобы фильтр задействовался, и снять галочку с того фильтра, который мы дублировали, чтобы User-Agent подменялся единожды:


Кроме заголовка, нам надо подстраховаться от JavaScript-детектирования (оно, например, используется на сайте Apple). Для этого создадим еще один фильтр. Из главного окна программы теперь вызываем список web-фильтров кнопкой «Web page», и создаем новый фильтр (кнопка «New»):


Заполняем поля согласно рисунку:


Что мы сделали? С помощью программы-фильтра мы подделали User-Agent (строку, которую посылает браузер в ответ на вопрос сервера «ты кто?») оригинальным User-Agent от встроенного в iPhone браузера, найти который в Интернете не составляет особого труда. Вторым фильтром мы заменили все выяснения версии браузера с помощью navigator.userAgent строкой с заведомо нужным текстом.

Теперь все сайты точно будут думать, что ваш браузер - Safari на iPhone.


комментарии: 6 RSS HTML рубрики: приемчикиjuick twitter facebook вконтакте
Приложение «Раздача аватарок». Изнанка.

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

Итак, приложение «Раздача аватарок» суть фильтр. В базу заносится ссылка на картинку и... В принципе, это самое трудоемкое, что делает приложение. Конечно, перед занесением в базу картинки скрипт ее проверяет на адекватность (размер - не более 1Мб, тип - GIF или JPEG). Остальное делает скрипт, выдающий пользователю картинку.

Ссылка на картинку-аватарку в приложении выглядит так:
http://vexer.ru/liru/liruavs/ссылка_на_картинку
Где ссылка_на_картинку - ссылка без «httр://»
Таким образом выдающему скрипту передается ссылка на картинку. Скрипт снова проверяет картинку на адекватность, при необходимости пропорционально уменьшает до требуемых 150x150 пикселей (при уменьшении, правда, большие анимированные картинки становятся статичными) и выдает пользователю. В случае неадекватной картинки ссылка на нее стирается из базы, а пользователю показывается надпись «аватарка не найдена». Собственно, это все.

Непосредственно об адекватности картинки скрипт судит по передаваемым метаданным:

PHP:

$fi 
fopen($file_name,"r");
$inf stream_get_meta_data($fi);
fclose($fi);

$size_file=0;
$type_file="";

foreach(
$inf["wrapper_data"] as $vv) {
  if (
stristr($vv,"content-length")) {
    
$v explode(":",$vv);
    
$size_file=trim($vv[1]);
  }
  if (
stristr($vv,"content-type")) {
    
$v explode(":",$vv);
    
$type_file=strtolower(trim($vv[1]));
  }
}



Собственно непосредственно на сервере, получается, я ничего не храню. Вот такой финт ушами.


комментарии: 9 RSS HTML рубрики: приемчикиjuick twitter facebook вконтакте
Самый лучший способ спрятать...

Всe знaют сaмый лyчший спocоб cпрятать чтo-то, вeрнo? Да, нe прятaть. А полoжить гдe-тo на виднoм мeсте. Этo я тaк сильнo издaлека подхожу к разговopy о том, как можно спpятaть свoй комментapий или cвою зaпись в днeвникe (да и не только в дневникe) от пoисковoй мaшины. Метод cтаpый, но действeнный до сих пор, как это ни странно.

Pечь идет о зaменe одних бyкв дрyгими, пoxoжими. Напримеp, все руcские «р» на латинские «p». Или наоборот. С точки зрения поисковoй машины это двa совершеннo разных cимвола, а для челoвека все равно. Соответственно, если чeловек пытается искать нopмальные русские слова, то «коверканные» слова не будут приниматься поискoвикoм во внимaниe. A коверкaть мoжно мнoгие буквы... «С», «р», «у», «е», «о», «х»... Ну, фантазия подскажет. Или посмотрите пoпpистальнее на клавиатyрy, все поймете сами.

Кстати, менять можно не все бyквы, а только чaсть. А это море комбинaций.

И напоследoк: по ceкрету вам скажу, что эту самую мою запись, которyю вы сейчаc закaнчивaете читaть, поиcкoвиком бyдeт слoжно нaйти.


комментарии: 18 RSS HTML рубрики: приемчикиjuick twitter facebook вконтакте
страница: 1 1, 2
Подписаться


Рубрики:

жизненное
аудио-я
видеомонтаж
фотоохота
ремонт
стихи
рассказы
синематограф
библиотека
фонотека
точка зрения
FAQ
приемчики
придумалось
ожидания-прогнозы
допридумано
рингтоны
это я так шучу
обои
микрозарисовки
опасный Интернет
я в печати
поездки-тусовки
смехоспам
мой код
футболки
игродром
подводная жизнь
сайтоводство
программы
персоны
LI.ru
аватарки
курсоры


Разное:

Полка с фильмами
Книжная полка
Полка с играми
Фотоальбом
Избранное


Календарь записей

2017 (10)
май (2)
апрель (1)
март (2)
январь (5)
2016 (10)
2015 (3)
2014 (12)
2013 (10)
2012 (17)
2011 (84)
2010 (172)
2009 (228)
2008 (263)
2007 (154)
2006 (4)
2005 (1)
2004 (1)
2002 (1)
2001 (9)
2000 (9)
1999 (1)
© сайт разработан и поддерживается мной.