четверг, 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;
}


суббота, 30 ноября 2013 г.

List tables with structure in MySQL


Получить список таблиц и их структуру в MySQL  


SHOW DATABASES; - список баз данных
SHOW TABLES [FROM db_name]; -  список таблиц в базе
SHOW COLUMNS FROM таблица [FROM db_name]; - список столбцов в таблице
SHOW CREATE TABLE table_name; - показать структуру таблицы в формате "CREATE TABLE"
SHOW INDEX FROM tbl_name; - список индексов
SHOW GRANTS FOR user [FROM db_name]; - привилегии для пользователя.


SHOW VARIABLES; - значения системных переменных
SHOW [FULL] PROCESSLIST; - статистика по mysqld процессам
SHOW STATUS; - общая статистика
SHOW TABLE STATUS [FROM db_name]; - статистика по всем таблицам в базе


Kill all queries in MySQL

Определение и уничтожение нежелательных запросов в MySQL



Показать все запущенные запросы можно так:

SHOW PROCESSLIST

Или можно показать все запущенные запросы с условием:

SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND = 'Query' AND TIME > 10


Убить нежелательный запрос можно по идентификатору, полученному из предыдущих запросов:
KILL "ID";

Но можно и пакетно удалить все нежелательные запросы по условию:

SELECT CONCAT('KILL ',ID,';') FROM   INFORMATION_SCHEMA.PROCESSLIST
WHERE  USER = 'loginweb'  AND COMMAND = 'Query'  AND TIME > 10;




среда, 27 ноября 2013 г.

Delphi: Windows System Tray with API Shell_NotifyIcon

Помещаем иконку в трей на Delphi


uses
ShellApi;
const
  WM_ICONTRAY = WM_USER + 1;
type
  TMainForm = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    TrayIconData: TNotifyIconData;
    { Private declarations }
  public
    { Public declarations }
    procedure TrayMessage(var Msg: TMessage); message WM_ICONTRAY;
  end;



procedure TForm1.FormCreate(Sender: TObject);
begin
  with TrayIconData do
  begin
    cbSize:= SizeOf(TrayIconData);
    Wnd:= Handle;
    uID:= 0;
    uFlags:= NIF_MESSAGE + NIF_ICON + NIF_TIP;
    uCallbackMessage:= WM_ICONTRAY;
    hIcon:= Application.Icon.Handle;
    szTip:= 'Допустим, название Вашего приложения';
  end;
  Shell_NotifyIcon(NIM_ADD, @TrayIconData);
end;



procedure TForm1.FormDestroy(Sender: TObject);
begin
  Shell_NotifyIcon(NIM_DELETE, @TrayIconData);
end;
procedure TForm1.TrayMessage(var Msg: TMessage);
var
  P: TPoint;
begin
  case Msg.LParam of
    WM_LBUTTONDOWN:
      ShowMessage('Нажата левая кнопка мыши');
    WM_RBUTTONDOWN:
    begin
      GetCursorPos(p);
      PopupMenu1.Popup(P.X, P.Y);
    end;
  end;
end;






вторник, 26 ноября 2013 г.

PHP: Simplest Parse XML with Simplexml

Parser XML with PHP:


$xml_string = "<?xml version='1.0'?>
    <users>
       <user id='2' status='Admin'>
          <username>Mikki Mau</username>
          <useremail>mikki@mydomain.com</useremail>
       </user>
       <user id='3' status='User'>
          <username>Miki Mau</username>
          <useremail>mikki@mydomain.com</useremail>
       </user>
    </users>";
$xml = simplexml_load_string($xml_string);
foreach ($xml->user as $user) {
    //Get "id" and "status" attributes
    echo $user['id'].' ('.$user['status'].')<br>';
    //Get subnodes
    echo $user->username. '<br>';
    echo $user->useremail. '<br>';
}

RSS example on PHP and HTML



RSS файл
----------

