четверг, 19 декабря 2013 г.

MS SQL backup and resotore database or snapshots

Резервное копирование, восстановление и создание моментальных снимков базы данных на сервере MS SQL



-- MS SQL - запрос резервного копирования

/****** Object:  BackupDevice [NameDeviceBackup]    Script Date: 07/05/2012 07:41:10 ******/
EXEC master.dbo.sp_addumpdevice  @devtype = N'disk', @logicalname = N'NameDeviceBackup', @physicalname = N'R:\Backup\NameDeviceBackup.bak'
GO


-- MS SQL - запрос создания моментальных снимков баз данных

USE [master]
GO

/****** Object:  Database [DbName_2012_01_19]    Script Date: 03/13/2012 07:45:09 ******/
CREATE DATABASE [DbName_2012_01_19] ON
( NAME = N'DbName_dat', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Backup\DbName_2011_01_17.ss' ) AS SNAPSHOT OF [DbName]
GO


-- сделать бэкап
BACKUP DATABASE DbNameSuperName
TO DISK='C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Backup\DbNameSuperName.bak' with FORMAT



-- восстановить из бэкапа

-- определяем ключи
restore filelistonly from disk='C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Backup\ArchiveDB.bak'
-- подставляем их в запрос и выполняем восстановление
restore database ArchiveDbName_2013 from disk='C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Backup\ArchiveDB.bak'
with move 'DbName_dat' to 'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\ArchiveDbName_2013.mdf',
move 'DbName_log' to 'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\ArchiveDbName_2013.ldf'

суббота, 14 декабря 2013 г.

Расширение для Chrome с ВКонтакте скачивать музыку своими руками

Расширение для Chrome с ВКонтакте скачивать музыку своими руками 

Первым делом, самое главное - создаем файл яваскрипта script.js:


$(document).ready(function () {
    chrome.tabs.getSelected(null, function (tab) {
        var url = tab.url;
        if (url.indexOf("http://vk.com/audio") > -1) {
            xhr = new XMLHttpRequest();
            xhr.open("GET", url, true);
            xhr.send(null);
            xhr.onreadystatechange = function () {
                if (xhr.readyState == 4) {
                    if (xhr.responseText) {
                        var data = xhr.responseText;
                        var newS = '';
                        $('.audio', data).each(function (index) {
                            var title = $(this).children('.area').children('.info').children('.title_wrap').text();
                            var href = $(this).children('.area').children('.play_btn').children('input').val();
                            href = href.substring(0, href.indexOf('.mp3') + 4);
                            title = '<a href="' + href + '" download>' + title + '</a>';
                            $('#wrapper').append(title + '<br />');
                        });
                    }
                }
            }
        } else {
            $('#wrapper').html('Audio is empty');
        }
    });
});


Далее создаем манифест файл manifest.json:

{
"manifest_version":2,
"name":"VK",
"version":"1.0",
"description":"VK",
"permissions": [
"http://vk.com/*",
"tabs"
],
"browser_action": {
"default_title":"VK",
"default_icon":"icon.png",
"default_popup":"popup.html"
}
}


Файл popup.html

<!DOCTYPE html>
<html>
<head>
<meta charset="windows-1251" />
<title>Document</title>
<meta name="keywords" content="" />
<meta name="description" content="" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="jquery.js"></script>
<script src="script.js"></script>
<style>
*{margin:0; padding:0;}
a, a:visited{color:#0857a6}
body{width:1000px;padding:10px;font-family:Trebuchet MS, Arial, Tahoma, Sans;overflow:auto;}
</style>
</head>
<body>
<div id="wrapper"></div>
</body>
</html>

Не забудьте создать иконку icon.png и подключить jquery
например так
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8/jquery.min.js"></script>
но лучше скачать его и сделать локальным.


вторник, 10 декабря 2013 г.

VBA and MS Word: count dublicates

VBA - Подсчет повторов в файле Word

Имеем вордовский документ с набором одинаковых строчек, уже отсортированных по-алфавиту. Нужно убрать повторения, оставив уникальные строчки и дописав к ним сколько их было изначально:

Sub WordCounter()
   s = ""
   For u = 1 To ActiveDocument.Paragraphs(1).Range.Characters.Count - 1
      s = s + ActiveDocument.Paragraphs(1).Range.Characters(u)
   Next u
   j = 0
   k = 1
   For i = 1 To ActiveDocument.Paragraphs.Count
      f = ""
      For u = 1 To ActiveDocument.Paragraphs(i).Range.Characters.Count - 1
         f = f + ActiveDocument.Paragraphs(i).Range.Characters(u)
      Next u
      If s = f Then
         j = j + 1
      Else
         ActiveDocument.Paragraphs(k).Range.Select
         Selection.TypeText (s + Str(j))
         j = 1
         s = ""
         For u = 1 To ActiveDocument.Paragraphs(i).Range.Characters.Count - 1
            s = s + ActiveDocument.Paragraphs(i).Range.Characters(u)
         Next u
         k = k + 1
      End If
   Next i
   ActiveDocument.Paragraphs(k).Range.Select
   Selection.TypeText (s + Str(j))
   For i = ActiveDocument.Paragraphs.Count To k + 1 Step -1
         ActiveDocument.Paragraphs(i).Range.Select
         Selection.TypeBackspace
   Next i
End Sub


Regular Expressions

Регулярные выражения


Словосочетание «регулярные выражения», прямой перевод английского «Regular expressions», звучит довольно неуклюже.
Однако оно уже настолько прижилось, что попало в словари, поэтому придется использовать именно его – за неимением лучшего.

Регулярные выражения – это один из способов поиска подстрок (соответствий) в строках. Осуществляется это с помощью просмотра строки в поисках некоторого шаблона.
Общеизвестным примером могут быть символы «*» и «?», используемые в командной строке DOS.

Синтаксис регулярных выражений, использующийся в NovA FileRenamer, соответствует полному POSIX стандарту, а также поддерживает расширенный синтаксис языка Perl.

Шаблон поиска (регулярное выражение) - это простая строка и любые символы в этой строке, которые не являются специальными (зарезервированными), считаются обычными символами.
Каждый символ регулярного выражения последовательно сравнивается с проверяемой строкой (в случае FileRenamer'а - имя файла).
Все, что не является указанными ниже спецсимволами или операторами, воспринимается, как обычный символ, рассматриваемый на простое совпадение.



Спецсимволы 

Символы ".", "|", "*", "?", "+", "(", ")", "{", "}", "[", "]", "^", "$" и "\" являются зарезервированными. Но если перед таким символом поставить "\", он становится обычным.



Универсальный символ (wildcard)

Точка "." заменяет собой любой символ, в том числе пустой.



Квантификаторы, они же умножители (Quantifiers) 

Если неизвестно, сколько именно знаков должна содержать искомая подстрока, можно использовать спецсимволы, так называемые, умножители.
Например, можно написать "hel+o", что будет означать слово, начинающееся с "He", со следующими за ним одно или несколько "l", и заканчивающееся на "о".

Вот список поддерживаемых квантификаторов:
Символ   Описание
  *      Соответствует 0 или более вхождений предшествующего выражения.
         Например, "zo*" соответствует "z" и "zoo".
  +      Соответствует 1 или более предшествующих выражений.
         Например, "zo+" соответствует "zo" и "zoo", но не "z".
  ?      Соответствует 0 или 1 предшествующих выражений.
         Например, "do(es)?" соответствует "do" в "do" или "does".
 {n}     n – неотрицательное целое. Соответствует точному количеству вхождений.
         Например, "o{2}" не найдет "o" в "Bob",но найдет два "o"" в "food".
 {n,}    n – неотрицательное целое. Соответствует вхождению, повторенному не менее n раз.
         Например, "o{2,}" не находит "o" в "Bob", зато находит все "o" в "foooood".
         "o{1,}" эквивалентно "o+". "o{0,}" эквивалентно "o*".
{n,m}    m и n – неотрицательные целые числа, где n <= m. Соответствует минимум n и
         максимум m вхождений. Например, "o{1,3}" находит три первые "o" в "fooooood".
         "o{0,1}" эквивалентно "o?". Пробел между запятой и цифрами недопустим.

Квантификаторы относятся к наиболее короткому предшествующему выражению: например, одиночный символ, набор символов или подвыражение в скобках.


Жадность

Важной особенностью квантификаторов "*" и "+" является их всеядность. Они находят все, что смогут – вместо того, что нужно.
Например, регулярное выражение "h.*o" в строке "hello out there, how are you" найдёт "hello out there, how are yo", хотя в виду, наверное, имелось "hello".
Так происходит из-за жадности регулярного выражения, ищущего не первую, а последнюю "о". Излечить квантификатор от жадности можно, добавив "?".
То есть, "h.*?o" найдёт найдет именно "hello", что и было нужно, поскольку ищет "h", за которым следует несколько произвольных символов, до первого встреченного "o".



Группировка 

Круглые скобки "(" и ")" служат двум целям - для группирования символов в подвыражения и запоминания того, что этим выражениям соответствует.
Запомненные соответствия в дальнейшем могут использоваться в строке замены, в которой \N обозначает N'ую часть соответствия.
Например, шаблон "(ab)*" найдёт всю строку "ababab", а вместо \1 будет подставлено "ab". Подвыражения нумеруются слева направо с 1 до 9, подвыражение 0 является всем шаблоном.

Если нужно сгруппировать символы, но запоминать это подвыражение не надо (например, чтобы не разбить другое подвыражение верхнего уровня), то следует использовать конструкцию (?:выражение).
Например, шаблон "(?:abc)*" не создаёт подвыражений.



Lookahead-условия

Иногда нужно сказать "найдите вот это, но только если за ним (не)стоит вот этого". Для этого используются так называемые lookahead-условия двух типов:

Положительное lookahead-условие "re1(?=re2)"
   Соответствует регулярному выражению re1, только если за ним следует выражение re2.
Отрицательное lookahead-условие "re1(?!re2)"
   Соответствует регулярному выражению re1, только если за ним не следует выражение re2.
Например, шаблон "abc(?=def)" в строке "abcdef" найдёт "abc", а в строке "abcghi" нет.


Вариации 

Символ "|" можно использовать для перебора нескольких вариантов - выражение re1|re2|re3 будет соответствовать регулярному выражению re1 или re2 или re3.
Каждый вариант - наиболее длинное предшедствующее подвыражение (поведение противоположное квантификаторам).

Примеры:
"a(b|c)" совпадёт с "ab" или "ac"
"abc|def" совпадёт с "abc" или "def".



Наборы символов (Sets) 

Используя квадратные скобки "[" и "]", можно указать группу символов (набор) для поиска.
Набор может содержать обычные символы, диапазоны символов, классы символов и классы похожих символов (equivalence classes).
С помощью конструкции "[^список]" можно указать символы, которых не должно содержаться в найденной подстроке.

Примеры:
Наборы обычных символов:
"[abc]" совпадёт с "a", "b" или "c"
"[^abc]" совпадёт с любым символом кроме "a", "b" или "c"

Диапазоны символов:
"[a-z]" совпадёт с любым символом из диапазона от "a" до "z"
"[^A-Z]" совпадёт с символом, который не лежит в диапазоне от "A" до "Z"

Классы символов указываются в наборе с помощью конструкции "[:имя_класса:]". Например, "[[:space:]]" находит любые символы пробела. В FileRenamer'е доступны следующие классы символов:
alnum    алфавитно-цифровой символ (буква, цифра)
alpha    любая буква
digit    цифра 0-9
lower    строчная (маленькая) буква
punct    символ пунктуации
space    любой символ пробела
upper    заглавная (большая) буква
xdigit   шестнадцатиричная цифра - 0-9, a-f и A-F
word     любой встречающийся в слове символ - алфавитно-цифровой и символ подчёркивания

Вместо полного названия класса символов можно использовать сокращения:
\w вместо [:word:]
\s вместо [:space:]
\d вместо [:digit:]
\l вместо [:lower:]
\u вместо [:upper:]

Для того чтобы включить символ "-" (дефис) в набор символов, поставьте его либо первым (после "[" или "[^") либо последним (перед "]"), также можно использовать escape-символ \ как в "[\-]".
Для того чтобы включить символы "[", "]" или "^" в набор символов, поставьте их в конец (перед "]") или используйте escape-символ \.



Концы и начала строк

Проверка начала или конца строки производится с помощью метасимволов ^ и $.
Например, "^thing" соответствует строке, начинающейся с "thing". "thing$" соответствует строке, заканчивающейся на "thing".

В регулярных выражениях общего вида можно также проверять начало и конец всего текста. Но применительно к FileRenamer'у текст это имя файла/папки, т.е. строка.
Поэтому следующие операторы можно воспринимать как эквиваленты вышеприведённых.

"\`", "\A" начало текста
"\'", "\z", "\Z" конец текста


Операторы слова

\w   символ слова (эквивалентно выражению "[[:word:]]" - буквы, цифры, "_")
\W   символ не слова (эквивалентно выражению "[^[:word:]]")
\<   начало слова (например "\   конец слова (напрмер "out\>" соответствует "out" в "shout")
\b   граница слова (либо начало, либо конец)
\B   внутри слова


Обратные ссылки 

Обратная ссылка - это ссылка на предыдущее подвыражение (группа в скобках), уже совпавшее с некоторой подстрокой; ссылка на то, что совпало, а не на само регулярное выражение.

Обратная ссылка состоит и escape-символа "\" и следующей за ним цифры от "1" до "9", "\1" ссылается на первое подвыражение, "\2" на второе и т.д.
Например, выражение "(.*)\1" совпадает со строкой составленной из двух одинаковых частей, например "abcabc" или "xyzxyz".
Обратная ссылка на подвыражение, которое ни с чем не совпало даёт пустую строку.


Символы по коду 

В шаблоне можно указать символ для поиска по его коду.
Для этого используется следующий синтаксис: escape-символ "\", за ним ноль "0" и, наконец, восьмиричный код символа.
Например, "\023" обозначает символ с восьмиричным кодом 23.
Там где может появиться двусмысленность, используйте скобки чтобы разбить выражение: "\0103" - символ с кодом 103, "(\010)3" - символ с кодом 10 за которым идёт "3".
Можно также указывать символы по их шестнадцатиричному коду. Для этого поставьте "\x" и за ним строку шестнадцатиричных цифр, опционально заключённую в {}, например, \xf0 или \x{af}


Escape-символ 

Escape-символ "\" имеет несколько значений. С помощью него обозначается операторы, например, обратные ссылки или операторы слова.
Escape-символ может делать последующий символ обычным, например, "\*" есть обычный символ "*" а не квантификатор (умножитель).

Следующие escape-последовательности представлены в основном для совместимости с Perl'ом (значения \l \L \u и \U имеют некоторые отличия):
  \w   эквивалентно [[:word:]]
  \W   эквивалентно [^[:word:]]
  \s   эквивалентно [[:space:]]
  \S   эквивалентно [^[:space:]]
  \d   эквивалентно [[:digit:]]
  \D   эквивалентно [^[:digit:]]
  \l   эквивалентно [[:lower:]]
  \L   эквивалентно [^[:lower:]]
  \u   эквивалентно [[:upper:]]
  \U   эквивалентно [^[:upper:]]
  \C   любой символ, эквивалентно "."
  \Q   начало цитаты, все символы после этого оператора
       рассматриваются как обычные пока не встретиться \E
  \E   конец цитаты, завершает последовательность, начинающуюся с \Q





Синтаксис строки замены 


Поиск с использованием регулярных выражений в FileRenamer'е предполагает замену найденного некоторой строкой. В этой строке символы "\" и "&" являются специальными,
чтобы использовать их как обычные символы поставьте впереди escape-символ "\".

В строке замены распознаются следующие специальные последовательности:

\N, где N - цифра, заменяется на N'ый компонент выражения поиска (группу в скобках)
& заменяется на всю найденную подстроку, эквивалентно \0
Эти операторы можно использовать, например, при поиске выражения и последующего изменения порядка его компонентов.
Например, введите "(Годунов) (Борис)" в поле "Заменить:" и "\2 \1" в поле "На:", чтобы найти словосочетание «Годунов Борис» и заменить его на «Борис Годунов».


понедельник, 9 декабря 2013 г.

MS SQL запрос для нахождения связанных ключей в базе данных


MS SQL запрос для нахождения связанных ключей в базе данных



SELECT  TOP 100 PERCENT  FK.COLUMN_NAME AS Field, PK.COLUMN_NAME AS Source, FK.TABLE_NAME AS FieldTab, PK.TABLE_NAME AS SourceTab
FROM   INFORMATION_SCHEMA.KEY_COLUMN_USAGE PK   INNER JOIN  
INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C ON PK.CONSTRAINT_CATALOG = C.UNIQUE_CONSTRAINT_CATALOG AND
PK.CONSTRAINT_SCHEMA = C.UNIQUE_CONSTRAINT_SCHEMA AND PK.CONSTRAINT_NAME = C.UNIQUE_CONSTRAINT_NAME INNER JOIN  
INFORMATION_SCHEMA.KEY_COLUMN_USAGE FK ON C.CONSTRAINT_CATALOG = PK.CONSTRAINT_CATALOG AND    
C.CONSTRAINT_SCHEMA = FK.CONSTRAINT_SCHEMA AND C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME AND
PK.ORDINAL_POSITION = FK.ORDINAL_POSITION 


суббота, 7 декабря 2013 г.

MS SQL stored procedure with cursor and temprary table


MS SQL использование временных таблиц для наполнения и возвращения данных при выполнении хранимых процедур в цикле, с использованием курсора



ALTER PROCEDURE spTemprary
AS  SET NOCOUNT ON
-- определяем переменные
DECLARE @cur   NVARCHAR(50)
DECLARE @var   NVARCHAR(550)
DECLARE @inc   int
DECLARE @coun  int
-- удаляем временную таблицу если она существует
IF OBJECT_ID('tempdb..##Temp') IS NOT NULL BEGIN DROP TABLE ##Temp END
-- создаем временную таблицу если она не существует
IF OBJECT_ID('tempdb..##Temp') IS NULL
begin
CREATE  TABLE  ##Temp (
N char(5), -- номер строки итоговой таблицы
Cat varchar(255), -- описание выводимой строки данных
Counter int -- общее количество
);
end
-- добавляем строки
set @var = 'INSERT  INTO ##Temp (N, Cat)   SELECT  ''1.'' , ''All cats''  ;'
EXEC (@var);
-- обновляем строки
    set @var = 'UPDATE  ##Temp  SET Counter=(SELECT  COUNT(DISTINCT dbo.Table1.Code) AS Expr
    FROM  dbo.TAble1
)'
EXEC (@var);
-- устанавливаем счетчик
SET @inc  = 1
-- цикл с применением курсора
DECLARE db_cursor CURSOR FOR
  SELECT Name FROM Table2
-- открываем курсор
OPEN db_cursor  
FETCH NEXT FROM db_cursor INTO @cur
WHILE @@FETCH_STATUS = 0  
BEGIN  
      SET @inc  = @inc+1
   SET @coun = ( SELECT   COUNT(DISTINCT dbo.Table1.Code) AS Expr
   FROM     dbo.Table1
   WHERE    (dbo.Table1.Name = @cur) )
   INSERT INTO  ##Temp (N, Cat, Counter) VALUES (rtrim(CAST(@inc AS char(3)))+'.', @cur, @coun)
     FETCH NEXT FROM db_cursor INTO @cur
END
-- закрываем курсор
CLOSE db_cursor  
-- освобождаем память
DEALLOCATE db_cursor
-- возвращаем результат
SELECT   *  FROM  dbo.[##Temp] RETURN
RETURN 

MS SQL stored procedure with cursor


Простая хранимая процедура MS SQL с циклом и курсором



ALTER PROCEDURE spReference
AS
SET NOCOUNT ON
/*Переменные*/
DECLARE @ID NVARCHAR(50)
-- DECLARE @VAL VARCHAR (500)
/*Табличная переменная*/
DECLARE @Table_tmp TABLE ( cat varchar(50), project varchar(50), counts int )
/*Объявляем курсор*/
DECLARE @CURSOR CURSOR
 /*Заполняем курсор*/
 SET @CURSOR  = CURSOR SCROLL
 FOR
 SELECT Project  FROM  Projects   WHERE  Status = 1
  /*Открываем курсор*/
  OPEN @CURSOR
  /*Выбираем первую строку*/
  FETCH NEXT FROM @CURSOR INTO @ID
  /*Выполняем в цикле перебор строк*/
WHILE @@FETCH_STATUS = 0
BEGIN
        IF EXISTS(SELECT DISTINCT Name FROM TableName WHERE Name=@ID)
        BEGIN
     /*Вставляем параметры в таблицу если условие соблюдается*/
     -- INSERT INTO @Table_tmp (cat, project, counts) VALUES('1', @ID, @ID)
INSERT INTO @Table_tmp ( cat, project, counts)
SELECT tableFunctionInfo.* FROM dbo.tableFunctionInfo(@ID) tableFunctionInfo
END
/*Выбираем следующую строку*/
FETCH NEXT FROM @CURSOR INTO @ID
END
CLOSE @CURSOR
-- возвращаем таблицу SELECT  *  FROM  @Table_tmp
RETURN 




MS SQL procedure of create users at the current database with role from other database


Предоставление пользователям прав из одной базы на доступ к просмотру данных в другой базе расположенных на одном сервере MS SQL:


ALTER PROCEDURE spUsersCreater
AS  SET NOCOUNT ON
-- определяем переменные
DECLARE @cur  NVARCHAR(50)
DECLARE @object  NVARCHAR(150)
DECLARE @sql   NVARCHAR(250)
  SET  @object = 'role_allveiw'
-- цикл с применением курсора
DECLARE db_cursor CURSOR FOR
  SELECT Login FROM  DBname.dbo.Users WHERE (Active = 1)
-- открываем курсор
OPEN db_cursor  
FETCH NEXT FROM db_cursor INTO @cur
WHILE @@FETCH_STATUS = 0  
BEGIN  
                 SET  @sql = 'CREATE USER ['+@cur+'] FOR LOGIN ['+@cur+'] WITH DEFAULT_SCHEMA=['+@cur+'] '
                 EXEC (@sql)
 EXEC sp_addrolemember @object, @cur
       FETCH NEXT FROM db_cursor INTO @cur
END
-- закрываем курсор
CLOSE db_cursor  
-- освобождаем память
DEALLOCATE db_cursor

RETURN 

воскресенье, 1 декабря 2013 г.

Генерация нового названия, если файл с таким именем уже существует на PHP


Генерация нового названия, если файл с таким именем уже существует на PHP



function file_newname($path, $filename){
    if ($pos = strrpos($filename, '.')) {
           $name = substr($filename, 0, $pos);
           $ext = substr($filename, $pos);
    } else {
           $name = $filename;
    }
    $newpath = $path.'/'.$filename;
    $newname = $filename;
    $counter = 0;
    while (file_exists($newpath)) {
           $newname = $name .'_'. $counter . $ext;
           $newpath = $path.'/'.$newname;
           $counter++;
     }
    return $newname;
}


Постоянные читатели

Популярные сообщения