S-c.me: Вставка кода на твиттер и хабр.

Раскажу Вам о проекте s-c.me, который расшифровывается как "source-code(for)me", и который я открыл в конце 2008 года и не рекламировал никому. Исполькозал лишь для своих потребностей и постов.

Сайт позволяет подсвечивать исходные тексты, как в виде html, так и в виде css. Основной упор сделан для Csharp, xml, php - как языки, на которых пишу сам.
Пример подсветки и публикации кода - http://s-c.me/3V

Из последних нововведений:
1) Короткие ссылки для вставки в твиттер
2) Оптимизация подсветки, чтобы не было подряд идущих одинаковых тэгов подсветки.
3) Добавлена подсветка для языка Python.
4) Автотэгирование по именам объектов.

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

PS: Недели 2 назад Adam Ostrow написал в Mashable про подобный проект, которому судя по whois было 2 дня и весь функционал которого, на тот момент, ограничивался возможностями бесплатной библиотеки GeSHi и громкого заголовка "для твиттера". Это меня разозлило и сподвигло на дальнейшую разработку.

Метки:   Категории:S-c.me | news


User Feedback

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

1) Размещение на сайте популярной на западе кнопки от http://uservoice.com/, у них есть как бесплатный, так и платный функционал. Однако для оставления комментариев посетителям пришлось бы региться у них на сайте, кроме того на сайте появился бы логотип от Uservoice, что не есть хорошо.

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

3) Более логичным кажется помещение на сайте виджета от F*Connect, где пользователи используют привычные им аккаунты и просто оставляют комментарии. Минус лишь в том, что не понятно, что лучше FacebookConnect или FriendConnect, каждый из которых частично ограничивает область используемых пользователями аккаунтов.

4) И буквально на днях прибежали туземцы появился http://comments.li.ru, позволяющий организовать комментирование к любой странице вашего сайта, если он работает на PHP, что также не подходит моим проектам на asp.net.

В заключение скажу, что я остановлюсь на 3), как только появится время.

Метки: ,   Категории:Analytics | trend


.Net - Контексный поиск с учетом русской и английской морфологии

Подведу итог моим экспериментам с библиотекой Lucene.Net, под катом немало кода.

Для чего это: Поиск документов по словам с учетом морфологических модификаций в большой базе документов
Программный язык: CSharp.
Потрачено времени: Двое суток
Использованные продукты: MSVS, Lucene.Net, Lemmanizer с дополнительным английским словарем.
Ограничения и лицензии: Apache2.0 для Lucene и 250y.e. за Lemmanizer или бесплатная демо до конца года.
Дополнительно: Немало полезного есть на CodeProject, а также пример простого поиска описывали в RSDN

Начну с результатов
1) Индекс на 1530 текстовых документов занял 40минут, и 1,4мегабайта на диске. Если отключить морфологию, то те же действия выполняются за 1 минуту.
2) Иллюстрация поиска, который выполняется почти моментально

Видно, что по слову authority и authorities найдено одинаковое число документов, при отключении морфологии их число разнится
Одинаковое число документов для Бандитко и Чичваркина вызвано тем, что в xml настройке для SynonymFilter я указал эти слова в качестве синонимов.


Итак, наша задача при написании контекстного поиска с учетом морфологии с использованием Lucene.Net сводиться к описанию класса по разбору текста и вставлению в него всех слов, которые как-то коррелируют с текущим. Я написал следующий класс
Copy Source | Copy HTML
  1. namespace Lucene.Net.Analysis.Morphology
  2. {
  3.     using System;
  4.     using System.Data;
  5.     using System.Configuration;
  6.     using System.Web;
  7.     using System.IO;
  8.     using System.Web.Security;
  9.     using System.Web.UI;
  10.     using System.Web.UI.WebControls;
  11.     using System.Web.UI.WebControls.WebParts;
  12.     using System.Web.UI.HtmlControls;
  13.     using Lucene.Net.Analysis.Standard;
  14.     using Lucene.Net.SynonymEngine;
  15.  
  16.     /// <summary>
  17.     /// Анализатор текста для Lucene.Net с использованием морфологического анализа и словаря синонимов
  18.     /// </summary>
  19.     public class MorphologyAnalyzer : Analyzer
  20.     {
  21.         public MorphologyAnalyzer(ISynonymEngine engine)
  22.         {
  23.             //запомнили откуда брать синонимы
  24.             SynonymEngine = engine;
  25.             isSearchQuery = false;
  26.             //грузим словари
  27.             Morph = new MorphENRU();
  28.         }
  29.  
  30.         private MorphENRU Morph;
  31.         private ISynonymEngine _SynonymEngine;
  32.         private Boolean isSearchQuery;
  33.  
  34.         /// <summary>
  35.         /// Объект для перечисления синонимов слова
  36.         /// </summary>
  37.         public ISynonymEngine SynonymEngine {
  38.             get {
  39.                 return _SynonymEngine;
  40.             }
  41.             private set
  42.             {
  43.                 _SynonymEngine = value;
  44.             }
  45.         }
  46.  
  47.         /// <summary>
  48.         /// Выключаем проверку синонимов
  49.         /// </summary>
  50.         /// <returns></returns>
  51.         public MorphologyAnalyzer SetQuerySynonym()
  52.         {
  53.             this.isSearchQuery = true;
  54.             return this;
  55.         }
  56.  
  57.         /// <summary>
  58.         /// Анализуем текст и возвращаем в виде нобора слов для помещения в индекс и подсчета частот
  59.         /// </summary>
  60.         /// <param name="fieldName">Имя индексируемого файла</param>
  61.         /// <param name="reader">Поток для чтнения файла</param>
  62.         /// <returns>TokenStream</returns>
  63.         public override TokenStream TokenStream(string fieldName, TextReader reader)
  64.         {
  65.             //создаем обход слов
  66.             TokenStream result = new StandardTokenizer(reader);
  67.  
  68.             //преобразуем исходную строчку
  69.             result = new StandardFilter(result); // выделение слов при помощи StandardTokenizer
  70.             result = new LowerCaseFilter(result);// Приведение к нижнему регистру
  71.  
  72.             // простой фильтр английских местоимений,
  73.             // русских, к сожалению нету
  74.             result = new StopFilter(result, StopAnalyzer.ENGLISH_STOP_WORDS);
  75.             result = new MorphFilter(result, Morph); // вставляем морфологическую модификацию
  76.             result = new SynonymFilter(result, SynonymEngine, this.isSearchQuery); // вставляем синонимы
  77.  
  78.             //возвращаем набор токенов для помещения в индекс
  79.             return result;
  80.         }
  81.     }
  82.  
  83. }

