(Notes) Notes (2014)

Elastix - сервер VOIP-телефонии.



Elastix - дистрибутивный линукс IP PBX c установленным там сервером VOIP-телефонии, web-интерфейсом freePBX к Asterisk и множеством дополнительного полезного софта. Все с самого начала мне описывать неинтересно, кому это надо почитайте букварики, их в интернете навалом, например IP PBX Elastix. IP PBX Asterisk.Voip, Elastix without Tears, и вообще по запросу 'learning Elastiх' ГУГЛ выдает вообще 100 тысяч сайтов. Ставится этот готовый сконфигурированный дистрибутив линукса буквально в пол-тычка, все рассчитано буквально на домохозяек. Единственное - я всегда дополняю стандартный установку дистрибутива Elastix двумя важными конфетками PhpMyAdmin и Webmin.

Если даже пройтись бегло по вкладкам web-интерфейса Elastix, то можно сразу понять как все это работает. Грубо говоря, это очень похоже на почтовый сервер. Есть шлюзы во внешние сети, которые называются Трунки, есть аналоги почтовых ящиков, которые называются Экстеншены, есть реакции на входящую почту, которые называются Диалпланами. Только все это не простое мыло по протоколу SMTP, многократно разжеванное на моем сайте, а кодированный разными кодеками голосовой трафик, который идет по сетям в отдельных VLAN'ах.

Управляется сконфигурированный Asterics несколькими способами - со вкладок web-интерфейса freePBX, которые вы видите выше, из командной строки Asterisk CLI или непосредственно конфигурационными файлами. Есть журнал и данные в базах. Дополнительно можно добавить в Elastix еще и Webmin и phpMyAdmin.



Минимальное конфигурирование для выполнения минимального теста сервера Elastix заключается в определении транка в Didlogic (или аналогичных сервисах) и определения экстеншена в Zoiper в локалке. Это конечно лишь минимум для выполнения тестов, реально в Европе существуют отдельно провайдеры не просто интернета, а именно VOIP-телефонии, например в Болгарии это mtel, а экстеншен может быть определен в любой точке Земного шарика. Почитав до конца этой заметки, вы поймете, насколько сложно это может быть устроено.





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





В табличке ниже в левой колонке вы видите умалчиваемые, устанавливаемые по умолчанию конфигурационные файлы, а в правой колоне конфигурационные файлы реального европейского CALL-центра, в котором определено 35 VOIP-телефонов.



Elastix default configsize   Elastix real configsize
acl.conf2816   acl.conf 2816
additional_a2billing_iax.conf 0   additional_a2billing_iax.conf 0
additional_a2billing_sip.conf 0   additional_a2billing_sip.conf 0
adsi.conf140   adsi.conf 140
agents.conf2531   agents.conf 2735
alarmreceiver.conf2084   alarmreceiver.conf 2084
allogsm-channels.conf1075   allogsm-channels.conf 1075
alsa.conf3498   alsa.conf 3498
amd.conf767   amd.conf 767
app_mysql.conf.sample1044   app_mysql.conf.sample 1044
app_skel.conf338   app_skel.conf 338
applications.conf8523   applications.conf 8523
asterisk.adsi3254   asterisk.adsi 3254
asterisk.conf367   asterisk.conf 369
asterisk.conf.rpmnew4202   asterisk.conf.rpmnew 4227
calendar.conf5171   calendar.conf 5171
  calendar.conf.rpmnew 5171
cbmysql.conf361   cbmysql.conf 368
ccss.conf8827   ccss.conf 8827
  ccss.conf.rpmnew 8827
cdr.conf8586   cdr.conf 8518
  cdr.conf.rpmnew 8586
cdr_adaptive_odbc.conf2580   cdr_adaptive_odbc.conf 2580
  cdr_adaptive_odbc.conf.rpmnew 2580
cdr_custom.conf1617   cdr_custom.conf 1617
cdr_manager.conf418   cdr_manager.conf 24
cdr_mysql.conf694   cdr_mysql.conf 701
cdr_mysql.conf.bak694   cdr_mysql.conf.bak 701
cdr_mysql.conf.old_2014Aug15_060259694   cdr_mysql.conf.old_2013Jul03_143234 701
  cdr_mysql.conf.old_2014May13_174834 701
