Я безумен

2009-07-9

Новости на сайте посредством twitter’a

Filed under: Идеи,Разработка,JS — thekillerfox @ 8:55 дп
Tags: ,

Twitter становится достаточно популярным, но немного не понятно для чего его стоит использовать большинству людей. Сообщать знакомым различные новости это интересно, но возможно можно придумать что то еще.
Предположим у нас есть сайт. На котором что то постоянно происходит (пользователи добавляют новые ссылки, какие то небольшие изменения функционала), как на таком сайте должны выглядеть новости на главной странице или в боковом блоке? Небольшое описание новости, и если нужно ссылка на более подробный текст. Будет неплохо если про эти новости смогут прочитать в twitter аккаунте вашего сайта, или подпишутся на rss ленту. Так зачем же делать все это у себя, пусть twitter возьмет на себя хранение всех новостей на вашем сайте. Соответственно они будут в твиттере, и rss к ним будет предоставлен. Как мне кажется это удобно. Да и добавлять новость на сайт можно будет почти мгновенно, и при этом даже если сайт ляжет, сообщение об этом можно будет быстро послать в твиттер. Минус данного подхода в ограничение в 140 символов, которое налагает твиттер. Но зато новостям придется быть краткими и ясными. А для более подробного разъяснения можно поместить ссылку.
Теперь рассмотрим несколько вариантов каким образом на главную страницу вашего сайта можно будет привнести твиттер.
Тут можно различать два подхода:
1) При формирование главной страницы скрипт получит список сообщений и выведет их.
2) При открытии страницы пользователь ява скрипт подгрузит новости сам, и покажет их пользователю.
Рассмотрим для начала первый вариант, он удобен тем что пользователь получает уже сформированную страницу, со всеми новостями, минус это то что мы должны устанавливать соединение и постоянно получать новости, что замедляет генерацию страниц, да и траффик дополнительные получается. Если мы реализуем серверную часть на php, то чтобы не разбираться самим с парсингом вывода twitter’a (а там очень много различных вариант на выбор, вот как надо реализовывать API) мы идем на phpclasses.
Больше всего мне понравился My Twitter класс, даже не потребовалось допиливание. К тому же устанавливать статус все равно понадобится, например если какой либо пользователь добавил статью. Но что делать если у нас нет backend’a (мифический случай), или же задержка генерации страницы нас не устраивает. Тут мы переходим к способу номер 2.

Этот способ хорош тем что всю работу получения новостей берет на себя браузер пользователя, к тому же если задать интервал обновления то можно сделать так что новые новости пользователь увидет даже если не будет обновлять страницу. Минус в том что если у пользователя выключен js он не увидет новостей. Да и их загрузка через некоторое время после открытия главной страницы тоже может не понравится пользователю, но ведь этот способ можно использовать и для другого, например если у нас есть пользователь с указанным в профиле твиттер аккаунтом, мы можем подгрузить в профиль последние обновления twitter’а этого пользователя.
Так как в последнее время я немного шаманю с jquery то первым делом я полез искать плагин работы с twitter’ом для него. Как никак у twitter’a есть json api и соответственно ничто не мешает реализовать твиттер клиент на js. Так как все придуманно до нас, то решение быстро нашлось, это jquery.twitter,причем новая версия вышла вчера. Как удачно. Скачиваем и смотрим что внутри. Рисунок загрузчика, css’ка, jquery, плагин к нему и страничка с демо.
Для формирования вывода используется Twitter HTML Badge Customizer, для этого в коде подключается внешний js файл.

$.getScript("http://twitter.com/javascripts/blogger.js");

там определенны две функции twitterCallback2 которая собственно и формирует HTML код, и relative_time для формирования относительного времени (это запись в виде 5 days ago), я подумал что относительно время это хорошо, но надо пожалуй как то это дело руссифицировать. Встала проблема, так как в русском языке существительные принято склонять. И тут вспомнилась одна статья на хабре: Склонение существительных с числительными , косметические изменения и у нас есть такая же функция, но только переписанная на JavaScript.

function plural(n, form1, form2, form5)
{
	n = Math.abs(n) % 100;
                n1 = n % 10;
                if (n > 10 && n < 20) return form5;
                else if (n1 > 1 && n1 < 5) return form2;
                else if (n1 == 1) return form1;

        return form5;
}