Видно, что кроме стандартных фильтров, я добавил MorphFilter - вставка морфологических модификаций и SynonymFilter - для вставки синонимов. Класс MorphENRU используется для работы со словарями морфологии на базе библиотеки Lemmanizer и идет ниже
Copy Source | Copy HTML
  1. namespace Lucene.Net.Analysis.Morphology
  2. {
  3.     using LEMMATIZERLib;//морфология
  4.     using System;
  5.     using System.Collections.Generic;
  6.     using System.Configuration;
  7.     using System.Data;
  8.     using System.Diagnostics;
  9.     using System.IO;
  10.     using System.Text;
  11.     using System.Text.RegularExpressions;
  12.     using System.Web;
  13.     using System.Web.Security;
  14.     using System.Web.UI;
  15.     using System.Web.UI.WebControls;
  16.     using System.Web.UI.WebControls.WebParts;
  17.     using System.Web.UI.HtmlControls;
  18.  
  19.     /// <summary>
  20.     /// Работа с морфологией для анг. и русского языка
  21.     /// </summary>
  22.     public class MorphENRU
  23.     {
  24.         /// <summary>
  25.         /// Регулярное выражение для определения английских слов
  26.         /// </summary>
  27.         private Regex rWordEn = new Regex(@"[a-z0-9]+", RegexOptions.Singleline | RegexOptions.Compiled
  28.             | RegexOptions.ExplicitCapture);
  29.  
  30.         /// <summary>Анализатор английских слов</summary>
  31.         private ILemmatizer Lemmatizer_en;
  32.  
  33.         /// <summary>
  34.         /// Анализатор русских слов
  35.         /// </summary>
  36.         private ILemmatizer Lemmatizer_ru;
  37.  
  38.  
  39.         public MorphENRU()
  40.         {
  41.             //в конструкторе нужно загрузить морфологию
  42.             try
  43.             {
  44.                 Lemmatizer_ru = new LemmatizerRussianClass();
  45.                 Lemmatizer_ru.LoadDictionariesRegistry();
  46.                 Lemmatizer_en = new LemmatizerEnglishClass();
  47.                 Lemmatizer_en.LoadDictionariesRegistry();
  48.                 Debug.WriteLine("Загрузка морфологи успешно завершена.");
  49.             }
  50.             catch (Exception e)
  51.             {
  52.                 Debug.WriteLine("Ошибка при открытиии морфологического словаря: " + e.Message);
  53.                 //ошибка может быть по многим причинам - например,
  54.                 //кто-то удалил файлы словарей или истекла лицензия,
  55.                 //тогда игнорируем морфологию
  56.                 Lemmatizer_ru = null;
  57.                 Lemmatizer_en = null;
  58.             }
  59.         }
  60.  
  61.         /// <summary>
  62.         /// Делаем слово морфологически инвариантным
  63.         /// </summary>
  64.         /// <param name="word"></param>
  65.         /// <returns></returns>
  66.         public List<string> NormalizeWord(string word)
  67.         {
  68.             List<string> WordList = null;
  69.             if (Lemmatizer_ru != null &&
  70.     Lemmatizer_en != null)
  71.             {
  72.                 //если ошибка в словарях, то пропускаем обработку
  73.                 int weight = -1;
  74.                 bool isEng = this.rWordEn.Match(word).Success;//английское или русское слово
  75.                 // ищем варианты в словаре
  76.                 IParadigmCollection ParadigmCollection =
  77.                     isEng ?
  78.                     Lemmatizer_en.CreateParadigmCollectionFromForm(word, 1, 1) :
  79.                     Lemmatizer_ru.CreateParadigmCollectionFromForm(word, 1, 1);
  80.                 // выбираем наиболее тяжелое по весу
  81.                 for (int j = 0; j < ParadigmCollection.Count; j++)
  82.                 {
  83.                     if (ParadigmCollection[j].WordWeight > weight)
  84.                     {
  85.                         if (ParadigmCollection[j].Norm == "ДЛИТЬ") continue;
  86.                         //будем брать всего одно самое весовое слово для морфологии
  87.                         if (WordList == null)
  88.                         {
  89.                             WordList = new List<string>();
  90.                             WordList.Add(ParadigmCollection[j].Norm.ToLower());
  91.                         }
  92.                         else
  93.                         {
  94.                             WordList[0] = ParadigmCollection[j].Norm.ToLower();
  95.                         }
  96.                         weight = ParadigmCollection[j].WordWeight;
  97.                         //графемы нам не нужны
  98.                         //gramma = this.ParadigmCollection[j].SrcAncode;
  99.                     }
  100.                 }
  101.             }
  102.             return WordList;
  103.         }
  104.     }
  105. }


В функции NormalizeWord видно, что для каждого слова мы берем только ту его морфологическую модификацию, которая имеет наибольший вес. Можно было бы брать больше слов, но тогда размер индекса сильно бы увеличился. Кроме того, на этапе фильтра MorphFilter мы игнорируем все слова с длинною меньше 4х символов, чтобы ускорить работу. Сам класс MorphFilter приведен ниже
Copy Source | Copy HTML
  1. namespace Lucene.Net.Analysis.Morphology
  2. {
  3.     using System;
  4.     using System.Data;
  5.     using System.Configuration;
  6.     using System.Collections.Generic;
  7.     using System.Web;
  8.     using System.Web.Security;
  9.     using System.Web.UI;
  10.     using System.Web.UI.WebControls;
  11.     using System.Web.UI.WebControls.WebParts;
  12.     using System.Web.UI.HtmlControls;
  13.     using Lucene.Net.Analysis;
  14.  
  15.     /// <summary>
  16.     /// Обход набора слов и вставка морфологических модификаций
  17.     /// </summary>
  18.     public class MorphFilter : TokenFilter
  19.     {
  20.         private Queue<Token> morphTokenQueue
  21.             = new Queue<Token>();
  22.  
  23.         private MorphENRU _MorphEngine;
  24.         public MorphENRU MorphEngine { get { return _MorphEngine; } private set { _MorphEngine = value; } }
  25.  
  26.         public MorphFilter(TokenStream input, MorphENRU morphEngine)
  27.             : base(input)
  28.         {
  29.             if (morphEngine == null)
  30.                 throw new ArgumentNullException("morphEngine");
  31.  
  32.             MorphEngine = morphEngine;
  33.         }
  34.  
  35.         public override Token Next()
  36.         {
  37.             // Если есть слова в очереди, то надо их поместить в поток прежде чем одти дальше
  38.             if (morphTokenQueue.Count > 0)
  39.             {
  40.                 return morphTokenQueue.Dequeue();
  41.             }
  42.  
  43.             //Берем след. слово из текста
  44.             Token t = input.Next();
  45.  
  46.             //если пусто, то конец потока
  47.             if (t == null)
  48.                 return null;
  49.  
  50.             //разбор морфологии только для слов длинною более 4х символов
  51.             if (t.TermText().Length > 4)
  52.             {
  53.  
  54.                 //получение актуальных морфологий
  55.                 IEnumerable<string> mWords = MorphEngine.NormalizeWord(t.TermText());
  56.  
  57.                 //если нет слов то вернем слово просто
  58.                 if (mWords != null)
  59.                 {
  60.                     //Переберем все морфологические формы которые более употребляемы
  61.                     foreach (string word in mWords)
  62.                     {
  63.                         //убедимся, что не дублируем слово
  64.                         if (!t.TermText().Equals(word))
  65.                         {
  66.                             //делаем морфологический токен
  67.                             Token mToken = new Token(word, t.StartOffset(), t.EndOffset(), "<MORPH>");
  68.  
  69.                             // устанавливаем относительное смещение в 0,
  70.                             // это нужно, чтобы отразить то, что добавляемое слово соответствует
  71.                             // старому месту в изначальном тексте
  72.                             mToken.SetPositionIncrement(0);
  73.  
  74.                             //помещаем в очередь на помещение в поток
  75.                             morphTokenQueue.Enqueue(mToken);
  76.                         }
  77.                     }
  78.                 }
  79.             }
  80.             //
  81.             return t;
  82.         }
  83.     }
  84.  
  85. }