cdr_mysql.conf.orig696   cdr_mysql.conf.orig 696
cdr_mysql.conf.sample2231   cdr_mysql.conf.sample 2231
cdr_odbc.conf263   cdr_odbc.conf 263
cdr_pgsql.conf504   cdr_pgsql.conf 504
cdr_sqlite3_custom.conf984   cdr_sqlite3_custom.conf 984
cdr_syslog.conf3301   cdr_syslog.conf 3301
cdr_tds.conf2068   cdr_tds.conf 2068
cel.conf4419   cel.conf 4419
  cel.conf.rpmnew 4419
cel_custom.conf2035   cel_custom.conf 2035
  cel_custom.conf.rpmnew 2035
cel_odbc.conf3155   cel_odbc.conf 3155
  cel_odbc.conf.rpmnew 3155
cel_pgsql.conf1261   cel_pgsql.conf 1261
  cel_pgsql.conf.rpmnew 1261
cel_sqlite3_custom.conf1526   cel_sqlite3_custom.conf 1526
  cel_sqlite3_custom.conf.rpmnew 1526
cel_tds.conf1883   cel_tds.conf 1883
chan_allogsm.conf36409   chan_allogsm.conf 36409
chan_dahdi.conf606   chan_dahdi.conf 606
chan_dahdi.conf.rpmnew65899   chan_dahdi.conf.rpmnew 65052
chan_dahdi.conf.template715   chan_dahdi.conf.template 715
chan_dahdi_additional.conf418   chan_dahdi_additional.conf 418
chan_extra.conf36390   chan_extra.conf 36390
cli.conf264   cli.conf 264
cli_aliases.conf6908   cli_aliases.conf 6902
  cli_aliases.conf.rpmnew 6908
cli_permissions.conf2452   cli_permissions.conf 2452
codecs.conf4616   codecs.conf 4616
  codecs.conf.rpmnew 4616
confbridge.conf23678   confbridge.conf 23021
  confbridge.conf.rpmnew 23163
config_test.conf695   config_test.conf 695
console.conf4456   console.conf 4456
dahdi-channels.conf 0   dahdi-channels.conf 0
dbsep.conf1164   dbsep.conf 1164
  dial_auto.conf 0
dnsmgr.conf190   dnsmgr.conf 190
dsp.conf1470   dsp.conf 1470
dundi.conf9034   dundi.conf 9034
  dundi.conf.rpmnew 9034
enum.conf50   enum.conf 50
enum.conf.old_2014Aug15_06025950   enum.conf.old_2013Jul03_143234 50
  enum.conf.old_2014May13_174834 50
extconfig.conf3809   extconfig.conf3675
  extconfig.conf.rpmnew 3809
extension_a2billing_additionals.conf1403   extension_a2billing_additionals.conf 1403
extensions.ael12776   extensions.ael 12776
extensions.conf28311   extensions.conf 28311
extensions.conf.old_2014Aug15_06025828311   extensions.conf.old_2013Jul03_143235
extensions.conf.old_freePBX-2.8.1-1630823   extensions.conf.old_2014May13_174916 28311
extensions.conf.old_freePBX-2.8.1-1728311   extensions.conf.old_freePBX-2.8.1-16 30823
  extensions.conf.old_freePBX-2.8.1-17 28311
extensions.conf.rpmnew31637   extensions.conf.rpmnew 31637
extensions.lua7023   extensions.lua 5827
  extensions.lua.rpmnew 5827
extensions_additional.conf81626   extensions_additional.conf 556081
extensions_custom.conf1297   extensions_custom.conf 540262
extensions_custom.conf.sample2671   extensions_custom.conf.sample 2671
extensions_minivm.conf7480   extensions_minivm.conf 7480
extensions_override_elastix.conf5982   extensions_override_elastix.conf 5982
extensions_override_freepbx.conf42   extensions_override_freepbx.conf 3994
  extensions_queuemetrics.conf 15132
extra-channels.conf 0   extra-channels.conf 0
features.conf1559   features.conf 1559
features.conf.old_2014Aug15_0602581559   features.conf.old_2013Jul03_143235
  features.conf.old_2014May13_174916 1559
