icom - part 2

На вчерашней конференции I-community2010.ru читал доклад. Презентацию Доклада с моими же комментариями можно скачать и почитать. Тема: "Концепция единого программного интерфейса по взаимодействию с русскоязычными блог-платформами" была призвана рассказать всем, что на проблему программного взаимодействия сервисов в интернете по разному смотрят сами создатели соц.сети, пользователи и разработчики. Также я предлагаю объединить усилия разработчиков над открытым кодом, чтобы упростить друг другу жизнь и заставить создателей соц.сетей делать нормальные интерфейсы для базового функционала, который я описал.
К сожалению, глубину моей мысли оценили не многие, зато мой доклад сильно отличался от других "представителей компаний", которые пришли на конференцию только ради рекламы себя и своих продуктов. Особо вставляла центральная секция, где у докладчиков не было докладов и все время на экране крутилась реклама партнеров.

Из всего обсуждения про твиттер можно было вынести реплики #ded 'ka, который от лица всех слушателей задавал ведущим каверзные вопросы, в то время как остальным было лень пытаться сказать ведущим, что то, что они рассказывают уже не интересно и было озвучено ранее. Из полезного, это замечание, что число занесения в листы на твиттере более говорит о читаемости человека нежели его количество френдов. Да, это сейчас так, и норма в среднем 600 занесений в листы на 10 тыс. последователей. Но и это число при желании можно легко накрутить, поэтому очевидно, что самый главный показатель - число переходов со ссылки.

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

Тэги: Blogs | Code


CSS HighLight at s-c.me

Добавил фишку, которую у меня когда-то просили - подсветку файлов стилей CSS в виде html для вставки в посты. Подсветка кода как всегда находится на сайте SourceCode for Me. Ниже приведу пример подсвеченного файла стилей.
Ещё...

Тэги: Code | S-c.me


ie6 - never die - вопрос html верстки

Всегда знал, что из меня фиговый верстальщик, но никогда не думал, что удастся сделать сайт, который будет корректно отображаться лишь в самом лучшем браузере всех времен и народов - Internet Explorer'e 6. Речь идет о верстке страницы, где неправильно отображаются уголки у разноцветных кнопок. Если глянуть код, то все должно быть так как показывает ie6:


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


Может кому не лень подсказать как исправить такое недоразумение?

Тэги: bugs | Code


Отлов утечки памяти

На днях долго и упорно занимался отловом утечки памяти в постоянно работающем win-сервисе. В помощь себе я установил профайлер памяти процессов от микрософта - CRL Profiler. Он рисует красивые картинки, но иногда и просто вылетает. В общем помощи от него не удалось получить. Далее из гугла начал вытаскивать другие профайлеры и остановился на memprofiler, который триальный только на 14 дней, а дальше придется платить. понравилась возможность делать снимки объектов в памяти в разное время и сравнивать их количество и объемы. Поиск кряка или лицензии не привели к успеху, а очень бы хотелось может у кого есть?

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

Тэги: Code | life


Source Code Highlight

Очередная статья на хабре, опубликованная неизвестным программистом, про подсветку кода вынудила меня внести некоторые улучшения в мой проект s-c.me - по подсветке кода. Изменение касательно подсветки строковых констант. Эта, как оказывается, весьма непростая задача теперь решается еще более сложным регулярным выражением:
Copy Source | Copy HTML
get
            {
                return @"@(?:"".*?"")+|"".*?(?<![^\\](?:\\\\)*?\\)""|''|'.*?(?<![^\\](?:\\\\)*\\)'|\b\d+?(?=\b|$)%?|‘’|‘.*?(?!\\).’";
            }

Убедиться в том, что все нормально подсвечивается, можно на подготовленном тестовом коде по ссылке. Конечно улучшать можно и дальше, но пока и так сойдет.
ЗЫ: надо не забыть продлить регистрацию домена... блин, 800р за год в зоне .me - какой ужас...

