Про Твиттер и 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


livejournal latest records

В одном из последних обновлений Livejournal в целях популяризации новичков было сообщено о странице с самыми свежими записями. Этот вынужденный шаг супротив тренда по переводу своих блогов на стандалоны и на закрытие своих блогов, делая их платными. Так вот, в лучших традициях ЖЖ оказалось, что RSS выдача последних записей не работает. Точнее она не обновляется, ввиду того, что сильно закэширована под GoatProxy, да и реализована в каком-то жутком RDF с кастомными схемами. Поэтому, если приглядеться к самой странице, то можно увидеть 2 интересные вещи. Во первых, она делает вызова JSON на http://livejournal.com/__api/ - видимо API точка, документация по которой, как указано, находится по пути http://www.livejournal.com/support/faqbrowse.bml?faqid=377, где пишется, что Reserved for new feature. То есть этот API будет описан в лучшем случае в будущем, а пока можно попробовать использовать как есть. Все же JSON менее избыточен нежели RDF.

И напоследок, меня заинтересовала страница со статистикой http://www.livejournal.com/stats/. Видимо это старая, системная, которой давно никто не занимается. Так вот из нее следует, что активных авторов в ЖЖ порядка 100тыс. в сутки, и если добавить данные, что яндекс индексирует 150 тыс. записей в сутки, то всреднем 1,5 записи на активного блогера. Также есть данные по демографии и они очень странные, но их комментировать бесполезно, так как там явно замешаны американские боты.

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

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


Вакансия в СУПе

Заметил вакансию открытую в СУПе - http://www.t30p.ru/jobs.aspx?l=http%3a%2f%2fhh.ru%2fvacancy%2f6382222 - позволяющую запросто любому блогеру стать "платным блогером" с белой зарплатой.

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


Про последние обновление ЖЖ

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

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


про блоги и жж

Очередное видео про блоги, комментарии
1. Правильно, что скоро соцкап скоро будет типизирован. В целом, социальный авторитет тоже это ждет.
2. Да, AdSense не приносит денег вообще.
3. Основные деньги ЖЖ приносятся через спец проекты и брендовые блоги. Так что blogscloud.ru - тоже правильная концепция. Можно попробовать концепцию "создай свое СМИ" и тем самым открыть возможности создания блогов для всех.
4. Архитектура ЖЖ - убога, например проблема разделения представления и отображения по темам оформления успешно решена в BlogEngine, особенно радует мобильная версия в отдельной теме.
5. Государство не делает "интренет все в одном" в отличии от фейсбука и гугла только потому, что это дорого и правильно давать другим возможность ошибаться и тратиться на социальный сети, которые тем не менее будут контролироваться государством.

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


Azure Tables / Multi Role Counter