<?php
 header("Content-Type: text/xml");
 echo "<?xml version=\"1.0\" encoding=\"windows-1251\"?>";
?>

<rss version="2.0">
<channel>
<title>Название канала</title>
<link>Сайт</link>
<description>Описание</description>
<language>Язык</language>

<item>
<title>название</title>
 <link>ссылка на заметку</link>
<description>текст</description>
<author>email автора</author>
<guid>ссылка на заметку</guid>
</item>

</channel>
</rss>

Фаил index
-------
<link rel="alternate" type="application/rss+xml" title="Lessons RSS" href="http://www.site.info/rss.php" />







РЕАЛИЗАЦИЯ


<?php
require(lala-lala.db);

header("Content-Type: text/xml");
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";

echo '<rss version="2.0">
<channel>';

$start=0;
$limit=50;
$db = new Mysqli;
$db->connectdb();
$request = ("SELECT * FROM `wp_posts` WHERE  `post_status` ='publish' AND `post_type` = 'post' ORDER BY ID DESC LIMIT $start, $limit");
$array=$db->mysqli_array($request);
$data = '<title>'.SITE_NAME.'</title>';
$data.= '<link>'.URL.'</link>';
$data.= '<description>'.DESCRIPTION.'</description>';
$data.= '<language>ru</language> ';

if ($array) {
foreach($array as $id=>$myrow) {
$data.= '<item>';
$data.= '<title>'.$myrow["post_title"].'</title>';
$data.= '<link>'.$myrow["post_name"].'</link>';
$data.= '<description>'.strip_tags(htmlspecialchars($myrow["post_excerpt"])).'</description>';
$data.= '<author>'.EMAIL.'</author>';
$data.= '<guid>'.$myrow["post_name"].'</guid>';
$data.= '</item>';
}
}

echo $data.'</channel>
</rss>';
// В шапку добавить: <link rel="alternate" type="application/rss+xml" title="RSS" href="http://www.site.info/rss.php" />
?>

Класс PHP-MySQLi-Database-Class-master





Пример реализации:


----.....

 'Inserted title',
'body' => 'Inserted body'
);
$results = $db->insert('posts', $insertData);
print_r($results);
?>





Сам класс: 


 * @author Josh Campbell
 * @copyright Copyright (c) 2010
 * @license http://opensource.org/licenses/gpl-3.0.html GNU Public License
 * @version 1.1
 **/