Теперь правим функцию relative_time и вуаля у нас теперь все как надо.

function relative_time(time_value) {
  var values = time_value.split(" ");
  time_value = values[1] + " " + values[2] + ", " + values[5] + " " + values[3];
  var parsed_date = Date.parse(time_value);
  var relative_to = (arguments.length > 1) ? arguments[1] : new Date();
  var delta = parseInt((relative_to.getTime() - parsed_date) / 1000);
  delta = delta + (relative_to.getTimezoneOffset() * 60);

  if (delta < 60) {
    return 'меньше минуты назад';
  } else if(delta < 120) {
    return 'около минуты назад';
  } else if(delta < (60*60)) {
    return (parseInt(delta / 60)).toString() + '  ' + plural((parseInt(delta / 60)).toString(),'минута','минуты','минут')+ ' назад';
  } else if(delta < (120*60)) {
    return 'около часа назад';
  } else if(delta < (24*60*60)) {
    return 'около ' + (parseInt(delta / 3600)).toString() + '  ' + plural((parseInt(delta / 3600)).toString(),'час','часа','часов')+ ' назад';
  } else if(delta < (48*60*60)) {
    return '1 день назад';
  } else {
    return (parseInt(delta / 86400)).toString() + ' ' + plural((parseInt(delta / 86400)).toString(),'день','дня','дней') +'  назад';
  }
}

Теперь у нас на повестке дня ссылка на rss. Что же идем на FeedIcons и скачиваем подходящие нам иконки. И делаем небольшую поправку в самом плагине.

if (o.showProfileLink) {
	var profileLinkHTML = "<p class=\"profileLink\"><a href=\"http://twitter.com/"+o.userName+"\">http://twitter.com/"+o.userName+"</a>&nbsp;<a href='http://twitter.com/statuses/user_timeline/"+o.userName+".rss'><img src='feed-icon.png'/></a></p>";
	c.append(profileLinkHTML);
}

Кстати чтобы не подгружать каждый раз blogger.js, да ведь мы и не можем ему менять, я просто закомментировал строку с его загрузкой, а исправленные функции, записал в конец jquery.twitter.js плагина.
Ниже можно скачать то что у меня получилось.
Скачать поправленный для себя jquery.twitter

Пользователям может не понравится такой способ предоставления новостей, но мне кажется есть ресурсы где это может пригодиться, к тому же так можно оживить даже статичный сайт. Мы же живем в эпоху mash-up’a, так почему бы и нет.
UPD: еще можно использовать Juitter , тоже очень интересный плагин, автоматическое обновление в случае появления новых твиттов, реплаи, показ аватаров, поиск. Но мне почему то jquery.twitter нравится больше, он менее нагружен как мне кажется.

2009-05-9

Структуризация информации. Контрольная точка 1

Filed under: Идеи — thekillerfox @ 9:35 пп

Как я писал мне хотелось бы чтобы вся информация на винте была структурированна, но как это сделать? У меня есть несколько задумок и я потихоньку реализую их. В плане СУБД планирую использовать MySQL, конечно по прикидкам база получается просто огого, мама не горюй, но вроде мускул должен вытянуть, пока не полностью ясно со структурой базы, то есть есть структура, и ее даже можно юзать, но вот что то там не так. Не знаю даже, слишком много кода надо чтобы с ней работать, библиотеки конечно писал начал, но не хочется в конце выяснить что фигня получилась. Пока что для импорта информации парсеры делаю, парсер для кинопоиска чтобы фильмы добавлять готов, парсер fb2 тоже.
Есть простенькая библиотека для работы с базой, простой веб интерфейс и небольшая адресная книга накиданная с использованием его. Так что идем в верном направлении.

2009-04-26

Организация данных на локальной машине. Мечты.

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

У Сэмми Джэнкиса была такая же проблема, но у него не было настоящей системы.
Фильм «Помни»(Memento)

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

_distrs — здесь лежат различные дистибьютивы windows, linux, reactos и других операционок
_linux — здесь софт под linux
_macos — здесь под маки
_pocket pc — Windows Mobile — прошивки под разные устройства, софт и игры.
_windows — тут под винду
_other — а тут под то что не подпадает в категории выше