Теперь можно использовать объект MorphologyAnalyzer в качестве аргумента для стандартных функций индексации и поиска Lucene.Net библиотеки. Пример, стандартного использования Lucene.Net находится по ссылке на RSDN в начале поста.


Метки: , ,   Категории:Csharp | Code


Разработка OpenID+OAuth и общие мысли

На днях Andrew Arnott, известный своим полезным для web-разработчиков проектом DotNetOpenId (библиотека для реализации интерфейсов OpenID в среде .Net), анонсировал в марте этого года выход третьей версии, которая будет включать функционал OAuth. Напомню, что OAuth - это протокол для безопасной передачи своих данных третьим сайтам. От OpenID его отличает лишь то, что все операции с данными проходят с минимальным участием пользователя и данные эти могут быть произвольными, а не только частью профиля пользователя, жестко связанным с его OpenID.
Кроме того Andrew пишет, что в связи с ростом проекта ему нужны деньги на новый хостинг и просит всех не безразличных перечислить сколько не жалко на PayPal. На мой взгляд, читателей у его блога маловато и средства он врядли таким способом соберет.
Примечательно, что с того момента, как модное слово OpenID растащили по своим доменам крупные пользовательские сервисы,
потерялось общее направление в развитии OpenID. Даже должность исполнительного директора в OpenID Foundation до сих пор пустует. Начали совершенствоваться средства по обучению этих глупых пользователей пользоваться новой технологией (речь про F*Connect и различные интеграции сервисов между собою). Обучение, конечно, никак не обойти, но не пора ли задуматься о переходе с простой переброски данных между серверами на расшаривание функционала над данными в хранилище? Как мы знаем, распределенная идентификация - это один из 9 механизмов составляющих семантический веб. Поэтому развитие OpenID нужно вести в ключе скорой интеграции с еще недостаточно разработанными 4мя (Combiner, Mediator, Monitor, Ontology). Итак, каждый OpenID идентификатор должен включать ИмяПользователя(OralIdentifier), Мыло(ElectronicIdentifier), Аватарку(VisialIdentifier) и полное XML(+public RDF)-описание объекта (FullSocialObjectDescription). Без ограничения общности, все это хостится на информационном ресурсе, подключенном к семантической сети, и все приходящие запросы должны быть выполнены не как сейчас "для данного пользователя дайте-ка такое-то поле", а "выполните такой-то SPARQL запрос над данными такого пользователя и верните ответ". Такой подход обусловлен тем, что любые данные в интернете имеют социальную привязку, а значит, возможно, что все новые данные будут выкладываться в таком социальном контексте. Кроме того, меняется RDF-понятие описания ресурса с данными с описания всех ресурсов домена на описание ресурсов одного автора, зарегистрированного на домене, что более абстрагирует нас от физического доменного носителя.

Метки: , ,   Категории:trend | news | OpenID


Завершая месяц

1) Несколько дней буду недоступен в связи с отъездами и пропавшим дома интернетом.
2) Начинаю разбираюсь с библиотекой полнетекстового поиска портированную на Csharp: lucene.net. Очень много разработано для этой библиотеки, почти что полноценный десктопный поисковик написать можно. Очень волнует скорость добавления информации в индекс - может у кого есть опыт работы с ней? Надеюсь с помощью библиотеки покрыть часть функционала тематического поиска, как у продаваемого IBM решения для корпораций, где одна лицензия стоит под 100килобаксов.
3) Опробовал по совету Mads'a плагин для VisialStudio StyleCop 4.3, правда восторга, как у него у меня не появилось. Плагин позволяет следить за правильным оформлением вашего кода. Из полезного могу отметить только возможность проверки правильности составления документации, что все параметры функций описаны и не пусты. Остальное, как проверка на отсутствие двойных пробелов, на наличие копирайтов и т.п. - черезчур.
4) Интересное решение спам проблемы в ЖЖ предлагает Лугастик - как бы лично выступая в роли абуз теам и инспектируя ботов. Проблемой может стать ограничение на размер бан листа в ЖЖ =), а также то, что число ботов в ЖЖ регистрируется за день примерно в 1000раз больше, чем автор успевает просматривать.

Метки:   Категории:Code | life


Анонс топовых блогопостов

Пропиарю запущенную сегодня на твитере ленту топовых постов блогосферы по версии Яндекса. Посмотрим много ли людей заинтересуется. В качестве источника постов я беру записи из RSS-ленты сайта http://topbot.ru/, поэтому ссылки в твитах ведут на этот блог. Как я писал ранее, анонсирование постов - одно из популярных и логичных применений твитера.
Вначале я хотел быстренько написать свою win-службу для копирования RSS в твиттер, но обнаружил весьма удобный ресурс - http://twitterfeed.com/. Сервис позволяет обновлять аккаунт твитера не чаще чем раз в 30 минут. Подробная инструкция по организации трансляций выложена на английском по ссылке. Существует немало и других подобных сервисов, которые легко нагуглить.
Отмеченные минусы трансляции - нет возможности вставить в твиттер, заданное поле из RSS, кроме заголовка и содержания поста (мне хотелось бы указывать в твите автора топового поста). И второе, сейчас вот смотрю и понимаю, что ссылка "http://tinyurl.com/be49wz" - это почти 6 избыточных знаков, от которых можно было бы избавиться, если написать свою трансляцию RSS в твиттер.

