Дао DTrace Евгений Ильин jedi# modinfo | grep Tracing <провайдер, модуль, функция, имя> jedi# mdb -k > ufs_lookup::dis -n 3 jedi# dtrace -m 'ufs { trace(execname);}' jedi# mdb -k > ufs_lookup::dis -n 3e jedi# cat difo.d && dtrace -S -s difo.d syscall::ioctl:entry { self->follow = 1; } дескриптор-датчика, [дескриптор-датчика...] [ /предикат/ ] { действие; [действие; ...] } probeprov:probemod:probefunc:probename syscall::write:entry { @count[execname]=count(); } bash-3.00# cat aggr.d && dtrace -qs aggr.d syscall::write:entry { @count[execname,uid]=count(); printf( "." ); } syscall::write:entry { @count[execname]=count(); } tick-7s { #!/usr/sbin/dtrace -qs syscall::symlink:entry /basename(copyinstr(arg1))=="motd" / { printf("Execname: %s, pid=%d\n", execname, pid); } !#/usr/sbin/dtrace -wqs syscall::symlink:entry /basename(copyinstr(arg1))=="motd" / { printf("Execname: %s, pid=%d\n", execname, pid); copyoutstr("/tmp/motd",arg1,9); stop(); system("ptree %d",pid); system("prun %d",pid); system("rm /tmp/motd"); } #!/usr/bin/dtrace -s #pragma D option flowindent syscall::ioctl:entry { self->follow = 1; } fbt::: /self->follow/ { } syscall::ioctl:return /self->follow/ { self->follow = 0; exit(0); } ----------------------------------------------------------------------------------------------------------------- Frugalware 0.7 – Linux для бережливых? Валентин Синицын pacman-g2 -S имя_пакета ----------------------------------------------------------------------------------------------------------------- Citadel – Open Source-решение для коллективной работы Сергей Яремчук $ sudo apt-get update $ sudo apt-get install build-essential curl libssl-dev $ sudo curl http://easyinstall.citadel.org/install | sh $ sudo wget -q -O - http://easyinstall.citadel.org/install | sh deb http://[debian|ubuntu].citadel.org/[debian|ubuntu]/[sid|sarge|sarge_bdb44|etch|breezy|gutsy|feisty] main deb http://ubuntu.citadel.org/ubuntu/gutsy main deb-src http://debian.citadel.org/source stable source $ sudo apt-get update $ sudo apt-get install citadel-suite citadel::100:1:Citadel Login:/usr/local/citadel:/usr/local/citadel/citadel citadel:x:110:1001:Citadel system user,,,:/var/lib/citadel:/bin/false $ sudo addgroup citadel $ sudo adduser --system --no-create-home --home /usr/local/citadel --shell service telnet { flags = REUSE socket_type = stream wait = no user = root server = /usr/sbin/in.telnetd server_args = -L /usr/local/citadel/citadel # или в Ubuntu # server_args = -L /usr/bin/citadel log_on_failure += USERID disable = no } webcit-7.24 $ ./configure $ make $ sudo make install $ cd /usr/local/webcit/ $ sudo ./setup $ sudo /usr/local/webcit/webserver Allow from all Allow from all Allow from all ProxyPass /webcit/ http://127.0.0.1:8504/webcit/ ProxyPassReverse /webcit/ http://127.0.0.1:8504/webcit/ ProxyPass /listsub/ http://127.0.0.1:8504/listsub/ ProxyPassReverse /listsub/ http://127.0.0.1:8504/listsub/ ProxyPass /groupdav/ http://127.0.0.1:8504/groupdav/ ProxyPassReverse /groupdav/http://127.0.0.1:8504/groupdav/ ProxyPass /who_inner_html http://127.0.0.1:8504/who_inner_html ProxyPassReverse /who_inner_html http://127.0.0.1:8504/who_inner_html alias /static /usr/share/citadel-webcit/static alias /tiny_mce /usr/share/tinymce/www Lobby> . Aide edit User Lobby> . Aide System configuration General $ sudo userlist ----------------------------------------------------------------------------------------------------------------- GNU Autotools: ошибки свои и чужие Рашид Ачилов #undef HAVE_LIBJPEG #define HAVE_LIBICONV 1 setenv AUTOTOOLS_DEBUG "yes" setenv AUTOCONF_VERSION "261" setenv AUTOMAKE_VERSION "19" # env AUTOCONF_VERSION="259" autoconf # ./configure --prefix=/usr/local/kde3 --with-qt-dir=/usr/X11R6/qt33 --with-extra-includes=/usr/local/include --with-extra-libs=/usr/local/lib --disable-debug # /bin/sh ../libtool --silent --tag=CXX --mode=link g++ -g -O2 -L/usr/local/lib -L/usr/X11R6/lib -o kdialogd3 kdialogd.o -lkio -lkdecore -lqt-mt # env AUTOCONF_VERSION=259 autoconf # gmake # env AUTOCONF_VERSION=261 AUTOMAKE_VERSION=19 gmake # env AUTOCONF_VERSION=261 AUTOMAKE_VERSION=19 PKG_CONFIG_PATH=/usr/X11R6/libdata/pkgconfig:/usr/X11R6/qt33/libdata/pkgconfig:/usr/local/kde3/libdata/pkgconfig gmake # /bin/sh ../libtool --silent --tag=CXX --mode=link g++ -g -O2 -L/usr/local/lib -L/usr/X11R6/lib -o kdialogd3 -L/usr/X11R6/lib -L/usr/X11R6/qt33/ lib -L/usr/local/kde3/lib -L/usr/local/lib kdialogd.o -lkio -lkdecore -lqt-mt CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ esac # case $deplib --- admin/ltmain.sh.bak 2007-10-11 23:07:36.000000000 +0700 +++ admin/ltmain.sh 2007-10-11 23:07:36.000000000 +0700 @@ -1923,6 +1923,10 @@ continue ;; *.la) lib="$deplib" ;; + -pthread) + deplibs="$deplib $deplibs" + continue + ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" kdialogd3_LDFLAGS = $(all_libraries) $(LIBPTHREAD) @@ -156,19 +158,25 @@ fi AC_CHECK_FUNCS(getpeereid) +# FreeBSD has not dlvsym, so we check this occassion +HOST=`uname` -# Check if we have dlvsym... -AC_CHECK_LIB(dl, dlvsym, +if test "$HOST" != "FreeBSD"; then + # Check if we have dlvsym... + AC_CHECK_LIB(dl, dlvsym, AC_DEFINE(HAVE_DLVSYM, 1, [dlvsym in libdl]), AC_MSG_WARN([You're libdl does not contain dlvsym - SWT apps will not be supported])) -# Determine version of dlsym... -for d in `libtool --config | grep sys_lib_search_path_spec | awk -F= '{print $2}' | sed s:\"::g ` ; do + # Determine version of dlsym... + for d in `libtool --config | grep sys_lib_search_path_spec | awk -F= '{print $2}' | sed s:\"::g ` ; do if test -z $KGTK_DLSYM_VERSION && test -f $d/libdl.so ; then KGTK_DLSYM_VERSION=`objdump --dynamic-syms $d/libdl.so | grep dlsym | awk '{print $6}'` AC_DEFINE_UNQUOTED(KGTK_DLSYM_VERSION, "$KGTK_DLSYM_VERSION", [Version of dlsym]) fi -done + done +fi mkkey=`mkdir 2>&1 | tail -c +15 | head -c 2` KAVD=`whereis -b -B $kavbin -f kavdaemon | awk '{print $2}'` KAVER=`$KAVD -v | awk '{print $6}' | head -c 7` # aclocal -I m4 ----------------------------------------------------------------------------------------------------------------- Программное управление MS Exchange Иван Коробко Листинг 1. Определение имени текущего домена (VBScript) Set obj1=GetObject("LDAP://RootDSE") domain="LDAP://" +obj1.Get("defaultNamingContext") Листинг 2. Создание ADODB-соединения с Active Directory (VBScript) Set objConnection = CreateObject("ADODB.Connection") Set objCommand = CreateObject("ADODB.Command") objConnection.CommandTimeout = 120 objConnection.Provider = "ADsDSOObject" objConnection.Open "Active Directory Provider" Set objCommand.ActiveConnection = objConnection objCommand.properties("Cache Results")=False Листинг 3. Поиск объектов в SQL (VBScript) Set sql=objconnection.execute("SQL_QUERY") UserDN = Sql.Fields("distinguishedName").Value Листинг 4. SQL-запрос поиска distinguishedName по указному сетевому имени пользователя (VBScript) Select * from ("SELECT distinguishedName FROM '" & Domain & " ' WHERE samaccountname='"+LoginName+"' and objectClass='user' and NOT objectClass='computer'" Листинг 5. Определение имени текущего домена (VB.NET) Dim a As New DirectoryEntry("LDAP://rootdse") Dim domain As String = "LDAP://" + a.Properties("defaultNamingContext").Value Листинг 6. Поиск объектов в SQL (VB.NET) Dim sobj As New DirectorySearcher() sobj.SearchRoot = New DirectoryEntry(domain) sobj.SearchScope = SearchScope.Subtree sobj.Filter = "(&(samaccountname=" + findemail + "))" Dim ss As SearchResult ss = sobj.FindOne() Dim DNUser As String = "LDAP://" + ss.Properties("distinguishedName")(0) Листинг 7а. Определение местоположения контейнера Configuration (VBScript) Set obj1=GetObject("LDAP://RootDSE") domain="LDAP://" +obj1.Get("configurationNamingContext ") Листинг 7б. Определение местоположения контейнера Configuration (VB.NET) Dim a As New DirectoryEntry("LDAP://rootdse") Dim domain As String = "LDAP://" + a.Properties("configurationNamingContext").Value Листинг 8а. SQL-запрос определения местоположения Exchange-хранилища (VBScript) Set exchange=objconnection.execute("SELECT distinguishedName FROM '" & configuration & "' WHERE cn='"+FindConfPath+"'") StoreDN = exchange.Fields("distinguishedName").Value Листинг 8б. Поиск объектов в SQL (VB.NET) Public ExchangeServer = "MAIL_SERVER_NAME" Dim findconfpath As String = "Mailbox Store (" + ExchangeServer + ")" Dim m As New DirectoryEntry("LDAP://rootdse") Dim conf As String = "LDAP://" + m.Properties("configurationnamingcontext").Value Dim mobj As New DirectorySearcher() mobj.SearchRoot = New DirectoryEntry(conf) mobj.SearchScope = SearchScope.Subtree mobj.Filter = "(&(cn=" + findconfpath + "))" mobj.PropertiesToLoad.Add("distinguishedName") Dim ms As SearchResult ms = mobj.FindOne() Листинг 9а. Создание почтового ящика (VBScript) Set User = GetObject("LDAP://" & UserDN) Set Mailbox = User Mailbox.CreateMailbox StoreDN User.SetInfo Листинг 9б. Создание почтового ящика (VB.NET) Dim deMail As New DirectoryEntry(DNUser) If Not deMail Is Nothing Then Dim mailboxStore As IMailboxStore mailboxStore = CType(deMail.NativeObject, IMailboxStore) mailboxStore.CreateMailbox(ms.Path) deMail.CommitChanges() Else MsgBox("MailBox Exists") End If Листинг 10а. Создание почтового ящика (VBScript) Set User = GetObject("LDAP://" & UserDN) User.DeleteMailBox User.SetInfo Листинг 10б. Создание почтового ящика (VB.NET) Dim DNUser As String = "LDAP://" + ss.Properties("distinguishedName")(0) Dim deMail As New DirectoryEntry(DNUser) If Not deMail Is Nothing Then Dim mailboxStore As IMailboxStore mailboxStore = CType(deMail.NativeObject, IMailboxStore) mailboxStore.DeleteMailbox() deMail.CommitChanges() Else MsgBox("User Not Found") End If Листинг 11a. Изменение свойств почтового ящика (VBScript) … UserDN = Sql1.Fields("distinguishedName").Value Set User = GetObject("LDAP://" & UserDN) User.put "mDBOverQuotaLimit", "600" User.SetInfo Листинг 11б. Изменение свойств почтового ящика (VB.NET) … Dim DNUser As String = "LDAP://" + ss.Properties("distinguishedName")(0) Dim User = GetObject("LDAP://" & DNUser) User.put("mDBOverQuotaLimit", "600") User.SetInfo() ----------------------------------------------------------------------------------------------------------------- MS Exchange 2003 + SpamAssassin Артем Деянов ppm install Win32-Registry-File ppm install Net-DNS ppm install DB_File ppm install IP-Country ppm install Mail-SPF ppm install Error ppm install Digest-SHA cd \..\Mail-SpamAssassin-3.2.3 perl Makefile.pl nmake nmake install SET RES_NAMESERVERS=xxx.xxx.xxx.xxx SET LANG=ru SpamAssassin_Batch_File=C:\Perl\bin\spamassassin.bat С:\ESA\Install_ESA_Sink.bat Sa-learn – -spam – -mbox ..\spam Sa-learn – -ham - -mbox ..\ham ----------------------------------------------------------------------------------------------------------------- Синхронизация ACL и структуры организации Часть 1 Вадим Андросов function operateMenu(operation, className, id, name, criptPath) Set root= GetObject("LDAP://rootDSE") sConfig = root.Get("configurationNamingContext") sPath = "LDAP://cn=" & className & "-Display,cn=409, cn=DisplaySpecifiers," & sConfig Set obj= GetObject(sPath) sValue = id & "," & name & "," & scriptPath vValue = Array(sValue) obj.PutEx operation, "adminContextMenu", vValue obj.SetInfo end function const ADS_PROPERTY_APPEND = 3 function installMenu(className, id, name, scriptPath) operateMenu(ADS_PROPERTY_APPEND, className, id, name, scriptPath) end function function installOUMenu(id, name, scriptPath) installMenu "organizationalUnit", id, name, scriptPath end function function installGroupMenu(id, name, scriptPath) installMenu "group", id, name, scriptPath end function Const ADS_GROUP_TYPE_LOCAL_GROUP = &h4 Const ADS_GROUP_TYPE_SECURITY_ENABLED = &h80000000 set ouObj = getObject(oArgs.item(0)) newGroupName = inputBox("Enter single attached group name", "New attached group", ouObj.ou & "_Group_Single") if isEmpty(newGroupName) then WScript.Quit set groupObj = ouObj.create("Group", "cn=" & newGroupName) groupObj.sAMAccountName = ouObj.ou & "Single" groupObj.groupType = ADS_GROUP_TYPE_LOCAL_GROUP Or ADS_GROUP_TYPE_SECURITY_ENABLED groupObj.description = "All users from " & ouObj.ou & " OU" groupObj.SetInfo ouObj.groupSingle = groupObj.guid ouObj.setInfo set ouObj = getObject(oArgs.item(0)) singleStr = getGroupName(ouObj.groupSingle) treeStr = getGroupName(ouObj.groupTree) msgbox "Single: " & singleStr & chr(10) & "Subtree: " & treeStr, vbInformation, "OU attached groups" function isGroupExist(guid) isGroupExist = Not isEmpty(guid) end function function getGroupName(guid) if isGroupExist(guid) then set singleGroup = getObject("LDAP://") getGroupName = singleGroup.cn else getGroupName = "none" end if end function set groupObj = getObject(oArgs.item(0)) set ouObj = getObject("LDAP://" & getOU(oArgs.item(0))) if isSomeAttached(ouObj) then if msgbox("Current organizational unit(" & ouObj.ou & _ ") already has attached group(" & _ getGroupName(ouObj.groupSingle) & _ "). Do you wish to unattach this group and " & _ "attach yours(" & groupObj.cn & ") as Single?", _ vbYesNo, "Group already attached") = vbNo _ then WScript.quit end if ouObj.groupSingle = groupObj.guid ouObj.setInfo msgbox "Group attached as single" function getOU(dn) getOU = right(dn, len(dn) - instr(1, dn, ",", vbTextCompare)) end function function isSomeAttached(ou) isSomeAttached = isGroupExist(ou.groupSingle) end function const ADS_PROPERTY_CLEAR = 1 set ouObj = getObject(oArgs.item(0)) if isSomeAttached(ouObj) then if msgbox("Attached single group is " & _ getGroupName(ouObj.groupSingle) & _ chr(10) & "Unattach?", vbYesNo, "Unattach...") = vbNo _ then WScript.Quit ouObj.puEx ADS_PROPERTY_CLEAR, "groupSingle", "" ouObj.setInfo else msgbox "This ou has no attached single groups", vbInformation, "Nothing to unattach" end if Function registerInParent (childOU, parentOU) parentTreeGUID = parentOU.groupTree if not isGroupExist(parentTreeGUID) then Exit Function set parentTreeGroup = Getobject("LDAP://") if not isGroupExist(childOU.groupTree) then childOU.groupTree = parentTreeGUID childOU.setInfo attach parentTreeGroup, childOU end If on Error Resume Next parentTreeGroup.Add("LDAP://") parentTreeGroup.setInfo on Error Goto 0 End Function function attach(treeGroup, ou) on error resume next singleGUID = ou.groupSingle if isGroupExist(singleGUID) Then treeGroup.Add ("LDAP://") treeGroup.setInfo end If for each childOU in ou if childOU.class = "organizationalUnit" then if isTreeAttached(childOU) then if childOU.groupTree <> treeGroup.GUID Then treeGroup.add ("LDAP://") treeGroup.setInfo Else attach treeGroup, childOU end If end if end if next on error goto 0 end function ----------------------------------------------------------------------------------------------------------------- Используем скрипты WSH в «1С:Предприятие» Андрей Луконькин СОМ = СоздатьОбъект("InternetExplorer.Application"); СОМ = Новый СОМОбъект("InternetExplorer.Application"); //В ходе выполнения некоторого кода открывается окно сообщений Сообщить("Сегодня: " +ТекущаяДата()); //Выполнение другой части кода //Теперь нам необходимо закрыть окно сообщений Wsh = Новый СОМОбъект("Wscript.shell"); //Wsh – переменная. Можно было дать любое другое имя, например, Окно Wsh.SendKeys("^+z"); //имитируем нажатие ++ Wsh.SendKeys("^+я"); //для случая, если текущей является русская раскладка клавиатуры //Создаём новый СОМ-объект Сеть = Новый СОМОбъект("Wscript.Network"); Попытка //Устанавливаем принтер Сеть.AddWindowsPrinterConnection("\\ИмяСервера\ИмяПринтера"); //Делаем этот принтер принтером по умолчанию Сеть.SetDefaultPrinter("\\ИмяСервера\ИмяПринтера"); Исключение //В случае неудачного подключения принтера Сообщить("Невозможно произвести подключение"); КонецПопытки; Для каждого... из... Цикл... КонецЦикла ----------------------------------------------------------------------------------------------------------------- Asterisk: организуем автоматическое распределение поступающих вызовов Сергей Яремчук [600] type=friend host=dynamic username=600 secret=600_password nat=no canreinvite=no context=callcenter callerid="User" <600> allow=gsm allow=ulaw allow=alaw $ sudo mcedit /etc/asterisk/agents.conf [general] ; Сохранение статуса агентов в локальной базе не требует ; повторной его регистрации в случае перезагрузки сервера persistentagents=yes ; Разрешение/запрет привязывать к одному экстеншну ; несколько агентов. По умолчанию разрешено ;multiplelogin=yes [agents] ; Количество неудачных регистраций агента перед отказом ; (по умолчанию – 3) maxlogintries=5 ; Отключение агента, если трубка в течение ; указанного времени (в секундах) не снята autologoff=15 ; Отключаем обязательное подтверждение регистрации кнопкой ; <#> при регистрации агента через agentcallpark, ; по умолчанию включено, но иногда это вызывает проблемы ackcall=no ; Время (в мс) между окончанием разговора и повторным вызовом ; агента из очереди. Нужно, например, чтобы пользователь ; успел заполнить отчет (0 – задержка отсутствует) wrapuptime=5000 ; Класс фоновой музыки ожидания для агентов musiconhold = default ; Звуковой сигнал, проигрываемый при подключении агентов custom_beep=beep ; Звуковой файл, проигрываемый при отключении агента ;agentgoodbye => vm-goodbye ; Членство в группах для агентов, используется в queues.conf ;group=1,2 ; Далее описывается запись разговоров агентов с клиентами. ; Эта секция является глобальной для канала агентов ; chan_agent ; Включение записи (по умолчанию выключено) ;recordagentcalls=yes ; Формат файла: wav (по умолчанию), gsm, wav49 recordformat=gsm ; Включать в записи CDR поле с именем файла, содержащего ; запись этого вызова. По умолчанию - отключено ;createlink=yes ; Строка, добавляемая к имени при записи, позволяет ; формировать URL ;urlprefix=http://localhost/calls/ ; По умолчанию записи сохраняются ; в /var/spool/asterisk/monitor, каталог можно изменить ;savecallsin=/var/calls ; Описание агентов, в виде ; agent => agentID,agentPassword,имя agent => 3001,1234,Vasja Pupkin agent => 3002,2345, Serg Jaremchuk ; Создаем новую очередь MyQueue [MyQueue] ; Персональный MOH, используется, если нет musiconhold ; в agents.conf ; musicclass = default ; Если агент участвует в нескольких очередях, ; ему проигрывается сообщение, помогающее сориентироваться ; и правильно принять клиента announce = queue-markq ; Поиск свободного агента strategy=ringall ; Сколько должен звонить телефон у агента прежде, ; чем переключиться на следующего timeout=15 ; Ожидание перед повторной попыткой обзвона retry=5 ; Вес очереди, то есть приоритет вызова, очереди ; с большим приоритетом будет отдаваться предпочтение weight=0 wrapuptime=15 ; Максимальное количество абонентов в очереди ; (0 - без ограничений) maxlen = 0 ; Через сколько объявлять о приблизительном времени ; ожидания или позиции абонента в очереди (0 - выкл) announce-frequency = 60 ; yes|no|once – включение в анонсы времени ожидания ; абонента announce-holdtime = no ; Периодическое сообщение, вроде «Спасибо, что позвонили, ; ожидайте, вам скоро ответят», чтобы абонет не думал, ; что о нем все забыли periodic-announce = thank-you-message ; Проигрывать thank-you-message каждые 60 секунд ожидания periodic-announce-frequency = 60 ; Величина для округления значения времени announce-round-seconds = 10 ; При подключении агенту указывается, сколько времени ; прождал клиент reportholdtime = yes ; При установке в yes, значение тайм-аута для агента будет ; сбрасываться, если от него будут получены сигналы BUSY ; или CONGESTION, например агент отметил вызов timeoutrestart = no ; Описание агентов, обслуживающих очередь member => Agent/3001 member => Agent/3002 ; member => Agent/@1 ; Это группа агентов ; номер для регистрации агента exten=> 7001,1,AgentCallbackLogin(||${CALLERIDNUM}@callcenter) [callcenter] exten=> 911,1,Answer exten=> 911,2,Ringing exten=> 911,3,Wait(2) exten=> 911,4,Queue(MyQueue) exten=> 911,5,Hangup ; и номера телефонов exten => 600,1,Dial(SIP/600) ; и так далее $ sudo asterisk -r [default] mode => files directory => /var/lib/asterisk/moh random=yes ----------------------------------------------------------------------------------------------------------------- Создаём собственный хостинг, или Сам себе ISP Часть вторая Андрей Шетухин # # Russian Web Users Accounts. # Setup proper environment variables. # russianwww|Russian Users Accounts:\ :charset=CP1251:\ :lang=ru_RU.CP1251:\ :umask=0007:\ :tc=default: cap_mkdb /etc/login.conf #!/bin/sh # Localization umask 0002 LC_ALL=ru_RU.CP1251; export LC_ALL LANG=ru_RU.CP1251; export LANG MM_CHARSET=CP1251; export MM_CHARSET CREATE DATABASE `u00001` DEFAULT CHARACTER SET cp1251 COLLATE cp1251_general_ci; pw groupadd virtwww -M www mkdir -p /home/www chown root:wheel /home/www pw useradd u00001 -g virtwww -d /home/www/u00001 -s /usr/local/bin/bash -L russianwww -m pw groupadd u00001 -M u00001 chmod 04710 /home/www/u00001 chown u00001:www /home/www/u00001 mkdir -p /var/log/apache chmod 0711 /var/log/apache chown root:wheel /var/log/apache mkdir /var/log/apache/u00001 chmod 0750 /var/log/apache/u00001 chown root:u00001 /var/log/apache/u00001 mkdir -p /home/www/u00001/example.ru/www mkdir -p /home/www/u00001/example.ru/cgi mkdir -p /home/www/u00001/example.ru/tmp chown -R u00001:virtwww /home/www/u00001/example.ru chmod -R 04770 /home/www/u00001/example.ru mkdir /var/log/apache/u00001/example.ru chmod 0750 /var/log/apache/u00001/example.ru ServerName example.ru ServerAlias www.example.ru DocumentRoot /home/www/u00001/example.ru/www ScriptAlias /cgi /home/www/u00001/example.ru/cgi ErrorLog /var/log/apache/u00001/example.ru/error_log TransferLog /var/log/apache/u00001/example.ru/access_log php_admin_value upload_tmp_dir /home/www/u00001/example.ru/tmp php_admin_value doc_root /home/www/u00001/example.ru php_admin_value user_dir www php_admin_value open_basedir /home/www/u00001:/usr/local/share/smarty:/usr/local/share/pear php_admin_value session.save_path /home/www/u00001/example.ru/tmp User u00001 Group virtwww /usr/local/sbin/apachectl configtest /usr/local/sbin/apachectl restart rm /home/www/u00001/example.ru/www/test.php INSERT INTO ftp.ftpusers VALUES('u00001', 'topsecret', '1001', '1000', '/home/www/u00001', 0, 1, ''); ftp localhost security.bsd.see_other_uids=0 /etc/rc.d/sysctl restart kern.sugid_coredump=0 kern.corefile=/var/tmp/%N.core kern.ipc.maxsockbuf=16777216 net.inet.tcp.rfc1323=1 net.inet.tcp.sendspace=1048576 net.inet.tcp.recvspace=1048576 net.inet.tcp.sack.enable=1 kern.maxfiles=204800 kern.maxfilesperproc=200000 net.inet.ip.portrange.first=1024 net.inet.ip.portrange.last=65535 net.inet.ip.portrange.randomized=0 net.inet.tcp.nolocaltimewait=1 ----------------------------------------------------------------------------------------------------------------- Новое в синтаксисе Perl 5.10 Андрей Шитов ./Configure -Dprefix=/perl5.10 make make install use feature say; use feature state; use feature switch; use feature qw(say state switch); use 5.10.0; use v5.10; use feature ":5.10"; say 2007; say 'London LHR'; say $air_carrier; say $weekday_name[($departure_day + 1) % 7]; say $printer "flight coupon No. $current of $total"; say for 1..3; sub next_serial { state $serial = 0; return ++$serial; } say next_serial(); say next_serial(); say next_serial(); sub register_value { state $sum = 0; state $num = 0; my $value = shift; $sum += $value; $num++; return $num ? $sum / $num : 0; } for (1..1000) { say register_value (rand 10); } given ($day) { when (6) {say 'Saturday'} when (7) {say 'Sunday'} default {say 'Weekday'} } given ($day) { when ($today) {say 'Today'; continue} when (6) {say 'Saturday'} when (7) {say 'Sunday'} default {say 'Weekday'} } for ('a'..'z') { when (/[aeiou]/) {say "$_ is vowel"} } sub func { my $arg = shift; return $arg; } given (2) { when (\&func) {say "func"} when (2) {say "2"} } given (2) { when (func(1)) {say "func"} when (2) {say "2"} } given (2) { when ($_ == func(0)) {say "func"} when (2) {say "2"} } given ($day) { when ($_ ~~ $today) {say 'Today'; continue} when ($_ ~~ 6) {say 'Saturday'} when ($_ ~~ a7) {say 'Sunday'} default {say 'Weekday'} } for ('a'..'z') { when ($_ ~~ /[aeiou]/) {say "$_ is vowel"} } if ($x ~~ 100) {say "constant"} if ($x ~~ /\d+/) {say "regexp"} if ($x ~~ $y) {say "variable"} if ($x ~~ [50..150]) {say "array ref"} if ($x ~~ @a) {say "array"} unless ($x ~~ undef) {say "undef"} use v5.10; my $a = 1; my $b; my $c = 'abc'; my @a = (1..3); my @b = (1..3); my @c = (3..5); my @d = (123, 'abc'); my @e = (qr/\d/, qr/\w/); my @f = ('a'..'f'); my @g = (1..10); my %h = (a => 'alpha', b => 'beta'); my $h_ref = \%h; my %hh = (b => 1, a => 2); sub subA {say "subA"; return 2} sub subB {say "subB"; return 2} sub subC {say "subC"; return 3} sub subD {say shift; return 1} my $subA1_ref = \&subA; my $subA2_ref = \&subA; my $subD_ref = \&subD; my @test = ( ' $b ~~ undef ', ' !defined $b ', ' $c ~~ "abc" ', ' $c eq "abc" ', ' $c ~~ /b/ ', ' $c =~ /b/ ', ' @a ~~ @b ', ' 1 == 1 && 2 == 2 && 3 == 3 ', ' @a ~~ @c ', ' 1 == 3 && 2 == 4 && 3 == 5 ', ' @d ~~ @e ', ' 123 ~~ /\d/ && "abc" ~~ /\w/ ', ' @f ~~ "d" ', ' grep {$_ eq "d"} @f ', ' @g ~~ 7 ', ' grep {$_ == 7} @g ', ' @g ~~ /^\d$/ ', ' grep {$_ =~ /^\d\d$/} @g ', ' 3.14 ~~ "3.14" ', ' 3.14 == "3.14" ', ' $subA1_ref ~~ $subA2_ref ', ' $subA1_ref == $subA2_ref ', ' subA() ~~ subB() ', ' subA() == subB() ', ' subA() ~~ subC() ', ' subA() == subC() ', ' $a ~~ $subA_ref ', ' $subA_ref->() ', ' -1 ~~ $subA_ref ', ' $subA_ref->() ', ' $c ~~ $subD_ref ', ' $subD_ref->($c) ', ' %h ~~ "a" ', ' exists $h{"a"} ', ' $h_ref ~~ "a" ', ' exists $h_ref->{"a"} ', ' %h ~~ /[A-F]/i ', ' grep {/[A-F]/i} keys %h ', ' %h ~~ %hh ', ' [sort keys %h] ~~ [sort keys %hh] ', ); do { my $smart_match = shift @test; my $equivalent = shift @test; say eval $smart_match ? 'ok' : 'not ok', " $smart_match"; say eval $equivalent ? 'ok' : 'not ok', " $equivalent\n"; } while @test; for (1..5) { my $_ = '*'; print; } for (1..5) { our $_ = '*'; print $::_; } my $date = 'Tue 1 January 2008'; $date =~ / (? \w+ ) \s+ (? \d+ ) \s+ (? \w+ ) \s+ (? \d{4}) /x; say $+{wday}; say $+{year}; my $code = 'my $value = 100; say $value;'; $code =~ s/ my \s* (? \$[a-z]+) \s* = \s* (? [^;]+ ) \s* ; \s* (?.*?) \k /$+{other_code}$+{value}/x; my $re = qr/ (? \w+) board .*? \g{1} /x; 'keyboard made of keys' =~ $re; say $+{what}; 'snowboarding assumes snow' =~ $re; say $+{what}; my $re = qr/ (? \w+) (board) .*? \g{-2} /x; my $leap_years = '1992 1996 2004 2008'; $leap_years =~ / (? 1 \d{3}) \s* (? 2 \d{3}) /x; say $_ for @{$-{year}}; my $leap_years = '1992 1996 2004 2008'; $leap_years =~ m/(?\d{4})/g; say $_ for @{$-{year}}; $leap_years =~ s/(?\d{4})/*/g; $leap_years =~ m/(?\d{4}\s*)+/g; my $re = qr/ ( " (?: [^"\\]++ | \\. )*+ " ) /x; my $re = qr/ (\d{4}) (\d\d) (\d\d) | (\w+) \s+ (\d+) , \s+ (\d+) /x; my $re = qr/ (?| (\d{4}) (\d\d) (\d\d) | (\w+) \s+ (\d+) , \s+ (\d+) ) /x; my $re = qr/ (?| (\d{4}) (\d\d) (\d\d) | (\w+) \s+ (\d+) , \s+ (\d+) ) /x; my @strings = ( "a\nb", "a\rb", "a\r\nb", "a\n\rb" ); for (@strings) { when (/a\Rb/) {say 'ok' } default {say 'not ok'} } 'Mon-Fri' =~ / (? Mon|Tue|Wed|Thu|Fri|Sat|Sun ) - (? (?1) ) /x; use feature ":5.10"; my $re = qr /^ ( \( (?: [^()] | (?1) )* \) ) $/x; my @tests = ( "()", "(", "(1+2)", "1+2)", "(1-(2+3))", "(1-(2+3)", "(1+2+3*(4-5)+6/(2+3-(4*5*(6-7)))-8)", ); for (@tests) { say /$re/ ? "ok" : "not ok", " $_"; } /^(\((?:[^()]|(?1))*\))$/ ----------------------------------------------------------------------------------------------------------------- Работаем с OpenDocument из Perl Валентин Синицын perl Makefile.pl make make test make install ppm install OpenOffice-OODoc $doc->outputDelimitersOff(); my $content = $doc->getTextContent(); $content =~ s/\s+//mg; print length $content; use Term::ANSIColor qw(:constants); ... my $doc = ooDocument(file => $file, member => 'content'); $doc->{'delimiters'}{'text:h'} = { 'begin' => RED, 'end' => RESET }; $doc->{'delimiters'}{'text:a'} = { 'begin' => BLUE, 'end' => RESET }; $doc->{'delimiters'}{'text:list-item'} = { 'begin' => YELLOW . '* ' . RESET, 'end' => '' }; $doc->{'delimiters'}{'text:span'} = { 'begin' => BOLD, 'end' => RESET }; $doc->outputDelimitersOn(); print scalar $doc->getTextContent(); my $doc = ooDocument(file => $i_file, member => 'content'); my $meta = ooMeta(file => $i_file); $doc->outputDelimitersOff(); open(O_FILE, '>' . $o_file) || die "Unable to open $o_file"; my $title = $meta->title(); my $author = $meta->creator(); my $charset = ooLocalEncoding(); print O_FILE <<"__HEADER__"; $title __HEADER__ for my $elt ($doc->selectElementsByContent('.*')) { if ($elt->isHeading) { print O_FILE heading($elt), "\n"; } elsif ($elt->isParagraph) { print O_FILE '

