SocailWeb на userscripts.org

Добавил скрипт в каталог скриптов

http://userscripts.org/scripts/show/74670

пробуем.

SocialWeb небольшой прототип для общения пользователей внутри сайта

Доброго времени суток, хабравчане!

Хочу вам продемонстрировать небольшой прототип который призван посмотреть актуальность данного скрипта.

Суть скрипта вот в чем – на некоторых сайтах нет возможности комментировать страницу/сайт а этого иногда очень хочется. С другой стороны всегда интересно узнать кто так же читает те же новости, интересуется схожими тематиками что и я.

В итоге появился такой скрипт, работает в FireFox с GreaseMonkey и проверялся в Opera 10 – работает неплохо.

Какие возможности дает скрипт?
  1. Просматривать кто находится на той же странице, что и я
  2. Просматривать кто находится на том же сайте, что и я
  3. Отправлять и получать сообщения, тем кто в онлайне и находится на этом же сайте.
  4. Оставлять и читать комментарии к сайту или странице


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

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

Так же, существует глобальный игнор лист который отсеивает любые УРЛ где упоминается «bank»,»money»,… чтобы не нарушить ненароком их работу.

Писался ради забавы и собственного интереса.

Для владельцев FireFox + GreaseMonkey вот прямая ссылка на скрипт.

Для владельцев Опера или тех, у кого нет плагина – здесь я написал более подробную инструкцию.

Надеюсь Вам понравится задумка.

Спасибо за внимание.

До встречи в скрипте.

UPD: Забыл уточнить. Для корректной работы должен передаваться Referer

Flash && Cookies && Session PHP && Uploadify

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

Например такая проблема явно касается плагина jquery uploadify.

Самое простое решение что приходит в голову – передавать sessid.

Для плагина uploadify при указании обработчика, необходимо в урл добавить ?PHPSESSID= и взять значение из куки файлов. а на сервере уже включать ту сессию, которую передали.

думаю вектор решения проблемы понятен :)

T9 Своими руками

Привет читатели!

Набирая смс или просто текст на мобильном телефоне довольно давно хотел сделать Т9 алгоритм самому.

Алгоритм понятен, но все не доходили руки.

Сегодня все же собрался и получилось сделать.

Итак первым делом нужно сформулировать то что хотелось получить.

Задача: Сделать аналог клавиатуры мобильного телефона и набирая цифры – получать список слов.
Ограничение: Особых ограничений не делалось, все таки работа для just for fun, но хочется чтобы было в районе 1 секунды парсинг.
В качестве фичи: Поддержка языков.

В качестве базы слов был взят файл с 26,000 слов.

Теперь сам алгоритм:

Мой алгоритм условно разбит на 2 части.
1 часть – выбирает все слова которые начинаются на одну из букв соответствующей цифре.
То есть для цифры 3 выбираются все слова начинающийся на d,e,f.

2 часть – последовательно проходить по всем числам и отсеивать неподходящие слова.

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

В качестве демонстрации используется jquery и эмуляция кнопок телефона.

Посмотреть можно здесь

Теперь сам класс на РНР:


class T9_Exception extends Exception {
}

abstract class T9 {
    protected $wordlist = array();
    protected $enum = array();
    protected $mb_support = true;

    public function mb_support( $status = true ) {
        $this->mb_support = $status;
    }
    public function __construct( $filename=null ) {
        if( $filename )
            $this->load($filename);
    }
    public function load( $filename ) {
        if( file_exists($filename) && is_readable($filename)) {
            $this->wordlist = file($filename);
            //array_walk( $this->wordlist, create_function('&$w', '$w=trim($w);'));
            return ;
        }
        throw new T9_Exception("Can not read $filename", 100);

    }
    /**
     * Fetch data from wordlist
     * @param string $input
     * @return array
     */
    public function fetch($input) {
        $compare = array();
        $total = count($this->wordlist);
        for($i=0;$i<$total;$i++) {
            $len = strlen($this->enum[$input[0]]);
            for($j=0;$j<$len;$j++) {
                if( $this->mb_support == true ) {
                    if( mb_strpos($this->wordlist[$i], $this->enum[$input[0]][$j]) === 0)
                        $compare[]=$this->wordlist[$i];
                }
                else {
                    if( strpos($this->wordlist[$i], $this->enum[$input[0]][$j]) === 0)
                        $compare[]=$this->wordlist[$i];
                }

            }
        }
        for($i=1;$ienum[$input[$i]]);$j++) {
                    $letter = $this->enum[ $input[$i] ][$j];
                    if( $this->mb_support == true) {
                        if( mb_strtolower($compare[$k][$i]) == $letter)
                            $newcompare[] = $compare[$k];
                    }
                    else {
                        if( $compare[$k][$i] == $letter)
                            $newcompare[] = $compare[$k];
                    }

                }
            }
            $compare = $newcompare;
        }
        return $compare;
    }
}

