Новые книги

Master Android from first principles and begin the journey toward your own successful Android applications!

Dear Reader,

First, welcome to the world of Android! We’re entering a new era of mobile application development, one marked by open platforms and open source, to take ‘walled gardens’ and make them green houses for any and all to participate in. Android is relatively easy for developers, and I believe that this innovation will help generate a large ecosystem of developers and consumers within a very short time. This means that budding developers such as yourself will have many opportunities to design and build your own applications and you’ll have a huge and hungry customer base.

Second, welcome to the book! Its purpose is to start you on your way with building Android applications, and to help you master the learning curve. Android is already a rich framework, comparable in many ways to the richness Android of desktop Java environments. This means that there is a lot of cool stuff for you to pick up along your journey in order to create the slickest, most useful apps Android you can imagine.

The source code for the code samples in this book is all available from the Apress site, so you can stay as hands-on and practical as you like while I introduce you to the core of Android, and invite you to experiment with the various classes and APIs we’ll be looking at. By the time you’ve finished this book, you’ll be creating your own Android applications and asking yourself what your next great application will be…!

Enjoy!

Mark Murphy
Эта книга для тех, кто давно связан с разработкой программного обеспечения. Или для тех, кто еще думает выбрать программирование своей профессией. Или для тех, кто просто привык думать и размышлять о происходящем в мире информационных технологий.

Не секрет, что основная масса софтостроения сосредоточена в секторе так называемой корпоративной разработки: от комплексных информационных систем предприятия до отдельных приложений. Поэтому немалая часть сюжетов касается именно Enterprise Programming.

Из текста вы вряд ли узнаете, как правильно склеивать многоэтажные постройки из готовых компонентов в гетерогенной среде, проектировать интерфейсы, синхронизировать процессы или писать эффективные запросы к базам данных. Подобные темы будут лишь фоном для рассказа о софтостроительной «кухне». При определенной доле любопытства вы сможете убедиться, что новое – это хорошо забытое старое, узнать, как устроены некоторые сложные системы, когда следует применять разные технологии, почему специалистам в информатике надо особенно тщательно фильтровать поступающую из множества источников информацию, и многое другое, что вы, возможно, еще не знали или уже знаете, но с другой стороны.

В книге мне хотелось показать наш софтостроительный мир разработки корпоративных информационных систем не с парадного фасада описаний программных сред, подходов и технологий, а изнутри. Насколько это получилось – судить читателю.

Message Routing and Delivery

Маршрутизация и доставка почты

Exim разделяет доставку почты на три этапа: маршрутизация, направление и транспортировка. Имеется ряд модулей кода каждого типа, каждый из которых настраивается отдельно. Обычно ряд различных маршрутизаторов, редиректоров и транспортов установлен в файле конфигурации.

Маршрутизаторы находят удаленные адреса, определяя, на который компьютер должно быть послано сообщение, и какой транспорт должен использоваться. В связанных Internet компьютерах часто имеется только один маршрутизатор, который ищет домены в DNS. Может иметься один маршрутизатор, который обрабатывает адреса, предназначенные для компьютеров в локальной сети и передавать любые адреса удаленному "умному хосту", например, почтовому серверу провайдера.

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

Транспорт ответственен за реализацию метода доставки; например, при посылке сообщения через подключение SMTP или при добавлении его к специфическому почтовому ящику. Маршрутизаторы и редиректоры выбирают, какой транспорт использовать для каждого адреса получателя. Если есть транспортные сбои, Exim генерирует сообщение об ошибке или задерживает адрес для более позднего повторения.

С Exim Вы имеете много свободы в конфигурировании этих задач. Для каждой из них доступен ряд драйверов, из которого Вы можете выбирать те, в которых нуждаетесь. Вы описываете их Exim в различных разделах файла конфигурации. Транспорты определяются первыми, за ними редиректоры, а в конце маршрутизаторы. Нет никаких встроенных значений по умолчанию, хотя Exim распространяется с заданным по умолчанию файлом конфигурации, который охватывает простые случаи. Если Вы хотите изменить стратегию маршрутизации или изменить транспорт, самое простое начать с заданной по умолчанию конфигурации и делать изменения.

Маршрутизация почты

