Новогодние поздравления от Google

Для новости, связанные с Гугл случились под новый год. Во-первых гугл удалил мое мобильное приложение t30p из GooglePlay, составшись на слишком откровенное фото в иллюстрации к работе приложения. Что такое слишком откровенное фото в 2к19 показано ниже. Удалил картинку, доступ к приложению восстановлен.

Вторая новость заключается в том, что с марта 2019 года Гугл закрывает окончательно доступ к API Google Plus. Эта социальная сеть умирает слишком долго. Но видимо с марта умрет окончательно. 


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


По-тихому закрылся taaasty.com

Об этом проекте наверно мало кто слышал. Но это типа "твиттер от mail.ru". Выдавал где-то по 200 сообщений в сутки. Что это были за сообщения можно посмотреть и в самом твиттере.

UPD: Сервис заработал снова, после недельного перерыва.


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


Вконтакте закрыла гео-поиск

С этого месяца не работает метод places.getCheckins, который и позволял получить сообщения по месту. Поэтому в приложении t30p меньше стало показываться сообщений по месту. Техподдержка ВК говорит, что метод getChekins будет удален. Замены этому методу не предвидится, разве что поточная обработка всех постов во вконтакте. Но это будет доступно далеко не всем.


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


Пришел ответ от Youtube по поводу видео

Ответ на проблематику прошлого поста про монетизацию видео. Ответ весьма лаконичный:

Thank you for submitting your video appeal to YouTube. After further review, we've determined that while your video does not violate our Community Guidelines, it may not be appropriate for a general audience.

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

 


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


Гель, который позволяет запаивать раны за 60 сек.

Ученые из Сиднея представили гель, который позволяет заживлять раны примерно также, как запаивали роботам ранения в Мире Дикого Запада.


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


Дебаты у Калашникова одной картинкой

Белые и черные во всю пытаются поругаться. Но черные заняли такую позицию, что поругаться уже не получается. Все дружно выступают против власти.


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


8 японок основали поп-группу для пропаганды криптовалют

К вопросу популряности криптовалют для Японии.

Kasotsuka Shojo («криптовалютные девушки») — японский гёрлз-бенд из восьми участниц, поющих в стиле джей-поп. Артистки выступают под псевдонимами «биткоин», «эфир», «рипл» и своей задачей называют продвижение криптовалют. «Своими шоу мы хотим показать, что цифровые валюты — не инструмент для спекуляций, а отличная технология, за ней будущее», — утверждает 18-летняя солистка Рара Нарусэ. «Луна, виртуальные валюты и я» — первая песня группы. В ней девушки призывают обезопасить свои накопления от аферистов. Певицы скрываются под масками наподобие тех, что носят мексиканские рестлеры-лучадоры, на лбу у каждой — логотип криптовалюты, которую она представляет. В пятницу группа дала дебютный концерт в Токио. Уточняется, что мерч Kasotsuka Shojo продается только за виртуальные деньги.


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


Upside down, Inside Out, Zero Gravity

Очередное эпическое видео взрывает интернет. Снято на борту самолета, суммарно 21 вылет и более 2-х часов невесомости. По случаю выскажусь про свежее открытие LIGO про гравитационные волны. Понятно, что они озвучили очередную лажу. У них есть формула связи электромагнитной волны и гравитации. Если по Теории относительности, которая не верна, считать, что скорость света предельно велика, то получается необходимость в наличии конечной скорости для гравитационной волны. Это ошибочное утверждение и было продемонстрировано широкой общественности. Если убедиться, что это не так, то пропадет и ОТО. Нагляднее будет в моем ролике про гравитацию, если я его доделаю. 




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


Тема смены дня и ночи

Годовой обзор роликов на тему смены дня и ночи для российского народа.


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


Про жизнь в Южной Осетии

Недавно Путин встречался с президентом Южной Осетии, к которой лично у меня был и остается ряд вопросов. В сети появилось развернутое интервью об этой встрече одного из участников. По сути говорится, что Россия тратит на регион 2,5 млрд.р. в год, а нужно 3 млрд. на газификацию региона. Я ничего против не имею, чтобы "кормить" таких достойных людей, как осетин. Но открытым остается вопрос, что Россия получает взамен и почему этот географический регион до сих пор не в составе большой страны? И неужели план газификации нельзя было утвердить за 7 лет, прошедшие с 2008 года? Или же руководство нашей страны ждало 7 лет, пока что-то не случится, чтобы дать ход развитию сотрудничества? 


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


Донецк в репортаже первого канала

Вчера в репортаже первого канала про Донецк во всю показывали одну из центральных частей города. Где, как оказалось, и находится основной покерный клуб города со звучным названием "Третий рим"(ссылка на панораму гугла). Напротив большое здание - "национальный академический театр оперы и балета". С такой подачи первого канала, версия о том, что Донецк будет взят украинской армией к 24 августа, к годовщине падения Рима - кажется не такой уж и фантастичной. И тогда установится длительное перемирие.

