Архив рубрики: Информационные технологии

А как Вам метод, тело которого начинается с return?

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

Готов поиграть в игру: Кто сможет дать максимально подробное описание или комментарии к данному коду или переписать его максимально просто для человеческого прочтения? И сколько на это понадобится времени?

private List<BlankComposition> GetBlankInfo(SKDREntities db, Requisition inz, int deliveryType, long? languageId)
        {
            return db.RuleDescriptions
                .Where(rd => rd.OrganizationId == inz.ReqUnit && rd.IsActive)
                .ToList()
                .Where(rd => rd.DeliveryTypes.Split(',').Select(int.Parse).Contains(deliveryType))
                .DefaultIfEmpty()
                .SelectMany(or => db.RuleDescriptions
                    .Where(rd => rd.OrganizationId == inz.RequisitionOrg.OrgID && rd.IsActive)
                    .ToList()
                    .Where(rd => rd.DeliveryTypes.Split(',').Select(int.Parse).Contains(deliveryType)).DefaultIfEmpty(), (org, lab) => new { org, lab })
                .Select(rule => new[] { rule.org, rule.lab }.Where(r => r != null).ToList())
                .Select(rule => new
                    {
                        HeadHeight = rule.Select(r => r.Composition.HeaderHeight).FirstOrDefault(hh => hh != null) ?? "3cm",
                        FooterHeight = rule.Select(r => r.Composition.FooterHeight).FirstOrDefault(fh => fh != null) ?? "4.5cm",
                        DemographyDescriptionId = rule.Select(r => r.DemographyDescriptionId).FirstOrDefault(),
                        Suffix = rule.Select(r => r.Suffix).FirstOrDefault(),
                        Elements = rule
                                    .SelectMany(
                                        re => re.Composition.CompositionElements,
                                        (rd, element) => new { element, priority = rd == rule.First(), langPriority = element.LanguageId == languageId }
                                    )
                                    .GroupBy(g => g.element.ElementTypeId)
                                    .SelectMany(g => g
                                        .OrderByDescending(e => e.priority)
                                        .ThenByDescending(e => e.langPriority)
                                        .Take(1)
                                        .Select(e => e.element)
                                    )
                                    .Where(e => e.ElementId != null)
                                    .ToList()
                    }
                ).Select(item => new BlankComposition
                    {
                        HeaderHeight = item.HeadHeight,
                        FooterHeight = item.FooterHeight,
                        BlankElements = item.Elements.Select(e => new BlankElement
                        {
                            Width = e.Element.Width,
                            Height = e.Element.Height,
                            Left = e.Element.Left,
                            Top = e.Element.Top,
                            Image = e.Element.ImageId == null ? null : e.Element.Image.Data,
                            Text = e.Element.Text,
                            Placing = e.Placing
                        }).ToList(),
                        Demography = db.DemographyDescriptions
                            .Single(dd => dd.Id == item.DemographyDescriptionId)
                            .DemographyTables
                            .Select(dt => new DemographyInfo
                            {
                                Placing = dt.Placing,
                                Height = dt.Height,
                                Left = dt.Left,
                                Top = dt.Top,
                                Width = dt.Width,
                                Lines = DemographyFormatter.GetDemographyInfo(inz, dt.DemographyType.DemographyContents.OrderBy(o => o.SortOrder).ToList())
                            })
                            .ToList(),
                        Suffix = item.Suffix,
                        AddHyperlinks = item.Elements.Any(hy => hy.ElementTypeId == 6 && hy.ElementId != null)
                    }
                ).ToList();
        }

Если Вы нашли ошибку, пожалуйcта выделите ее и нажмите Shift + E или нажмите здесь чтобы информировать меня. Спасибо.

Цифровые показатели

Можно сказать «случайно» я решил посмотреть сколько и чего создалось с помощью инструментов разработанных нашей командой за время работы в OTTO Group Russia.

И понял что некоторые показатели весьма впечатляют, для таких небольших периодов.

Порой кажется что сделал что-то, оно работает и прекрасно. Пользователь либо счастлив, либо не счастлив, но этот показатель просто флаг — да/нет. Сложноисчеслимая штука.

А тут… Раскрывать пожалуй ничего не буду, надеюсь коллеги узнают все на ближайшей встрече ИТ департамента всей группы.

Больше всего мне нравится база данных размером в ~320 Гб со статистикой за год.

А вообще такой пересмотр статистики позитивная вещь, куча идей появилась.

Если Вы нашли ошибку, пожалуйcта выделите ее и нажмите Shift + E или нажмите здесь чтобы информировать меня. Спасибо.