features.conf.old_freePBX-2.8.1-1613693   features.conf.old_freePBX-2.8.1-16 13693
features.conf.old_freePBX-2.8.1-171559   features.conf.old_freePBX-2.8.1-17 1559
features.conf.rpmnew15607   features.conf.rpmnew 15266
features_applicationmap_additional.conf418   features_applicationmap_additional.conf 418
features_applicationmap_custom.conf 0   features_applicationmap_custom.conf 0
features_featuremap_additional.conf466   features_featuremap_additional.conf 466
features_featuremap_custom.conf 0   features_featuremap_custom.conf 0
features_general_additional.conf433   features_general_additional.conf 433
features_general_custom.conf 0   features_general_custom.conf 0
festival.conf923   festival.conf 923
followme.conf3881   followme.conf 3881
  followme.conf.rpmnew 3881
freepbx_featurecodes.conf.template1494   freepbx_featurecodes.conf.template 1494
freepbx_menu.conf.template1235   freepbx_menu.conf.template 1235
freepbx_module_admin.conf730   freepbx_module_admin.conf 730
  freepbx_module_admin.conf.old_2013Jul03_143234 730
freepbx_module_admin.conf.old_2014Aug15_060259730   freepbx_module_admin.conf.old_2014May13_174834 730
func_odbc.conf5314   func_odbc.conf 5314
globals_custom.conf 0   globals_custom.conf 461
gtalk.conf895   gtalk.conf 895
  gtalk.conf.rpmnew 895
h323.conf8227   h323.conf 8227
http.conf3114   http.conf 2941
  http.conf.rpmnew 2941
iax.conf2096   iax.conf 2096
iax.conf.old_2014Aug15_0602582096   iax.conf.old_2013Jul03_143235
  iax.conf.old_2014May13_174916 2096
iax.conf.old_freePBX-2.8.1-1623424   iax.conf.old_freePBX-2.8.1-16 23424
iax.conf.old_freePBX-2.8.1-172096   iax.conf.old_freePBX-2.8.1-17 2096
iax.conf.rpmnew26375   iax.conf.rpmnew 26182
iax_additional.conf418   iax_additional.conf 1028
iax_custom.conf 0   iax_custom.conf 0
iax_custom_post.conf 0   iax_custom_post.conf 0
iax_general_additional.conf488   iax_general_additional.conf 488
iax_general_custom.conf44   iax_general_custom.conf 44
iax_registrations.conf418   iax_registrations.conf 418
iax_registrations_custom.conf 0   iax_registrations_custom.conf 0
iaxprov.conf2402   iaxprov.conf 2402
indications.conf841   indications.conf 690
indications.conf.old_2014Aug15_06025924419   indications.conf.old_2013Jul03_143234 841
  indications.conf.old_2014May13_174834 690
indications.conf.rpmnew25367   indications.conf.rpmnew 24970
jabber.conf2150   jabber.conf 2150
  jabber.conf.rpmnew 2150
jingle.conf512   jingle.conf 512
localprefixes.conf418   localprefixes.conf 418
logger.conf917   logger.conf 917
logger.conf.old_2014Aug15_060259917   logger.conf.old_2013Jul03_143234 917
  logger.conf.old_2014May13_174834 940
logger.conf.rpmnew4742   logger.conf.rpmnew 4612
manager.conf910   manager.conf 1339
manager.conf.bak915   manager.conf.bak 922
manager.conf.old_2014Aug15_060259910   manager.conf.old_2013Jul03_143234 917
  manager.conf.old_2014May13_174834 1337
manager.conf.orig919   manager.conf.orig 919
manager.conf.rpmnew6571   manager.conf.rpmnew 6501
manager_additional.conf 0   manager_additional.conf 0
manager_custom.conf1122   manager_custom.conf 1181
  manager_humbug.conf 123
meetme.conf40   meetme.conf 40
meetme.conf.old_2014Aug15_06025940   meetme.conf.old_2013Jul03_143234 40
  meetme.conf.old_2014May13_174834 40
meetme_additional.conf418   meetme_additional.conf 418
mgcp.conf5852   mgcp.conf 5852
minivm.conf9925   minivm.conf 9925
modem.conf1774   modem.conf 1774
modem.conf.old_2014Aug15_0602591774   modem.conf.old_2013Jul03_143234 1774
  modem.conf.old_2014May13_174834 1774