Метки: ,   Категории:topbot | idea


Widgets или про воскресенье

В выходные посетил многообещающее мероприятие, организованное StartupPoint, и посвященное некоторым интернет проектам ищущим инвестиций второго круга. Еще раз убедился, что основной способ монетизации стартапа - это привлечение инвестора =) и так далее по принципу пирамиды. Далее отмечу лишь заслужившее моего внимания:

1) liveexperts.ru - мне кажеться у них есть шансы продвинуться дальше, чем Ашманов или Гугл-вопросы. Последние достаточно долго пытались повторить успех проекта топового сайта about.com в части предоставления пользователям человеческих ответов на жизненные вопросы, но оказались нежизнеспособными. Отчасти провал был вызван бесконечными попытками собрать "экспертов во всем". Хорошо было бы реализовать liveexperts.ru на базе видео-чатов(видео-виджет), которые продвигает компания Spirit. А также им стоит подумать над технологией API для того, чтобы каждое уже сформировавшееся в интернете тематическое сообщество могло интегрироваться с их экспертной системе без переманивания пользователей, что было бы грубой ошибкой.

2) toolwi.com . Огорчило, что не удалось узнать относительно их дальнейших планов по разработке виджетов для блогов, скрывают. Единственное, что говорят, так это сделают бесполезную публикацию настроений (likes), а в дальнейшем планируют просто "лечь" под крупный блогохостинг и заняться выполнением задач под конкретные потребности, что поставит на сервисе крест, но даст им денег. Еще раз повторюсь, что я считаю крайне важным создание для блогосферы виджетов тупо дублирующих функционал F*Connect (например, опросы), и в перспективе универсальный виджет для публикации профиля блогера. Но тут, как всегда, хромает монетизация.

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


Метки: ,   Категории:trend | life


toolwi test

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

Метки:   Категории:bugs | trend


Идеи для фантастической книги

Сидел, пил кофе и думал - "а чтобы мне не подойти к кофейному автомату и не разломать его, чтобы больше не пить кофе такого плохого качества?". Так родилась идея, что было бы прикольно, если бы у нас у всех было 2 жизни. Проживаешь первую, начинается вторая, кончается вторая - все смерть. То есть после первой смерти из тела уходит какой-то дух, который не позволяет пережить вторую смерть. И каждый делает выбор как ему жить, толи вначале вести безбашенную жизнь, а потом тихо мирно работать и растить потомство, толи наоборот. Как бы Вы выбрали? Можно конечно 2 раза прохить одинаково, но я сомневаюсь, что кто-нить так сделал.
И весь мир таким образом делился бы на тех, кто хочет жить подольше и тех кто хочет жить повеселее.
Как раз хватит на трилогию. В первой книге герой вел простой образ жизни, но какой-то урод его убивает, он становится плохим и познает плохие стороны жизни пытаясь найти убийцу (но так и не находит). Во второй книге, героиня пресытившись плохой жизнью долго думает как лучше умереть, потом умирает и пытается вести хорошую жизнь, но ей все мешают. А в третьей книге нужно написать что-нить про книгу судьбы, в которой предначертано какой путь человек выберет в первой жизни и за эту книгу будут весьти борьбу хорошие и плохие.
Может уже кто-то реализовал подобное в какой-нить фантастике, думаю было бы занятно почитать.

Метки:   Категории:idea | life


icq: war is not over

Сегодня перестали работать вне не родные клиенты ICQ. Вываливается следующее сообщение:
=============================
Системное сообщение
=============================
ICQ не поддерживает используемую вами версию. Скачайте бесплатную авторизованную версию ICQ с официального web-сайта ICQ.
=============================
System Message
=============================
The version you are using is not supported by ICQ. Download a free authorized ICQ version from ICQ's official website.

Способов побороть это пока не найдено. Родного клиента я уж точно ставить не буду. На Хабре уже 5 тем и до сих пор решения нет.
PS: Поэтому прошелся по ним и проминусовал карму =).

Метки:   Категории:bugs | news


Дополненая Реальность: Еще 2 года

Сегодня хочу поделиться мыслями возникшими по прочтению большого и познавательного интервью с Robert Rice'ом, который руководит фирмой Neogence, занимающейся разработкой программного сопровождения(SDK, tools) для дополненной реальности. Кроме того, я просмотрел уже половину киберпанковского аниме Denno Coil (subbed NOT dubbed как и рекомендуют) и включил в пост, некоторые "истинные знания" вынесенные из мультика.
1) Во-первых, порадовало, что Роберт считает, что до прорыва в области AR осталось менее 2х лет, то есть в 2010 году мы - простые пользователи - что-то обретем или увидим. Сам же Роберт планирует примерно через 6 месяцев выложить на YouTube демонстрацию ихнего прототипа.
2) Во-вторых, построение AR должна возглавить одна фирма, в задачи, которой станет реализация инфраструктуры доступности и работоспособности очков AR в большой части города. Частично эта фирма будет строить сеть своих точек доступа частично покупая или арендуя сети у уже имеющихся операторов того же WiFi или сотовой связи. Все зависит от нужной пропускной способности. Далее вся территория покрытая AR сдается в аренду различным фирмам, которым предоставляется заранее разработанный SDK и tools для создания виртуальных объектов.
3) Роберт называет одной из основных проблем - спам. Поэтому все приложения, которые становятся доступны пользователям проходят предварительную модерацию перед помещением в каталог, на подобии AppleStore. Иначе, по улицам у нас будут летать виртуальные члены.
4) Из аниме я понял, что обязательно, чтобы на очках была внешняя лампочка, которая бы сигнализировала пользователю или окружающим его людям, что есть виртуальные объекты, с которыми идет взаимодействие или требуется пользовательское действие. Это нужно для выведения пользователя из AFK'a, а также для уменьшения недопонимания между людьми без очков и людьми с очками. Это как с BlueTooth наушником для телефона, окружающим может показаться, что вы говорите сами с собою, свет светодиода может их остановить от вызова скорой.
5) Сомнительным видится возможность управления очками при помощи глаз (Например, два моргания обоими глазами как Enter). Для взаимодействия с AR объектами придется одеть трехпальцевые перчатки с сенсорами на концах пальцев. В частности перемещение по осям должно быть по аналогии с увеличением изображений на iPhone. С учетом правила буравчика, соединение среднего с большим пальцем должно давать перемещение изображение по оси Z и т.п. А если сильно повезет, то поднесение буквы V из двух пальцев ко лбу позволит стрелять лучем виртуального света =).
6) Как AR будет монетизирована? Роберт назвал 3 способа, я добавлю еще 2: Микротранзакции (очки - фактически электронный кошелек, который всегда с вами, замена телефона и КПК, позволит его использовать для платежей); Виртуальное представительства компаний (это замена созданию сайтов); Реклама(все рекламные щиты сквозь очки вы будете видеть по особому, вам будет крутиться другая реклама, более интерактивная); Продажа виртуальных вещей и услуг(не все способны создавать виртуальные вещи, поэтому появятся целые бизнесы по их производству, как в Second Life)
7) Как будет зваться новый виртуальный мир? Роберт отвергает примитивные варианты “augmented reality”, “mixed reality”, “matrix”, “metaverse”. Кроме того все доменные имена с metaverse уже заняты. Я бы предложил имя “RealmA“, просто нравится как звучит. Но сам, между делом, занял доменное имя - a-r.me, как сокращение от Augmented-Reality(for)ME. Может года через 4 буду там торговать виртуальной кармой для хабралюдей со скидкой. =).
8) Как привлечь в виртуальный мир пользователей? Наиболее простой способ - раздача виртуальных питомцем. А за хорошее поведение в виртуальном миру и за помощь в его развитие выдавать дополнительные бонусы. Это должно выглядеть как игра - хочешь играй, а хочешь нет. При этом таких ловушек разума нужно создать несколько.