CookIt

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

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

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

     На версии 2.0 мы не остановимся, уже сформирован Roadmap до версии 3.0 и безусловно в ней появится еще больше приятных возможностей и дополнений. Мы очень надеемся, что приложение станет приятным другом для всех любителей приготовить что-нибудь вкусненькое.

    Хотелось бы сказать большое спасибо людям использующим наше приложение, мы рады регулярному получению обратной связи от Вас, идеи и замечания оказываются очень полезными в дальнейшей разработке.  Еще больше мы рады комментариям в App Store с прекрасными оценками нашего продукта. Безусловно, это создает интерес двигаться дальше. В нескольких странах приложение стабильно находится в TOP 100 в своей категории, а периодически даже попадает в ТОП 15.

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

Если Вы нашли ошибку, пожалуйcта выделите ее и нажмите Shift + E или нажмите здесь чтобы информировать меня. Спасибо.

Программный продукт Azbuka

Последнее время что-то все больше и больше людей проявляют интерес к продукту под названием Azbuka, который был создан во время моей работы в группе кампаний Арсенал+.

Небольшой обзор продукта можно найти здесь. Этот обзор был создан еще в момент работы над первой версией продукта.

Разработчиками (читать авторами) данного программного продукта являются два человека: Александр Ярославов и Дмитрий Пелевин.

Сам же продукт зарегистрирован и принадлежит ООО «Арсенал+».

Это пожалуй самые частые вопросы, на которые мне приходится отвечать.

Если у кого-то есть вопросы по экспертизе в данной области — всегда пожалуйста, а вопросы касаемо непосредственно самого продукта прошу адресовать в департамент системной интеграции ООО «Арсенал+».

Если Вы нашли ошибку, пожалуйcта выделите ее и нажмите Shift + E или нажмите здесь чтобы информировать меня. Спасибо.

Мониторинг сеансов в LiveJournal

Пришло гениальное сообщение от сервиса LJ, примерно со следующим содержанием:

«Здравствуйте, kp0h

Кто-то вошел в ваш аккаунт ЖЖ с нового устройства. Информация о сеансе:

Страна: RU

Интернет провайдер: MTS OJSC

IP-адрес: ***.***.***.***

…»

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

http://www.livejournal.com/manage/logins.bml

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

Если Вы нашли ошибку, пожалуйcта выделите ее и нажмите Shift + E или нажмите здесь чтобы информировать меня. Спасибо.

Пришло время обновить Messenger до Skype!

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

Сообщение от команды разработчиков…

Читать далее

Если Вы нашли ошибку, пожалуйcта выделите ее и нажмите Shift + E или нажмите здесь чтобы информировать меня. Спасибо.

Windows Phone и тренировка мозга

Готова демоверсия приложения для тренировки памяти, фантазии и воображения.

Приложение готово для Windows Phone, в ближайшие дни я покажу его автору метода. Приложение во многом опирается на системоцелостную психологию, являющуюся фундаментом «метода Бронникова».

Надеюсь в скором времени после демонстрации приложение появится в Marketplace.

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

Если Вы нашли ошибку, пожалуйcта выделите ее и нажмите Shift + E или нажмите здесь чтобы информировать меня. Спасибо.

[CRM] Как получить все данные, если CRM 2011 имеет лимит 5000 записей на ответ

Приходится работать с все большим объемом данных, столкнулся с тем, что CRM имеет ограничение на получение данных через Fetch-запросы. 5000 записей. Многие наверное замечали, к примеру, что на гридах сущностей CRM, имеющих больше 5000 записей в поле количество под гридом обычно указано просто 5000+.

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

  1. Click Start, click Run, type regedit in the Open box, and then click OK.
  2. Locate and then select the following registry subkey:HKEY_LOCAL_MACHINE\Software\Microsoft\MSCRM
  3. On the Edit menu, point to New, and then click DWORD Value.
    image
  4. Type TurnOffFetchThrottling, and then press ENTER.
    image
  5. Right-click TurnOffFetchThrottling, and then click Modify.
    image
  6. Type a number other than 0 in the Value data box, and then click OK.
    imageimage
    Note Step 6 lets you retrieve the number of records specified in the Count attribute of your fetch statement.
  7. On the File menu, click Exit.
    image

Но это не правильный подход, т.к, во первых такое решение тормозит работу, во вторых не гарантирует что Вы таки получите все результаты.

А теперь по порядку — как стоит решать эту задачу:

Читать далее

Если Вы нашли ошибку, пожалуйcта выделите ее и нажмите Shift + E или нажмите здесь чтобы информировать меня. Спасибо.

[CRM] JavaScript в CRM 2011

Привычка полагаться на IntelliSense приводит к тому, что когда его нет, начинаешь забывать как делать какие-то простые вещи. До сих пор регулярно сталкиваюсь с тем, что для написания банальных действий с CRM 2011 из JavaScript открываю Google.

Поэтому немного полезной информации, чтобы больше не забывать:

Работа с полями

Во-первых, чтобы скрипт работал на форме его необходимо добавить в веб-ресурс и добавить этот веб-ресурс непосредственно на форму.

Получить значение текстового поля «Action Code»