Пост содержит много кода и призван рассказать о реализации счетчика посещений в мульти-инстансовой мультипоточной среде, коей является любое веб приложение под Windows Azure. Впервые простая реализация счетчика была продемонстрирована в шоу channel9 и в целом он работал неправильно и решал лишь проблему мультипоточности при помощи Interlocked объекта.
Во-первых сразу определимся, что данные у нас по счетчику будут складироваться в Azure Table - по сути это следующее этап развития SQL баз данных, которые не требуют знания SQL, а позволяют описывать структуру объекта прямо в коде. Для работы с таблицами используется Entity Framework, для которого удобно использовать обертку SyncTimes примерно следующего вида:
Copy Source | Copy HTML
  1. /// <summary>
  2. /// Многопоточная работа с таблицами Азуре
  3. /// </summary>
  4. /// <typeparam name="T"></typeparam>
  5. public class SyncTimes<T> where T: TableServiceEntity,new()
  6. {
  7.     #region Azure Table's Row
  8.     public T _tc;
  9.     public T tc
  10.     {
  11.         get
  12.         {
  13.             if (_tc != null) return _tc;
  14.             _tc = Reload();
  15.             return _tc;
  16.         }
  17.         set { _tc = value; }
  18.     }
  19.     #endregion
  20.     public string roleid
  21.     {
  22.         get
  23.         {
  24.             return RoleEnvironment.IsAvailable ? RoleEnvironment.CurrentRoleInstance.Id : "0";
  25.         }
  26.     }
  27.     #region Работа через Таблицы
  28.     [ThreadStatic]
  29.     public static TableServiceContext _containerTable;
  30.     public TableServiceContext ContainerTable
  31.     {
  32.         get
  33.         {
  34.             if (_containerTable != null) return _containerTable;
  35.             lock (CurrentInstance)
  36.             {
  37.                 if (_containerTable != null) return _containerTable;
  38.                 CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
  39.                     "DefaultEndpointsProtocol=http;AccountName=imagecontainer;AccountKey=");
  40.                 CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
  41.                 tableClient.CreateTableIfNotExist(typeof(T).Name);
  42.                 // Retrieve a reference to a container  
  43.                 _containerTable = tableClient.GetDataServiceContext();
  44.                 _containerTable.IgnoreResourceNotFoundException = true;
  45.                 _containerTable.MergeOption = MergeOption.AppendOnly;
  46.             }
  47.             return _containerTable;
  48.         }
  49.         set { _containerTable = value; }
  50.     }
  51.     #endregion
  52.     public static SyncTimes<T> CurrentInstance
  53.     {
  54.         get
  55.         {
  56.             var table = HttpContext.Current.Items[typeof(T).Name] as SyncTimes<T>;
  57.             if (table != null) { return table; }
  58.             table = new SyncTimes<T>();
  59.             HttpContext.Current.Items[typeof(T).Name] = table;
  60.             return table;
  61.         }
  62.     }
  63.     /// <summary>
  64.     /// Создание запросного объекта
  65.     /// </summary>
  66.     /// <returns></returns>
  67.     public IQueryable<T> CreateQuery()
  68.     {
  69.         return ContainerTable.CreateQuery<T>(typeof(T).Name);
  70.     }
  71.     /// <summary>
  72.     /// загрузка-обновление таблицы
  73.     /// </summary>
  74.     /// <returns></returns>
  75.     private T Reload()
  76.     {
  77.         try
  78.         {
  79.             string blogid = Blog.CurrentInstance.Id.ToString();
  80.                 ReadOnlyCollection<EntityDescriptor> oEntities = ContainerTable.Entities;
  81.                 if (oEntities.Count >  0)
  82.                 {
  83.                     EntityDescriptor ed = oEntities.FirstOrDefault(
  84.                         p => p.Entity.GetType() == typeof (T) &&
  85.                              ((T) p.Entity).RowKey == roleid &&
  86.                              ((T) p.Entity).PartitionKey == blogid);
  87.                     if (ed != null)
  88.                     {
  89.                         ContainerTable.Detach(ed.Entity); //удалим из трекинга(!)
  90.                     }
  91.                 }
  92.                 T te = (from e in CreateQuery() where e.RowKey == roleid && e.PartitionKey == blogid select e).FirstOrDefault();
  93.                 if (te == null)
  94.                 {
  95.                     te = new T{PartitionKey = blogid,RowKey = roleid};
  96.                     ContainerTable.AddObject(typeof(T).Name, te);
  97.                     //ContainerTable.SaveChangesWithRetries();
  98.                 }
  99.                 return te;
  100.         }catch(Exception e1)
  101.         {
  102.             Trace.WriteLine(e1);
  103.         }
  104.         return null;
  105.     }
  106.     /// <summary>
  107.     /// Делаем обновление в БД.
  108.     /// </summary>
  109.     /// <remarks>передаем нул в качестве объекта, если хотим просто вызвать обновление</remarks>
  110.     /// <returns>TRUE if no error</returns>
  111.     public Boolean Update(object te, bool applychanges = true)
  112.     {
  113.             try
  114.             {
  115.                 if (te != null)
  116.                 {
  117.                         try
  118.                         {
  119.                             ContainerTable.UpdateObject(te);
  120.                         }
  121.                         catch(ArgumentException e0)//not tracking
  122.                         {
  123.                             ContainerTable.Detach(te);
  124.                             ContainerTable.AttachTo(typeof(T).Name, te, "*");
  125.                             ContainerTable.UpdateObject(te);
  126.                         }
  127.                         catch (DataServiceRequestException e1)//tracking by different uri
  128.                         {
  129.                             ContainerTable.Detach(te);
  130.                             ContainerTable.AttachTo(typeof(T).Name, te, "*");
  131.                             ContainerTable.UpdateObject(te);
  132.                         }
  133.                 }
  134.                 if (applychanges &&
  135.                     ContainerTable.Entities.Count(p => p.State != EntityStates.Unchanged && p.State!=EntityStates.Detached) >  0)
  136.                 {
  137.                     ContainerTable.SaveChangesWithRetries();
  138.                 }
  139.             }
  140.             catch (DataServiceRequestException ex)
  141.             {
  142.                 //значит объект не соответствует тому, что хранится в БД и нужно его обновить
  143.                 if (typeof(T) != typeof(HitsCounter))
  144.                 {
  145.                     Utils.Log(ex);
  146.                 }
  147.                 return false;
  148.             }
  149.         return true;
  150.     }
  151.     /// <summary>
  152.     /// Делаем обновление в БД.
  153.     /// </summary>
  154.     /// <returns></returns>
  155.     public T[] GetAllInstances(string blogid)
  156.     {
  157.         lock (ContainerTable)
  158.         {
  159.             try
  160.             {
  161.                 return (from e in CreateQuery() where e.PartitionKey == blogid && e.RowKey != roleid select e).ToArray();
  162.             }
  163.             catch (Exception e1)
  164.             {
  165.                 Trace.WriteLine(e1);
  166.             }
  167.         }
  168.         return null;
  169.     }
  170. }

