HTML5 Video for BlogEngine

Добавил возможность загрузки видео в блоги на базе BlogEngine. Видео проигрывается при помощи новейшего HTML5 и скриптов техаского прогера MediaElementJS. Жаль что пока не работает для мобильных устройств, а то получилось бы очень удобная замена Youtube. Ниже видео танцующего медведя.

[video src="Medved.mp4" width="420" height="360"]


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


BlogEngine 2.8

Вышла новая версия популярного блогового движка под .Net - BlogEngine. Как и с прошлой версией я не понимаю чем занимаются эти индусы во главе челом из Чикаго. По факту очередная версия с незначительными улучшениями (Обновление TinyMCE полезно, так как теперь позволяет вставлять видео с youtube корректно), в которой сохранились все теже Deadlock'и, что и ранее. Поэтому использовать движок в голом виде крайне не рекомендую. Не смотря на это он включен в каталог WebSites и предлагается многим для установки автоматически.

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

Метки:   Категории:BlogEngine | BlogsCloud


Про Твиттер и BlogEngine.NET

Индус опубликовал переделанный виджет Твиттера для BlogEngine, Это обновление вызвано было тем, что 10 октября, как некоторые могут заметить, Твиттер отключил выдачу данных по RSS, в связи с постепенным переходом на API v1.1. Отключение RSS выдачи вызывает проблему в том, что согласно Twitterizer.NET ленту пользователя можно получать только через функцию UserTimeline, которая подразумевает передачу данных oauth, то есть с аутентификацией. Однако, как умно поступил индус, оказывается всю ленту пользователя Твиттера можно сгружать напрямую, только уже не в виде RSS, а в виде XML или JSON:
Старая ссылка на RSS - https://twitter.com/statuses/user_timeline/t30p.rss (Not Valid) Новая ссылка на XML - http://api.twitter.com/1/statuses/user_timeline/t30p.xml Новая ссылка на JSON - http://api.twitter.com/1/statuses/user_timeline/t30p.json
То есть данные благоразумно вынесены на отдельный домен и добавлена версионность в виде единички.

Завершить пост хотелось бы опусом разработчиков BlogEngine, которые на днях заявили о выходе следующей версии 2.7, в которой по сути ничего нового, кроме обновления внутренних скриптов написания постов. Да и предыдущая версия 2.6 - содержала единственно обновление в виде "Мультиблогов", фишка которая полностью содрана с wordpress'a и которая, на мой взгляд, внесла неразбериху и в код и саму работу блогодвижка. Когда общая лента одного блога может быть сформирована как совокупность блогов внутри базы. Очевидно, что это по логике дублирует мультипользовательность, когда к одному домену-блогу имеют доступ несколько пользователей и они дружно выкладывают материалы. То есть разработка BlogEngine полностью стагнировала, как и у wordpress, после того, как основные разработчики системы ушли работать в Микрософт, а на смену пришли индусы.

Чтобы не быть голословным озвучу основные проблемы для блогдвижков, которые также поставили себе разработчики ЖЖ и которые позволили бы двигаться дальше. Их всего 3.
  • Azure + Multi Roles - чтобы один блог обслуживало несколько инстансов, то есть чтобы была масштабируемость блога. По факту это было сделано для blogscloud.ru, а то что предлагается как NuGet Package - все таже ненадежная одноинстансовая установка и неможет называться полноценным переносом в облако.
  • Mobile - у BlogEngine есть нормальная мобильная версия, но никто так и не занялся нормальным масштабированием картинок на лету. Это сложная задача, и хотелось бы чтобы опытные индусы ее решили.
  • Комментарии - до сих пор нет нормального решения для большого количества комментариев к посту. Всякие централизованные системы типа DISQUS тоже не устраивают, и медленно грузятся, и хранят контент не у нас. Да и децентролизованные блогодвижки должны быть максимально независимыми.
