Я люблю свою работу

декабря 4, 2009

Я люблю свою работу! Я люблю свою работу! Я люблю свою работу! Я люблю свою работу!

Категория: юмор | Комментарии выключены | Trackback

Запрет закрытия окна терминальной сессии

ноября 13, 2009

Занимался на днях такой проблемой. Необходимо было запретить пользователям “закрывать” терминальное окно и заставить их выходить правильно. Нужно было для корректного выхода из 1С. Так как пользователи не выходят из терминала, а просто закрывают окно, то сама сессия продолжает висеть и выход этого пользователя становится некорректным, что приводит к необходимости переиндексации базы и многим другим ненужным процедурам.
Нашел очень удобную программку.

HideRDPxButtoN
Убирает в заголовке окна терминального подключения RDP кнопку “Х”,
не позволяя таким образом, “закрывать” 1С, оставляя висящую сессию на терминальном сервере

Для многих администраторов 1С работающей в режиме терминального сервера на базе MS RDP
знакома проблема, когда пользователи для завершения работы закрывают не саму программу
а жмут кнопку на всплывающей панельке вверху окна удаленного рабочего стола,
с чистой совестью полагают что закрыли программу, оставляя тем самым, висящую сессию на терминальном сервере…

Эта программа убирает крестик с всплывающей вверху панели.

Так она еще и с исходниками. Рекомендую всем.

Ссылка

Категория: | Комментарии выключены | Trackback

URLEncode и URLDecode

сентября 19, 2009

При написании программ, взаимодействующих по сети, иногда встает проблема передачи, приема и распознавания символов локального алфавита. Например, при написании клиента для некоего сайта. Мы, собственно, наталкиваемся на отсутствие в Delphi функций URLEncode и URLDecode. Поэтому приходится их писать самим. Ниже приведены упомянутые функции. Чтобы лишний раз не изобретать велосипед.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
function DigitToHex(Digit: Integer): Char;
begin
case Digit of
0..9: Result := Chr(Digit + Ord('0'));
10..15: Result := Chr(Digit - 10 + Ord('A'));
else
Result := '0';
end;
end; // DigitToHex


function URLEncode(const S: string): string;
var
i, idx, len: Integer;
begin
len := 0;
for i := 1 to Length(S) do
if ((S[i] >= '0') and (S[i] < = '9')) or
((S[i] >= 'A') and (S[i] < = 'Z')) or
((S[i] >= 'a') and (S[i] < = 'z')) or (S[i] = ' ') or
(S[i] = '_') or (S[i] = '*') or (S[i] = '-') or (S[i] = '.') then
len := len + 1
else
len := len + 3;
SetLength(Result, len);
idx := 1;
for i := 1 to Length(S) do
if S[i] = ' ' then
begin
Result[idx] := '+';
idx := idx + 1;
end
else if ((S[i] >= '0') and (S[i] < = '9')) or
((S[i] >= 'A') and (S[i] < = 'Z')) or
((S[i] >= 'a') and (S[i] < = 'z')) or
(S[i] = '_') or (S[i] = '*') or (S[i] = '-') or (S[i] = '.') then
begin
Result[idx] := S[i];
idx := idx + 1;
end
else
begin
Result[idx] := '%';
Result[idx + 1] := DigitToHex(Ord(S[i]) div 16);
Result[idx + 2] := DigitToHex(Ord(S[i]) mod 16);
idx := idx + 3;
end;
end; // URLEncode


function URLDecode(const S: string): string;
var
i, idx, len, n_coded: Integer;
function WebHexToInt(HexChar: Char): Integer;
begin
if HexChar < '0' then
Result := Ord(HexChar) + 256 - Ord('0')
else if HexChar <= Chr(Ord('A') - 1) then
Result := Ord(HexChar) - Ord('0')
else if HexChar <= Chr(Ord('a') - 1) then
Result := Ord(HexChar) - Ord('A') + 10
else
Result := Ord(HexChar) - Ord('a') + 10;
end;
begin
len := 0;
n_coded := 0;
for i := 1 to Length(S) do
if n_coded >= 1 then
begin
n_coded := n_coded + 1;
if n_coded >= 3 then
n_coded := 0;
end
else
begin
len := len + 1;
if S[i] = '%' then
n_coded := 1;
end;
SetLength(Result, len);
idx := 0;
n_coded := 0;
for i := 1 to Length(S) do
if n_coded >= 1 then
begin
n_coded := n_coded + 1;
if n_coded >= 3 then
begin
Result[idx] := Chr((WebHexToInt(S[i - 1]) * 16 +
WebHexToInt(S[i])) mod 256);
n_coded := 0;
end;
end
else
begin
idx := idx + 1;
if S[i] = '%' then
n_coded := 1;
if S[i] = '+' then
Result[idx] := ' '
else
Result[idx] := S[i];
end;
end; // URLDecode

