3. Глава I. ЗЗЗ сървър
ЗЗЗ сървър е socket и http многопотребителски сървър реализиран за различни операционни системи Windows™, Mac OS X™, Linux (включително за Raspberry PI). Той може да бъде достъпван чрез браузър или от други приложения написани на различни програмни езици. Има варианти, които поддържат TLS криптирани връзки, които няма да се разглеждат в настоящото издание на книгата.
3.1 Команден ред
Примерен команден ред:
ZZZServer.exe -p 80 -s 100
ZZZServer.exe - стартиращ файл
./ZZZServer -p 80 -s 100
ZZZServer - стартиращ файл
-p 80 – 80 е номерът на порта, на който слуша сървъра.
-s 100 – 100 е максималният брой програмни стъпки, които да бъдат изпълнени от сървъра за активния клиент преди да премине към следващия.
Описание на други параметри задавани чрез командния ред при стартиране на ЗЗЗ сървър:
-p - задава номера на порта, на който слуша сървъра по подразбиране е 3333;
-d - задава директрорията за документи за сървъра по подразбиране е www;
-c - максимален брой на едновременно обработваните клиенти от сървъра по подразбиране 100;
-s - максимален брой програмни стъпки, които изпълнява сървъра за активния клиент преди да премине към следващия по подразбиране 30;
-h - извежда помощна информация;
-l - задава началото на имената на лог файлове, може да включва и име на папка, но ако папката не съществува не я създава. По подразбиране не прави лог файлове;
-lf - задава формат на времето към името на лог файловете. По подразбиране е -%Y-%m-%d-%H.log;
Възможните форматиращи кодове са:
-%a- съкратено име на ден от седмицата;
-%A- пълно име на ден от седмицата;
-%b- съкратено име на месец;
-%B- пълно име на месец;
-%c- представяне на датата и времето в зависимост от местното време;
-%d- ден от месеца като цяло число (01 – 31);
-%H- час в 24-часов формат (00 – 23);
-%I- час в 12-часов формат (01 – 12);
-%j- ден от годината като десетично число (001 – 366);
-%m- месец като десетично число (01 – 12);
-%M- минута като десетично число (00 – 59);
-%p- текущия A.M./P.M. индикатор за 12-часов формат на времето;
-%S- секунда като десетично число (00 – 59);
-%U- седмицата от годината като десетично число, с неделя като първи ден от седмицата (00 – 53);
-%w- ден от седмицата като десетично число (0 – 6; неделята е 0);
-%W- седмицата от годината като десетично число, с понеделник като първи ден от седмицата (00 – 53);
-%x- представяне на датата за текущите местни настройки;
-%X- представяне на времето за текущите местни настройки;
-%y- годината без столетията, като десетично число (00 – 99);
-%Y- годината със столетията, като десетично число;
-%z, %Z- времевата зона;
-%%- знака%;
-ban - забранява различни дейности:
-ban base create - забранява създаването на нови бази. Полезна е когато сървъра трябва да работи само с предварително създадени бази;
-ban base write - освен, че забранява създаването на нови бази, забранява и записа в съществуващите бази управлявани от сървъра. Позволява само четене от базите. Полезна при справочни системи или когато съдържанието на базите трябва да остане непроменено;
Избирането на папка, от която ЗЗЗ сървъра да чете става чрез конфигурационния файл zzzserver.cfg. Той трябва да се намира в работната папка на сървъра и съдържа последователни редове с име на хост след него знака равно и име на папка. Името на хост може да завършва с двоеточие и номер на порт. За неописаните в конфигурационния файл хостове, които обслужва сървъра се използва папката по подразбиране www или указаната с опцията -d от командния ред.
kasovbon.zzz.bg=wwwkasovbon
www.kasovbon.zzz.bg=wwwkasovbon
3.2 Управляващ език
Управляващият език е реализация на езика TTM с вградени команди за управление на ЗЗЗ бази, за свързване с други сървъри и за работа с “живи” обекти. Езикът TTM е рекурсивен функционален макро език (подобен на езика Lisp), който може да се използва в системи за изкуствен интелект.
3.2.1 Общи положения
Интерпретаторът на езика TTM обработва текстова последователност по следния простичък начин:
- Ако срещне
#[команда;параметри]изпълнява командата с указаните параметри разделени с точка и запетая и подава резултата от изпълнението отново за интерпретиране. - Ако срещне
##[команда;параметри]изпълнява командата с указаните параметри разделени с точка и запетая и връща резултата от изпълнението. - Ако срещне
[защитен текст]връща защитения текст като премахва ограждащите скоби и не го изпълнява дори в него да има команди. - Ако срещне символи за табулация или нов ред ги прескача.
- Връща всяка друга текстова последователност като резултат от изпълнението на TTM програмата.
#[cout;[Hello world from ZZZ Server!]]
Командата cout извежда низ.
3.2.2 Команди
Синтаксисът на командите е:
#[команда;параметър1;параметър2;параметър3]- активна команда, т.е. резултатът се интерпретира отново
##[команда;параметър1;параметър2;параметър3]- пасивна команда, т.е. резултатът се връща без да се интерпретира
Броят на параметрите е неограничен, ако е необходимо в параметъра да има точка и запетая, тя трябва да бъде заградена в квадратни скоби.
Описанието на командите е следното: име на командата, действие на командата, параметри, ако има, примерно използване в активен режим (аналогично е използването в пасивен режим, тогава пред командата има ##).
3.2.2.1 Основни команди
#[cout+]
#[cout;Test trace on.]
#[cout-]
#[cout+]
#[cout;Test trace off.]
#[cout-]
#[=;test;[This is the defined string.]]
#[cout;##[test]]
#[cout;
#[.v;5]
#[.=;text;#[.^]. [This is the defined string.]]
#[.+]
#[.=;text;#[.^]. [This is the defined string.]]
##[text]##[chr;10]
#[.-]
##[text]
]
#[cout;
#[.v;5]
#[.=;text;#[.^]. [This is the defined string.]]
#[.+]
#[.=;text;#[.^]. [This is the defined string.]]
##[text]##[chr;10]
#[.-]
##[text]
]
#[cout;
#[.v;5]
#[.=;text;#[.^]. [This is the defined string.]]
#[.+]
#[.=;text;#[.^]. [This is the defined string.]]
##[text]##[chr;10]
#[.-]
##[text]
]
#[cout;
#[.v;5]
#[.=;text;#[.^]. [This is the defined string.]]
#[.+]
#[.=;text;#[.^]. [This is the defined string.]]
##[text]##[chr;10]
#[.-]
##[text]
]
#[cout;
#[.v;5]
#[.=;text;#[.^]. [This is the defined string.]]
#[.+]
#[.=;text;#[.^]. [This is the defined string.]]
##[text]##[chr;10]
#[.-]
##[text]
]
#[cout;
Hello World from ZZZ Server!<br />
Hello World from ZZZ Server!<br />
[
Hello World from ZZZ Server!
Hello World from ZZZ Server!
]
]
#[out;[Hello world from ZZZ Server!]]
#[cout;#[+;1;2]]
#[cout;#[-;2;1]]
#[cout;#[*;2;3]]
#[cout;#[/;6;3]]
#[==;first;second;[
#[cout;Both parameters are equal.]
];[
#[cout;Both parameters are different.]
]
]
#[==n;1;2;[
#[cout;Both parameters are equal.]
];[
#[cout;Both parameters are different.]
]
]
#[cout;
#[>=;first;second;[
The first parameter is greater or equal to the second one.
];[
The second parameter is greater than the first one.
]
]
]
#[cout;
#[>=n;1;2;[
The first parameter is greater or equal to the second one.
];[
The second parameter is greater than the first one.
]
]
]
#[=;MyFunc;[
[I am {TITLE} {FIRST_NAME} {LAST_NAME}.]
]
]
#[=.;MyFunc;{TITLE};{FIRST_NAME};{LAST_NAME}]
#[cout;#[MyFunc;Mr;Steven;Atanasov]]
#[=;MyFunc;[
#[cout;[I am {TITLE} {FIRST_NAME} {LAST_NAME}.]]
]
]
#[=.;MyFunc;{TITLE};{FIRST_NAME};{LAST_NAME}]
#[MyFunc;Mr;John;Edwards]
#[=;test;[
This is a defined string.
]
]
#[cout;##[test]]
#[=;test;[
This is a defined string.
]
]
#[is;test;defined;stored]
#[cout;##[test]]
#[=;test;
This is a defined string.
]
#[cout;
#[^.;test;<end>]
#[^.;test;<end>]
]
#[=;test;
This is a defined string.
]
#[cout;
##[test]
#[=x;test]
##[test]
]
#[=;new line;##[chr;10]]
#[=;test1;
This is a defined string 1.
]
#[=;test2;
This is a defined string 2.
]
#[cout;
##[test1]##[new line]
##[test2]##[new line]
#[=x..]
##[test1]##[new line]
##[test2]##[new line]
]
#[=;text;
This is the defined string.
]
#[cout;
#[x*v;text;the ;<end>]
#[^.;text;<end>]
#[^.;text;<end>]
]
#[=;text;
This is the defined string.
]
#[cout;
#[x*v;text;the ;<end>]
#[^.;text;<end>]
#[^.;text;<end>]
#[*0;text]
##[chr;10]
#[^.;text;<end>]
#[^.;text;<end>]
]
#[cout;
#[ta;abc;def;[
"abc" >= "def"
];[
"abc" < "def"
]
]
]
#[cout;
<div style="font-size:2em">#[chr;425]</div>
Copyright #[chr;169] 2015 - 2017 ZZZ Ltd. All rights reserved.
]
#[cout;
symbol #[chr;#[refmtl;%04x;%d;#[tcn;W]]], code #[tcn;W]
]
#[=;test;
This is a defined string.
]
#[cout;
#[^..;test;3;{after end}]##[chr;10]
#[^..;test;4;{after end}]##[chr;10]
#[^..;test;5;{after end}]##[chr;10]
#[^..;test;6;{after end}]##[chr;10]
#[^..;test;10;{after end}]##[chr;10]
#[^..;test;10;{after end}]##[chr;10]
]
#[=;test;
This a defined string.
]
#[*v;test;10]
#[cout;#[^(..*;test]]
#[=;test;
This a defined string.
]
#[*v;test;10]
#[cout;#[^*..);test]]
#[=;test;
This a defined string.
]
#[*v;test;10]
#[cout;#[*^;test]]
#[=;test;
This a defined string.
]
#[*v;test;10]
#[cout;#[*^;test]]
#[=;test;
This is a defined string.
]
#[trf;test;defined;stored]
#[cout;##[test]]
#[=;test;
This is the defined string.
]
#[cout;#[ts;test;the;string;{error}]]
#[=;test;
This is a defined string.
]
#[cout;
#[tt;test;defined;[
on true
];[
on false
]
]
]
#[=;test;
This is a defined string.
]
#[cout;
#[ttc;test;Defined;[
on true
];[
on false
]
]
]
#[cout;#[|;1;2]]
#[cout;#[&;1;2]]
#[cout;#[~;1]]
#[=x..]
#[=;test1;
Test one.
]
#[=;test2;
Test two.
]
#[cout;##[ln;##[chr;10]]]
#[.=;MyFile;docfiles/MyFile.txt]
#[cout;
#[==;;#[oi;fileHandleRead1;##[MyFile];{error}];[
#[frs;fileHandleRead1]
#[cf;fileHandleRead1]
];[
Error: Unable to open "##[MyFile]" for read!
]
]
]
#[.=;MyFile;docfiles/MyFile.txt]
#[cout;
#[==;;#[oo;fileHandleWrite1;##[MyFile];{error}];[
#[fps;fileHandleWrite1;Hello World from MyFile!]
#[cf;fileHandleWrite1]
];[
Error: Unable to open "##[MyFile]" for write!
]
]
]
oa
Отваря файл за добавяне (open append)
Работи само, ако е включена опцията -write от командния ред на ЗЗЗ сървъра!
Първият параметър е описател на файла. Вторият параметър е името на файла. Третият параметър е резултатът при неуспех.
#[.=;MyFile;docfiles/MyFile.txt]
#[cout;
#[==;;#[oa;fileHandleAppend1;##[MyFile];{error}];[
#[fps;fileHandleAppend1;Hello World from MyFile!]
#[cf;fileHandleAppend1]
];[
Error: Unable to open "##[MyFile]" for append!
]
]
]
cf
Затваря файл (close file)
Първият параметър е описателят на файла.
#[.=;MyFile;docfiles/MyFile.txt]
#[cout;
#[==;;#[oi;fileHandleRead1;##[MyFile];{error}];[
#[frs;fileHandleRead1]
#[cf;fileHandleRead1]
];[
Error: Unable to open "##[MyFile]" for read!
]
]
]
frs
Прочита низ от файл до подразбиращ се мета символ (file read string)
#[.=;MyFile;docfiles/MyFile.txt]
#[cout;
#[==;;#[oi;fileHandleRead1;##[MyFile];{error}];[
#[frs;fileHandleRead1]
#[cf;fileHandleRead1]
];[
Error: Unable to open "##[MyFile]" for read!
]
]
]
frc
Прочита символ от файл (file read char)
#[.=;MyFile;docfiles/MyFile.txt]
#[cout;
#[==;;#[oi;fileHandleRead1;##[MyFile];{error}];[
#[frc;fileHandleRead1]
#[frc;fileHandleRead1]
#[frc;fileHandleRead1]
#[frc;fileHandleRead1]
#[frc;fileHandleRead1]!
#[cf;fileHandleRead1]
];[
Error: Unable to open "##[MyFile]" for read!
]
]
]
fcm
Променя подразбиращия се мета символ (file change meta)
#[.=;MyFile;docfiles/MyFile.txt]
#[cout;
#[==;;#[oi;fileHandleRead1;##[MyFile];{error}];[
#[fcm;fileHandleRead1;#[chr;32]]
#[frs;fileHandleRead1] #[frs;fileHandleRead1]!
#[cf;fileHandleRead1]
];[
Error: Unable to open "##[MyFile]" for read!
]
]
]
fps
Записва низ във файл (file print string)
#[.=;MyFile;docfiles/MyFile.txt]
#[cout;
#[==;;#[oo;fileHandleWrite1;##[MyFile];{error}];[
#[fps;fileHandleWrite1;Hello World from MyFile!]
#[cf;fileHandleWrite1]
];[
Error: Unable to open "##[MyFile]" for write!
]
]
]
load
Зарежда файл като при активно извикване го интерпретира
Първият параметър е името на файла. Вторият параметър е резултатът при неуспех.
#[load;docfiles/MyProg.ttm;{error}]
system
Изпълнява команда от операционната система
Работи само, ако е включена опцията -system от командния ред на ЗЗЗ сървъра!
Първият параметър е командата заедно с нейните параметри.
#[cout;
#[system;ls]
]
s2us
Преобразува низ към низ с уникод кодове (string to unicode string)
#[cout;
#[s2us;Това е тест.]
]
#
Използва се за вмъкване на коментари (null command)
#[cout;
#[#; This is а comment. ]
This isn't a comment.
]
exit
Спира интерпретирането
#[exit]
3.2.2.2 Допълнителни полезни функции
fmtl
Форматира дълго, цяло число като използва форматиращ низ стандартен за командата sprintf от C/C++ Първият параметър е форматиращият низ. Вторият параметър е числото, което трябва да бъде форматирано.
#[.=;text;текстов низ]
#[cout;
дължина: ##[fmtl;[%08lX];##[(..);text]] шестнайсетично, ##[fmtl;[%08ld];##[\
(..);text]] десетично##[chr;10]
елемент: ##[text]
]
refmtl
Преформатира дълго, цяло число като използва форматиращ низ стандартен за командата sprintf от C/C++ С тази команда примерно може бързо да бъде преобразувано едно число от 16-тично към 10-тично. Първите два параметъра са форматиращи низове. Третият параметър е числото, което трябва да бъде преформатирано.
#[cout;
#[refmtl;%I64X;%I64d;AF]
]
fmtd
Форматира реално, цяло число с двойна точност като използва форматиращ низ стандартен за командата sprintf от C/C++ Първият параметър е форматиращият низ. Вторият параметър е числото, което трябва да бъде форматирано.
#[cout;
#[fmtd;%0.2f;5.3]
]
getTime
Връща броят на милисекундите от 1-ви януари, 1970 г., 00:00:00 GMT
#[cout;
##[getTime]
]
fmtTime
Форматира време Първият параметър е форматиращият низ. Вторият параметър е времето в милисекунди.
#[cout;
#[.=;NOW;##[getTime]]
##[fmtTime;[%d.%m.%Y година, %H:%M:%S.%s часа];##[NOW]]
]
getFileTime
Връща времето от последната промяна на файл, в милисекунди Първият параметър е пътят до файла.
#[.=;_base_;docbases/zzzbase]
#[.=;_LAST_MODIFIED_;##[getFileTime;##[_base_]1]]
#[cout;
Базата "##[_base_]" е променяна в ##[fmtTime;[%H:%M:%S.%s часа на %d.%m.%Y \
година];##[_LAST_MODIFIED_]].
]
getFileSize
Връща размера на файла Първият параметър е пътят до файла.
#[.=;_base_;docbases/zzzbase]
#[.=;_base_size_;##[fmtd;%0.f;##[+;##[getFileSize;##[_base_]1];##[getFileSiz\
e;##[_base_]2]]]]
#[.=;_KB_;##[/;##[_base_size_];1024]]
#[.=;_MB_;##[/;##[_KB_];1024]]
#[.=;_GB_;##[/;##[_MB_];1024]]
#[.=;_TB_;##[/;##[_GB_];1024]]
#[cout;
Базата "##[_base_]" заема:##[chr;10]
##[_base_size_] байта[;]##[chr;10]
##[fmtd;%0.2f;##[_KB_]] килобайта[;]##[chr;10]
##[fmtd;%0.4f;##[_MB_]] мегабайта[;]##[chr;10]
##[fmtd;%0.6f;##[_GB_]] гигабайта[;]##[chr;10]
##[fmtd;%0.8f;##[_TB_]] терабайта.
]
outLoadBinary
Извежда файл в двоичен формат Първият параметър е пътят до файла. Вторият параметър е резултатът, който връща в случай на грешка.
##[outLoadBinary;www/images/icon_64x64.png;{error}]
base64LoadBinary
Кодира файл в base64 Първият параметър е пътят до файла. Вторият параметър е резултатът, който връща в случай на грешка.
#[cout;
<img src="data:image/png[;]base64,##[base64LoadBinary;www/images/icon1_64x6\
4.png;{error}]" alt="Using binary image data to display an image in HTML" />
<img src="data:image/png[;]base64,##[base64LoadBinary;www/images/icon_64x64\
.png;{error}]" alt="Using binary image data to display an image in HTML" />
<img src="data:image/png[;]base64,##[base64LoadBinary;www/images/lin64.png;\
{error}]" alt="Using binary image data to display an image in HTML" />
<img src="data:image/png[;]base64,##[base64LoadBinary;www/images/mac64.png;\
{error}]" alt="Using binary image data to display an image in HTML" />
<img src="data:image/png[;]base64,##[base64LoadBinary;www/images/win64.png;\
{error}]" alt="Using binary image data to display an image in HTML" />
<img src="data:image/png[;]base64,##[base64LoadBinary;www/images/android.pn\
g;{error}]" alt="Using binary image data to display an image in HTML" />
<img src="data:image/png[;]base64,##[base64LoadBinary;www/images/ios.png;{e\
rror}]" alt="Using binary image data to display an image in HTML" />
<img src="data:image/png[;]base64,##[base64LoadBinary;www/images/windows-ph\
one.png;{error}]" alt="Using binary image data to display an image in HTML" \
/>
]
^UID
Връща уникален за текущото стартиране на ЗЗЗ сървъра номер като максималната му стойност е 0x7fffffffffffffffI64
#[cout;
##[^UID]
]