воскресенье, 28 сентября 2014 г.

Битрикс: не работает сайт из-за кеша

Ситуация: без видимых причин перестал открываться сайт на битриксе. Выдает пустой экран.

В этот раз помогла служба поддержки хостинга.

Они удалили весь кеш:
Внутри папки
http/bitrix/ 
удалить папки
cache
managed_cache
stack_cache 

среда, 17 сентября 2014 г.

MS SQL использование GUID как первичных ключей (Primary key)

Проблема

В двух словах: планирую новый проект на MS SQL
планируется распределенная структура (несколько баз)
соовтетсвенно в очередной раз возник вопрос: какими должны быть ключевые поля
Int или GUID
(предметно-зависимые отбросил сразу, т.к. на практике ни к чему хорошему не приводило)

распределенная структура располагает с GUID-ключам
но в общем случае при использовании GUID  в лоб появляеются проблемы с производительностью.

Обзор "лучших практик" привел к решению
Последовательные или комбинированные (COMB) гуиды
COMB от NHibernate
или на уровне БД - NEWSEQUENTIALID

все ссылки по тексту ниже.

Разделил их на 4 раздела

1. Базовые знания
2. Исследование вопроса GUID-ов
3. Варианты решений
4. (факультатив) связь с Entity Framework

1. Базовая подготовка по MS SQL / Guid


GUID - вики статья
(вдруг кто не знает)
http://ru.wikipedia.org/wiki/GUID


Описание типа данных uniqueidentifier в MS SQL
Использование данных uniqueidentifier
http://technet.microsoft.com/ru-ru/library/ms190215(v=sql.105).aspx

Функция NEWSEQUENTIALID (Transact-SQL)
описание функции в MS SQL
http://msdn.microsoft.com/ru-ru/library/ms189786.aspx

UuidCreateSequential function
http://msdn.microsoft.com/en-us/library/aa379322(VS.85).aspx

2. Статьи очерчивающие проблемы использвания GUID'ов для первичных ключей


Хорошая статья с замерами
GUID vs INT Debate
http://blogs.msdn.com/b/sqlserverfaq/archive/2010/05/27/guid-vs-int-debate.aspx

Простенькая статья с замерами
Целочисленные, символьные и GUID-ключи в MS SQL
http://www.arbinada.com/main/node/38

Обсуждение отличий в скорости работы обычных гуидов и последовательных
What are the performance improvement of Sequential Guid over standard Guid?
http://stackoverflow.com/questions/170346/what-are-the-performance-improvement-of-sequential-guid-over-standard-guid/170363#170363

Статья отценивающая за и проив гуидов как первичных ключей
есть расчеты и самодельная генерация комбинированных гуидов на стооне сервера.
в двух словах: автор - за комбогуиды
The Cost of GUIDs as Primary Keys
http://www.informit.com/articles/article.aspx?p=25862

Еще статья оценивающая, хорошо ли брать гуиды в качестве первичных ключей
SQL Server: Is it OK to use a uniqueidentifier (GUID) as a Primary Key?
http://mitch-wheat.blogspot.com.au/2011/08/sql-server-is-it-ok-to-use.html

еще обсуждение на Stackoverflow
Про издержки в производительности при использовании гуидов
What are the performance improvement of Sequential Guid over standard Guid?
http://stackoverflow.com/questions/170346/what-are-the-performance-improvement-of-sequential-guid-over-standard-guid/170363#170363

3. Статьи с вариантами решения

Это решение взял за основу
CombGuid. Генерация “дружественных” к SQL серверам значений Guid в .net приложениях
пример самостоятельной генерации (тут логика взята из библиотеки Magnum)
http://habrahabr.ru/post/214667/

Собственно NHibernate'овская реализация Гуидов
(по нему сделано много комбовских реализаций)
https://github.com/nhibernate/nhibernate-core/blob/master/src/NHibernate/Id/GuidCombGenerator.cs

Хорошая статья - чуть не взял её за основу
но склонился к NHibernate'овской реализации.
она учитывает 2 аспекта
1. использование функции uuidcreatesequential
2. превращение функции с SQL-server-совместимый формат
http://www.shirmanov.com/2010/05/generating-newsequentialid-compatible.html
Generating NewSequentialID compatible Sequential Guids in C#