modules.conf2393   modules.conf 2393
modules.conf.old_2014Aug15_0602592585   modules.conf.old_2013Jul03_143234 2585
  modules.conf.old_2014May13_174834 2395
modules.conf.orig2393   modules.conf.orig 2393
motif.conf4573   motif.conf 4573
musiconhold.conf208   musiconhold.conf 208
musiconhold.conf.old_2014Aug15_060259208   musiconhold.conf.old_2013Jul03_143234 208
  musiconhold.conf.old_2014May13_174834 208
musiconhold.conf.rpmnew3084   musiconhold.conf.rpmnew 3084
musiconhold_additional.conf127   musiconhold_additional.conf 338
musiconhold_custom.conf 0   musiconhold_custom.conf 0
muted.conf1285   muted.conf 1285
ooh323.conf.sample5793   ooh323.conf.sample 5793
osp.conf3900   osp.conf 3900
oss.conf7461   oss.conf 7461
phone.conf1418   phone.conf 1418
phone.conf.old_2014Aug15_0602591418   phone.conf.old_2013Jul03_143234 1418
  phone.conf.old_2014May13_174834 1418
phoneprov.conf7431   phoneprov.conf 7431
  phoneprov.conf.rpmnew 7431
phpagi.conf90   phpagi.conf 90
phpagi.conf.old_2014Aug15_06025990   phpagi.conf.old_2013Jul03_143234 90
  phpagi.conf.old_2014May13_174834 90
privacy.conf81   privacy.conf 81
privacy.conf.old_2014Aug15_06025981   privacy.conf.old_2013Jul03_143234 81
  privacy.conf.old_2014May13_174834 81
queuerules.conf1440   queuerules.conf 1440
queues.conf522   queues.conf 522
queues.conf.old_2014Aug15_060259522   queues.conf.old_2013Jul03_143234 522
  queues.conf.old_2014May13_174834 522
queues.conf.rpmnew25608   queues.conf.rpmnew 25609
queues_additional.conf418   queues_additional.conf 14582
queues_custom.conf 0   queues_custom.conf 0
queues_custom_general.conf 0   queues_custom_general.conf 0
queues_general_additional.conf440   queues_general_additional.conf 440
queues_post_custom.conf 0   queues_post_custom.conf 0
res_config_mysql.conf417   res_config_mysql.conf 424
res_config_mysql.conf.sample2061   res_config_mysql.conf.sample 2061
res_config_sqlite.conf378   res_config_sqlite.conf 378
res_config_sqlite3.conf1332   res_config_sqlite3.conf 1332
res_corosync.conf876   res_corosync.conf 876
res_curl.conf160   res_curl.conf 160
res_fax.conf67   res_fax.conf 67
res_fax_custom.conf 0   res_fax_custom.conf 0
res_fax_digium.conf54   res_fax_digium.conf 54
res_fax_digium_custom.conf 0   res_fax_digium_custom.conf 0
res_ldap.conf7075   res_ldap.conf 7075
res_odbc.conf5208   res_odbc.conf 4684
res_pgsql.conf995   res_pgsql.conf 995
res_pktccops.conf713   res_pktccops.conf 713
res_snmp.conf834   res_snmp.conf 834
res_stun_monitor.conf1350   res_stun_monitor.conf 1350
rtp.conf282   rtp.conf 282
rtp.conf.old_2014Aug15_060259282   rtp.conf.old_2013Jul03_143234 282
  rtp.conf.old_2014May13_174834 282
rtp.conf.rpmnew1797   rtp.conf.rpmnew 1797
  save 4096
say.conf17057   say.conf 17057
sip.conf3001   sip.conf 3001
sip.conf.old_2014Aug15_0602583001   sip.conf.old_2013Jul03_143235
  sip.conf.old_2014May13_174916 3001
sip.conf.old_freePBX-2.8.1-1680389   sip.conf.old_freePBX-2.8.1-16 80389
sip.conf.old_freePBX-2.8.1-173001   sip.conf.old_freePBX-2.8.1-17 3001
sip.conf.rpmnew91165   sip.conf.rpmnew 88514
sip_additional.conf525   sip_additional.conf 49272
sip_custom.conf 0   sip_custom.conf 12
sip_custom_post.conf 0   sip_custom_post.conf 0
sip_general_additional.conf656   sip_general_additional.conf 655
sip_general_custom.conf14   sip_general_custom.conf 14
sip_nat.conf 0   sip_nat.conf 0
sip_notify.conf487   sip_notify.conf 487
sip_notify.conf.old_2014Aug15_060258487   sip_notify.conf.old_2013Jul03_143235
  sip_notify.conf.old_2014May13_174916 487
