Windows Installer ругался, по-видимому, из-за того, что когда-то профиль пользователя перенесли на другой диск. Вот тут сказано прошерстить реестр на предмет кривых путей до папки "Мои документы". Кривой путь нашелся в ветке реестра: HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
Пришлось его там поправить, а потом перезапустить процесс explorer.exe
вторник, 24 января 2012 г.
четверг, 19 января 2012 г.
Избавиться от предложения сжать сообщения Outlook Express
Попалась хорошая статья. Вкратце - обнулить параметр Compact Check Count реестра:
HKEY_CURRENT_USER\Identities\{GUID}\Software\Microsoft\Outlook Express\5.0\
(он инкрементируется при каждом закрытии почтовика и по достижении значения 100 начинает выдавать это сообщение)
HKEY_CURRENT_USER\Identities\{GUID}\Software\Microsoft\Outlook Express\5.0\
(он инкрементируется при каждом закрытии почтовика и по достижении значения 100 начинает выдавать это сообщение)
вторник, 10 января 2012 г.
Как создать гаджет под Windows 7
На самом деле всё подробно расписано здесь. Я даже сподобился написать простенький таймер ^_^
Оказалось, что эти самые гаджеты в простейшем случае представляют из себя обычные приложения html. Это самое приложение зазиповано в архив (только расширение у этого архива - не .zip, а .gadget) В архиве должен быть файл gadget.xml примерно такого вида:
Соответственно, всё самое интересное заключено в файле funTimer.htm:
Для редактирования настроек программы будет использоваться файл Settings.htm:
Оказалось, что эти самые гаджеты в простейшем случае представляют из себя обычные приложения html. Это самое приложение зазиповано в архив (только расширение у этого архива - не .zip, а .gadget) В архиве должен быть файл gadget.xml примерно такого вида:
<?xml version="1.0" encoding="utf-8" ?>
<gadget>
<name>funTimer</name>
<namespace>CnRuFeed.Gadgets</namespace>
<version>0.0.0.1</version>
<author name="huh-muh">
<info url="huh-muh.blogspot.com" />
</author>
<copyright>© 2012</copyright>
<description>Timer test</description>
<hosts>
<host name="sidebar">
<base type="HTML" apiVersion="1.0.0" src="funTimer.htm" />
<permissions>Full</permissions>
<platform minPlatformVersion="1.0" />
</host>
</hosts>
</gadget>
Соответственно, всё самое интересное заключено в файле funTimer.htm:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Fun timer</title>
</head>
<script type="text/javascript">
function resizeGadget()
{
if(System.Gadget.docked == true)
{
mainBody.style.width = 250;
mainBody.style.height = 80;
}
else
{
mainBody.style.width = 250;
mainBody.style.height = 80;
}
}
function settingsClosed(event)
{
if(event.closeAction == event.Action.commit)
{
loadSettings();
}
}
var initDate;
function loadSettings()
{
var caption = System.Gadget.Settings.read("caption");
captionLabel.innerHTML = (caption != "") ? caption : "(укажите название таймера)";
var initValue = System.Gadget.Settings.read("init");
initValue = initValue.replace(new RegExp(" ",'g'),".").replace(new RegExp(":",'g'),".");
var dateParts = initValue.split(".");
if (dateParts.length == 5)
initDate = new Date(dateParts[2], (dateParts[1] - 1), dateParts[0], dateParts[3], dateParts[4]);
else
if (dateParts.length == 3)
initDate = new Date(dateParts[2], (dateParts[1] - 1), dateParts[0]);
else
initDate = new Date();
timerLabel.innerHTML = "" + initDate;
}
var progressTimer;
function timerTick()
{
var currDate = new Date();
var dateDiff = Math.abs(currDate.getTime() - initDate.getTime()) / 1000;
var dd = Math.floor(dateDiff / (24*3600));
var hh = Math.floor( (dateDiff - dd*24*3600) / 3600 );
var mm = Math.floor( (dateDiff - dd*24*3600 - hh*3600) / 60 );
var ss = Math.floor( dateDiff - dd*24*3600 - hh*3600 - mm*60 );
timerLabel.innerHTML = "" + dd + "д " + hh + "ч " + mm + "м " + ss + "с";
progressTimer = setTimeout("timerTick()", 1000);
}
document.onreadystatechange = function()
{
if(document.readyState=="complete")
{
System.Gadget.settingsUI = "Settings.htm";
System.Gadget.onSettingsClosed = settingsClosed;
System.Gadget.onUndock = resizeGadget;
System.Gadget.onDock = resizeGadget;
loadSettings();
progressTimer = setTimeout("timerTick()", 1000);
}
}
</script>
<body id="mainBody">
<center><g:text id="captionLabel" width="100%" align="center">Loading...</g:text>
<br/>
<g:text id="timerLabel" width="100%" align="center">Loading...</g:text></center>
</body>
</html>
Для редактирования настроек программы будет использоваться файл Settings.htm:
<html xmlns="http://www.w3.org/1999/xhtml">
<script type="text/javascript">
document.onreadystatechange = function()
{
if(document.readyState=="complete")
{
mainBody.style.width = 300;
mainBody.style.height = 180;
captionBox.value = System.Gadget.Settings.read("caption");
timerBox.value = System.Gadget.Settings.read("init");
}
}
System.Gadget.onSettingsClosing = function(event)
{
if (event.closeAction == event.Action.commit)
{
System.Gadget.Settings.write("caption", captionBox.value);
System.Gadget.Settings.write("init", timerBox.value);
event.cancel = false;
}
}
</script>
<body id="mainBody">
Название таймера:
<br />
<input id="captionBox" type="text" maxlength="50" width="100%" />
<br />
Точка отсчета (дд.мм.гггг[ чч:мм]):
<br />
<input id="timerBox" type="text" maxlength="16" width="100%" />
</body>
</html>
вторник, 3 января 2012 г.
Взаимодействие PHP и MSSQL - новые веяния
Поразительный факт: подкупающие своей привычностью функции mssql_connect, mssql_query и т.п. канули в небытие начиная с версии 5.3.0, по крайней мере в варианте для windows.
Однако, как выяснилось, Microsoft в беде не оставит! Есть вполне работоспособный драйвер версии аж 2.0.1. Для него, правда, требуется нативный клиент SQL Server 2008, но его тоже легко можно скачать по ссылке вот с этой страницы (если, конечно, удастся нужную ссылку на этой странице отыскать ^_^).
Единственная тонкость: драйвер представляет из себя набор dll-ек "на все случаи жизни", и требуется выбрать из них нужную. Перебором получилось прописать в php.ini, закинув предварительно в папку расширений соответствующий файл:
В общем, минимально рабочий код оказался таким (лёгкая вариация примера из хелповника, поставляемого вместе с драйвером):
В первом приближении, правда, натолкнулся на ошибки, связанные с трудностью преобразования типа DateTime к строке (отсюда и закомментированный код), но начало положено...
Однако, как выяснилось, Microsoft в беде не оставит! Есть вполне работоспособный драйвер версии аж 2.0.1. Для него, правда, требуется нативный клиент SQL Server 2008, но его тоже легко можно скачать по ссылке вот с этой страницы (если, конечно, удастся нужную ссылку на этой странице отыскать ^_^).
Единственная тонкость: драйвер представляет из себя набор dll-ек "на все случаи жизни", и требуется выбрать из них нужную. Перебором получилось прописать в php.ini, закинув предварительно в папку расширений соответствующий файл:
extension=php_pdo_sqlsrv_53_ts_vc9.dllчто, видимо намекает на то, что PHP 5.3.1 компилировался при помощи Visual C++ 9...
В общем, минимально рабочий код оказался таким (лёгкая вариация примера из хелповника, поставляемого вместе с драйвером):
/* Указываем параметры поключения: имя сервера, логин-пароль и базу. */
$serverName = "myserver.mydomain.ru";
$connectionInfo = array( "UID"=>"uid",
"PWD"=>"pwd",
"Database"=>"AdventureWorks");
/* Подключаемся к серверу используя аутентификацию SQL Server. */
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false )
{
echo "Unable to connect.";
die( print_r( sqlsrv_errors(), true));
}
/* Выполняем SQL-запрос. */
$tsql = "SELECT getdate()";
$stmt = sqlsrv_query( $conn, $tsql);
if( $stmt === false )
{
echo "Error in executing query.";
die( print_r( sqlsrv_errors(), true));
}
/* Получаем результаты запроса и выводим их на экран (казалось бы). */
// $row = sqlsrv_fetch_array($stmt);
// echo "Server date: ".$row[0];
// не проканало с ошибкой Object of class DateTime could not be converted to string
/* Получаем результаты запроса и выводим их на экран - а вот так проканало. */
if (sqlsrv_fetch($stmt);)
echo "Server date: ".sqlsrv_get_field( $stmt, 0, SQLSRV_PHPTYPE_STRING( SQLSRV_ENC_CHAR) );
/* Освобождаем ресурсы, выделенные для запроса и подключения. */
sqlsrv_free_stmt( $stmt);
sqlsrv_close( $conn);
В первом приближении, правда, натолкнулся на ошибки, связанные с трудностью преобразования типа DateTime к строке (отсюда и закомментированный код), но начало положено...
пятница, 16 декабря 2011 г.
Как своровать ресурсы из файла swf
Linux: Ну, во-первых, нужен сам файл. Как его загрузить в один клик в браузере, я так и не разобрался, приходится смотреть в html-код, искать ссылку и тянуть её при помощи wget написано, например, вот тут: в FireFox-е через пункт контекстного меню "Информация о странице" переходим во вкладку "Мультимедиа" и тянем всё, что пожелаем. Ладно. Дальше начинается самое интересное.
Есть такая штука, swftools. В ней присутствует утилита swfextract, при помощи которой всё легко достаётся:
1. Выполняем команду
На выходе получаем примерно такое:
2. Дальше извлекаем нужный ресурс. Например, можно утянуть музыку. Вот только команда с ключом -m дохнет с ошибкой ERROR Soundstream is not mp3 (2), зато, например, командой
Есть еще полезная утилита, swfdump - она показывает более подробную информацию. Т.е. выполняем
Основная проблема - эти самые swftools поставить. Вроде как в репозитории убунты такого нет, поэтому ставим из исходников. Тут есть небольшая тонкость: потребуется доустановить пакеты libjpeg-dev и libgif-dev. После этого всё компилируется, правда, с кучей ворнингов, но работает, вроде, нормально...
Windows: а в винде всё, помнится, было просто. Во-первых, с браузером интегрировался Orbit Downloader, который позволяет без проблем сохранять флэшки на диск, и, во-вторых, есть Sothink SWF Decompiler, который, хотя и платный, зато имеет приятный интерфейс 8-)
Есть такая штука, swftools. В ней присутствует утилита swfextract, при помощи которой всё легко достаётся:
1. Выполняем команду
swfextract myfile.swf
На выходе получаем примерно такое:
Objects in file myfile.swf:
[-i] 2 Shapes: ID(s) 2, 4
[-i] 5 MovieClips: ID(s) 3, 5, 7, 10, 11
[-j] 2 JPEGs: ID(s) 17, 632
[-p] 1 PNG: ID(s) 915
[-s] 7 Sounds: ID(s) 40-45, 584
[-F] 2 Fonts: ID(s) 20, 21
[-f] 1 Frame: ID(s) 0
[-m] 1 MP3 Soundstream
2. Дальше извлекаем нужный ресурс. Например, можно утянуть музыку. Вот только команда с ключом -m дохнет с ошибкой ERROR Soundstream is not mp3 (2), зато, например, командой
swfextract -s 44 myfile.swf -o 6.wavнужный саундтрек достается без хлопот.
Есть еще полезная утилита, swfdump - она показывает более подробную информацию. Т.е. выполняем
swfdump myfile.swf > 1.txtи смотрим всякие DEFINESOUND defines id 0044 (...) и т.п. - чтобы было понятно, что достаем.
Основная проблема - эти самые swftools поставить. Вроде как в репозитории убунты такого нет, поэтому ставим из исходников. Тут есть небольшая тонкость: потребуется доустановить пакеты libjpeg-dev и libgif-dev. После этого всё компилируется, правда, с кучей ворнингов, но работает, вроде, нормально...
Windows: а в винде всё, помнится, было просто. Во-первых, с браузером интегрировался Orbit Downloader, который позволяет без проблем сохранять флэшки на диск, и, во-вторых, есть Sothink SWF Decompiler, который, хотя и платный, зато имеет приятный интерфейс 8-)
понедельник, 12 декабря 2011 г.
Excel 2007 - недопустимое расположение серверных черновиков
Неожиданно Excel 2007 при попытке сохранить настройки стал выдавать ошибку "Указано недопустимое расположение серверных черновиков для автономного редактирования, либо отсутствуют разрешения на доступ к этому расположению. Укажите расположение на этом компьютере". Ну как неожиданно - просто перенесли папку "D:\Мои документы" в "C:\Documents and Settings\User\Мои документы". При этом, что интересно, хитрая программа отказывается сохранять настройки этих самых черновиков (в группе "Сохранение").
Решение оказалось таким: прописать вручную в реестре следующее:
Решение оказалось таким: прописать вручную в реестре следующее:
[HKEY_CURRENT_USER\Software\Microsoft\Office\Common\Offline\Options]
"Local"=dword:00000001
"Location"="C:\\Documents and Settings\\User\\Мои документы\\Черновики SharePoint"
четверг, 8 декабря 2011 г.
postgresql ERROR: permission denied for language c
Ошибка возникла при попытке выполнить uuid-ossp.sql (этот файл содержит набор процедур для работы с uuid). Выяснилось, что хранимые процедуры на си могут создавать только суперпользователи.
Если же хочется, чтобы это было доступно не только суперпользователю, можно сделать так:
1. В базе сделать язык си вызывающим доверие:
2. Дать нужному пользователю нужные права:
Если же хочется, чтобы это было доступно не только суперпользователю, можно сделать так:
1. В базе сделать язык си вызывающим доверие:
psql --single-transaction -c "UPDATE pg_language SET lanpltrusted = true WHERE lanname = 'c';" -d база -U суперюзер
2. Дать нужному пользователю нужные права:
psql -c "GRANT USAGE ON LANGUAGE c TO юзер;" -d база -U суперюзер
Подписаться на:
Сообщения (Atom)