На фоне этого, обе противоборствующие стороны активно занимаются созданием по Шекспиру "Кориоланов" - героев войны. Которые в независимости от того, что было на фронте, вернуться домой как новые вожаки и будут посажены рулить стадом. По аналогии того, как генерала Лебедева после чеченской войны хотели в президенты продвинуть.


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


Блоги@Mail.ru умер

Тихой сапою закрывается, точнее принудительно переносят все блоги в "моймир" на майру. Чем это грозит и как теперь их индексировать - ума не приложу. Уж лучше бы закрылись с концами и все тут. А пока системное сообщение выглядит следующим образом
С 23 декабря 2013 года остановлена возможность создавать новые посты и писать комментарии в Блоги@Mail.ru. С 3 марта 2014 года будет закрыт доступ ко всем страницам проекта Блоги@Mail.ru.

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


Рейтинг фильмов

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


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


Топ фейсбука русскоязычный

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

По случаю того, что т30п индексирует русскоязычный фб, я решил посмотреть, что же такого ценного есть в фейсбуке, что кто-то боится его потерять. И составил стандартный топ фейсбука http://www.t30p.ru/F с некоторыми фильтрами против спама. Как видим ничего интересного кроме котиков и перепостов либеральных СМИ там нет. То есть с уверенностью можно сказать, что социальная сеть успешно решает задачу недопущения коллективного общественного мнения в интернете.

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


Медиа как социальный сервис

Выяснилось, что не все понимают, что СМИ являются социальным сервисом. Да и вообще сочетание социальный сервис давно ассоциируется с бомжами и раздачей пищи или религией. Поэтому ниже немного общей теории на заметку. Всего у СМИ существует 6 основных функций. В книжках пишут, что их 7, но "Социализацию" и "воспитание" я объединяю, так как сегодня, когда мировоззрение человека формируется по принципу "веселый зомби", никакого воспитания уже нет и не надо. Издания, типа "наука для молодежи" - уже не читают. Я смело объединил эти две функции в одну - "социализация", которая вещает "делай как они", вот и все воспитание. Таким образом ниже у нас функции в колонках применительно к существующим СМИ.

Информирование Общественное мнение Социализация Развлекательная Объединение общества История современности
О чем это? Передача информации от власти к народу Передача информации от народа к власти Рассказать как надо жить (образы поведения) Убить свободное время индивида Сформировать круг общения человека (коммуникативно-интеграционная на территории распространения) Ленин говорил, что журналистика пишет историю современности.
Телевидение + , все работает - , очевидно не работает + , это образ дома2 + , футбол и прочее + , объединяются даже по принципу "несмотрения" телевизора - , есть видео-архивы, но обычно просто переснимают, то есть история не поднимается.
Газеты +, все они продались - , не работает ~ , слабо + , хорошо - , сомневаюсь, что еще бумага объединяет + , часто есть отсылки на газеты советского времени
Интернет-СМИ +, все они продались ~ , не работает + , да, в виде инструкций, обзоров. - , нет, не читают интернет новости ради развлечения + , люди часто обсуждают один и тот же новостной сайт. + , даже лента.вру запустила спец-проект по написанию истории современности.
Блоги, соц.сети ~ , слабо, есть проплаченные блогеры ~ , слабо, ведь редактора решают какой сюжет сделать новостью. + , других почитал и стал повторять. + , да. + , присутствие в определенной сети определяет классовость в жизни. - , никто не думает об истории
Топ блогосферы (автоматизированное СМИ) + , слабо, но так как людям нечего писать, то они пишут о том, что делает власть. + , что стало общественно-популярным, то и попадает в топ. ~ , слабо, но популярные темы учат других как становиться популярными. + , хорошо, развлекательное часто бывает популярным + , да - , нет, то что было в топе поза-позавчера уже никому не интересно.

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

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


Лена Миро купила еще 2000 подписчиков

Занятная история, жил был на Лиру простой журнал одной девочки, которая кроме всего прочего была популярной среди женской аудитории. Но потом бросила вести дневник. И его купили некто пропагандирующие здоровый образ жизни под брендом ЛеныМиро, просто переписав всех старых подписчиков, переименовав блог. То есть купив 2000 читателей к очередной копипасте. В теории такие выходки должны блокировать как денежные операции противоречащие правилам сервиса. Но не исключено, что блог был просто подарен. Вот что пишет сама владелица по ссылке выше:
Вести блог нет ни малейшего желания, ещё меньше на это времени, уж простите. В конце концов, ЖЖ рулит и доставляет значительно больше лулзлов. Ко мне тут постучались и попросили отдать свою лирушечку на благое дело – дело похудения и приведения девчачьх народных масс в красавиц. Я подумала: не, ну а чо? И отдала. Теперь этим блогом будет пользоваться Лена Миро, она же главный фитнес-блогер страны miss-tramell.

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


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


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


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

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

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


Про YAC2011

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

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

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


  • Новее
  • 1

Кто я?

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

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

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

Topbot at FeedsBurner