class MysqliDB {
/**
* Static instance of self
*
* @var object
*/
protected static $_instance;
/**
* MySQLi instance
*
* @var object
*/
protected $_mysqli;
/**
* The SQL query to be prepared and executed
*
* @var object
*/
protected $_query;
/**
* An array that holds where conditions 'fieldname' => 'value'
*
* @var array
*/
protected $_where = array();
/**
* Dynamic type list for where condition values
*
* @var array
*/
protected $_whereTypeList;
/**
* Dynamic type list for table data values
*
* @var array
*/
protected $_paramTypeList;
/**
* Dynamic array that holds a combination of where condition/table data value types and parameter referances
*
* @var array
*/
protected $_bindParams = array(''); // Create the empty 0 index
public function __construct($host, $username, $password, $db) {
$this->_mysqli = new mysqli($host, $username, $password, $db)
or die('There was a problem connecting to the database');
self::$_instance = $this;
}
/**
* A method of returning the static instance to allow access to the
* instantiated object from within another class.
* Inheriting this class would require reloading connection info.
*
* @uses $db = MySqliDb::getInstance();
*
* @return object Returns the current instance.
*/
public static function getInstance()
{
return self::$_instance;
}
/**
* Reset states after an execution
*
* @return object Returns the current instance.
*/
protected function reset()
{
$this->_where = array();
$this->_bindParams = array(''); // Create the empty 0 index
unset($this->_query);
unset($this->_whereTypeList);
unset($this->_paramTypeList);
}
/**
* Pass in a raw query and an array containing the parameters to bind to the prepaird statement.
*
* @param string $query Contains a user-provided query.
* @param array $bindData All variables to bind to the SQL statment.
* @return array Contains the returned rows from the query.
*/
public function rawQuery($query, $bindParams = NULL)
{
$this->_query = filter_var($query, FILTER_SANITIZE_STRING);
$stmt = $this->_prepareQuery();
if (gettype($bindParams) === 'array') {
$params = array(''); // Create the empty 0 index
foreach ($bindParams as $prop => $val) {
$params[0] .= $this->_determineType($val);
array_push($params, $bindParams[$prop]);
}
                call_user_func_array(array($stmt, "bind_param"),$this->refValues($params));
}
$stmt->execute();
$this->reset();
$results = $this->_dynamicBindResults($stmt);
return $results;
}
/**
*
* @param string $query Contains a user-provided select query.
* @param int $numRows The number of rows total to return.
* @return array Contains the returned rows from the query.
*/
public function query($query, $numRows = NULL)
{
$this->_query = filter_var($query, FILTER_SANITIZE_STRING);
$stmt = $this->_buildQuery($numRows);
$stmt->execute();
$this->reset();
$results = $this->_dynamicBindResults($stmt);
return $results;
}
/**
* A convenient SELECT * function.
*
* @param string $tableName The name of the database table to work with.
* @param integer $numRows The number of rows total to return.
* @return array Contains the returned rows from the select query.
*/
public function get($tableName, $numRows = NULL)
{
$this->_query = "SELECT * FROM $tableName";
$stmt = $this->_buildQuery($numRows);
$stmt->execute();
$this->reset();
$results = $this->_dynamicBindResults($stmt);
return $results;
}
/**
*
* @param _query = "INSERT into $tableName";
$stmt = $this->_buildQuery(NULL, $insertData);
$stmt->execute();
$this->reset();
($stmt->affected_rows) ? $result = $stmt->insert_id : $result = false;
return $result;
}
/**
* Update query. Be sure to first call the "where" method.
*
* @param string $tableName The name of the database table to work with.
* @param array $tableData Array of data to update the desired row.
* @return boolean
*/
public function update($tableName, $tableData)
{
$this->_query = "UPDATE $tableName SET ";
$stmt = $this->_buildQuery(NULL, $tableData);
$stmt->execute();
$this->reset();
($stmt->affected_rows) ? $result = true : $result = false;
return $result;
}
/**
* Delete query. Call the "where" method first.
*
* @param string $tableName The name of the database table to work with.
* @param integer $numRows The number of rows to delete.
* @return boolean Indicates success. 0 or 1.
*/
public function delete($tableName, $numRows = NULL) {
$this->_query = "DELETE FROM $tableName";
$stmt = $this->_buildQuery($numRows);
$stmt->execute();
$this->reset();
($stmt->affected_rows) ? $result = true : $result = false;
return $result;
}
/**
* This method allows you to specify multipl (method chaining optional) WHERE statements for SQL queries.
*
* @uses $MySqliDb->where('id', 7)->where('title', 'MyTitle');
*
* @param string $whereProp The name of the database field.
* @param mixed $whereValue The value of the database field.
*/
public function where($whereProp, $whereValue)
{
$this->_where[$whereProp] = $whereValue;
return $this;
}