И в завершение видео одного из уже существующих в Японии "петов" - Гейша. Рекомендую отключить звук, а то анимешные крики заполнят вашу комнату:

Метки: ,   Категории:AugmentedReality | trend | news


.Net: Программная печать документов MS Office

На днях решил поменять в одной программе печать документов с простого "webBrowser.ShowPrintDialog();" в браузере, на полноценное открытие MS Word с дальнейшей печатью. Но речь пойдет не о создании простого процесса winword.exe с передачей ему в качестве параметра нужного документа, а о библиотеках, которые созданы для разработчиков предусмотрительным Microsoft'ом. Заявлено, что решение работает под Office2003/2007, WinXP+, MSVS2005+. Краткое описание по работе с библиотекой приводит один из индийских девелоперов, номинированный как MVP (Microsoft Most Valuable Professional). Однако после строчек кода:
Copy Source | Copy HTML
  1. Object true = true;
  2. Object false = false;
...я почувствовал, что все шутки на баше про индийских программистов не были надуманными.
Далее я приведу шаги, с помощью которых, мне удалось осуществить задуманное и кусок кода. Итак, скачайте указанный выше архив с библиотеками. Внутри него будет также инструкция по интеграции этих библиотек в MSVS, но я рекомендую просто подключить нужную библиотеку, в моем случае это "Microsoft.Office.Interop.Word.dll", потому как я работаю только с MSWord, как Refference в проект. Далее, так как я хочу выводить на печать содержимое окна браузера, то я создал наследника от класса WebBrowser. Обратите внимание на функцию OpenInWord. Она создает вначале приложение офиса Application, потом сам документ, с которым работаем, загружая его из файла. Когда загрузка завершена, то делаем отображение самого офиса, выставляя значение Visible в true, так как по умолчанию офис будет работать спрятан:
Copy Source | Copy HTML
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Drawing;
  5. using System.Data;
  6. using System.Text;
  7. using System.Windows.Forms;
  8. using System.Text.RegularExpressions;// регулярные выражения
  9. using System.IO;//работа с файлами
  10.  
  11. namespace BestApplicationEvah
  12. {
  13.     public partial class WebBrowser_I : WebBrowser
  14.     {
  15.         public WebBrowser_I()
  16.         {
  17.             InitializeComponent();
  18.         }
  19.  
  20.         /// <summary>
  21.         /// Временная директория в которую складываются все файлы отправляемые на печать.
  22.         /// </summary>
  23.         private string printdirectory = "Rprint";
  24.  
  25.         /// <summary> Временная директория в которую складываются все файлы отправляемые на печать. </summary>
  26.         public string PrintDir { get { return printdirectory; } set { printdirectory = value; } }
  27.  
  28.         /// <summary>
  29.         /// Функция преобразования html в правильный формат для показа в doc
  30.         /// </summary>
  31.         /// <param name="file">Название файла. Желательно с расширением doc</param>
  32.         /// <param name="HTML">Html для преобразований</param>
  33.         /// <returns></returns>
  34.         private string HtmlToDocFile(ref string file, string HTML)
  35.         {
  36.             /*** много кода ***/
  37.         }
  38.  
  39.         /// <summary>
  40.         /// Функция сохраняет текущую страницу, как указанный файл и открывает его
  41.         /// </summary>
  42.         /// <param name="file">Имя создаваемого файла, должно иметь расширение DOC</param>
  43.         public void OpenAsDoc(string file)
  44.         {
  45.             this.OpenAsDoc(file, false);
  46.         }
  47.  
  48.         /// <summary>
  49.         /// Функция сохраняет текущую страницу, как указанный файл и открывает его
  50.         /// </summary>
  51.         /// <param name="file">Имя создаваемого файла, должно иметь расширение DOC</param>
  52.         /// <param name="newWindow">Открыть файл в новом окне?</param>
  53.         public void OpenAsDoc(string file, bool newWindow)
  54.         {
  55.             string err = this.HtmlToDocFile(ref file, this.DocumentText);
  56.             if (!String.IsNullOrEmpty(err))
  57.             {
  58.                 //вывод сообщения об ошибке
  59.                 MessageBox.Show(err, "Ошибка");
  60.             }
  61.  
  62.             //и отображаем доковский файл в браузере
  63.             this.Navigate(Directory.GetCurrentDirectory() + "/"+ this.printdirectory + "/" + file,newWindow);
  64.         }
  65.  
  66.         /// <summary>
  67.         /// Открытие HTML в MS Word...
  68.         /// </summary>
  69.         /// <param name="file">Название файла для сохранения информации</param>
  70.         public void OpenInWord(string file){
  71.             //создадим из контента файл
  72.             string err = this.HtmlToDocFile(ref file, this.DocumentText);
  73.             if (!String.IsNullOrEmpty(err))
  74.             {
  75.                 //вывод сообщения об ошибке
  76.                 MessageBox.Show(err, "Ошибка");
  77.             }
  78.  
  79.             try
  80.             {
  81.                 //Create an object for missing values. This will be passed whenever we don’t want to pass value
  82.                 Object missing = System.Reflection.Missing.Value;
  83.                 //Objects for true and false to be used in the word document for passing true or false.
  84.                 //Object true = true;
  85.                 //Object false = false;
  86.                 //Creating objects of word and document
  87.                 Microsoft.Office.Interop.Word.Application oWord = new Microsoft.Office.Interop.Word.Application();
  88.                 Microsoft.Office.Interop.Word.Document oWordDoc = new Microsoft.Office.Interop.Word.Document();
  89.                 object fileName = Directory.GetCurrentDirectory() + "/" + this.printdirectory + "/" + file;
  90.                 // You can keep it true if you want to open the file in readonly mode
  91.                 object readOnly = false;
  92.                 // we can keep it false if you want to open the file but not make it invisible
  93.                 object isVisible = true;
  94.                 //открытие файла
  95.                 oWordDoc = oWord.Documents.Open(ref fileName, ref missing, ref
  96.                   readOnly, ref missing, ref missing, ref missing, ref
  97.                   missing, ref missing, ref missing, ref missing, ref
  98.                   missing, ref isVisible, ref missing, ref missing, ref
  99.                   missing);
  100.                 //делаемся видимыми
  101.                 oWord.Application.Visible = true;
  102.                 //oWord.ShowMe();//смысл функции остался неизвестным
  103.                 //автопечать
  104.                 //oWord.PrintOut(ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing,
  105.                 // ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing,
  106.                 // ref missing, ref missing);
  107.             }
  108.             catch(Exception WordExc)
  109.             {
  110.                 MessageBox.Show(WordExc.Message, "Ошибка при работа с MS Word");
  111.             }
  112.         }
  113.     }
  114. }
