При попытке SSO авторизации на той же машине, где расположен сам сервис авторизации (sso-proxy) получал ошибку
AcceptSecurityContext failed with. [0x8009030C]
Помогло так
HKLM\System\CurrentControlSet\Control\LSA Add a DWORD value called “DisableLoopbackCheck” Set this value to 1
SQL data types from my query
Иногда нужно узнать типы возвращаемых запросом данных, например для объявления табличной переменной.
Начиная с 2012 SQL Server это легче легкого, для более ранних версий придется создавать временную таблицу из результата запроса, и затем в tempdb.sys.columns.
Начиная с 2012 SQL Server это легче легкого, для более ранних версий придется создавать временную таблицу из результата запроса, и затем в tempdb.sys.columns.
DECLARE @query nvarchar(max) = ' select id, measEquiId, zipFlag, psId, dateSet, replaceId, pl1, pl2, pl3, phase, place, joinName, created, whoCreate, dateReplace from ( select id, measEquiId, zipFlag, dateSet dateReplace, created, whoCreate from [MetrologDev].[dbo].m_eqPlaceParamsList ep where ep.deleted is null and ep.zipFlag = 35 and ep.psId = 0 and ep.replaceId=0 and not exists (select null from [MetrologDev].[dbo].m_eqPlaceParamsList ep2 where ep2.deleted is null and ep2.measEquiId = ep.measEquiId and ep2.psId <> 0 and ep2.replaceId=0 and ep2.id > ep.id) ) inZip outer apply ( select id id_r, psId, dateSet, replaceId, pl1, pl2, pl3, phase, place, joinName, created created_r, whoCreate whoCreate_r from ( select row_number() over(order by id desc) rn, * from [MetrologDev].[dbo].m_eqPlaceParamsList ep where inZip.measEquiId=ep.measEquiId and ep.deleted is null and ep.zipFlag = 0 and ep.replaceId<>0)tt where rn=1) isRepl -- пока можно только менять, если снимать, то убираем условие ep.replaceId<>0 '; EXEC sp_describe_first_result_set @query, null, 0;
MariaDB update records or cteate table from CTE
CTE в марии это хорошо, но как сохранить результаты. В документации не нашел, аналогия с SQL Server не работает.
update load0 l join ( with t1 as ( select row_number() over (partition by col1, substring(col2, 1, 15), col3, regexp_replace(regexp_substr(col4, '^[^|]*'),'[^а-я]',''), col6, regexp_replace(regexp_substr(col7, '^[^|]*'),'(http)*(s)*(www.)*[\/\:]',''), lower(col8), col9, col10 order by col11_id, col12_id) rn, l0.* from load0 l0 ) select * from t1 ) t on (l.id=t.id) set l.client_number = t.rn ; create table col12 with t1 as ( select col11, col12, count(*) cnt from load0 group by col11, col12 ), t2 as ( select *, dense_rank() over (order by col11 desc) col11_id, dense_rank() over (partition by col11 order by col12) col12_id from t1 ) , t3 as ( select distinct col11, col11_id from t2 ) select col11_id, col12_id, col12 from t2 ;
Authentication requests when you open Office documents in IE
При скачивании документов «Content-Type: application/msword» в ИЕ появляются окна авторизации. А появляются они из-за того что ИЕ шлют кучу служебных запросов «Microsoft Office Discovery». Ставим заглушку, можно было и в модреврайт поставить, я добавил на уровне пхп, дабы не зависеть от настроек апача.
// https://support.microsoft.com/en-us/help/2019105/authentication-requests-when-you-open-office-documents // https://support.microsoft.com/en-ph/help/838028/how-documents-are-opened-from-a-web-site-in-office-2003 $matches = null; $isIEzzz = preg_match('/^\\s*Microsoft((\\s+Office\\s+.*\\s+Discovery)|(-WebDAV-MiniRedir))/i', $_SERVER['HTTP_USER_AGENT'], $matches); if ($isIEzzz === 1) { http_response_code(501); // 501 Not Implemented exit; }
SELECT FROM stored procedure
Выборка из хранимой процедуры, первоначально условий не было, понадобились, сгородили огород, можно было использовать временную таблицу или табличную переменную.
Было
Было
Сталоdeclare @d1 datetime = convert(datetime, '{$p->dateFromQ}', 104), @d2 datetime = convert(datetime, eomonth(convert(datetime, '{$p->dateToQ}', 104))) + 1.0/1.000001; exec {$this->db_our}perfReport @d1, @d2;
select * from openquery([LOOPBACK], ' declare @d1 datetime = convert(datetime, ''{$p->dateFromQ}'', 104), @d2 datetime = convert(datetime, eomonth(convert(datetime, ''{$p->dateToQ}'', 104))) + 1.0/1.000001; exec {$this->db_our}perfReport @d1, @d2 with result sets (( price decimal(25,3), selectedCnt int ,selectedSum decimal(38,3) ,smoot1 int ,smoot2 int ,approvedInPmes int ,selected int, inOther int ,id int ,h1_id int ,h2_id int ,h3_id int ,h1_name varchar(128) ,h2_name varchar(128) ,h3_name varchar(128) ,h3_extId int ,documentID int ,dName varchar(128) ,entity varchar(255) ,createdD datetime ,createdDH varchar(30) ,docDateH varchar(30) ,TIName varchar(4000) ,vr float ,cnt int ,measEquiId int ,pfId int ,unitPriceId int ,intEntityType int ,hashedName varchar(128) ,originalName varchar(256) ,moot int ,moot1 int ,moot2 int ,etName varchar(128) ,ekName varchar(255) ,ekId int ,serialNumber varchar(64) ,workNameF varchar(258) ,priceN decimal(14,3) ,kindId2 int ,isPriced int ))') where docDateH between convert(datetime, '{$p->dateFrom}', 104) and convert(datetime, '{$p->dateTo}', 104) + 1.0/1.000001
Windows 10 возвращаем «Средство Просмотра фотографий Windows»
При «чистой» установке windows 10 «Средство Просмотра фотографий Windows» более недоступно, исправляем ситуацию добавив несколько записей в реестр.
Скачиваем, открываем архив, запускаем, соглашаемся на отсутствие подписи, внесение изменений и тд. Activate Windows Photo Viewer on Windows 10.reg.zip
Открываем «Приложения по умолчанию» выбираем «Просмотр фотографий Windows».
Скачиваем, открываем архив, запускаем, соглашаемся на отсутствие подписи, внесение изменений и тд. Activate Windows Photo Viewer on Windows 10.reg.zip
Открываем «Приложения по умолчанию» выбираем «Просмотр фотографий Windows».
![Приложения по умолчанию](/wp-content/uploads/2018/01/Безымянный-1024x800.png)
Disabling Ctrl+Alt+Del in Debian
В консольке vSphere ткнули ктрл-альт-дел (предполагали что винда), а там Debian Stretch и система ребутнулась.
Дабы избежать такой неожиданности решил отключить, погуглил, первое что попалось
Дабы избежать такой неожиданности решил отключить, погуглил, первое что попалось
Не помогло, как оказалось после Wheezy, нужно такое решениеnano /etc/inittab *** find the line with 'ctrlaltdel' (Ctrl-W for search) *** comment out by adding the hash '#' at beginning of line *** save file (Ctrl-O) and exit (Ctrl-X) init q
Работаетrm /lib/systemd/system/ctrl-alt-del.target ln -s /dev/null /lib/systemd/system/ctrl-alt-del.target systemctl daemon-reload
А для CentOS 7
[root@localhost ~]# systemctl mask ctrl-alt-del.target Created symlink from /etc/systemd/system/ctrl-alt-del.target to /dev/null.
How remove Memory Optimized File
Моя история избавления от In-Memory OLTP, база на продакшене, так что просто грохнуть ее и забыть, никак.
А началось все с этого: «Msg 41385, Level 16, State 1, Procedure sp_cdc_enable_db, Line 31 [Batch Start Line 2] A database cannot be enabled for both Change Data Capture (CDC) and MEMORY_OPTIMIZED_DATA storage.»
В базе все таблицы в оптимизированные на использование памяти заменил на табличные переменные.
Попытался удалить группу, «The file ‘MOD’ cannot be removed because it is not empty».
Можно пытаться сделать файл пустым и тд и тп, но все будет безрезультатно, потому как читать нужно документацию, и вот что сказал майкрософт, » Once you create a memory-optimized filegroup, you can only remove it by dropping the database. SQL Server does not allow you to remove an In-Memory OLTP filegroup from the database even after you drop all memory-optimized tables.», в общем искоренить MEMORY_OPTIMIZED_DATA storage можно только одним способом дропнув БД.
В моем случае в базе присутствуют таблицы с ограничениями по внешним ключам, а так же таблицы содержащие null-ы при заданном значении по умолчанию для столбца, задействован полнотекстовый поиск.
Ну да ладно, приступим, воспользуемся SQL Server Management Studio (SSMS) и утилитой DTExecUI.exe
1) Создаем скрипт базы.
2) Правим полученный файла, удаляем файловую группу, ну и все это во временную БД, для сверки.
3) Импорт данных («Import data…», курсор на скрине не на том пункте), готовим пакет для импорта, указываем источник, назначение, выбираем таблицы, указываем на необходимость вставки идентификаторов, сохраняем пакет в файл, затем его подправим и отправим на выполнение.
Отключаем контроль ограничений, иначе будет плохо.
Вот так, плохо.
Меняем keepnulls на true, иначе нулы заменятся на значения по умолчанию.
И отправляем пакет на выполнение.
А началось все с этого: «Msg 41385, Level 16, State 1, Procedure sp_cdc_enable_db, Line 31 [Batch Start Line 2] A database cannot be enabled for both Change Data Capture (CDC) and MEMORY_OPTIMIZED_DATA storage.»
В базе все таблицы в оптимизированные на использование памяти заменил на табличные переменные.
Попытался удалить группу, «The file ‘MOD’ cannot be removed because it is not empty».
Можно пытаться сделать файл пустым и тд и тп, но все будет безрезультатно, потому как читать нужно документацию, и вот что сказал майкрософт, » Once you create a memory-optimized filegroup, you can only remove it by dropping the database. SQL Server does not allow you to remove an In-Memory OLTP filegroup from the database even after you drop all memory-optimized tables.», в общем искоренить MEMORY_OPTIMIZED_DATA storage можно только одним способом дропнув БД.
В моем случае в базе присутствуют таблицы с ограничениями по внешним ключам, а так же таблицы содержащие null-ы при заданном значении по умолчанию для столбца, задействован полнотекстовый поиск.
Ну да ладно, приступим, воспользуемся SQL Server Management Studio (SSMS) и утилитой DTExecUI.exe
1) Создаем скрипт базы.
![Безымянный1](/wp-content/uploads/2017/11/Безымянный1.png)
![Безымянный2](/wp-content/uploads/2017/11/Безымянный2.png)
![Безымянный3](/wp-content/uploads/2017/11/Безымянный3.png)
![Безымянный4](/wp-content/uploads/2017/11/Безымянный4.png)
![Безымянный5](/wp-content/uploads/2017/11/Безымянный5.png)
![Безымянный6](/wp-content/uploads/2017/11/Безымянный6.png)
2) Правим полученный файла, удаляем файловую группу, ну и все это во временную БД, для сверки.
![Безымянный7](/wp-content/uploads/2017/11/Безымянный7.png)
![Безымянный8](/wp-content/uploads/2017/11/Безымянный8.png)
3) Импорт данных («Import data…», курсор на скрине не на том пункте), готовим пакет для импорта, указываем источник, назначение, выбираем таблицы, указываем на необходимость вставки идентификаторов, сохраняем пакет в файл, затем его подправим и отправим на выполнение.
![Безымянный9](/wp-content/uploads/2017/11/Безымянный9.png)
![Безымянный10](/wp-content/uploads/2017/11/Безымянный10.png)
![Безымянный11](/wp-content/uploads/2017/11/Безымянный11.png)
![Безымянный12](/wp-content/uploads/2017/11/Безымянный12.png)
![Безымянный13](/wp-content/uploads/2017/11/Безымянный13.png)
![Безымянный14](/wp-content/uploads/2017/11/Безымянный14.png)
![Безымянный15](/wp-content/uploads/2017/11/Безымянный15.png)
![Безымянный16](/wp-content/uploads/2017/11/Безымянный16.png)
![Безымянный17](/wp-content/uploads/2017/11/Безымянный17.png)
![Безымянный18](/wp-content/uploads/2017/11/Безымянный18.png)
Отключаем контроль ограничений, иначе будет плохо.
![Безымянный19](/wp-content/uploads/2017/11/Безымянный19.png)
![Безымянный20](/wp-content/uploads/2017/11/Безымянный20.png)
Вот так, плохо.
![Безымянный20_1](/wp-content/uploads/2017/11/Безымянный20_1.png)
Меняем keepnulls на true, иначе нулы заменятся на значения по умолчанию.
![Безымянный21](/wp-content/uploads/2017/11/Безымянный21.png)
![Безымянный22](/wp-content/uploads/2017/11/Безымянный22.png)
И отправляем пакет на выполнение.
![Безымянный23](/wp-content/uploads/2017/11/Безымянный23.png)
![Безымянный24](/wp-content/uploads/2017/11/Безымянный24.png)
![Безымянный25](/wp-content/uploads/2017/11/Безымянный25.png)
Готово. По этим же шагам можно и понижение версии сделать.
MariaDB(MySQL) recursive CTE and Window Functions
Ну да, конечно, в MySQL, нет ничего подобного и уже наверное не будет, иначе Oracle сделал бы этот функционал много лет назад.
Ставим вместо MySQL MariaDB и получаем обобщенные выражения и рекурсивные в том числе, оконные функции, обработку строки регекспом и тд.
PHP и не заметит подмены.
Для примера, решаем задачу, генерация «чистая», никаких лишних строк.
/* * календарь на месяц, по умолчанию текущий - "select 0 monthShift from dual" * начало недели с понедельника * с отображением дней предыдущего и следующего месяцев в неполных неделях */ with recursive gen50 as ( select -10 rn union all select rn+1 from gen50 where rn<40 /* генерируем 50 строк */ ), calend as ( select *, substr(dds, -2) ddH from ( select *, min(ttrimTop) over () trimTop, max(ttrimBottom) over () trimBottom from ( select *, first_value(rn) over (partition by curMonth order by weekdayIdx asc, rn desc) ttrimTop, first_value(rn) over (partition by curMonth order by weekdayIdx desc, rn asc) ttrimBottom, min(case when ld = dds and weekdayIdx = 6 then rn else 99 end) over() ttrimBottom2, max(case when fd = dds and weekdayIdx = 0 then rn else -99 end) over() ttrimTop2 from ( select *, case when dds < fd then -1 when dds > ld then 0 else 1 end curMonth, dds = current_date curDay, weekday(dds) weekdayIdx from ( select *, dd.fd + interval (gen50.rn) day as dds from gen50 cross join (select last_day(now() + interval monthShift month ) ld, last_day(now() + interval monthShift month ) + interval 1 day - interval 1 month as fd from (select 0 monthShift from dual) dd) dd ) tt ) tt ) tt ) tt where rn between trimTop and trimBottom /* обрезать по начальной и конечной неделе */ and rn between ttrimTop2 and ttrimBottom2 /* если число месяца на границе недели, то нужно "отрезать" раньше */ ) select * from calend order by rn;
Добавим к CTE еще пару запросов, что-то вроде этого,+----+------------+------------+------------+----------+--------+------------+----------+-------------+--------------+-----------+---------+------------+------+ | rn | ld | fd | dds | curMonth | curDay | weekdayIdx | ttrimTop | ttrimBottom | ttrimBottom2 | ttrimTop2 | trimTop | trimBottom | ddH | +----+------------+------------+------------+----------+--------+------------+----------+-------------+--------------+-----------+---------+------------+------+ | -6 | 2017-10-31 | 2017-10-01 | 2017-09-25 | -1 | 0 | 0 | -6 | -7 | 99 | -99 | -6 | 35 | 25 | | -5 | 2017-10-31 | 2017-10-01 | 2017-09-26 | -1 | 0 | 1 | -6 | -7 | 99 | -99 | -6 | 35 | 26 | | -4 | 2017-10-31 | 2017-10-01 | 2017-09-27 | -1 | 0 | 2 | -6 | -7 | 99 | -99 | -6 | 35 | 27 | | -3 | 2017-10-31 | 2017-10-01 | 2017-09-28 | -1 | 0 | 3 | -6 | -7 | 99 | -99 | -6 | 35 | 28 | | -2 | 2017-10-31 | 2017-10-01 | 2017-09-29 | -1 | 0 | 4 | -6 | -7 | 99 | -99 | -6 | 35 | 29 | | -1 | 2017-10-31 | 2017-10-01 | 2017-09-30 | -1 | 0 | 5 | -6 | -7 | 99 | -99 | -6 | 35 | 30 | | 0 | 2017-10-31 | 2017-10-01 | 2017-10-01 | 1 | 0 | 6 | 29 | 0 | 99 | -99 | -6 | 35 | 01 | | 1 | 2017-10-31 | 2017-10-01 | 2017-10-02 | 1 | 0 | 0 | 29 | 0 | 99 | -99 | -6 | 35 | 02 | | 2 | 2017-10-31 | 2017-10-01 | 2017-10-03 | 1 | 0 | 1 | 29 | 0 | 99 | -99 | -6 | 35 | 03 | | 3 | 2017-10-31 | 2017-10-01 | 2017-10-04 | 1 | 0 | 2 | 29 | 0 | 99 | -99 | -6 | 35 | 04 | | 4 | 2017-10-31 | 2017-10-01 | 2017-10-05 | 1 | 0 | 3 | 29 | 0 | 99 | -99 | -6 | 35 | 05 | | 5 | 2017-10-31 | 2017-10-01 | 2017-10-06 | 1 | 0 | 4 | 29 | 0 | 99 | -99 | -6 | 35 | 06 | | 6 | 2017-10-31 | 2017-10-01 | 2017-10-07 | 1 | 0 | 5 | 29 | 0 | 99 | -99 | -6 | 35 | 07 | | 7 | 2017-10-31 | 2017-10-01 | 2017-10-08 | 1 | 0 | 6 | 29 | 0 | 99 | -99 | -6 | 35 | 08 | | 8 | 2017-10-31 | 2017-10-01 | 2017-10-09 | 1 | 1 | 0 | 29 | 0 | 99 | -99 | -6 | 35 | 09 | | 9 | 2017-10-31 | 2017-10-01 | 2017-10-10 | 1 | 0 | 1 | 29 | 0 | 99 | -99 | -6 | 35 | 10 | | 10 | 2017-10-31 | 2017-10-01 | 2017-10-11 | 1 | 0 | 2 | 29 | 0 | 99 | -99 | -6 | 35 | 11 | | 11 | 2017-10-31 | 2017-10-01 | 2017-10-12 | 1 | 0 | 3 | 29 | 0 | 99 | -99 | -6 | 35 | 12 | | 12 | 2017-10-31 | 2017-10-01 | 2017-10-13 | 1 | 0 | 4 | 29 | 0 | 99 | -99 | -6 | 35 | 13 | | 13 | 2017-10-31 | 2017-10-01 | 2017-10-14 | 1 | 0 | 5 | 29 | 0 | 99 | -99 | -6 | 35 | 14 | | 14 | 2017-10-31 | 2017-10-01 | 2017-10-15 | 1 | 0 | 6 | 29 | 0 | 99 | -99 | -6 | 35 | 15 | | 15 | 2017-10-31 | 2017-10-01 | 2017-10-16 | 1 | 0 | 0 | 29 | 0 | 99 | -99 | -6 | 35 | 16 | | 16 | 2017-10-31 | 2017-10-01 | 2017-10-17 | 1 | 0 | 1 | 29 | 0 | 99 | -99 | -6 | 35 | 17 | | 17 | 2017-10-31 | 2017-10-01 | 2017-10-18 | 1 | 0 | 2 | 29 | 0 | 99 | -99 | -6 | 35 | 18 | | 18 | 2017-10-31 | 2017-10-01 | 2017-10-19 | 1 | 0 | 3 | 29 | 0 | 99 | -99 | -6 | 35 | 19 | | 19 | 2017-10-31 | 2017-10-01 | 2017-10-20 | 1 | 0 | 4 | 29 | 0 | 99 | -99 | -6 | 35 | 20 | | 20 | 2017-10-31 | 2017-10-01 | 2017-10-21 | 1 | 0 | 5 | 29 | 0 | 99 | -99 | -6 | 35 | 21 | | 21 | 2017-10-31 | 2017-10-01 | 2017-10-22 | 1 | 0 | 6 | 29 | 0 | 99 | -99 | -6 | 35 | 22 | | 22 | 2017-10-31 | 2017-10-01 | 2017-10-23 | 1 | 0 | 0 | 29 | 0 | 99 | -99 | -6 | 35 | 23 | | 23 | 2017-10-31 | 2017-10-01 | 2017-10-24 | 1 | 0 | 1 | 29 | 0 | 99 | -99 | -6 | 35 | 24 | | 24 | 2017-10-31 | 2017-10-01 | 2017-10-25 | 1 | 0 | 2 | 29 | 0 | 99 | -99 | -6 | 35 | 25 | | 25 | 2017-10-31 | 2017-10-01 | 2017-10-26 | 1 | 0 | 3 | 29 | 0 | 99 | -99 | -6 | 35 | 26 | | 26 | 2017-10-31 | 2017-10-01 | 2017-10-27 | 1 | 0 | 4 | 29 | 0 | 99 | -99 | -6 | 35 | 27 | | 27 | 2017-10-31 | 2017-10-01 | 2017-10-28 | 1 | 0 | 5 | 29 | 0 | 99 | -99 | -6 | 35 | 28 | | 28 | 2017-10-31 | 2017-10-01 | 2017-10-29 | 1 | 0 | 6 | 29 | 0 | 99 | -99 | -6 | 35 | 29 | | 29 | 2017-10-31 | 2017-10-01 | 2017-10-30 | 1 | 0 | 0 | 29 | 0 | 99 | -99 | -6 | 35 | 30 | | 30 | 2017-10-31 | 2017-10-01 | 2017-10-31 | 1 | 0 | 1 | 29 | 0 | 99 | -99 | -6 | 35 | 31 | | 31 | 2017-10-31 | 2017-10-01 | 2017-11-01 | 0 | 0 | 2 | 36 | 35 | 99 | -99 | -6 | 35 | 01 | | 32 | 2017-10-31 | 2017-10-01 | 2017-11-02 | 0 | 0 | 3 | 36 | 35 | 99 | -99 | -6 | 35 | 02 | | 33 | 2017-10-31 | 2017-10-01 | 2017-11-03 | 0 | 0 | 4 | 36 | 35 | 99 | -99 | -6 | 35 | 03 | | 34 | 2017-10-31 | 2017-10-01 | 2017-11-04 | 0 | 0 | 5 | 36 | 35 | 99 | -99 | -6 | 35 | 04 | | 35 | 2017-10-31 | 2017-10-01 | 2017-11-05 | 0 | 0 | 6 | 36 | 35 | 99 | -99 | -6 | 35 | 05 | +----+------------+------------+------------+----------+--------+------------+----------+-------------+--------------+-----------+---------+------------+------+ 42 rows in set (0.00 sec)
и в итоге, будет как-то так., aa as ( SELECT dd.dds dds2, GROUP_CONCAT(CONCAT_WS(CHAR(9), a.id, a.publish_date IS NOT NULL, a.publish_date IS NULL AND (a.for_date < now()), a.publish_date IS NULL AND (a.for_date > now()) ) SEPARATOR '\n ') aas FROM dd JOIN articles a WHERE a.deleted IS NULL AND a.for_date BETWEEN dds AND dds + INTERVAL 1 DAY - INTERVAL 1 SECOND AND (a.responsible = $user OR $user = -1) GROUP BY dd.dds )
![calend](/wp-content/uploads/2017/10/calend1-1024x556.png)
Split a string by whitespace, keeping quoted segments
Разделить строку по пробелам, с возможностью использовать пробелы в кавычках.
Живой пример использования в фильтре.// вместо простого сплита '58 "5 A"'.split(/\s+/); // используем матч '58 "5 A"'.match(/(?:[^\s"]+|"[^"]*")+/g);
$('#lt').on('keyup paste input', '.filter input', function() { var vals = $(this).val().trim().match(/(?:[^\s"]+|"[^"]*")+/g) || []; // поиск по кол-ву вхождений набора входных значений (разделены пробелом, пробел тоже можно передать в поиск, пример, 100 "5 А") var checkAll = function(val) { var finded = 0; $.each(vals, function(i,o){ finded += (val.toUpperCase().indexOf(o.replace(/\"/g,'').toUpperCase()) > -1 ? 1 : 0); }); return vals.length != finded; }; $(this).closest('.row').find('.prop-val,.mod').removeClass('hidden').filter(function(){ return vals.length != 0 && checkAll($(this).text()); }).addClass('hidden'); });