Категория: Delphi, Разработка | Комментарии выключены | Trackback

Реализация хеш–функции в Delphi

сентября 17, 2009

Хеш–функция md5 получила большое распространение в web–программировании. На языке PHP она реализуется встроенной функцией md5, а как же использовать md5 в Delphi? Давайте посмотрим как получить хеш с помощью Delphi, самостоятельно напишем функцию, подобную той, что реализована в PHP.

И так, приступим. Создаём новый Unit:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
unit Umd5;

interface

uses Windows, SysUtils;

type
THash = DWord;
function md5 (buf: string): string;

implementation

var HEX: array[Word] of string;

function LRot32 (a, b: LongWord): LongWord;

asm
mov ecx, edx
rol eax, cl
end;

function md5 (buf: string): string;

type

pint = ^Integer;
tdata = array [0..15] of DWORD;
pdata = ^tdata;
tbyte = array [0..15] of byte;
pbyte = ^tbyte;

var

i, Len: Integer;
data: pdata;
CurrentHash: array[0..3] of DWord;
P: array[0..7] of Word absolute CurrentHash;
A, B, C, D: DWord;

begin

Len := Length (buf);
SetLength (buf, 64);
buf[Len+1] := #$80;
FillChar (buf[Len+2], 63 - Len, 0);
pint (@buf[57])^ := Len * 8;

CurrentHash[0] := $67452301;
CurrentHash[1] := $efcdab89;
CurrentHash[2] := $98badcfe;
CurrentHash[3] := $10325476;

A := CurrentHash[0];
B := CurrentHash[1];
C := CurrentHash[2];
D := CurrentHash[3];

data := addr (buf[1]);

A := B + LRot32 (A + (D xor (B and (C xor D))) + data^[ 0] + $d76aa478, 7);
D := A + LRot32 (D + (C xor (A and (B xor C))) + data^[ 1] + $e8c7b756, 12);
C := D + LRot32 (C + (B xor (D and (A xor B))) + data^[ 2] + $242070db, 17);
B := C + LRot32 (B + (A xor (C and (D xor A))) + data^[ 3] + $c1bdceee, 22);
A := B + LRot32 (A + (D xor (B and (C xor D))) + data^[ 4] + $f57c0faf, 7);
D := A + LRot32 (D + (C xor (A and (B xor C))) + data^[ 5] + $4787c62a, 12);
C := D + LRot32 (C + (B xor (D and (A xor B))) + data^[ 6] + $a8304613, 17);
B := C + LRot32 (B + (A xor (C and (D xor A))) + data^[ 7] + $fd469501, 22);
A := B + LRot32 (A + (D xor (B and (C xor D))) + data^[ 8] + $698098d8, 7);
D := A + LRot32 (D + (C xor (A and (B xor C))) + data^[ 9] + $8b44f7af, 12);
C := D + LRot32 (C + (B xor (D and (A xor B))) + data^[10] + $ffff5bb1, 17);
B := C + LRot32 (B + (A xor (C and (D xor A))) + data^[11] + $895cd7be, 22);
A := B + LRot32 (A + (D xor (B and (C xor D))) + data^[12] + $6b901122, 7);
D := A + LRot32 (D + (C xor (A and (B xor C))) + data^[13] + $fd987193, 12);
C := D + LRot32 (C + (B xor (D and (A xor B))) + data^[14] + $a679438e, 17);
B := C + LRot32 (B + (A xor (C and (D xor A))) + data^[15] + $49b40821, 22);