Важно понимать, что [ThreadStatic] объект необъодимо занулять в начале хендлера каждого запроса, чтобы гарантировать, что внутри каждого потока у нас уникальный DataContext постоянный на протяжении всей обработки запроса. Теперь перейдем к реализации класса учета обращений. В моем случае мультипоточность учитывается классом ConcurrentDictionary и сама запись в Таблицу вызывается только при достижении 10 обработанных запросов в инстансе. Это не идеально, и имеет некоторую долю ошибок, однако реализация точного учета обращений в мульти-истансовой веб-роле привело бы к блокировки потока на 100мс, чего мы избегаем. Отмечу, что для разных инстонсов роли пишутся разные объекты в таблице, а при итоговом выводе, когда нужно получить сумму - они суммируются.
Copy Source | Copy HTML
  1. /// <summary>
  2. /// Summary description for TopPosts
  3. /// </summary>
  4. /// <remarks></remarks>
  5. [Extension("Counts and displays the number of viewers for a post", "3.0", "")]
  6. public class TopPosts
  7. {
  8.     /// <summary>
  9.     /// Initializes a new instance of the <see cref="TopPosts"/> class.
  10.     /// </summary>
  11.     /// <remarks></remarks>
  12.     static TopPosts()
  13.     {
  14.         Post.Serving += new EventHandler<ServingEventArgs>(OnPostServing);
  15.     }
  16.     /// <summary>
  17.     /// Called when [post serving].
  18.     /// </summary>
  19.     /// <param name="sender">The sender.</param>
  20.     /// <param name="e">The <see cref="BlogEngine.Core.ServingEventArgs"/> instance containing the event data.</param>
  21.     /// <remarks></remarks>
  22.     private static void OnPostServing(object sender, ServingEventArgs e)
  23.     {
  24.         NameValueCollection headers = HttpContext.Current.Request.Headers;
  25.         if (headers["X-moz"] == "prefetch")
  26.         {
  27.             return;
  28.         }
  29.         IPublishable ipub = (IPublishable)sender;
  30.         try
  31.         {
  32.             // Check For Single Post View, When viewing Specific Post, basically through post.aspx)
  33.             if (e.Location == ServingLocation.SinglePost)
  34.             {
  35.                 int viewCount;
  36.                 // Fetch out total views of current viewing post.
  37.                 viewCount = IncrementPostViewCount(ipub.Id.ToString());
  38.                 // Override the body of the post (temporary) to display total views
  39.                 if (Security.IsAuthenticated)
  40.                 {
  41.                     e.Body = String.Format(Resources.labels.totalViews + ": {0}<br/>", viewCount) + e.Body;
  42.                 }
  43.             }
  44.             else if (e.Location == ServingLocation.PostList && Security.IsAuthenticated)
  45.             {
  46.                 int viewCount = GetCountForPost(ipub.Id.ToString());
  47.                 // Override the body of the post (temporary) to display total views
  48.                 e.Body = String.Format(Resources.labels.totalViews + ": {0}<br/>", viewCount) + e.Body;
  49.             }
  50.         }
  51.         catch (Exception)
  52.         {
  53.         }
  54.     }
  55.     /// <summary>
  56.     /// Gets the popular posts.
  57.     /// </summary>
  58.     /// <param name="numberOfTopPosts">The number of top posts.</param>
  59.     /// <returns></returns>
  60.     /// <remarks></remarks>
  61.     public static List<KeyValuePair<string, int>> GetPopularPosts(int numberOfTopPosts)
  62.     {
  63.         List<KeyValuePair<string,int>> list = new List<KeyValuePair<string, int>>( 0);
  64.         IQueryable<HitsCounter> q = SyncTimes<HitsCounter>.CurrentInstance.CreateQuery();
  65.         HitsCounter[] posts =
  66.             (from e in q where e.PartitionKey == Blog.CurrentInstance.Id.ToString() select e).OrderByDescending(
  67.                 z => z.hits).Take(numberOfTopPosts).ToArray();
  68.         list.AddRange(posts.Select(hitsCounter => new KeyValuePair<string, int>(hitsCounter.RowKey, hitsCounter.hits)));
  69.         return list;
  70.     }
  71.     /// <summary>
  72.     /// Gets total view count for a certain post
  73.     /// </summary>
  74.     /// <param name="postId">the post id</param>
  75.     /// <returns>total live views count</returns>
  76.     /// <remarks></remarks>
  77.     public static int GetCountForPost(string postId)
  78.     {
  79.         return (from e in SyncTimes<HitsCounter>.CurrentInstance.CreateQuery() where e.RowKey == postId select e).
  80.             Sum(hitsCounter => hitsCounter.hits);
  81.     }
  82.     /// <summary>
  83.     /// Количество просомтров для обновления
  84.     /// </summary>
  85.     public static ConcurrentDictionary<string, int> oViews = new ConcurrentDictionary<string, int>();
  86.     /// <summary>
  87.     /// Increment view count of a post
  88.     /// </summary>
  89.     /// <param name="postId">Id of the post</param>
  90.     /// <returns>the post's view count</returns>
  91.     /// <remarks></remarks>
  92.     public static int IncrementPostViewCount(string postId)
  93.     {
  94.         int viewCount =  0;
  95.         try
  96.         {
  97.             string PartitionKey = RoleEnvironment.IsAvailable ? RoleEnvironment.CurrentRoleInstance.Id : "0";
  98.             PartitionKey += "_"+Blog.CurrentInstance.Id.ToString();
  99.             //если есть несохраненные изменения, то это для нас!
  100.             HitsCounter h = null;
  101.             IQueryable<HitsCounter> q = SyncTimes<HitsCounter>.CurrentInstance.CreateQuery();
  102.             HitsCounter[] hArray = (from e in q where e.RowKey == postId select e).ToArray();
  103.             foreach (HitsCounter hitsCounter in hArray)
  104.             {
  105.                 viewCount += hitsCounter.hits;
  106.                 if (hitsCounter.PartitionKey == PartitionKey)
  107.                 {
  108.                     h = hitsCounter;
  109.                 }
  110.             }
  111.             viewCount++;
  112.             bool success = false;
  113.             oViews.AddOrUpdate(postId, 1, (key, oldValue) => oldValue+1);
  114.             if (oViews[postId] > 10)
  115.             {
  116.                 if (h == null)
  117.                 {
  118.                     h = new HitsCounter(PartitionKey, postId)
  119.                             {
  120.                                 hits = oViews[postId]
  121.                             };
  122.                     SyncTimes<HitsCounter>.CurrentInstance.ContainerTable.AddObject("HitsCounter", h);
  123.                     success = SyncTimes<HitsCounter>.CurrentInstance.Update(null);
  124.                 }
  125.                 else
  126.                 {
  127.                     h.hits += oViews[postId];
  128.                     success = SyncTimes<HitsCounter>.CurrentInstance.Update(h);
  129.                     //успешное обновление
  130.                 }
  131.                 if (!success)
  132.                 {
  133.                     Utils.Log("Postid=" + postId + "; views=" + oViews[postId]);
  134.                 }
  135.                 else
  136.                 {
  137.                     int viewCount2;
  138.                     oViews.TryRemove(postId, out viewCount2);
  139.                 }
  140.             }
  141.         }
  142.         catch (DataServiceRequestException e1)
  143.         {
  144.             Utils.Log(e1);
  145.         }
  146.         catch(Exception e2)
  147.         {
  148.             Utils.Log(e2);
  149.         }
  150.         return viewCount;
  151.     }
  152. }

