jQuery Ajax и FormData objects

Если получили ошибку:
jquery.min.js:4 Uncaught TypeError: Illegal invocation

или:
PHP Warning: Missing boundary in multipart/form-data POST data in Unknown on line 0

проставим значения параметров для аякса:
processData: false,
contentType: false,

Сессии php и десериализация

Задача, проход по списку сессий, сессия стандартно в файлах, получить доступ к данным.
<div id="usersmonitor" >
<table id="usersmonitortable" class="table table-bordered table-hover table-condensed table-fixed">
<thead>
<tr><th style="width: 15%;">Последняя активность</th><th style="width: 35%;">ФИО</th><th style="width: 25%;">e-mail</th><th style="width: 25%;">Роль</th></tr>
</thead>
<tbody>
<?php 
function unserialize_php($session_data) {
        $return_data = array();
        $offset = 0;
        while ($offset < strlen($session_data)) {
            if (!strstr(substr($session_data, $offset), "|")) {
                throw new Exception("invalid data, remaining: " . substr($session_data, $offset));
            }
            $pos = strpos($session_data, "|", $offset);
            $num = $pos - $offset;
            $varname = substr($session_data, $offset, $num);
            $offset += $num + 1;
            $data = unserialize(substr($session_data, $offset));
            $return_data[$varname] = $data;
            $offset += strlen(serialize($data));
        }
	return $return_data;
}

$directory = session_save_path().'/';
$filenames = array();
$iterator = new DirectoryIterator($directory);
foreach ($iterator as $fileinfo) {
    if ($fileinfo->isFile()) {
        $filenames[$fileinfo->getMTime()] = $fileinfo->getFilename();
    }
}
krsort($filenames);

foreach($filenames as $mt => $fn) {
 $ot = new \DateTime();
 $ot->setTimestamp($mt);
 $st = $ot->format('d.m.Y H:i');
 $t = unserialize_php(file_get_contents($directory . $fn));
 if (isset($t['auth']) && isset($t['auth']['user'])) {
	$tt = (object)$t['auth']['user'];
	echo "<tr><td>{$st}</td><td>{$tt->nameLast} {$tt->nameFirst} {$tt->nameMidle}</td><td>{$tt->email}</td><td>{$tt->name}</td></tr>";
 }
}

?>
</tbody>
</table>
</div>

<script>
$(function () {
	setInterval( function() {$('#usersmonitor').load('/users/usersmonitor #usersmonitortable', {act: 'refresh'})} , 30100 );
});
</script>

TRY_CONVERT, TRY_CAST в MSSQL 2005

Сообразил такой вариант, прям в запрос, удобно
select c1.value('xs:integer((/v)[1])','int') ci1, c1.value('xs:float((/v)[1])','float') ci1 from (
	select cast('<v> 1234 </v>' as xml) c1 union all
	select cast('<v>1234 Z</v>' as xml) c1 union all
	select cast('<v>12,3</v>' as xml) c1 union all
	select cast('<v>12.3</v>' as xml) c1 union all
	select cast('<v>23e2</v>' as xml) c1
 ) tt

ci1	ci1
1234	1234
NULL	NULL
NULL	NULL
NULL	12,3
NULL	2300

select cast('<v>1234</v>' as xml).value('xs:integer((/v)[1])','int') ci1

Это не проверял
CREATE FUNCTION TryCastInt(@inputStr nvarchar(max))
RETURNS int 
AS 
BEGIN
	DECLARE @ret int;
	set @ret = -999999
	IF  (~(cast(patindex('%[^0-9]%', @inputStr) as bit))) >0
		select @ret = cast (@inputStr as int) 
	ELSE
	 set @ret  = -999999
 RETURN @ret;
END;

Немного другой вариант, для поразмыслить
<code>DECLARE @VARCHARString VARCHAR(8000)
SET @VARCHARString = '000012W`''ASDASDS3A@!#@!#_)+)_4)'
SELECT @VARCHARString
--Remove non numeric charecters from the varchar variable
WHILE PATINDEX('%[^0-9]%', @VARCHARString) > 0
SET @VARCHARString = STUFF(@VARCHARString, PATINDEX('%[^0-9]%', @VARCHARString), 1, '')
SELECT @VARCHARString + c1 from (
 select 1 c1 union all
 select 2 c2
) tt

Служба «Служба профилей пользователей» препятствует входу в систему. Невозможно загрузить профиль пользователя.