A := B + LRot32 (A + (C xor (D and (B xor C))) + data^[ 1] + $f61e2562, 5);
D := A + LRot32 (D + (B xor (C and (A xor B))) + data^[ 6] + $c040b340, 9);
C := D + LRot32 (C + (A xor (B and (D xor A))) + data^[11] + $265e5a51, 14);
B := C + LRot32 (B + (D xor (A and (C xor D))) + data^[ 0] + $e9b6c7aa, 20);
A := B + LRot32 (A + (C xor (D and (B xor C))) + data^[ 5] + $d62f105d, 5);
D := A + LRot32 (D + (B xor (C and (A xor B))) + data^[10] + $02441453, 9);
C := D + LRot32 (C + (A xor (B and (D xor A))) + data^[15] + $d8a1e681, 14);
B := C + LRot32 (B + (D xor (A and (C xor D))) + data^[ 4] + $e7d3fbc8, 20);
A := B + LRot32 (A + (C xor (D and (B xor C))) + data^[ 9] + $21e1cde6, 5);
D := A + LRot32 (D + (B xor (C and (A xor B))) + data^[14] + $c33707d6, 9);
C := D + LRot32 (C + (A xor (B and (D xor A))) + data^[ 3] + $f4d50d87, 14);
B := C + LRot32 (B + (D xor (A and (C xor D))) + data^[ 8] + $455a14ed, 20);

A := B + LRot32 (A + (C xor (D and (B xor C))) + data^[13] + $a9e3e905, 5);
D := A + LRot32 (D + (B xor (C and (A xor B))) + data^[ 2] + $fcefa3f8, 9);
C := D + LRot32 (C + (A xor (B and (D xor A))) + data^[ 7] + $676f02d9, 14);
B := C + LRot32 (B + (D xor (A and (C xor D))) + data^[12] + $8d2a4c8a, 20);
A := B + LRot32 (A + (B xor C xor D) + data^[ 5] + $fffa3942, 4);
D := A + LRot32 (D + (A xor B xor C) + data^[ 8] + $8771f681, 11);
C := D + LRot32 (C + (D xor A xor B) + data^[11] + $6d9d6122, 16);
B := C + LRot32 (B + (C xor D xor A) + data^[14] + $fde5380c, 23);
A := B + LRot32 (A + (B xor C xor D) + data^[ 1] + $a4beea44, 4);
D := A + LRot32 (D + (A xor B xor C) + data^[ 4] + $4bdecfa9, 11);
C := D + LRot32 (C + (D xor A xor B) + data^[ 7] + $f6bb4b60, 16);
B := C + LRot32 (B + (C xor D xor A) + data^[10] + $bebfbc70, 23);
A := B + LRot32 (A + (B xor C xor D) + data^[13] + $289b7ec6, 4);
D := A + LRot32 (D + (A xor B xor C) + data^[ 0] + $eaa127fa, 11);
C := D + LRot32 (C + (D xor A xor B) + data^[ 3] + $d4ef3085, 16);
B := C + LRot32 (B + (C xor D xor A) + data^[ 6] + $04881d05, 23);
A := B + LRot32 (A + (B xor C xor D) + data^[ 9] + $d9d4d039, 4);
D := A + LRot32 (D + (A xor B xor C) + data^[12] + $e6db99e5, 11);
C := D + LRot32 (C + (D xor A xor B) + data^[15] + $1fa27cf8, 16);
B := C + LRot32 (B + (C xor D xor A) + data^[ 2] + $c4ac5665, 23);