В ближайшие дни расскажу, почему обновление BlogEngine 2.6 содержит большой идеологический минус и о том, какие есть сложности в постронии блогохостинговой платформы.

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


обо всем по немногу

  • Очень интересная флешка с информацией о размерах всех известных человечеству объектах
  • Оптимизация 100 из 100 по версии гугла для блога на BlogEngine достижима
  • В ЖЖ на след.неделе появится социальный капитал, который уже можно смотреть на страницах топа, сейчас там обновленная версия по вчерашнее число.
  • Для рейтинга по фейсбуку появилась возможность вывести колонку с кнопками лайков, что позволяет удобно залайкать почти все русскоязычные страницы.
  • В ходе тестирований ссылки с русскоязычными буквами признаны неполноценными в некоторых браузерах, особенно в Хроме, поэтому проставляем только англоязычные

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


Блог на мобильном

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

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


Вблоге

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

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


bb AdSense

Выяснилась причина, по которой гугл втихаря крутил у меня в блоге рекламу 3 месяца, а показы незасчитывал. А вину этому стал пост http://t30p.livejournal.com/14701.html. В правилах гугла написано, что блокируются сайты, которые содержат либо 1) непристойные или провокационные изображения 2) материалы, содержащие грубую или ненормативную лексику, в том числе эротические рассказы 3) сексуальные советы или рекомендации 4) эротические игрушки и продукция и т.д. А именно этим наполнена блогосфера, особенно по пятницам. В общем 100 у.е. в год не стоят того, чтобы посетители видели объявления. Все, отключаю AdSense в блогах, а жаль, ведь планировал окупить платный аккаунт за год.