        /**
* This methods returns the ID of the last inserted item
*
* @return integer The last inserted item ID.
*/
public function getInsertId()
{
        return $this->_mysqli->insert_id;
    }
/**
* Escape harmful characters which might affect a query.
*
* @param string $str The string to escape.
* @return string The escaped string.
*/
public function escape ( $str )
{
return $this->_mysqli->real_escape_string ( $str );
}
/**
* This method is needed for prepared statements. They require
* the data type of the field to be bound with "i" s", etc.
* This function takes the input, determines what type it is,
* and then updates the param_type.
*
* @param mixed $item Input to determine the type.
* @return string The joined parameter types.
*/
protected function _determineType($item)
{
switch (gettype($item)) {
case 'NULL':
case 'string':
return 's';
break;
case 'integer':
return 'i';
break;
case 'blob':
return 'b';
break;
case 'double':
return 'd';
break;
}
}
/**
* Abstraction method that will compile the WHERE statement,
* any passed update data, and the desired rows.
* It then builds the SQL query.
*
* @param int $numRows The number of rows total to return.
* @param array $tableData Should contain an array of data for updating the database.
* @return object Returns the $stmt object.
*/
protected function _buildQuery($numRows = NULL, $tableData = NULL)
{
(gettype($tableData) === 'array') ? $hasTableData = true : $hasTableData = false; (!empty($this->_where )) ? $hasConditional = true : $hasConditional = false;
// Did the user call the "where" method?
if (!empty($this->_where)) {
// if update data was passed, filter through and create the SQL query, accordingly.
if ($hasTableData) {
$i = 1;
$pos = strpos($this->_query, 'UPDATE');
if ( $pos !== false) {
foreach ($tableData as $prop => $value) {
// determines what data type the item is, for binding purposes.
$this->_paramTypeList .= $this->_determineType($value);
// prepares the reset of the SQL query.
($i === count($tableData)) ?
$this->_query .= $prop . ' = ?':
$this->_query .= $prop . ' = ?, ';
$i++;
}
}
}
//Prepair the where portion of the query
$this->_query .= ' WHERE '; $i = 1;
foreach ($this->_where as $column => $value) {
// Determines what data type the where column is, for binding purposes.
$this->_whereTypeList .= $this->_determineType($value);
// Prepares the reset of the SQL query.
($i === count($this->_where)) ?
$this->_query .= $column . ' = ?':
$this->_query .= $column . ' = ? AND ';
$i++;
}
}
// Determine if is INSERT query
if ($hasTableData) {
$pos = strpos($this->_query, 'INSERT');
if ($pos !== false) {
//is insert statement
$keys = array_keys($tableData);
$values = array_values($tableData);
$num = count($keys);
// wrap values in quotes
foreach ($values as $key => $val) {
$values[$key] = "'{$val}'";
$this->_paramTypeList .= $this->_determineType($val);
}
$this->_query .= '(' . implode($keys, ', ') . ')';
$this->_query .= ' VALUES(';
while ($num !== 0) {
($num !== 1) ? $this->_query .= '?, ' : $this->_query .= '?)';
$num--;
}
}
}
// Did the user set a limit
if (isset($numRows)) {
$this->_query .= " LIMIT " . (int) $numRows;
}
// Prepare query
$stmt = $this->_prepareQuery();
// Prepare table data bind parameters
if ($hasTableData) {
$this->_bindParams[0] = $this->_paramTypeList;
foreach ($tableData as $prop => $val) {
array_push($this->_bindParams, $tableData[$prop]);
}
}
// Prepare where condition bind parameters
if($hasConditional) {
if ($this->_where) {
$this->_bindParams[0] .= $this->_whereTypeList;
foreach ($this->_where as $prop => $val) {
array_push($this->_bindParams, $this->_where[$prop]);
}
} }
// Bind parameters to statment
if ($hasTableData || $hasConditional){
call_user_func_array(array($stmt, "bind_param"),$this->refValues($this->_bindParams));
}
return $stmt;
}
/**
* This helper method takes care of prepared statements' "bind_result method
* , when the number of variables to pass is unknown.
*
* @param object $stmt Equal to the prepared statement object.
* @return array The results of the SQL fetch.
*/
protected function _dynamicBindResults($stmt)
{
$parameters = array();
$results = array();
$meta = $stmt->result_metadata();
$row = array();
while ($field = $meta->fetch_field()) {
$row[$field->name] = NULL;
$parameters[] = &$row[$field->name];
}
        call_user_func_array(array($stmt, "bind_result"),$parameters);
while ($stmt->fetch()) {
$x = array();
foreach ($row as $key => $val) {
$x[$key] = $val;
}
array_push($results, $x);
}
return $results;
}
/**
* Method attempts to prepare the SQL query
* and throws an error if there was a problem.
*/
protected function _prepareQuery()
{
if (!$stmt = $this->_mysqli->prepare($this->_query)) {
trigger_error("Problem preparing query ($this->_query) ".$this->_mysqli->error, E_USER_ERROR);
}
return $stmt;
}
public function __destruct()
{
$this->_mysqli->close();
}
function refValues($arr)
{
//Reference is required for PHP 5.3+
if (strnatcmp(phpversion(),'5.3') >= 0) {
        $refs = array();
        foreach($arr as $key => $value)
            $refs[$key] = &$arr[$key];
        return $refs;
    }
  return $arr;
}
} // END class

