UNPIVOT просто все столбцы в строчки

select * from
  (select * from (values(0,1,1,1,4), (5,6,6,6,9)) t (id1, id2, id3, id4, id5))t
   unpivot (value for columnName in (id1, id2, id3, id4, id5)) ttt
value	columnName
0	id1
1	id2
1	id3
1	id4
4	id5
5	id1
6	id2
6	id3
6	id4
9	id5

IE and cursor and pseudo element, detect click event on pseudo-element

Отображаем курсор над псевдо элементом, как обычно у всех, все хорошо, в ИЕ не работает.
IE :-(
IE :-)
Для ИЕ используем пустой спан как контейнер.
<div id="test1" class="test">IE -(</div>
<div id="test2" class="test">IE -)<span></span></div>
И уже на него
#test2 span {
 cursor: pointer;
}
Ну и тут же тема, как ловить события от псевдоэлемента, имеем три варианта:
1) воспользуемся CSS свойством pointer-events, но тут ограничение, поддержка только в современных браузерах, так и сделано для первого примера
2) обернуть реальным элементом, тема для второго варианта
3) еще можно контролировать координаты точки клика, как-то так
if (e.offsetX > e.target.clientWidth) {

text-overflow: ellipsis и иже сним

Забью свой костыль в виде аналога эффекта получаемого с помощью свойства text-overflow: ellipsis.
В моем случае задача немного сложнее, текст не умещался совсем не много, не больше чем на 50%, потому нужно было его отобразить при наведении курсора.
Все очень легко, на помощь пришли, псевдокласс :hover и свойство direction: rtl. Все бы ничего, Firefox, Chrome, Opera, все отлично, IE приплыли.
Безымянный Ну раз уж, придется задействовать JavaScript, значит чуточку добавим требований, текст не будет просто переключаться с отображения, то с начала, то с конца, пусть он плавно прокручивается, тут и ограничение в 50% снимется.
Сляпал плагин, малютка, меньше сотни строк.

А как работает твой браузер?
Раз, два, три, четыре, пять, вышел зайчик погулять, заинька вышел… Вдруг охотник выбегает, прямо в зайчика стреляет, пиф-паф, ой-ой-ой, умирает зайчик мой, привезли его домой, оказался он живой
Живой пример
Раз, два, три, четыре, пять, вышел зайчик погулять, заинька вышел… Вдруг охотник выбегает, прямо в зайчика стреляет, пиф-паф, ой-ой-ой, умирает зайчик мой, привезли его домой, оказался он живой
Есть нюанс в зависимости от шрифта могут «уехать» точки, нужно добавить некую поправку, но пока править не стал, в моем случае все и так работало.

Use jQuery .on and hover

метод hover() и псевдособытие «hover» разные вещи, тем более, что hover event support in On() was deprecated in jQuery 1.8, and removed in jQuery 1.9

используем два события mouseenter и mouseleave, в таком кратком виде

jQuery(function($) {
    // имитируем подгрузку аяксом
    $('#test').append( Array(6).join('<div></div>') );

    $('#test').on({
      mouseenter: function () {
        $(this).text( $(this).index() + 1 );
      },
      mouseleave: function () {
        setTimeout( $.proxy( function(){$(this).text('')}, this ), 350 );
      }
    }, 'div');
}(jQuery));

HTML5 Offline Web

Попробовал сервис-воркеры(Service Worker API), аналог прокси-сервера, находящегося между веб-приложением, браузером и сетью.
На момент написания спецификация в статусе рабочего черновика, поддержка в Firefox, Chrome, Opera.
Два ограничения необходимо использовать https и правильно определиться с областью видимости (максимальная видимость сервис-воркера равна его location, потому в моем случае, в случае с друпалом, сервис-воркер пришлось поднять из каталога шаблона).
Для проверки работы, отключаем инет, перегружаем страничку, играем.
Можно было бы прикрутить еще и Application Cache API для IE и Safari, но технология удалена из веб-стандартов, так что…

Simple filter table jQuery plugin

Понадобился простой фильтр в табличке по значениям с «памятью» все сессий, сваял jQuery плагин с хранением данных в локальном хранилище (localStorage).
NИДМЭСДоговорКварталКомментарийСостояние
1 58 МЭС Центра 30-2012 от 18.10.2012 IV 2016 Декабрь 2016 Формирование
2 57 МЭС Северо-Запада 30-2012 от 18.10.2012 IV 2016 Декабрь 2016 Формирование
3 56 МЭС Волги 30-2012 от 18.10.2012 IV 2016 Декабрь 2016 Формирование
4 55 МЭС Урала 30-2012 от 18.10.2012 IV 2016 Декабрь 2016 Формирование
5 54 МЭС Западной Сибири 30-2012 от 18.10.2012 IV 2016 Декабрь 2016 Формирование
6 53 МЭС Сибири 30-2012 от 18.10.2012 IV 2016 Декабрь 2016 Формирование
7 52 МЭС Востока 30-2012 от 18.10.2012 IV 2016 Декабрь 2016 Формирование
8 51 МЭС Центра 30-2012 от 18.10.2012 III 2016 Формирование
9 50 МЭС Северо-Запада 30-2012 от 18.10.2012 IV 2015 Не подлежит закрытию Формирование
10 49 МЭС Волги 30-2012 от 18.10.2012 IV 2015 Не подлежит закрытию Формирование
11 48 МЭС Востока 30-2012 от 18.10.2012 IV 2016 Октябрь 2016 Утвержден
12 47 МЭС Урала 30-2012 от 18.10.2012 IV 2016 Октябрь 2016 Утвержден
13 46 МЭС Западной Сибири 30-2012 от 18.10.2012 IV 2016 Октябрь 2016 Утвержден
14 45 МЭС Востока 30-2012 от 18.10.2012 IV 2015 Не подлежит закрытию Формирование
15 44 МЭС Урала 30-2012 от 18.10.2012 IV 2015 Не подлежит закрытию Формирование
16 43 МЭС Западной Сибири 30-2012 от 18.10.2012 IV 2015 Не подлежит закрытию Формирование
17 42 МЭС Центра 30-2012 от 18.10.2012 IV 2016 Перенос на октябрь Утвержден
18 41 МЭС Сибири 30-2012 от 18.10.2012 IV 2016 Перенос на октябрь Утвержден
19 40 МЭС Центра 30-2012 от 18.10.2012 IV 2015 Не подлежит закрытию Формирование
20 39 МЭС Северо-Запада 30-2012 от 18.10.2012 IV 2016 Перенос на октябрь Утвержден
21 38 МЭС Центра 30-2012 от 18.10.2012 III 2016 Утвержден
22 37 МЭС Юга 30-2012 от 18.10.2012 IV 2016 Декабрь 2016 Формирование
23 36 МЭС Волги 30-2012 от 18.10.2012 IV 2016 Перенос на октябрь Утвержден
24 35 МЭС Урала 30-2012 от 18.10.2012 III 2016 Утвержден
25 34 МЭС Западной Сибири 30-2012 от 18.10.2012 III 2016 Утвержден
26 33 МЭС Сибири 30-2012 от 18.10.2012 III 2016 Утвержден
27 32 МЭС Сибири 30-2012 от 18.10.2012 IV 2015 Не подлежит закрытию Формирование
28 31 МЭС Востока 30-2012 от 18.10.2012 III 2016 Утвержден
29 26 МЭС Урала 30-2012 от 18.10.2012 II 2016 Утвержден
30 25 МЭС Волги 30-2012 от 18.10.2012 II 2016 Утвержден
31 24 МЭС Северо-Запада 30-2012 от 18.10.2012 II 2016 Утвержден
32 22 МЭС Западной Сибири 30-2012 от 18.10.2012 II 2016 Утвержден
33 21 МЭС Сибири 30-2012 от 18.10.2012 II 2016 Утвержден
34 20 МЭС Юга 30-2012 от 18.10.2012 II 2016 Утвержден
35 19 МЭС Центра 30-2012 от 18.10.2012 II 2016 Утвержден

Portproxy windows

Из серии, век живи, век учись. Форвардинг пакетов штатными средствами виндовс.
netsh interface portproxy add v4tov4 listenport=2222 listenaddress=192.168.0.101 connectport=2222 connectaddress=192.168.11.13
#ну и посмотреть, удалить все правила, или выборочно
netsh interface portproxy show all
netsh interface portproxy reset
netsh interface portproxy delete v4tov4 listenport=2222 listenaddress=192.168.0.101
Для чего понадобилось, в моем случае, с помощью «виртуального сервера» роутера (тплинк), нужно было пробросить порт, но сеть не директ коннект (маршруты прописаны, пинга ходит), соответственно пришлось перенаправлять дважды, от тплинка до маршрутизатора этой сети и с него уже дальше.

HTML5 data-* attributes and jQuery.data() in examples

HTML5 data-* attributes and jQuery.data() в примерах:
1) загруженная страница содержит