class T9_English extends T9 {

    protected $enum = array(
            0 => '',
            1 => '',
            2 => 'abc',
            3 => 'def',
            4 => 'ghi',
            5 => 'jkl',
            6 => 'mno',
            7 => 'pqrs',
            8 => 'tuv',
            9 => 'wxyz',
    );
}

class T9_Russian extends T9 {
    protected $enum = array(
            0 => '',
            1 => '',
            2 => 'абвг',
            3 => 'деёжз',
            4 => 'ийкл',
            5 => 'мноп',
            6 => 'рсту',
            7 => 'фхцч',
            8 => 'шщъы',
            9 => 'ьэюя',

    );
}
if( !isset($_GET['input'])) exit;
try
{
    $t9 = new T9_English('words-english');
    $t9->mb_support(false);
    echo json_encode( $t9->fetch($_GET['input']) );
}
catch(T9_Exception $e)
{
    echo $e->getMessage();
}

UPD: некоторые байты пропали при выводе, по этому выложил исходник так же по этой ссылке:
http://anton.in.ua/demo/t9/t9.txt

Русский словарь проверять не стал, но судя по алгоритму должно работать так же.

Вот такая небольшая разминка для ума.

Всем спасибо за внимание.

PEAR Pager – разбивка на страницы

Возникает ситуации когда контент нужно разбивать на страницы.
Для того, чтобы не делать велосипед нужно поискать уже готовые решения на PEAR.

Нужное решение есть. Это PEAR-Pager

Сейчас я рассмотрю пример.

Предположим у нас есть таблица с книгами.
Нам нужно выводить по 10 книг и добавлять страницы, чтобы можно было смотреть дальше.

Саму разбивку на страницы сделать достаточно просто.
Итак, подключаем наш пагинатор:

	include("pear/pager/pager.php");
	$options = array(	// Настраиваем
				'mode'		=> 'Sliding',	// Подробности на сайте
				'totalItems'	=> 100,		// Всего объектов
				'perPage'	=> 10,		// сколько объектов у нас на странице
				'delta'		=> 4,		// сколько страниц показывать относительно текущей влево и вправо
				'urlVar'	=>'offset',	// название переменной в которой будет номер страницы, по умолчанию pageID
				'itemData'	=> $books,	// Данные книг
			);

	$pager = Pager::factory( $options );

	// Получить данные книг для 1й страницы
	$books_page1 = $pager->getPageData(1);

	// Второй страницы
	$books_page2 = $pager->getPageData(2);

	// Выводим разбивку страниц.
	echo $pager->links;

Как видите все достаточно просто, но есть несколько моментов для поставленной задачи – вывод книг по страница.

1. В данном примере массив всех книг заталкивается в пейджер и потом получается
2. В данном примере явно указано, что всего книг 100. В общем случае это не верно.
3. Есть косяк при выводе ссылок страниц (об этом позже).

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

Использование LIMIT означает то, что обычным методом узнать сколько ВСЕГО книг невозможно, но возможно если запрос модифицировать.

В помощь нам приходит SQL_CALC_FOUND_ROWS который добавляем в запрос:

SELECT SQL_CALC_FOUND_ROWS id,title,author FROM books LIMIT x,10

Где «х» – нужное смещение.

А для того чтобы узнать, надо следом запрос:

SELECT FOUND_ROWS();

Все! Теперь нашу разбивку можно превратить в такой код, который использует 1 запрос и при этом с БД ничего лишнего не берется.

Вот так достаточно просто и быстро можно создать разбивку страниц.

Offtop: Советы

Если убрать части с песней – будет ок, хотя скорее этот ролик хороши и так – в целом

FireBug detect in Javascript / Console

FireBug предоставляет очень удобный инструмент разработки и отладки скриптов на стороне клиента.

В инструменты FireBug так же доступно использование консоли для вывода.

Более подробная информация про консоль можно найти здесь.

в FireFox все хорошо работает, но при проверке в других браузерах, в том же ИЕ, это недоступно и как следствие появляются ошибки.

По-этому есть отличный способ совместить приятное с полезным.


window.console.firebug

И как следствие использовать можно так:


DEBUG = 1;// 0-off, 1-on
function tlog(str)
{
    if(DEBUG && window.console) console.log(str);
}

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

Система рейтингов. Новая идея.

Добрый день.

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

Вступление.

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

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

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

Проблемы

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

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

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

Существующая система на хабрахабр.ру.

Проблема заключается в том, что у пользователя есть 2 оценки его влияния:

1. Карма
2. Рейтинг

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

Второе – количество голосов.
На сайте пользователь может голосовать за комментарии и за карму только n и m раз соответственно. То есть некоторая борьба от тролинга есть, но все же не решает ее и ограничивает пользователя к действиям. Почему обычный пользователь не может проголосовать за комментарий?

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

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

Что предлагаю?

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