И когда мы всетаки завершим работать с офисом, важно закрыть объекты, иначе процесс winword может остаться висеть:
Copy Source | Copy HTML
  1. //Closing the file
  2. oWordDoc.Close(ref oFalse, ref missing, ref missing);
  3. //Quitting the word application to release the memory.
  4. oWord.Quit(ref missing, ref missing, ref missing);

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

Метки: , ,   Категории:Code


Философия микроблогинга

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

1) Ты туда не ходи, снег бошка попадет, совсем мертвым будешь
Популярность микроблогинга показывает, что любому информационному сообщению нужна рецензия или анонс. Нет времени осмыслять весь текст целиком.
2) Все, кроме мыслей
Выкладывать короткие сообщения модно было и раньше, и это делали в виде указания локации, настроений, музыки и т.п. При этом для этого выделялись специальные поля в блогдвижке. Однако микроблогинг стал обобщением всего этого одной системой с ограничением в 140 символов.
3) Нам не нужны комментарии
Полгода назад я говорил, что скоро исчезнут анонимные комментарии, сейчас скажу, на примере твитера, что комментарии вообще не нужны. Любой ваш комментарий должен быть как полноценный пост, который могут просматривать ваши друзья и тот чье сообщение сподвигло Вас на этот пост. Как пример реализации - посты на Яндекс, где есть опция "ответить комментарием в своем дневнике".
4) Общение тэгами
Когда есть мало места, то тщательнее выбираешь слова. Используя, во-первых более короткие, а во-вторых более выразительные слова. Именно такие слова, которые лучше всего подошли бы на роль тэгов. Как идею можно было бы реализовать проект ("nothing2tweet.com"), где бы проанализировать все слова из словаря по наличию в твитере и по частоте упоминания. Используя для этого стандартный поиск твитера. Это позволит составить 1) "справочник тэгов" 2) придать словам, имеющим одинаковые склонения веса по частоте употребления (нужно для морфологического анализатора) 3) найти неиспользуемые слова, а значит имеющие более удобный и очевидный синоним или форму сокращения. В итоге хотелось бы видеть графики упоминаний по аналогии с "пульсом блогосферы", только для твитера, но это скорее пожелание к ихним разработчикам.
5) Умных мало
Наглядная демонстрация параметров подписки(Follows и Followed by) показывает, что большинство идей мы берем у других, а тех, кто приносит что-то новое из жизни в интернет - мало. Поэтому было бы интересно построить ориентированный граф и посмотреть из кого больше вытекает сообщений, нежели втекает.
5) Часть целого
Для меня мог бы оказаться полезным только как средство обновления какой-то части чего-то большего. Поэтому уже появились многочисленные плагины для интеграции твитера во многие блогсистемы. Но мешать блоги с блогами как-то глупо. Другое дело, если по твитеру я буду обновлять, например, свой OpenID профиль. Одно сообщение = одна команда. Для этого надо стандартизировать формат, определив команды для извлечения, добавления, удаления и правки полей профиля.
Это, конечно же, не все тренды, а только те, которые мне хотелось бы затронуть.

Метки: ,   Категории:Analytics | trend


few-words

Еще до НовогоГода мне довелось побывать на докладе, где вкратце расказывалось как были распилены потрачены выделяемые бюджетом деньги на научные иследования. Мое внимание привлекли некоторые технологии, о которых стоит рассказать, пока не зыбыл.
Во-первых, это исследования передачи энергии при помощи лазера. Это нужно, чтобы в ближайшее время запустить на орбиту спутники, которые бы собирали солнечную энегрию и передавать ее на землю, тем самым решая проблему альтернативных источников энергии.
Далее было что-то интересное сказано про спутник, который можно запустить с целью освещения заполярных станций отраженным от солндца светом. Мне трудно представить каких же размеров должны быть отражающая поверхность спутника, чтобы это имело яркость, заметную для звездного заполярного неба.
А еще мне понравились очевидное военное применение самоорганизующихся роботов. Разрабатывается группа мини-роботов, которые, попав в здание, уничтожали или обезвреживали бы всю живую массу внутри помещения, то есть людей. Сейчас таким средством выступает простая граната, забросил ее в помещение с террористами, она всех и положит вместе со зданием. А хотят, чтобы забрасывали(скажем через окно) в помещение нечто, оно бы разделялось на автономные части, быстренько уничтожало все двигающееся и выключалось, оставляя здание неповрежденным.
Еще интересное применение самооргинизующимся роботам - мониторинг нетральных вод. То есть есть группа роботов, каждый из которых держит связь только с ближайшими, но все вместе они мониторят большую территорию. Правда тут оговаривалось, что разработки ведуться военным ведомством США.
В итоге должно получиться как в фильме "День, когда Земля остановилась", когда есть куча мелких роботов, уничтожающих все на своем пути. Главное только их правильно запрограммировать =).

PS: Тяжело вживаюсь в новый режим сна, с 12ти часового в праздники, до 4х часового... Дожить бы до выходных.