', paragraph_content($elt), "

\n"; } elsif ($elt->isItemList) { print O_FILE list($elt, 1), "\n"; } } print O_FILE <<'__FOOTER__'; __FOOTER__ close(O_FILE); for my $elt ($doc->selectElementsByContent('.*')) { ... } sub heading { my $elt = shift; my $level = $doc->getOutlineLevel($elt); return "" . paragraph_content($elt) . "\n"; } sub paragraph_content { my $para = shift; my $result; for my $child ($para->getChildNodes) { if ($child->isSpan) { $result .= span($child); } elsif ($child->isHyperlink) { $result .= hyperlink($child); } elsif ($child->isImage) { $result .= image($child); } elsif ($child->getName eq '#PCDATA') { my $text = ooDecodeText($child->text); $text =~ s/&/&/g; $text =~ s//>/g; $result .= $text; } else { warn "Element '" . $child->getName . "' was ignored\n"; } } return $result; } sub span { my $elt = shift; my %attrs = $doc->getStyleAttributes($doc->textStyle($elt)); if ($attrs{'properties'}->{'fo:font-weight'} eq 'bold') { return "" . paragraph_content($elt) . ""; } elsif ($attrs{'properties'}->{'fo:font-style'} eq 'italic') { return "" . paragraph_content($elt) . ""; } } 1: my $is_ordered = 0; 2: my $style = $doc->getStyleElement($doc->textStyle($elt), namespace => 'text', type => 'list-style'); 3: my $st = $doc->getNodeByXPath("//*[\@text:level=\"$level\"]", $style); 4: if ($st && $st->getName eq 'text:list-level-style-number') { 5: $is_ordered = 1; 6: } elsif ($st && $st->getName eq 'text:list-level-style-bullet') { 7: $is_ordered = 0; 8: } else { 9: warn 'Unknown type of the list: '. $st . "\n"; 10: } my $doc = ooDocument(file => $i_file, member => 'content'); $doc->userFieldValue('someField', 'someValue'); $doc->save($o_file); my $block_no = 1; my $image_no = 1; my $anchor; for my $para ($doc->selectParagraphsByStyle('EmbeddedPerl')) { my $code = $doc->getText($para); $anchor = $para; my $result = eval $code; die "Error in template block $block_no: $@" if ($@); if (ref $result && $result->isElementNode) { $doc->replaceElement($para, $result); } else { if ($result) { my $new_para = $doc->insertParagraph($para); $doc->setText($new_para, $result); } $doc->removeElement($para); } $block_no++; } $doc->save($o_file); sub image { my ($file, $width, $height) = @_; $anchor = $doc->insertParagraph($anchor, position => 'after'); $doc->insertImageElement("Image" . $image_no++, attachment => $anchor, import => $file, size => "${width}cm, ${height}cm"); return undef; } ----------------------------------------------------------------------------------------------------------------- Основные процедуры для работы с деревьями Александр Ямпольский public struct ObjectN // объект (узел дерева) { public string J_NAME; // имя объекта public long J_TYPE; // тип объекта(носитель знаний) public long IDF, // указатель на «отца» IDB, // указатель на «брата» ID1C; // указатель на первого потомка } public static ObjectN[] obj = new ObjectN[]; FreeCell = getfreecell(); obj[FreeCell].IDF = FatherIdentifier; obj[FreeCell].IDB = obj[FatherIdentifier].ID1C; obj[FatherIdentifier].ID1C=FreeCell; public static int descent(long SourceObj,int TravDepth) // SourceObj - указатель исходного узла обхода // TravDepth - лимит глубины обхода { long[] Router = new long[TravDepth]; // маршрутизатор int Lev, // счетчик уровней дерева cur; // вспомогательный указатель уровня bool EOTree, // признак завершения дерева EOLev; // признак завершения уровня long ObjPnt, // вспомогательный указатель объекта FirstCh; // указатель на первого потомка исходного узла FirstCh=obj[SourceObj].ID1C; EOTree=false; Lev=0; while (!EOTree && Lev0) { Console.WriteLine("object: {0}",obj[ObjPnt].J_NAME); // здесь может быть процедура обработки объекта EOTree=EOTree && (obj[ObjPnt].ID1C<1); ObjPnt=obj[ObjPnt].IDB; } // подняться по массиву Router до первого ненулевого указателя на объект cur=cur-1; while (cur>0) { ObjPnt=obj[Router[cur]].IDB; if (ObjPnt>0) break; cur=cur-1; } if (cur == 0) EOLev=true; } // обход фрагмента дерева глубиной Lev } // цикл по уровням return(0); } // фрагмент кода, реализующий отсечение // compatible – функция, определяющая совместимость объектов // target_j_type - тип целевого объекта if (!compatible(obj[ObjPnt].J_TYPE, target_j_type)) { ObjPnt=0; break; // как если бы узел не имел потомков } while (ObjPnt != RootPnt) { // if (информация получена) break; ObjPnt=obj[ObjPnt].IDF; } ----------------------------------------------------------------------------------------------------------------- Пространства имен в PHP Александр Майоров namespace name { //Здесь ваш код… } namespace MyNameSpace { int variable_1; int variable_2; class MyClass { ... }; } MyNameSpace::variable1 = 10; MyNameSpace::MyClass myObject; using namespace name; using name::spacemember 'value1', 'to'=>' value1', 'sort'=>' value1', ); $str = mylib::arrays::sort::sort( $arr ); ?> 'value1', 'to'=>' value2', 'sort'=>' value3', ); $str = mylib::arrays::sort ( $arr ); ?> 'value1', 'to'=>' value2', 'sort'=>' value3', ); $str = arr::sort ( $arr ); ?> case = mylib::TString::LOWERCASE; ... ?> -----------------------------------------------------------------------------------------------------------------