Saturday, August 1, 2009

Как Windows 7 мои логические винты определяла

Сразу после установки не увидела пару винтов. Точнее в Administrative Tools -> Computer Management -> Disk Management они-то показывались, но назначить им букву было нельзя: вылетала ошибка: "The operation failed to complete because the Disk Management console view is not up-to-date. Refresh the view by using the refresh task. If the problem persists close the Disk Management console, then restart Disk Management or restart the computer." Гугл ничего дельного не подсказал. Нижеперечисленные утилиты тож fail'или. Перезагрузка не помогала. Правда, удалить partition этот Disk Management позволял. Зная, что восстановить партишн - это несложно, я удалил один из неопределяемых партишнов. Перезагрузился в Safe Mode, и один из проблемных разделов стал виден Винде, а удаленный раздел, естественно, нет.

Ну я накачал пачку утилит сразу: Acronis Recovery Expert Deluxe (всегда помогал раньше, но вот сейчас не помог), Active Partition Recovery (QuickScan результатов не дал, Superscan долго работал, дал результаты, но диск восстановить отказался, мол, у тебя overlapping с каким-то существующим разделом, но с каким? я перепроверил вручную, никаких оверлэппингов не было), DiskInternals Partition Recovery (вроде нашёл партишн, но так долго занимался чтением его файлов и директорий, что подвис, и я на него забил), Smart Partiton Recovery (тупейшее говно, не справляется с задачами), было ещё пару дерьмовых утилит, которые задачу восстановления случайно удалённого партишна в таблице разделов не решают. УШло на всю херню и медленные сканы часов 5.

Отчаявшись, забутился в MacOS (стоит у меня на другом физическом винте, дабы минимизировать вероятность случайного переписывания бут-сектора и, как следствие, лишнего геморроя из жопы). Запустил TestDisk. Он потребовал запуска от имени суперюзера, а затем ещё и размонтировать мои диски. QuickScan'ом он нашёл мой потерянный раздел в считанные секунды и перезаписал таблицу разделов. Гружусь в Windows 7 и оба проблемных раздела видны)) Уже потом, порывшись в инете, я увидел, что этот TestDisk при аналогичных проблемах советуют использовать бедолагам вроде меня: http://www.techsupportforum.com/microsoft-support/windows-vista-windows-7-support/230957-missing-partition.html .

Наверняка, есть версия чудо-софта (TestDisk) и под Винду. И почему в Майкрософт не сделают аналогичного чудо-софта?

Monday, May 11, 2009

Как "выщемить" программу, которая проигрывает звук

Нередко (но и нечасто :-) случается такое, что какая-то программа в Виндоус проигрывает звук (например, на вкладке в файрфоксе), а что конкретно визжит, - неясно. Во всех версиях Виндоус до Висты не было стандартной возможности узнать, какая программа использует устройство. В Виндоус Виста введён микшер громкости. При помощи него можно легко выщемить, какая же программа проигрывает звук в Windows. См. рисунок.

Wednesday, April 8, 2009

position:absolute html element coordinates, offsetTop, offsetLeft, IE6

Речь пойдёт об очень больном месте для любого веб-разработчика - IE6.

Проблема встала достаточно просто. Есть input, под ним разметка. Нужно отобразить div сразу ниже input'а (на псевдоязыке: input.boottom=div.top), но чтобы этот div был поверх остальной разметки (т.е. увеличен z-index). Так вот, для этого мне нужно абсолютно спозиционировать div, а для этого нужно вычислить абсолютные координаты input'а.

Для вычисления абсолютных координат элемента в Интернете везде предлагается в цикле бежать по его offsetParent'ам до body и суммировать offsetTop (offsetLeft). Но в IE6 столь попсовое решение не работает, когда какой-то из parent'ов обладает бордюром. То есть размер бордюра не учитывается. Вот типичный пример этого решения из Интернета:
     function getObjCoordsIE6Usual(element) {
var res = new Object();
res.x = 0; res.y = 0;
if (element !== null) {
res.x = element.offsetLeft;
res.y = element.offsetTop;
var offsetParent = element.offsetParent;
while (offsetParent !== null) {
res.x += offsetParent.offsetLeft;
res.y += offsetParent.offsetTop;

if (offsetParent != document.body && offsetParent != document.documentElement) {
res.x -= offsetParent.scrollLeft;
res.y -= offsetParent.scrollTop;
}
offsetParent = offsetParent.offsetParent;
}
}
return res;
}