Метки:   Категории:trend | life


YandexUtility 2009 reviewed

С наступлением нового года устарела лицензия на написанной мною 2 года назад программе YandexUtility, поэтому я обновил программу.
Что это? Это программа, написанная на Csharp, для анализа блогосферы на основе данных, получаемых из яндекса.
Что изменено? Исправлено большинство регулярных выражений, которые успели устареть, а также обновлена лицензия на морфологический анализатор до конца года.
Что делает? Позволяет отслеживать рейтинги виртуалов; читать ТОП; читать баш =); анализировать частотное упоминание слов в конкретной ленте, в комментариях к ней и в заданной теме дня; анализировать упоминание слов в темах, на которые выбранный блогер чаще всего пишет комментарии; убирать некоторые известные банеры(реклама в жж) путем автоматического редактирования hosts; делать вставки в блог с результатами анализа;
Есть ли руководство пользователя? Нет. Но внутри программы есть некоторые комментарии. Умные люди должны разобраться.
Установщик последней версии можно взять тут - YandexUtility1.1beta_setup.exe
Пример некоторой аналитики, с использованием программы, под катом:
Для начала я посмотрел упоминания слов в постах Самизнаетекого за текущий год, то есть за последние 10 дней:
Top30 самых используемых слов в ленте tema.livejournal.com/data/rss

БЫТЬ:8 ЕСТЬ:7 СМОТРЕТЬ:6 TEMALEBEDEV@GMAIL.COM:6 ХОРОШИЙ:5 СДЕЛАТЬ:5 ДЕЛАТЬ:5 БЛЯТЬ:4 ОДИН:4 РАННИЙ:4 РАБОТАТЬ:4 WWW:4 ПИЗДЕЦ:4 НАПИСАТЬ:4 УЗКИЙ:4 СТАТЬ:3 СОВЕРШЕННЫЙ:3 ПРИСЛАТЬ:3 ЗАПОМНИТЬ:3 ЧИТАТЬ:3 МОЧЬ:3 ПИСАТЬ:3 ПЕРЕТЬ:3 ПЕРВЫЙ:3 НАЧАТЬ:3 СЛУШАТЬ:2 ЛЮБИТЬ:2 ИНТЕРЕСНЫЙ:2 ПРИЕЗЖАТЬ:2 ЗНАТЬ:2

Всего обработано 26 постов, найдено 846 слов из них уникально 602
Длина поста(слов): 5(Минимальная),1015(Максимальная),115,5769(Средняя)
(c) flashr и его программа YandexUtility

Потом хотел было проанализировать комментарии в его жжурнале, но, как оказалось, Яндекс забил на комментарии оставляемые в журнале Темы. А Единственная запись, на которую отреагировал согласно Яндексу СамВеликий содержала следующие слова: Оптимус, говноджип, Дэнги. Но так как запись всего одна то и анализировать нечего.

И в завершение разбор слов в теме про газовый конфликт:
Top30 самых используемых слов в ленте 'Газовый конфликт с Украиной'

БЫТЬ:106 ГАЗОВЫЙ:103 МОЧЬ:86 УЗКИЙ:69 ХОТЕТЬ:66 ЕСТЬ:62 СКАЗАТЬ:45 ГОВОРИТЬ:42 ЗНАТЬ:41 ДОЛЖНЫЙ:39 ЮЩЕНКО:37 КОНЕЧНЫЙ:37 ДЕТЬ:36 ПОНИМАТЬ:35 ИДТИ:34 СЧИТАТЬ:33 ИМЕТЬ:33 ОДИН:33 СДЕЛАТЬ:32 ЯВЛЯТЬСЯ:32 ДЕЛАТЬ:32 ДУМАТЬ:31 РОССИЙСКИЙ:31 МНОГО:30 СТАТЬ:30 РОСУКРЭНЕРГО:30 ЭТОТ:29 ВИДЕТЬ:29 ПЛАТИТЬ:28 СВОЙ:28

Всего обработано 200 постов, найдено 14423 слов из них уникально 4793
Длина поста(слов): 6(Минимальная),2588(Максимальная),294,52(Средняя)
(c) flashr и его программа YandexUtility

Метки:   Категории:Code | YandexUtility


Пару слов про опросы

Был на хабре один человек, который хотел за дорма получить идею к реализации. Я ему тоже написал мини идейку основанную на парадаксе, что F*Connect построенный на базе социальныз сетей, не будет использваться большинством пользователей соц. сетей, так как создан для автономных сайтов:
Считаю перспективным создание и развитие сервисов, реализующих функционал смежный с поставляемым в гаджетах F*Connect. Отмечу, что эти гаджеты ориентированы в первую очередь на социализацию простых сайтов. Однако же, как мы знаем, большая аудитория обитает на привычных соц.сетях. Поэтому, как идею, можно реазизовать сервис, позволяющий простому блогеру создать "голосование" и поместить в любой свой блог, как html блог. Главная особенность такого сервиса в том, что голосующий пользователь будет логинится по OpenID(*ID) и в настройках можно будет ограничить голосующий по OpenIdProvider'u. То есть функциональная прослойка между пользователями и блогохостингом, но ориентированная на пользователей всех социальных сетей. Тесты и голосовалки всегда были и будут популярны в блогосфере. Кроме того, компании проводящие в блогосфере рекламные акции будут заинтересованы в дополнительном платном функционале, это еще стоит обсуждать.
Основное направление предлагалось голосовалки. И что я вижу читая новости за праздники? Даже для "неполноценного" твитера создан проект http://twtpoll.com/. Красиво и просто. Осталось только понять, что твитером жизнь не ограничмвается и расширить этот проект на всю блогосферу.

Метки:   Категории:Semantic Web | trend


Шаг в будущее

Наверное многие из вас знают, что такое Augmented Reality - "дополненная реальность" или, как ее зовут некоторые старички в этой области, "расширенная реальность". Но не многие знают, что на проходящей сейчас в Лас Вегасе выставке (8-11января), компания Vuzix продемонстрировала устройство Wrap 920AV. Дада, это очки, которые скоро станут ассоциироваться у обывателя с дополненной реальность, а не телефон. Но это лишь мое мнение. Скорее всего эти очки будут соединяться с телефоном для выхода в сеть интернет и доступа к гпэсу. Замечу, что в детальном описании заявлено 6 часов работы от батареек, что уже круто. Очки должны появится в продаже к октябрю этого года. И если взглянуть на их предшественника AV310, то он стоил порядка 300баксов и был быстро раскуплен. Новую партию обещают 15 января, но думаю нет смысла заказывать, дождемся новых.

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