Этот список можно продолжить, но даже эту малость никто не делает. И для поисковиков ссылка на инструкцию, как перейти с блога wordpress на блог BlogEngine.NET.


Метки:   Категории:Blogs | Twitter | BlogEngine


Syria and BlogEngine

Обнаружил, что один из пропагандистских ресурсов американцев против сирийского народа работает на движке BlogEngine. При этом в крупнейших западных изданиях идет ссылки, что независимые блогеры интернета против режима Асада. По этому случаю запустил блог про Войну в Сирии, куда копируется вся правда о происходящих там событиях. К слову, все работает на движке BlogEngine портированном в облако под именем BlogsCloud.ru.

Метки:   Категории:BlogEngine | BlogsCloud


BlogEngine 1.6

Обновил свой основной блог ya.topbot.ru до недавно вышедшей версии BlogEngine 1.6. За полторы недели продукт успели скачать 2500 раз, что и позволяет судить о количестве активных блогеров, ведущих блоги на этой платформе. Да, до популярности wordpress'a еще далеко, но будем продолжать клепать плагины для движка. В частности, мой плагин "MultiPost", по копированию постов во все места блогосферы, на базе BlogsApi работает без изменений кода.

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

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


Tag Cloud for ASP.NET by jQuery

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

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


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:Далее...

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


BlogEngine - MultiPost

Как вы знаете, я транслирую свои записи в несколько популярных блогомест в интернете (за исключением ЖЖ). И это я делаю не с помощью встроенных средств копирования постов, а с помощью самописного модуля (Extension) для движка BlogEngine.Net, работающем под ASP.NET. Почему так? Да потому, что часто при задании копирования постов с помощью сторонних средств, таких как трансляции на Ya.ru, посты помещаемые в блог выпадают из поискового индекса и ссылки в них не учитываются.

1) Модуль получился расширяемый, что позволяет дописать копирование постов куда вам только захочется. В вышеуказанный архив я вложил только два класса, которые позволяют копировать посты на Хабр и на Ярушечку. Так как ярушечка имеет херовый интерфейс, и код выглядит очень сложным (и, кстати, не рабовает, если Вы недавно заходили под своим же аккаунтом с другой машины), а также придется добавить следующие строчки в web.config:
  1. <system.net>
  2.    <settings>
  3.      <httpWebRequest useUnsafeHeaderParsing="true" />
  4.      <servicePointManager expect100Continue="false"/>
  5.    </settings>
  6.  </system.net>


2) Далее, в настройках интерфейса у Вас появится такая вот картинка, позволяющая настроить копирование постов:
Отмечу, что все селективные значения прописываются вручную, так как в текущей версии BlogEngine нет возможностей задавать параметр группы настроек модуля в виде выбора из списка. Надеюсь это сделают в следующей версии, которую обещают в конце Января. Итак, первый параметр отвечает за копирование постов (bool=true/false). Второй за название категории, только из которой , если она указана, будут копироваться посты. Третий - BlogType - название класса отвечающего за копирование. Далее логин-пароль в удаленной системе. BlogParam - это дополнительный параметр, который может понадобиться для определенный систем. В частности для Яндекса я передаю номер моего блога, чтобы не извлекать его каждый раз. MaxAttempts(int) - количество попыток кпирования поста, если неуспех, то бросаем это дело. Последний - PostType(Public/Private/OnlyFriends) - тип записи. Как видим, для хабра стоит Private, что означает, что я планирую подредактировать запись и вставить в нее кат, прежде чем делать общедоступной хабрачанцам.