Xrm.Page.data.entity.attributes.get("actioncode").getValue();

Сохранить значение «AC231» в текстовое поле «telephone»

Xrm.Page.data.entity.attributes.get("actioncode").setValue("AC231");

Получить значение пиклиста «type»

Xrm.Page.data.entity.attributes.get("type").getValue(); //Цифровое значение
Xrm.Page.data.entity.attributes.get("type").getText(); //Текстовое значение

«undefined» если значение не выбрано.

Установить значение 2 пиклиста «type»

Xrm.Page.data.entity.attributes.get("type").setValue(2);
Текстовое значение на листе будет выбрано автоматически.

Установить значение поля с датой «scheduled» на сегодня

var today = new Date();
Xrm.Page.data.entity.attributes.get("scheduled").setValue(today);

Узнать завтрашную дату можно так

var tomorrow = new Date();tomorrow.setDate(tomorrow.getDate() + 1);

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

Отключить (Disable) поле «name»

Xrm.Page.ui.controls.get("name").setDisabled(true);

Скрыть (Hide) поле «name»

Xrm.Page.ui.controls.get("name").setVisible(false);

Скрыть (Hide) секцию в табе

Xrm.Page.ui.tabs.get("tabname").sections.get("sectionname").setVisible(false);

Работа с формой

Сохранить форму

Xrm.Page.data.entity.save();

Сохранить и закрыть форму

Xrm.Page.data.entity.save("saveandclose");

Остановить сохранение формы
Вешаемся на событие формы OnSave.

function formOnSave(context)
{
  var shouldSave = true;
  if (shouldSave) {
    alert("Unable to save because of some reason or the other.");
    context.getEventArgs().preventDefault();
  }
}

При настройке события необходимо поставить галочку в поле «Pass execution context as first parameter».

Закрыть форму

Xrm.Page.ui.close();
Если пользователь вносил какие-либо изменения он увидит сообщение для подтверждения.

Тип формы
CRM предлагает следующие типы форм:

Create — 1, открыта форма для создания новой записи
Update — 2, открыта форма существующей записи
Read Only — 3, форма только на чтение
Disabled — 4, неактивная форма
Bulk Edit — 6, форма массового редактирования.

Xrm.Page.ui.getFormType();

Получить GUID текущей записи

Xrm.Page.data.entity.getId();

Получить GUID текущего пользователя

Xrm.Page.context.getUserId();

Получить LCID текущего пользователя и организации

Xrm.Page.context.getUserLcid(); //For User
Xrm.Page.context.getOrgLcid(); //For Organization

Список LCID на MSDN здесь.

Получить URL сервера CRM

Xrm.Page.context.getServerUrl();

Лукапы

Получить GUID значение лукапа «accountid»

Xrm.Page.data.entity.attributes.get("accountid").getValue()[0].id;

Получить текстовое значение лукапа «accountid»

Xrm.Page.data.entity.attributes.get("accountid").getValue()[0].name;

Открыть диалоговое окно
В CRM 2011 есть обертка для window.showModalDialog(), функция называется openStdDlg().

openStdDlg(sPath, oArgs, iWidth, iHeight, bResizable, bModeless, sCustomWinParams);

где:
sPath — ссылка на окно,
oArgs — объект с параметрами,
iWidth — ширина окна,
iHeight — высота окна,
bResizable — можно ли изменять размер окна,
bModeless — ,
sCustomWinParams — пользовательские параметры, передаваемые в окно.

Открыть форму сущности
Следующий пример открывает форму существующей сущности incident с GUID = 47c2bb7b-ba62-4afb-9b10-1a24c7a2799e в новом окне.

window.open(Xrm.Page.context.getServerUrl() +
"/main.aspx?etn=incident&pagetype=entityrecord&id=" +
encodeURIComponent("{47c2bb7b-ba62-4afb-9b10-1a24c7a2799e}"),
"_blank",
"location=no,menubar=no,status=no,toolbar=no",
false);

На мой взгляд стоит использовать функции, появившиеся в 8 Rollup, но в специфичных случаях приходится использовать стандартные.

Обновить состояние рибон

Xrm.Page.ui.refreshRibbon();

Если Вы нашли ошибку, пожалуйcта выделите ее и нажмите Shift + E или нажмите здесь чтобы информировать меня. Спасибо.

[CRM] Проект для Бухгалтерской компании

Начали работу над кастомизацией CRM для компании предоставляющей бухгалтерские услуги. Интересно поработать в новой команде и посмотреть как мы сработаемся.

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

P.S> Какой-то ад на хостинге parking.ru слишком медленно работают базы данных, постараюсь в ближайшие выходные подобрать достойную замену. Мне не нравится когда я должен ждать того, что должно работать за доли секунды.

Если Вы нашли ошибку, пожалуйcта выделите ее и нажмите Shift + E или нажмите здесь чтобы информировать меня. Спасибо.