From wendyjenkins@example.net Tue Jun 03 18:43:17 2003 Return-Path: <wendyjenkins@example.net> Delivered-To: wendyjenkins@example.net Received: (qmail 18795 invoked by uid 500); 3 Jun 2003 18:43:17 -0000 Mailing-List: contact wendyjenkins@example.net; run by ezmlm Precedence: bulk X-No-Archive: yes List-Post: <mailto:wendyjenkins@example.net> List-Help: <mailto:wendyjenkins@example.net> List-Unsubscribe: <mailto:wendyjenkins@example.net> List-Subscribe: <mailto:wendyjenkins@example.net> Delivered-To: mailing list wendyjenkins@example.net Received: (qmail 18782 invoked from network); 3 Jun 2003 18:43:17 -0000 Received: from smtp0.libero.it (83.161.120.155) by daedalus.apache.org with SMTP; 3 Jun 2003 18:43:17 -0000 Received: from dedasys.com (83.161.120.155) by smtp0.libero.it (7.0.012) id 3ECC83C400427B2B for wendyjenkins@example.net; Tue, 3 Jun 2003 20:43:21 +0200 Received: by dedasys.com (Postfix, from userid 1000) id 4FB8D4C181; Tue, 3 Jun 2003 20:44:04 +0200 (CEST) To: wendyjenkins@example.net Subject: .htaccess problems From: wendyjenkins@example.net (David N. Welton) Date: 03 Jun 2003 20:44:03 +0200 Message-ID: <wendyjenkins@example.net> Lines: 71 User-Agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.2 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N I added this to my local copy of mod_rivet.c to play around with. I was, infact, getting some weird segfaults because of this: if (isNew || *(rsc->cache_size) == 0 || rsc->user_scripts_updated) which I got rid of. Now it just plain cleans the whole cache out when the config file changes. Unfortunately, as things stand now, the config file 'changes' every time the UserConf function gets called. In short, we need a way to obtain information about .htaccess modification times (all the way up the chain, I'm afraid!) in order to include that in the cache information. In reality, I almost think that this might best be done with some sort of addition to Apache itself that tells you whether the .htaccess files concerning the resource requested have changed, but that's not very probably or realistic... Any thoughts? --- mod_rivet.c 26 May 2003 21:20:25 -0000 1.64 +++ mod_rivet.c 3 Jun 2003 18:35:04 -0000 @@ -203,8 +203,37 @@ entry = Tcl_CreateHashEntry(rsc->objCache, hashKey, &isNew); } - /* We don't have a compiled version. Let's create one */ - if (isNew || *(rsc->cache_size) == 0 || rsc->user_scripts_updated) + /* If the user configuration has indeed been updated, I guess that + * pretty much invalidates anything that might have been + * cached. */ + + /* This is all horrendously slow, and means we should *also* be + doing caching on the modification time of the .htaccess files + that concern us. */ + + if (rsc->user_scripts_updated && *(rsc->cache_size) != 0) { + int ct; + Tcl_HashEntry *delEntry; + /* Clean out the list. */ + ct = *(rsc->cache_free); + while (ct < *(rsc->cache_size)) { + /* Free the corresponding hash entry. */ + delEntry = Tcl_FindHashEntry( + rsc->objCache, + rsc->objCacheList[ct]); + if (delEntry != NULL) + Tcl_DecrRefCount((Tcl_Obj *)Tcl_GetHashValue(delEntry)); + Tcl_DeleteHashEntry(delEntry); + + free(rsc->objCacheList[ct]); + rsc->objCacheList[ct] = NULL; + ct ++; + } + *(rsc->cache_free) = *(rsc->cache_size); + } + + /* We don't have a compiled version. Let's create one. */ + if (isNew || *(rsc->cache_size) == 0) { outbuf = Tcl_NewObj(); if (toplevel) { -- David N. Welton Consulting: http://www.dedasys.com/ Personal: http://www.dedasys.com/davidw/ Free Software: http://www.dedasys.com/freesoftware/ Apache Tcl: http://tcl.apache.org/ --------------------------------------------------------------------- To unsubscribe, e-mail: wendyjenkins@example.net For additional commands, e-mail: wendyjenkins@example.net From wendyjenkins@example.net Tue Jun 10 11:08:35 2003 Return-Path: <wendyjenkins@example.net> Delivered-To: wendyjenkins@example.net Received: (qmail 36959 invoked by uid 500); 10 Jun 2003 11:08:34 -0000 Mailing-List: contact wendyjenkins@example.net; run by ezmlm Precedence: bulk X-No-Archive: yes List-Post: <mailto:wendyjenkins@example.net> List-Help: <mailto:wendyjenkins@example.net> List-Unsubscribe: <mailto:wendyjenkins@example.net> List-Subscribe: <mailto:wendyjenkins@example.net> Delivered-To: mailing list wendyjenkins@example.net Received: (qmail 36913 invoked from network); 10 Jun 2003 11:08:34 -0000 Received: from smtp1.libero.it (83.161.120.155) by daedalus.apache.org with SMTP; 10 Jun 2003 11:08:34 -0000 Received: from dedasys.com (83.161.120.155) by smtp1.libero.it (7.0.012) id 3ECB938A006861C7 for wendyjenkins@example.net; Tue, 10 Jun 2003 13:08:33 +0200 Received: by dedasys.com (Postfix, from userid 1000) id D6EEE4C772; Tue, 10 Jun 2003 13:09:28 +0200 (CEST) To: wendyjenkins@example.net Subject: Our 'global' command vs the env variable From: wendyjenkins@example.net (David N. Welton) Date: 10 Jun 2003 13:09:28 +0200 Message-ID: <wendyjenkins@example.net> Lines: 23 User-Agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.2 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N Hi, Dmitry Zuryanovich pointed out to me that our 'global' command is no longer working with the 'env' variable that is created by default by 'load_env'. The problem: proc global {args} { foreach arg $args { uplevel "888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4global 888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4request888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4$arg" } } but 'env' is 888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4nv, and not 888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4request888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4nv I think this needs sorting out... -- David N. Welton Consulting: http://www.dedasys.com/ Personal: http://www.dedasys.com/davidw/ Free Software: http://www.dedasys.com/freesoftware/ Apache Tcl: http://tcl.apache.org/ --------------------------------------------------------------------- To unsubscribe, e-mail: wendyjenkins@example.net For additional commands, e-mail: wendyjenkins@example.net From wendyjenkins@example.net Tue Jun 10 14:29:30 2003 Return-Path: <wendyjenkins@example.net> Delivered-To: wendyjenkins@example.net Received: (qmail 51823 invoked by uid 500); 10 Jun 2003 14:29:29 -0000 Mailing-List: contact wendyjenkins@example.net; run by ezmlm Precedence: bulk X-No-Archive: yes List-Post: <mailto:wendyjenkins@example.net> List-Help: <mailto:wendyjenkins@example.net> List-Unsubscribe: <mailto:wendyjenkins@example.net> List-Subscribe: <mailto:wendyjenkins@example.net> Delivered-To: mailing list wendyjenkins@example.net Received: (qmail 51757 invoked from network); 10 Jun 2003 14:29:28 -0000 Received: from droid2.spawar.navy.mil (83.161.120.155) by daedalus.apache.org with SMTP; 10 Jun 2003 14:29:28 -0000 Received: from HUCKABEEC.spawar.navy.mil (sc032ws061.chs.spawar.navy.mil [83.161.120.155]) by droid2.spawar.navy.mil (8.11.6/8.11.6) with ESMTP id h5AESg427926; Tue, 10 Jun 2003 07:28:42 -0700 Message-Id: <wendyjenkins@example.net> X-Sender: wendyjenkins@example.net (Unverified) X-Mailer: QUALCOMM Windows Eudora Version 5.2.1 Date: Tue, 10 Jun 2003 10:28:39 -0400 To: wendyjenkins@example.net (David N. Welton), Damon Courtney <wendyjenkins@example.net> From: Craig Huckabee <wendyjenkins@example.net> Subject: Re: directories Cc: wendyjenkins@example.net, Craig Huckabee <wendyjenkins@example.net> In-Reply-To: <wendyjenkins@example.net> References: <wendyjenkins@example.net> Mime-Version: 1.0 Content-Type: multipart/mixed; x-avg-checked=avg-ok-101D12DF; boundary="=======70B618E2=======" X-MailScanner: Found to be clean X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N --=======70B618E2======= Content-Type: text/plain; x-avg-checked=avg-ok-101D12DF; charset=us-ascii; format=flowed Content-Transfer-Encoding: 8bit At 03:58 PM 5/28/2003 +0200, David N. Welton wrote: > > > Is this going to do the right thing on windows, for instance? > > > Craig? > > > Couldn't tell ya'. Dunno if we can get info from APX on Windows. > >Craig is now CC'ed:-> Sorry to be a PITA... I'm CC'd but I'm swamped at work - I won't be able to contribute for a few weeks. --Craig / Craig Huckabee | e-mail: wendyjenkins@example.net / / Code 71B-CH | phone: 6693127488 / / SPAWAR Systems Center | close proximity: HeyYou! / / Charleston, SC | ICBM: 32.78N, 79.93W / --=======70B618E2======= Content-Type: text/plain; charset=us-ascii --------------------------------------------------------------------- To unsubscribe, e-mail: wendyjenkins@example.net For additional commands, e-mail: wendyjenkins@example.net --=======70B618E2=======-- From wendyjenkins@example.net Tue Jun 10 16:10:30 2003 Return-Path: <wendyjenkins@example.net> Delivered-To: wendyjenkins@example.net Received: (qmail 2676 invoked by uid 500); 10 Jun 2003 16:10:30 -0000 Mailing-List: contact wendyjenkins@example.net; run by ezmlm Precedence: bulk X-No-Archive: yes List-Post: <mailto:wendyjenkins@example.net> List-Help: <mailto:wendyjenkins@example.net> List-Unsubscribe: <mailto:wendyjenkins@example.net> List-Subscribe: <mailto:wendyjenkins@example.net> Delivered-To: mailing list wendyjenkins@example.net Received: (qmail 2658 invoked from network); 10 Jun 2003 16:10:29 -0000 Received: from smtp3.libero.it (83.161.120.155) by daedalus.apache.org with SMTP; 10 Jun 2003 16:10:29 -0000 Received: from dedasys.com (83.161.120.155) by smtp3.libero.it (7.0.012) id 3EE44A19000902E4 for wendyjenkins@example.net; Tue, 10 Jun 2003 18:10:32 +0200 Received: by dedasys.com (Postfix, from userid 1000) id 4217F4C772; Tue, 10 Jun 2003 18:11:27 +0200 (CEST) To: wendyjenkins@example.net Subject: Re: Our 'global' command vs the env variable References: <wendyjenkins@example.net> From: wendyjenkins@example.net (David N. Welton) Date: 10 Jun 2003 18:11:26 +0200 In-Reply-To: <wendyjenkins@example.net> Message-ID: <wendyjenkins@example.net> Lines: 23 User-Agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.2 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N A few things to consider: The load_env command should make the variable wherever the command occurs, be it in a proc, namespace, or global. Maybe we should use: Tcl_ObjSetVar2(req->interp, envvar, key, val, TCL_NAMESPACE_ONLY); instead of: Tcl_ObjSetVar2(req->interp, envvar, key, val, 0); (and do the same thing in the load_headers command). That seems to make things work as advertised. Does that make sense? -- David N. Welton Consulting: http://www.dedasys.com/ Personal: http://www.dedasys.com/davidw/ Free Software: http://www.dedasys.com/freesoftware/ Apache Tcl: http://tcl.apache.org/ --------------------------------------------------------------------- To unsubscribe, e-mail: wendyjenkins@example.net For additional commands, e-mail: wendyjenkins@example.net From wendyjenkins@example.net Tue Jun 10 16:23:36 2003 Return-Path: <wendyjenkins@example.net> Delivered-To: wendyjenkins@example.net Received: (qmail 21187 invoked by uid 500); 10 Jun 2003 16:23:35 -0000 Mailing-List: contact wendyjenkins@example.net; run by ezmlm Precedence: bulk X-No-Archive: yes List-Post: <mailto:wendyjenkins@example.net> List-Help: <mailto:wendyjenkins@example.net> List-Unsubscribe: <mailto:wendyjenkins@example.net> List-Subscribe: <mailto:wendyjenkins@example.net> Delivered-To: mailing list wendyjenkins@example.net Received: (qmail 21173 invoked from network); 10 Jun 2003 16:23:35 -0000 Received: from icarus.apache.org (83.161.120.155) by daedalus.apache.org with SMTP; 10 Jun 2003 16:23:35 -0000 Received: (qmail 48019 invoked by uid 1048); 10 Jun 2003 16:23:34 -0000 Date: 10 Jun 2003 16:23:34 -0000 Message-ID: <wendyjenkins@example.net> From: wendyjenkins@example.net To: wendyjenkins@example.net Subject: cvs commit: tcl-rivet/doc rivet_utf_ru.xml X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N davidw 2003/06/10 09:23:32 Added: doc rivet_utf_ru.xml Log: * doc/rivet_utf_ru.xml: Added Russian translation of documentation by Dmitry Zuryanovich. Revision Changes Path 1.1 tcl-rivet/doc/rivet_utf_ru.xml Index: rivet_utf_ru.xml =================================================================== <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" "http://www.oasis-open.org/committees/docbook/xml/4.1.2/docbookx.dtd" [ <!ENTITY hello.rvt SYSTEM "examples/hello.rvt" > <!ENTITY table.rvt SYSTEM "examples/table.rvt" > <!ENTITY vars.html SYSTEM "examples/vars.html" > <!ENTITY vars.rvt SYSTEM "examples/vars.rvt" > <!ENTITY upload.html SYSTEM "examples/upload.html" > <!ENTITY upload.rvt SYSTEM "examples/upload.rvt" > ]> <article> <articleinfo> <title>Apache Rivet</title> <copyright> <year>2002</year> <holder>Apache Software Foundation</holder> </copyright> <author> <firstname>David</firstname> <surname>Welton</surname> <affiliation> <address> <email>wendyjenkins@example.net</email> </address> </affiliation> </author> <author> <firstname>Damon</firstname> <surname>Courtney</surname> <affiliation> <address> <email>wendyjenkins@example.net</email> </address> </affiliation> </author> <othercredit> <firstname>Dmitry</firstname> <surname>Zuryanovich</surname> <contrib>Russian Translation</contrib> <affiliation> <address>wendyjenkins@example.net</address> </affiliation> </othercredit> </articleinfo> <section> <title>Введение в Apache Rivet</title> <para> Apache Rivet - это система для генерации динамических веб страниц, встроенная модулем в http сервер Apache. Она задумывалась как система быстрая, мощная, расширяемая и достаточно простая для внедрения. Стоит заметить что с Apache Rivet вы получаете надежную платформу которая не только может интегрироваться в web, но и может быть использована вне его. GUI и приложения командной строки (command line) могут использовать тот же код, который используется при разработках web-приложений. Это достигается применением языка TCL - вне и внутри Apache сервера. </para> <para> В этом документе мы постараемся помочь вам быстро разобраться как можно создавать web- приложения, и показать вам дальнейшие пути для разработки приложений используя rivet для самых разнообразных применений. </para> <para> Эта документация - как и весь rivet, и тем более ее перевод на русский - это работа, которая не заврешена, и будем надеяться будет продолжаться еще очень долго. Если вы видите что что-то где-то почему-то не так - то пишите об этом, мы сами за всем не углядим без вашей помощи. </para> </section> <section id="installation"> <title>Установка Apache Rivet</title> <procedure> <step> <title>Check Dependencies/Проверка связей между программным обеспечением</title> <para> Для того чтобы установить rivet, вам в первую очередь понадобится сам Tcl, версии 8.2 или выше. Известно что все должно работать на Linux, FreeBSD,OpenBSD, Solaris и HPUX. Возможно что можно заставитиь работать даже на Windows NT - читайте далее и экспериментируйте. </para> </step> <step> <title>Скачайте себе Rivet</title> <para> Возьмите исходники отсюда <ulink url="http://tcl.apache.org/rivet/download"/>. На данный момент это единственный способ получить rivet. Возможно в дальнейшем появится FreeBSD port, Debian package, RPM и бинарники под Windows. </para> </step> <step performance="optional"> <title>Скачайте и соберите Apache</title> <para> Если у вас нет исходников Apache, или вы хотите собрать rivet как статический модуль, то вам придется скачать исходники apache отсюда <ulink url="http://httpd.apache.org/"/>. Но если вы не собираетесь собирать rivet как статический модуль - то вам этого не придется делать. Мы рекомендуем собирать rivet как динамическую библиотеку (shared object), и соответсвенно собирать его отдельно от Apache. </para> </step> <step> <title>Разархивация исходников</title> <para> Сейчас мы будем считать что apache вами был каким-то образом установлен. Теперь вы должны разархивировать исходники rivet там где вы хотите их собирать. <programlisting>gunzip tcl-rivet-X.X.X.tar.gz tar -xvf tcl-rivet-X.X.X.tar.gz</programlisting> </para> </step> <step> <title>Компиляция Rivet</title> <para> Rivet использует некую свою уникальную систему компиляции которую мы специально придумали именно для него. Она использует информацию из инсталяций Apache и Tcl, для того чтобы собрать себя саму через набор Tcl скриптов, которые находятся <filename>buildscripts/</filename> тут. </para> <substeps> <step> <title>Редактирование src/make.tcl</title> <para> Возможно вам придется отредактировать <filename>src/make.tcl</filename> при некоторых условиях. Сначала попробуйте следующий шаг, и только если он у вас не получится - то вам придется действительно поредактировать этот файл. </para> </step> <step> <para> Сейчас вы должны быть готовы к сборке всего вместе: </para> <programlisting>cd src/ ./make.tcl <replaceable>option</replaceable></programlisting> <para>where <replaceable>option</replaceable> can be either <option>shared</option> or <option>static</option>. </para> </step> <step> <title>Установка</title> <para> Сейчас самое время запустить <command>./make.tcl install</command> чтобы все установить. Эта команда должна скопировать получившийся .so файл (типа <filename>mod_rivet.so</filename>), если он конечно скомпилируется, в директорию Apache <filename>libexec</filename>, а так же установит некоторое количество полезных скриптов и прочего кода. </para> </step> </substeps> </step> <step> <title>Конфигурация Apache</title> <para> Конфигурировать Rivet достаточно просто - начнем с того что добавим сам модуль: </para> <programlisting>LoadModule rivet_module <replaceable>/usr/lib/apache/1.3/mod_rivet.so</replacea ble></programlisting> <para> После этого Apache должен знать что ему надо загрузить Rivet как shared object, чтобы иметь возможность его использовать. Далее мы должны объяснить Apache какие файлы надо обрабатывать Rivetом и как это делать: </para> <programlisting>AddType application/x-httpd-rivet .rvt AddType application/x-rivet-tcl .tcl</programlisting> <para> Эти директивы объяснят Apache что файлы с расширением <filename>.rvt</filename> и <filename>.tcl</filename> надо обрабатывать Rivetом. </para> <para> Все остальные директивы описаны тут <xref linkend="directives"/>. </para> </step> </procedure> </section> <section id="directives"> <title>Конфигурационные параметры Rivet Apache</title> <para> Это - разнообразный набор установок которые могут быть сделаны в конфигурационнном файле Apache с целью изменения поведения Rivet. Их формат такой: <command>RivetDirConf</command>, <command>RivetUserConf</command>, <command>RivetServerConf</command>, что означает что DirConf имеет более высокий приоритет и перебивает установки в UserConf, что в свою очередь перебивает ServerConf. </para> <variablelist> <varlistentry> <term> <cmdsynopsis> <command>RivetServerConf</command> <group choice="req"> <arg>CacheSize</arg> <arg>GlobalInitScript</arg> <arg>ChildInitScript</arg> <arg>ChildExitScript</arg> <arg>BeforeScript</arg> <arg>AfterScript</arg> <arg>ErrorScript</arg> <arg>UploadDirectory</arg> <arg>UploadMaxSize</arg> <arg>UploadFilesToVar</arg> <arg>SeperateVirtualInterps</arg> </group> </cmdsynopsis> </term> <listitem> <para><command>RivetServerConf</command> Устанавливает глобальные опции для всего сервера </para> </listitem> <listitem> <variablelist> <varlistentry> <term> <cmdsynopsis> <arg>CacheSize</arg> <arg><replaceable>size</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Устанавливает опции для внутреннего кеша для страниц, где <option><replaceable>size</replaceable></option> - количество компилированных страниц которые будут хранится в кеше для испозьзования в будущем. По умолчанию - <command>MaxRequestsPerChild</command> / 5, или 50, если <command>MaxRequestsPerChild</command> установлен в 0. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>GlobalInitScript</arg> <arg><replaceable>script</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Tcl скрипт который должен быть запущен для каждого интерпретатора.<replaceable><option>script</option></replaceable> - обычный Tcl скрипт, поэтому чтобы запустить файл - <programlisting>RivetServerConf GlobalInitScript "source /var/www/foobar.tcl"</progra mlisting> </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>ChildInitScript</arg> <arg><replaceable>script</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Скрипт который будет запущен для каждого дочернего процесса в Apache. Это идельное место чтобы загружать модули, создавать глобальные переменные, соединяться с базами данных и все такое. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>ChildExitScript</arg> <arg><replaceable>script</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Скрипт который будет выполняться когда каждый порожденный Apache процесс оканчивает работу. Это идеальное место чтобы освобождать все ресурсы занятые в <option>ChildInitScript</option>. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>BeforeScript</arg> <arg><replaceable>script</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Скрипт который будет выполняться перед тем как сервер запустит .rvt страницу. Может быть использован для того, чтобы, например, создавать стандарный header (в терминологии http, например - image/png). Также может быть использован для того чтобы подгружать код который будет использоваться на каждой странице, если вы не хотите это делать в <option>GlobalInitScript</option> <option>ChildInitScript</option> когда вы разрабатываете веб сайт в первый раз (примечание переводчика: не понимаю, о чем это он? последняя строка - построчник) <note> Этот код исполняется на глобальном уровне, а не в том namespace в котором исполняются страницы </note> </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>AfterScript</arg> <arg><replaceable>script</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Скрипт который будет вызываться после каждой (.rvt) страницы. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>ErrorScript</arg> <arg><replaceable>script</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Если внутри rivet произойдет ошибка, то он сооружает некую html-страницу с информацией о том, что собственно, произошло. Если же <option>ErrorScript</option> указан, то можно создать свою страницу, которая будет вызываться в этом случае. Это может быть полезно когда вы не хотите показывать пользователю свой код с ошибками. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>UploadDirectory</arg> <arg><replaceable>directory</replaceable></arg> </cmdsynopsis> </term> <listitem> <para>Директория в которую надо складывать загруженые (uploaded) пользователем файлы.</ para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>UploadMaxSize</arg> <arg><replaceable>size</replaceable></arg> </cmdsynopsis> </term> <listitem> <para>Максимальный размер для загруженных (uploaded) файлов.</para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>UploadFilesToVar</arg> <group choice="req"><arg>yes</arg><arg>no</arg></group> </cmdsynopsis> </term> <listitem> <para> Эта установка регулирует возможность закачки (upload) файлов прямо в Tcl переменную. Если у вас установлено ограничение по размеру на закачиваемые файлы, а вам не особенно хочется общаться со слишком большими файлами, то эта установка позволяет вам складывать их на диск. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>SeperateVirtualInterps</arg> <group choice="req"> <arg>yes</arg> <arg>no</arg> </group> </cmdsynopsis> </term> <listitem> <para> Если эта опция установлена, то rivet будет создавать отдельный интерпретатор Tcl на каждый VirtualHost в терминологии Apache. Это полезно в ситуации когда вы - хостер и надо чтобы для каждого клиента был свой собственный интерпретатор, чтобы они друг с другом не конфликтовали. </para> </listitem> </varlistentry> </variablelist> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <command>RivetDirConf</command> <group choice="req"> <arg>BeforeScript</arg> <arg>AfterScript</arg> <arg>ErrorScript</arg> <arg>UploadDirectory</arg> </group> </cmdsynopsis> </term> <listitem> <para> Эта установка - тоже самое что <command>RivetServerConf</command>, кроме того что они касаются только той директории в которой они указаны, и ее поддиректорий. Можно использовать в <command>Directory</command> разделах. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <command>RivetUserConf</command> <group choice="req"> <arg>BeforeScript</arg> <arg>AfterScript</arg> <arg>ErrorScript</arg> <arg>UploadDirectory</arg> </group> </cmdsynopsis> </term> <listitem> <para> Эти опции - то же самое что и <command>RivetServerConf</command>, кроме лишь того что они действуют только для указанной директории, и ее поддиректорий </para> </listitem> </varlistentry> </variablelist> </section> <section id="commands"> <title>Rivet Tcl: команды и переменные</title> <variablelist> <varlistentry> <term> <cmdsynopsis> <command>var</command> <group choice="req"> <arg>get</arg> <arg>list</arg> <arg>exists</arg> <arg>number</arg> <arg>all</arg> </group> </cmdsynopsis> </term> <listitem> <para> Команда <command>var</command> предназначена для доступа к переменным которые были переданы методами GET или POST, не делая между ними никакой разницы. Стоит заметить что есть еще две формы команды <command>var</command>: <command>var_qs</command> и <command>var_post</command>. Эти команды рассматривают только переменные переданные GETом и POSTом, соответсвенно. </para> <variablelist> <varlistentry> <term> <cmdsynopsis> <arg>get</arg> <arg><replaceable>varname</replaceable></arg> <arg><replaceable><optional>default</optional></replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Возвращает значение переданной вам методом GET или POST переменной <option><replaceable>varname</replaceable></option> (даже если есть несколько значений). Если же такой переменной не было передано - то возвращается <option><replaceable><optional>default</optional></replaceable></option>, а если и оно не было указано - то "" - пустая строка. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>list</arg> <arg><replaceable>varname</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Возвращает значение переменной <option><replaceable>varname</replaceable></option> как список, если для этой переменной было много значений. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>exists</arg> <arg><replaceable>varname</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Возвращает 1 если <option><replaceable>varname</replaceable></option> вам передана, и 0 если нет. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>number</arg> </cmdsynopsis> </term> <listitem> <para> Возвращает количество переменных. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>all</arg> </cmdsynopsis> </term> <listitem> <para> Возвращает список из имен переменных и их значений. </para> </listitem> </varlistentry> </variablelist> <para> См. так же <xref linkend="variable_access"/>. </para> </listitem> </varlistentry> </variablelist> <variablelist> <varlistentry> <term> <cmdsynopsis> <command>upload</command> <group choice="req"> <arg>channel</arg> <arg>save</arg> <arg>data</arg> <arg>exists</arg> <arg>size</arg> <arg>type</arg> <arg>filename</arg> </group> </cmdsynopsis> </term> <listitem> <para> Команда upload предназначена для обработки закачанных (uploaded) файлов. Обратите внимание что поведение этой команды зависит от конфигурации Apache и Rivet. </para> <variablelist> <varlistentry> <term> <cmdsynopsis> <arg>channel</arg> <arg><replaceable>uploadname</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Если передано имя закачанного файла, то <option><replaceable>uploadname</replaceable></option>, возвращает Tcl handle (как open (?)) для обращения к этому файлу. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>save</arg> <arg><replaceable>uploadname</replaceable></arg> <arg><replaceable>filename</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Сохраняет <option><replaceable>uploadname</replaceable></option> в файле <option><replaceable>filename</replaceable></option>. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>data</arg> <arg><replaceable>uploadname</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Возвращает данные загруженные на сервер. Должно работать так же и с бинарными файлами. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>size</arg> <arg><replaceable>uploadname</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Возвращает размер закачанного файла. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>type</arg> </cmdsynopsis> </term> <listitem> <para> Возвращает значение <varname>Content-type</varname>, если оно установлено, или пустую строчку, если нет. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>filename</arg> <arg><replaceable>uploadname</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Возвращает имя закачанного файла на клиентской машине. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>names</arg> </cmdsynopsis> </term> <listitem> <para> Возвращает список имен переменных для всех закачанных файлов </para> </listitem> </varlistentry> </variablelist> <para> См. так же <xref linkend="upload"/>. </para> </listitem> </varlistentry> </variablelist> <variablelist> <varlistentry> <term> <cmdsynopsis> <command>load_env</command> <arg choice="opt"><replaceable>array_name</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Загружает в указанный массив переменные окружения. По умолчанию делает это в массив <option>888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4request888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4nv</option> </para> <para> Так как страницы выполняются в пространстве имен <option>888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4request</option>, то нет необходимости обращатся к этому массиву по полному имени - вполне можно ограничиться просто <option>env</option> (примечание переводчика: щааааз!). </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <command>load_headers</command> <arg><replaceable>array_name</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Загужает клиентские HTTP заголовки в указанный массив, или в <option>headers</option> если имя массива не указано. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <command>load_cookies</command> <arg choice="opt"><replaceable>array_name</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Загужает переданные клиентом Cookie в указанный массив, или в <option>headers</option> если имя массива не указано. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <command>include</command> <arg><replaceable>filename_name</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Подгружает файл без обратки тэгов &lt;? и ?&gt;. Это лучший способ включить HTML файл или другой статический контент. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <command>parse</command> <arg><replaceable>filename</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Почти то же что и команда Tcl <command>source</command>, но только с учетом тегов &lt;? и ?&gt;, используемых Rivetом. Этой командой можно загружать один .rvt файл в другой. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <command>headers</command> <group choice="req"> <arg>set</arg> <arg>redirect</arg> <arg>add</arg> <arg>type</arg> <arg>numeric</arg> </group> </cmdsynopsis> </term> <listitem> <para> Команда <command>headers</command> предназначена для работы с заголовками http. </para> <para> <variablelist> <varlistentry> <term> <cmdsynopsis> <arg>redirect</arg> <arg><replaceable>uri</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Перенаправление (redirect) с текущей страницы на новый URI. <emphasis>Обязана</emphasis> быть в самом начале кода (?) </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>setcookie</arg> <arg>-name</arg> <arg><replaceable>cookie-name</replaceable></arg> <arg>-value</arg> <arg><replaceable>cookie-value</replaceable></arg> <arg choice="opt">-expires <replaceable>date/time</replaceable></arg> <arg choice="opt">-domain <replaceable>domain</replaceable></arg> <arg choice="opt">-path <replaceable>path</replaceable></arg> <arg choice="opt">-secure</arg> </cmdsynopsis> </term> <listitem> <para> Эта команда преденазаначена для установки Cookies, которые будут посланы сервером клиенту. <option>cookie-name</option> - это имя Cookie, <option>cookie-value</option> - это значение, <option>-expires</option> устанавливает дату протухания Cookie, и обязана быть в виде <constant>'DD-Mon-YY HH:MM:SS'</constant>, <option>-path</option> устанавливает путь, а <option>-secure</option> указывает что эта Cookie должна передаваться только по HTTPS </para> </listitem> </varlistentry> <varlistentry> <term><cmdsynopsis> <arg>type</arg> <arg><replaceable>content-type</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Эта команда устанавливает HTTP заголовок <constant>Content-type</constant> который выозвращается клиенту при обращении к странице. Это полезно если вы отдаете содержимое отличное от text/html или указываете кодировку. </para> </listitem> </varlistentry> <varlistentry> <term><cmdsynopsis> <arg>set</arg> <arg><replaceable>headername</replaceable></arg> <arg><replaceable>value</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Устанавливает любые имена и значения http заголовков </para> </listitem> </varlistentry> </variablelist> </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <command>makeurl</command> <arg><replaceable>filename</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Создает URL который ссылается сам на себя из имени файла. Например: <programlisting>makeurl /tclp.gif</programlisting> вернет <constant>http://[hostname]:[port]/tclp.gif</constant>. где hostname и port - это имя хоста и порт той страницы которая была указана при запросе. </para> </listitem> </varlistentry> </variablelist> </section> <section id="examples"> <title>Примеры использования</title> <para> Далее - примеры использования Rivet. Подразумевается что читатель имеет некоторые знания Tcl. Если же вы его не знаете - не волнуйтесь, это простой язык, и множество как минимум англоязычной документации и учебников доступно в сети. Посмотрите например <link linkend="websites"> сюда </link>. </para> <example id="hello world"> <title>Hello World</title> <para> Естественно, первым примером будет "Hello World". </para> <para> Мы предполагаем что к этому моменту Apache сконфигурирован и понимает .rvt файлы, создадим файл <filename>hello.rvt</filename> в месте где Apache сможет его найдти со следующим содержимым: </para> <programlisting>&hello.rvt;</programlisting> <para> Если вы обратитесь к этому файлу через броузер, вы должны увидеть практически чистую страницу с надписью "Helo World" (без кавычек). </para> </example> <example id="table"> <title>Создание таблицы</title> <para> В следующем, тоже простом примере мы покажем как создать таблицы: </para> <programlisting>&table.rvt;</programlisting> <para> Если вы вчитаетесь в код, то убедитесь что это чистейший Tcl. Мы можем запустить этот код и вне Rivet - и он будет генерировать такой же HTML! </para> <para> Результат должен быть похож на: </para> <graphic fileref="table.png"/> </example> <example id="variable_access"> <title>Доступ к переменным</title> <para> А тут мы продемонстрируем как обращаться с переменными переданными вам методом POST или GET. </para> <para> Из такой HTML формы: </para> <programlisting>&vars.html;</programlisting> <para> Мы можем использовать rivet скрипт чтобы получить доступ к этим переменным: </para> <programlisting>&vars.rvt;</programlisting> <para> Первый оператор проверяет что переменная <varname>boss</varname> была переданна скрипту, и потом что-то делает с этой информацией. Если же такой нет - то в список ошибок добавляется сообщение об этом прискорбном факте. </para> <para> Во втором куске кода, переменная <varname>salary</varname> обрабатывается примерно таким же образом, и к тому же еще и проверяется на то является ли она числом. </para> <para> Если переменная <varname>boss</varname> не введена - то она заменяется на "Mr. Burns". </para> <para> А последний кусок кода немножко хитрее, потому что переменная <varname>skills</varname> - это listbox, и в принципе может иметь несколько значений, и тут мы покажем как с ними поступать. </para> <para> Скрипт в последствии проверяет что <varname>errlist</varname> пустой (а если нет - то информирует вас об ошибках) и говорит что спасибо и все такое. </para> </example> <example id="upload"> <title>Закачка файлов (Upload)</title> <para> Пусть есть такой HTML код <filename>upload.html</filename> </para> <programlisting>&upload.html;</programlisting> <para> Из такого Tcl кода, например, (под названием <filename>upload.rvt</filename>) мы получаем доступ к загруженному файлу. </para> <programlisting>&upload.rvt;</programlisting> </example> </section> <section id="help"> <title>Ресурсы и как получить помощь</title> <section> <title>Mailing Lists</title> <para> Mailing List (список рассылка) - это первейшее место куда надо обращаться за помощью, если, конечно, вы не нашли ответа в документации. Пишите на <email>wendyjenkins@example.net</email>. Если у вас есть мысли, идеи, или просто соображения о Rivet и его коде, то пишите на <email>wendyjenkins@example.net</email>. Чтобы подписаться на оба листа, пишите email на <email>rivet-<replaceable>list</replaceable>-wendyjenkins@example.net</email>. </para> <para> Архивы списка рассылки доступны тут <ulink url="http://nagoya.apache.org/eyebrowse/SummarizeList?listId=118"/> </para> </section> <section id="websites"> <title>Web Sites</title> <para> Есть некоторое количество полезных веб сайтов про Apache и Tcl. </para> <itemizedlist> <listitem> <para> <ulink url="http://tcl.apache.org"/> это домашняя страница проекта Apache Tcl. Сюда надо ходить за свежими версиями софта. </para> </listitem> <listitem> <para> <ulink url="http://httpd.apache.org/docs/"/> по всем вопросам касающимся Apache </para> </listitem> <listitem> <para> <ulink url="http://www.tcl.tk/"/> классическое место где гнездится Tcl. </para> </listitem> <listitem> <para> <ulink url="http://wiki.tcl.tk"/> Tcl's Wiki, весьма полезный ресурс для задавания вопросов, получения ответов и отвечания на них для тех кто крут. </para> </listitem> </itemizedlist> </section> <section> <title>Система отлова ошибок</title> <para> Apache Rivet использует ВсеАпачную Систему Отлова Ошибок (ВАСОО) <ulink url="http://nagoya.apache.org/bugzilla/"></ulink>. Всякие проблемы пишите сюда, или - что тоже полезно - вы можете выяснить опыт ее решения, если кто-то уже с ней сталкивался. </para> </section> </section> <section id="internals"> <title>Внутренности Rivet</title> <para> Эта секция давно устарела, поскольку новый код добавляется, а старый убирается. Так что лучше читайте исходники - они рулез!. И вообще если хотите чего-нибудь написать - FIXME. </para> <section> <title>Инициализация</title> <para> Когда apavhe запускается (или когда запускается использующий TCL дочерний процесс Apache ), вызывается <function>Rivet_InitTclStuff</function>, который создает новый интерпретатор, по одному на каждый виртуальный хост, в зависимости от конфигурации. Также инициализируются всякие вещи типа <structname>RivetChan</structname> канальная система (channel system), создаются специфичные для Rivet Tcl команды и исполняется Rivetовский channel system, creates the Rivet-specific Tcl commands, and <filename>init.tcl</filename>. Система кеширования, опять же, и если есть <command>GlobalInitScript</command>, то и он запускается. </para> </section> <section> <title>RivetChan</title> <para> Система <structname>RivetChan</structname> была создана для того чтобы перенаправлять стандартный поток вывода (stdout). По этой причине вы можете использовать стандартную команду <command>puts</command> в страницах .rvt. (примечание переводчика: и <command>fconfigure</command> тоже, что полезно). Она также создает канал который буферизует output, и перенаправляет его в систему ввода-вывода Apache. </para> </section> <section> <title>Обработка страниц, выполнение и кеширование</title> <para> Когда выполняется Rivet страница, она превращается в обычный Tcl скрипт, опираясь на символы &lt;? ?&gt;. Все что вне их рассматривается как большой большой аргумент для <command>puts</command>, а все что внутри - рассматривается как Tcl код. </para> <para> Каждый .rvt файл выполняется в простанстве имен <constant>888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4request</constant>, по этому нет необходимости каждый раз создавать по новому интерпретатору. По этой же причине глобальные переменные (примечание преводчика: звиняйте, не понял) By running in its own namespace, though, each page will not run afoul of local variables created by other scripts, because they will be deleted automatically when the namespace goes away after Apache finishes handling the request. </para> <note> Одна из существующих ныне проблем подобного подхода - это отсутсвие механизма сборщика мусора, например, если вы не закрыли хэндл файла - то это плохо. Поэтому будьте добры, закрывайте все что наоткрывали. </note> <para> После того как скрипт загружен и преобразован в "чистый Tcl", он опять же кешируется, и по этой причине может быть использован в следующий раз без лишних преобразований и обращений к диску. Количество кешируемых скриптов можно изменить в конфиге. Таким образом можно значительно поднять производительность системы. </para> </section> </section> <section id="upgrading"> <title>Переход с mod_dtcl или NeoWebScript (NWS)</title> <para> Обратная совместимость не была никогда особой целью разработчиков, но мы ее все равно предоставляем по историческим причинам и с учетом пожеланий тех кто переключается на Rivet с mod_dtcl и NeoWebScript (NWS). </para> <section> <title>mod_dtcl</title> <para> Rivet базируется на коде mod_dtcl, но достаточно хорошо переработан. Основная идея осталась та же, но большое количетво команд изменилось. </para> </section> <section> <title>NeoWebScript</title> <para>Потом.</para> </section> </section> </article> --------------------------------------------------------------------- To unsubscribe, e-mail: wendyjenkins@example.net For additional commands, e-mail: wendyjenkins@example.net From wendyjenkins@example.net Tue Jun 10 17:13:13 2003 Return-Path: <wendyjenkins@example.net> Delivered-To: wendyjenkins@example.net Received: (qmail 15961 invoked by uid 500); 10 Jun 2003 17:13:12 -0000 Mailing-List: contact wendyjenkins@example.net; run by ezmlm Precedence: bulk X-No-Archive: yes List-Post: <mailto:wendyjenkins@example.net> List-Help: <mailto:wendyjenkins@example.net> List-Unsubscribe: <mailto:wendyjenkins@example.net> List-Subscribe: <mailto:wendyjenkins@example.net> Delivered-To: mailing list wendyjenkins@example.net Received: (qmail 15948 invoked from network); 10 Jun 2003 17:13:12 -0000 Received: from icarus.apache.org (83.161.120.155) by daedalus.apache.org with SMTP; 10 Jun 2003 17:13:12 -0000 Received: (qmail 59538 invoked by uid 1048); 10 Jun 2003 17:13:12 -0000 Date: 10 Jun 2003 17:13:12 -0000 Message-ID: <wendyjenkins@example.net> From: wendyjenkins@example.net To: wendyjenkins@example.net Subject: cvs commit: tcl-rivet/doc rivet_utf_ru.xml X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N davidw 2003/06/10 10:13:12 Modified: doc rivet_utf_ru.xml Log: Fixed a few things, changed Dmitry's name. Revision Changes Path 1.2 +4 -6 tcl-rivet/doc/rivet_utf_ru.xml Index: rivet_utf_ru.xml =================================================================== RCS file: /home/cvs/tcl-rivet/doc/rivet_utf_ru.xml,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- rivet_utf_ru.xml 10 Jun 2003 16:23:32 -0000 1.1 +++ rivet_utf_ru.xml 10 Jun 2003 17:13:11 -0000 1.2 @@ -37,6 +37,7 @@ </author> <othercredit> <firstname>Dmitry</firstname> + <othername>the</othername> <surname>Zuryanovich</surname> <contrib>Russian Translation</contrib> <affiliation> @@ -183,8 +184,7 @@ добавим сам модуль: </para> - <programlisting>LoadModule rivet_module <replaceable>/usr/lib/apache/1.3/mod_rivet.so</replacea -ble></programlisting> + <programlisting>LoadModule rivet_module <replaceable>/usr/lib/apache/1.3/mod_rivet.so</replaceable></programlisting> <para> После этого Apache должен знать что ему надо загрузить @@ -281,8 +281,7 @@ Tcl скрипт который должен быть запущен для каждого интерпретатора.<replaceable><option>script</option></replaceable> - обычный Tcl скрипт, поэтому чтобы запустить файл - - <programlisting>RivetServerConf GlobalInitScript "source /var/www/foobar.tcl"</progra -mlisting> + <programlisting>RivetServerConf GlobalInitScript "source /var/www/foobar.tcl"</programlisting> </para> </listitem> </varlistentry> @@ -392,8 +391,7 @@ </cmdsynopsis> </term> <listitem> - <para>Директория в которую надо складывать загруженые (uploaded) пользователем файлы.</ -para> + <para>Директория в которую надо складывать загруженые (uploaded) пользователем файлы.</para> </listitem> </varlistentry> --------------------------------------------------------------------- To unsubscribe, e-mail: wendyjenkins@example.net For additional commands, e-mail: wendyjenkins@example.net From wendyjenkins@example.net Thu Jun 12 10:20:28 2003 Return-Path: <wendyjenkins@example.net> Delivered-To: wendyjenkins@example.net Received: (qmail 63707 invoked by uid 500); 12 Jun 2003 10:20:28 -0000 Mailing-List: contact wendyjenkins@example.net; run by ezmlm Precedence: bulk X-No-Archive: yes List-Post: <mailto:wendyjenkins@example.net> List-Help: <mailto:wendyjenkins@example.net> List-Unsubscribe: <mailto:wendyjenkins@example.net> List-Subscribe: <mailto:wendyjenkins@example.net> Delivered-To: mailing list wendyjenkins@example.net Received: (qmail 63689 invoked from network); 12 Jun 2003 10:20:27 -0000 Received: from smtp0.libero.it (83.161.120.155) by daedalus.apache.org with SMTP; 12 Jun 2003 10:20:27 -0000 Received: from dedasys.com (83.161.120.155) by smtp0.libero.it (7.0.012) id 3ECC83C400710553; Thu, 12 Jun 2003 12:20:40 +0200 Received: by dedasys.com (Postfix, from userid 1000) id B55734CAD6; Thu, 12 Jun 2003 12:21:33 +0200 (CEST) To: wendyjenkins@example.net Cc: Dmitry the Zuryanovich <wendyjenkins@example.net> Subject: russian translation of docs From: wendyjenkins@example.net (David N. Welton) Date: 12 Jun 2003 12:21:33 +0200 Message-ID: <wendyjenkins@example.net> Lines: 29 User-Agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.2 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N Hi - I wanted to announce that we have a Russian translation of the docs, thanks to Dmitry 'the' Zuryanovich! I have been trying to figure out how to best manage the two translations. On the DocBook list, Bob Stayton was kind enough to share this: A revision control system like CVS is essential. You must be able to record author comments regarding editorial changes of the English files to know if they require updating in other languages. Noting that a file's modification date has changed is not enough information, since rearranging a line break will generate a diff. Also, you can record which version of an English file was sent to translation. And when the Russian file comes back, you can record in its comment which English version it was based on. I should have everything set up shortly to generate HTML files, which I will then upload to the web site. Ciao, -- David N. Welton Consulting: http://www.dedasys.com/ Personal: http://www.dedasys.com/davidw/ Free Software: http://www.dedasys.com/freesoftware/ Apache Tcl: http://tcl.apache.org/ --------------------------------------------------------------------- To unsubscribe, e-mail: wendyjenkins@example.net For additional commands, e-mail: wendyjenkins@example.net From wendyjenkins@example.net Thu Jun 12 10:21:22 2003 Return-Path: <wendyjenkins@example.net> Delivered-To: wendyjenkins@example.net Received: (qmail 64222 invoked by uid 500); 12 Jun 2003 10:21:22 -0000 Mailing-List: contact wendyjenkins@example.net; run by ezmlm Precedence: bulk X-No-Archive: yes List-Post: <mailto:wendyjenkins@example.net> List-Help: <mailto:wendyjenkins@example.net> List-Unsubscribe: <mailto:wendyjenkins@example.net> List-Subscribe: <mailto:wendyjenkins@example.net> Delivered-To: mailing list wendyjenkins@example.net Received: (qmail 64209 invoked from network); 12 Jun 2003 10:21:21 -0000 Received: from icarus.apache.org (83.161.120.155) by daedalus.apache.org with SMTP; 12 Jun 2003 10:21:21 -0000 Received: (qmail 69345 invoked by uid 1048); 12 Jun 2003 10:21:19 -0000 Date: 12 Jun 2003 10:21:19 -0000 Message-ID: <wendyjenkins@example.net> From: wendyjenkins@example.net To: wendyjenkins@example.net Subject: cvs commit: tcl-rivet/doc rivet.ru_UTF.xml X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N davidw 2003/06/12 03:21:19 Added: doc rivet.ru_UTF.xml Log: Changed name of rivet russian translation. Revision Changes Path 1.1 tcl-rivet/doc/rivet.ru_UTF.xml Index: rivet.ru_UTF.xml =================================================================== <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" "http://www.oasis-open.org/committees/docbook/xml/4.1.2/docbookx.dtd" [ <!ENTITY hello.rvt SYSTEM "examples/hello.rvt" > <!ENTITY table.rvt SYSTEM "examples/table.rvt" > <!ENTITY vars.html SYSTEM "examples/vars.html" > <!ENTITY vars.rvt SYSTEM "examples/vars.rvt" > <!ENTITY upload.html SYSTEM "examples/upload.html" > <!ENTITY upload.rvt SYSTEM "examples/upload.rvt" > ]> <article> <articleinfo> <title>Apache Rivet</title> <copyright> <year>2002</year> <holder>Apache Software Foundation</holder> </copyright> <author> <firstname>David</firstname> <surname>Welton</surname> <affiliation> <address> <email>wendyjenkins@example.net</email> </address> </affiliation> </author> <author> <firstname>Damon</firstname> <surname>Courtney</surname> <affiliation> <address> <email>wendyjenkins@example.net</email> </address> </affiliation> </author> <othercredit> <firstname>Dmitry</firstname> <othername>the</othername> <surname>Zuryanovich</surname> <contrib>Russian Translation</contrib> <affiliation> <address>wendyjenkins@example.net</address> </affiliation> </othercredit> </articleinfo> <section> <title>Введение в Apache Rivet</title> <para> Apache Rivet - это система для генерации динамических веб страниц, встроенная модулем в http сервер Apache. Она задумывалась как система быстрая, мощная, расширяемая и достаточно простая для внедрения. Стоит заметить что с Apache Rivet вы получаете надежную платформу которая не только может интегрироваться в web, но и может быть использована вне его. GUI и приложения командной строки (command line) могут использовать тот же код, который используется при разработках web-приложений. Это достигается применением языка TCL - вне и внутри Apache сервера. </para> <para> В этом документе мы постараемся помочь вам быстро разобраться как можно создавать web- приложения, и показать вам дальнейшие пути для разработки приложений используя rivet для самых разнообразных применений. </para> <para> Эта документация - как и весь rivet, и тем более ее перевод на русский - это работа, которая не заврешена, и будем надеяться будет продолжаться еще очень долго. Если вы видите что что-то где-то почему-то не так - то пишите об этом, мы сами за всем не углядим без вашей помощи. </para> </section> <section id="installation"> <title>Установка Apache Rivet</title> <procedure> <step> <title>Check Dependencies/Проверка связей между программным обеспечением</title> <para> Для того чтобы установить rivet, вам в первую очередь понадобится сам Tcl, версии 8.2 или выше. Известно что все должно работать на Linux, FreeBSD,OpenBSD, Solaris и HPUX. Возможно что можно заставитиь работать даже на Windows NT - читайте далее и экспериментируйте. </para> </step> <step> <title>Скачайте себе Rivet</title> <para> Возьмите исходники отсюда <ulink url="http://tcl.apache.org/rivet/download"/>. На данный момент это единственный способ получить rivet. Возможно в дальнейшем появится FreeBSD port, Debian package, RPM и бинарники под Windows. </para> </step> <step performance="optional"> <title>Скачайте и соберите Apache</title> <para> Если у вас нет исходников Apache, или вы хотите собрать rivet как статический модуль, то вам придется скачать исходники apache отсюда <ulink url="http://httpd.apache.org/"/>. Но если вы не собираетесь собирать rivet как статический модуль - то вам этого не придется делать. Мы рекомендуем собирать rivet как динамическую библиотеку (shared object), и соответсвенно собирать его отдельно от Apache. </para> </step> <step> <title>Разархивация исходников</title> <para> Сейчас мы будем считать что apache вами был каким-то образом установлен. Теперь вы должны разархивировать исходники rivet там где вы хотите их собирать. <programlisting>gunzip tcl-rivet-X.X.X.tar.gz tar -xvf tcl-rivet-X.X.X.tar.gz</programlisting> </para> </step> <step> <title>Компиляция Rivet</title> <para> Rivet использует некую свою уникальную систему компиляции которую мы специально придумали именно для него. Она использует информацию из инсталяций Apache и Tcl, для того чтобы собрать себя саму через набор Tcl скриптов, которые находятся <filename>buildscripts/</filename> тут. </para> <substeps> <step> <title>Редактирование src/make.tcl</title> <para> Возможно вам придется отредактировать <filename>src/make.tcl</filename> при некоторых условиях. Сначала попробуйте следующий шаг, и только если он у вас не получится - то вам придется действительно поредактировать этот файл. </para> </step> <step> <para> Сейчас вы должны быть готовы к сборке всего вместе: </para> <programlisting>cd src/ ./make.tcl <replaceable>option</replaceable></programlisting> <para>where <replaceable>option</replaceable> can be either <option>shared</option> or <option>static</option>. </para> </step> <step> <title>Установка</title> <para> Сейчас самое время запустить <command>./make.tcl install</command> чтобы все установить. Эта команда должна скопировать получившийся .so файл (типа <filename>mod_rivet.so</filename>), если он конечно скомпилируется, в директорию Apache <filename>libexec</filename>, а так же установит некоторое количество полезных скриптов и прочего кода. </para> </step> </substeps> </step> <step> <title>Конфигурация Apache</title> <para> Конфигурировать Rivet достаточно просто - начнем с того что добавим сам модуль: </para> <programlisting>LoadModule rivet_module <replaceable>/usr/lib/apache/1.3/mod_rivet.so</replaceable></programlisting> <para> После этого Apache должен знать что ему надо загрузить Rivet как shared object, чтобы иметь возможность его использовать. Далее мы должны объяснить Apache какие файлы надо обрабатывать Rivetом и как это делать: </para> <programlisting>AddType application/x-httpd-rivet .rvt AddType application/x-rivet-tcl .tcl</programlisting> <para> Эти директивы объяснят Apache что файлы с расширением <filename>.rvt</filename> и <filename>.tcl</filename> надо обрабатывать Rivetом. </para> <para> Все остальные директивы описаны тут <xref linkend="directives"/>. </para> </step> </procedure> </section> <section id="directives"> <title>Конфигурационные параметры Rivet Apache</title> <para> Это - разнообразный набор установок которые могут быть сделаны в конфигурационнном файле Apache с целью изменения поведения Rivet. Их формат такой: <command>RivetDirConf</command>, <command>RivetUserConf</command>, <command>RivetServerConf</command>, что означает что DirConf имеет более высокий приоритет и перебивает установки в UserConf, что в свою очередь перебивает ServerConf. </para> <variablelist> <varlistentry> <term> <cmdsynopsis> <command>RivetServerConf</command> <group choice="req"> <arg>CacheSize</arg> <arg>GlobalInitScript</arg> <arg>ChildInitScript</arg> <arg>ChildExitScript</arg> <arg>BeforeScript</arg> <arg>AfterScript</arg> <arg>ErrorScript</arg> <arg>UploadDirectory</arg> <arg>UploadMaxSize</arg> <arg>UploadFilesToVar</arg> <arg>SeperateVirtualInterps</arg> </group> </cmdsynopsis> </term> <listitem> <para><command>RivetServerConf</command> Устанавливает глобальные опции для всего сервера </para> </listitem> <listitem> <variablelist> <varlistentry> <term> <cmdsynopsis> <arg>CacheSize</arg> <arg><replaceable>size</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Устанавливает опции для внутреннего кеша для страниц, где <option><replaceable>size</replaceable></option> - количество компилированных страниц которые будут хранится в кеше для испозьзования в будущем. По умолчанию - <command>MaxRequestsPerChild</command> / 5, или 50, если <command>MaxRequestsPerChild</command> установлен в 0. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>GlobalInitScript</arg> <arg><replaceable>script</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Tcl скрипт который должен быть запущен для каждого интерпретатора.<replaceable><option>script</option></replaceable> - обычный Tcl скрипт, поэтому чтобы запустить файл - <programlisting>RivetServerConf GlobalInitScript "source /var/www/foobar.tcl"</programlisting> </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>ChildInitScript</arg> <arg><replaceable>script</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Скрипт который будет запущен для каждого дочернего процесса в Apache. Это идельное место чтобы загружать модули, создавать глобальные переменные, соединяться с базами данных и все такое. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>ChildExitScript</arg> <arg><replaceable>script</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Скрипт который будет выполняться когда каждый порожденный Apache процесс оканчивает работу. Это идеальное место чтобы освобождать все ресурсы занятые в <option>ChildInitScript</option>. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>BeforeScript</arg> <arg><replaceable>script</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Скрипт который будет выполняться перед тем как сервер запустит .rvt страницу. Может быть использован для того, чтобы, например, создавать стандарный header (в терминологии http, например - image/png). Также может быть использован для того чтобы подгружать код который будет использоваться на каждой странице, если вы не хотите это делать в <option>GlobalInitScript</option> <option>ChildInitScript</option> когда вы разрабатываете веб сайт в первый раз (примечание переводчика: не понимаю, о чем это он? последняя строка - построчник) <note> Этот код исполняется на глобальном уровне, а не в том namespace в котором исполняются страницы </note> </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>AfterScript</arg> <arg><replaceable>script</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Скрипт который будет вызываться после каждой (.rvt) страницы. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>ErrorScript</arg> <arg><replaceable>script</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Если внутри rivet произойдет ошибка, то он сооружает некую html-страницу с информацией о том, что собственно, произошло. Если же <option>ErrorScript</option> указан, то можно создать свою страницу, которая будет вызываться в этом случае. Это может быть полезно когда вы не хотите показывать пользователю свой код с ошибками. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>UploadDirectory</arg> <arg><replaceable>directory</replaceable></arg> </cmdsynopsis> </term> <listitem> <para>Директория в которую надо складывать загруженые (uploaded) пользователем файлы.</para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>UploadMaxSize</arg> <arg><replaceable>size</replaceable></arg> </cmdsynopsis> </term> <listitem> <para>Максимальный размер для загруженных (uploaded) файлов.</para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>UploadFilesToVar</arg> <group choice="req"><arg>yes</arg><arg>no</arg></group> </cmdsynopsis> </term> <listitem> <para> Эта установка регулирует возможность закачки (upload) файлов прямо в Tcl переменную. Если у вас установлено ограничение по размеру на закачиваемые файлы, а вам не особенно хочется общаться со слишком большими файлами, то эта установка позволяет вам складывать их на диск. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>SeperateVirtualInterps</arg> <group choice="req"> <arg>yes</arg> <arg>no</arg> </group> </cmdsynopsis> </term> <listitem> <para> Если эта опция установлена, то rivet будет создавать отдельный интерпретатор Tcl на каждый VirtualHost в терминологии Apache. Это полезно в ситуации когда вы - хостер и надо чтобы для каждого клиента был свой собственный интерпретатор, чтобы они друг с другом не конфликтовали. </para> </listitem> </varlistentry> </variablelist> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <command>RivetDirConf</command> <group choice="req"> <arg>BeforeScript</arg> <arg>AfterScript</arg> <arg>ErrorScript</arg> <arg>UploadDirectory</arg> </group> </cmdsynopsis> </term> <listitem> <para> Эта установка - тоже самое что <command>RivetServerConf</command>, кроме того что они касаются только той директории в которой они указаны, и ее поддиректорий. Можно использовать в <command>Directory</command> разделах. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <command>RivetUserConf</command> <group choice="req"> <arg>BeforeScript</arg> <arg>AfterScript</arg> <arg>ErrorScript</arg> <arg>UploadDirectory</arg> </group> </cmdsynopsis> </term> <listitem> <para> Эти опции - то же самое что и <command>RivetServerConf</command>, кроме лишь того что они действуют только для указанной директории, и ее поддиректорий </para> </listitem> </varlistentry> </variablelist> </section> <section id="commands"> <title>Rivet Tcl: команды и переменные</title> <variablelist> <varlistentry> <term> <cmdsynopsis> <command>var</command> <group choice="req"> <arg>get</arg> <arg>list</arg> <arg>exists</arg> <arg>number</arg> <arg>all</arg> </group> </cmdsynopsis> </term> <listitem> <para> Команда <command>var</command> предназначена для доступа к переменным которые были переданы методами GET или POST, не делая между ними никакой разницы. Стоит заметить что есть еще две формы команды <command>var</command>: <command>var_qs</command> и <command>var_post</command>. Эти команды рассматривают только переменные переданные GETом и POSTом, соответсвенно. </para> <variablelist> <varlistentry> <term> <cmdsynopsis> <arg>get</arg> <arg><replaceable>varname</replaceable></arg> <arg><replaceable><optional>default</optional></replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Возвращает значение переданной вам методом GET или POST переменной <option><replaceable>varname</replaceable></option> (даже если есть несколько значений). Если же такой переменной не было передано - то возвращается <option><replaceable><optional>default</optional></replaceable></option>, а если и оно не было указано - то "" - пустая строка. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>list</arg> <arg><replaceable>varname</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Возвращает значение переменной <option><replaceable>varname</replaceable></option> как список, если для этой переменной было много значений. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>exists</arg> <arg><replaceable>varname</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Возвращает 1 если <option><replaceable>varname</replaceable></option> вам передана, и 0 если нет. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>number</arg> </cmdsynopsis> </term> <listitem> <para> Возвращает количество переменных. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>all</arg> </cmdsynopsis> </term> <listitem> <para> Возвращает список из имен переменных и их значений. </para> </listitem> </varlistentry> </variablelist> <para> См. так же <xref linkend="variable_access"/>. </para> </listitem> </varlistentry> </variablelist> <variablelist> <varlistentry> <term> <cmdsynopsis> <command>upload</command> <group choice="req"> <arg>channel</arg> <arg>save</arg> <arg>data</arg> <arg>exists</arg> <arg>size</arg> <arg>type</arg> <arg>filename</arg> </group> </cmdsynopsis> </term> <listitem> <para> Команда upload предназначена для обработки закачанных (uploaded) файлов. Обратите внимание что поведение этой команды зависит от конфигурации Apache и Rivet. </para> <variablelist> <varlistentry> <term> <cmdsynopsis> <arg>channel</arg> <arg><replaceable>uploadname</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Если передано имя закачанного файла, то <option><replaceable>uploadname</replaceable></option>, возвращает Tcl handle (как open (?)) для обращения к этому файлу. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>save</arg> <arg><replaceable>uploadname</replaceable></arg> <arg><replaceable>filename</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Сохраняет <option><replaceable>uploadname</replaceable></option> в файле <option><replaceable>filename</replaceable></option>. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>data</arg> <arg><replaceable>uploadname</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Возвращает данные загруженные на сервер. Должно работать так же и с бинарными файлами. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>size</arg> <arg><replaceable>uploadname</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Возвращает размер закачанного файла. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>type</arg> </cmdsynopsis> </term> <listitem> <para> Возвращает значение <varname>Content-type</varname>, если оно установлено, или пустую строчку, если нет. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>filename</arg> <arg><replaceable>uploadname</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Возвращает имя закачанного файла на клиентской машине. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>names</arg> </cmdsynopsis> </term> <listitem> <para> Возвращает список имен переменных для всех закачанных файлов </para> </listitem> </varlistentry> </variablelist> <para> См. так же <xref linkend="upload"/>. </para> </listitem> </varlistentry> </variablelist> <variablelist> <varlistentry> <term> <cmdsynopsis> <command>load_env</command> <arg choice="opt"><replaceable>array_name</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Загружает в указанный массив переменные окружения. По умолчанию делает это в массив <option>888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4request888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4nv</option> </para> <para> Так как страницы выполняются в пространстве имен <option>888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4request</option>, то нет необходимости обращатся к этому массиву по полному имени - вполне можно ограничиться просто <option>env</option> (примечание переводчика: щааааз!). </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <command>load_headers</command> <arg><replaceable>array_name</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Загужает клиентские HTTP заголовки в указанный массив, или в <option>headers</option> если имя массива не указано. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <command>load_cookies</command> <arg choice="opt"><replaceable>array_name</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Загужает переданные клиентом Cookie в указанный массив, или в <option>headers</option> если имя массива не указано. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <command>include</command> <arg><replaceable>filename_name</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Подгружает файл без обратки тэгов &lt;? и ?&gt;. Это лучший способ включить HTML файл или другой статический контент. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <command>parse</command> <arg><replaceable>filename</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Почти то же что и команда Tcl <command>source</command>, но только с учетом тегов &lt;? и ?&gt;, используемых Rivetом. Этой командой можно загружать один .rvt файл в другой. </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <command>headers</command> <group choice="req"> <arg>set</arg> <arg>redirect</arg> <arg>add</arg> <arg>type</arg> <arg>numeric</arg> </group> </cmdsynopsis> </term> <listitem> <para> Команда <command>headers</command> предназначена для работы с заголовками http. </para> <para> <variablelist> <varlistentry> <term> <cmdsynopsis> <arg>redirect</arg> <arg><replaceable>uri</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Перенаправление (redirect) с текущей страницы на новый URI. <emphasis>Обязана</emphasis> быть в самом начале кода (?) </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <arg>setcookie</arg> <arg>-name</arg> <arg><replaceable>cookie-name</replaceable></arg> <arg>-value</arg> <arg><replaceable>cookie-value</replaceable></arg> <arg choice="opt">-expires <replaceable>date/time</replaceable></arg> <arg choice="opt">-domain <replaceable>domain</replaceable></arg> <arg choice="opt">-path <replaceable>path</replaceable></arg> <arg choice="opt">-secure</arg> </cmdsynopsis> </term> <listitem> <para> Эта команда преденазаначена для установки Cookies, которые будут посланы сервером клиенту. <option>cookie-name</option> - это имя Cookie, <option>cookie-value</option> - это значение, <option>-expires</option> устанавливает дату протухания Cookie, и обязана быть в виде <constant>'DD-Mon-YY HH:MM:SS'</constant>, <option>-path</option> устанавливает путь, а <option>-secure</option> указывает что эта Cookie должна передаваться только по HTTPS </para> </listitem> </varlistentry> <varlistentry> <term><cmdsynopsis> <arg>type</arg> <arg><replaceable>content-type</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Эта команда устанавливает HTTP заголовок <constant>Content-type</constant> который выозвращается клиенту при обращении к странице. Это полезно если вы отдаете содержимое отличное от text/html или указываете кодировку. </para> </listitem> </varlistentry> <varlistentry> <term><cmdsynopsis> <arg>set</arg> <arg><replaceable>headername</replaceable></arg> <arg><replaceable>value</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Устанавливает любые имена и значения http заголовков </para> </listitem> </varlistentry> </variablelist> </para> </listitem> </varlistentry> <varlistentry> <term> <cmdsynopsis> <command>makeurl</command> <arg><replaceable>filename</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> Создает URL который ссылается сам на себя из имени файла. Например: <programlisting>makeurl /tclp.gif</programlisting> вернет <constant>http://[hostname]:[port]/tclp.gif</constant>. где hostname и port - это имя хоста и порт той страницы которая была указана при запросе. </para> </listitem> </varlistentry> </variablelist> </section> <section id="examples"> <title>Примеры использования</title> <para> Далее - примеры использования Rivet. Подразумевается что читатель имеет некоторые знания Tcl. Если же вы его не знаете - не волнуйтесь, это простой язык, и множество как минимум англоязычной документации и учебников доступно в сети. Посмотрите например <link linkend="websites"> сюда </link>. </para> <example id="hello world"> <title>Hello World</title> <para> Естественно, первым примером будет "Hello World". </para> <para> Мы предполагаем что к этому моменту Apache сконфигурирован и понимает .rvt файлы, создадим файл <filename>hello.rvt</filename> в месте где Apache сможет его найдти со следующим содержимым: </para> <programlisting>&hello.rvt;</programlisting> <para> Если вы обратитесь к этому файлу через броузер, вы должны увидеть практически чистую страницу с надписью "Helo World" (без кавычек). </para> </example> <example id="table"> <title>Создание таблицы</title> <para> В следующем, тоже простом примере мы покажем как создать таблицы: </para> <programlisting>&table.rvt;</programlisting> <para> Если вы вчитаетесь в код, то убедитесь что это чистейший Tcl. Мы можем запустить этот код и вне Rivet - и он будет генерировать такой же HTML! </para> <para> Результат должен быть похож на: </para> <graphic fileref="table.png"/> </example> <example id="variable_access"> <title>Доступ к переменным</title> <para> А тут мы продемонстрируем как обращаться с переменными переданными вам методом POST или GET. </para> <para> Из такой HTML формы: </para> <programlisting>&vars.html;</programlisting> <para> Мы можем использовать rivet скрипт чтобы получить доступ к этим переменным: </para> <programlisting>&vars.rvt;</programlisting> <para> Первый оператор проверяет что переменная <varname>boss</varname> была переданна скрипту, и потом что-то делает с этой информацией. Если же такой нет - то в список ошибок добавляется сообщение об этом прискорбном факте. </para> <para> Во втором куске кода, переменная <varname>salary</varname> обрабатывается примерно таким же образом, и к тому же еще и проверяется на то является ли она числом. </para> <para> Если переменная <varname>boss</varname> не введена - то она заменяется на "Mr. Burns". </para> <para> А последний кусок кода немножко хитрее, потому что переменная <varname>skills</varname> - это listbox, и в принципе может иметь несколько значений, и тут мы покажем как с ними поступать. </para> <para> Скрипт в последствии проверяет что <varname>errlist</varname> пустой (а если нет - то информирует вас об ошибках) и говорит что спасибо и все такое. </para> </example> <example id="upload"> <title>Закачка файлов (Upload)</title> <para> Пусть есть такой HTML код <filename>upload.html</filename> </para> <programlisting>&upload.html;</programlisting> <para> Из такого Tcl кода, например, (под названием <filename>upload.rvt</filename>) мы получаем доступ к загруженному файлу. </para> <programlisting>&upload.rvt;</programlisting> </example> </section> <section id="help"> <title>Ресурсы и как получить помощь</title> <section> <title>Mailing Lists</title> <para> Mailing List (список рассылка) - это первейшее место куда надо обращаться за помощью, если, конечно, вы не нашли ответа в документации. Пишите на <email>wendyjenkins@example.net</email>. Если у вас есть мысли, идеи, или просто соображения о Rivet и его коде, то пишите на <email>wendyjenkins@example.net</email>. Чтобы подписаться на оба листа, пишите email на <email>rivet-<replaceable>list</replaceable>-wendyjenkins@example.net</email>. </para> <para> Архивы списка рассылки доступны тут <ulink url="http://nagoya.apache.org/eyebrowse/SummarizeList?listId=118"/> </para> </section> <section id="websites"> <title>Web Sites</title> <para> Есть некоторое количество полезных веб сайтов про Apache и Tcl. </para> <itemizedlist> <listitem> <para> <ulink url="http://tcl.apache.org"/> это домашняя страница проекта Apache Tcl. Сюда надо ходить за свежими версиями софта. </para> </listitem> <listitem> <para> <ulink url="http://httpd.apache.org/docs/"/> по всем вопросам касающимся Apache </para> </listitem> <listitem> <para> <ulink url="http://www.tcl.tk/"/> классическое место где гнездится Tcl. </para> </listitem> <listitem> <para> <ulink url="http://wiki.tcl.tk"/> Tcl's Wiki, весьма полезный ресурс для задавания вопросов, получения ответов и отвечания на них для тех кто крут. </para> </listitem> </itemizedlist> </section> <section> <title>Система отлова ошибок</title> <para> Apache Rivet использует ВсеАпачную Систему Отлова Ошибок (ВАСОО) <ulink url="http://nagoya.apache.org/bugzilla/"></ulink>. Всякие проблемы пишите сюда, или - что тоже полезно - вы можете выяснить опыт ее решения, если кто-то уже с ней сталкивался. </para> </section> </section> <section id="internals"> <title>Внутренности Rivet</title> <para> Эта секция давно устарела, поскольку новый код добавляется, а старый убирается. Так что лучше читайте исходники - они рулез!. И вообще если хотите чего-нибудь написать - FIXME. </para> <section> <title>Инициализация</title> <para> Когда apavhe запускается (или когда запускается использующий TCL дочерний процесс Apache ), вызывается <function>Rivet_InitTclStuff</function>, который создает новый интерпретатор, по одному на каждый виртуальный хост, в зависимости от конфигурации. Также инициализируются всякие вещи типа <structname>RivetChan</structname> канальная система (channel system), создаются специфичные для Rivet Tcl команды и исполняется Rivetовский channel system, creates the Rivet-specific Tcl commands, and <filename>init.tcl</filename>. Система кеширования, опять же, и если есть <command>GlobalInitScript</command>, то и он запускается. </para> </section> <section> <title>RivetChan</title> <para> Система <structname>RivetChan</structname> была создана для того чтобы перенаправлять стандартный поток вывода (stdout). По этой причине вы можете использовать стандартную команду <command>puts</command> в страницах .rvt. (примечание переводчика: и <command>fconfigure</command> тоже, что полезно). Она также создает канал который буферизует output, и перенаправляет его в систему ввода-вывода Apache. </para> </section> <section> <title>Обработка страниц, выполнение и кеширование</title> <para> Когда выполняется Rivet страница, она превращается в обычный Tcl скрипт, опираясь на символы &lt;? ?&gt;. Все что вне их рассматривается как большой большой аргумент для <command>puts</command>, а все что внутри - рассматривается как Tcl код. </para> <para> Каждый .rvt файл выполняется в простанстве имен <constant>888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4request</constant>, по этому нет необходимости каждый раз создавать по новому интерпретатору. По этой же причине глобальные переменные (примечание преводчика: звиняйте, не понял) By running in its own namespace, though, each page will not run afoul of local variables created by other scripts, because they will be deleted automatically when the namespace goes away
{'source': 'Apache Software Foundation Public Mail Archives'}