Metrika

29 декабря 2012 г.

Unity-клиент и IIS

Если вы разместите HTML страницу и Unity приложение, которое подгружается в эту страницу, в IIS, то скорее всего после загрузки HTML страницы, Unity-плеер скажет, что не может загрузить приложение: Failed to load data file.

Для того, что бы заработало, надо в IIS прописать MIME-type для расширения .unity3d.






Photon Server и Cross Domain Policy

Речь пойдет о соединении клиентом (в моем случае Unity-клиент встроенный в Web-страницу) по TCP сокету к Photon серверу, стоящему на машине под управлением Windows Server 2008.

Все привыкли, что кросс-доменная политика сервера описывается в файле crossdomain.xml, но в случае с сервером Photon, когда соединение происходит через сокет, будет использоваться файл C:\Photon\deploy\Policy\assets\socket-policy.xml


По-умолчанию, он будет позволять соединения с любых доменов на необходимые порты:


<cross-domain-policy>
      <allow-access-from domain="*" to-ports="5055,5056,5057,4530,4531,4532,9090" />
</cross-domain-policy>

Так же, когда вы запускаете PhotonControl и далее выполняете Install Service, Photon создаст в фаерволе необходимую запись, что бы соединения проходили.

По-умолчанию, Photon ждет соединения по TCP на порту 4530, а по UDP на порту 5055. Но кроссдоменная политика проверяется на TCP порту 843. Правило фаервола позволяет это соединение, но в моем случае, я не создал правило port-mapping на порт 843, поэтому соединение телнетом на порт 4530 проходили, но Unity-клиент не запускался.

17 ноября 2012 г.

IIS 7.5: Сложности в настройке компрессии GZip

Столкнулся с такой проблемой. При переносе WEB-сервера на другую машину (Windows Server 2008 R2) перестала работать компрессия динамических страниц, хотя в Web.config все было прописано как и раньше:


<httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files">
             <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" />
             <dynamicTypes>
                 <add mimeType="text/*" enabled="true" />
             </dynamicTypes>
</httpCompression>

Оказалось, что при установке на сервере роли Web-сервера, я не поставил сервис Dynamic Content Compression:

Ответ нашел тут: http://stackoverflow.com/questions/3591155/iis-7-5-asp-net-4-gzip-compression

6 ноября 2012 г.

JavaScript: Форматирование числа - добавление пробелов

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

function addCommas(nStr)
{
  nStr += '';
  x = nStr.split('.');
  x1 = x[0];
  x2 = x.length > 1 ? '.' + x[1] : '';
  var rgx = /(\d+)(\d{3})/;
  while (rgx.test(x1)) {
    x1 = x1.replace(rgx, '$1' + ' ' + '$2');
  }
  return x1 + x2;
}

Взял тут:

27 марта 2012 г.

OLAP: Как обращаться к кубам через OLE DB

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

Я использовал подключение к кубам через OLE DB. Для этого понадобиться драйвер MSOLAP (Microsoft OLE DB Provider for Analysis Services 10.0), на клиенте у меня этого драйвера не было, поэтому все запросы шли через SQL Server. Посмотреть список установленых OLE DB провайдеров в SQL Server можно хранимой процедурой  master..xp_enum_oledb_providers

Варинат 1 (через OPENROWSET):


SELECT
          "[DimServices].[Name].[Name].[MEMBER_CAPTION]" service,
          "[Measures].[CountServiceAccounts]" regs
FROM OPENROWSET
(
          'MSOLAP',
          'Provide=MSOLAP;Integrated Security=SSPI;Persist Security Info=False;Data Source=127.0.0.1;Initial Catalog=cubeRegs;',
          'select {[Measures].[CountServiceAccounts]} on 0, { [DimServices].[Name].Children } on 1 from                            [Регистрации]'
)

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

Проблема с OPENROWSET в том, что эту команду не может исполнять пользователь с ограниченными правами. Если не только админ должен выполнять запросы к кубам, то нужно использовать OPENQUERY.

Вариант 2 (OPENQUERY):


Сначала надо создать линкованный сервер:

EXEC master.dbo.sp_addlinkedserver @server = '127.0.0.1', @srvproduct='MSOLAP', @provider='MSOLAP', @datasrc='127.0.0.1', @catalog='cubeRegs'

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

EXEC sp_addlinkedsrvlogin '127.0.0.1', 'false', 'db_user', 'olap_user', 'olap_user_psw'

db_user - пользователь, который будет обращаться к линкованному серверу;
olap_user - пользователь, который имеет прова доступа к кубу
olap_user_psw - пароль  olap_user

Теперь можно обращаться к кубам:

SELECT
             "[DimServices].[Name].[Name].[MEMBER_CAPTION]" service,
             "[Measures].[CountServiceAccounts]" regs
FROM
OPENQUERY
(
          [127.0.0.1],
          'select {[Measures].[CountServiceAccounts]} on 0, { [DimServices].[Name].Children } on 1 from [Регистрации]'
)

Отмечу так же, что как в первом, так и во втором случае запрос вернет колонки типа ntext, с которым работать не очень удобно, поэтому надо прописать преобразование в нужные типы:

SELECT
           CAST("[DimServices].[Name].[Name].[MEMBER_CAPTION]" as varchar) service,
           CAST(CAST("[Measures].[CountServiceAccounts]" as varchar) as int) regs
FROM
OPENQUERY
(
           [127.0.0.1],
         'select {[Measures].[CountServiceAccounts]} on 0, { [DimServices].[Name].Children } on 1 from [Регистрации]'
)

Если нужно выполнить XMLA запрос

 

XMLA запросы нужны для управления кубами, например процессинг куба, удаление партиций, создание партиций. Ни OPENQUERY, ни OPENROWSET не будут выполнять запрос XMLA, а будут выдавать ошибку, т.к. они не могут принять запрос в формате XML.
Для того, что бы выполнить запрос XMLA нужно создать линкованный сервер (как для OPENQUERY), разрешить на нем RPC:

EXEC sp_serveroption @server='127.0.0.1', @optname='rpc', @optvalue='TRUE'
EXEC sp_serveroption @server='127.0.0.1', @optname='rpc out', @optvalue='TRUE'

И выполнить следующую команду:

EXEC ('.. Some XMLA Query ..') at [127.0.0.1]

1 марта 2012 г.

Python: преобразование строки в дату

Сейчас много времени провел в поисках пути преобразования в Python строки, где дата представлена в ISO формате: "2010-05-14T15:33:04.287+02:00" в объект datetime

Много гуглил, в итоге нашел ответ вот здесь: http://www.seehuhn.de/pages/pdate , толковая дока, много разнообразных примеров на тему преобразования из разных типов в дату.

В моем случае подошла либа dateutil:
import dateutil.parser

dt = dateutil.parser.parse("2010-05-14T15:33:04.287+02:00")

Пропал значок "Безопасное извлечение устройства" в Windows

Столкнулся с такой проблемой - в трее пропал значок "Безопасное извлечение устройства". Решение нашел такое - Пуск -> Выполнить и туда пишем rundll32 shell32.dll,Control_RunDLL hotplug.dll