обсуждение на stackoverflow
Ищут .NET эквивалент для newsequentialid
Is there a .NET equalent to SQL Servers newsequentialid()
http://stackoverflow.com/questions/211498/is-there-a-net-equalent-to-sql-servers-newsequentialid
тут дали ссылку на PInvoke.net (см. ниже)
но еще есть пример реализации COMB от NHibernate

pinvoke.net
пример адаптации для Net Windows функции uuidcreatesequential (rpcrt4)
http://www.pinvoke.net/default.aspx/rpcrt4.uuidcreatesequential
это годный рабочий пример, но не уверен в дружественности сгенерированных гуидов к MS SQL

еще пример
по сути дублирует код с pinvoke.net
http://www.csharpque.com/2012/06/generating-sequential-guid.html

Немного про взаимодействие с EF


Using sequential guids as identifiers in Entity Framework
http://bartwullems.blogspot.com/2013/10/using-sequential-guids-as-identifiers.html
тут описаны 2 варианта
1. генерация гуида через скл-сервер
2. ссылка на нхибернейтовсую реализацию Comb

Статьи по теме

Пример создания последовательного Guid в базе
MS SQL: Создание нового последовательного Guid


пятница, 12 сентября 2014 г.

FastReport запуск дизайнера в рантайме для ускорения отладки (FastReport Run Designer in Runtime)

Окружение

Delphi 7, FastReport 4

Ситуация

Работаю со сложным проектом и сложными печатными формами (отчетами).
В какой-то момент понял, что при разработке макетов отчетов выполняю по кругу такие действия:
1. правка в дизайн тайме
2. проверка в рантайме

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

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

Что захотелось сделать

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

По ходу решения задачи нашел 2 решения.


Решение 0. Самое простое

Тут идея проста как 3 копейки: нужно выполнить команду.

Report.DesignReport()

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

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

Решение 1. Через событие OnPreview

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

Суть решения

1. делаю вспомогательный юнит (модуль)

-------------------------------------

unit uUtilsFr;

interface
uses
  frxClass, frxPreview;

type
   TFastReportDesignReportButtonOnClickStubClass = class(TObject)
  public
    procedure OnClick(Sender: TObject);
  end;


procedure FastReportAddDesignButtonToPreviewForm(AReport: TfrxReport);

implementation
uses
  Buttons;

var
  lfxDesignReportButtonOnClickStub: TFastReportDesignReportButtonOnClickStubClass;

{ TFastReportDesignReportButtonOnClickStubClass }

procedure FastReportAddDesignButtonToPreviewForm(AReport: TfrxReport);
var
  lfrxPreviewForm: TfrxPreviewForm;
  lbtnDesign: TSpeedButton;
begin
  lfrxPreviewForm := TfrxPreviewForm(AReport.PreviewForm);

  lbtnDesign := TSpeedButton.Create(lfrxPreviewForm);
  lbtnDesign.OnClick := lfxDesignReportButtonOnClickStub.OnClick;
  lbtnDesign.Caption := 'Дизайнер';
  lbtnDesign.Width:= 66;

  lfrxPreviewForm.ToolBar.InsertControl(lbtnDesign);
end;

procedure TFastReportDesignReportButtonOnClickStubClass.OnClick(
  Sender: TObject);
begin
  TfrxPreviewForm(TSpeedButton(Sender).Owner).Report.DesignReport;
end;

initialization
  lfxDesignReportButtonOnClickStub := TFastReportDesignReportButtonOnClickStubClass.Create;

finalization
  lfxDesignReportButtonOnClickStub.Free;
end.

-------------------------------------

2. В компоненте отчета в событие OnPreview добавляю строчку

FastReportAddDesignButtonToPreviewForm(TfrxReport(sender));

(тут по сути вызываю функцию из созданного в пункте 1 модуля)

Что получается на выходе
В окне превью отчета появляется кнопка "Дизайнер", которая открывает дизайнер отчета.

Решение 2. Через собственный компонент Экспорта

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

Идея решения: делаю свой фиктивный компонент экспорта отчетов. Суть экспорта: открытие дизайнера.

Сложность решения: нужен будет свой компонент (то есть я предполагаю, что понятия создания/регистрации компонентов в Delphi вам знакомы).

Суть решения

1. Делаем компонент


unit ufrxExportDesign;

interface

uses
  Classes, Controls, Dialogs, frxClass;