Естественно, это fial. Ниже приведу пример страницы, на которой можно протестить этот fial.

Слегка взгуглив, я нашёл, что "clientLeft Retrieves the distance between the offsetLeft property and the true left side of the client area. " (http://msdn.microsoft.com/en-us/library/ms533564(VS.85).aspx)

Таким образом, суммируя ещё и clientLeft, получаем вроде бы реальные координаты для IE6.
     function getObjCoordsIE6Right(element) {
var res = new Object();
res.x = 0; res.y = 0;
if (element !== null) {
res.x = element.offsetLeft;
res.y = element.offsetTop;
var offsetParent = element.offsetParent;
while (offsetParent !== null) {
res.x += offsetParent.offsetLeft + offsetParent.clientLeft;
res.y += offsetParent.offsetTop + offsetParent.clientTop;

if (offsetParent != document.body && offsetParent != document.documentElement) {
res.x -= offsetParent.scrollLeft;
res.y -= offsetParent.scrollTop;
}
offsetParent = offsetParent.offsetParent;
}
}
return res;
}
Пример страницы, на которой это можно проверить.



<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML Transitional//EN">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<html>
<head>
<title></title>

<script language="javascript">
function ShowInputCoords() {
var inp = document.getElementById('input');
var res = getObjCoordsIE6Usual(inp);
alert(res.x + ' ' + res.y);
res = getObjCoordsIE6Right(inp);
alert(res.x + ' ' + res.y);
}

function getObjCoordsIE6Usual(element) {
var res = new Object();
res.x = 0; res.y = 0;
if (element !== null) {
res.x = element.offsetLeft;
res.y = element.offsetTop;
var offsetParent = element.offsetParent;
while (offsetParent !== null) {
res.x += offsetParent.offsetLeft;
res.y += offsetParent.offsetTop;

if (offsetParent != document.body && offsetParent != document.documentElement) {
res.x -= offsetParent.scrollLeft;
res.y -= offsetParent.scrollTop;
}
offsetParent = offsetParent.offsetParent;
}
}
return res;
}

function getObjCoordsIE6Right(element) {
var res = new Object();
res.x = 0; res.y = 0;
if (element !== null) {
res.x = element.offsetLeft;
res.y = element.offsetTop;
var offsetParent = element.offsetParent;
while (offsetParent !== null) {
res.x += offsetParent.offsetLeft + offsetParent.clientLeft;
res.y += offsetParent.offsetTop + offsetParent.clientTop;

if (offsetParent != document.body && offsetParent != document.documentElement) {
res.x -= offsetParent.scrollLeft;
res.y -= offsetParent.scrollTop;
}
offsetParent = offsetParent.offsetParent;
}
}
return res;
}

</script>

</head>
<body>
<input id="Button1" type="button" value="click" onclick="ShowInputCoords()" />
<table>
<tbody>
<tr>
<td style="border: solid 6px;">
<input id="input" name="input" value="" />
</td>
</tr>
</tbody>
</table>
</body>
</html>
UPD. У jQuery на эту тему тоже нифиговые костыли, но они не сработали у меня... (см. последний метод по ссылке) : http://www.koders.com/javascript/fid69E7017C9DC7FDEFF58D3B1C36F15B1D22EBA424.aspx?s=%22Yehuda+Katz%22

Sunday, January 4, 2009

Winamp 2.95 + Last.fm 1.5.2.38918

Если установлен Winamp 2, то предоставляемый last.fm установщик WinampPluginSetup_2.1.0.9.exe кладёт в папку %PROGRAM FILES%\Winamp\Plugins файл ml_wa2_scrobbler.dll

Winamp 2.95 отказывается подхватывать ml_wa2_scrobbler.dll себе в плагины, поэтому этот файл необходимо переименовать в gen_wa2_scrobbler.dll, иначе скробблится ничего не будет.

По материалам http://www.last.fm/forum/34905/_/483808/1