UPDATE: После публикации этой записи и отключения рекламы в AdSense, СУП тут же перевел мой блог t30p@lj в режим read-only за публикацию полгода назад поста про навального. Собственно текст разбирательства с конфликтной комиссией. И копия самого поста про навального.

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


Про YAC2011

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

Единственное, что интересное, так это ЯндексБлоги. Удалось узнать, что последнее время они решают технические вопросы связанные с выросшей нагрузкой, поэтому и не выкладывают новых фишек. И видимо до нового года ничего не будет. Сейчас яндекс индексирует около 7 млн. постов в блогах в сутки, из них около 80% - это микроблоги на mail.ru, а еще 70% оставшегося - спам.

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


Agava tango down

Только что упали все win VDS агавы. Пока новостей нет, но в месте с ними недоступны и t30p.ru . UPD: Были перебои электричества, где-то 3 часа потеряли.

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


ЖЖ update comment

На днях обновился ЖЖ и, что самое интересное, были озвучены планы на следующий update. В эти планы входит сделать новый топ записей, обещают убрать все "гавно"! ну надо же! И вместе с тем говорят про введение новой возможности для любого блогера выведение своей записи на главную lj.ru . Изначально, как мне казалось, для этого было введена возможность "рекомендовать", но как выяснилось, больше людей нажимают "лайки фейсбука", нежели скрытую внизу страницы кнопку рекомендовать. Таким образом, создавая платный топ - ЖЖ усердно готовится к политическим баталиям следующего года и уже планирует технологию собственного обогащения. Чтобы политические организации платили не блогерам посредникам, а напрямую в кассу ЖЖ. Комментарий тут простой - "ЖЖ всегда находило интересные способы, чтобы потерять аудиторию, но не полностью".

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

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


Опять про рейтинг яндекса.

Сегодня обновился рейтинг Яндекса. Некоторые, особо завязанные на нем, уже успели поднять в жж очередной плачь. Некоторые предлагают массово удалять кнопки яндекса. А прошло-то всего 3 месяца с прошлого обновления от 27.03.2011, что вполне нормальный срок для пересчета графа на 20 млн. вершин и всех ссылок в них за год, которых должно быть около 2 млрд. для всей блогосферки.

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

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


