Промотирую. Телик на основе торрентов.

Posted by Olegas on Ноябрь 12, 2009
IT / Нет комментариев

Быстрая доставка видео-контента через торенты.
Презентация здесь

Кратко:

  • Есть потоки RSS понимаемые торрент-клиентами и всякими "телевизорами" типа Miro
  • Добавляем поток – получаем свежие обновления – телепередачи, видео-клипы и т.п.
  • Еще описание процесса здесь

Сейчас мы доставляем:

  1. Тупичок Гоблина
  2. Новости НТВ
  3. Локо-ТВ
  4. CNN In Case You Missed It
  5. Discovery channel

Локо-ТВ эксклюзивно, больше нигде не затянуть. Только на официальном сайте смотреть.

Виджеты – 500 установок

Posted by Olegas on Ноябрь 03, 2009
IT / Нет комментариев

Виджеты – 500 установок.

А еще их теперь можно ставить к себе на сайт.

Кстати, один такой виджет можно увидеть в правой колонке в самом низу.

SharePoint: получаем SPListItem из SPList – очень быстро и очень медленно

Posted by Olegas on Октябрь 11, 2009
IT / Нет комментариев

При профилировании веб-части для SharePoint с удивлением обнаружил узкое место в SPListItemCollection.this[Guid]… Получение элемента списка по Guid’у, фактически первичному ключу, занимало уйму времени на большой коллекции.
Происходило это так

var uniqId = new Guid(/* get GUID somehow */);
SPList list = /* get list somehow */

SPListItem anItem = list.Items[uniqId];

Как есть еще методы получения элемента из списка?
Есть SPList.GetItemByUniqueId(Guid uniqueId) – при использовании не возникает такой задержки. Почему?

Воспользуемся рефлектором, и пореверсинженерим шарепонит…

Вот что мы видим в SPListItemCollection.this[Guid]:

public SPListItem this[Guid uniqueId]
{
  get
  {
    this.EnsureListItemsData();
    this.EnsureFieldMap();
    int iIndex = 0;
    int columnNumber = this.m_mapFields.GetColumnNumber("UniqueId");
    string str2 = uniqueId.ToString("B").ToLower();
    while (true)
    {
      if (iIndex >= this.m_iRowCount)
      {
        throw new ArgumentException();
      }
      string str = ((string) this.m_arrItemsData[columnNumber, iIndex]).ToLower();
      int num3 = SPUtility.StsBinaryCompareIndexOf(str, ";#");
      if ((num3 > 0) && (str.Substring(num3 + 2) == str2))
      {
        this.EnsureListItemIsValid(iIndex);
        if (this.m_iColection == null)
        {
          return new SPListItem(this, iIndex);
        }
        return this.m_iColection.ItemFactory(iIndex);
      }
      iIndex++;
    }
  }
}

Содержимое всей коллекции перебирается элемент за элементом, для каждого элемента вычисляется совпадение GUID’а с заданным. Чем больше коллекция – тем дольше работаем.

А теперь GetItemByUniqueId:

public SPListItem GetItemByUniqueId(Guid uniqueId)
{
  SPQuery query = new SPQuery();
  query.Query = "" + uniqueId.ToString("B") + "";
  query.ViewAttributes = "Scope=\"RecursiveAll\" ModerationType=\"Moderator\"";
  query.MeetingInstanceId = -2;
  query.QueryOpt = SPQuery.SPQueryOpt.None | SPQuery.SPQueryOpt.UniqueId;
  SPListItemCollection items = this.GetItems(query);
  if (items.Count != 0)
  {
    return items[0];
  }
  while (!(this.ID == this.Lists.Web.UserInfoListId))
  {
    throw new ArgumentException();
  }
  throw new ArgumentException(SPResource.GetString("CannotFindUser", new object[0]));
}

Здесь, используя SPQuery, получаем непосредственно саму запись без перебора коллекции.

Вывод: на больших списках пользоваться SPList.Items[Guid] – долго, непроизводительно. Лучше предпочесть SPList.getItemByUniqueId(Guid);

_________
Текст подготовлен в ХабраРедакторе

UPD: Спасибо хаброюзеру vladem – полезная линка на тематический KB – http://msdn.microsoft.com/en-us/library/bb687949.aspx

Тэги: , ,

Обновление коктейльного сайта

Posted by Olegas on Август 20, 2009
Без рубрики / Нет комментариев

Теперь подбирать коктейли стало удобнее (ну я надеюсь =) ).
Можно добавлять только совместимые с ранее добавленными ингредиенты, появились сортировки по крепости напитка и сложности приготовления.

Недавние проекты

Posted by Olegas on Август 02, 2009
IT / Нет комментариев
  • cocktails.elifantiev.ru – подбор коктейлей по имеющимся ингредиентам на основе базы Яндекса. Пост на Хабре
  • roadcams.elifantiev.ru – дорожные камеры г. Ярославля, по аналогии с последними нововведениями на Яндекс.Пробках. Видео от ТензорТелеком.

Плагин для кэширования селекторов в jQuery

Posted by Olegas on Июнь 29, 2009
IT / Нет комментариев

Простой плагин для jQuery, позволяющий закэшировать работу селекторов.
По наводке tenshi в камментах к http://olegas.habrahabr.ru/blog/63119/

(function($) {
  var selectorCache = [];
  $.cache = {
    get : function(selector) {
      return selectorCache[selector] || (selectorCache[selector] = $(selector));
    },
    clear: function(selector) {
      selector == null ? selectorCache = [] : selectorCache[selector] = null;
    }
  }
})(jQuery);

Использовать примерно так:

// Before
$('#some .css .selector').some().action();

// After
$.cache.get('#some .css .selector').some().action();

Тэги: ,

C#-like cобытия для PHP. Reflection, closures…

Posted by Olegas on Июнь 27, 2009
IT / Нет комментариев

Задача – сделать на PHP эвенты а-ля C# т.е. произвольный объект может генерировать события. Другие объекты могут на эти события подписываться непосредственно у экземпляра генерирующего объекта.
Читать далее…

Тэги: , ,

Оптимизация с помощью замыканий.

Posted by Olegas on Июнь 26, 2009
IT / Нет комментариев

Дано – раз в секунду дергается AJAX’ом скрипт, в нем несколько вызовов одной функции (назовем ее updater) с разными аргументами. Функция в соответствии с аргументами апдейтит некоторый набор DOM-элементов (меняет контент, скрывает, показывает) на текущей странице. Используется jQuery, визэффекты и т.п. Т.е. на клиента приходит примерно такой код…

updater('id1', 10, 20);
updater('id33', 11, 22);
updater('id181', 102, 27);

Проблема – после увеличения количества вызываемых функций (увеличилось количество типовых блоков) все жутко тормозит – много времени уходит на jQuery, на выбор DOM-элементов по селекторам.

Требуется по-возможности быстро и безболезненно, не меняя верстку и не отказываясь от jQuery оптимизировать процесс.
Читать далее…

Тэги: , ,

Coming soon…

Posted by Olegas on Июнь 26, 2009
IT / Нет комментариев
  • PHPReflector – что такое, с чем и как есть, а с чем не есть;
  • События в PHP – используем Reflection API, callback и замыкания;
  • Замыкания как средство оптимизации.

Cars & Girls. MIMS 2008

Posted by Olegas on Сентябрь 01, 2008
Авто, Фото / Нет комментариев



Первый раз ездил на автомобильную выставку =) Обошел все павиллионы, посидел в машинках.

Читать далее…