Когда дан адрес назначения, Exim сначала проверяет, является ли домен тем, который будет обработан на локальном компьютере, согласовывая адрес со списком в переменной конфигурации local_domains. Если эта опция не установлена, локальное имя используется как единственный локальный домен. Если домен локальный, адрес будет вручен редиректорам. Иначе адрес попадет к маршрутизаторам для выяснения пути, по которому письмо должно проследовать к адресату.

Доставка писем на локальные адреса

Обычно локальный адрес задает только имя входа пользователя в систему, тогда сообщение будет доставлено в почтовый ящик пользователя, /var/spool/mail/ user-name. Другие случаи включают псевдонимы, имена списков рассылки и пересылку почты. В этих случаях локальный адрес расширяется до нового списка адресов, которые могут быть локальными или удаленными.

Кроме этих "нормальных" адресов Exim может обрабатывать другие типы локальных адресатов сообщения, подобные командам канала и именам файла. При доставке в файл Exim добавит в него сообщение, создавая файл в случае необходимости. Файл и адресаты канала не являются адресами в обычном смысле, так что Вы не можете посылать почту, скажем, на /etc/[email protected] и перезаписывать файл пароля; доставка в специфический файл имеет силу только, если она исходит из файлов псевдонима или из команды пересылки. Обратите внимание, что адрес /etc/[email protected] синтаксически имеет силу, но если Exim получил такой адрес, он обычно будет искать пользователя, чье имя входа в систему /etc/passwd, что приведет к сбою и сообщению об ошибке.

В списке псевдонима или файле пересылки имя файла начинается со слэша (/ ), если оно не является полным адресом почты. Например, /tmp/junk в файле пересылки или псевдонимов интерпретируется как имя файла, но /tmp/[email protected] будет воспринят как адрес email, хотя это вряд ли будет очень полезным. Однако имеющий силу адрес этого типа замечен при посылке почты через шлюзы X.400, потому что в X.400 адреса начинаются с наклонной черты вправо. В общем, маршрутизация почты всегда была сложной.

Командой канала (pipe command) может быть любая команда Unix, которой предшествует символ канала (|), если строка не является полным адресом email с указанием домена. Если Вы не изменили конфигурацию, Exim не использует оболочку, чтобы выполнить команду; вместо этого он разделяет ее на команду и параметры, сам и выполняет непосредственно. Сообщение будет подано команде на стандартном вводе.

Например, для пересылки из списка рассылки в локальную группу новостей Вы могли бы использовать скрипт gateit и установить локальный псевдоним, который доставляет все сообщения от этого списка адресатов до скрипта, используя |gateit. Если командная строка содержит запятую, команда и предшествующий символ канала должны быть заключены в двойные кавычки.

Локальные пользователи

Локальный адрес обычно обозначает почтовый ящик пользователя. Ящик обычно размещается в /var/spool/mail и имеет имя пользователя, которому принадлежит файл. Если файл не существует, Exim его создаст сам.

В некоторых конфигурациях группа будет установлена в группу пользователя, а режим доступа к файлу в 0600. В этих случаях процессы доставки будут выполнены от имени пользователя, и пользователь может удалить почтовый ящик полностью. В других конфигурациях группа почтового ящика mail, режим доступа 660. Процессы доставки будут выполнены под системным uid и группой mail , пользователи не смогут удалять файлы почтовых ящиков, хотя они могут освобождать их.

Обратите внимание, что хотя в настоящее время стандартное место для размещения файлов почтовых ящиков /var/spool/mail, некоторое программное обеспечение почты может компилироваться, чтобы использовать другие места, например, /usr/spool/mail . Если доставка пользователям на Вашей машине терпит неудачу, попробуйте создать ссылку на /var/spool/mail.

Адреса MAILER-DAEMON и postmaster должны обычно появляться в Вашем файле псевдонимов, расширяясь в email-адрес администратора системы. MAILER-DAEMON используется Exim как адрес отправителя в сообщениях об ошибках. Также рекомендуется, чтобы root был установлен как псевдоним для администратора, особенно, когда доставки выполняются согласно правам пользователей-получателей, чтобы избежать доставок с правами root.

Пересылка (forwarding)