A := B + LRot32 (A + (C xor (B or (not D))) + data^[ 0] + $f4292244, 6);
D := A + LRot32 (D + (B xor (A or (not C))) + data^[ 7] + $432aff97, 10);
C := D + LRot32 (C + (A xor (D or (not B))) + data^[14] + $ab9423a7, 15);
B := C + LRot32 (B + (D xor (C or (not A))) + data^[ 5] + $fc93a039, 21);
A := B + LRot32 (A + (C xor (B or (not D))) + data^[12] + $655b59c3, 6);
D := A + LRot32 (D + (B xor (A or (not C))) + data^[ 3] + $8f0ccc92, 10);
C := D + LRot32 (C + (A xor (D or (not B))) + data^[10] + $ffeff47d, 15);
B := C + LRot32 (B + (D xor (C or (not A))) + data^[ 1] + $85845dd1, 21);
A := B + LRot32 (A + (C xor (B or (not D))) + data^[ 8] + $6fa87e4f, 6);
D := A + LRot32 (D + (B xor (A or (not C))) + data^[15] + $fe2ce6e0, 10);
C := D + LRot32 (C + (A xor (D or (not B))) + data^[ 6] + $a3014314, 15);
B := C + LRot32 (B + (D xor (C or (not A))) + data^[13] + $4e0811a1, 21);
A := B + LRot32 (A + (C xor (B or (not D))) + data^[ 4] + $f7537e82, 6);
D := A + LRot32 (D + (B xor (A or (not C))) + data^[11] + $bd3af235, 10);
C := D + LRot32 (C + (A xor (D or (not B))) + data^[ 2] + $2ad7d2bb, 15);
B := C + LRot32 (B + (D xor (C or (not A))) + data^[ 9] + $eb86d391, 21);

Inc (CurrentHash[0], A);
Inc (CurrentHash[1], B);
Inc (CurrentHash[2], C);
Inc (CurrentHash[3], D);

Result := StrLower(PChar(HEX[P[0]]));

for i := 1 to 7 do

Result := Concat (Result, StrLower(PChar(HEX[P[i]])));

end;

var DEC, Tmp: Integer;
LH: string;

initialization

for DEC := 0 to $ffff do
begin
Tmp := DEC and $ff;
LH := IntToHex (Tmp, 2);
Tmp := DEC shr 8;
HEX[DEC] := Concat (LH, IntToHex (Tmp, 2));
end;

end.

Далее присоеденяем этот Unit к своему проекту. Использование функции такое же, как и в PHP, соблюдая, естественно синтаксис Delphi.

Категория: Delphi, Разработка | Комментарии выключены | Trackback

Функция закрывает все открытые HTML теги.

августа 16, 2009

Данная функция часто бывает полезной для сохранения валидности странице при выводе не полной новости.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
function close_dangling_tags($html) {

#put all opened tags into an array

preg_match_all("#<([a-z]+)( .*)?(?!/)>#iU",$html,$result);

$openedtags=$result[1];

#put all closed tags into an array

preg_match_all("##iU",$html,$result);

$closedtags=$result[1];

$len_opened = count($openedtags);

# all tags are closed

if(count($closedtags) == $len_opened){

return $html;

}

$openedtags = array_reverse($openedtags);

# close tags

for($i=0;$i < $len_opened;$i++)  {

if (!in_array($openedtags[$i],$closedtags)){

$html .= '';

} else {

unset($closedtags[array_search($openedtags[$i],$closedtags)]);

}

}

return $html;

}

Категория: Веб-разработка | 1,663 Комментариев | Trackback

Ошибки оптимизации сайта

августа 16, 2009

Как гласит знаменитая пословица – ошибается тот, кто ничего не делает! Ошибки оптимизации сайта для поисковых систем тому не исключение, а лишь подтверждение и делали их абсолютно все. Что бы не допускать их в дальнейшем – рассмотрим самые распространённые из них…

Читать далее »

Категория: SEO | 1 Комментарий | Trackback

Защита от спама для небольших сайтов

августа 16, 2009

Последнее время появилось много информации про защиту сайтов от спам ботов. Я решил присоединиться и описать метод, которым пользуюсь сам. Пользуюсь им уже достаточно давно и скорей всего многим он будет известен, но я думаю найдутся те кому будет интересно.

Читать далее »

Категория: Веб-разработка | 1 Комментарий | Trackback

Последние треки

Хостинг

Последние записи

Последние комментарии

Метки

amv anime bad apple c++ Delphi dj smash ebay html javascript md5 Microsoft Opera php Professional RDP SEO stSocial ubuntu urldecode urlencode WGA Notifications windows xp Видео Разработка Социальные клипы Яндекс антиспам закладки защита новая волна новый год оптимизация панель пародия парсер праздники программы продвижение работа раскрутка спам терминал юмор

Архив

Статистика