3) Из внутренностей работы модуля рассмотрю класс MultiPost:
  1. namespace MultiPost
  2. {
  3.     /// <summary>
  4.     /// Copy all your posts to blog at http://wow.ya.ru
  5.     /// You have to assign an login and password inside constructor
  6.     /// </summary>
  7.     /// <remarks>
  8.     /// Based on pure code - http://ya.topbot.ru
  9.     /// </remarks>
  10.     [Extension("Copy all your posts to blogs", "0.1.1", "http://ya.topbot.ru")]
  11.     public class MultiPost
  12.     {
  13.         /// <summary>
  14.         /// Name of Module
  15.         /// </summary>
  16.         private static String sExtensionName = "MultiPost";
  17.  
  18.         static protected ExtensionSettings _settings = null;
  19.         /*....*/
  20.     }
  21. }
Как видим к атрибутах класса задаются настройки модуля, чтобы BlogEngine его воспринял как расширение. Конструктор достаточно простой, подписываемся на событие о размещении нового поста:
  1. static MultiPost()
  2. {
  3.     // create settings object. You need to pass exactly your
  4.     // extension class name (case sencitive)
  5.     ExtensionSettings settings = new ExtensionSettings(sExtensionName);
  6.     /*.......*/
  7.     ExtensionManager.ImportSettings(settings);
  8.     _settings = ExtensionManager.GetSettings(sExtensionName);
  9.     Post.Saved += new EventHandler<SavedEventArgs>(Post_Saved);
  10. }
И кода происходит новый пост, то обрабатываем его создавая новый поток для этих целей
  1. /// <summary>
  2.  /// Occurs on new post
  3.  /// <remarks>
  4.  /// It opens a new thread and executes
  5.  /// because it takes some time to complete.
  6.  /// </remarks>
  7.  /// </summary>
  8.  private static void Post_Saved(object sender, SavedEventArgs e)
  9.  {
  10.      if (e.Action != SaveAction.Insert)
  11.          return;
  12.  
  13.      IPublishable item = (IPublishable)sender;
  14.  
  15.      //(HttpContext.Current == null || !HttpContext.Current.Request.IsLocal)
  16.      if (item.IsVisible)
  17.      {
  18.          //getting new thread to do all crap
  19.           ThreadPool.QueueUserWorkItem(delegate {
  20.               PostCycle(item);
  21.           });
  22.      }
  23.  }
  24.  
  25.  /// <summary>
  26.  /// Main process to post
  27.  /// </summary>
  28.  /// <param name="item"></param>
  29.  public static void PostCycle(IPublishable item){
  30.      //перечисляем все блоги, что активны...
  31.      DataTable dt = _settings.GetDataTable();
  32.      //pure code, coz i cant change Categories class
  33.      string catsline = "";
  34.      foreach (Category c in item.Categories)
  35.      {
  36.          catsline += c.Title + ",";
  37.      }
  38.      for (int i = dt.Rows.Count - 1; i >= 0; i--)
  39.      {
  40.          SettingsCollection sets = new SettingsCollection(dt.Rows[i].ItemArray);
  41.          if (!sets.Enabled ||
  42.              (!String.IsNullOrEmpty(sets.CopyOnTags.Trim())
  43.              && catsline.Contains(sets.CopyOnTags))
  44.              )
  45.          {//not allowed to post
  46.              dt.Rows.RemoveAt(i);
  47.          }
  48.      }
  49.      //lets finish the others
  50.      for (int i = dt.Rows.Count - 1; dt.Rows.Count > 0; i--)
  51.      {
  52.          Thread.Sleep(5000);
  53.          if (i < 0)//new cycle...bad...bad
  54.          {
  55.              i = dt.Rows.Count;
  56.          }
  57.          try
  58.          {
  59.              SettingsCollection sets = new SettingsCollection(dt.Rows[i].ItemArray);
  60.              Type tBlog = Type.GetType("MultiPost.Blogs."+sets.BlogType);
  61.              Object theBlog = Activator.CreateInstance(tBlog,
  62.                  new object[1] { sets });
  63.              Type[] paramTypes = {
  64.                      typeof(IPublishable)
  65.                        };
  66.              Object[] ps = new object[1] { item };
  67.              MethodInfo mDefaults = tBlog.GetMethod("ProcessItem", paramTypes);
  68.              if ((Boolean)mDefaults.Invoke(theBlog, ps))//if success
  69.              {
  70.                  dt.Rows.RemoveAt(i);
  71.              }
  72.              //failed, lets continue
  73.          }
  74.          catch(Exception e)//toomanyattempts
  75.          {
  76.              dt.Rows.RemoveAt(i);
  77.          }
  78.  
  79.      }
  80.  }