<input id="test" type="text" data-data1="qwer" data-data2-test="asdf" value="test">


2) на Vanilla JS
document.getElementById("test").dataset.data1
"qwer"
document.getElementById("test").dataset.data2-test
NaN
document.getElementById("test").dataset.data2Test
"asdf"

-- для IE 10- dataset не доступен

>> document.getElementById("test").dataset.data1 
"Не удалось получить свойство "data1" ссылки, значение которой не определено или является NULL" 
>> document.getElementById("test").getAttribute("data-data1") 
"qwer" 
>> document.getElementById("test").getAttribute("data-data2-test") 
"asdf" 
используем jQuery для чтения, все универсально, и главное, в IE тоже работает как надо
$('#test').data('data1')
"qwer"
$('#test').data('data2-test')
"asdf"
$('#test').data('data2Test')
"asdf"
а сейчас попробуем сохранить данные используя jQuery.data(), и более того сохраним объект содержащий функцию
видим результат, с помощью jQuery можем легко воспользоваться сохраненным объектом
но эти данные не появляются в dataset, они сохраняются в кэше jQuery, при первой же попытке получить значение data элемента, jQuery создаст свойство в DOM структуре этого элемента «jQuery + $.now()» и присвоит ему уникальный идентификатор (или ранее), который и будет использоваться как ключ для доступа к кэшу, а так же, скопирует атрибуты data в свой кэш.
$('#test').data('data3', {tt: 10, fn1: function(n){ return this.tt * n + n } })