воскресенье, 24 ноября 2013 г.

Перекодировать текст из utf-8 в windows-1251(cp-1251) на PHP

Перекодировать текст из utf-8 в windows-1251(cp-1251) на PHP 



<?php echo iconv("utf-8", "windows-1251", "Пора переходить на cp-1251."); ?>

Простой класс для работы с базой данных

Простой класс для работы с базой данных



class DB {
    private static $instance;
    private $MySQLi;
    private function __construct(array $dbOptions){
        $this->MySQLi = @ new mysqli($dbOptions['db_host'],$dbOptions['db_user'], $dbOptions['db_pass'],$dbOptions['db_name'] );
        if (mysqli_connect_errno()) {
             throw new Exception('Ошибка базы данных.');
        }
        $this->MySQLi->set_charset("utf8");
    }
    public static function init(array $dbOptions){
        if(self::$instance instanceof self){
            return false;
        }
        self::$instance = new self($dbOptions);
    }
    public static function getMySQLiObject(){
        return self::$instance->MySQLi;
    }
    public static function query($q){
        return self::$instance->MySQLi->query($q);
    }
    public static function esc($str){
        return self::$instance->MySQLi->real_escape_string(htmlspecialchars($str));
    }
    public static function insert_id($str){
        return self::$instance->MySQLi->insert_id;
    }
    public static function affected_rows(){
        return self::$instance->MySQLi->affected_rows;
    }
}



Пример работы с классом


<?php
/* Конфигурация базы данных. Добавьте свои данные */
$dbOptions = array(
    'db_host' => 'localhost',
    'db_user' => '',
    'db_pass' => '',
    'db_name' => ''
);
//Имя таблицы, в которой хранятся заметки
$table_name = 'articles';
//Подключаем класс для работы с базой данных
require "db.class.php";
// Соединение с базой данных
DB::init($dbOptions);
$page_id = (!empty($_GET['id']))? intval($_GET['id']): false;
if(!$page_id){
 
    //Выбираем 3 заметки из базы данных
    $result = DB::query('SELECT * FROM '.$table_name.' LIMIT 3');
 
    //Здесь будет храниться список заметок
    $articles = array();
 
    while($row = $result->fetch_assoc()){
        $articles[] = $row;
    }
}
else{
    //Выбираем заметку из базы данных по переданному id
    $result = DB::query('SELECT * FROM '.$table_name.' WHERE id='.$page_id.' LIMIT 1');
 
    //Если такой заметки нет в базе данных
    //выводим 404 ошибку
    if(!$post = $result->fetch_assoc()){
     
        header("HTTP/1.0 404 Not Found");
        header("HTTP/1.1 404 Not Found");
        header("Status: 404 Not Found");
        die('Нет такой заметки');
     
    }
}
?>

суббота, 23 ноября 2013 г.

Способ загружать файлы без блокировки через ЯваСкрипт


Способ загружать файлы без блокировки через ЯваСкрипт:


для js (для скриптов)

var js = document.createElement('script');
js.src = 'myscript.js';
var head = document.getElementsByTagName('head')[0];
head.appendChild(js);


для css (для стилей)