В основном цикле, мы создаем объект класса, и вызываем нужную функцию размещения поста, передавая ей настройки. Как видно попытка разместить пост происходит каждые 5 секунд. Обработка объектов идет на объекте Rows, что некрасиво, но просто. Остальное Вы можете найти внутри выложенного архива. PS: Чтобы иметь возможность править настройки рекомендую заменить компонент admin/Extension Manager/Settings.ascx.cs на файл, вложенный архив. Там исправлена некоторая ошибка в функции редактирования настроек.


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


Кто я?

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

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

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

Topbot at FeedsBurner

Мои Твиты

Twitter марта 22, 19:33
Про терракты в Лондоне http://dlvr.it/Nhk5j4

Twitter марта 21, 07:56
Коломенский кремль: Альтернативная история http://dlvr.it/Ngyxx2 https://twitter.com/f1ashr/status/844095369554280448/photo/1

Twitter марта 19, 17:51
Программа InstagramLiker обновлена http://dlvr.it/NgHhRt

Twitter марта 15, 10:13
Шахматная композиция для демонстрации 3-го этапа общества http://dlvr.it/NdNj8V https://twitter.com/f1ashr/status/841955403420323841/photo/1

Twitter марта 13, 21:25
Мобильное приложение t30p.ru в AppStore http://dlvr.it/NchQpC

Twitter марта 13, 21:25
Инстаграм убивает карту фотографий http://dlvr.it/NchQfx https://twitter.com/f1ashr/status/841399738914111488/photo/1

Twitter марта 13, 20:54
Japanise Android http://dlvr.it/NcgtQ8

Twitter марта 13, 20:24
Как потратить валютные резервы России - Мыслить №50 http://dlvr.it/NcgN2x

Twitter марта 13, 19:51
Минусы Windows Azure и проблемы облачных технологий http://dlvr.it/NcfnJw https://twitter.com/f1ashr/status/841376089402359809/photo/1

Twitter марта 13, 19:51
Google Glasses fail http://dlvr.it/NcfnCX https://twitter.com/f1ashr/status/841376081978441728/photo/1

Twitter марта 13, 11:27
Разбор сериала "Мир Дикого Запада" http://dlvr.it/NcSZg7

Twitter марта 10, 20:40
О текущих проблемах http://dlvr.it/NbSMyV

Twitter марта 10, 18:32
Робот играющий в гольф http://dlvr.it/NbQ434

Twitter марта 10, 16:54
Ядерный могильник в приморье(?) http://dlvr.it/NbN716

Twitter марта 10, 15:57
Маугли как разрушитель иллюзий у обезьян (обзор фильма) http://dlvr.it/NbLy2T

Twitter марта 10, 15:26
Русский youtube и твиты за день http://dlvr.it/NbLJkc https://twitter.com/f1ashr/status/840222240268476418/photo/1

Twitter марта 10, 14:51
Покемоны против Игроков http://dlvr.it/NbKbYg

Twitter марта 8, 18:19
По случаю 8 марта погасили статую свободы http://dlvr.it/NZQvwm https://twitter.com/f1ashr/status/839540984539045888/photo/1

Twitter марта 3, 20:35
В Ступино напечатали первый 3D дом http://dlvr.it/NXFpJR

Twitter марта 1, 19:51
Паштет из мяса медведя с брусникой http://dlvr.it/NWHDmV https://twitter.com/f1ashr/status/837027553009229826/photo/1

Мой твиттер

Копирайт

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

© Copyright 2008