barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

четверг, 22 сентября 2016 г.

Msxml2.XMLHTTP: работа за проксёй в локальном скрипте

Итак, есть некий локальный JScript-скрипт, выполняемый на виндовой машине через cscript. В нем используется XHR-запрос, объект при этом создается следующим образом:
var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
При этом соединение с нужным ресурсом выполняется по https. 
Все было в порядке, пока скрипт не был перенесен на другую машину, где при попытке загрузить XML по старому URL-у вдруг стала падать ошибка:
msxml3.dll: Security certificate required to access this resource is invalid
Ладно, предположим, что-то не так с SSL-сертификатом, хотя раньше проблем с ним не было. Переходим на объект Msxml2.ServerXMLHTTP и отключаем валидацию сертификатов:
var xmlhttp = new ActiveXObject("Msxml2.ServerXMLHTTP");
xmlhttp.setOption(2, 13056);
(почему 2 и 13056 - см. https://msdn.microsoft.com/en-us/library/ms763811(v=VS.85).aspx). Проблема с сертификатом пропала, зато теперь получаем:
msxml3.dll: The operation timed out
Идем дальше. меняем объект на Msxml2.ServerXMLHTTP.6.0, поддерживающий установку таймаутов:
var xmlhttp = new ActiveXObject("Msxml2.ServerXMLHTTP.6.0");
xmlhttp.setTimeouts(60000, 60000, 60000, 60000);
xmlhttp.setOption(2, 13056);
Однако, проблема продолжает воспроизводиться, по прошествии минуты падает таймаут, хотя загружаемый ресурс 100% доступен и отвечает за время в пределах 10сек. И тут возникает мысль, что "проблемная" машина сидит за прокси-сервером, пробуем:
var xmlhttp = new ActiveXObject("Msxml2.ServerXMLHTTP.6.0");
xmlhttp.setTimeouts(60000, 60000, 60000, 60000);
xmlhttp.setOption(2, 13056);
xmlhttp.setProxy(2, '<proxyhost>:<proxyport>','');
xmlhttp.open('GET', 'http://myurl', false);
xmlhttp.setProxyCredentials('<proxy_user>', '<proxy_password>');
Вуаля, проблема решена.

четверг, 15 сентября 2016 г.

PostgreSQL: использование переменного интервала в запросах

Задача

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

Решение

Казалось бы, все просто:

CURRENT_TIMESTAMP - INTERVAL (N || ' hour')

Но не тут-то было, такое выражение вызывает ошибку. Приходится выкручиваться:

CURRENT_TIMESTAMP - (N::varchar || ' hour')::interval


IE: как побороть режим совместимости

Проблема

У пользователя в IE стоит галка "Display intranet sites in Compability View", из-за которой некий сайт во внутренней сетке отображается коряво. Нужно исправить ситуацию, не беспокоя конечного пользователя.

Решение

Если есть доступ к исходникам сайта, можно воспользоваться мета-тегом X-UA-Compatible, вставив его во все html-страницы:
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
Этот мета-тег превалирует над настройками совместимости браузера. Для того, чтобы тег работал, он должен идти в блоке <head> перед остальными элементами (исключение составляют <title> и другие мета-элементы). 
Другой вариант - воспользоваться аналогичным http-заголовком X-UA-Compatible, эффект будет тот же.