var h = document.getElementsByTagName('head')[0];
var link = document.createElement('link');
link.href = 'mycss.css';
link.type = 'text/css';
link.rel = 'stylesheet';
h.appendChild(link);


Продвинутая JavaScript отладка form при помощи console.table()

Продвинутая JavaScript отладка form при помощи console.table() в console.log в браузере Chrome


[].forEach.call(document.querySelectorAll('form'), function (input) {
    var table = [];
    console.group('HTMLForm "' + input.name + '": ' + input.action);
        console.log('Element: ', input, '\nName: ' +
            input.name + '\nMethod: ' + input.method.toUpperCase() +
                         '\nAction: ' + input.action || 'null');
        ['input', 'textarea', 'select'].forEach(function (control) {
            [].forEach.call(input.querySelectorAll(control), function (node) {
                table.push({
                    'Element':      node,
                    'Type':         node.type,
                    'Name':         node.name,
                    'Value':        node.value,
                    'Pretty Value': (isNaN(node.value) || node.value === '' ?
                        node.value : parseFloat(node.value))
                });
            });
        });
 });

Весь смысл в том чтобы использовать вместо console.log(languages); табличное представление
console.table(languages);

Сканирование папки на PHP с русскими именами файлов и папок


Сканирование папки на PHP с русскими именами файлов и папок в том числе:


$uri = urldecode(mb_substr($_SERVER["REQUEST_URI"], 0, -1));

function treeList($path = "/") {
  $prefix = ($path == "") ? $_SERVER['DOCUMENT_ROOT'] : "";
  $return = preg_replace("#(.*)/(.*)$#u","\$1",$path);
  echo ' <ul> ';
  echo ' <li><a href="javascript:history.go(-1);'.$return.'">[...назад...]</a></li> ';
  foreach (glob($_SERVER['DOCUMENT_ROOT']."$path/*") as $item) {
    $isdir = (is_dir($item)) ? true : false;
    $item = str_replace(array($_SERVER['DOCUMENT_ROOT'],"//"),array("","/"),$item);
$item = iconv("utf-8", "windows-1251", $item);
    if ($isdir) echo ' <li><b><a href="'.$item.'">'.$item.'</a></b></li> ';
     else if(strpos($item,'index.php')===false) echo ' <li><a href="'.$item.'">'.$item.'</a></li> ';
    }
  echo ' </ul> ';
  }
treeList("/".$uri);




В файле .htaccess пишем:

AddDefaultCharset windows-1251
AddCharset windows-1251 *
<IfModule mod_charset.c>
CharsetSourceEnc windows-1251
CharsetDefault windows-1251
</IfModule>
 




среда, 20 ноября 2013 г.

jQuery: close popup by click on body

Чтобы скрыть всплывающее окно по клику снаружи:


$("body").click(function(e) {
    if($(e.target).closest(".popup").length==0) $(".popup").css("display","none");
});

Find Domain From a URL String

Function will take a string and find the domain name of that string.

function stringDomain($string){
    $a = explode('/',$string);
    return str_replace('www.','',$a[2]);
}
$URL = 'http://codefeel.blogspot.ru/p/site-map.html';
echo stringDomain($URL);  // prints: codefeel.blogspot.ru


Build a table using a mysql query with PHP


Создание таблицы в HTML динамически на основе запроса MySQL для PHP





require(PATH.'/app/config.php');
$link = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD)
        or die("Could not connect: " . mysql_error());
$db = mysql_select_db(DB_NAME, $link);
mysql_query("set names utf8");
$query="SELECT * FROM messages LIMIT 5";
$results = mysql_query($query);
// while ($myrows = mysql_fetch_array($results)){
// echo $myrows["name"];
// }
function displayTable($query = ""){
    $table = '';
    $sql = mysql_query($query);
    $table .= '<table>';
    $table .= '<tr>';
    while($field = mysql_fetch_field($sql)){
        $table .= '<th>'.$field->name.'</th>';
    }
    $table .= '</tr>';
    while($row = mysql_fetch_assoc($sql)){
        $table .= '<tr>';
        foreach($row as $key => $item){
            $table .= '<td style="padding-right:50px;">'.($item).'</td>';
        }
        $table .= '</tr>';
    }
    $table .= '</table>';
    return $table;
}
echo displayTable($query);