Госзакупки в блогосфере

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

Во-первых, технические требования были изложены крайне коряво и тертые люди уверяли меня, что документ специально написан для местных, да еще и с нарушением ФЗ.
На мой же взгляд, проблемные моменты следующие:
  • В ТЗ написано, что "в случае невозможности получения сообщений по электронной почте, информация доставляется силами Исполнителя и на средства Исполнителя в указанное выше время на электронных носителях" - передача информации на носителях напрямую в администрацию самары для многих затруднительна и нет гарантии получения электронного сообщения заказчиком на протяжении всего срока работ.
  • В ТЗ запрашивается "Ежедневный отчет ... по электронной почте в 10.00 ч. и в 16.00 ч.". Такая регулярность малоосмыслена, так как картина обсуждения в соц.сетях и частота появляния новых упоминаний об администрации не настолько велика. Молодежные движения предпочитают еженедельный или два раза на неделе вид ответности. Более регулярный мониторинг обычно возлагается на пресс-службы администраций, в которых налажено круглосуточное дежурство.
  • По ТЗ необходимо проставлять "Количество просмотров публикации". Важно понимать, что в большинстве случаев эта величина имеет оценочный характер и далека от действительности. И даже если сегодня у негативного отзыва мало просмотров, то неизвестно, что будет завтра. Поэтому все упоминания должны иметь одинаковую очередность при анализе.
  • Пункт "Информирование заказчика о появление интересных, острых сообщений в течение дня....в течение 30 минут после появления информации в сети". Все современные мониторинги социальных сетей заточены на работе через открытые интерфейсы поисковых машин. Которые в свою очередь не гарантируют, что информация будет проиндексирована и норма гарантированного индексирования записи для различных платформ составляет 4 часа.
  • В порядке расчетов указано, что "заказчик производит оплату ежемесячно по факту оказания услуг в течение 30 календарных дней с момента подписания актов оказанных услуг.". 30 дней - слишком большой временной интервал для проведения оплаты, сравнимый со всем периодом оказания услуги.
  • В ТЗ указано "Совместная работа с Заказчиком по формированию оперативных ответов, комментариев и реплик - выстраивание эффективных коммуникационных связей". Такая формулировка выходит за рамки мониторинга блогосферы и затрагивает услугу по пиару в социальных сетях, что требует несколько большей оплаты.


Но не смотря ни на что торги проведены, подано 11 заявок, в том числе 2 от московских фирм и выиграла Тюмень, получив аж 139т.р. до вычета налогов. Что примерно 35т.р. в месяц на одного человека. В комиссии присутствовали заместитель председателя и секретарь. Таким образом, ручной бесцельный труд остается дешевле автоматизированного и уходит по разумным ценам.

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


победа здравого смысла

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

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


Про ЖЖ и рынду

Во вторник прошло странное событие, которое называлось "Рында ЖЖ 2010" и имело своею целью простимулировать лучших блогеров за 2010 год и их журналистскую активность на 2011 год. Отмечу, что приз взяла Волочкова, которая скандал-то устроила уже в январе 2011 года. Все кто посетили мероприятие, мало того, что были пользователями Фейсбука, странный ход СУПа, но и отзываются о скучности мероприятия и тесноте, в которой все проходило. Венцом оного действа можно назвать очередной пост блогера с 8ми летним стажем, который говорит о смерти ЖЖ в текущем варианте и призывается сделать из ЖЖ Фейсбук (хаха). Единственная дельная мысль приведенная им - что администрации СУПа стоит сконцентрироваться на мероприятиях для платных пользователей, а не для всех. Это бы уменьшило число участников, но улучшило их качество.
Отдельно смешно читать про то, что в Фейсбуке меньше спама и что там реальные люди.

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


Платные блогеры

Из новостей блогосферы, оказывается с начала года 2 известных блогера объявили, что пишут рекламные посты в открытую за бабки: russos.livejournal.com - 15т.р. за пост, и zyalt.livejournal.com - 50т.р. Что примечательно, названные суммы вполне коррелируют с опубликованной мною таблицей c оценками стоимости постов в рунете на основе получаемого эффекта. Что примечательно, математически им были названы суммы в 20т.р. для russos и 40т.р. для zyalt.

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