Ниже показана небольшая картинка.
Поясняю, в системе есть 2 типа оценок.

Первый основан на оценках пользователей конкретного автора, это могут быть оценки от 1 до 10, а функция расчета как среднее число. Данный рейтинг ни на что не влияет и служит просто так, т.е пользователь с отрицательным ВРП может вполне пользоваться сайтом.

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

Выигрыш данного подхода.

Какие проблемы решает текущий подход:

1. Отсутствие тролинга.
По скольку рейтинг пользователя (системный) скрытый от глаз пользователей, то соответственно о нем никто не знает следовательно неизвестно что даёт минус материалов для конкретного автора.
Тролинг создается специально для того, чтобы насолить автора, понизить его рейтинг, не дать возможность писать на статьи (как на хабре), не зная что дает минус порождает отсутствие мотивации тролинга.
Максимум что можно – поставить 1 бал в ВРП, который ни на что не влияет.
По скольку нету цели тролинга и отсутствие мотивации можно снять ограничение по количеству голосов и разрешить пользователю голосовать столько комментариев, сколько угодно.
Дабы максимально пресечь даже порывы тролинга – ввести ограничение на количество голосов по времени на пользователя. Например запретить голосовать более 5 раз за комментарии одного и того же человека в течении 10-20 минут.

2. Блокировка пользователя.

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

Предлагаю такое решение. Голос пользователя с течением времени угасает до константы.

Например +1 через месяц будет равен 0.3, то есть делится на 3.

Что это дает? Пользователь разместивший плохую статью, получает -100 голосов и блокируется системой, пользователь в печали писать ничего не может, но через неделю-месяц его рейтинг угасает и становится -30 и вновь разблокирован.

Создал еще негатив – получи еще.

То есть система дает шанс и не один пользователю реабилитироваться, то чего нет на хабре.

Ну если пользователь совсем тугой, то перейдя некий предел он заблокируется навсегда.

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

3. Спам

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

Конкретная рекомендация хабрахабр.ру

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

Выводы

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

PS: Извиняюсь за ошибки в тексте.

РPS: Призываю к обсуждению с конкретной критикой.

DSL-2500U

Случилось так, что два дня назад у меня отключился модем от интернета, загорелась красная лампочка на «интернет».

Такое случается, редко, но бывает. Перезапустил модем – красная лампочка, захожу в админ-панель, смотрю статус – не подключается.

Думаю ок, перезапущу еще раз, и опа! Лампочка интенет вообще не горит! ни красная ни зеленая. WTF?

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

Делаю как говорят, звоню, мне отвечает уже другой оператор – не надо было жать «сброс» :-D .

Ну что ж, пришлось оставить заявку и ждать, пока мастер сможет починить.

Следующий день, я ждал-ждал-ждал… никого нет. Звоню, мне отвечают, что мастер может придти когда сможет, до 10 дней может идти о_О…

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

Прикол в чем, модем раньше у меня висел на ип: 172.17.17.1, а после того как он сбросился, он встал на стандартные – 192.168.1.1 – это и была причина того, что админка перестала быть доступной. Это я понял уже потом.

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

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

2 ночи я был без интернета, вначале было плохо, но в целом появилось время почитать книги, которые хотел, поделать свои проекты более плотно, в общем что-то в этом есть. Раньше ложился :-)

PHP: Tricks. O’Reilly

Попала в руки данная книга.

Зацепила внимание тем, что написано на ней: 100 советов и рекомендаций профессионалов.

Ну, думаю, книга должна быть хорошей, так как еще от O’Reilly плохо не читал.

Ну что, сказать что книга убога это не сказать ничего.

Данная книга призывает писать полноценный говнокод.

Адская смесь логики и хтмл, перемешанные «советы», один «совет» пишет что такое тэг div и что аттрибут id должен быть уникальным, рядом совет – шаблон стратегия.

Полная каша в книге, ничего не структурировано.

Некоторые куски кода заставляют задуматься о проф. пригодности автора.

Но самое тупое за все что я когда либо видел в книгах, это внимание(!) – содержание RTF файла на несколько листов!




Фотография разворота с адом

Интересные места выделил красным.

Тоже самое с Excel.

Работа c либами для XML? Нахера надо, есть же RegExp!
Да! Тупо берется файл и регекспом вытаскивается нужная информация. Где-то для парсинга это вполне может подойти, но здесь, в качестве учебного материала – я считаю не приемлемым, вообще не сказано о том же самом простом SimpleXML.

Есть трюк посвященный вытаскивания информации с википедии. И снова регекспами! Вопрос, почему тогда только википедия?
Причем прикол в том, что такое регексп и вообще как использовать – вообще ничего нет.

В общем книга, это тупо 100 тупых готовых решений, которые подойдут одному из тысячи и то я не уверен.

По 10 бальной шкале – 1.5.

НЕ ПОКУПАЙТЕ