Delphi: How to Get MAC address


How to get the MAC Address with Delhi?

Установить на форму Label1 и Button1 


function GetMACAdress: string;
var
  NCB: PNCB;
  Adapter: PAdapterStatus;
  URetCode: PChar;
  RetCode: char;
  I: integer;
  Lenum: PlanaEnum;
  _SystemID: string;
  TMPSTR: string;
begin
  Result    := '';
  _SystemID := '';
  Getmem(NCB, SizeOf(TNCB));
  Fillchar(NCB^, SizeOf(TNCB), 0);
  Getmem(Lenum, SizeOf(TLanaEnum));
  Fillchar(Lenum^, SizeOf(TLanaEnum), 0);
  Getmem(Adapter, SizeOf(TAdapterStatus));
  Fillchar(Adapter^, SizeOf(TAdapterStatus), 0);
  Lenum.Length    := chr(0);
  NCB.ncb_command := chr(NCBENUM);
  NCB.ncb_buffer  := Pointer(Lenum);
  NCB.ncb_length  := SizeOf(Lenum);
  RetCode         := Netbios(NCB);
  i := 0;
  repeat
    Fillchar(NCB^, SizeOf(TNCB), 0);
    Ncb.ncb_command  := chr(NCBRESET);
    Ncb.ncb_lana_num := lenum.lana[I];
    RetCode          := Netbios(Ncb);
    Fillchar(NCB^, SizeOf(TNCB), 0);
    Ncb.ncb_command  := chr(NCBASTAT);
    Ncb.ncb_lana_num := lenum.lana[I];
    // Must be 16
    Ncb.ncb_callname := '*               ';
    Ncb.ncb_buffer := Pointer(Adapter);
    Ncb.ncb_length := SizeOf(TAdapterStatus);
    RetCode        := Netbios(Ncb);
    //---- calc _systemId from mac-address[2-5] XOR mac-address[1]...
    if (RetCode = chr(0)) or (RetCode = chr(6)) then
    begin
      _SystemId := IntToHex(Ord(Adapter.adapter_address[0]), 2) + '-' +
        IntToHex(Ord(Adapter.adapter_address[1]), 2) + '-' +
        IntToHex(Ord(Adapter.adapter_address[2]), 2) + '-' +
        IntToHex(Ord(Adapter.adapter_address[3]), 2) + '-' +
        IntToHex(Ord(Adapter.adapter_address[4]), 2) + '-' +
        IntToHex(Ord(Adapter.adapter_address[5]), 2);
    end;
    Inc(i);
  until (I >= Ord(Lenum.Length)) or (_SystemID <> '00-00-00-00-00-00');
  FreeMem(NCB);
  FreeMem(Adapter);
  FreeMem(Lenum);
  GetMacAdress := _SystemID;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  label1.Caption := GetMACAdress;
end;


//***************************************************
// Another Code from
// http://delphi.vitpc.com/treasury/lan.htm
//***************************************************
uses
  NB30;
type
  TAdapterStatus = record
    adapter_address: array [0..5] of char;
    filler: array [1..4 * SizeOf(char) + 19 * SizeOf(Word) + 3 * SizeOf(DWORD)] of
    Byte;
  end;
  THostInfo = record
    username: PWideChar;
    logon_domain: PWideChar;
    oth_domains: PWideChar;
    logon_server: PWideChar;
  end;{record}

function IsNetConnect: Boolean;
begin
  if GetSystemMetrics(SM_NETWORK) and $01 = $01 then Result := True
  else
    Result := False;