sip_notify.conf.old_freePBX-2.8.1-16790   sip_notify.conf.old_freePBX-2.8.1-16 790
sip_notify.conf.old_freePBX-2.8.1-17487   sip_notify.conf.old_freePBX-2.8.1-17 487
sip_notify_additional.conf779   sip_notify_additional.conf 779
sip_notify_custom.conf40   sip_notify_custom.conf 40
sip_notify_custom_elastix.conf66   sip_notify_custom_elastix.conf 66
sip_registrations.conf418   sip_registrations.conf 546
sip_registrations_custom.conf 0   sip_registrations_custom.conf 0
skinny.conf9185   skinny.conf 9185
sla.conf7092   sla.conf 7092
smdi.conf2669   smdi.conf 2669
telcordia-1.adsi1384   telcordia-1.adsi 1384
udptl.conf656   udptl.conf 656
unicall.conf496   unicall.conf 496
unistim.conf5621   unistim.conf 5621
  unistim.conf.rpmnew 5621
users.conf2571   users.conf 2687
  users.conf.rpmnew 2571
version16   version 15
vm_email.inc577   vm_email.inc 578
vm_general.inc1835   vm_general.inc 1835
voicemail.conf67   voicemail.conf 11540
voicemail.conf.rpmnew23819   voicemail.conf.rpmnew 23772
voicemail.conf.template67   voicemail.conf.template 67
vpb.conf5938   vpb.conf 5938
  vpb.conf.rpmnew 5938
xmpp.conf2150   xmpp.conf 2150
zapata.conf.template699   zapata.conf.template 699


Теперь я расскажу в двух словах - в чем заключается программирование VOIP-телефонии под Asterisk. При нажатии каких-то кнопок на телефоне, вызываются приложения, которые выполняют какую-то полезную работу, например проигрывают музыку или предлагают юзеру нажать какие цифры кода на клавиатуре своего телефона. Приложения могут читать эти коды и модернизировать DIAL-планы по протоколу AGI. Например если вы ввели какой-то код правильно, то приложение может занести некоторую отметку в базу, например добавить вам денег на VOIP-переговоры, или активировать вашу виндузню (именно так происходит сейчас телефонная активация), после чего сказать вам - до свиданья. Если же код вы ввели неверный код, то дальше DIAL-план может быть установлен прогой с AGI-интерфейсом какой-угодно, от разрыва разговора, до предложения прослушать музычку и пройти все меню DIAL-плана с самого начала.

Даже в скромных фирмах в несколько человек, диалплан может насчитывать десятки тысяч строк. Вот конфиг небольшой компании, в которой, как вы видите, определено 35 VOIP телефонов на горячей линии 400 - зато приложений, работающих по интерфейсу AGI, в этой фирме функционировало больше двухсот штук!





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





И здесь возникает второй аспект программирования - клиентское программирование десктопных приложений на компьютерах операторов. Когда на некотором телефонном номере горячей линии оператор поднимает трубку, у оператора на кампутере сразу же открывается связанное с этим товаром приложение (как устроена эта взаимосвязь VOIP-номера и айпишника кампутера я не понял - ну допустим по триггеру, при добавлению какой-то записи в базу Asterisk). И соответственно, оператор видит не только сведения о звонящем, но и все сведения о товаре. Сведения о звонящем позволяют оператору увеличить оборот торговой фирмы, предложив сразу же какие-то акции, например если звонит пенсионер или данный человек уже делал заказ в данной фирме. А сведения о товаре позволяют видеть реальный остаток товара, норму отгрузки, стоимость доставки, возможность сделать скидку и какую. Приложение также позволяет оператору сразу же оформить заказ и отправить его в отдел доставки фирмы поставщика. То есть данная торговая фирма своего склада не имеет, а является лишь информационной структурой, колл-центром на базе Elastix, а в плане бизнеса является оптово-розничным отделом сбыта сотни производителей, с которыми заключены соответствующие соглашения. По названиям фирменной музычки, связанной с каждым товаром, мы видим что данная фирма торгует пивом Staropramen, Каменица, Carlsberg и другими товарами.