Тэги: Code | S-c.me


Рейтинг блогосферы - пост 5 (алгоритм сортировки)

За прошедшую неделю я успел пообщаться с нашим патентным ведомством, которое сказало мне, что алгоритмы не патентуют, патентуют готовые прототипы. Предложили подогнать мою заявку под "Программу для базы данных для ЭВМ", но я не стал тратить время. Таким образом продолжаю серию постов, кратко рассказывающих как формируется ТОП30.
Содержание уже опубликованных заметок


Сегодня я приведу алгоритм первичной сортировки и объясню некоторые моменты. Если Вы читали предыдущие заметки, то должны знать, что алгоритм первичной сортировки нужен только для того, чтобы выбрать порядок в котором записи будут анализироваться на предмет прохождения через фильтры. Собственно сам package первичной сортировки:
Ещё...

Тэги: Blogs | Code | topbot | Yandex


Go Code

Свежая наклейка на ноуте с надписью "Go Code" заставила меня поразмышлять о новом языке программирования, который предлагает Google. Во-первых, уже полно языков программирования и трудно придумать что-то, чтобы всех заставило разом перейти на него. Во-вторых, пошла шутка, что "В ответ Yahoo запустил язык программирования YO! А мы теперь ждем языка YA!". Но если подумать, то можно вспомнить, что сейчас идет бета тестирование GoogleWave, которое в следующем году станет доступно всем, а также появится маркет, на подобии AppStore, где девелоперы смогут продавать, написанные ими снипеты для GoogleWave. Это программы, с помощью которых пользователи смогут взаимодействовать друг с другом, например, игры в социальных сетях. Но если мы возьмем OpenSocial платформу, то даже в ней для создания какой-то простой игры потребуется дополнительно изучать форматы сообщений, представления данных, почти как изучить новый язык. Не исключено, что Гугл захочет заставить прогеров писать снипеты, а также федеративные сервера, для GoogleWave на собственном языке.

Тэги: Code | Google


Url Shorteners API

Добавил в библиотеку BlogsAPI(только в исходники, не в релиз) класс для работы с Bit.ly API. По умолчанию использует мой девелоперский ключ, но можно в конструкторе задать и свой. Позволяет получить сокращенную ссылку по длинной следующим кодом. Также есть возможность извлечения числа переходов по ссылке:

Copy Source | Copy HTML
  1. [TestFixture]
  2. public class Shorteners
  3. {
  4.     [Test]
  5.     public void Bitly()
  6.     {
  7.         BitLy shortener = new BitLy();
  8.         String sRet = shortener.ConvertDataTo("http://s-c.me", ItemType.FullUrl, ItemType.ShortUrl);
  9.         Assert.AreEqual(false,String.IsNullOrEmpty(sRet));
  10.     }
  11. }

Тэги: Code | Twitter


Capitalize first symbol of each word

Интересную фишку обнаружил в .Net, оказывается, чтобы в тексте сделать каждый символ заглавным, не нужно придумывать никаких сложных регулярных выражений, как это предлагалось на хабре для программистов Java. Достаточно воспользоваться услужливо написанной для насв Микрософте функцией:
Copy Source | Copy HTML
  1. using System.Globalization;
  2.  
  3. string capitalized = CultureInfo.CurrentCulture.TextInfo.ToTitleCase("asp.net simply rocks!!!");
  4. //yelds "Asp.Net Simply Rocks!!!" 

Тэги: Code


BlogsAPI published-FOAF-parser

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

Отдельно обращаю внимание на то, как с помощью библиотеки парсить FOAF файлы:

Ещё...

Тэги: Blogs | Code | Twitter | Yandex


Regex for String