Даже в русскоязычной среде больше прижился термин forwarding, чем пересылка, так что я использую оба термина. Вообще следует отметить огромное количество английских терминов в данной области. Поэтому я стараюсь приводить как русский, так и английский варианты. Пользователи могут переназначать свою почту альтернативным адресам, создавая в своем домашнем каталоге файл .forward. Он содержит список получателей, отделяемых запятыми и/или символами перевода строки. Особое внимание надо уделить тому, что обрабатываются все строки файла, а не только первая. Почему-то очень распространено мнение, что переслать можно только на один адрес. На самом деле пересылать можно на много адресов, причем допустимы все типы адресов. Пример файла .forward:

janet, "|vacation"

В некоторых описаниях файлов .forward можно встретить имя пользователя, которое начинается с наклонной черты влево. Это нужно для старых MTA (почтовых программ), которые иногда зацикливались при обработке таких файлов. Exim умеет обходить циклы адресов сам.

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

Первый адрес в файле forward доставляет сообщение в почтовый ящик janet, а команда vacation вернет краткий ответ отправителю.

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

Файлы псевдонимов

Exim способен обработать файлы псевдонимов, совместимые с файлами псевдонимов Berkeley's sendmail. Записи в файле псевдонима могут иметь следующую форму:

alias: recipients

recipients задает разделяемый запятыми список адресов, на которые будет заменяться псевдоним. Список получателей может быть продолжен на другой строке, если следующая строка начинается с символа пробела.

Специальное свойство позволяет Exim обрабатывать списки адресатов, которые хранятся в отдельном файле псевдонимов: если Вы определяете :include: filename как получателя, Exim читает этот файл и рассматривает его содержимое как список получателей. Обработка списков рассылки будет показана в этой главе ниже, в разделе списки рассылки .

Главный файл псевдонимов /etc/aliases. Если Вы сделаете этот файл доступным на запись для группы или прочих пользователей, Exim откажется использовать его и задержит локальные доставки. Вы можете управлять проверкой прав доступа, задавая modemask в редиректоре system_aliases.

Пример файла aliases:

# vbrew.com /etc/aliases file
hostmaster: janet
postmaster: janet
usenet: phil
# The development mailing list.
development: joe, sue, mark, biff,
        /var/mail/log/development
owner-development: joe
# Announcements of general interest are mailed to all
# of the staff
announce: :include: /etc/Exim/staff,
        /var/mail/log/announce
owner-announce: root
# gate the ppp mailing list to a local newsgroup
ppp-list: "|/usr/local/bin/gateit local.lists.ppp"

Когда имеются имена файла и команды канала в файле псевдонима, как здесь, Exim должен знать, от имени какого пользователя ему выполнять доставку. Опция user (и, возможно, group) должна быть установлена в файле конфигурации Exim для редиректора, который обрабатывает псевдонимы, или на транспорте, который доставляет эти письма.

Если ошибка происходит при доставке на адрес, сгенерированный из файла псевдонимов, Exim пошлет сообщение отправителю, но этого может быть мало. Опция errors_to может использоваться для определения, что сообщения об ошибке должны быть посланы в другое место, например, на локальный адрес postmaster.

Списки рассылки

Вместо файла псевдонимов списки адресатов могут также управляться средствами редиректора forwardfile. Списки хранятся в одном каталоге, например, /etc/exim/lists, и список рассылки nag-bugs будет описан файлом lists/nag-bugs. Он должен содержать разделенный запятыми или переводами строки список адресатов. Строки, начинающиеся с символа #, являются комментариями. Простой редиректор для такой обработки:

lists:
  driver = forwardfile
  file = /etc/exim/lists/${local_part}
  no_check_local_user
  errors_to = ${local_part}-request
При выполнении этого редиректора вместо опций file и errors_to будут подставлены соответствующие значения. Это называется расширением опций. Простейший вариант расширения заключается в подстановке соответствующих значений, что здесь и происходит. Подстрока ${local_part} будет заменена значением $local_part, которое является локальной частью адреса, который сейчас обрабатывается.

Для каждого списка рассылки должен быть пользователь (или псевдоним, или список рассылки) с именем listname-request . На него присылаются все сообщения об ошибках обработки списка или доставки почты.