Итоги топа за год

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

сколько стоит пост

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


Заработать в Интернете?

Интересная передача по ТВ на тему "Заработать честно и много в Интернете нельзя". Ключевое слово тут - "честно". То есть почти все, кто зарабатывают через интернет, ведут нечестный образ жизни. Налоги то не платят =), да и "честно" зарабатывают мало. Конечно же передача сделана не в целях пропаганды, что открытый инетнет - это зло, а чтобы развить интересную тему заработка при помощи сети Интернет. Примечательно, что гость передачи, считает, что российская блогосфера отстает в развитии от запада на "5-7 лет".

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


Кто я?

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

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

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

Topbot at FeedsBurner

Облако тэгов

Мои Твиты

Twitter августа 16, 21:21
программа instagramliker обновлена 2018г еще раз http://dlvr.it/Qg7KPW

Twitter августа 15, 18:33
Разбор 2 сезона Рассказ служанки http://dlvr.it/Qg0Qxv https://twitter.com/f1ashr/status/1029798147676037121/photo/1

Twitter августа 14, 10:28
Юпитер для Америки (Юмор от НАСА) http://dlvr.it/QfqqTP https://twitter.com/f1ashr/status/1029313699054477312/photo/1

Twitter августа 14, 10:28
Мелькает число 35 в международных новостях http://dlvr.it/QfqqXV

Twitter августа 10, 23:41
Рейтинг каналов и ботов Телеграмм http://dlvr.it/QfVknB https://twitter.com/f1ashr/status/1028063721153691648/photo/1

Twitter августа 10, 23:41
Facebook потерял спутник во взрыве SpaceX http://dlvr.it/QfVklq https://twitter.com/f1ashr/status/1028063716946792448/photo/1

Twitter августа 10, 23:09
Интернет мемы победили Иисуса http://dlvr.it/QfVdXj https://twitter.com/f1ashr/status/1028055673823670272/photo/1

Twitter августа 10, 23:09
Японское аниме в российских кинотеатрах http://dlvr.it/QfVdV3 https://twitter.com/f1ashr/status/1028055668341661696/photo/1

Twitter августа 10, 23:09
Карта из 500млн. чекинов http://dlvr.it/QfVdQG https://twitter.com/f1ashr/status/1028055661697875968/photo/1

Twitter августа 10, 22:35
Медведь открывает дверь http://dlvr.it/QfVWZY https://twitter.com/f1ashr/status/1028047110791299072/photo/1

Twitter августа 10, 22:01
На батуте в космос http://dlvr.it/QfVNw3

Twitter августа 10, 21:29
Российские дирижабли покарят мир в 2035 году http://dlvr.it/QfVGwd https://twitter.com/f1ashr/status/1028030497220259840/photo/1

Twitter августа 10, 21:29
Skype and Baidu links http://dlvr.it/QfVGyS

Twitter августа 10, 21:29
7 лет аккаунту в твиттере http://dlvr.it/QfVGz9

Twitter августа 8, 09:51
Разбор сериала Экспансия (Пространство) http://dlvr.it/QfBHV6 https://twitter.com/f1ashr/status/1027130062976372736/photo/1

Twitter июля 29, 17:51
Добыча криптовалюты в браузере посетителей сайта http://dlvr.it/Qd94p4 https://twitter.com/f1ashr/status/1023626972050518016/photo/1

Twitter июля 29, 04:45
Танцы человека с роботом http://dlvr.it/Qd6Zmn

Twitter июля 29, 04:45
Казахстан переходит на 2-й этап к демократии http://dlvr.it/Qd6Zmt

Twitter июля 29, 04:45
Проблема монетизации на Ютубе http://dlvr.it/Qd6ZfV https://twitter.com/f1ashr/status/1023429180506009600/photo/1

Twitter июля 29, 04:12
Двенадцать часов на сценарной карте http://dlvr.it/Qd6VJL https://twitter.com/f1ashr/status/1023420876362895361/photo/1

Мой твиттер

Копирайт

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

© Copyright 2008