$('#test').data('data3').fn1(5)
55
document.getElementById("test").dataset.data3
undefined
jQuery1113024019371896630481: 63

jQuery.cache[63]
Object {data: Object, parsedAttrs: true}
jQuery.cache[63].data
Object {data2Test: "asdf", data1: "qwer", data3: Object}
$('#test').data()
Object {data2Test: "asdf", data1: "qwer"}
$.cache[63].data
Object {data2Test: "asdf", data1: "qwer"}
$('#test').attr('data-data1', 'qazwsx')
[<input id=​"test" type=​"text" data-data1=​"qazwsx" data-data2-test=​"asdf" value=​"test">​]
$('#test').data()
Object {data2Test: "asdf", data1: "qwer"}
$('#test')[0].dataset
DOMStringMap {data1: "qazwsx", data2Test: "asdf"}
$('#test').attr('data-data3', 'qazwsx')
[<input id=​"test" type=​"text" data-data1=​"qazwsx" data-data2-test=​"asdf" value=​"test" data-data3=​"qazwsx">​]
$('#test')[0].dataset
DOMStringMap {data1: "qazwsx", data2Test: "asdf", data3: "qazwsx"}
$('#test').data()
Object {data2Test: "asdf", data1: "qwer"}
$('#test').data('data1', 123)
[<input id=​"test" type=​"text" data-data1=​"qazwsx" data-data2-test=​"asdf" value=​"test" data-data3=​"qazwsx">​]
$('#test').data()
Object {data2Test: "asdf", data1: 123}
$('#test')[0].dataset
DOMStringMap {data1: "qazwsx", data2Test: "asdf", data3: "qazwsx"}
$('#test')[0].dataset.data1 = 777
777
$('#test')[0].dataset
DOMStringMap {data1: "777", data2Test: "asdf", data3: "qazwsx"}
$('#test').data()
Object {data2Test: "asdf", data1: 123}
Итоги:
  1. data атрибуты загружаются в свойство attributes элемента
  2. если браузер поддерживает DOMStringMap, то в свойство dataset дублируются все атрибуты data? имена приводятся в верблюжью нотацию, если в имени присутствуют «-«
  3. jQuery сохраняет копию data атрибутов и более их не обновляет, ни в одну из сторон, jQuery использует javascript для хранения данных, а не DOM, вот тут то плагины jQuery и хранят свои экземпляры

Visual C++ 2003 (7.1) Redistributable Package (x86)

Распространяемого пакета для Visual C++ 2003 (7.1) не существует, и периодически приходится искать msvcp71.dll, msvcr71.dll и тд Например при использовании старого Oracle Client instantclient-basic-win32
Где взять, качаем тут Microsoft® Visual Studio® .NET™ 2003 Service Pack 1 или тут Если ХаЦкЕрОв не боязно
конвертация VS7.1sp1-KB918007-X86.exe /Xp:VS71.msi
заходим архиватором VS71.msi, в корне есть файл PCW_CAB_VS в него тоже архиватором и добираемся до
FL_msvcp71_dll_____X86.3643236F_FC70_11D3_A536_0090278A1BB8
FL_msvcr71_dll_____X86.3643236F_FC70_11D3_A536_0090278A1BB8
переименовываем, перемещаем в папку со старым приложением

Excel, бага, не фича

Давеча обратился ко мне пользователь екселя, я же программист должен разобраться.
Пользователь задала фильтр в одном из столбцов с датами, формат всех ячеек в столбце — дата, но вот большая часть дат в фильтре группируются по годам и месяцам, но не все, есть исключения.
Этот файл «ходил по рукам» как и в какой момент такое получается не знаю, в скринах-солюшенах воспроизвел копируя данные из тех самых файлов.
excel1 excel2 excel3 excel4
Решение такое, копируем пустую ячейку в буфер обмена, выделяем диапазон с ячейками дат и делаем специальную вставку, только значения со сложением, и вуаля, фильтр сгруппировался.