Метки:   Категории:AugmentedReality | news


2009+

-Сколько будет ДедМороза заказать?
-200у.е.
-Хорошо, а когда он прийдет?
-Он не прийдет, потомучто Вы его заказали.
---------------
Так выпьем же за тех, кто шлет нам поздравления с неизвестных номеров!
Кажется я возвращаюсь к жизни.
1) Под новый год заменил себе первую жену как планировал на Dell 1535 C2D 2,5Гц, 4Gb memory в целом доволен. Также на удивление оказался довелен WindowsVista, которая просто летает на этой малышке.
2) Еще радует, что завтра мне не работать, в отличии от разных неудачников, поэтому кто хотел встретится может меня попробовать подловить.
3) Также мне сообщили, что YandexUtility перестал работать, как перекомпилю, так выложу новую версию.

Метки:   Категории:life


Blogs: Current State

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

А пока давайте взглянем, как выглядит наша блогосфера на конец года. Для это я нарисовал маленькую схемку, с общим посылом "Место аналитики в блогосфере". См. прик. vsd файл.

Метки:   Категории:Semantic Web | Analytics | trend


технические предновогодние мысли

1) Сейчас развелось куча различных openid-like систем, и как очевидно, каждый идентификатор в таких системах должен включать следующее: "точку вызова" (в общем случае service-host url), реальный идентификатор (сейчас это имя, в дальнейшем мы можем прийти на уровень национального гос.номера человка), графическое изображение(аватарка и/или фотография) и последнее xml описание в произвольной схеме для объекта в зависимости от используемой системы. Такие вот 4 свойства и их бы было бы достаточно, если бы поток информации шел в одном направлении от Openid провайдера к некоторому порталу. Однако, основываясь на опыте FacebookId - можно видеть, что OpenID Provider заинтересован знать о тех действиях, которые выполняются, с выдаваемым openid. Поэтому можно говорить еще и о 5м свойстве (делегате) для идентификаторов - webmethod - для обработки всех уведомлений о действиях выполняемых с openid идентификатором. То есть делегат типа
  1. Boolean BackIdPing(XmlDocument xml);
где схему для xml еще предстоит определить. Но базу очень легко построить из набора стандартных действий, которые доступны пользователям виджетов F*Connect.

2) Многие уже называют FriendConnect как FriendSense, подчеркивая тем самым, что скоро за размещение этих гаджетов вебмастерам будут доплачивать по аналогии с рекламой сетью AdSense. Такой шаг должен стать ответным ходом на появление промежеточных проектов типа Motion, желающих интегрировать в одном месте разные возможности от разных гигантов.

3) При чтении новостей мы часто разворачиваем браузер на весь экран и т.п. Очень часто большую часть новости занимают сопровождающие ее картинки. Мне кажется логичным добавить в RSS-читалки уничтожение картинок по двойному клику мышки, а не увеличение, как это сделано во многих новостных лентах. А ссылку на просмотр всех картинок, связанных с новостью помещать отдельно после новости.


Метки: , , ,   Категории:trend | Google | news


Кто я?

Программист. Я слежу за блогосферой и знаю, как будет развиваться интернет. Когда у меня есть время я даже прилагаю для этого усилия. Подробнее

Последние комментарии

Не отображать

Topbot at FeedsBurner

Мои Твиты

Twitter июля 21, 09:02
Новости Америки - смерть Честера и посол Лесник http://dlvr.it/PXJD32

Twitter июля 19, 21:14
☠Разбор сериала Американские боги (1й сезон) http://dlvr.it/PWtYJ2 https://twitter.com/f1ashr/status/887782628924968960/photo/1

Twitter июля 16, 17:11
Давай же оторвемся, как в 1986 http://dlvr.it/PW1Dfj

Twitter июля 12, 21:05
читать спутник и погром бесплатно http://dlvr.it/PV81Dt

Twitter июля 10, 20:44
Разбор сериала Кремниевая долина (Silicon Valley) http://dlvr.it/PTdGJk https://twitter.com/f1ashr/status/884513586814439424/photo/1

Twitter июля 9, 15:34
Heineken 0 0 http://dlvr.it/PTLNKG

Twitter июля 7, 11:13
Роскомнадзор планирует заблокировать IP сайта t30p http://dlvr.it/PSsvCq

Twitter июля 2, 10:35
Добродел обновился http://dlvr.it/PRdlv1 https://twitter.com/f1ashr/status/881461233085366272/photo/1

Twitter июня 28, 09:48
Самоуправляемые ездящие картошки http://dlvr.it/PQfwZc

Twitter июня 28, 06:20
коломенский кремль: альтернативная история 2 http://dlvr.it/PQd671 https://twitter.com/f1ashr/status/879947652816814080/photo/1

Twitter июня 26, 08:44
Пасха в Москве 2 сентября 2017 года http://dlvr.it/PQ7Jsz https://twitter.com/f1ashr/status/879258969776177153/photo/1

Twitter июня 25, 17:55
@AnMax38 @history_RF Коломне от силы 270 лет, как и другим российским городам.

Twitter июня 22, 12:28
Суперлайки в Перископе http://dlvr.it/PPDsML

Twitter июня 21, 21:13
Что такое любовь? Песнь льда и пламени http://dlvr.it/PP4nxv https://twitter.com/f1ashr/status/877635527108722689/photo/1

Twitter июня 21, 09:57
Найдено применение для дополненной реальности http://dlvr.it/PNxLxw https://twitter.com/f1ashr/status/877465389294247936/photo/1

Twitter июня 21, 01:59
Periscope VIP что это? http://dlvr.it/PNsDcb https://twitter.com/f1ashr/status/877345106982035457/photo/1

Twitter июня 20, 22:13
Итоги 2016 года в Живом Журнале http://dlvr.it/PNqHw1 https://twitter.com/f1ashr/status/877288232597168128/photo/1

Twitter июня 20, 20:36
Гравитация. Сила тяжести. (Теория общего знания, часть 17) http://dlvr.it/PNpKGs https://twitter.com/f1ashr/status/877263840982913025/photo/1

Twitter июня 20, 20:36
Идеальное решение для Курильских островов http://dlvr.it/PNpKHy

Twitter июня 20, 20:36
Изменения в API Facebook / Youtube / Instagram http://dlvr.it/PNpKD4 https://twitter.com/f1ashr/status/877263832963399680/photo/1

Мой твиттер

Копирайт

Все мысли, высказанные в блоге, являются моим мнением и за это мнение меня никто не забанит! Кроме того, никто не имеет право копировать материалы блога без использования ctrl+C/V!

© Copyright 2008