end;{function}
function AdapterToString(Adapter: TAdapterStatus): string;
begin
  with Adapter do Result :=
      Format('%2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x',
      [Integer(adapter_address[0]), Integer(adapter_address[1]),
      Integer(adapter_address[2]), Integer(adapter_address[3]),
      Integer(adapter_address[4]), Integer(adapter_address[5])]);
end;{function}
function GetMacAddresses(const Machine: string;
  const Addresses: TStrings): Integer;
const
  NCBNAMSZ = 16;        // absolute length of a net name
  MAX_LANA = 254;       // lana's in range 0 to MAX_LANA inclusive
  NRC_GOODRET = $00;       // good return
  NCBASTAT = $33;       // NCB ADAPTER STATUS
  NCBRESET = $32;       // NCB RESET
  NCBENUM = $37;       // NCB ENUMERATE LANA NUMBERS
type
  PNCB = ^TNCB;
  TNCBPostProc = procedure(P: PNCB);
  stdcall;
  TNCB = record
    ncb_command: Byte;
    ncb_retcode: Byte;
    ncb_lsn: Byte;
    ncb_num: Byte;
    ncb_buffer: PChar;
    ncb_length: Word;
    ncb_callname: array [0..NCBNAMSZ - 1] of char;
    ncb_name: array [0..NCBNAMSZ - 1] of char;
    ncb_rto: Byte;
    ncb_sto: Byte;
    ncb_post: TNCBPostProc;
    ncb_lana_num: Byte;
    ncb_cmd_cplt: Byte;
    ncb_reserve: array [0..9] of char;
    ncb_event: THandle;
  end;
  PLanaEnum = ^TLanaEnum;
  TLanaEnum = record
    Length: Byte;
    lana: array [0..MAX_LANA] of Byte;
  end;
  ASTAT = record
    adapt: TAdapterStatus;
    namebuf: array [0..29] of TNameBuffer;
  end;
var
  NCB: TNCB;
  Enum: TLanaEnum;
  I: integer;
  Adapter: ASTAT;
  MachineName: string;
begin
  Result := -1;
  Addresses.Clear;
  MachineName := UpperCase(Machine);
  if MachineName = '' then    MachineName := '*';
  FillChar(NCB, SizeOf(NCB), #0);
  NCB.ncb_command := NCBENUM;
  NCB.ncb_buffer  := Pointer(@Enum);
  NCB.ncb_length  := SizeOf(Enum);
  if Word(NetBios(@NCB)) = NRC_GOODRET then
  begin
    Result := Enum.Length;
    for I := 0 to Ord(Enum.Length) - 1 do
    begin
      FillChar(NCB, SizeOf(TNCB), #0);
      NCB.ncb_command  := NCBRESET;
      NCB.ncb_lana_num := Enum.lana[I];
      if Word(NetBios(@NCB)) = NRC_GOODRET then
      begin
        FillChar(NCB, SizeOf(TNCB), #0);
        NCB.ncb_command  := NCBASTAT;
        NCB.ncb_lana_num := Enum.lana[i];
        StrLCopy(NCB.ncb_callname, PChar(MachineName), NCBNAMSZ);
        StrPCopy(@NCB.ncb_callname[Length(MachineName)],
          StringOfChar(' ', NCBNAMSZ - Length(MachineName)));
        NCB.ncb_buffer := PChar(@Adapter);
        NCB.ncb_length := SizeOf(Adapter);
        if Word(NetBios(@NCB)) = NRC_GOODRET then
          Addresses.Add(AdapterToString(Adapter.adapt));
      end;
    end;
  end;
end;{function}


Delphi: Get temp directory

Delphi: Get temp directory




function GetTempDir: WideString; stdcall;
var
  Buffer: array[0..MAX_PATH] of Char;
begin
  GetTempPath((SizeOf(Buffer) div SizeOf(Char)) - 1, Buffer);
  Result := Buffer;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
  ShowMessage(GetTempDir);
end;


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

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