type
  TfrxExportDesign = class(TfrxCustomExportFilter)
  public
    constructor Create(AOwner: TComponent); override;

    class function GetDescription: String; override;
    function ShowModal: TModalResult; override;


  end;

implementation

{ TfrxPDFExport }

constructor TfrxExportDesign.Create(AOwner: TComponent);
begin
  inherited;
  ShowDialog:= true;
end;

class function TfrxExportDesign.GetDescription: String;
begin
  Result := 'Run Designer';
end;

function TfrxExportDesign.ShowModal: TModalResult;
begin
  Report.DesignReport();
  Result:= mrCancel;
end;

end.



2. регистрируем компонент. 

Тут код я не привожу, т.к. это будет зависеть от вашей инфраструктуры проектов

3. Кидаем компонент на форму с отчетами
(по сути достаточно одного компонента на приложение)

Что получается на выходе 
в подменю "Экспорт" окна предпросмотра отчета у вас появятся кнопка "Run Designer"

Примечание

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

Самое главное: Как сохранить изменения

После того, как в рантайме вас все устраивает, в окне дизайнера вызовите команду "Соханить в файл".
Потом в дизайн-тайме открываете дизайнер этого же отчета и загружаете из файла.
В самом простом варианте этого достаточно

вторник, 9 сентября 2014 г.

JavaScript-Wizard (Мастер) по возможности с BootStrap стилизацией

Задача

внедрить в сайт визард, по возможности поддерживающий Bootstrap


Исследование темы

С выбором пока не определился. Все собранные материалы привел ниже.
Вопросы/пожелания/предложения принимаются в комментариях.

Пока понравился больше всего
jQuery Steps (у него еще и таблица есть)
http://www.jquery-steps.com/Examples#basic-form


Вроде тоже неплохо
Twitter Bootstrap Wizard Plugin
http://vadimg.com/twitter-bootstrap-wizard-example/


Это визард на основе аккордеона
Accordion Wizard for Bootstrap 3
http://sathomas.me/acc-wizard/#prerequisites


Неплохо, но по умолчанию не бутстраповский
Smart Wizard 3
http://mstratman.github.io/jQuery-Smart-Wizard/index.htm


понедельник, 8 сентября 2014 г.

Наследование в MS SQL Server с использованием Entity Framework (EF)

Ситуация 

Созреваю на применение наследования в базе данных. Работаю с MS SQL Server 2008 (планирую переход на 2012)

Моя мотивация: 

в системе есть несколько типов документов, а будет еще больше.
И у всех документов нужны типовые реквизиты:

  • состояние (проведен/не проведен), 
  • дата создания, 
  • автор, 
  • дата изменения, 
  • последний изменивший,
  • пометка удаления


Дублировать эти поля во всех типах документов очень не хочется.
Хотелось бы создать таблицу "Базовый документ" со всеми этими служебными полями и остальные документы наследовать от неё.

Изучение темы

К сожалению, на нашел в MS SQL каких-нибудь стандартных механизмов. Похоже, придется все делать "ручками".

Похоже выбирать буду метод TPT (Table Per Type)

Все материалы привожу ниже

Материалы по теме

Статья про реализацию наследования в БД
Implementing Table Inheritance in SQL Server
тут про бд описано нормально, но не освещено как с этим "взлетать": а именно, как работать в прикладном решении
http://www.sqlteam.com/article/implementing-table-inheritance-in-sql-server

Несколько веток на Stackoverflow
How can you represent inheritance in a database?
http://stackoverflow.com/questions/3579079/how-can-you-represent-inheritance-in-a-database

Table “Inheritance” in SQL Server
http://stackoverflow.com/questions/529256/table-inheritance-in-sql-server


Статью по связке с Entity Framework
Implementing Inheritance with the Entity Framework 6 in an ASP.NET MVC 5 Application (11 of 12)
http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-inheritance-with-the-entity-framework-in-an-asp-net-mvc-application


Inheritance in the Entity Framework
http://blogs.msdn.com/b/adonet/archive/2007/03/15/inheritance-in-the-entity-framework.aspx

EF Designer TPT Inheritance
http://msdn.microsoft.com/en-us/data/jj618293.aspx

EF Designer TPH Inheritance
http://msdn.microsoft.com/en-us/data/jj618292.aspx