Усложнение уровня, имеем удаленного пользователя, у пользователя одна учетная запись, попасть на рабочий стол он не может получает сообщение
Служба «Служба профилей пользователей» препятствует входу в систему. Невозможно загрузить профиль пользователя.
01_sm[1] Перезагрузка, жмет F8 (часто) 02_sm[1] И «Последняя удачная конфигурация» не помогла, совсем плохо.
  1. Опять Ф8
  2. заходим в безопасный режим
  3. создаем пользователя с правами администратора
  4. перезагрузка
  5. заходим в систему этим пользователем
  6. скачиваем и запускаем TeamViewer
  7. заходим удаленно и проделываем операцию по восстановления профиля HKLM\Software\Microsoft\Windows NT\CurrentVersion\ProfileList
    • Если есть папки вида S-1-5-21-*… и S-1-5-21-*….bak Нужную папку S-1-5-21-*… определяем по имени параметра «ProfileImagePath», который указывает путь к профилю. Правильная папка с именем вида S-1-5-21-*….bak Неправильная папка с именем вида S-1-5-21-*…. Переименуйте папку с именем вида S-1-5-21-*… в S-1-5-21-*….bk Переименуйте папку с именем вида S-1-5-21-*….bak в S-1-5-21-*…. удалив в имени .bak Удаляем S-1-5-21-*….bk
    • Если папка с именем вида S-1-5-21-*… одна или нет папки с именем вида S-1-5-21-*….bak В таком случаи измените значения на «0» в имени параметра «RefCount» и «State», которые находятся в папке S-1-5-21-*…
    • И еще вариант, в независимости от того, была одна папка или мы восстановили данные из «.bak» значения параметров «RefCount» и «State» сбрасываем в 0
  8. перезагрузка
  9. клиент заходит в систему старым пользователем

Условные комментарии начиная с IE 10 больше не работают

<!-- [if IE 6]><style type="text/css">
   .transparent { background: #0078c9; }
</style><![endif]-->
https://msdn.microsoft.com/en-us/library/hh801214(v=vs.85).aspx «Отделить» 10-ый от 11-го с помощью js или на бекенде аналогично распарсить User-Agent
var uA = navigator.userAgent;
if(uA.indexOf('Trident') != -1 && uA.indexOf('rv:11') != -1){
    document.body.className = document.body.className+' ie ie11';
} else if(uA.indexOf('Trident') != -1 && uA.indexOf('MSIE 10.0') != -1){
    document.body.className = document.body.className+' ie ie10';
} else if(uA.indexOf('MSIE ') != -1) {
    document.body.className = document.body.className+' ie ieo';
}

JQuery preventDefault stopPropagation stopImmediatePropagation

Отличие в методах:
  • preventDefault() = прервать обработку действия по умолчанию на элементе текущего события
  • stopPropagation() = остановить всплытие(bubbling) события к родительским элементам
  • stopImmediatePropagation() = stopPropagation + прерывает передачу события во все последующие обработчики «слушающих» на текущем элементе

Авторизация учетными данными JIRA в PHP

В этом конкретном случае «прикручено» в Yii. Читаем непосредственно с таблицы пользователей Jira
<?php

namespace app\models;

class User extends \yii\base\Object implements \yii\web\IdentityInterface
{
    public $id;
    public $username;
    public $password;
    public $authKey;
    public $accessToken;

    public $credential;
    public $first_name;
    public $last_name;
    public $gid;
    public $group_name;


    public static function _init() {
	if (empty(self::$users)) {
		$users = \Yii::$app->db->createCommand("select c.id, c.lower_user_name username, c.credential, c.first_name, c.last_name from cwd_user c where c.active = 1")
           			->cache(3600)
           			->queryAll();
           	foreach ($users as $u) {
			self::$users[$u['id']] = $u;
		}
	}

    }

    public static $users = [];
...............................
    /**
     * Validates password
     *
     * @param  string  $password password to validate
     * @return boolean if password provided is valid for current user
     */
    public function validatePassword($password)
    {
	return JiraAuth::isValidPassword($password, $this->credential);
    }
} 

И сам класс проверки пароля
<?php

class JiraAuth {
	const DEFAULT_PREFIX = '{PKCS5S2}';
	const DEFAULT_SALT_LENGTH_BYTES = 16;

	public static function isValidPassword($password, $credential) {
		$ret = false;

		if ( strrpos($credential, JiraAuth::DEFAULT_PREFIX) === false)
			return $ret;

		$credential = substr($credential, strlen(JiraAuth::DEFAULT_PREFIX)-1);

		$binSaltAndKey = base64_decode($credential);
		
		if (strlen($binSaltAndKey)<48)
			return $ret;

		$salt = substr($binSaltAndKey,0,JiraAuth::DEFAULT_SALT_LENGTH_BYTES);
		$oldKey = bin2hex(substr($binSaltAndKey,JiraAuth::DEFAULT_SALT_LENGTH_BYTES));
		$newKey = hash_pbkdf2('sha1', $password, $salt, 10000, 64);

		return ($oldKey == $newKey);
	}
}
Замечание, PHP нужен от 5.5, а JIRA была версии v6.3