Пока были только папки _windows и _linux все было просто. в них шли софт и игры для каждой из осей. Потом дистры решено было вынести и теперь структура усложнилась. Софт разбит по категориям(уровень вложенности бывает очень велик например _net/_messaging/_irc/_client/mIRC)
В папке с программой лежат подпапки версий, скриншоты и описания. Я стараюсь для всех программ поддерживаться этой системы. То что программы могут быть в нескольких категориях одновременно решается посредством симлинков. Но вот _pocket pc каталог это уже небольшой отделение от правил. Ибо прошивки, софт и игры там лежат в одной системе категория, хотя для винды и линукса это все вынесенно отдельно. (Игры лежат на отдельном разделе отсортированные тоже по осям.)

Такая система была достаточно удобно на ранних порах. Но чем сложнее становяться запросы, и чем больше становиться программ, тем менее удобной становится такая система. Получается что надо выдумывать какую то более гибкую структуру. Симлинки конечно помогут, но как быть с удаленнием данных. Надо же будет после этого обновлять все симлинки. Либо писать скрипт который будет оббегать каталоги в поисках симлинков и грохать их.
Еще один подход для хранения использовать папку с кучей файлов, отсортированных как угодно, но для обращения и операциями с ними использовать специальные программы каталогизаторы. Например для фильмов это Personal Video Database. А что вроде бы все удобно. Но вот что вам делать если вам нужно использовать эту программу например под Linux’ом. У меня под вайном она идет как то не стабильно. Да и повлиять на ее развитие никак не получится. Но это уже шаг к лучшей системе.

Вам нужна действительно хорошая система,если Вы хотите заставить её работать.
Фильм «Помни»(Memento)

Перейдем к хранению музыки. Например для этого будем использовать плейер с поддержкой медиа библиотек. Amarok, Windows Media Player, Banshee,Songbird, iTunes и т.д. ибо имя им легион, их очень много, но при этом я не могу привязать какую то песню к какому то фильму из коллекции, я не могу посмотрев фильм нажатием кнопки перенести его содержимое в плейер. Да я понимаю что я хочу невозможного. Я хочу систему где все данные будут взаимосвязанны, где не будет понятия файл, а будет понятие фильм, песня, программа. Где все будет связанно между собой. Я хочу иметь возможность создавать сложные выборки на манер того чтобы получить список всех программ у меня на винте под определенной лицензии и в определенной категории, а затем записать их на диск.

Единственный способ на лету менять условия поиска, это если данные будут занесенны в какую либо систему, где они будут связанны между собой, где будут описаны все их свойства. Похожий подход исповедует проект Nepomuk(Под сенью KDE хранилищу дали более красивое имя Soprano). Интересное решение, к тому же для хранения используется RDF. Но чем то оно мне не нравится(Может потому что на текущий момент это концепт который непонятно как использовать).

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

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

На хабре проскакивала статья про Gimao. Интересная программа, я думал что возможно будет использовать ее. Но бета есть бета, к тому же если ей удобно организовывать большие объемы информации формировать запросы типо тех что мне хотелось пока сложно если не сказать невозможно. Правда она и не позицинионируется как хранилище данных. Это PIM.

Кстати PIM это вообще отдельный разговор. Как я представляю себе идеальную адресную книгу. В ней есть что то от социальных сетей(куча заполненных данных, связи между записями), она синхронизирует свои данные с интернетом (с аккаунтами в различных социальных сетях), она хранит в себе логи разговоров, время и даты звонков. А еще мне бы хотелось чтобы она интегрировалась с общей системой хранения данных. Я хочу открыв адресную книгу и увидя там знакомого Васю, посмотреть фотки с его последнего отпуска, узнать что у него есть друг Витя, которому нравиться фильм Генетическая опера, увидеть что этот фильм есть у меня, посмотреть трейлер, почитать отзывы, после чего узнав что там неплохая музыка, открыть OST к фильму если он есть у меня на машине и скинуть его на плейер чтобы послушать в дороге. Мне нужно чтобы он автоматом искал его и скачивал, но я хочу чтобы любая информация которая у меня есть лежала по полочкам.

Блог на WordPress.com.