3. Глава I. ЗЗЗ сървър

ЗЗЗ сървър е socket и http многопотребителски сървър реализиран за различни операционни системи Windows, Mac OS X, Linux (включително за Raspberry PI). Той може да бъде достъпван чрез браузър или от други приложения написани на различни програмни езици. Има варианти, които поддържат TLS криптирани връзки, които няма да се разглеждат в настоящото издание на книгата.

3.1 Команден ред

Примерен команден ред:

За Windows
ZZZServer.exe -p 80 -s 100

ZZZServer.exe - стартиращ файл

За Linux или за Mac OS X
./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 от командния ред.

Един примерен zzzserver.cfg файл е следния:
kasovbon.zzz.bg=wwwkasovbon
www.kasovbon.zzz.bg=wwwkasovbon

3.2 Управляващ език

Управляващият език е реализация на езика TTM с вградени команди за управление на ЗЗЗ бази, за свързване с други сървъри и за работа с “живи” обекти. Езикът TTM е рекурсивен функционален макро език (подобен на езика Lisp), който може да се използва в системи за изкуствен интелект.

3.2.1 Общи положения

Интерпретаторът на езика TTM обработва текстова последователност по следния простичък начин:

  • Ако срещне #[команда;параметри] изпълнява командата с указаните параметри разделени с точка и запетая и подава резултата от изпълнението отново за интерпретиране.
  • Ако срещне ##[команда;параметри] изпълнява командата с указаните параметри разделени с точка и запетая и връща резултата от изпълнението.
  • Ако срещне [защитен текст] връща защитения текст като премахва ограждащите скоби и не го изпълнява дори в него да има команди.
  • Ако срещне символи за табулация или нов ред ги прескача.
  • Връща всяка друга текстова последователност като резултат от изпълнението на TTM програмата.
пример: Следната програма на TTM извежда съобщението ‘Hello world from ZZZ Server!’
#[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!
		]
	]
]
пример:
#[.=;MyFile;docfiles/MyFile.txt]
#[cout;
	#[==;;#[oa;fileHandleAppend1;##[MyFile];{error}];[
			#[fps;fileHandleAppend1;Hello World from MyFile!]
			#[cf;fileHandleAppend1]
		];[
			Error: Unable to open "##[MyFile]" for append!
		]
	]
]
пример:
#[.=;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;
	#[==;;#[oi;fileHandleRead1;##[MyFile];{error}];[
			#[frs;fileHandleRead1]
			#[cf;fileHandleRead1]
		];[
			Error: Unable to open "##[MyFile]" for read!
		]
	]
]
пример:
#[.=;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!
		]
	]
]
пример:
#[.=;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!
		]
	]
]
пример:
#[.=;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;docfiles/MyProg.ttm;{error}]
пример:
#[cout;
	#[system;ls]
]
пример:
#[cout;
	#[s2us;Това е тест.]
]
пример:
#[cout;
	#[#; This is а comment. ]
	This isn't a comment.
]
пример:
#[exit]
3.2.2.2 Допълнителни полезни функции
пример:
#[.=;text;текстов низ]
#[cout;
	дължина: ##[fmtl;[%08lX];##[(..);text]] шестнайсетично, ##[fmtl;[%08ld];##[\
(..);text]] десетично##[chr;10]
	елемент: ##[text]
]
пример:
#[cout;
	#[refmtl;%I64X;%I64d;AF]
]
пример:
#[cout;
	#[fmtd;%0.2f;5.3]
]
пример:
#[cout;
	##[getTime]
]
пример:
#[cout;
	#[.=;NOW;##[getTime]]
	##[fmtTime;[%d.%m.%Y година, %H:%M:%S.%s часа];##[NOW]]
]
пример:
#[.=;_base_;docbases/zzzbase]
#[.=;_LAST_MODIFIED_;##[getFileTime;##[_base_]1]]
#[cout;
	Базата "##[_base_]" е променяна в ##[fmtTime;[%H:%M:%S.%s часа на %d.%m.%Y \
година];##[_LAST_MODIFIED_]].
]
пример:
#[.=;_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;www/images/icon_64x64.png;{error}]
пример:
#[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" \
/>
]
пример:
#[cout;
	##[^UID]
]