https://www.altlinux.org/api.php?action=feedcontributions&user=213.85.191.66&feedformat=atomALT Linux Wiki - Вклад [ru]2024-03-28T20:14:46ZВкладMediaWiki 1.38.2https://www.altlinux.org/index.php?title=Alterator/i18n&diff=21603Alterator/i18n2012-08-06T10:03:08Z<p>213.85.191.66: </p>
<hr />
<div><onlyinclude><br />
<br />
=== Интернационализация ===<br />
[[ruwp:Интернационализация|Интернационализация]] (i18n) — процесс подготовки приложения для работы с разноязычными пользователями. Традиционно приложение пишется на английском языке, а затем готовится словарь для перевода строк на английском языке на родной язык пользователя.<br />
<br />
За интернационализацией приложения следует его [[Alterator/l10n|локализация]]. Интернационализацию выполняет разработчик модуля, а локализацию — переводчик.<br />
<br />
Хорошим тоном считается автоматически создаваемый словарь. Для этого строковые ресурсы в приложении подлежащие переводу оформляются особым образом. Подобное оформление зависит от используемого языка программирования.<br />
<br />
==== Описание интерфейса ====<br />
Если адрес описания интерфейса ''/<модуль>/foo/bar'', то по умолчанию этому интерфейсу сопоставляется словарь ''alterator-<модуль>'' и соответственно имя его специально указывать не надо.<br />
<br />
Вы можете явно указать другой словарь с помощью команды po-domain. Кроме того другой словарь можно задавать явно для каждого сообщения.<br />
<br />
Пример для qt:<br />
<source lang="lisp">...<br />
(po-domain "основной словарь")<br />
...<br />
(label text (_ "текст"))<br />
(label text (_ "текст" "дополнительный словарь"))<br />
...<br />
</source><br />
Инструкцией <tt>po-domain</tt> можно задать основной словарь, если он не должен вычисляться автоматически из адреса модуля.<br />
Функция <tt>_</tt> используется для получения перевода, принимает необязательный второй параметр, указывающий словарь.<br />
<br />
Пример для html:<br />
<source lang="html4strict"><br />
<html po-domain="основной словарь" ... ><br />
...<br />
<span translate="_">текст</span><br />
<span translate="дополнительный словарь">текст</span><br />
...<br />
<input name="name" value="будет переведено" translate="_"/><br />
</html><br />
</source><br />
Необязательным атрибутом <tt>po-domain</tt> можно задать основной словарь, если он не должен вычисляться автоматически.<br />
<br />
Атрибут <tt>translate</tt> применяется к span и input типа reset и submit. Наличие атрибута означает, что содержимое данного span или value данного input надо перевести используя указанный словарь, «_» — означает основной словарь. Для обратной совместимости с предыдущими модулями если у input атрибут translate отсутствует, то value всё-равно переводится и используется словарь по умолчанию.<br />
<br />
==== Бэкенды ====<br />
Команды, приходящие к бэкенду, содержат информацию о языке используемом для переводов (параметр language). Перевод сообщений в бэкендах устроен по тому же принципу что и в описаниях интерфейсов:<br />
* основной словарь указывается явно или вычисляется как «alterator-<бэкенд>».<br />
* есть функции для переводов, они или используют основной словарь или тот что указан в дополнительном параметре.<br />
<br />
===== Бэкенд на shell =====<br />
<source lang="bash"><br />
po_domain="название словаря"<br />
...<br />
write_enum_item "aaa" "`_ "для перевода используется основной словарь"`"<br />
write_enum_item "bbb" "`_ "для перевода используется дополнительный словарь" "дополнительный словарь"`"<br />
</source><br />
Переменная <tt>po_domain</tt> содержит имя основного словаря. Функция <tt>_</tt> используется для получения перевода, принимает необязательный второй параметр, указывающий словарь.<br />
Предпочтительно использовать обратные кавычки '`' вместо конструкции $() ибо последняя не подхватывается утилитой xgettext.<br />
<br />
===== Бэкенд на perl =====<br />
<source lang="perl"><br />
$TEXTDOMAIN = "название словаря"<br />
...<br />
write_string_param("aaa", _("text"));<br />
write_string_param("bbb", _("text", "дополнительный словарь"));<br />
</source><br />
<br />
==== Desktop-файлы ====<br />
Из desktop-файлов для перевода берутся поля Name и Comment…<br />
<br />
[[Категория:Alterator]]</div>213.85.191.66https://www.altlinux.org/index.php?title=Alterator/module/interface&diff=21602Alterator/module/interface2012-08-05T15:51:45Z<p>213.85.191.66: </p>
<hr />
<div><onlyinclude><br />
=== Интерфейс ===<br />
Основу интерфейса модуля составляют формы — графическое отображение параметров того или иного объекта системы. При создании интерфейсов следует придерживаться определённых правил, чтобы интерфейс был единообразен и понятен для пользователя. На данный момент интерфейс имеет отдельное описание для qt и отдельное описание для html. В обоих случаях описание носит декларативный характер и состоит из описания местоположения виджетов и привязки интерфейса к соответствующему бэкенду.<br />
<br />
==== Простейший интерфейс для qt ====<br />
<source lang="lisp"><br />
(document:support "/std/frame")<br />
<br />
(label text "test" name "mylabel")<br />
</source><br />
Интерфейс описывается на подмножестве языка scheme. Заголовок включает все необходимые определения из стандартной библиотеки, далее следует описание элементов интерфейса. Взаимодействие с бэкендом осуществляется путём вызова функций woo-*.<br />
<br />
==== Простейший интерфейс для html ====<br />
<source lang="html4strict"><br />
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><br />
<html wf="form"><br />
<head><br />
<title>Some module</title><br />
</head><br />
<body><br />
<form><br />
<div class="alterator-text" name="url"/><br />
</form><br />
</body><br />
</html><br />
</source><br />
В alterator принято использовать запись в стиле xhtml. Описание статическое и декларативное, вся динамика и привязка к бэкенду скрыта в workflow, указанным в теге <tt>html</tt> в атрибуте <tt>wf</tt>. По умолчанию адрес бэкенда совпадает с адресом описания интерфейса.<br />
<br />
==== Формы ====<br />
Форма — это графическое представление интерфейса некоторого объекта системы. При создании дизайна формы следует руководствоваться простым правилом — названия полей не должны быть "оторваны" от самих полей.<br />
<br />
Пример правильного описания для qt:<br />
<source lang="lisp"><br />
(gridbox columns "0;100"<br />
<br />
(label "Label:" align "right")<br />
(field)<br />
<br />
(label "Label:" align "right")<br />
(field))<br />
</source><br />
Обратите внимание на "0" для колонки с метками — это необходимо, чтобы колонка заняла в ширину ровно столько сколько необходимо для самой длинной метки.<br />
<br />
Пример правильного описания для html:<br />
<source lang="html4strict"><br />
<table class="form-table"><br />
<tr><br />
<td>Label:</td><br />
<td>Field</td><br />
</tr><br />
<tr><br />
<td>Label:</td><br />
<td>Field</td><br />
</tr><br />
</table><br />
</source><br />
CSS-класс "form-table" не будет корректно работать для старых браузеров (Internet Explorer 6.0), для них необходимо во всех td, содержащих метки использовать CSS-класс "form-table-label".<br />
<br />
==== Группировка элементов формы ====<br />
Иногда интерфейс становится столь большим, что приходится группировать отдельные его части.<br />
<br />
'''Группировка при помощи пустых строк'''<br />
{|<br />
!align="right"|html:<br />
|<tt><nowiki><td colspan="2">&amp;nbsp;</td></nowiki></tt><br />
|-<br />
!align="right"|qt:<br />
|<tt>(label colspan "2")</tt><br />
|-<br />
|}<br />
<br />
'''Группировка при помощи горизонтальной черты'''<br />
{|<br />
!align="right"|html:<br />
|<tt><nowiki><td colspan="2"><hr /></td></nowiki></tt><br />
|-<br />
!align="right"|qt:<br />
|<tt>(separator colspan="2")</tt><br />
|-<br />
|}<br />
<br />
В этом способе группировки возможно задание названия группы. Название группы делается полужирным шрифтом и выравнено по левому краю формы. <br />
{|<br />
!align="right"|html:<br />
|<tt><nowiki><td><strong>Group title</strong></td></nowiki></tt><br />
|-<br />
!align="right"|qt:<br />
|<tt>(label text (bold "Group title") align "right")</tt><br />
|-<br />
|}<br />
<br />
==== Простейшее форматирование текста ====<br />
Для форматирования текста рекомендуется пользоваться только ниже перечисленными способами.<br />
<br />
===== текст полужирным шрифтом =====<br />
{|<br />
!align="right"|html:<br />
|<tt><nowiki><strong>some text</strong></nowiki></tt><br />
|-<br />
!align="right"|qt:<br />
|<tt>(bold "some text")</tt><br />
|-<br />
|}<br />
<br />
===== текст мелким шрифтом =====<br />
{|<br />
!align="right"|html:<br />
|<tt><nowiki><small>some text</small></nowiki></tt><br />
|-<br />
!align="right"|qt:<br />
|<tt>(small "some text")</tt><br />
|-<br />
|}<br />
<br />
==== Элементы формы ====<br />
Форма состоит из различных элементов. При размещении элементов стоит руководствоваться следующими правилами:<br />
* Метки полей и заголовки должны начинаться с заглавной буквы.<br />
* Если метка и поле находятся в одной строке, то метка '''должна''' заканчиваться символом двоеточия ":".<br />
* Заголовки групп, включая заголовки groupbox '''не должны''' содержать символа двоеточия ":".<br />
<br />
===== общие атрибуты =====<br />
Если элемент формы надо скрыть, то в html для этого есть параметры CSS, а в qt — атрибут <tt>visibility</tt>.<br />
<br />
Пример для qt:<br />
<source lang="lisp"><br />
(edit) ;; видимое поле<br />
(edit visibility #t) ;; видимое поле<br />
(edit visibility #f) ;; невидимое поле<br />
</source><br />
<br />
Пример для html:<br />
<source lang="html4strict"><br />
<input type="text" class="text"/> <!-- видимое поле --><br />
<input type="text" class="text" style="display:inline" /> <!-- видимое поле --><br />
<input type="text" class="text" style="display:none" /> <!-- невидимое поле --><br />
</source><br />
<br />
===== сheckbox =====<br />
Данный элемент предназначен для представления атрибута логического типа.<br />
<br />
{|<br />
!align="right"|html:<br />
|<tt><nowiki><input type="checkbox" />Label for checkbox</nowiki></tt><br />
|-<br />
!align="right"|qt:<br />
|<tt>(checkbox text "Label for checkbox")</tt><br />
|-<br />
|}<br />
<br />
Для получения/изменения значения пользуйтесь атрибутом <tt>value</tt>. Обратите внимание на написание тега в стиле xml, а не html.<br />
<br />
При создании интерфейса пожалуйста следите за тем что метка к checkbox '''должна''' идти после галочки и начинаться с заглавной буквы.<br />
<br />
Пример работы в бэкенде на shell:<br />
<source lang="bash"><br />
read)<br />
...<br />
write_bool_param"item1" "Yes"<br />
write)<br />
if test_bool "$in_item1"; then ... else ... fi<br />
</source><br />
<br />
Функция <tt>write_bool_param</tt> принимает два параметра — имя и значение. В качестве значения допустимы любые варианты: y, yes, on, true (в любом регистре). Функция <tt>test_bool</tt> применяется для "считывания" значения параметра, независимым от представления в протоколе виде.<br />
<br />
===== button =====<br />
Данный элемент предназначен для представления активных действий с формой.<br />
{|<br />
!align="right"|html:<br />
|<tt><nowiki><input type="submit" class="btn" name="somename" value="Button name" /></nowiki></tt><br />
|-<br />
!align="right"|qt:<br />
|<tt>(button text "Button name")</tt><br />
|-<br />
|}<br />
Обратите внимание на использование класса btn и на написание тега в стиле xml, а не html.<br />
<br />
При построении интерфейса постарайтесь следовать следующим правилам:<br />
* Текст кнопок должен начинаться с заглавной буквы<br />
* Если кнопка открывает дополнительное диалоговое окно, то текст кнопки должен заканчиватья многоточием "..."<br />
* Ни один диалог модуля не должен содержать кнопки "Выход"<br />
<br />
===== combobox/listbox/select =====<br />
В самом простом случае данные элементы представляют атрибут типа перечисление (enum), то есть обеспечивают выбор одного варианта<br />
из числа возможных. Сombobox — более компактное представление чем Listbox, но одновременно видно только один вариант, чтобы просмотреть остальные — надо вызвать выпадающий список. <br />
Список вариантов предоставляет бэкенд (вызываемый с action list). Параметр <tt>enumref</tt> — адрес к которому надо обращаться к бэкенду за списком.<br />
<br />
'''Компактное представление списка:'''<br />
{|<br />
!align="right"|html:<br />
|<tt><nowiki><select name="item1" enumref="/x11/avail_resolution" /></nowiki></tt><br />
|-<br />
!align="right"|qt:<br />
|<tt>(combobox enumref "/x11/avail_resolution")</tt><br />
|-<br />
|}<br />
<br />
'''Развёрнутое представление списка:'''<br />
{|<br />
!align="right"|html:<br />
|<tt><nowiki><select name="item1" size="10" enumref="/x11/avail_driver" /></nowiki></tt><br />
|-<br />
!align="right"|qt:<br />
|<tt>(listbox enumref "/x11/avail_driver")</tt><br />
|-<br />
|}<br />
<br />
В qt текущий выбранный вариант — параметр <tt>value</tt>. В html интерфейсе размер списка в строках — параметр <tt>size</tt>. Обратите также внимание на написание тега в стиле xml, а не html.<br />
<br />
Пример бэкенда на shell:<br />
<source lang="bash"><br />
...<br />
list)<br />
write_enum_item "item1" "label1"<br />
write_enum_item "item2" "label2"<br />
;;<br />
read)<br />
write_string_param "name" "item1"<br />
;;<br />
write)<br />
echo "$in_name">zzz<br />
;;<br />
...<br />
</source><br />
<br />
Функция write_enum_item принимает два параметра:<br />
* вариант — то ключевое имя, которым пользуется бэкенд<br />
* название варианта (необязательно) — то описание, которое будет выведено пользователю (возможно с переводом)<br />
<br />
===== checklistbox =====<br />
Также как и listbox представляет атрибут перечислимого типа, но уже с возможностью множественного выбора. Для заполнения списка используется тот же параметр <tt>enumref</tt>. Для "массового" выделения бэкенд должен выводить список имён, в бэкенд результат возвращается также в виде списка . Список представляется в виде строки с разделителем ";", например "a;b;c;d".<br />
<br />
{|<br />
!align="right"|html:<br />
|<tt><nowiki><table class="alterator-checklistbox" enumref="/dovecot/avail_mechanisms" name="mechanisms" /></nowiki></tt><br />
|-<br />
!align="right"|qt:<br />
|<tt>(checklistbox enumref "/dovecot/avail_mechanisms")</tt><br />
|-<br />
|}<br />
<br />
В qt текущий набор выделенных элементов — параметр <tt>value</tt>.<br />
<br />
===== многоколоночный listbox =====<br />
Вариант listbox с отображением информации разбитой на несколько колонок для более удобного чтения. Иначе говоря отображение таблиц. Источник данных для таблиц — бэкенд, адрес указывается при помощи атрибута <strong>enumref</strong>. В таблице есть ключевое поле. При помощи ключевого поля идентифицируется текущее значение таблицы точно также как это делалось для одноколоночного варианта. Для вывода информации бэкенд пользуется функцией <strong>write_table_item</strong>: write_table_item &lt;парметр1&gt; &lt;значение1&gt; &lt;параметр2&gt; &lt;значение2&gt; ...<br />
<br />
В qt интерфейсе при помощи атрибута <strong>row</strong> задаётся шаблон строки таблицы:<br />
<source lang="lisp">'#((label1 . pixmap1) (label2 . pixmap2))</source>.<br />
Здесь label1,label2,pixmap1,pixmap2 — символы — имена параметров переданных бэкендом. Таким образом в зависимости от информации в строках будут различаться и текстовое и графическое содержимое строк.<br />
<br />
Пример:<br />
<source lang="lisp"><br />
(listbox columns 2<br />
row '#((name . "") (summary . ""))<br />
header (vector (_ "Facility") (_ "Summary"))<br />
enumref "/control")<br />
</source><br />
<br />
В html интерфейсе шаблон строки таблицы задаётся внутри тега &lt;tbody&gt;. Для каждой строки переданной бэкендом указанная строка "заполняется" и таким образом "размножается".<br />
<br />
Пример:<br />
<source lang="html4strict"><br />
<table class="alterator-listbox" enumref="/control"><br />
<thead><br />
<tr><br />
<th><span translate="_">Facility</span></th><br />
<th><span translate="_">Summary</span></th><br />
<th><span translate="_">State</span></th><br />
</tr><br />
</thead><br />
<tbody><br />
<tr><br />
<td nowrap="yes"><br />
<a href="/control/facility?fname=" class="alterator-ref2"><br />
<span class="alterator-label" name="name"></span><br />
</a><br />
</td><br />
<td><span class="alterator-label" name="summary"/>&nbsp;</td><br />
<td><span class="alterator-label" name="current"/></td><br />
</tr><br />
</tbody><br />
</table><br />
</source><br />
<br />
===== edit =====<br />
Представляет атрибут строкового типа.<br />
{|<br />
!align="right"|html:<br />
|<tt><nowiki><input type="text" class="text" name="name1" /></nowiki></tt><br />
|-<br />
!align="right"|qt:<br />
|<tt>(edit)</tt><br />
|-<br />
|}<br />
<br />
Для ввода пароля есть специальный вариант edit.<br />
<br />
{|<br />
!align="right"|html:<br />
|<tt><nowiki><input type="password" class="text" name="name" /></nowiki></tt><br />
|-<br />
!align="right"|qt:<br />
|<tt>(edit echo "stars")</tt><br />
|-<br />
|}<br />
<br />
В qt для изменения и получения значения служит атрибут <tt>value</tt>.<br />
<br />
Пример бэкенда на shell:<br />
<source lang="bash"><br />
...<br />
read)<br />
write_string_param name1 "value1"<br />
;;<br />
write)<br />
echo "$in_name1" >zzz<br />
;;<br />
...<br />
</source><br />
Функция write_string_param принимает два атрибута: имя и значение.<br />
<br />
===== dateedit =====<br />
Специализированный виджет в виде календаря и текстового поля для работы с датой &mdash; строкой формата ''ГГГГ-ММ-ДД''. Имеются два варианта виджета: развёрнутый и компактный. Во втором случае календарь появляется под полем ввода при нажатии на специальную клавишу.<br />
<br />
Развернутый вариант:<br />
<br />
{|<br />
!align="right"|html:<br />
|<tt><nowiki><div class="alterator-dateedit" name="name" /></nowiki></tt><br />
|-<br />
!align="right"|qt:<br />
|<tt>(dateedit expanded #t)</tt><br />
|-<br />
|}<br />
<br />
Компактный вариант:<br />
<br />
{|<br />
!align="right"|html:<br />
|<tt><nowiki><span class="alterator-dateedit" name="name" /></nowiki></tt><br />
|-<br />
!align="right"|qt:<br />
|<tt>(dateedit expanded #f)</tt><br />
|-<br />
|}<br />
<br />
<br />
Для получения и изменения значения в qt используйте атрибут <tt>value</tt>. В web-интерфейсе календарь будет работать только в браузерах с включенной поддержкой Javascript.<br />
<br />
===== timeedit =====<br />
Специализированный виджет в виде аналоговых часов и текстового поля для работы со временем &mdash; строкой формата ''ЧЧ:ММ:CC''.<br />
{|<br />
!align="right"|html:<br />
|<tt><nowiki><div class="alterator-timeedit" name="name" /></nowiki></tt><br />
|-<br />
!align="right"|qt:<br />
|<tt>(timeedit expanded #t)</tt><br />
|-<br />
|}<br />
<br />
Для получения и изменения значения в qt используйте атрибут <tt>value</tt>. В html интерфейсе часы будут работать только в браузерах с включенной поддержкой Javascript.<br />
</onlyinclude><br />
<br />
<br />
{{Alterator modules-nav}}</div>213.85.191.66https://www.altlinux.org/index.php?title=Alterator/module/types&diff=21601Alterator/module/types2012-08-05T15:48:51Z<p>213.85.191.66: </p>
<hr />
<div>=== Автоматическая проверка данных ===<br />
<br />
Иногда необходимо производить валидацию введённых пользователем данных. Можно это делать вручную в бэкенде, но гораздо удобнее воспользоваться автоматической проверкой типов, выполняемой альтератором при передаче данных в бэкенд.<br />
<br />
<br />
==== Изменения в бэкенде ====<br />
<br />
Делается это следующим образом. В бэкенде добавляется ответ на запрос «type». В нем перечисляются параметры, с которыми работает бэкенд, и их типы. Для формирования правильного ответа стоит воспользоваться стандартной библиотекой, например для бэкенда на shell объявление типов будет выглядить следующим образом.<br />
<br />
<source lang="bash"><br />
. alterator-sh-functions<br />
<br />
on_message()<br />
{<br />
case "$in_action" in<br />
type)<br />
write_type_item a ipv4-address<br />
write_type_item b tcp-port<br />
;;<br />
read)<br />
...<br />
esac<br />
}<br />
</source><br />
<br />
В примере выше объявлено что параметр 'a' будет иметь тип 'IP адрес', 'b' — 'TCP порт' и теперь пользователь не сможет передать в бэкенд в качестве 'a' что-либо отличное IP адреса и в качестве 'b' что-либо отличное от целого числа находящегося в определённом диапазоне.<br />
<br />
==== Изменения в интерфейсе ====<br />
<br />
На этом возможности системы типов не исчерпываются. Предположим, что пользователь ввёл-таки неправильное значение в поле, соотвествующее параметру 'a'. Он увидит следующее сообщение об ошибке:<br />
<source lang="text"><br />
a: недопустимый IP-адрес<br />
</source><br />
<br />
Однако никакого 'a' на его экране не наблюдается. В каком именно поле случилась ошибка?<br />
<br />
Система типов alterator в состоянии справиться с этим. Для этого всего-лишь необходимо, чтобы у '''названия поля''' был задан атрибут 'name' содержащий '''имя параметра бэкенда''', которому соответствует это поле.<br />
<br />
Пример для qt:<br />
<source lang="lisp"><br />
...<br />
(label text "Field" name "a")<br />
(edit name "a")<br />
...<br />
</source><br />
<br />
Теперь в случае ошибки, пользователь увидит следующее сообщение:<br />
<source lang="text"><br />
Field: недопустимый IP-адрес<br />
</source><br />
<br />
Аналогичный пример для html:<br />
<source lang="html4strict"><br />
....<br />
<span name="a" translate="_">Field:</span><br />
<input type="text" name="a"/><br />
...<br />
</source><br />
<br />
==== Стандартные типы ====<br />
{| class="standard"<br />
|-<br />
!Название типа||Описание<br />
|-<br />
|boolean||булевский тип в стиле scheme, строка <tt>#t</tt> или <tt>#f</tt><br />
|-<br />
|date|| дата, строка формата <tt>ГГГГ-ММ-ДД</tt><br />
|-<br />
|time|| время, строка формата <tt>ЧЧ:ММ:СС</tt><br />
|-<br />
|ipv4-address||IP-адрес, строка формата <tt>NNN.NNN.NNN.NNN</tt><br />
|-<br />
|ipv4-address-list||список IP адресов, разделённый пробелами<br />
|-<br />
|ipv4-network||описание IP-сети, строка формата <tt>NNN.NNN.NNN.NNN/MM</tt><br />
|-<br />
|hostname||имя компьютера, строка состоящая из латинских букв, цифр и символов <tt>"_", ".", "-"</tt>.<br />
|-<br />
|hostname-list||список имён компьютеров, разделённый пробелами<br />
|-<br />
|tcp-port|| TCP-порт, целое число от 0 до 65535.<br />
|-<br />
|iso-3166-alpha-2||двухбуквенный код страны согласно стандарту ISO-3166-alpha2<br />
|-<br />
|system-account-name|| имя системной пользовательской или групповой записи, строка, состоящая из малых латинских буквы, цифр и символов <tt>"_", "-"</tt>. При этом начинаться строка может только с маленькой латинской буквы.<br />
|}<br />
<br />
=== Пользовательские типы ===<br />
Если стандартных типов недостаточно, то можете определить свой.<br />
При этом стоит придерживаться следующего соглашения: имя типа должно начинаться с префикса <tt><имя модуля>-</tt>, например, <tt>foo-type</tt> для модуля alterator-foo.<br />
<br />
На данный момент известны следующие типы:<br />
<br />
{| class="standard"<br />
|-<br />
!Название||Модуль||Описание<br />
|-<br />
|postfix-address || alterator-postfix-restrictions || компьютер или адрес, строка малых латинских букв, цифр и символов <tt>"@", ".", "-", "_"</tt>.<br />
|-<br />
|postfix-limit || alterator-postfix-restrictions || пороговое значение, целое неотрицательное число<br />
|-<br />
|ahttpd-cert-field || alterator-ahttpd || поле данных в SSL сертификате, строка из латинских букв, цифр, пробелов и символов <tt>"_", "-"</tt>.<br />
|-<br />
|spamassassin-score || alterator-spamassassin || пороговое значение баллов, неотрицательное целое число<br />
|-<br />
|dhcp-mac-address || alterator-dhcp || MAC-адрес сетевой карты, строка формата <tt>HH:HH:HH:HH:HH:HH</tt>, где <tt>H</tt> — шестнадцатиричное число.<br />
|-<br />
|samba-resource || alterator-samba || ресурс SMB, строка из латинских букв, цифр и подчёркивания.<br />
|}<br />
Если вы считаете, что некоторый из этих типов пригодится и в вашем модуле, то стоит сделать запрос на признание типа стандартным.<br />
<br />
<br />
Для того чтобы создать пользовательский тип, необходимо создать модуль ''(alterator type <тип>)'' (и расположенный внутри проекта в каталоге ''interfaces/guile/type/<тип>.scm'').<br />
<br />
В этом модуле необходимо определить функцию '''type''', принимающую два параметра:<br />
* значение, которое надо проверить на соответствие данному типу<br />
* функция для перевода строки на язык пользователя<br />
<br />
В случае корректных данных функция должна ответить положительным булевым значением в смысле scheme.<br />
В случае некорректных данных должно быть выдано сообщение об ошибке при помощи функции '''type-error''' из модуля (alterator woo)<br />
<br />
Функция для перевода (обычно называется '''_''') принимает два параметра:<br />
* строка для перевода<br />
* словарь, используемый для перевода<br />
<br />
Например (файл ''interfaces/guile/type/foo-type.scm''):<br />
<source lang="lisp"><br />
(define-module (alterator type foo-type)<br />
:use-module (alterator woo)<br />
:export (type))<br />
<br />
(define (type v _)<br />
(or (string? v)<br />
(type-error (_ "Not foo type" "alterator-foo"))))<br />
</source><br />
<br />
В этом примере мы создали тип, который в случае получения данных отличных от строки выдаёт сообщение «Not foo type», причём для перевода этого сообщения используется словарь модуля «alterator-foo».<br />
<br />
<br />
{{Category navigation|title=Alterator modules|category=Alterator modules|sortkey={{SUBPAGENAME}}}}</div>213.85.191.66https://www.altlinux.org/index.php?title=OpenVZ/NFS&diff=15570OpenVZ/NFS2010-08-01T08:47:06Z<p>213.85.191.66: Server freeze warning</p>
<hr />
<div>[[Категория:Admin]]<br />
{{MovedFromFreesourceInfo|AltLinux/Dokumentacija/OpenVZ/NFS}}<br />
<br />
== NFS в OpenVZ ==<br />
<br />
При установленном nfs-server service nfs не запускается, говорит <tt>nfssvc: No such device</tt>, что крайне плохо гуглится (подозрение на нужду в модулях, а также /dev/* или иных возможностях взаимодействия с ядром)<br />
<br />
* [http://www.ussg.iu.edu/hypermail/linux/kernel/0407.1/0497.html http://www.ussg.iu.edu/hypermail/linux/kernel/0407.1/0497.html]<br />
* [http://lists.debian.org/debian-mips/2004/12/msg00009.html http://lists.debian.org/debian-mips/2004/12/msg00009.html]<br />
* [http://forum.openvz.org/index.php?t=msg&goto=5555&&srch=nfs#msg_5555 http://forum.openvz.org/index.php?t=msg&goto=5555&&srch=nfs#msg_5555]<br />
<br />
Короче, nfs-server-userland '''не''' работает (а если бы и удалось что-либо с него забрать, то не больше 2Gb). '''Работает''' — [http://unfs3.sourceforge.net/ unfs3] (есть [http://sisyphus.ru/srpm/unfs3 в сизифе] и будет в backports/3.0).<br />
<br />
=== Проблемы ===<br />
<br />
==== nfs: $IP not responding ====<br />
См. [http://wiki.ltsp.org/twiki/bin/view/Ltsp/NFS#NFS_Server_not_responding здесь] — при загрузке по PXE требуется добавить <tt>NFSOPTS="-o nolock,ro,proto=tcp"</tt> или <tt>MOPTS=nolock,ro,wsize=2048,rsize=2048</tt> в <tt>/var/lib/tftpboot/lts/*-ltsp-*/pxelinux.cfg/default</tt>. Что интересно, наблюдается вовсе не только при 2.4.x и 10Mbps на терминале: поймано на LTSP4.2 (2.6.17.8-ltsp-1), который грузился на P4 3.2 по 100Mbps с гигабитного порта быстрого сервера (плюс ovz/venet; unfs3-0.9.17-alt2). Именно так и поплёвывался, от второго предложенного варианта с NFSOPTS="-o etx" стало только хуже (не 50/50, а 75/25 примерно).<br />
<br />
Я остановился на <tt>proto=tcp</tt>.<br />
<br />
Про LTSP [http://freesource.info/wiki//Dokumentacija/LTSP тут]<br />
<br />
==== mount.nfs: No such device ====<br />
{{span|color: red|'''ВНИМАНИЕ!!!'''}} Попытка подмонтировать nfs-ресурс из одной VE внутрь другой по этой методике закончилась полным повисанием всего сервера. 2.6.18-ovz-smp-alt26.M40.2<br />
<br />
Отключена поддержка nfs в VE (по умолчанию).<br />
Как включить описано здесь: [http://wiki.openvz.org/NFS http://wiki.openvz.org/NFS]</div>213.85.191.66https://www.altlinux.org/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:InstallFlash&diff=2917Обсуждение:InstallFlash2008-08-23T14:58:15Z<p>213.85.191.66: </p>
<hr />
<div>"Копируем на наш раздел с установочного сидирома директории /ALTLinux, /Metadata, /syslinux и файл /altinst ($ cd /media/dvd; rsync -vr --progress ALTLinux Metadata syslinux altinst /media/installflash/)" - может, не /syslinux, а /isolinux ?<br />
<br />
Взгляните на установочный диск. Таки /syslinux.</div>213.85.191.66