На днях была обнаружена ошибка при подсветке строковых констант на сайте Source Code for Me. Проблема была когда в коде встречалось экранирование обратного слэша перед закрывающей кавычкой - (\\"). Всвязи с этим я доработал регулярное выражение по извлечению строковых констант. Надеюсь оно кому-нить пригодится. Выражение выглядит следующим образом:
Copy Source | Copy HTML
  1. Regex rString = new Regex(@"@?""""|@?"".*?((?!\\).|(?:\\\\)+)""|''|'.*?(?!\\).'|\b\d+?(?=\b|$)%?|‘’|‘.*?(?!\\).’");

Тэги: Code | S-c.me


Open or Close project's code

Все наслышаны про open source проекты, но наверно никто из Вас не принимает участие в их написании. Некоторое могут негативно относится к таким проектам, а некоторые боготворят, думая, что только так создается настоящий продукт. Но факты есть факты, что даже в разработке открытого Linux вклад в разработку от "случайных разработчиков" не превышает 30%. Остальное было сделано корпоративной разработкой под нужды клиентов.
Если пойти далее, то можно найти описание того, из чего состоит вклад "случайных" разработчиков в open source проект и мы увидим, что они даже програмный код не пишут. И итоге я прихожу к выводу, что выкладывать исходники продукта - полезно, а вот принимать сторонние изменения или тратить время на разбор сторонних предложений по изменению кода - бесполезно.
Так что же из себя представляют эти 30%:
1) Обратная связь с пользователями - программист, открывший open source проект, представляет из себя опытного пользователя, который, в отличии от простого пользователя, с охотой сообщает разработчикам о проблемах в работе программы или своих пожеланиях на будущие версии продукта.
2) Помощь другим - пользователь, поставивший open source проект понимает, что поддержку ему никто не гарантирует, поэтому за помощью обращается к более опытным знакомым и сам более активно помогает другим, бесплатно консультируя о работе продукта.
3) Написание документации - часто "помощь другим" выражается в написании документации или редактировании документации, созданной основными разработчиками продукта.
4) Пожертвования денег - тут все ясно. 5) Прочее - организация фан сайтов, юзер групп, форумов и т.д., тоже является неотъемлемой частью конечного продукта.

Тэги: Code | life


.Net: Max connections

Максимальное число допустимых открытых соединений с клиентов - весьма важная настройка при создании веб-сервисов в .Net, о которой обычно все забывают. Причиной такой забывчивости является то, что по умолчанию разрешено 2 соединения с любого клиента и этого вполне достаточно для работы веб-сайта в сети Интернет, где куча пользователей с разных хостов по очереди обращаются к одному серверу. Но когда речь идет о взаимодействии двух серверов активно передающих между собой запросы, то полезно выставить число одновременно открытых соединений на побольше. Делается это следующими строчками в конфиге:
Copy Source | Copy HTML
  1. <configuration>
  2.   <system.net>
  3.     <connectionManagement>
  4.       <add address = "http://www.com" maxconnection = "4" />
  5.       <add address = "*" maxconnection = "10" />
  6.     </connectionManagement>
  7.   </system.net>
  8. </configuration>
  9.  

Тэги: bugs | Code


ТОПБЛОГЕРы РУнета

После некоторого гемора выложил новый сайт для тестирования, а точнее даже два: topbloger.ru и смежный ему top4blog.ru. Первый содержит информацию обо всех топовых блогерах, а второй просто набор постов, попавших в топ. Зато теперь информацию искать удобнее и выглядит красивее чем на моем же deep-water.ru. Для полной красоты не хватает возможности автоматически извлекать ссылку на кэшированную копию поста в Яндексе. Из приятных возможностей - RSS подписка на топовые записи определенного блогера, а также то, что можно давать ссылки на "карточки топблогеров" как со знаком вопроса, так и без, что упрошает запоминание адреса.

Монетизация проекта возможна через размещение платных ссылок на рекламные агенства или добавление(убирание) информации о платных постах блогера.

Тэги: Blogs | Code | topbot


Tag Cloud for ASP.NET by jQuery

Ниже я раскажу как написать простенький компонент для отображения облака тэгов в ASP.NET. Пост содержит много кода. Для начала нам потребуется jQuery, который нужно где-нить подключиться на странице. Если Вы не знаете, что такое jQuery - то в поиск. Далее на странице, где у нас будет облако тэгов, а их может быть несколько, подключаем CSS и JS:
Ещё...

Тэги: BlogEngine | Code


Twitter API

Все знают, что у твиттера есть API для разработчиков, но мало кто реально им пользуется. Обычно все находят программы уже созданные кем-то на западе. Если же у вас необходимость создать какое-то приложение для твиттера на .Net, то рекомендую достаточно молодой опен-сорс проект Twitterizer. Ниже много кода, демонстрирующие как просто я добавил возможности твиттера в библиотеку BlogsAPI (закрытый проект пока):

Ещё...

Тэги: Blogs | Code | Twitter


How to RSS your data

Что такое RSS большинство должно знать - это форма экспорта текстовых данных с сайта. Лично меня в RSS не устраивает то, что нельзя задать идентификатор сообщения уникальный для моего поста в рамках сегодняшнего дня, а не в рамках ресурса, за что отвечает поле guid. Это нужно для того, чтобы RSS агрегатор, типа reader.google.com, мог понять, что эти 3 новости перекопированные на разные сайты - есть одно и тоже. Например новости Яндекса копируются на хабр и на яру, а у меня из-за этого в 3 раза больше сообщений. Введение такого хэш-идентификатора "на день" вполне оправдано. И согласуется с тем, как работают сервисы сокращения ссылок, замещая старые короткие ссылки, новыми значениями, что позволяет короткой ссылке оставаться короткой.

Другая интересная несогласованность проявляется при попытке создания RSS выдачи при помощи сериализации объекта класса (рекомендую библиотеку RssToolKit 2.0 для этого). Как мы знаем все строки в CSharp храняться в виде UTF-16, поэтому при сериализации мы получаем XML в этой кодировке, жестко указанной в заголовке. Но, как оказалось, некоторые браузеры - FireFox, IE8 (в Opera все впорядке) - наотрез отказываются воспринимать такой XML, требуя UTF-8 и жесткого задания версии RSS, поэтому пришлось дописать RssToolKit, добавив преобразование кодировок следующим образом:
Copy Source | Copy HTML
  1. /// <summary>
  2. /// Returns XML of the Generic Type.
  3. /// </summary>
  4. /// <param name="rssDocument">The RSS document.</param>
  5. /// <typeparam name="T">RssDocumentBase</typeparam>
  6. /// <returns>string</returns>
  7. public static string ToRssXml<T>(T rssDocument) where T : RssDocumentBase
  8. {
  9.     if (rssDocument == null)
  10.     {
  11.         throw new ArgumentNullException("rssDocument");
  12.     }
  13.  
  14.     MemoryStream memoryStream = new MemoryStream();
  15.     String XmlizedString = null;
  16.     using (XmlTextWriter output = new XmlTextWriter(memoryStream, Encoding.UTF8))
  17.     {
  18.  
  19.         XmlSerializer serializer = new XmlSerializer(typeof(T));
  20.         serializer.Serialize(output, rssDocument);
  21.         memoryStream = (MemoryStream)output.BaseStream;
  22.         XmlizedString = UTF8ByteArrayToString(memoryStream.ToArray());
  23.         return XmlizedString;
  24.     }
  25. }
  26.  
  27. /// <summary>
  28. /// To convert a Byte Array of Unicode values (UTF-8 encoded) to a complete String.
  29. /// </summary>
  30. /// <param name="characters">Unicode Byte Array to be converted to String</param>
  31. /// <returns>String converted from Unicode Byte Array</returns>
  32. private static String UTF8ByteArrayToString(Byte[] characters)
  33. {
  34.     UTF8Encoding encoding = new UTF8Encoding();
  35.     String constructedString = encoding.GetString(characters);
  36.     return (constructedString);
  37. }
После этого создание RSS asp-сайта занимает несколько строчек:
Copy Source | Copy HTML
  1. //говорим, что ответом есть XML/RSS
  2. Response.ContentType = "application/rss+xml";
  3. //вытаскиваем из ьазы данные
  4. using (MySQL db = new MySQL())
  5. {
  6.     DataSet ds = db.GetData("get_rss");
  7.     if (ds != null && ds.Tables[0].Rows.Count > 0)
  8.     {
  9.         RssDocument rss = new RssDocument()
  10.         {
  11.             Version = "2.0",
  12.             Channel = new RssChannel()
  13.             {
  14.                 LastBuildDate = DateTime.Now.ToString(),
  15.                 Language = "ru-RU",
  16.                 WebMaster = "topbot@ya.ru",
  17.             }
  18.         };
  19.         rss.Channel.Title = "blabla"
  20.         rss.Channel.Link = ds.Tables[0].Rows[0]["linkto"].ToString();
  21.         rss.Channel.Items = new List<RssItem>(0);
  22.         foreach (DataRow dr in ds.Tables[0].Rows)
  23.         {
  24.             RssItem ritem = new RssItem()
  25.             {
  26.                 PubDate = ((DateTime)dr["when"]).ToString("s"),
  27.                 Description = dr["text"].ToString()
  28.             };
  29.             rss.Channel.Items.Add(ritem);
  30.         }
  31.         Response.Write(rss.ToXml(DocumentType.Rss));
  32.     }
  33.     else
  34.     {
  35.         Response.ContentType = "application/rss+xml";
  36.     }
  37.  
  38. }

Тэги: Code | Csharp


web vs desktop developing

На хабре недавно проскакивал вопрос - есть ли отличие между Web разработкой и desktop разработкой? Немало людей, если не большинство, ошибочно ответило, что разницы нет. Это не удивительно, с учетом того, что весь девелоперский инструментарий и компании заинтересованы в универсальном программисте, решающем любые задачи. Однако, я, как вовлеченный и в ту и в другую деятельность перечислю ниже основные отличия между web и desktop разработками:Ещё...

Тэги: Analytics | Code


Multi-thread testing for web-service

В работе постоянно приходится тестировать с помощью NUnit различные web-службы. Но я делаю не банальный одиночный вызов или серию последовательных вызовов, а создаю серию потоков вплоть до максимально разрешенного на текущей машине, каждый из которых по команде начинает делать запрос в web-службу. В случае, если на сервере IIS разрешено более одного процесса, для обслуживания ApplicationPool, то это может выявить неожиданные блокировки ресурсов, которые нужно уметь отлавливать.
Эмитация такого многопоточного обращения к одному сервису сделана как показано ниже: Ещё...

Тэги: Code | S-c.me


BlogEngine - MultiPost v0.1.4

Обновил расширение для BlogEngine позволяющее постить одновременно сразу в несколько блогомест. Качать архив файлов тут. Архив содержит 3 вещи, которые нужно поместить в корень вашего блога заменив старое - 1) папку admin с измененным файлом Settings, я там исправил ошибку с редактированием настроек 2) папку App_Code - в ней содержится код расширения, который вы сможете поправить, если нужно 3) Папку bin, которая содержит библиотеку BlogsAPI, в которой реализована работа с основными(lj,liru,yaru,blogsmail) блогохостингами.

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

Сейчас там реализовано копирование постов на Лиру и Яру. Но если есть желание, то можно дописать свой класс для копирования постов куда угодно, который имеет интерфейс IBlogHosting и поместить его в namespace MultiPostExtension.Blogs:
Ещё...

Тэги: BlogEngine | Blogs | Code


Кто я?

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

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

Topbot at FeedsBurner

Копирайт

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

© Copyright 2008