Новости CodeGear за декабрь 2007
Новость публикуется по просьбе представительства CodeGear в России.
Кратко
1. Программа "Получи RAD Studio у партнеров CodeGear"
2. InterBase 2007 for Mac OS X
3. Электронный магазин shop.codegear.ru
4. 10 наиболее важных изменений со времен Delphi 7
Подробно
1. Программа "Получи RAD Studio у партнеров CodeGear"
Московское представительство CodeGear Borland объявляет о начале
программы "Получи RAD Studio 2007 у партнеров CodeGear". Программа
предназначена, прежде всего, для пользователей в регионах, где сложно
скачать полный дистрибутив RAD Studio (4.2Гб). В рамках этой программы
Вы можете посетить партнера CodeGear и бесплатно получить у него DVD с
дистрибутивом CodeGear RAD Studio 2007.
Используя ключ, который можно получить на сайте www.codegear.com/downloads/free,
Вы можете попробовать триальную версию RAD Studio 2007, или
преобразовать ее в полную версию с помощью лицензионного ключа. Список
партнеров находится на сайте www.codegear.ru. Список постоянно
дополняется.
2. InterBase 2007 for Mac OS X
Выпущена версия InterBase 2007 для Mac OS X. Теперь компактная
высокопроизводительная база с многоверсионной архитектурой доступна и
для пользователей Mac OS X.
www.codegear.com/products/interbase
3. Электронный магазин shop.codegear.ru
Компания CodeGear при поддержке allsoft.ru открывает электронный
магазин shop.codegear.ru. В магазине представлены как наиболее
популярные версии продуктов, так и хиты прошлых лет, которые
пользуются постоянным спросом.
4. 10 наиболее важных изменений со времен Delphi 7
Павел Гловацки, ведущий евангелист CodeGear в Европе, опубликовал
развернутый список из 10 наиболее важных вещей, которые появились в
Delphi со времен 7 версии: dn.codegear.com/article/37416
SOA базовые определения
Шаблоны обмена сообщениями в архитектуре, ориентированной на сервисы. Часть 1.
Microsoft Architects Journal / Русская редакция
Соумен Чаттерджи, CG&Y (Индия)
SOA - совокупность компонентов, удовлетворяюищих бизнес-требованиям. В SOA входят компоненты, севрвисы и процессы. Компоненты - это двоичные модули, у которых имеются определенные интерфейсы (как правило только один), а севрис - это группа компонентов, выполняющих определенную функцию.
Сервис обычно реализуется как некая программная сущность, которую можно обнаружить и которая существует в виде одного экземпляра и взаимодействует с приложениями и другими сервисами, используя слабо-сопряженную (часто асинхронную) модель обмена данными, основанную на сообщениях.
Самая важная особенность SOA - отделение реализации сервиса от его интерфейса. Потребители воспринимают сервис просто как конечную точку взаимодействия, поддерживающую определенный формат запросов и контракт. Как сервис выполняет запросы потроебителей, не имеет значения; единственное обязательное требование состоит в том, что сервис должен возвращать данные потребителю, используя согласованный формат, определенный в контракте.
SOA-объекты - это различные объекты, которые образуют конфигурацию, реализующую парадигму "поиск, связывание и выполнение"
Потребитель сервиса - это приложение, сервис или любой другой программный модуль, которому нужен сервис. Он инициирует поиск сервиса в реестре сервисов, связывание с сервисом через транспорт и выполнение функции сервиса. Потребитель сервиса вызывает сервис, отправляя ему запрос, формат которого соответсвует контракту.
Провайдер сервиса - сущность, к которой обращаются через сеть и которая обрабатывает запросы потребителей. Провайдер сервиса публикует свой контракт в реестре сервисов, чтобы сделать контракт доступным потребителям сервисов.
Реестр сервисов - каталог, доступный через сеть и содержащий данные об имеющихся сервисах. Он получает контракты от провайдеров сервисов, хранит эти контракты и предоставляет их заинтересованным потребителям сервисов.
Контракт сервисов - это спецификация, описывающая, как потребитель сервиса будет взаимодействовать с провайдером сервиса. Контракт задает формат запросов и ответов. Контракт может требовать, чтобы выполнялась определенная пре- и постпроцессная обработка. Такая оброботка определяет состояние, в котором должен находится сервис, чтобы выполнить определенную функцию. Кроме того, контракт может задавать уровни качества обслуживания (QoS) и определять спецификации для нефункциональных аспектов сервиса.
Аренда сервиса. Срок аренды (время, в течении которого может сохранять состояние), передаваемый реестром сервисов потребителю сервисов, необходим для того, чтобы сервисы могли сохранять информацию о связывании потребителя и провайдера. Аренда обеспечивает слабое сопряжение потребителя и провайдера сервиса, на время, в течении которого провайдер и потребитель связаны между собой, ограничено. Без аренды потребитель мог бы постоянно оставаться связанным с сервисом и никогда не выполнять повторное связывание с контрактом сервиса.
Обнаружение и динамическое связывание: обмен сообщениями в SOA.
Потребитель запрашивает данные о сервисе из реестра, и реестр сервисов возвращает список всех провайдеров, которые поддерживают запрашиваемый сервис. Потребитель выбирает из списка провайдер, взаимодействие с которым наиболее эффективно, и связывается с ним, используя указатель из записи реестра сервисов.
Потребитель форматирует сообщение запроса в соответствии со спецификацией контракта и связывает сообщение с коммуникационным каналом, поддерживаемым сервисом. Провайдер запускает сервис и возвращает сообщение, соответствующее определению сообщения в контракте сервиса.
Единственной зависимостью между провайдером и потребителем является контракт, который предоставляет третий участник взаимодействия - реестр сервисов. Эта зависимость возникает во время выполнения, а не на этапе компиляции. Потребитель получает и использует всю необходимую информацию о сервисе в период выполнения. Интерфейсы сервиса обнаруживаются динамически, сообщения конструируются тоже динамически.
Потребитель сервиса не знает формат сообщения запроса или сообщения ответа и местонахождение сервиса до тех пор, пока не возникнет необходимость в сервисе
Возможность преобразования сообщений позволяет сделать приложение более независимыми друг от друга. Обмен сообщениями лежит в основе SOA; SOA не может существовать без обмена сообщениями.
Особенности при интеграции
EAI требует, чтобы вы заранее представляли, какие функции поддерживает каждое приложение. В SOA каждое прилолжение рассматривается как провайдер сервиса и обеспечивается динамическое обнаружение сервисов с помошью общего каталога сервисов - UDDI.
----------
Электроинструмент компании Makita всемирно известен своей феноменальной надежностью и продуманной эргономикой. Приобрести различные инструменты японской марки вы можете на строительном ресурсе Vseinstrumenti.ru.
Украшаем командную строку в csh/tcsh
Вид командной строки в csh/tcsh задается несколькими переменными окружения. Главная из них - prompt. По умолчанию приглашение командной строки имеет вид
%
что нас совершенно не устраивает. Введем команду
set prompt="%m%# "
где %m - имя компьютера, %# - символ > (или первый символ переменной promptchars) для обычных пользователей или символ # (или второй символ переменной promptchars) для суперпользователя.
Увидим, что приглашение изменилось
machine>
Мы перестаем путаться в в удаленных сессиях. Далее добавим имя текущего пользователя (%n) и полное имя директории, где мы сидим в данный момент (%/)
set prompt="%n@%m [%/]%# "
Вид меняется на
user@machine [/usr/local/etc]>
Наше приглашение стало более информативной. Но полный путь занимает слишком много места. Меняем %/ на %c, урезающий отображаемый путь до имени текущей директории
set prompt="%n@%m [%c]%# "
и у нас получилось
user@machine [etc]>
что уже выглядит лаконичнее. Добавим текущее время (счастливые могут пропустить
set prompt="%T %n@%m [%c]%# "
и вуаля
23:01 user@machine [etc]>
По правде говоря, лично меня символ > в конце приглашения раздражает. Для смены символа используем переменную promptchars
set promptchars="$#"
Первый символ подставляется вместо %# если вы обычный пользователь, а второй - если вы суперпользователь.
Теперь записываем полученный результат в ~/.tcshrc или в /etc/csh.cshrc.
Ниже приведен список допустимых подстановок (подробности в man csh):
%/
Текущая рабочая директория.
%~
Текущая рабочая директория, но домашная директория текущего пользователя представлено тильдой ~ и домашние директории остальных пользователей представлены как ~user. Подстановка ~user действует только в случае если оболочка (shell) уже использует ~user в имени пути в текущей сессии.
%c[[0]n], %.[[0]n]
Отслеживает конечный компонент пути к текущей рабочей директории или n конечных компонентов, при заданном n. Если n начинается с 0 количество пропущенных компонентов предваряет конечные в формате /<skipped>trailing. Если установлена переменная оболочки ellipsis, пропущенные компоненты будут представлены как ...trailing. Подстановка ~ действует аналогично %~, но будет игнорироваться при количестве конечных компонентов больше одного.
%C
Аналогично %c, но без подстановок ~.
%h, %!, !
Номер события в текущей истории.
%M
Полное имя машины.
%m
Сокращенное имя машины. Отображается часть до первой точки.
%S (%s)
Включить (отключить) стандартный режим.
%B (%b)
Включить (отключить) режим жирного шрифта.
%U (%u)
Включить (отключить) режим подчеркивания.
%t, %@
Время в 12-часовом (AM/PM) формате.
%T
Аналогично %t, но в 24-часовом формате (зависит от переменной ampm оболочки).
%p
Точное время суток в 12-часовом (AM/PM) формате, с секундами.
%P
Аналогично %p, но в 24-часовом формате (зависит от переменной ampm оболочки).
\c
c будет распознан как код символа.
%%
Символ %.
%n
Имя пользователя.
%j
Количество запущенных в оболочке работ (jobs).
%d
День недели в текстовом формате.
%D
День недели в числовом формате.
%w
Месяц в текстовом формате.
%W
Месяц в числовом формате.
%y
Год в двухзначном формате.
%Y
Год в четырехзначном формате.
%l
tty оболочки.
%L
Очищает от конца приглашения до конца экрана или строки.
%$
Подставляет значение переменной оболочки или окружения с именем, заданным сразу после $ (например %$PATH).
%#
> (или первый символ из переменной оболочки promptchars) для обычных пользователей и # (или второй символ из promptchars).
%{string%}
Включает строку как управляющая escape последовательность. Может использоваться для изменения атрибутов терминала (например для раскраски приглашения) и может не воздействовать на положение курсора. Не может быть последней последовательностью в приглашении.
%?
Возвращает код ошибки команды, запущенной непосредственно перед приглашением.
Зачем пользователю Windows нужен Ubuntu LiveCD
Для многих людей на сегодняшний день единственной возможной операционной системой является виндоуз, однако почти никто из них не рассматривает возможность использования LiveCD с линуксом. Зачем это надо? На этот вопрос я постараюсь ответить в этом небольшом обзоре.
Итак, для начала давайте разберемся что же такое LiveCd. Открытость операционной системы линукс позволяет собирать дистрибутивы на ее основе для самых разных предназначений. Примером как раз являются т.н. LiveCD дистрибутивы, которые позволяют загрузить ОС прямо с компакт-диска. То есть вам не придется устанавливать ОС. Просто вставляете LiveCD в любой компьютер. Потом перезагружаете его и линукс загрузится прямо с компакта. При этом вы можете просмотреть или даже редактировать файлы на своем жестком диске.
Давайте же посмотрим что нам может предложить Ubuntu LiveCD после загрузки.
Ваши жесткие диски вы сможете найти перейдя по Places -> Computer.
Вы сможете открыть и редактировать документы word и excell с помощью open office, просматривать изображения, заходить на странички и форумы в вашей сети, также вам доступны сервера ftp. Также вы сможете просматривать pdf файлы, zip архивы, использование удобный текстовой редактор с выделением синтаксиса, воспользоваться редактором изображений Gimp. При этом полученные файлы можно сохранить как на жесткий диск, так и на флеш.
То есть если у вас не стоит МС офис и вам не охота его искать, ставить, или даже нет свободного места на винчестере, вы сможете воспользоваться open office. Также этот вариант подойдет, если вам прислали сомнительный вордовский документ и вы боитесь его открывать, под LiveCD вашему компьютеру ничего не угрожает. А что делать, если система упала и вам срочно нужен файл с диска/доделать документ? Загрузившись с лайв-сиди вы сможете переписать этот файл на флеш и отредактировать его, если надо.
Теперь переходим к важному моменту. Возможности линукса для восстановления системы. Для начала можно зайти на форум внутри сети (если такой имеется) и спросить там что делать, благо в LiveCD есть Firefox. Вы сможете скачать необходимые для восстановление программы с ftp-серверов. Сам по себе линукс предоставляет неплохой арсенал программ по восстановлению и резервному копированию данных. Первым пунктом хотелось бы отметить gparted, найти его можно так: System -> Administration -> GNOME Partition Editor. По функциональности он схож с партишон мейджиком. В нем вы также можете посмотреть,как называются ваши диски в линуксе. (скорее всего ваш первый жесткий диск называется /dev/hda а первый логический раздел на нем - /dev/hda1 второй жесткий - /dev/hdb и т.д.) Например В GParted вы сможете отформатировать раздел, изменить его размер, удалить его или создать новый.
Перед тем как приступить к командам, как я уже говорил, названия ваших жестких дисков и их разделов вы можете посмотреть в gparted.
Например, чтобы скопировать образ первого логического раздела в файл /media/hda3/hda1backup.img , нужно набрать:
sudo dd if=/dev/hda1 of=/media/hda3/hda1backup.img.
Скопировать образ компакт-диска можно так:
dd if=/dev/cdrom of=/media/hda3/mydisc.iso .
Рекомендую сохранить загрузочную запись(MBR):
sudo dd if=/dev/hda of=/media/hda3/backup.mbr bs=512 count=1 .
Подробнее про команду dd можно узнать в википедии
Если вы недолюбливаете консоль, можете дальше не читать
Если вы недолюбливаете консоль, можете дальше не читать.
Приведу еще пару интересных команд:
Узнать скорость чтения первого раздела винчестера
sudo hdparm -tT /dev/hda1
второго раздела
sudo hdparm -tT /dev/hda2
флешки (первой вставленной)
hdparm -tT /dev/sda1
сидюка
hdparm -tT /dev/cdrom
Посчитать сумму md5 с помощью команды md5sum.
Думаю, что на этом пора останавливаться. От себя могу добавить, что в линуксе есть еще много полезных команд, и обзаведясь LiveCD и базовыми знаниями, вам никогда не понадобится больше rescue cd или загрузочная дискета. Да и в recovery console можно будет мучиться гораздо реже.
Run as interactive user from service
The code below runs a program on interactive desktop with logged on user privileges, as it was started by user himself. Must be executed by Local System, for example, by Windows service.
stdafx.h:
#include <WtsApi32.h>
#pragma comment(lib, "WtsApi32.lib")
#include <Userenv.h>
#pragma comment(lib, "Userenv.lib")
RunAsInteractiveUser function:
BOOL bRet;
HRESULT hr;
HANDLE processToken = NULL;
Почему люди слепо не любят рекламу?
ДАБЫ НЕ БЫТЬ ЗАБАНЕНЫМ, СРАЗУ СКАЖУ - ЭТО НЕ ПРИЗЫВ КЛИКАТЬ НА РЕКЛАМУ В МОЕМ БЛОГЕ!
---
Я сегодня посмотрел на свои заработки по AdSense - 23... цента, 1 клик. Зашибись... Насколько я помню, $50 есть минимум для заказа чека (Google пока только чеками платит, хотя есть мнение, что скоро можно будет выводить не только чеками, но и как-то еще - читал на padlik.ru, но не помню где точно). Да... мне до этих 50 баксов примерно 200 месяцев ползти
Да и фиг с этим AdSense. Я пока только разбираюсь с этим делом в целях будущего продвижения своего главного продукта, который почти закончил разрабатывать. Т.е. сейчас я хочу немного побыть в шкуре владельца рекламной площадки, почуять, так сказать, его психологию.
Но вот, что я хочу обсудить. Почему люди так ненавидят рекламу? Реклама - значит фуфло суют. Фу! Нафиг!! Даже смотреть не буду!!!
Создается вопрос, а почему такое негативное отношение к любой рекламе?
Удивительно, но самой популярной страницей входа у меня является пост про FastMM в Delphi (16% всех входов). Причем, люди входят по тематическим запросам, связанным с Delphi! Скорее всего это именно разработчики на дельфи (врядли сантехники).
Если зайти на указанную страницу, то можно увидеть контекстную рекламу по Дельфи. Вот примерчик, который я увидел:
Direct read/write Excel
Delphi and ActiveX components to read/write Excel files without OLE
sm-software.com
Ради интереса я не поленился и слазил по ссылке (упаси всевышний кликать по ссылке - еще google забанит за накрутку, посему перебрал URL в браузере
). И что же я там увидел? Очень полезный компонент для бинарного экспорта в формат *.xls (Excel). Нафига такой компонент нужен? Оно понятно - скорость: несколько секунд и файл в 100000 ячеек готов (с OLE это только снится). Скорее всего писали ребята из России. Стоит всего 95уе. Я поставил дему и со знанием дела потыкал в разные его места.
Я в свое время написал примерно аналогичный компонент для внутренних нужд своего проекта. В окончательный вариант моего компонента вошла только запись XLS, т.е. без чтения. Пользуюсь своим компонентом я уже более 3 лет - ни одного нарекания, при сотнях экспортов в день данных с разнообразным оформлением и объемом информации (это я к тому, что реально написать самому копонент экспорта в XLS, который будет безотказно работать в течении нескольких лет).
Я работал день и ночь в течении 3х недель, чтобы наваять свой компонент. Это был реальный вызов для меня, ибо сроки горели. Могу сказать точно, что такие старички как я сейчас или молодые ребята не смогут написать экспорт в бинарник за разумные сроки. Это я к тому, что понимаю, какие тонкости есть при работе с XLS в бинарном виде. Указанный компонент я посмотрел в двух моментах, с которыми я ипался дня по 3 с каждым. Везде гуд!
Если бы мне нужно было написать обсуждаемый компонент (т.е. с чтением!), то это у меня заняло бы не менее 3 месяцев с отладкой (хорошо читать XLS куда сложнее, чем писать). Это по нынешним меркам не менее 7500уе з/п! А может и больше - квалификация все же нужна нехилая.
К чему это я? Да к тому, что AdSense (т.е. реклама от Google) не только говно пихает. Если вы находитесь на тематической странице, то обратите внимание на рекламу, особенно, если тема имеет узкую специализацию: иначе вы можете вообще никогда не узнать о чем-то интересном из интересующей вас области. Лично я по рекламе узнал много того, о чем вообще не имел понятия.
PS. Прошу не расценивать мой пост как рекламу указанного копонента. Я также не гарантирую его работу! Я всего лишь убедился, что это не полное гамно и достойно внимания заинтересованными лицами.
Eclipse Process Framework (EPF) 1.2.0
Вчера вечером наступил день релизов. Как уже говорил первым был AllFusion ERWin DataModeler 7.2, вторым был OpenProj - мощный OpenSource инструмент аналог MS Projects, и третий собственно и тема этого поста.
Eclipse Process Framework (EPF) - это инструментальная платформа управления процессами и концептуальный фреймворк для создания, адаптации, развертывания разработанных процессов. При создании продукта разработчики руководствовались такими главными предпосылками.
Разработчики должны понимать методы и ключевый практики разработки ПО. Им должны быть хорошо знакомы базовые задачи разработки - извлечение и управление требованиями, анализ и проектирование, реализация дизайна, реализация тестовых случаев. Новых разработчиков нужно знакомить с применяемыми практиками.
Команде разработки нужно определить как применять эти методы и лучшие практики на протяжении жизненного цикла проекта. Они должны выбрать или определить процесс разработки.
Команде разработки нужен простой централизованный доступ к информации - поддерживаемая база практик и процессов. Обычно процессы не документированы полностью, или представлены в разных местах и различных форматах. Отмечается сложность интеграции в процесс разработки других практики и процессов в проприетарных форматах (книги, статьи)
Итак продукт
Предоставляет всем участникам разработки общую базу знаний - интеллектуальный капитал для просмотра, управления и развертывания. Контент управляемый в EPF может быть опубликован на веб сервере для распределенного использования.
Предоставляет каталог готовый процессов для типичных проектных ситуаций, которые могут быть адаптированы для индивидуальных целей. Он также предоставляет стандартные блоки построения процесса, предоставляющие лучше практики для специфических дисциплин, технологий, или стилей разработки.
Два основные концепции - это содержимое метода (Method Content) и процесс (Process). Эти две концепции прекрасно иллюстрирует знакомая картинка RUP, где по вертикали идут методы (method content: Bisnes Modeling, Requirements, Analysis & Design, Deployment, Management, configuration, Environment) а по горизонтали процессы - фазы и итерации.
Т.е. Method Content описывает как это может быть сделано, какие требуются навыки, пошаговое описание того, как добиться требуемых показателей. Эти методы не зависят от жизненного цикла. Method Content базируется на ролях, необходимых навыков и ответственности за рабочие продукты. Рабочие продукты производятся задачами которые выполняют роли, и имеют рабочие продукты как входы и выходы.
Процесс описывает сам жизненный цикл разработки и определяет последовательность осуществления выполнения работы ролями, и то как производятся и эволюционируют во времени рабочие продукты.
Хранения и структурирование контента определяется схемой, это развитие SPEM 1.1 OMG спецификации, ссылающейся на Unified Method Architecture (UMA). Такая организация контента не ограничивается производством ПО и пригодна в других инженерных дисциплинах.
Коммерческая версия IBM Rational Method Composer предоставляет лишь дополнительные материалы в основном по RUP domain-specific областям.
Готовые процессы
В стандартной поставке идет OpenUP и OpenUP/DSDM. Дополнительно предлагаются для загрузки процессы для XP и Scrum. Кроме самих библиотек можно загрузить и уже готовые для публикации версии всех этих процессов.
З.Ы.
Что мне понравилось, что для процессов есть шаблоны документов и примеры (.doc) и ко многим артефактам добавлены чек-листы. Дополнительно к публикации процесса, его можно экспортировать в MS Project (с файлами которого прекрасно справляется OpenProj).
В общем приятный инструмент, такая схема представления знаний выглядит по лучше SADT диаграммы
Сбылись бы еще идиотские мечты, что кто-нибудь это переведет на русский язык
Такой вопрос поднимался на uml2.ru, но особого движения что-то не наблюдалось. Интересно есть ли русские публикации по OpenUP и OpenUP/DSDM...
А кто и каким образом организовывает свои базы знаний по разработке?
vsftpd и пользователи из базы LDAP.
Предполагается, что сервер каталогов openldap уже установлен и настроен.
Устанавливаем nss_ldap
# cd /usr/ports/net/nss_ldap
# make install
Отредактируем файл конфигурации /usr/local/etc/nss_ldap.conf
host small.server
base dc=small,dc=server
# Пользователь, которому разрешен просмотр каталога
binddn uid=proxy,dc=small,dc=server
# Пароль пользователя proxy
# Пароль не надо хешировать!
bindpw proxy-password
scope sub
bind_timelimit 3
bind_policy soft
nss_paged_results yes
pagesize 1000
pam_filter objectclass=posixAccount
pam_login_attribute uid
pam_password exop
nss_base_passwd ou=People,dc=small,dc=server?one
nss_base_shadow ou=People,dc=small,dc=server?one
nss_base_group ou=Group,dc=small,dc=server?one
Изменим следующие строки в /etc/nsswitch.conf
group: files ldap
passwd: files ldap
Проверяем работу nss_ldap
# id user-from-ldap
Должно выйти что-то похожее на
uid=10000(user-from-ldap) gid=10000(Group-from-LDAP) groups=10000(Group-from-LDAP)
Устанавливаем pam_ldap
#cd /usr/ports/security/pam_ldap
# make install
Отредактируем файл конфигурации pam_ldap: /usr/local/etc/ldap.conf
host small.server
base dc=small,dc=server
binddn uid=proxy,dc=small,dc=server
# Пароль не надо хешировать!
bindpw proxy-password
scope one
bind_timelimit 3
bind_policy soft
pam_filter objectclass=posixAccount
pam_login_attribute uid
pam_password exop
nss_base_passwd ou=People,dc=small,dc=server?one
nss_base_shadow ou=People,dc=small,dc=server?one
nss_base_group ou=Group,dc=small,dc=server?one
Установка самого сервера FTP
# cd /usr/ports/ftp/vsftpd
make config
В появившемся диалоге ставим галочку около опции RC_NG и далее
# make install
Ниже приведен файл конфигурации vsftpd: /usr/local/etc/vsftpd.conf
#Запрещаем анонимусов
anonymous_enable=NO
listen=YES
background=YES
# Указываем какую именно конфигурацию PAM использовать
pam_service_name=vsftpd
check_shell=YES
local_enable=YES
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
# Скрываем какой именно сервер FTP у нас стоит
ftpd_banner=Welcome to FTP service.
# Помещаем пользователей в изолированное окружение
chroot_local_user=YES
pasv_min_port=49152
# Скрываем uid и gid файлов при просмотре директорий.
hide_ids=YES
local_umask=022
anon_umask=022
secure_chroot_dir=/usr/local/share/vsftpd/empty
Создаем файл конфигурации PAM: /usr/local/etc/pam.d/vsftpd
auth required /usr/local/lib/pam_ldap.so
account required /usr/local/lib/pam_ldap.so
# Если вы хотите разграничить доступ к ftp по группам
# можете дополнительно установить модуль pam_require
# и добавить приведенную ниже строку. Подробности тут
account required /usr/local/lib/pam_require.so no_case @Ftp:Users
# Строка для модуля pam_mkhomedir,
# избавляющего от необходимости ручного
# создания домашней директории для нового пользователя
session required /usr/local/lib/pam_mkhomedir.so mode=0700
Добавим следующую строку в /etc/rc.conf
vsftpd_enable="YES"
Запускаем сервер FTP и проверяем его работу
# /usr/local/etc/rc.d/vsftpd start
Ядро Linux как хранитель экрана
Мне как рядовому юзеру от исходных текстов ядра Linux пользы мало, но сегодня я нашел им одно нетривиальное применение, а именно, в качестве хранителя экрана. Это выглядит довольно эффектно и необычно. Для этого потребуется: исходные тексты ядра, менеджер xscreensaver с дополнительным набором хранителей экрана (нужен только Phosphor) и утилита Argument Shuffle (для чего она нужна, описано ниже).
Итак обо всем по порядку. Пример на основе Ubuntu 7.10.
Для начала скачаем и распакуем исходники ядра:
cd /usr/src
sudo apt-get install linux-source
sudo tar -xpjf linux-source-2.6.22.tar.bz2
sudo ln -sf linux-source-2.6.22 linux-source
Поскольку все это я делаю на Ubuntu 7.10, а gnome-screensaver не позволяет настраивать отдельные хранители экрана, то придется заменить его на xscreensaver. Для этого произведем следующие действия.
Отключим gnome-screensaver - Система -> Параметры -> Хранитель экрана, снимаем все установленные галочки и убиваем процесс.
sudo killall gnome-screensaver
Отключим автоматический старт.
gconftool-2 --type boolean -s /apps/gnome_settings_daemon/screensaver/start_screensaver false
И на всякий случай сделаем gnome-screensaver неисполняемым.
sudo chmod -x /usr/bin/gnome-screensaver
Теперь устанавливаем xscreensaver.
sudo aptitude install xscreensaver xscreensaver-data-extra xscreensaver-gl-extra
Пропишем автоматический запуск демона - Система -> Параметры -> Сеансы -> Добавить -> xscreensaver -no-splash
Подправим пункт меню для запуска xscreensaver вместо gnome-screensaver.
sudo gedit /usr/share/applications/gnome-screensaver-preferences.desktop
Находим следующую строку:
Exec=gnome-screensaver-preferences
И заменяем ее на эту:
Exec=xscreensaver-demo
Также нужно закомментировать следующие строки:
X-GNOME-Bugzilla-Bugzilla=GNOME
X-GNOME-Bugzilla-Product=gnome-screensaver
X-GNOME-Bugzilla-Component=general
X-Ubuntu-Gettext-Domain=gnome-screensaver
Чтобы не было конфликтов с Gnome Power Manager, нужно отключить в свойствах xscreensaver функцию управления питанием - Система -> Параметры -> Хранитель экрана -> Расширенные -> убрать галочку "Управление питанием разрешено"
Для того чтобы можно было блокировать экран через Система -> Выход -> Блокировать экран, создадим симлинк
sudo ln -f /usr/bin/xscreensaver-command /usr/bin/gnome-screensaver-command
В комплекте с xscreensaver (пакет xscreensaver-data-extra) идет хранитель экрана Phosphor. С помощью его и команды cat, мы и будем выводить исходные тексты на экран. Исходные тексты находятся в файлах *.c. В простом случае, чтобы вывести всех их на экран можно воспользоваться такой командой cat `find /usr/src/linux-source/ -name *.c`, но так как вывод команды cat неизменен, а получать одно и тоже - не интересно, мы будем использовать программу argshuf (Argument Shuffle). Эта программа работает следующим образом - принимает от другой программы список аргументов и выводит их в случайном порядке. Сборка argshuf довольно тривиальна:
Скачиваем архив. Для сборки необходим только build-essentials, далее все стандартно:
tar -vxzf argshuf-0.1.tar.gz
cd argshuf
make
sudo make install
Теперь можно выводить на экран по одному случайному файлу - cat `find /usr/src/linux-source/ -name *.c | argshuf`. Осталось только настроить Phosphor. Запускаем менеджер хранителей экрана, выбираем Phosphor, нажимаем "Настройка" и в поле "Текстовая программа" вводим
cat `find /usr/src/linux-source/ -name *.c | argshuf`
Spinlock explained
Большинство разработчиков пишут сложные программные комплексы на языках 3-го поколения. При этом их знания начинаются с языка и заканчиваются библиотеками для этого языка. Что происходит "за кулисами" - страшная тайна, доступная лишь немногим. Еще пару лет назад многопоточность и виртуальная память у меня асоциировались с космосом, о котором не хочется думать потому, что страшно и совершенно непонятно. Сейчас же я имею хорошее представление о том, как выполняются мои программы - от трансляции исходного кода в ассемблерные инструкции до цифрового логического уровня. Хочу сказать, что ничего страшного или сверхестественного нет ни в ассемблере, ни в операционной системе, ни даже в механизме работы процессора. Ну, и продемонстрирую это на примере реализации простейшего примитива синхронизации потоков под названием spinlock.
Механизм работы spinlock
Блокировка может находится в двух состояниях - свободна и захвачена. Ее состояние должно быть отражено в ячейке памяти, доступной двум или более потокам. Соответственно, лучшего места, чем оперативная память, для нее найти невозможно. Поток, который пытается захватить блокировку, обязан ждать, пока она не освободится. Ожидание представляет собой цикл попыток захватить блокировку и прерывание цикла в случае успеха. И никакие два потока не должны захватить блокировку одновременно.
Последнее предложение предыдущего абзаца диктует требование к операции захвата блокировки - она должна быть атомарной. Поскольку, грубо говоря, атомарной операцией является одна ассемблерная инструкция, то и захват блокировки должен выполнятся одной такой инструкцией. При этом, одним из аргументов должен быть адрес памяти, где хранится состояние блокировки.
Реализация spinlock
Код функций (объяснение дальше):
__declspec(naked) void __fastcall SpinLock(int *cookie) {
__asm {
mov eax, 1
spinLoop:
lock xchg eax, [ecx]
test eax, eax
jnz spinLoop
ret
}
}
__declspec(naked) void __fastcall SpinUnlock(int *cookie) {
__asm {
mov eax, 0
lock xchg eax, [ecx]
ret
}
}