Тема торговли пивом мне близка, как никакая другая. Ибо я знаю насколько мутно эта схема работает на территории бывшего совка. Самая моя первая коммерчески успешная программа была написала на Клиппере первоначально для Роганского пивзавода №3 г. Харькова в незабываемом 1990-м году, 25 лет назад! И за эту программу я получил свои первые в жизни 70 тысяч долларов наличными. Из-за чего и уволился из Национального космического агенства Украины и отправился далее в самостоятельное плавание. Эту свою первую коммерчески удачную прогу я написал на Клиппере, сначала на четверке, потом переписал ее на пятерке и пытался тиражировать ее по разным пивзаводам. Но это было уже не так просто, ибо на Роганском пивзаводе хоть какой-то порядок был налажен в отделе сбыта в голодные и бандитские 90-е годы, а видели бы вы как были устроены отделы сбыта на других пивных заводах! Достаточно сказать, что все оптовые закупки фур пива были только за наличный расчет, а инфляция была такая, что даже некая условная отпускная цена (которая как бы существовала на каждом заводе) менялась по нескольку раз в день! В противовес всему этому грязному совковому балагану, здесь вы можете видеть, как устроен процесс торговли пивом в Европе, в частности в Болгарии.

И вот здесь в моем повествовании мы подошли к пониманию вопроса, который я пытался решить в этой фирме. Дело в том, что конечно же, заказы на товары поступают не из того города, где расположена эта торговая фирма. То есть люди звонят по межгороду, а значительная часть звонков вообще международная. Соответственно, дорогие звонки сразу же сбрасываются и сервер VOIP выполняет CallBack звонящему. И здесь возникла проблема. После некоторых изменений, очереди на обратный звонок с обычных 25-ти звонков стали сбрасываться после попадания в очередь всего 5-8 звонков. Что было для данной торговой фирмы неприемлемо. Могу похвастаться, что причину этого я понял и дал им соответствующие рекомендации по разрешению возникшей проблемы.

И наконец, коснемся слегонца третьего, последнего, аспекта проблемы программирования для Asterisk. В дистрибутив Elastix встроены десятка два основных приложений, например когда дистрибутив применяется Elastix в гостиннице для звонков постояльцев, в него сразу же встроен софт управления Минибаром гостинницы. То есть возникает необходимость как программировать в среде этих 20-30 бесплатных, изначально встроенных в Elastix приложений, а так же существуют полсотни различных платных плагинов для Elastix, которые тоже нуждаются в адаптации к конкретному применению.





К сказанному остается добавить, что в дикой России технологии VOIP (и тем более продвинутое программирование под Asterisk) практически не существует. На всю Рассею, думаю, существует от силы десяток VOIP-серверов с каким-то более ли менее развитым меню и приложениями - наверное только у сотовых компаний (без этого невозможно никак, это их техническое ядро), ну и может быть в нескольких ведущих банках на горячих линиях. В остальной России - на тему VOIP все гораздо хуже, чем в Сомали и Зимбабве. А вот в Европе это совсем не так, здесь CALL-центр это вообще автономный бизнес, информационная компания (не только как описанная здесь торговая фирма), но такая информационная компания на базе VOIP-сервера может брать заказы для опросов общественного мнения, для обратной связи от телевидения, даже создание любой общественной организации начинается тут не со взяток кремлевским чеченам (типа Суркова) или кремлевским пидарасам (типа Володина или Иванова) - а с установки сервера VOIP.

Еще немного о VOIP я написал тут - Интернет в Европе.



Comments ( )
<00>  <01>  <02>  <03>  <04>  <05>  <06>  <07>  <08>  <09>  <10>  <11>  <12>  <13>  <14>  <15>  <16>  <17>  <18>  <19>  <20>  <21>  <22>  <23
Link to this page: //www.vb-net.com/Elastix/Index.htm
<SITEMAP>  <MVC>  <ASP>  <NET>  <DATA>  <KIOSK>  <FLEX>  <SQL>  <NOTES>  <LINUX>  <MONO>  <FREEWARE>  <DOCS>  <ENG>  <CHAT ME>  <ABOUT ME>  < THANKS ME>