VR-Online (October 2010)

Page 1


2

Intro

INTRO Главный редактор: Игорь Антонов Меня очень часто спрашивают: «А стоит ли мне браться за n-й проект?». В письме обычно приводят технологии, на основе которых нужно поднимать проект и другую информацию. Я всегда стараюсь помочь человеку и мой ответ в большинстве случаев – «Конечно, стоит!». У меня достаточно большой стаж работы в IT и я могу с уверенностью сказать, что весь свой опыт я получил исключительно на практике. Специального образования у меня нет и я ничуть не жалею об этом. Мне нравится учиться самостоятельно и получать знания на практике. Пускай вначале пути становления делаешь много ляпов. Не нужно бояться и переживать из-за этого. Важно стремиться и идти к поставленной цели. Пускай сегодня ты написал самый медленный и некрасивый код, но в настоящий момент этот код работает и выполняет свою главную роль – решает чьюто проблему. Этого не нужно стыдиться. Все прейдет со временем. Главное не

Редакторы номера

Идея проекта Фленов Михаил aka

Horiffic

(http://flenov.info)

Антонов Игорь aka Spider_NET Роман Костенко aka

останавливаться и идти против ветра. Просто помни, что профессионалом родиться нереально, им можно только стать. И я уверен, что стать хорошим специалистом может практически каждый. Нужно только приложить немножечко усилий. Помни, что твоя судьба в твоих руках и только от тебя зависит, кем ты станешь завтра. Не трать свое время зря. Старайся выжить максимум из каждого дня. Если есть возможность научиться чему-то новому, и ты уверен, что в будущем это может пригодиться – берись и даже не задумывайся. Также не забывай, что жизнь не ограничивается одной областью. Это не только компьютеры, IT, программирование и околокомпьютерные темы. В жизни есть еще масса интересных вещей. Смотри шире и старайся взять от жизни максимум. Главное, без фанатизма ;-) Приятного чтения!

Обложка и верстка Антон Козлов aka

Jimmy Jonezz

Контакты mail@vr-online.ru

antonov.igor.khv@gmail.com

Lord_of_Fear

vr-online | октябрь 201 0


3

Содержание

Содержание ноябрь [26] 2010

IT­NEWS

HARD­NEWS

VrIP ПЕРСОНА Андрей Ширяев: создатель сайта www.rce.su

КОДИНГ Android. Простое приложение для Android Android. Переходы между формами Android. Использование диалогов Delphi. Разбираемся с TVirtual TreeView и TEasyLIstView Adobe AIR. Hello World Python. Дружим python и MySQL C#. Учимся работать с MySQL из C# C#. Разрабатываем MSN-клиент Silverlight. Основы. Валидация. Часть 1 Silverlight. Основы. Валидация. Часть 2 Я ПРУСЬ

ОБЗОРЫ ОТ VR­ONLINE Linux-сервер в Windows-окружении CSS. Рецепты программирования Удобный коммуникатор. Nokia E71 Обзор внешнего жесткого диска A-Data Nobility NH92

БЕЗ РАМКИ 1 0 самых необходимых приложений для Android Bada. Знакомимся с мобильной платформой от Samsung Как интернет влияет на нашу жизнь Винт с турбонаддувом. Нужен ли RAID дома? Что такое бизнес-процессы и зачем они нужны Issuu.COM. Хостинг для электронных журналов МЕНЯ ТОШНИТ

АДМИНИНГ Дружим Debian c AD: Корпоративный файловый сервер Составляем план перехода на OpenSource МНЕНИЕ VR

ШКОЛА Создание БД в IBConsole и приложения в Delphi. Часть 2 Знакомимся с 1 С:Предприятие 8. Часть 5. Встроенный язык КРЕАТИFF Рассказ. "Не забуду" FAQ FAQ по FreeBSD

vr-online | октябрь 201 0


Материал подготовили: AnyKey и Spider_NET Сайт: vr-online.ru

4

IT­News

IT-News

Новости из мира компьютерных технологий

Новые библии, на Новый Год Многие из нас, кто выбрал в качестве языка программирования Delphi, начинали свой тернистый путь к становлению программистом после прочтения легендарной книги – «Библия Delphi». Эту книгу многие ругали, а другие восхищались. Ваш покорный слуга и сам начинал с нее. Могу вам сказать, положа руку на сердце, что это одна из немногих книг, прочитав которую, практически каждый сможет начать писать программы. Я нисколечко не преувеличиваю. Это действительно так и если ты только сегодня решил стать программистом, то обязательно присмотрись к ней. К сожалению, сегодня Delphi уже не так популярен, как 1 0 лет назад (примерно тогда автор начал работать над первой версии Библии), поэтому если ты не хочешь браться за его изучение, то советую обратить внимание на перспективный C#. Это отличный язык и его однозначно стоит учить. И в этом деле тебе опять поможет Библия, только на этот раз «Библия C#». Эту книгу написал тот же автор и следовательно она написана полностью в таком же стиле – просто и хорошо. Совсем недавно, Михаил отправил в 67­й номер журнала "Phrack"

Буквально на днях вышел новый номер

издательство новые версии этих книгбестселлеров. Если все пойдет по плану, то под самый Новый Год на прилавках магазинов появятся новые издания Библии Delphi (3-е издание) и Библия C# (2-е издание). Первая книга обновилась не очень сильно (по словам автора), а вот вторая вобрала в себя много новой информации. Так, что если ты захотел купить «библию» прямо сейчас, то рекомендую немножко подождать и приобрести сразу обновленную версию.

одного из самых старейших хакерских журналов – Phrack (http://phrack.org). Я не опечатался, употребив слово «старейший». Это действительно так. Первый номер датирован ноябрем далекого 1 985 года. С тех самых пор журнал и существует. Жаль, что выходит он очень редко – обычно раз в год. Ну, уж лучше так, чем никак. Скачать новый номер (как и все остальные) ты можешь с официального сайта – phrack.org. vr-online | октябрь 201 0


5

IT-News

Мобильные гугл­доки Компания Google представила мобильную версию сервиса Google Docs по редактированию документов в режиме онлайн. Теперь владельцы смартфонов и планшетов на платформе Android 2.2 Froyo, а также устройств Apple с установленной iOS 3.0 и выше смогут не Шопинг по­гугловски Компания Google запустила собственный сервис для онлайн-шопинга под названием Boutiques.com. Принципиальное отличие Boutiques.com от популярных онлайнмагазинов, таких как Amazon или eBay, заключается в том, что пользователю не предлагается покупать что-либо непосредственно на сайте. Boutiques является путеводителем, с помощью которого покупатель может найти нужный товар и приобрести его на сайте производителя, перейдя по ссылке. Шопинг-сервис модерируется вручную, однако, в него встроен алгоритм распознавания пользователя, который в автоматическом режиме рекомендует покупателю товары в соответствии с его интересами. Для того чтобы получать Скрытые счетчики репутации

Сервис микроблогов Twitter подсчитывает "рейтинг репутации" (reputation score) для каждого пользователя. Об этом сообщается со ссылкой на заявление одного из основателей Twitter Эвана Уильямса (Evan

только просматривать, но и редактировать документы Google Docs непосредственно с помощью мобильного браузера. Полностью сервис будет запущен в течение нескольких дней. При этом на начальном этапе пользователям будет доступна возможность редактировать документы только на английском языке. Поддержка других языков будет добавлена позднее. подобные рекомендации, нужно создать собственный профиль в разделе Your Boutique. На момент запуска Boutiques.com посвящен исключительно женской одежде и аксессуарам, однако в будущем Google планирует расширение ассортимента.

Williams). "Рейтинги репутации" являются одним из инструментов для определения подборки микроблогов, которую пользователь Twitter видит справа в окне "Who To Follow". Об этом Уильямс сообщил, отвечая на вопросы в ходе проходившего с 1 5 по 1 7 ноября в Сан-Франциско саммита Web 2.0. Как именно формируется "рейтинг репутации", основатель Twitter не уточнил. По словам Уильямса, в данный момент рейтинги считаются только для внутреннего пользования, однако в будущем не исключен их вывод в открытый доступ.

vr-online | октябрь 201 0


6

IT-News

Продвинутый руткит для Windows 7 64­bit Компания Prevx сообщила о появлении любой код на уровне ядра Windows, самого продвинутого руткита под 64-битную работающий в системе, должен иметь версию операционной системы Windows 7. соответствующую подпись, говорящую о том, Ранее данный руткит существовал только в что данный код (чаще всего это драйвер) 32-битном варианте, новая версия нацелена происходит из надежного источника. на более современные системы. После проникновения в систему, руткит В Prevx говорят, что руткит TDL, также модифицирует главную загрузочную запись известный как Alureon, может заражать 64на жестком диске компьютера, изменяя битные Windows 7, обходя расширенные условия загрузки ОС. По словам создателей, компоненты защиты, изначально как раз и руткит меняет MBR на диске и созданные для того, чтобы блокировать устанавливает специальную политику под различного рода атаки, сообщает названием LoadIntegrityCheckPolicy, которая SecurityLab. блокирует процесс валидации загружаемых Руткит TDL4 проникает в 64-битные Windows программ и позволяет запускать на уровне ядра другие неподписанные DLL-библиотеки. 7, обходя системы ядра Windows, работающие на основе политик подписи исполняемого низкоуровневого кода. То есть, Журналы VR­Online мигрируют на issuu.com Нам очень нравится хостинг особых нет, но сам по себе процесс нудный и для электронных журналов – рутинный. Поэтому, перенос будем issuu.com. Уверен, что и выполнять в несколько этапов. В настоящее многим читателям он время уже были перенесены все номера за нравится тоже. В связи с 201 0, 2009, 2008, 2007 года, а также этим, мы решили абсолютно все выпуски «Для поднапрячься и перенести программистов». Остальные номера будут на него все номера наших перенесены немного позже. Следи за журналов. Сложностей новостями.

Открытый F# Microsoft опубликовала полные исходные коды функционального языка программирования F#. Компания сделала вторую версию языка F# полностью открытой, включая исходники компиляторов и ключевых библиотек по условиям лицензии Apache 2.0. По словам Дона Сайма, старшего технического специалиста по разработке Microsoft F#, открытие языка говорит о том, что Microsoft намерена придать в будущем ему еще большую популярность среди независимых разработчиков, пишет CyberSecurity. Начиная с февраля этого года, исходники F# были доступны по условиям ограниченной

лицензии Microsoft, а бинарные версии были доступны бесплатно на сайте компании как самостоятельные продукты и как плагин для среды Microsoft Visual Studio. Сейчас же в Microsoft говорят, что в свободном доступе открываются абсолютно все документы, касающиеся F#, включая технические моменты, касающиеся создания языка. Код доступен в рамках проекта F# PowePack - http://fsharppowerpack.codeplex.com/

vr-online | октябрь 201 0


7

IT-News

Opera Mobile для Android Вышла первая публично доступная бета-версия браузера Opera Mobile 1 0.1 для смартфонов под управлением операционной системы Android. До сих пор пользователи могли ставить только Opera Mini – менее функциональную версию браузера, не имеющую полной поддержки JavaScript и ряда других веб-технологий. Отличительная особенность версии для

Android – поддержка функции pinch-to-zoom: пользователь может при помощи двух пальцев увеличить или уменьшить масштаб страницы, пишет РИА Новости со ссылкой на компанию Opera. Основной недостаток Opera Mobile для Android по сравнению со стандартным браузером, используемым на этой платформе, – это отсутствие поддержки видео в формате HTML5, что на сегодняшний день является стандартной возможностью для пользователей мобильного Интернета.

Состоялся релиз 6­го RedHat Enterprise Linux Компания Red Hat объявила о выходе новой - Повышение производительности; версии Red Hat Enterprise Linux. Шестая - Всестороння поддержка технологий версия построена на ядре 2.6.32 с энергосбережения; бэкпортами из более новых версий. Новая - Новые возможности в обеспечения версия RHEL однозначно порадует webдевелоперов. В состав дистрибутива вошли безопасности (демон System Security Services Daemon); свеженькие версии ПО, применяемого при разработке web-проектов: PHP 5.3, Python - Обновленная версия компилятора GCC. Он 2.6, MySQL 5.1 , PostgreSQL 8.4. дорос до версии 4.4; Из других изменений стоит выделить: - и т.д. - файловая система Ext4 (теперь она имеет Более подробный обзор можно прочитать на статус Production); сайте OpenNET.ru Шоу блоггеров от LJ Компания SUP, владеющая блогхостингом LiveJournal и интернет-изданием "Газета.Ru" готовит собственное ток-шоу "Живой клуб". Первый выпуск с участием известных блогеров будет записан 1 7 ноября, в тот же день состоится его онлайн-трансляция на сайте LiveJournal.Ru. Ведущим новой программы станет журналист Петр Фадеев, сообщил шефредактор LiveJournal.Ru Роман Челюскин. Пока программа будет выходить только в онлайн-режиме, появится ли она в телеэфире - не сообщается. Однако, по словам Челюскина, в дальнейшем планируется выпускать ток-шоу на других мультимедиа-ресурсах. Формат проекта "Живой клуб" определяется компанией как "видеоверсия дайджеста самых актуальных тем, обсуждаемых в блогосфере", передает РИА Новости. Таким образом, ток-шоу, по всей видимости,

задумано как онлайн-видеодебаты или видеоверсия нового проекта LJTimes, запущенного в сентябре, который позволяет отслеживать свежие новости блогосферы (сервис вызвал резкую критику пользователей). В качестве гостей программы выступят известные блогеры и авторы отдельных постов, вызвавших бурную реакцию пользователей Рунета. Среди тем, которые планируется обсудить в ближайших выпусках ток-шоу, - нападение на Олега Кашина, инициативы нового мэра Москвы Сергея Собянина и фильм "Брестская крепость", сообщает SUP. vr-online | октябрь 201 0


Автор: Роман Костенко aka Lord_of_fear Новости подготовлены с использованием материалов ресурса http://www.news-it.net

8

Hard­News

Hard-News

Новости из мира "железа" и техники

Системный блок размером с банку Coca­Cola Компания Xi3 разработала самый компактный в мире компьютер, размеры которого составляют всего 1 01 ,6х92,8х92,8 мм. Такое устройство получило название Modular Computer. Данную модель можно отнести либо к категории карманных компьютеров, либо к неттопам. Xi3 основан на платформе AMD и содержит три модульные платы, на которых расположены основные компоненты системы. Он может содержать процессор Athlon 64 2000+ (1 ГГц), 3400e (1 ,8 ГГц) или 4200+ (2,2 ГГц). Также новинка оснащается оперативной памятью объемом 1 или 2 ГБ, интегрированным графическим ядром с поддержкой DirectX 1 0, гигабитным сетевым портом Ethernet, двумя портами eSATA,

шестью портами USB, видео выходами DVI и DisplayPort.

Lenovo выпустила ультра тонкий ноутбук Ультра портативный ноутбук Lenovo IdeaPad устройство выполнено в корпусе из U260 имеет толщину всего 1 8 мм. При этом магниево-алюминиевого сплава и оснащается 1 2,5-дюймовым дисплеем. Также новинка может содержать процессор Intel Core i3 или i5 с интегрированным графическим ядром, до 4 ГБ оперативной памяти стандарта DDR3, жесткий диск емкостью 320 ГБ. Емкости 4-ячеечного аккумулятора достаточно для 4 часов автономной работы. Новинка поступит на рынок с предустановленной операционной системой Windows 7 Home Premium. Флагманская видеокарта от NVIDIA: GeForce GTX 580 В начале ноября этого года компания NVIDIA процессоре GF11 0, который изготавливается по нормам 40-нанометрового официально представила свою новую флагманскую видеокарту GeForce GTX 580. технологического процесса и содержит около 3 млрд/ транзисторов. Содержит 51 2 Видеокарта основана на графическом потоковых процессоров, 64 текстурных vr-online | октябрь 201 0


9

Кодинг блока, 48 блоков растеризации и 1 536 МБ видео памяти стандарта GDDR5 с 384битной шиной доступа. ропускная способность памяти составляет 1 92,4 ГБ/с. Оснащается двухслотовой системой охлаждения, основанной на технологии испарительной камеры (Vapor Chamber), что призвано повысить эффективность охлаждения. Данная технология подразумевает, что медное основание кулера контактирует с поверхностью графического процессора и передает тепловую энергию жидкости, которая, в свою очередь, при испарении передает тепло ребрам радиатора, обдуваемым вентилятором турбинного типа.

Первоначально ходили слухи, что релиз новых видеокарт NVIDIA GeForce GTX 580 будет лишь бумажным, а их фактические продажи начнутся ближе к новому году. Однако на самом деле продажи новинок начались сразу же в день релиза.

Мультимедийный 3D моноблок AE2420 3D от MSI Еще не успели утихнуть страсти по MSI AE2420 3D имеет сенсорный дисплей с «Аватару» в 3D, а компания MSI выпустила диагональю 23,6 дюйма с разрешением первый в мире 3D моноблок AE2420 3D. 1 920х1 080 точек, который идеально Такая новинка предназначена для подходит для просмотра фильмов, применения в развлекательных целях и фотографий и игр. Это устройство вобрало в просмотра мультимедийного контента. себя все новейшие технологии: MultiTouch, 3D, USB 3.0 и многие другие. Мощная начинка в лице высокопроизводительного процессора Intel Core i5 650 и видеокарты Radeon HD 5730 в комбинации с экраном, имеющим частоту обновления кадров 1 20 Гц, дают возможность реализовать все возможности стереоизображения. А весь мир видео в формате Full HD будет доступен пользователю благодаря наличию оптического привода BluRay. Даёшь нетбуки с двуядерными процессорами! Двуядерные процессоры стали перебираться 2-ядерным процессором. уже и в нетбуки. Так, например, совсем Нетбук LG X1 70 основан на платформе Intel недавно компании Samsung и LG Pine Trail и содержит 2-ядерный процессор анонсировали выпуск нетбуков, оснащенных Intel Atom N550, который работает на частоте 1 ,5 ГГц и несет на борту встроенные контроллер памяти и графическое ядро GMA 31 50. Также анонсированная модель оснащается 1 0,1 -дюймовым дисплеем с LED подсветкой, разрешение которого может составлять 1 024?600 или 1 366х768 точек. Кроме того, в нетбуке LG X1 70 содержится 1 ГБ оперативной памяти стандарта DDR3, жесткий диск емкостью 250 ГБ, сетевой интерфейс Ethernet 1 0/1 00, модули vr-online | октябрь 201 0


10

Кодинг беспроводной связи Wi-Fi и Bluetooth 3.0. Устройство комплектуется 6-секционным аккумулятором. В нетбуке Samsung N350 содержится такой же 2-ядерный процессор Intel Atom N550, 1 0,1 -дюймовый дисплей с LED подсветкой с разрешением 1 024х600 точек, 1 ГБ оперативной памяти, жесткий диск емкостью 250 ГБ. Кроме того, новинка оснащается вебкамерой, сетевым портом 1 0/1 00 LAN, модулями беспроводной связи Wi-Fi 802.11 b/g/n и Bluetooth 3.0, кард-ридером 4-в-1 . Заявленная ранее интеграция беспроводных модулей LTE (Long Term Evolution) и HSPA+ не реализована. Используемый аккумулятор, состоящий из трех ячеек, обеспечивает

нетбуку Samsung N350 до 6,5 часов автономной работы. Стоимость ниже, чем у ранее упомянутого LG X1 70 : $450 против $600.

Gygabyte: материнские платы для процессоров Intel Sandy Bridge В скором времени компания Intel представит чипсетах материнские платы Gigabyte свои процессоры нового поколения, доступны в виде моделей P67A-UD7 известные под кодовым названием Sandy (флагманская модель), P67A-UD5, P67ABridge. Такие чипы получат новое UD4, P67A-UD3R, P67A-UD3P, P67A-UD3, процессорное исполнение LGA 11 55 и не H67MA-UD2H, H67MA-D2H, H67M-D2, H67Aбудут совместимы с существующими UD3H, PH67A-UD3, PH67-UD3. Такие материнскими платами. Теперь же компания устройства выполнены в форм-факторах Gigabyte анонсировала выпуск сразу 1 2 micro ATX и ATX, обладают поддержкой материнских плат, предназначенных для двухканальных комплектов памяти совместного применения с процессорами стандарта DDR3, содержат от одного до Intel Sandy Bridge. четырех слотов для дискретных видеокарт PCI-Express x1 6, по два разъема SATA3. Для процессоров Intel Sandy Bridge Модели с буквой А также оснащаются предназначены наборы системной логики портами USB 3.0. P67 и H67. Анонсированные на данных Super Talent предлагает недорогие накопители с интерфейсом USB 3.0 Первые появившиеся на рынке флэшки с информации на операциях чтения удалось интерфейсом USB 3.0 многих отпугивали повысить с 32 до 67 Мбайт/с. высокой ценой, которая могла в разы отличаться от стоимости аналогичных по объёму накопителей с интерфейсом USB 2.0. Компания Super Talent решила исправить эту несправедливость, и на прошлой неделе представила два доступных твёрдотельных накопителя с интерфейсом USB 3.0. Семейство USB 3.0 Express Duo состоит из двух накопителей объёмом 8 Гб и 1 6 Гб, которые в текущем месяце будут предлагаться по цене $1 4 и $29, практически нивелируя разницу в цене с накопителями идентичной ёмкости, оснащёнными только интерфейсом USB 2.0. Скорость передачи

vr-online | октябрь 201 0


Интервью брал Игорь Антонов

11

Интервью с Андреем Ширяевым

VrIP персона

Cоздатель сайта www.rce.su

Если тебя интересуют такие темы как реверсинг, кодинг, ICQ, proxy, а также защита и взлом программ, то сайт WWW.RCE.SU поможет тебе в этом разобраться, а мы в свою очередь познакомим тебя с центральной личностью этого ресурса - создателем сайта, Андреем Ширяевым. 1 . По традиции расскажи немного о себе (представься, где родился, на кого учился).

реверсинге, но и о кодинге (в том числе защита ПО), защите/взломе выделенных серверов под управлением ОС Windows, ICQ (тут и взлом, и защита и многое другое), ну и Меня зовут Андрей Ширяев. Я родился в в довесок proxy. Кропоткине, окончил лицей №3, а сейчас Работы над сайтом нужно провести еще учусь на инженера-программиста. Люблю много. На несколько лет точно хватит. детей и в скором будущем, надеюсь, буду Рассчитывается он (rce.su) в первую нянчить детей своей любимой сестры, очередь на новичков во всех этих темах, Оленьки ;-) поэтому в описаниях я пытаюсь попонятней 2. Как давно ты начал заниматься webобъяснить для чего та или иная программа, проектами? Каким первым был твой а программы я выкладываю только проект? действительно те, что будут нужны. Эту Ох, это было лет 5 назад. Свалил тогда я с тематику я выбрал из-за того что она мне mail.ru на pochta.ru, который не так давно интересна и, надеюсь, еще долго будет вошел в состав qip.ru. Оказалось, что в этом интересна. сервисе, кроме почты, можно создать свой 4. Над rce.su ты трудишься в одиночку веб-сайт. Хотя такие сайты сложно назвать или вас целая команда? полноценными, т.к. они, как и на народе могут состоять только из голого html’а. Ну и Тружусь я один и, возможно, из-за того, что я человек настроения, он и не очень часто сделал я сайт, на котором расположил обновляется, но летом я за него поплотнее несколько своих программ, имеющих возьмусь, главное не перестараться. Но я непосредственное отношение к любимой читал твои статьи, связанные с кодингом и моей игре - «Героям Меча и Магии 3». понял, что ты тот, чья бы помощь мне не 3. Расскажи про свой проект rce.su. Для помешала ;). кого он создавался в первую очередь,

почему решил создать ресурс именно такой тематики?

Если посмотреть название домена, то можно понять, что это какая-то аббревиатура. RCE Reverse Code Engineering, т.е. реверсинг или по-русски говоря - исследование ПО. Где-то года 2 назад я загорелся идеей создать сайт по этой тематике и желательно с названием домена rce.**. Это и коротко, и передает суть сайта тем, кто знает расшифровку аббревиатуры. Увы, руки дошли только в начале этого года, но когда я его создал, я понял, что могу поведать людям не только о

5. Я всегда готов помочь, чем могу. Если что – обращайся ;-) Поскольку твой проект, так или иначе, связан с security/hacking'ом, то какие бы ты мог порекомендовать ресурсы схожей тематики нашим читателям?

Ресурсов хороших очень много, некоторых тематик ресурсы лучше на русском языке (ICQ - http://asechka.ru) , а некоторые на английском или даже на китайской (RCE http://tuts4you.com, http://pediy.com). Сайтов чья тематика направлена именно на proxy и выделенные сервера, кроме http://proxy-

vr-online | октябрь 201 0


12

VrIP персона base.org я не знаю, но и его одного достаточно.

6. Как ты относишься к твиттеру? Для тебя это больше "развлечение" или средство продвижение своих проектов?

Положительно, сижу в нем пол года и планирую еще долго сидеть, тем более в нем сидит мой любимый исполнитель, основатель группы «25/1 7», Андрей Бледный, так, что и его почитываю заодно. Твиттер я использую для общения, а если он еще и как-то сопутствует продвижению моих проектов, то это же просто замечательно.

7. Читаешь ли ты какие-нибудь электронные журналы? Как ты считаешь, у электронных журналов есть будущее или их рано или поздно заменят блоги?

Читаю с удовольствием журналы темы, которых меня интересует. Иногда я просто поражаюсь, какими они могут быть интересными. Например, мне очень нравится журнал «Вестник Героев» про серию игр «Герои Меча и Магии» и близкие ей по духу игры. Как бы изначально блоги и не должны были нести в себе информацию, которую мы можем получить из электронных журналов, так что и заменить они их полноценно никогда не смогут.

8. Не могу не спросить, а электронный журнал vr-online хоть раз читал? Если да, то каковы твои впечатления о нем?

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

9. Спасибо за теплые слова! Если не ошибаюсь, проект rce.su построен на базе известного WordPress. Многие securityэксперты считают его небезопасным продуктом. Почему ты выбрал именно его? Как относишься к таким cms/cmf системам как Drupal?

Да, не ошибаешься, он построен на базе WP. С многими security-экспертами я и соглашусь и не соглашусь одновременно. Во-первых, он не более уязвим, чем остальные популярные движки (они все уязвимы/небезопасны в

какой-то мере), не так давно в одном из обновлений DLE была критическая ошибка, благодаря которой при помощи специально составленного запроса можно поменять пароль любому пользователю, в том числе админу, и делать свои «грязные дела». Поскольку эта информация быстро попала на паблик, то сайты на DLE ломали даже первоклассники. Во-вторых, можно вручную или при помощи плагинов (слава Богу у WP их предостаточно), например, предотвратить возможность XSS-атак, так же можно ограничить доступ к админке определенному диапазону ip и т.п. В-третьих, не так давно был взломан известный интернет-проект, посвященный веб-безопасности, antichat.ru. Злоумышленники использовали для заливки шелла находящийся на одном сервере с проектом блог, базирующийся на WP, администратора античата. Блог не был взломан, хакеры получили доступ к электронной почте, через которую и был восстановлен пароль от этого блога. Короче, берегите свою почту, обновляйте почаще WP и не используйте плагины и темы из ненадежных источников. Также это относится к тому же DLE, Joomla! (к его новым версия тоже выходят эксплойты, так что он тоже не сверхбезопасный, как могут считать некоторые security-эксперты) и другим движкам. Выбрал я WordPress по той же причине, что и выбирают его другие. Он легок в использовании, настройке, для него существует много множество плагинов и тем. Также rce.su это все же блог, хоть может показаться иначе. К Drupal отношусь крайне положительно, но он, конечно, не для новичков. Скорее всего, создам один из своих будущих проектов именно на нем.

1 0. Назови свои пять любимых сайтов.

http://google.com – использую и поисковик, и многие сервисы, в том числе и почту. http://twitter.com – какой русский не любит «щебетать». http://zloy.bz – злой портал для добрых людей. Во, сказанул же. Всякие нехорошие разделы скрыты от незарегистрированных. http://asechka.ru – крупнее и интереснее vr-online | октябрь 201 0


13

VrIP персона сайта про ICQ не найти. Если из-за чего-то у народа перестала работать ася (сбои в работе серверов или тех. работы чаще всего), то количество гостей онлайн возрастает на нем на порядок. http://wforum.heroes35.net – так сайт и не сделали, уже 3-ий год только форум, но нравится он мне. Тема ясна из названия, он про «Героев», точнее это официальный сайт команды CoreWog, которая разрабатывает новую версию 3.59 знаменитого «Героев Меча и Магии 3: Во Имя Богов». Всякие интересные холивары на острые темы там проходят постоянно.

спортивные игры, это же и интересно, и полезно. Хотелось бы теннисом большим заняться, но негде, а настольный уже приелся, хотя пару партиек бы сейчас сыграл. Крученные у меня очень хорошо получаются, если играть не кедами, да и такое бывает, помню, мы как-то дневниками еще в школе играли. Время за компьютером не считаю. Чаще всего не мало, но бывает, без него дни провожу.

1 4. Что ты думаешь по поводу высокого уровня пиратства в нашей стране? Почему на твой взгляд народ не готов покупать даже самой дешевый софт?

Думаю, что он не намного выше, чем в других развивающихся странах, но все же люди берут и лицензии, просто их не очень много. Возможно, со временем уровень пиратства станет меньше. Менталитет у нас Конечно, это у меня как бы в крови (мама – такой. Как говорилось в какой-то рекламе, программист, точнее образование у нее «если нет разницы, то зачем платить математическое, но как раз с таким больше?». В этом что-то есть. Нам же образованием тогда и работали продают воздух, хотя антивирусы это программистами). На всем в большей или никакой не воздух, поэтому лицензии и меньшей мере. Pascal/Object Pascal, Basic, продаются не навсегда, а на какой-то срок. C++, немного Асм. Предпочитаю Object Т.к. поддержка всех серверов для Pascal, среду – Delphi 7 (старовер я). Да обновлений и оплата команды писал, и на тему реверсинга, и на тему proxy, разработчиков, исследователей, тестеров и а на тему ICQ сейчас пишу и скоро выпущу. др. стоит не малых денег.

11 . Ты программируешь? Если да, то на каком языке и пробовал ли ты сам писать программы, соответствующие тематике твоего сайта.

1 2. Расскажи про свои планы на будущее. 1 5. Ты пишешь про Security. Для тебя это Планируешь ли запускать новые хобби или ты занимаешься этим проекты? профессионально? В жизни планы как у большинства (работа, семья, дети и т.д), сваливать из страны не собираюсь. Хочется, конечно, в будущем хочется начать получать пассивный доход, которого будет хватать на хорошую жизнь. Знаю, что для этого нужно вкладывать время, силы, деньги и я попробую сделать это. Да планирую (я про новые проекты). Домены уже зарегистрированы, так что совсем скоро запущу. Не один, и не два, а три. Может быть, потом еще что-нибудь захочу из проектов создать. Поживем-увидим.

Хобби, надеюсь, что в будущем буду заниматься профессионально.

1 6. Ну и напоследок, чтобы ты хотел пожелать нашим читателям?

Желаю им и их близким и любимым, чтобы они были счастливы, а каждому для этого нужно свое.

1 3. Чем ты любишь заниматься в свободное от программирования время и сколько обычно в день проводишь времени за компьютером? Люблю читать и писать. Чаще всего читаю с экрана монитора, но не всегда. Люблю

vr-online | октябрь 201 0


Автор: Дарья Ряжских Почта: ifndef@yandex.ru, Сайт:http://darja.info

14

Кодинг

Знакомство с Android. Часть 1: Простое приложение для Anroid

Недавно заинтересовала меня платформа Android. Как-то много говорят о ней в последнее время, да и, вообще, хотелось узнать такая же ли там ужасная Java, как в мидлетах. Так что потратила я некоторое время на копание в ней, написала простое приложение, и сейчас вот буду делиться опытом. Постановка задачи

Первым нашим приложением для Android будет реализация всем известной игры Life. Местом дейтвия будет прямоугольное клеточное поле, размеры которого запрашиваются у пользователя. Также у пользователя запрашивается начальное количество клеток. Первое поколение расставляется по карте случайным образом. Последующие поколения получаются по следующим правилам: • Если у живой клетки меньше двух или больше трёх соседей, то она погибает. • Если у пустой клетки ровно три соседки, она оживает. Все входные параметры должны проверяться на правильность: столбцов должно быть не меньше 5 и не больше 25, строк должно быть не меньше 5 и не больше 35, начальное количество клеток должно быть не больше, чем ячеек на поле. Для реализации поля будет использован класс GridView. Для разработки была использована среда Eclipse и Android plugin для неё. Реализация будет из четырех частей: • Часть 1 - Простое приложение для Android • Часть 2 - Переходы между формами • Часть 3 - Использование диалогов • Часть 4 - Использование GridView

состоящее из одной формы. На форме будет интерфейс для ввода данных и кнопка Run.

Создание и обзор проекта

На установке Android SDK и плагина для Eclipse останавливаться не будем, т.к. это достаточно подробно описано в официальном мануале. Создаем в Eclipse новый Android Project:

В этой части

Мы создадим проект, рассмотрим его структуру и напишем простое приложение, vr-online | октябрь 201 0


15

Кодинг После нажатия на кнопку Finish создастся новый проект с такой структурой файлов:

обратно в разметку и в атрибутах этого TextView прописать android:text="@string/hello". /gen/R.java Это - такой специальный сгенерированный класс, посредством которого осуществляется доступ к ресурсам приложения (т.е. ко всему тому, что есть в папке res). Например, R.string.hello возвращает константу с именем hello из strings.xml.

StartActivity.java

Это нам плагин сгенерировал класс для главной (и пока что единственной) формы приложения. Там пока содержится единственный обработчик onCreate, и написано там только setContentView(R.layout.main);. С помощью этой строчки к данной форме привязывается разметка, описанная в файле /res/layout/main.xml

AndroidManifest.xml Рассмотрим эту структуру внимательнее. /res/drawable-dpi Сюда помещаются все графические файлы, используемые в приложении для разных разрешений экрана. На данный момент там есть только файл icon.png - главная иконка приложения. /res/layout В эту папку помещаются файлы, в которых в формате XML описывается внешний вид форм, расположение контролов и т.д. (как dfm-ки в Дельфи). Плагин даже создал разметку для нашей единственной формы и назвал её main.xml. Позже мы рассмотрим ее подробнее. /res/values В этой папке хранятся общие константы для всего приложения, как то: текст, используемый элементами управления, цвета, стили и т.д.. Например, если мы хотим вывести "Hello World" в TextView, можно это сделать явно в разметке, как мы всю жизнь делали в тех же dfm-ках или aspx; либо создать в strings.xml константу hello со значением "Hello World", после чего пойти

В этом файле перечисляются общие свойства проекта (версия, package и прочее), а также все формы (Activities), входящие в проект.

Разметка формы (Layout)

Элементы управления в Android называются Views и наследуются от класса View или ViewGroup. Класс ViewGroup также унаследован от View, но его отличие в том, что в него могут быть вложены другие View или ViewGroup.

Плагин создал простейшую разметку для нашей единственной формы (main.xml):

main.xml

<?xml version="1 .0" encoding="utf-8"?> <LinearLayout

vr-online | октябрь 201 0


16

Кодинг xmlns:android="http://schemas.android.com/apk/res/a ndroid" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> </LinearLayout>

Вначале задаётся Layout, т.е. правило, согласно которому элементы управления следуют друг за другом. LinearLayout значит, что они идут друг за другом сверху вниз (android:orientation="vertical"). Бывают и другие Layout-ы: TableLayout, с помощью которого можно выстроить контролы в таблицу; FrameLayout, который ставит контролы один на другой; и т.д. Мы воспользуемся TableLayout. Сделаем вот такую разметку:

main.xml

/> <EditText android:id="@+id/rows_count" android:text="35" android:singleLine="true" android:numeric="integer" /> </TableRow> <TableRow android:paddingBottom="5dip"> <TextView android:text="@string/cells_title" android:paddingRight="1 0dip" android:gravity="right" android:textStyle="bold" /> <EditText android:id="@+id/cells_count" android:text="1 00" android:singleLine="true" android:numeric="integer" /> </TableRow> <TableRow> <Button android:id="@+id/run" android:text="@string/run_title" android:textStyle="bold" android:layout_span="2" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </TableRow> </TableLayout>

<?xml version="1 .0" encoding="utf-8"?> <TableLayout xmlns:android="http://schemas.android.com/apk/res/a ndroid" android:layout_width="fill_parent" android:layout_height="fill_parent" android:stretchColumns="1 " android:padding="1 0dip" > В файл res/values/strings.xml при этом нужно <TableRow android:paddingBottom="5dip"> добавить следующие строки: <TextView strings.xml android:text="@string/columns_title" android:paddingRight="1 0dip" <string name="run_title">Run!</string> android:gravity="right" <string name="columns_title">Columns:</string> android:textStyle="bold" <string name="rows_title">Rows:</string> /> <string name="cells_title">Cells:</string> <EditText Форма при этом будет выглядеть так: android:id="@+id/columns_count" android:text="25" android:singleLine="true" android:numeric="integer" /> </TableRow> <TableRow android:paddingBottom="5dip"> <TextView android:text="@string/rows_title" android:paddingRight="1 0dip" android:gravity="right" android:textStyle="bold"

vr-online | октябрь 201 0


17

Кодинг Рассмотрим некоторые атрибуты, использованные в разметке android:id Идентификатор элемента. Если он указан, то в дальнейшем его можно найти на форме с помощью метода findViewById(id). Для контролов, которых мы не планируем в дальнейшем трогать (например, для заголовков), можно это свойство и вовсе не указывать. Идентификаторы можно складывать в файл ids.xml, но вместо этого обычно применяется синтаксис @+id/View1 . Это означает, что идентификатор View1 добавляется в константы прямо на ходу. В R.java соответствующие поля также добавляются автоматически. android:layout_width и android:layout_heigth Свойства layout_width и layout_heigth обозначают, какую часть родительского контрола будет занимать данный элемент

управления: всю (fill_parent или match_parent, начиная с 2.2) или ровно столько, сколько требуется (wrap_content). Можно также задавать численные значения. android:numeric Это атрибут EditText. Значение integer значит, что в это поле можно вводить только целые положительные числа. android:gravity, android:layout_gravity Устанавливает выравнивание в данном элементе управления. Отличие в том, что gravity задает выравнивание дочерних контролов, а layout_gravity задает выравнивание самого контрола.

Заключение

Итак, мы создали проект для Android, рассмотрели его структуру, составили разметку для нашей единственной формы.

Интересные факты об Android: 1 . В 2008 году был опубликован исходный код операционной системы — он занимал объем в 2,1 гигабайт. 2. Есть интересная и противоречивая информация о том, что Google будет по своему усмотрению удалять приложения из телефонов пользователей, если те совершают какие-то противоправные действия. Эту информацию пока никто не подтвердил на 1 00 процентов и не опроверг. 3. Для операционной системы был открыт собственный онлайн-магазин Android Market, но что любопытно у пользователей разных стран там разные права. Так Россияне могут выкладывать только бесплатные приложения и не могут покупать платные, а например австралийцы могут покупать платные, но не могут брать за приложения деньги, а американцы могут и зарабатывать и тратить. Ситуация конечно меняется, но на это стоит обратить внимание, если вы хотите связать часть своей жизни с Android. 4. В отличие от iPhone Os – Android поддерживает Flash технологию — почему-то это становится чуть ли не главным аргументом в спорах любителей этих двух мобильных операционных систем. 5. Количество игр и приложений для Андроид на июль 201 0 года превышает 45 тысяч. 6. Разработчики игр уже принимают во внимание эту операционную систему — об этом говорит тот факт, что уже появились клоны GTA, заявлен выход Need for Speed для Android. 7. Если раньше считалось, что Android OS создана исключительно для смартфонов и коммуникаторов, то сейчас она переходит на другие платформы — нетбуки, планшеты, смартбуки. vr-online | октябрь 201 0


Автор: Дарья Ряжских Почта: ifndef@yandex.ru, Сайт: http://darja.info

18

Кодинг

Знакомство с Android. Часть 2: Переходы между формами

Итак, продолжим. В этой части мы добавим в проект ещё одну форму и будем открывать её по нажатию кнопки Run. Также сделаем так, чтобы параметры, которые были введены в первой форме, передавались во вторую (они там ещё пригодятся). Однако, ничего страшного мы пока с ними делать не будем, а просто напишем "Введены такие-то числа". Обработка нажатия кнопки

Напишем в StartActivity.java следующее:

StartActivity.java

package demo.android.life; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class StartActivity extends Activity implements OnClickListener { Button mButton; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mButton = (Button) findViewById(R.id.run); mButton.setOnClickListener(this); } public void onClick(View v) { Toast.makeText(this, "It works", Toast. LENGTH_SHORT).show(); } }

Здесь выделены добавленные строки. Итак, мы сделали форму слушателем события нажатия на кнопку (имплементировав OnClickListener), и подписались на это событие для кнопки mButton (с помощью setOnClickListener). Для того, чтобы проверить, что всё правильно, в методе,

который обрабатывает событие, показываем оповещение (Toast). Запускаем - работает.

Добавление активности

Для того, чтобы создать в приложении форму, необходимо создать два файла — XML-разметку формы(run.xml) и Java-класс формы (RunActivity.java). Разметку сделаем простейшую:

run.xml

<?xml version="1 .0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas. android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:id="@+id/message" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </FrameLayout>

В классе перегрузим метод onCreate, в котором свяжем форму с этой разметкой:

RunActivity.java

package demo.android.life; import android.app.Activity; import android.os.Bundle; public class RunActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.run); }

vr-online | октябрь 201 0


19

Кодинг Вызов функции startActivity(intent) запускает Кроме того, нужно упомянуть о новой форме операцию intent (т.е. открывает окно), finish() завершает текущую задачу (т.е. закрывает в AndroidManifest.xml. Для этого в раздел окно StartActivity). application добавляем следующее: }

<activity android:name="RunActivity"></activity>

Кстати, в новых версиях ADT можно добавлять активности не руками в XML, а с помощью какого-никакого графического интерфейса во вкладке Application —> Application Nodes.

Передача данных между активностями

Итак, RunActivity появляется, но там ничего нет. Рассмотрим, каким образом можно передать параметры, введенные в StartActivity, в активность RunActivity. У класса Intent, помимо основных атрибутов, Переход на другую активность есть ещё и второстепенные. В частности, есть такой атрибут extras, где в виде хеша Нам хочется, чтобы эта активность RunActivity появлялась после нажатия кнопки (Bundle) хранятся любые дополнительные Run окна StartActivity. Пишем в обработчике параметры. Им-то мы и воспользуемся. Итак, добавим в класс RunActivity.java следующие этой кнопки следующее: константы (ключи хеша):

StartActivity.java

public void onClick(View v) { Intent intent = new Intent(); intent.setClass(this, RunActivity.class);

}

startActivity(intent); finish();

Запускаем - работает. Теперь объясним, что сделали.

Intent

RunActivity.java

public static final String EXT_COLS = "cols"; public static final String EXT_ROWS = "rows"; public static final String EXT_CELLS = "cells"; Теперь модифицируем обработчик onClick в классе StartActivity.java, чтобы он выглядел так StartActivity.java public void onClick(View v) { EditText rowsEditor = (EditText)findViewById(R. id.rows_count); EditText colsEditor = (EditText)findViewById(R. id.columns_count); EditText cellsEditor = (EditText)findViewById(R. id.cells_count);

Intent - это описание некоторого действия, которое должно совершить приложение. Этим действием может быть переход к другому окну, совершение исходящего int cols = Integer.parseInt(colsEditor. вызова, открытие списка контактов и т.д.. У getText().toString()); Intent-а есть два основных атрибута: int rows = Integer.parseInt(rowsEditor. • action - функция, которую надо выполнить. getText().toString()); Задается в виде константы: ACTION_VIEW, int cells = Integer.parseInt(cellsEditor. ACTION_DIAL и т.д. getText().toString()); • data - аргумент этой функции, записанный в Intent intent = new Intent(); виде URI intent.setClass(this, RunActivity.class); Например, сочетание VIEW_ACTION content://contacts/people/1 соответствует intent.putExtra(RunActivity.EXT_COLS, cols); выводу информации о контакте с intent.putExtra(RunActivity.EXT_ROWS, rows); идентификатором 1 , а ACTION_DIAL tel:1 23 intent.putExtra(RunActivity.EXT_CELLS, cells); выводу окна вызова с набранными цифрами 1 23. startActivity(intent); finish(); Однако, нам всего этого не нужно, а нужно, чтобы обработчиком Intent-а была сама } форма RunActivity. Для этого мы используем Итак, мы передали в наш Intent функцию setClass (или есть ещё такая дополнительные параметры. Теперь мы setClassName).

vr-online | октябрь 201 0


20

Кодинг получим их в RunActivity в методе onCreate:

RunActivity.java

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.run); Bundle extras = getIntent().getExtras(); int cols = extras.getInt(EXT_COLS); int rows = extras.getInt(EXT_ROWS); int cells = extras.getInt(EXT_CELLS);

}

TextView message = (TextView)findViewById(R. id.message); message.setText("Rows: " + rows + "\nColumns: " + cols + "\nCells: " + cells);

Теперь, после нажатия на кнопку Run мы видим следующее:

Заключение

Итак, мы добавили в наше приложение ещё одну форму, создали переход на неё и передали параметры из первой формы.

vr-online | октябрь 201 0


Автор: Дарья Ряжских Почта: ifndef@yandex.ru, Сайт: http://darja.info

21

Кодинг

Знакомство с Android. Часть 3: Использование диалогов

При разработке программ, использование диалогов приходится как нельзя кстати, т.к. их использование позволяет более эффектно представить пользователю информацию, будь то ошибка, или же вывод результата. В этой части мы сделаем проверку вводимых StartActivity.java параметров по следующим правилам: private int checkInputParameters(int cols, int rows, int cells) • Число столбцов должно быть не меньше 5 и { не больше 25. if (cols < COLUMNS_MIN || cols > • Число строк должно быть не меньше 5 и не COLUMNS_MAX) больше 35. { return ALERT_COLUMNS; • Начальное количество клеток должно быть } не больше, чем ячеек на поле. if (rows < ROWS_MIN || rows > ROWS_MAX) Если какое-то из этих условий не { выполняется, будем выводить return ALERT_ROWS; соответствующее предупреждение. } if (cells > rows * cols) Кроме того, мы добавим кнопку Close, при { нажатии на которую приложение будет return ALERT_CELLS; закрываться, спрашивая вначале согласие } пользователя.

Простой диалог

Сначала добавим в класс StartActivity.java следующие константы:

StartActivity.java

// код результата проверки private static final int ALERT_NONE = 0; // параметры введены верно private static final int ALERT_COLUMNS = 1 ; // некорректное число столбцов private static final int ALERT_ROWS = 2; // некорректное число строк private static final int ALERT_CELLS = 3; // некорректное начальное число клеток // границы допустимых значений числа столбцов private static final int COLUMNS_MIN = 5; private static final int COLUMNS_MAX = 25; // границы допустимых значений числа строк private static final int ROWS_MIN = 5; private static final int ROWS_MAX = 35;

Теперь добавляем метод, осуществляющий проверку введенных параметров:

}

return ALERT_NONE;

Метод onClick теперь должен работать немного по-другому: сначала проверять введенные параметры, и, если проверка прошла (ALERT_NONE), открывать окно RunActivity, иначе же показывать предупреждение. Итак, onClick будет выглядеть так:

StartActivity.java

public void onClick(View v) { EditText rowsEditor = (EditText)findViewById(R. id.rows_count); EditText colsEditor = (EditText)findViewById(R. id.columns_count); EditText cellsEditor = (EditText)findViewById(R. id.cells_count); int cols = Integer.parseInt(colsEditor. getText().toString()); int rows = Integer.parseInt(rowsEditor. getText().toString());

vr-online | октябрь 201 0


22

Кодинг int cells = Integer.parseInt(cellsEditor. getText().toString()); int alertCode = checkInputParameters(cols, rows, cells); if (alertCode != ALERT_NONE) { showDialog(alertCode); return; } Intent intent = new Intent(); intent.setClass(this, RunActivity.class); intent.putExtra(RunActivity.EXT_COLS, cols); intent.putExtra(RunActivity.EXT_ROWS, rows); intent.putExtra(RunActivity.EXT_CELLS, cells);

}

startActivity(intent); finish();

Метод showDialog(id) класса Activity пытается открыть диалог. При этом вызывается метод onCreateDialog, возвращающий объект класса Dialog. Так что нужно перекрыть метод onCreateDialog и сконструировать тот диалог, который нам нужен. Ну, у нас тут всё просто, диалоги будут отличаться только выводимым сообщением, так что можно сделать следующее:

@Override

protected Dialog onCreateDialog(int id) { DialogInterface.OnClickListener doNothing = new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { } }; int alertMessage; switch (id) { case ALERT_COLUMNS: alertMessage = R.string.alert_columns; break; case ALERT_ROWS: alertMessage = R.string.alert_rows; break; case ALERT_CELLS: alertMessage = R.string.alert_cells; break; default: return null;

}

}

return new AlertDialog.Builder(this) .setMessage(alertMessage) .setNeutralButton(R.string.ok, doNothing) .create();

В strings.xml при этом нужно добавить следующие значения:

strings.xml

<string name="alert_columns">Incorrect columns number: should be from 5 to 25</string> <string name="alert_rows">Incorrect rows number: should be from 5 to 35</string> <string name="alert_cells">Number of cells is greater then the size of grid</string> <string name="ok">OK</string>

Итак, в методе onCreateDialog мы решили, какое сообщение (alertMessage) будем выводить, создали диалог с помощью AlertDialog.Builder, вывели туда сообщение, поставили единственную кнопку OK и привязали к ней обработчик doNothing, который ничего не делает (нам, в принципе, делать ничего и не надо). Аналогичным образом можно добавить иконку формы, добавить ещё кнопок и т.д. Подробнее про то, как строятся диалоги, можно посмотреть в адроидовских сэмплах там на самом деле все достаточно понятно и просто. Теперь при вводе некорректных данных мы видим вот это:

Диалог для закрытия приложения

Добавим на форму RunActivity кнопку Close. Для этого напишем такую разметку в run.xml:

run.xml

<?xml version="1 .0" encoding="utf-8"?>

vr-online | октябрь 201 0


23

Кодинг <LinearLayout xmlns:android="http://schemas.android. com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:id="@+id/message" android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingBottom="1 0dip" /> <Button android:id="@+id/close" android:text="@string/close" android:textStyle="bold" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>

id.message); message.setText("Rows: " + rows + "\nColumns: " + cols + "\nCells: " + cells);

В strings.xml добавим следующие значения:

strings.xml

<string name="yes">Yes</string> <string name="no">No</string> <string name="close">Close</string> <string name="submit_close">Are you sure you want to close this wonderful application?</string>

Теперь вносим изменения в класс RunActivity:

RunActivity.java

public class RunActivity extends Activity implements OnClickListener { public static final String EXT_COLS = "cols"; public static final String EXT_ROWS = "rows"; public static final String EXT_CELLS = "cells"; Button mCloseButton; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.run); mCloseButton = (Button) findViewById(R. id.close); mCloseButton.setOnClickListener(this); Bundle extras = getIntent().getExtras(); int cols = extras.getInt(EXT_COLS); int rows = extras.getInt(EXT_ROWS); int cells = extras.getInt(EXT_CELLS); TextView message = (TextView)findViewById(R.

}

} public void onClick(View view) { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder .setMessage(R.string.submit_close) // кнопка "Yes", при нажатии на которую // приложение закроется .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { finish(); } }) // кнопка "No", при нажатии на которую // ничего не произойдет .setNegativeButton(R.string.no, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { } }) .show(); }

Объяснять тут особо нечего, и так все понятно. Теперь, при нажатии на кнопку Close, мы видим следующее:

При нажатии на Yes приложение закроется, на No — продолжит работу. vr-online | октябрь 201 0


Автор: angryvitum Jabber: angryvitum@jabber.org

24

Delphi.

Кодинг

Virtual TreeView и EasyListView: примеры использования

Многие из Вас, уважаемые коллеги, наверняка используют при разработке своих программ компонент Virtual TreeView - очень удобный и быстрый компонент для представления иерархических (и не только) данных. К сожалению, компонент EasyListView, не получил столь же широкого распространения, и совершенно напрасно! Наш небольшой коллектив разработчиков очень часто использует указанные компоненты. За время работы с ними накопились небольшие примеры их использования, не отраженные ни в какой документации. Некоторыми примерами я бы и хотел с вами поделиться.

CheckBox в заголовке колонки в Virtual TreeView

Благодаря Сергею Титову aka Quadr0 русскоязычные программисты получили очень подробную документацию по Virtual TreeView. Однакобелые пятна все-таки остались. Итак, предыстория вопроса. В программе пользователю выводится иерархический список, каждый узел которого содержит CheckBox. Изменение состояния checkbox'а в узле верхнего уровня приводит к изменению состояния checkbox'ов в дочерних узлах. Однако как отметить сразу несколько корневых узлов? Ввести общий корневой узел для всего списка? Не очень удобно для пользователя и в контексте программы откровенно "не смотрится". Заставлять пользователя отмечать самому узлы? А если необходимо пометить все записи в списке, а таких более сотни? Тоже не вариант. Поэтому было принято решение создать checkbox в первой колонке списка, изменение состояния которого приведет к изменению состояния checkbox'ов всех узлах, включая корневые. Класс TVirtualTreeColumn содержит свойства CheckBox и CheckState, однако все попытки заставить их работать не увенчались успехом. Поиски решения проблемы в

Интернете успехов не дали... Для решения поставленной задачи возьмем отрисовку заголовков колонок на себя. Для этого у экземпляра Virtual TreeView определим обработчики событий OnHeaderDrawQueryElements (чтобы указать, что отрисовывать мы будем сами, а что компонент) и OnAdvancedHeaderDraw (собственно отрисовка). Мой код решения приведен ниже. procedure TVTForm.VTHeaderDrawQueryElements(Sender: TVTHeader; var PaintInfo: THeaderPaintInfo; var Elements: THeaderPaintElements); begin Elements := [];

if Assigned(PaintInfo.Column) then begin // указываем, что если будет отрисовываться заголовок первой колонки, то // вывод текста в заголовке мы берем на себя if PaintInfo.Column.Index = 0 then Elements := [hpeText]; end; end; ... procedure TVTForm.VTAdvancedHeaderDraw(Sender: TVTHeader; var PaintInfo: THeaderPaintInfo; const Elements: THeaderPaintElements); var CBRect, TextRect: TRect; Details: TThemedElementDetails; Text: string; begin // если нам не доверили вывод текста в

vr-online | октябрь 201 0


25

Кодинг //заголовке, то прекращаем выполнение метода if not (hpeText in Elements) then Exit; with PaintInfo do begin // вычисляем область, где будет размещен checkbox (слева от текста заголовка) CBRect := TextRectangle; CBRect.Right := CBRect.Left + 1 6; // указываем, что мы планируем //разместить изображение именно checkbox'а Details.Element := teButton; Details.Part := BP_CHECKBOX; Details.State := GetCheckBoxState; SetBkMode(TargetCanvas.Handle, TRANSPARENT); // рисуем checkbox ThemeServices.DrawElement(TargetCanvas. Handle, Details, CBRect); // сдвигаем текст вправо, //освобождая место для checkbox'а TextRect := TextRectangle; OffsetRect(TextRect, 20, 0); Text := Column.CaptionText; // выводим текст if Text <> EmptyStr then DrawText(TargetCanvas.Handle, PChar(Text), Length(Text), TextRect, DT_LEFT or DT_VCENTER or DT_SINGLELINE); end; end;

Здесь необходимо пояснить, для чего нужна функция GetCheckBoxState. Мы же хотим, чтобы состояние checkbox'а в заголовке отражало действительное состояния узлов дерева, а не было вещью в себе. Поэтому мы определяем, каково будет состояние checkbox'а на момент отрисовки заголовка колонки:

function GetCheckBoxState: Integer; begin Result := 0; // если в списке нет ни одного помеченного узла if VT.CheckedCount = 0 then begin Result := 1 ; // Checked = False

// если курсор мыши находится //над заголовком, то слегка оттеняем checkbox if PaintInfo.IsHoverIndex then Result := 2 else begin // если пользователь нажал заголовок //колонки, то выводим checkbox так, // как если бы нажали именно на него if PaintInfo.IsDownIndex then Result := 3 else begin // если заголовок колонки заблокирован (Enabled = True) if not PaintInfo.IsEnabled then Result := 4; // то и блокируем checkbox end; end; end else begin // аналогично для случая, когда выбраны все узлы списка if VT.CheckedCount = VT.TotalCount then begin Result := 5; // Checked = True if PaintInfo.IsHoverIndex then Result := 6 else begin if PaintInfo.IsDownIndex then Result := 7 else begin if not PaintInfo.IsEnabled then Result := 8; end; end; end else begin // или отмечена только часть узлов Result := 9; if PaintInfo.IsHoverIndex then Result := 1 0 else begin if PaintInfo.IsDownIndex then Result := 11 else

vr-online | октябрь 201 0


26

Кодинг begin if not PaintInfo.IsEnabled then Result := 1 2; end; end; end; end; end;

Все, теперь мы в свойстве VT.Header.Options добавим опцию hoOwnerDraw, подключим модули Themes и UxTheme, а затем скомпилируем программу. В результате мы получим в заголовке первой колонки checkbox, не отличающийся от стандартного. Для того чтобы этот checkbox показывал текущее состояние отметок в узлах списка, добавим в обработчик события OnChecked строку: VT.Header.Invalidate(VT.Header.Columns[0]);

Но нам, же еще нужно обработать клик мышки по checkbox'у! Создадим обработчик события OnHeaderClick: procedure TVTForm.VTHeaderClick(Sender: TVTHeader; HitInfo: TVTHeaderHitInfo); var

pt: TPoint; cbRect: TRect; begin // если клик мыши был не на первом столбце, то завершаем работу метода if HitInfo.Column <> 0 then Exit; pt.X := HitInfo.X; pt.Y := HitInfo.Y; // получаем координаты области, //занятой checkbox'ом // здесь координаты фиксированы, //если Вы разрешаете пользователям менять // местами колонки, то код придется усложнить cbRect := Rect(8, 6, 24, 23); // если кликнули по checkbox'у if PtInRect(cbRect, pt) then DoCheckAll; // меняем состояние отметок в узлах списка end;

На этом все

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

Рисунок 1 . Результат работы программы

vr-online | октябрь 201 0


Автор: Овчинников Михаил aka Night_Storm Сайт: http://imsogeek.tumblr.com/

27

Adobe AIR

Кодинг

"Hello World"

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

воспользоваться Dreamwaver, Flex\Flash, бесплатной Aptana Studio и т.д. Нужно только Первым делом тебе нужно скачать с сайта Adobe сам Air и SDK. Air имеет установщик, а установить соответствующее расширение. SDK ты можешь распаковать в любую папку. Легкие пути само собой не для нас. Мы В последнем больше всего интересует папка будем пользоваться командной строкой и блокнотом. Для удобства, чтобы не писать /bin, в которой находятся компилятор полный путь к дебаггеру добавь папку /bin в (adt.bat) и дебаггер (adl.exe). раздел Path переменных окружения. Как это Для создания приложения можно делается, смотри на скриншотах ниже. Прорываемся к свойствам компьютера

Нас интересуют дополнительные параметры

Создаем переменную окружения

vr-online | октябрь 201 0


28

Кодинг Hello World!

Если не лезть в дебри, то air-приложение – это html+javascript+xml скомпилированные в единый файл, и запускаемые отдельным приложением. Именно поэтому airплатформа получила довольно широкую популярность среди разработчиков различных web-сервисов. Итак, попробуем сделать свое первое AIRприложение. Создай отдельную папку для нового проекта. Затем создай *.xml файл helloworld-app.xml . В нем мы опишем основные свойства приложения. Перед тем как двигаться дальше, рассмотрим структуру этого файла. Само приложение у нас строится между тегами <application></application>. Здесь же указывается пространство имен, используемое AIR в зависимости от версии. Я использую версию Air 1 .5, и у меня он выглядит следующим образом: xmlns=”http://ns.adobe.com/air/application/1 .5”

Далее между тегами <id></id> ты должен указать уникальный идентификатор приложения. По большому счету можешь написать что угодно. Затем, между тегами <version></version> укажем версию, пусть будет 0.1 . Следующий параметр <filename></filename> довольно важен в том плане, что он будет: определять имя твоего приложения в системе, использоваться для папки установки и так далее. Это были начальные приготовления, теперь перейдем к самому важному – построению оконного интерфейса. Он строится между тегами <initialWindow> </initialWindow>. Здесь будут приведены основные свойства, остальные мы рассмотрим в следующих статьях. Между тегами <content> </content> мы должны написать имя *.html файла, который будет загружаться в контейнер нашего приложения. Пишем: <content>helloworld.html</content>

Тег <visible></visible> определяет, будет ли видимо окно при запуске приложения. Нетрудно понять, что здесь надо написать <visible>true</visible>. Теперь осталось определить высоту и

ширину окна. Это делается соответствующими тегами: <width>400</width> <height>200</height>

Таким образом, файл helloworld-app.xml примет следующий вид:

<application xmlns=“http://ns.adobe.com/air/application/1 .5”> <id>examples.html.HelloWorld</id> <version>0.1 </version> <filename>HelloWorld</filename> <initialWindow> <content>Helloworld.html</content> <visible>true</visible> <width>400</width> <height>200</height> </initialWindow> </application>

Мы описали свойства нашего приложения. Теперь нужно сделать html-файл, который будет задавать внешний вид, и именно с ним придется работать пользователю. Создадим файл helloworld.html (именно его мы указали с помощью тега <content>). В сущности, здесь мы можем писать любой html-код, применять css, javascript, а также специальные функции air, которые становятся доступными после подключения java-фреймворка AIRAliases.js .В нашем примере мы применим функцию Trace, которая выведет «Hello World» в консоли. Теперь приведу полный код файла helloworld.html. Тут особенно объяснять нечего – стандартные html тэги и javascript. <html> <head> <title>Hello World</title> <script src=“AIRAliases.js” type=“text/javascript”></script> <script type=“text/javascript”> function appLoad(){ air.trace(“Hello World”); } </script> </head> <body onLoad=“appLoad()”> <h1 >Hello World</h1 > </body> </html>

Теперь попробуем запустить наше приложение. Для этого открой командную строку, перейди в папку с твоим vr-online | октябрь 201 0


29

Кодинг

приложением и напиши: adl helloworld-app.xml

Результат работы моего приложения доступен на рисунке 4.

Goodbye, world!

Вот мы и познакомились с написанием приложений при помощи Adobe Air. Не

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

Рис. 4: Результат всех телодвижений

vr-online | октябрь 201 0


Автор: Toly Сайт: http://toly-blog.ru

30

Python

Кодинг

Дружим python и MySQL

Поводом к написанию этой статьи послужила необходимость гибкой работы с довольно большим набором однотипных данных. Данные представлены в виде CSV-файла, и работать с ним ввиду его размера (50 Мб) и формата (поиск одной единственной нужной записи может занять 1 -3 секунды) не очень удобно. Поэтому было принято решение импортировать его в базу данных - MySQL. Для работы с MySQL необходимо установить драйвер для работы с этой базой данных для питона: скачиваем модуль MySQLdb (http://sourceforge.net/projects/mysql-python), распаковываем и устанавливаем. Так как я использую Ubuntu (которую и вам советую), то установка будет выполняется однойединственной командой: $ sudo apt-get install python-mysqldb

Любители Windows (или те кто устанавливает из исходников) могут выбрать файл для установки по адресу: http://sourceforge.net/projects/mysql-python/files/

Настало время объяснить принципы работы с базой данных на питоне: подключаемся к базе данных, создаем курсор (объект для работы с базой данных), выполняем требуемые запросы, променяем изменения базы данных, закрываем соединение с БД. Перейдем к практике. Есть csv-файл, каждая строка которого имеет вид «name;email;adres;telefon» (например «Сергей Иванович; admin@yandex.ru; Москва, ул. Заречная 5, кв. 1 09”; 33-76-1 52). Есть mysql база данных bd с таблицей contacts. Приведенный ниже скрипт закинет содержимое файла в базу данных. # -*- coding: utf-8 #!/usr/bin/python import MySQLdb import string

# распаковка строки, в которой поля записаны с разделителем ";" def unpack_line(line): line = string.replace(line, "'", "")

els = string.split(line, ";") # выделяем имя, емейл, адрес и телефон fname = els[0] fmail = els[1 ] fadres = els[2] ftel = els[3] return fname, fmail, fadres, ftel # подключаемся к базе данных (не забываем указать кодировку, а то в базу запишутся иероглифы) db = MySQLdb.connect(host="localhost", user="root", passwd="пароль", db="contacts", charset='utf8') # формируем курсор, с помощью которого можно исполнять SQL-запросы cursor = db.cursor() # открываем исходный csv-файл f = open("log", "r") # представляем его в виде массива строк lines = f.readlines() for line in lines: # если в строе присутствует емейл # (определяем по наличию "@") if string.find(line, "@") > -1 : # извлекаем данные из строки fname, fmail, fadres, ftel = unpack_line(line) # подставляем эти данные в SQL-запрос sql = """INSERT INTO contacts(name, mail, adres, tel) VALUES ('%(name)s', '%(mail)s', '%(adres)s', '%(tel)s') """%{"name":fname, "mail":fmail, "adres":fadres, "tel":ftel} # исполняем SQL-запрос cursor.execute(sql) # применяем изменения к базе данных

vr-online | октябрь 201 0


31

Кодинг db.commit() # закрываем соединение с базой данных db.close() # закрываем файл f.close()

Точно таким же образом можно удалять и обновлять данные в базе: изменяется только SQL-запрос. Немного иначе обстоит дело с выборкой данных, а точнее с обработкой, выбранной из базы, информации. После выполнения запроса на выборку данных с помощью функции курсора fetchall() можно получить результат запроса. Он представляется в виде массива записей, каждая из которых является массивом содержимого полей. Для того чтобы не запутаться с полями в SQL-запросе, необходимо указывать выбираемые поля, и в том же порядке извлекать их из каждой записи. Разберем выполнение и обработку SELECTзапросов на примере: извлечем первых 1 0 пользователей из только что заполненной базы, у которых email расположен на Яндексе.

# закрываем соединение с БД db.close()

Еще раз напомню, что извлекать данные из записи нужно в том же порядке (и количестве), в каком они записаны в SQLзапросе. Вот, пожалуй, и все. До встречи!

# -*- coding: utf-8 #!/usr/bin/python import MySQLdb import string

# соединяемся с базой данных db = MySQLdb.connect(host="localhost", user="root", passwd="пароль", db="contacts", charset='utf8') # формируем курсор cursor = db.cursor() # запрос к БД sql = """SELECT mail, name FROM eadres WHERE mail LIKE '%yandex.ru' LIMIT 1 0""" # выполняем запрос cursor.execute(sql) # получаем результат выполнения запроса data = cursor.fetchall() # перебираем записи for rec in data: # извлекаем данные из записей - в том же порядке, как и в SQL-запросе mail, name = rec # выводим информацию print name, mail

vr-online | октябрь 201 0


Автор: Евгений Шапиро Почта: zheka@xakep.ru

32

Кодинг

C#

Учимся работать с MySQL

В этой статье мы рассмотрим взаимодействие с популярной СУБД «MySQL» из приложения на C#. К сожалению, в самом C# нет компонентов или классов для работы с MySQL, поэтому нам придется обратиться к общедоступному классу MySqlLib. Что мы будем делать

В статье я не буду грузить теорией, а рассмотрю типичные операции (выборка, добавление, удаление, обновление), возникающие при работе с БД. Все эти операции я буду рассматривать на примере конкретного приложения. Как правило, для знакомства с БД пишут свой телефонный справочник (прим. редактора – да, все мы с этого начинаем). Мы не будем отступать от этой вековой традиции и тоже напишем свой простенький справочник. Итак, приступим.

Схема БД

Для начала нам надо создать саму БД, с которой потом будем работать из своего приложения. Чтобы сильно не заморачиваться, я предлагаю создать в БД всего одну таблицу. Назовем ее TablePhoneBook и подгоним ее под следующую структуру:

Использование класса MySqlLib

Для использования класса MySQLLib нам понадобиться два файла: MySql.Data.dll и MySqlData.cs. Саму библиотеку закинем в папку, в которой будет храниться исполняемый файл нашей программы (у меня это «D:\VSProjects\MySQLTelBook\MySQLTelBook\ bin\Debug»). Файл с программным кодом в папку, где лежат остальные исходники («D:\VSProjects\MySQLTelBook\MySQLTelBoo k»). Следующим шагом добавим библиотеку в наш проект. Делается это через «Project» -> «AddReference». Выполнив эту операцию, ты увидишь окно как на рисунке 1 . Рисунок 1 . Подключаем библиотеку

CREATE TABLE `TablePhoneBook` ( `idTablePhoneBook` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,//первичный ключ `FM` VARCHAR(45),//фамилия `IM` VARCHAR(45),//имя `OT` VARCHAR(45),//отчество `Phone` VARCHAR(45),//№ телефона PRIMARY KEY(`idTablePhoneBook`) ).

Этой таблицы нам вполне достаточно для небольшого телефонного справочника. В будущем можно будет усовершенствовать проект. Например, если у абонентов несколько номеров, то можно выделить ФИО абонента в отдельную таблицу, а в эту писать его идентификатор и номер телефона.

В этом диалоге тебе нужно зайти в папку bin/Debug и выбрать MySql.Data.dll. Отлично, библиотеку подключили и теперь надо добавить к проекту файл MySqlData.cs. Для этого идем в меню Project->Add Existing Item и находим нужный файл в папке проекта. Последним подготовительным шагом будет vr-online | октябрь 201 0


33

Кодинг подключение пространства имен «using MySql.Data». Вуаля! Теперь мы можем использовать в своем проекте данный класс. Все методы класса являются статическими, поэтому к ним обращаться, не создавая переменную класса.

Создаем интерфейс

Работать мы будем с обычным WinFormsприложением. Создай соответствующий проект и приготовься сотворить простенький интерфейс. Наше приложение будет состоять из 2-х окон. Первое окно - это главная форма программы, назовем ее MainForm. Я не сильно заморачивался с его оформлением и сделал максимально простой интерфейс (см. рисунок 2).

Рисунок 3. Дизайн форма AddChangeForm

TextBox’ы используются для ввода информации, а кнопки - для сохранения или отмены изменений. Теперь добавим свойство формы iIdRecord. public partial class AddChangeForm : Form { public Int32 iIdRecord{get;set;} public AddChangeForm() { InitializeComponent(); } }

Оно будет хранить значение id-записи, которую мы редактируем или 0, если мы добавляем новые данные. Следующим шагом установим свойства DialogResult для обеих кнопок. У кнопки buttonOk (с текстом “OK”) сделать “OK”, а у buttonCancel соответственно Cancel. Это нам потребуется, когда мы будем обрабатывать результат вызова формы AddChangeForm. Рисунок 2. Главная форма будущего приложения

Вверху расположена группа TextBox’ов для ввода различных условий (фамилия, имя, отчество) выборки из базы. Сразу под ней расположена таблица (компонент DataGridView), в которую будет выводиться наш справочник, с учетом указанных пользователем фильтров. Далее у меня расположены три кнопки: добавить, удалить, изменить. Для чего они нужны, ты наверное уже понял. Вторую форму назовем AddChangeForm. Она будет использоваться при добавлении/редактировании записи в телефонной книге. Мой вариант формы представлен на рисунке 3.

Кодим

Медленно, но верно мы и добрались до кодинга. Первым делом напишем функцию выбора данных из БД. Ее код представлен в листинге 1 . Листинг 1 . Выборка из БД

private void SelectDataFromDB() { ///переменная,в которой содержится ///SQL-запрос на выборку String sSQL = GetSQLString(); ///строка подключения к БД ///Database-название БД MySQL ///Data Source-IP-адрес или имя компа, ///на котором крутится MySQL ///User ID-имя пользователя для подключения ///Password-он и в Африке password String sConnectionString="Database=base;

vr-online | октябрь 201 0


34

Кодинг Data Source=localhost;User Id=root; Password=pass"; ///в этой переменной будет содержаться ///рез-тат запроса MySqlLib.MySqlData.MySqlExecuteData. MyResultData result = new MySqlLib.MySqlData.MySqlExecuteData. MyResultData(); ///выполняем запрос, ///который возвращает результат result = MySqlLib.MySqlData. MySqlExecuteData.SqlReturnDataset(sSQL, sConnectionString); ///если ошибок нет if (result.HasError == false) { ///очищаем таблицу для вывода результата dataGridViewTable.Columns.Clear(); ///заполняем таблицу на основе ///данных запроса dataGridViewTable.DataSource = result.ResultData.DefaultView; } ///если есть ошибка else { ///показываем ее в MessageBox'е MessageBox.Show(result.ErrorText); } }

Я постарался снабдить код подробными комментариями, так что, думаю, тут все понятно. Единственное, нам надо описать функцию GetSQLString(). Ее код я привел в листинге 2.

///если поле textBoxOt не пустое,то делаем выборку по полю OT if (textBoxOt.Text != "") sSQL += " AND OT LIKE '%" + textBoxOt.Text + "%'"; ///если поле textBoxTel не пустое,то делаем выборку по полю Phone if (textBoxTel.Text != "") sSQL += " AND Phone LIKE '%" + textBoxTel.Text + "%'"; ///делаем сотритровку по Фамилии sSQL+=" ORDER BY FM"; return sSQL; }

Теперь нам надо определиться на какие действия пользователя будем вызывать функцию SelectDataFromDB(). Я предлагаю делать это, когда пользователь только активирует форму (событие Activated), а так же вводит данные в текстовые поля в верхней части формы. Для этого кликаем по форме в месте, где нет других компонентов, и попадаем в окно кода.

Рисунок 4. Описываем событие Load главной формы

Здесь и пропишем вызов нашей функции SelectDataFromDB(). Вернемся в дизайнер формы. Щелкаем мышкой по TextBox с фамилией и в свойствах компонента выбираем события.

Листинг 2. Функция GetSQLString()

private string GetSQLString() { ///начинаем формировать запрос ///сначала подготавливаем общую информацию о выборке ///поля и таблицу для выборки string sSQL = "SELECT idTablePhoneBook, FM,IM,OT,Phone FROM TablePhoneBook WHERE FM<>'' "; ///если поле textBoxFamily не пустое,то делаем выборку по полю FM if (textBoxFamily.Text != "") sSQL += " AND FM LIKE '%" + textBoxFamily.Text+ "%'"; ///если поле textBoxName не пустое,то делаем выборку по полю IM if (textBoxName.Text != "") sSQL += " AND IM LIKE '%" + textBoxName.Text + "%'";

Рисунок 5. Выбираем события

vr-online | октябрь 201 0


35

Кодинг напишем немного кода. Только теперь из Нас интересует Text_Changed, поэтому листинга 4. выбираем именно его. Установи на него выделении и увидишь выпадающий список, в Листинг 4. Соединение с БД и выполнение запроса котором нужно выбрать MainForm_Load. private void buttonOK_Click(object sender, Теперь при вызове события TextChanged EventArgs e) будет выполняться функция MainForm_Load, { а в ней вызываться SelectDataFromDB(). string sSQL=""; Тоже самое сделаем для всех оставшихся ///формируем строку подключения к MySQL TextBox’ов. Нам необходимо чтобы при String sConnectionString="Database=test; изменении содержания каждого TextBox’а Data Source=localhost; происходило обновление данных.

Добавление данных

Теперь рассмотрим процедуру добавления данных в БД. Для того чтобы добавить данные, пользователю требуется нажать кнопку “Добавить”. В ответ на это действие будет вызвана форма AddChangeForm с пустыми TextBox’ами. После того, как пользователь заполнит все поля и нажмет кнопку “ОК” нам потребуется составить SQLзапрос на вставку данных в БД и выполнить его. После этого закроем форму AddChangeForm и обновим содержимое главной формы. Алгоритм понятен, приступаем к реализации. Кликаем два раза на кнопку buttonAdd и в обработчике события пишем код из листинга 3. Листинг 3. Добавление данных

private void buttonAdd_Click(object sender, EventArgs e) { ///создаем объект формы добавления записи AddChangeForm addForm = new AddChangeForm(); ///т.к. мы СОЗДАЕМ,то св-во iIdRecord нулевое addForm.iIdRecord = 0; ///показываем форму в режиме диалога if (addForm.ShowDialog() == DialogResult.OK) ///если нажали ОК (именно для этого мы ///и заполняли св-ва кнопок DialogResult), ///значит обновляем содержимое таблицы SelectDataFromDB(); }

В нем мы создали экземпляр формы AddChangeForm и вызвали ее в модальном режиме. Теперь приступаем к работе с формой добавления записи. Дважды щелкаем по кнопке buttonOK и опять

}

User Id=root;Password=1 "; ///если поле iIdRecord равно 0, ///значит добавляем запись if (iIdRecord==0) ///формируем запрос на добавление sSQL = GetInsertSQL(); else ///иначе редактируем ///и формируем запрос на редактирование sSQL = GetUpdateSQL(); ///выполняем SQL-запрос MySqlLib.MySqlData.MySqlExecute. SqlNoneQuery(sSQL, sConnectionString);

В этом листинге используется функция GetInsertSQL(). Она на основе введенных данных возвращает нам SQL-запрос для вставки данных. Ее код ищи в пятом листинге. Листинг 5. Функция вставки данных в SQL private string GetInsertSQL() { string sSQL = "INSERT INTO TablePhoneBook (FM,IM,OT, Phone) VALUES ("; sSQL += "'"+textBoxFamily.Text+"',"; sSQL += "'" + textBoxName.Text + "',"; sSQL += "'" + textBoxOt.Text + "',"; sSQL += "'" + textBoxTel.Text + "')"; return sSQL; }

После нажатия кнопки buttonOK происходит закрытие формы AddChangeForm и вызов функции MainForm главной формы, что приводит к обновлению содержания таблицы.

Редактирование данных

Процесс редактирования очень похож на добавление данных. Разница в том, что при вызове формы AddChangeForm ее поля vr-online | октябрь 201 0


36

Кодинг заполняются значениями редактируемой записи. И запрос выполняется не на добавление, а на обновление. Попробуем реализовать процесс на практике. Дважды щелкаем на кнопке “Редактировать” и набиваем код из листинга 6. Листинг 6. Редактирование записей

///если выделена не пустая ячейка if (dataGridViewTable.CurrentCell != null && dataGridViewTable.CurrentCell. ColumnIndex == 0) { ///создаем объект формы добавления записи AddChangeForm addForm = new AddChangeForm(); ///т.к. мы ОБНОВЛЯЕМ, ///то заполняем св-во iIdRecord addForm.iIdRecord = Convert. ToInt32(dataGridViewTable. CurrentCell.Value); ///показываем форму в режиме диалога if (addForm.ShowDialog() == DialogResult.OK) ///если нажали ОК (именно для этого мы ///и заполняли св-ва кнопок DialogResult), ///значит обновляем содержимое таблицы SelectDataFromDB(); }

В результате выполнения кода из листинга №6 перед нами откроется форма AddChangeForm с заполненными полями. Сохранение изменений будет происходить по кнопке buttonOK. Когда я описывал код для добавления записи, я уже рассмотрел вариант обновления записи, в этих строках else ///иначе редактируем ///и формируем запрос на редактирование sSQL = GetUpdateSQL();

{

///если выделена не пустая ячейка if (dataGridViewTable.CurrentCell != null && dataGridViewTable.CurrentCell. ColumnIndex==0) { if (MessageBox.Show("Вы уверены, что хотите удалить запись под № " + dataGridViewTable.CurrentCell.Value. ToString(), "Удаление", MessageBoxButtons. YesNo, MessageBoxIcon.Question) == DialogResult.OK) { ///формируем строку подключения к MySQL String sConnectionString = "Database=test; Data Source=localhost;User Id=root; Password=1 "; ///выполняем SQL-запрос MySqlLib.MySqlData.MySqlExecute. SqlNoneQuery("DELETE FROM TablePhoneBook WHERE idTablePhoneBook=" + dataGridViewTable. CurrentCell.Value.ToString(), sConnectionString); SelectDataFromDB(); } } }

Заключение

Ну, вот вроде бы и все. Мы рассмотрели простой класс для работы с MySQL из C#, а также набросали простенький примерчик в виде телефонной книжки. Надеюсь, было не очень скучно, и материал тебе оказался полезным. Если есть вопросы – пиши мне на email. Буду рад помочь. Удачи!

Удаление данных

Удаление данных происходит очень просто. Нам требуется сформировать запрос на удаление и выполнить его. После этого, остается лишь обновить содержимое таблицы, вызвав функцию SelectDataFromDB(). Простейший до безобразия код смотри в седьмом листинге. Листинг 7. Удаление данных

private void buttonDel_Click(object sender, EventArgs e)

vr-online | октябрь 201 0


Автор: Михаил Фленов aka Horrific Сайт: http://flenov.info

37

Кодинг

MSN клиент на C# Хакерский подход к созданию клиента мгновенными сообщениями

В России самым популярным клиентом мгновенных сообщений является ICQ. Но это только в России, а в северной Америке все сидят в MSN. Даже те, кто сидит на маках (я говорю о компьютерах, а не траве) используют MSN совместимые клиенты. Хотя те, кто сидит на траве, тоже используют MSN. И даже полярники Антарктики в черных смокингах клюют Microsoft, сидя в на его же протоколе. К чему я это? Если тебе нужен спам бизнес в США, и ты хочешь загружать народ мгновенными сообщениями, то уметь работать с этим протоколом просто необходимо. Я в последнее время просто болею .NET, поэтому простите поклонники натив кодинга любого языка, я буду рассматривать именно .NET вариант. Как давно я не писал в журнал. Я так excited (если я скажу "возбужденный", то не которые не правильно меня могут понять, поэтому воспользуюсь английским словом), что аж не знаю, как воспримет эту статью нынешний читатель. Когда я впервые решил разобраться с работой протокола Microsoft Messenger, то оказалось, что в интернете не так уж и много информации по этой теме. При этом сама Microsoft по ходу пьесы притворилась Буратиной, или тем, из чего сделано это существо. В общем притворились поленом. Я даже домогался к сотрудникам компании. Искал в интернете блоги программистов, работающих в корпорации, и слал их, т.е. слал им сообщение, с просьбой поделиться знаниями. Бесполезно. На некоторое время я забыл про попытки узнать про протокол, но через пол годика наткнулся на библиотеку MSNPSharp. Долгое время эта библиотека лежала у меня на диске мертвым грузом, но

вот недавно мне на работе пришлось писать модуль, который должен был рассылать сообщения на MSN клиенты. Я тут же вспомнил про MSNPSharp, скачал последнюю версию и разобрался в два счета. Меня так заразила идея рассылки, что я добавил эту же фишку в свои программы сетевого мониторинга (www.cydsoft.com). Это только один небольшой пример использования библиотеки. Хочешь более ][ совместимый пример? Как на счет спаминга? Я вообще ненавижу все эти клиенты, но у жены и у старшей дочки на компьютере стоят mail.ru агенты. Не знаю, может это так криво агент написан, но им постоянно ломятся какие-то уроды в друзья с идиотскими именами. Я пока не проверял, но подозреваю, что все это спам и если принять одно из приглашений, то завалят всякой ерундой по самые не балуйся.

Спамер сообщений

А вот еще пример – можно написать червя, который будет плодиться по MSN. А что, по почте всякая ерунда размножается, почему бы не использовать для этого цветастую мошку от Microsoft? Эффект может оказаться достаточно взрывным, потому что до сих пор ни кто особо не пытался этого делать и первая попытка может поймать всех пользователей на наивности и червь может взорвать интернет. * Смысл работы червя банален – пытаемся разослать приглашения vr-online | октябрь 201 0


38

Кодинг на общения; * Если кто-то отзывается, то заманиваем пользователя принять и запустить файл. В свое таким же образом распространялись вирусы по почте, и вполне успешно; * Если кто-то повелся и запустил файл, то этот файл рассылает себя дальше. Еще один сценарий – написать программу, которая будет подбирать пароли к аккаунтам из списка по словарю. Если аккаунт взломан (а чем больше аккаунтов, тем проще найти ламера с примитивным паролем), то можно прочитать содержимое контактов и разослать файл от имени ламера. Такая рассылка пойдет на много быстрее, потому что MSN-у пока доверяют. Как говорят американцы: "The sky is the limit". В данном случае дополнительным ограничителем является еще и воображался. Если она хорошо работает, то можно придумать реальное зло.

Асинхронная модель

Все в библиотеке крутиться вокруг класса Messenger, который банально создается без параметров: Messenger messenger = new Messenger();

* - Nameserver.SignedOff – удачно вышли, прямо как вини-пух, у которого все прекрасно входит, и выходит; * - Nameserver.AuthenticationError – обломись хакерюга, авторизация не прошла; * - ConversationCreated – начато общение с удаленным клиентом; На каждое из этих событий установи обработчик и можно начинать соединение с сервером. Аааан нет. Нужно же указать свои данные, с которыми мы подключаемся к серверу. У класса месенджера есть свойство Credentials, которое имеет одноименный тип. Я исходные коды не смотрел, но пока не затянулся, нафига для хранения почтового ящика и пароля создавали целый класс. Разве что только в нем скрыты методы авторизации. У конструктора класса Credentials два параметра – почтовый ящик и пароль в чистом и красивом виде. Итак, параметры учетной записи, с помощью которой мы будем подключаться к серверу сообщений, прописываем следующим образом: messenger.Credentials = new Credentials("youaccount@hotmail.com", "qwerty");

Если вы подцепились на все нужные вам Класс работает с протоколом в асинхронном обработчики событий и указали учетную режиме. И за это разработчикам MSNPSharp запись, можно запускать процесс коннекта к серверу методом Connect();. нужно не просто пожать руку, но и нежно поцеловать в носик. Дело в том, что если бы Поболтаем класс работал в синхронном режиме, то на Разговоры между незнакомыми абонентами нас свалилось бы куча проблем по категорически запрещены и это реально асинхронизации. Некоторые команды западло для злокодера. Чтобы кого-то выполняются очень долго. Например, в вызвать на серьезный и жесткий разговор, момент скачивания контактов класс может нужно сначала направить приглашение и капитально заснуть на несколько секунд. только если ваш invite приняли, вы можете Если выполнять операцию синхронно, то в спячку ушло бы все приложение, а так только посылать сообщения. Такой протокол должен предотвращать безконтрольные класс. Просто вызывай нужную функцию, и рассылки заразы, которые происходят в жди когда она сгенерит соответствующее классической e-почте. Но теоретически событие. вполне реально написать червя, который Событий у класса немеренно. Вот будет распространятся по алгоритму минимальный набор, который может Морриса (если мне не изменяет память, а пригодиться в реальной жизни: она мне изменяет иногда с совестью :)). Все хорошее новое – это хорошо забытое * - NameserverProcessor. ConnectionEstablished – генерируется, когда старое. соединение удачно установлено; Вспомним как работал один из самых нашумевших червей. Для взлома аккаунтов * - Nameserver.SignedIn – мы вошли в он использовал подбор паролей по словарю, систему; vr-online | октябрь 201 0


39

Кодинг который брал из nix системы. Так как в те времена о безопасности думали мало даже специалисты, то червь удачно ломал системы. Сейчас о безопасности думают лучше, но только специалисты и продвинутые пользователи. Ламеров все еще очень много на просторах нашей сети, поэтому можно попробовать повторить взлом. Проникая на компьютер, можно попытаться взломать банальным перебором MSN аккаунты всех почтовых ящиков, которые есть в адресной книги. Если что-то взломалось, то подключаемся от имени лохюзера и рассылаем себя других лохюзерам сети. Когда файлы приходят от друзей, то их запускают на много чаще, и можно так по цепочке ломать и ломать. Итак, чтобы отправить кому-то сообщение, мы сначала должны пригласить его в свой список друзей-товарищей. Все, что касается адресной книги MSN находиться в классе Nameserver месенджера. Чтобы пригласить нового друга, вызываем метод AddNewContact сервиса ContactService. Запутался? Проще один раз показать, чем десять раз рассказать:

списки контактов будут пустыми. Дело в том, что вся эта операция тормозообразная. Если нужно забрать с сервера свои контакты, то можно изменить свойство AutoSynchronize на true: messenger.Nameserver.AutoSynchronize = true;

Если вас скорость старта не особо волнует, то изменение свойства AutoSynchronize можно поместить в обработчике события ConnectionEstablished. Это вполне логично – сразу после установки подключения синхронизировать контакты.

Общение

Когда мы вошли в систему, т.е. произошло событие SignedIn, мы можем изменять состояние и начинать общаться. Чтобы показать, что вы в сети и готовы к общению, изменяем свое состояние на Online следующим образом: messenger.Owner.Status = PresenceStatus.Online;

Для зла это абсолютно не обязательно. Рассылка сообщений вполне реальна при любом состоянии, даже когда вы заняты PresenceStatus.Busy. Лично мне кажется, что с психологической точки зрения занятость более предпочтительна. Просто мне так Messenger.Nameserver.ContactService.AddNewCont кажется, что если собеседник занят, но отправляет вам что-то, то вы не будете act("pamela_anderson@hotmail.com'); домогаться лишними запросами о том, что Вот таким вот нехитрым способом мы это и зачем. приглашаем самую знаменитую и обаятельную Памелу Андерсон. Адрес я Теперь сама отправка сообщения. Этот придумал, поэтому любителям одноруких процесс наиболее запутанный. Для этого бандитов в темную ночь под одеялом нужно создать новое общение, за которое просьба не беспокоится и не ломиться на отвечает класс Conversation: него. Не думаю, что под этим ящиком Conversation conversation = прячется Памела, потому что я просто наугад messenger.CreateConversation(); треснул этот адрес. Ничего больше. Теперь просто дожидаемся, Теперь о том, как получить список контактов. когда сработает событие ConversationCreated. А вот уже когда новое Контакты находятся в свойстве ContactList, общение создано, мы должны найти в списке которое является достаточно серьезным классом. Он позволяет просмотреть контакты контактов человека, которому хотим и вдоль и поперек. Если нужны все контакты, отправить послание, и пригласить его на конкретный и очень конкретный разговор. то обращаемся к коллекции All (ContactList.All). Помимо этого можно увидеть Допустим, что messenger аккаунт человека, следующий типы контактов: которому мы хотим отправить сообщение, находиться в строковой переменной * - Allowed – разрешенные контакты; MsnAccountTo: * - BlockedList – здесь мы можем увидеть private void messenger_ConversationCreated(object юзеров, которых заблокировали; sender, Сам по себе список не синхронизируется с ConversationCreatedEventArgs e) сервером и сразу после подключение, все {

vr-online | октябрь 201 0


40

Кодинг if (e.Initiator != null) { foreach (MSNPSharp.Contact contact in messenger.ContactList.All) { if (contact.Mail == MsnAccountTo) { e.Conversation.ContactJoined += new EventHandler(ContactJoined); e.Conversation.Invite(contact); return; } } messenger.Nameserver.ContactService.AddNewCont act(MsnAccountTo); } }

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

e.Conversation.ContactJoined += new EventHandler(ContactJoined);

Итого

private void ContactJoined(object sender, ContactEventArgs e) { TextMessage message = new TextMessage(currentmessage); (sender as Conversation).SendTextMessage(message); }

В первой строке мы подготавливаем текстовое сообщение к отправки. Оно должно иметь тип класса TextMessage. Конструктору этого класса банально передаем строку текста. Так как событие генерирует класс Conversation, то первый параметр как раз на Код банален. Мы просто ищем контакта в него и указывает, и мы можем использовать списке всех, кого мы знаем. Если почтовый ящик кого-то совпадает с тем, кого мы хотим его. Нам нужно использовать его для вызова нежно и ласково полюбить, вызываем этого метода SendTextMessage для непосредственной отправки. Ну наконец-то человека на конкретный разговор. это случилось!!! Конкретный базар, который мы создали, находиться в свойстве Conversation второго На уже созданном класса Conversation и параметра события. Мы должны подписаться пришедшим на разговор удаленным на событие ContactJoined этого класса клиентом, можно отсылать несколько общения, чтобы узнать, когда удаленный сообщений подряд. Если пользователь не в лох, простите пользователь готов сети, Conversation все равно будет создан пообщаться: без проблем. Я ненавижу клиенты мгновенных сообщений, но не могу не признать, что за ними ближайшее будущее. Если и не ради зла, то во имя добра его можно и нужно e.Conversation.Invite(contact); использовать. Как я уже сказал, в северной Тут нужно быть внимательным и аккуратным. Америке именно Messenger является самым Событие ConversationCreated может популярным клиентом. Однажды я видел вызываться несколько раз. Я не понял, с компанию, в которой в качестве средства какого перепуга это происходит, но почему-то общения используется Skype, но тут же это бывает. Приходится гасить выяснилось, что в этой компании почти все повторяющуюся генерацию события. Это программисты находятся в Санктможно сделать, например, вводя Петербурге. дополнительную булеву переменную, диске можно найти небольшой класс которая будет устанавливаться при создании На помощник, который упрощает работу с общения, и гаситься после обработки и сводит отправку сообщений к события. Если переменная не установлена, библиотекой вызову всего одного метода, если не считать то игнорировать событие. еще конструктора, который вызывается И это еще не все. Теперь в недрах автоматом при инициализации объекта. В библиотеки снова начинается асинхронный большинстве простых ситуаций этого класса для нас процесс, по завершению которого будет достаточно. вызывается событие ContactJoined. И вот в Дополнительные ссылки: нем мы уже можем отправить пользователю А приглашение на этот базар делается вызовом метода Invite и указанием ящика бедолаги:

MSNPSharp: http://code.google.com/p/msnp-sharp/ vr-online | октябрь 201 0


Автор: Денис Гладких aka outcoldman Сайт: http://outcoldman.ru

41

Кодинг

Silverlight. Основы

Валидация. Часть 1. DataAnnotations & ValidatesOnExceptions

В Silverlight 4 есть несколько способов для валидации введённых данных, точнее несколько подходов для реализации валидации. Первый вариант, реализация валидации на DataAnnotation. Вариант, когда правила валидации описываются при помощи атрибутов. Два других подхода – это реализация одного из интерфейсов IDataErrorInfo или INotifyDataErrorInfo. Я хотел бы остановиться на каждом из подходов, поговорить о преимуществах и недостатках каждого из них. Цель данной статьи выявить лучшие практики для валидации для себя и для вас. Так получилось, что статья оказалась большой, потому реализую ее в два или три подхода. Эта часть только про DataAnnotation. Подготовка

Итак, давайте перейдем к примеру. Я всю валидацию буду описывать при помощи одного простого окна изменения пароля.

В нем у меня два контрола PasswordBox, одна кнопка, и ValidationSummary. Для каждого примера у меня будет меняться только объект, который байдится к DataContext этого контрола. В реализации этого объекта и будет скрыта валидация введённых данных. Xaml-описание этого окна:

<UserControl x:Class="SilverlightValidation.MainPage" xmlns="http://schemas.microsoft.com/ winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/ winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/ expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/ markup-compatibility/2006" xmlns:sdk="http://schemas.microsoft.com/ winfx/2006/xaml/presentation/sdk" xmlns:DataAnnotations="clr-namespace: SilverlightValidation.DataAnnotations" xmlns:SilverlightValidation="clr-namespace: SilverlightValidation" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="400">

<UserControl.DataContext> <DataAnnotations:BindingModel /> </UserControl.DataContext> <Grid x:Name="LayoutRoot" Background="White" Width="500"> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <TextBlock HorizontalAlignment="Right"> New Password:</TextBlock> <PasswordBox Grid.Column="1 " Password="{Binding Path=NewPassword, Mode=TwoWay, ValidatesOnNotifyDataErrors=True, ValidatesOnExceptions=True, ValidatesOnDataErrors=True, NotifyOnValidationError=True}" /> <TextBlock Grid.Row="1 " HorizontalAlignment="Right"> New Password Confirmation:</TextBlock>

vr-online | октябрь 201 0


42

Кодинг <PasswordBox Grid.Row="1 " Grid.Column="1 " Password="{Binding Path= NewPasswordConfirmation, Mode=TwoWay, ValidatesOnNotifyDataErrors=True, ValidatesOnExceptions=True, ValidatesOnDataErrors=True, NotifyOnValidationError=True}" /> <Button Grid.Row="2" Grid.ColumnSpan="2" HorizontalAlignment="Right" Content="Change" Command="{Binding Path= ChangePasswordCommand}" /> <sdk:ValidationSummary Grid.Row="3" Grid.ColumnSpan="2" /> </Grid> </UserControl>

В байдинге для PasswordBox у меня сразу же прописаны 4 свойства, связанных с валидацией. Пока скажу только про NotifyOnValidationError, он нужен для того, чтобы сообщить ValidationSummary о том, что нужно отобразить ошибки валидации. Если кто не знает – PasswordBox имеет только односторонний байдинг от контрола к объекту, сделано это из соображений безопасности. Сам процесс байдинга происходит только при смене фокуса (так правда и у обычного контрола TextBox). В WPF есть возможность изменить это поведение, сделать так, чтобы байдинг происходил на нажатие клавиши, в Silverlight это тоже можно реализовать при помощи Attached Property. Сделать это можно так:

return (bool)d. GetValue(UpdateSourceTriggerProperty); } public static void SetUpdateSourceTrigger( DependencyObject d, bool value) { d.SetValue(UpdateSourceTriggerProperty, value); } private static void OnUpdateSourceTriggerChanged( DependencyObject d, DependencyPropertyChangedEventArgs e) { if (e.NewValue is bool && d is PasswordBox) { PasswordBox textBox = d as PasswordBox; textBox.PasswordChanged -= PassportBoxPasswordChanged; if ((bool)e.NewValue) textBox.PasswordChanged += PassportBoxPasswordChanged; } } private static void PassportBoxPasswordChanged(object sender, RoutedEventArgs e) { var frameworkElement = sender as PasswordBox; if (frameworkElement != null) { BindingExpression bindingExpression = frameworkElement. GetBindingExpression(PasswordBox. PasswordProperty); if (bindingExpression != null) bindingExpression.UpdateSource(); } } }

Чтобы использовать нужно просто public static class UpdateSourceTriggerHelper устанавливать это свойство для { PasswordBox: public static readonly DependencyProperty <PasswordBox Grid.Column="1 " UpdateSourceTriggerProperty=DependencyProperty. Password="{Binding Path=NewPassword, RegisterAttached("UpdateSourceTrigger", Mode=TwoWay, typeof(bool), ValidatesOnNotifyDataErrors=True, typeof(UpdateSourceTriggerHelper), ValidatesOnExceptions=True, new PropertyMetadata(false, ValidatesOnDataErrors=True, OnUpdateSourceTriggerChanged)); NotifyOnValidationError=True}" SilverlightValidation:UpdateSourceTriggerHelper. public static bool GetUpdateSourceTrigger( UpdateSourceTrigger="True"/> DependencyObject d) { Так как я не буду использовать никаких

vr-online | октябрь 201 0


43

Кодинг фреймворков в этих примерах, то мне потребуется так же самая обычная реализация DelegateCommand:

public class DelegateCommand : ICommand { private readonly Action<object> _execute; private readonly Func<object, bool> _canExecute; public DelegateCommand(Action<object> execute) { if (execute == null) throw new ArgumentNullException("execute"); _execute = execute; } public DelegateCommand( Action<object> execute, Func<object, bool> canExecute) : this(execute) { if (canExecute == null) throw new ArgumentNullException("canExecute"); _canExecute = canExecute; } public bool CanExecute(object parameter) { if (_canExecute != null) return _canExecute(parameter); return true; } public void Execute(object parameter) { _execute(parameter); } public void RaiseCanExecuteChanged() { CanExecuteChanged(this, EventArgs.Empty); } public event EventHandler CanExecuteChanged = delegate {}; }

В мною описанном примере мне нужно реализовать несколько правил для валидации: • New Password должен быть введен; • New Password имеет ограниченную длину ввода, пускай 20 символов (печально, что многие разработчики совсем забывают, что за этим тоже нужно следить, а потом получают ошибки, вроде string truncated); • New Password Confirmation должен совпадать с New Password.

#1 DataAnnotations & ValidatesOnExceptions

Этот вариант валидации появился еще до Silverlight 4, либо со второй, либо с третьей версии. Я с Silverlight знаком на хорошем уровне только с 3-ей версии, потому точно могу сказать только, что он был именно в этой версии. Единственный, наверное, плюс этого типа валидации то, что он есть во всех технологиях (или практически во всех?). По крайней мере, в ASP.NET он тоже есть. Основная идея в этом варианте – валидация на бросаниях исключений. Хотя не обязательно, можно реализовать и подругому. По крайней мере, примеры, которые вы найдете, будут именно основываться на них, и вся инфраструктура будет заточена под них. В Silverlight 3 валидация на исключениях была единственным возможным вариантом (исключаем с нуля написания своего варианта). В байдинге за поддержку валидации на исключениях отвечает свойство ValidatesOnExceptions. Давайте приступим к реализации. Буду описывать BindingModel. Все примеры будут начинаться с одной и той же реализации с поддержкой интерфейса INotifyPropertyChanged и набором полей – два поля на пароль и одно свойство – это команда, которая байдиться на кнопку и которая должна производить смену пароля (инициализировать ее буду в конструкторе потом): public class BindingModel : INotifyPropertyChanged { private string _newPassword; private string _newPasswordConfirmation; public DelegateCommand ChangePasswordCommand { get; private set; } #region INotifyPropertyChanged public event PropertyChangedEventHandler PropertyChanged = delegate { }; private void OnPropertyChanged( string propertyName) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } #endregion }

Для этого этого примера нам так же потребуются два вспомогательных метода:

vr-online | октябрь 201 0


44

Кодинг private bool IsValidObject() { ICollection<ValidationResult> results = new Collection<ValidationResult>(); return Validator.TryValidateObject(this, new ValidationContext(this, null, null), results, true) && results.Count == 0; } private void ValidateProperty(string propertyName, object value) { Validator.ValidateProperty(value, new ValidationContext(this, null, null) { MemberName = propertyName }); }

Первый проверяет валидность всего объекта BindingModel, второй проверяет валидность определенного свойства. Оба метода используют класс Validator, это инфраструктура Silverlight. Этот класс собирает все аттрибуты, в которых описывается валидация, и соответственно производит валидирование. В методе IsValidObject он просто вернет булевское значение. Метод ValidateProperty бросить исключение, если какое-то из условий валидации не пройдет. Условия можно описать при помощи следующих заготовленных аттрибутов, наследованных от ValidationAttribute (можно реализовать свой): StringLengthAttribute, RequiredAttribute, RegularExpressionAttribute, RangeAttribute, DataTypeAttribute, CustomValidationAttribute. По ссылкам можно ознакомиться ближе с каждым из ним, а я теперь опишу два свойства моего типа BindingModel: [Required] [StringLength(20)] [Display(Name = "New password")] public string NewPassword { get { return _newPassword; } set { _newPassword = value; OnPropertyChanged("NewPassword"); ChangePasswordCommand. RaiseCanExecuteChanged(); ValidateProperty("NewPassword", value); } } [CustomValidation(typeof(BindingModel), "CheckPasswordConfirmation")] [Display(Name = "New password confirmation")]

public string NewPasswordConfirmation { get { return _newPasswordConfirmation; } set { _newPasswordConfirmation = value; OnPropertyChanged("NewPasswordConfirmation"); ChangePasswordCommand. RaiseCanExecuteChanged(); ValidateProperty("NewPasswordConfirmation", value); } }

Думаю, что с NewPassword свойством все ясно, там используется два аттрибута Required и StringLenght, которые реализуют два условия валидации. Так же я использую DisplayAttribute для того, чтобы ValidationSummary правильно отображало, что скрывается за этим полем, а не простое “NewPassword”. Оба свойства имеют в set методах одинаковую процедуру: установить значение, сказать, что значение изменилось, сказать команде, что может быть изменилось значение CanExecute метода (если используем), и произвести валидацию для этого свойства. Свойство NewPasswordConfirmation использует CustomValidatorAttribute, в нем описан метод, который нужно вызвать для того, чтобы произвести валидацию, а так же описан тип, в котором этот метод описан. На этот метод накладываются следующие правила: он должен быть публичным, статичным, возвращать тип ValidationResult, принимать первым параметром переменную, тип у которой должен быть такой же как у свойства, второй параметр может быть ValidationContext. Моя реализация следующая: public static ValidationResult CheckPasswordConfirmation(string value, ValidationContext context) { var bindingModel = context. ObjectInstance as BindingModel; if (bindingModel == null) throw new NotSupportedException("ObjectInstance must be BindingModel"); if (string.CompareOrdinal(bindingModel. _newPassword, value) != 0) return new ValidationResult("Password

vr-online | октябрь 201 0


45

Кодинг сама реализация. Приходится использовать CanExecute свойство для команды, и делать } неактивным кнопку изменения пароля, что, мне кажется, не совсем очевидным и ясным Дальше нужно решить как быть с кнопкой, как она будет работать. Сделаю следующим для пользователя. Очевиднее, когда кнопка активна всегда. А когда пользователь нажмет образом: ее в случае, если ничего не установлено – он public BindingModel() увидит список ошибок валидации. Но так { просто это реализовать не получится (или я ChangePasswordCommand = не знаю как). Нельзя просто new DelegateCommand(ChangePassword, провалидировать весь объект и сказать CanChangePassword); контролам о том, что произошли какие-то } ошибки валидации. То есть в методе private bool CanChangePassword(object arg) ChangePassword я могу только проверить (и { это делаю на всякий случай), но не вызвать return IsValidObject(); какое-нибудь событие о том, что произошли } ошибки валидации. Хотя реализовать private void ChangePassword(object obj) подобное поведение, конечно же, можно. { Нужно просто дернуть для каждого контрола if (ChangePasswordCommand.CanExecute(obj)) UpdateBinding, для этого нужно написать { специальный класс (типа Validation Scope), MessageBox.Show("Bingo!"); который бы это делал. } } Мне так же приходится в этом случае постоянно использовать Для этого примера я так же установлю для UpdateSourceTrigger, так как если байдинг обоих контролов PasswordBox UpdateSourceTrigger=”True” в Xaml разметке. будет происходить на смену фокуса, то у пользователя будет ступор. Он ввел New Итого получаем следующий результат: Password, ввел Confirmation, оба пароля одинаковые, а кнопка до сих пор не валидна, просто потому, что байдинг еще не произошел. А когда используешь UpdateSourceTrigger при вводе Confirmation пароля на каждое нажатие клавиши уже Минусы этого подхода очевидны. Основной видишь, что пароли не совпадают. минус – это сами бросания исключений. Они Заключение мешают везде. Если отлаживаете приложение, то это, скорее всего, лишнее В общем, этот вариант валидации явно при отладке (особенно если включите ужасен. Хорошо, разработчики Silverlight байдинг на каждое изменение значение, на услышали просьбы, и реализовали каждое нажатие клавиши). Самое интерфейсы IDataErrorInfo и неприятное, что, например, нет нормальной INotifyDataErrorInfo, но о них во второй части возможности обнулить поле извне без статьи (читай в этом, же номере). Исходники какого-нибудь backend свойства или метода. примера можно взять с здесь. Например, нам нужно было бы установить Примечания редактора: на странице со null в оба поля при загрузке контрола, а не статьей, в блоге автора, можно воочию сможем просто так - получим исключения. увидеть демонстрацию рассмотренных в Очень не приятно. Конечно, решается, при статье примеров. помощи какого-нибудь метода Set[Property]Value, но в целом свойства реально можно будет использовать только для байдинга, что немного архитектурно странно. Другое, что мне тоже очень не нравится, это confirmation not equal to password."); return ValidationResult.Success;

vr-online | октябрь 201 0


Автор: Денис Гладких aka outcoldman Сайт: : http://outcoldman.ru

46

Кодинг

Silverlight. Основы

Валидация. Часть 2. IDataErrorInfo & INotifyDataErrorInfo

В первой части статьи я рассказал про валидацию введённых данных в Silverlight. Этой частью я попробую дополнить первую, и рассказать то, что еще не рассказал про DataAnnotations, а так же описать интерфейсы IDataErrorInfo и INotifyDataErrorInfo. Рекомендую прочесть первую часть статьи перед прочтением этой, потому как я буду использовать все тот же пример. ValidatesOnExceptions

Забыл сказать, что если вам хочется построить валидацию на исключениях, то совсем не обязательно использовать DataAnnotations, можно очень просто выбрасывать исключения прям из set методов. Например, для проверки того, что повторно введенный пароль из прошлого примера совпадает с перво-введённым паролем, можно сделать так:

[Display(Name = "New password confirmation")] public string NewPasswordConfirmation { get { return _newPasswordConfirmation; } set { _newPasswordConfirmation = value; OnPropertyChanged("NewPasswordConfirmation"); ChangePasswordCommand. RaiseCanExecuteChanged(); if (string.CompareOrdinal(_newPassword, value) != 0) throw new Exception("Password confirmation not equal to password."); } }

Так, конечно, выглядит намного проще, чем описывать все на аттрибутах (в случае CustomValidationAttribute).

этом интерфейсе метода/свойства. Чаще всего разработчики начинают с того, что добавляют некий класс-обработчик, который хранит коллекцию сообщений об ошибках: public class ValidationHandler { private Dictionary<string, string> BrokenRules { get; set; }

public ValidationHandler() { BrokenRules = new Dictionary<string, string>(); } public string this[string property] { get { return BrokenRules[property]; } } public bool BrokenRuleExists(string property) { return BrokenRules.ContainsKey(property); } public bool ValidateRule(string property, string message, Func<bool> ruleCheck) { bool check = ruleCheck(); if (!check) { if (BrokenRuleExists(property)) RemoveBrokenRule(property);

IDataErrorInfo

IDataErrorInfo интерфейс пришел вместе с Silverlight 4. Он нам поможет избавиться от передачи сообщений об ошибках инфраструктуре Silverlight основанной на бросании исключений. Все, что нужно сделать – это реализовать два описанных в

BrokenRules.Add(property, message);

}

} else { RemoveBrokenRule(property); } return check;

vr-online | октябрь 201 0


47

Кодинг

}

public void RemoveBrokenRule(string property) { if (BrokenRules.ContainsKey(property)) { BrokenRules.Remove(property); } } public void Clear() { BrokenRules.Clear(); }

Дальше, давайте перепишем немного наш класс BindingModel, наследуем его от вышеупомянутого интерфейса и реализуем его при помощи класса ValidationHandler:

public class BindingModel : INotifyPropertyChanged, IDataErrorInfo { private string _newPassword; private string _newPasswordConfirmation; private readonly ValidationHandler _validationHandler = new ValidationHandler(); #region INotifyPropertyChanged public event PropertyChangedEventHandler PropertyChanged = delegate { }; private void OnPropertyChanged(string propertyName) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } #endregion #region IDataErrorInfo public string this[string columnName] { get { if (_validationHandler. BrokenRuleExists(columnName)) { return _validationHandler[columnName]; } return null; } } public string Error {

get { return throw new NotImplementedException(); } } #endregion }

Основные свойства нашей BindingModel будут описаны следующим образом: [Display(Name = "New password")] public string NewPassword { get { return _newPassword; } set { _newPassword = value; OnPropertyChanged("NewPassword");

if (_validationHandler. ValidateRule("NewPassword", "New password required", () => !string.IsNullOrEmpty(value))) { _validationHandler. ValidateRule("NewPassword", "Max length of password is 80 symbols.", () => value.Length < 80); } ChangePasswordCommand. RaiseCanExecuteChanged(); } } [Display(Name = "New password confirmation")] public string NewPasswordConfirmation { get { return _newPasswordConfirmation; } set { _newPasswordConfirmation = value; OnPropertyChanged("NewPasswordConfirmation"); validationHandler. ValidateRule("NewPasswordConfirmation", "Password confirmation not equal to password.", () => string.CompareOrdinal(_newPassword, value) == 0); ChangePasswordCommand. RaiseCanExecuteChanged(); } }

То есть, каждый вызов метода ValidateRule проверяет некоторое условие, и если оно не выполнилось, то записывает информацию о vr-online | октябрь 201 0


48

Кодинг нем в коллекцию ошибок. После байдинга произойдет обращение к индексируемому свойству this[string columnName] и оно вернет сообщение об ошибке. Для того, чтобы это работало в байдинге мы установили свойство ValidatesOnDataErrors в True. Свойство Error кидает NotImplementedException() не просто так, в нем нет необходимости, если вы сами его не используете. Цитата с MSDN: “Note that the binding engine never uses the Error property, although you can use it in custom error reporting to display object-level errors.”. То есть, инфраструктура Silverlight его не использует при байдинге. Давайте заканчивать с этим примером. Все, что нам осталось – это реализовать и проинициализировать команду, которая будет производить изменение пароля. Сделаем это так: public BindingModel() { ChangePasswordCommand = new DelegateCommand(ChangePassword, CanChangePassword); } public DelegateCommand ChangePasswordCommand { get; private set; } private bool CanChangePassword(object arg) { return !string.IsNullOrEmpty(_newPassword) && string.CompareOrdinal(_newPassword, _newPasswordConfirmation) == 0; }

раз при байдинге, а второй раз на проверку того, можно ли вызвать команду. Это проблемы только нашей реализации (точнее той, что я взял по ссылке выше). Решить эту проблему можно, например, записывая сами правила в тот же ValidationHandler, и умея проходить по всем этим правилам, и в целом получать общую картину о валидности состояния объекта. Но, все же, одно проблема останется, мы не можем прямо из кода, из метода ChangePassword (нажатия на кнопку) сказать инфраструктуре, что ошибки появились или, наоборот, пропали. Можно так же использовать атрибуты из DataAnnotations для описания условий. Но об этом мы поговорим в рамках следующего интерфейса, который, мне кажется, является лучшим выбором для реализации валидации. Результат этой реализации привожу ниже:

Думаю, его поведение не сильно должно отличаться от предыдущего примера (в предыдущей части статьи). Но вот хочется отметить, что здесь есть скрытый баг. Если пользователь сначала введет Password Confirmation а затем New Password, то останется ошибка о неверном введенном подтверждении пароля, так как эта проверка происходит только на байдинг New Password Confirmation свойства.

INotifyDataErrorInfo

INotifyDataErrorInfo интерфейс к нам так же пришел совместно с Silverlight 4. Основное его преимущество в том, что он может осуществлять как синхронную (как было в предыдущих примерах) так и асинхронную валидацию. Например, подождать, когда проверка придет от сервера, и только потом показать сообщение об ошибке. Вот этот Нам опять нужно использовать метод я хочу описать более подробно, CanChangePassword метод, чтобы делать насколько это возможно. Помогут кнопку неактивной при невалидности реализовать валидацию при помощи объекта. У нас нет возможности как-то INotifyDataErrorInfo статьи, опубликованные проверить валидность всего объекта, пока не Davy Brion в рамках “MVP In Silverlight/WPF произошел байдинг по каждому полю. Так же, Series”. в нашей реализации нам приходится Для начала возьмем класс PropertyValidation, описывать правила валидации дважды, один private void ChangePassword(object obj) { if (ChangePasswordCommand.CanExecute(obj)) { MessageBox.Show("Bingo!"); } }

vr-online | октябрь 201 0


49

Кодинг при помощи которого мы будем хранить информацию о каждом правиле валидации, и о том, какое сообщение отображать при этом: public class PropertyValidation<TBindingModel> where TBindingModel : BindingModelBase<TBindingModel> { private Func<TBindingModel, bool> _validationCriteria; private string _errorMessage; private readonly string _propertyName;

public PropertyValidation(string propertyName) { _propertyName = propertyName; } public PropertyValidation<TBindingModel> When(Func<TBindingModel, bool> validationCriteria) { if (_validationCriteria != null) throw new InvalidOperationException("You can only set the validation criteria once.");

}

_validationCriteria = validationCriteria; return this;

public PropertyValidation<TBindingModel> Show(string errorMessage) { if (_errorMessage != null) throw new InvalidOperationException("You can only set the message once.");

}

_errorMessage = errorMessage; return this;

public bool IsInvalid(TBindingModel presentationModel) { if (_validationCriteria == null) throw new InvalidOperationException( "No criteria have been provided for this validation. (Use the 'When(..)' method.)"); return _validationCriteria(presentationModel);

} public string GetErrorMessage() { if (_errorMessage == null)

throw new InvalidOperationException( "No error message has been set for this validation. (Use the 'Show(..)' method.)");

}

return _errorMessage; } public string PropertyName { get { return _propertyName; } }

Как он работает будет понятно ниже, когда мы будем описывать правила валидации. В качестве Generic Type параметра у нас используется базовый класс BindingModelBase<T>, от которого мы потом наследуем наш основной класс BindingModel примера. Давайте приступим к реализации класса BindingModelBase, его мы наследуем от INotifyPropertyChanged и от INotifyDataErrorInfo, добавим так же два поля. Одно для хранения ошибок для свойств, второе для хранения правил валидации: public abstract class BindingModelBase<TBindingModel> : INotifyPropertyChanged, INotifyDataErrorInfo where TBindingModel : BindingModelBase<TBindingModel> { private readonly List<PropertyValidation<TBindingModel>> _validations = new List<PropertyValidation<TBindingModel>>(); private Dictionary<string, List<string>> _errorMessages = new Dictionary<string, List<string>>(); #region INotifyDataErrorInfo public IEnumerable GetErrors(string propertyName) { if (_errorMessages. ContainsKey(propertyName)) return _errorMessages[propertyName]; return new string[0]; } public bool HasErrors { get { return _errorMessages.Count > 0; } } public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged = delegate { };

vr-online | октябрь 201 0


50

Кодинг private void OnErrorsChanged(string propertyName) { ErrorsChanged(this, new DataErrorsChangedEventArgs(propertyName)); } #endregion #region INotifyPropertyChanged public event PropertyChangedEventHandler PropertyChanged = delegate { }; protected void OnPropertyChanged(string propertyName) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } #endregion }

эту проблему. Да и не будет их. Эти операции выполняются только на действия пользователя, отклик к которым будет через 1 0 миллисекунд или через 1 00, особо не будет никого напрягать. Реализация этих методов следующая: protected void OnPropertyChanged(Expression <Func<object>> expression) {

OnPropertyChanged(GetPropertyName(expression)); } protected void OnCurrentPropertyChanged() { string methodName = string.Empty; StackTrace stackTrace = new StackTrace(); // get call stack StackFrame[] stackFrames = stackTrace. GetFrames(); // get method calls (frames)

Реализация пока очень простая. Так же я хотел бы добавить два метода дополнительно к OnPropertyChanged к этому классу. Первый метод OnCurrentPropertyChanged() (на самом деле это вредный совет, и метод очень опасный, более подробно можно узнать об этом в этом комментарии, если будете пользоваться, то пользуйтесь с умом), который позволит нам делать так: public string NewPassword { get { return _newPassword; } set { _newPassword = value; OnCurrentPropertyChanged(); } }

Второй метод OnPropertyChanged, который принимает Expression и позволяет делать так: public string NewPassword { get { return _newPassword; } set { _newPassword = value; OnPropertyChanged(() => NewPassword); } }

Оба метода очень полезны и удобны. Позволяют в разы писать более надежные приложения, и более быстро. Тут многие скажут о производительности, но в чем проблема? Будут проблемы с производительностью – мы знаем где искать

if (stackFrames != null && stackFrames.Length > 1 ) { methodName = stackFrames[1 ]. GetMethod().Name; } if (!methodName.StartsWith("set_", StringComparison.OrdinalIgnoreCase)) throw new NotSupportedException(" OnCurrentPropertyChanged should be invoked only in property setter");

}

string propertyName = methodName.Substring(4); OnPropertyChanged(propertyName);

private static string GetPropertyName(Expression<Func<object>> expression) { if (expression == null) throw new ArgumentNullException("expression"); MemberExpression memberExpression; if (expression.Body is UnaryExpression) memberExpression = ((UnaryExpression)expression.Body). Operand as MemberExpression; else memberExpression = expression. Body as MemberExpression; if (memberExpression == null) throw new ArgumentException("The expression

vr-online | октябрь 201 0


51

Кодинг is not a member access expression", "expression"); var property = memberExpression.Member as PropertyInfo; if (property == null) throw new ArgumentException( "The member access expression does not access a property", "expression"); var getMethod = property.GetGetMethod(true); if (getMethod.IsStatic) throw new ArgumentException("The referenced property is a static property", "expression"); }

return memberExpression.Member.Name;

Метод с Expression берет имя свойства из этого Expression. Метод OnCurrentPropertyChanged берет имя свойства из StackTrace. Теперь давайте добавим набор методов, которые будут осуществлять валидацию:

public void ValidateProperty(Expression<Func<object>> expression) { ValidateProperty(GetPropertyName(expression)); } private void ValidateProperty(string propertyName) { _errorMessages.Remove(propertyName); _validations.Where(v => v.PropertyName == propertyName).ToList(). ForEach(PerformValidation); OnErrorsChanged(propertyName); OnPropertyChanged(() => HasErrors); } private void PerformValidation(PropertyValidation <TBindingModel> validation) { if (validation.IsInvalid((TBindingModel) this)) { AddErrorMessageForProperty(validation. PropertyName, validation.GetErrorMessage()); } } private void AddErrorMessageForProperty( string propertyName, string errorMessage) { if (_errorMessages.ContainsKey(propertyName)) { _errorMessages[propertyName].

Add(errorMessage);

}

} else { _errorMessages.Add(propertyName, new List<string> {errorMessage}); }

Метод ValidateProperty удаляет информацию о всех предыдущих ошибках для этого свойства, потом проверяет каждое правило валидации, которое приписано к данному свойству, и если какое-то правило не прошло проверку, то записывает ошибку в список ошибок для конкретного свойства. Более того, мы можем вызывать валидацию автоматически для каждого обновленного поля, если было вызвано событие PropertyChanged, для этого мы проинициализируем следующим образом наш базовый класс: protected BindingModelBase() { PropertyChanged += (s, e) => { if (e.PropertyName != "HasErrors") ValidateProperty(e.PropertyName); }; }

Для того, чтобы добавлять правила в список правил валидации добавим специальный метод:

protected PropertyValidation<TBindingModel> AddValidationFor(Expression<Func<object>> expression) { var validation = new PropertyValidation <TBindingModel>(GetPropertyName(expression)); _validations.Add(validation); return validation; }

Теперь мы можем приступить непосредственно к написанию класса BindingModel, который используется в нашем примере. Чтобы работала валидация, основанная на INotifyDataErrorInfo, у нас в байдинге свойств Xaml описания стоит ValidatesOnNotifyDataErrors равное True. Вот как будет выглядеть класс BindingModel в данной реализации: public class BindingModel : BindingModelBase<BindingModel> { private string _newPassword;

vr-online | октябрь 201 0


52

Кодинг private string _newPasswordConfirmation; public DelegateCommand ChangePasswordCommand { get; private set; } public BindingModel() { ChangePasswordCommand = new DelegateCommand(ChangePassword); AddValidationFor(() => NewPassword) .When(x => string.IsNullOrEmpty(x. _newPassword)).Show("New password required field."); AddValidationFor(() => NewPassword) .When(x => !string.IsNullOrEmpty(x. _newPassword) && x._newPassword. Length > 80).Show("New password must be a string with maximum length of 80."); AddValidationFor(() => NewPasswordConfirmation) .When(x => !string.IsNullOrEmpty(x. _newPassword) && string.CompareOrdinal(x. _newPassword, x. _newPasswordConfirmation) != 0) .Show("Password confirmation not equal to password."); } [Display(Name = "New password")] public string NewPassword { get { return _newPassword; } set { _newPassword = value; OnCurrentPropertyChanged(); } } [Display(Name = "New password confirmation")] public string NewPasswordConfirmation { get { return _newPasswordConfirmation; } set { _newPasswordConfirmation = value; OnCurrentPropertyChanged(); } } private void ChangePassword(object obj) {

}

}

throw new NotImplementedException();

В конструкторе класса мы описываем при помощи PropertyValidation все три наших правила. Выглядит очень читабельно, вроде. Я больше не хочу делать неактивной кнопку для изменения пароля, потому избавился от метода CanChangePassword. Но пока и не реализовал сам метод ChangePassword. Для того чтобы реализовать метод мне нужен метод, который бы валидировал все свойства (полностью состояние объекта), отображал бы ошибки на форме, а так же давал мне знать о том, валидна форма или нет. Для этого в классе BindingModelBase я реализую метод ValidateAll: public void ValidateAll() { var propertyNamesWithValidationErrors = _errorMessages.Keys; _errorMessages = new Dictionary<string, List<string>>(); _validations.ForEach(PerformValidation); var propertyNamesThatMightHave ChangedValidation = _errorMessages.Keys. Union(propertyNamesWithValidationErrors). ToList();

}

propertyNamesThatMightHaveChangedValidation. ForEach(OnErrorsChanged); OnPropertyChanged(() => HasErrors);

Данный метод чистит все ошибки. Потом делает проверку для нашего правила (записывается ошибка, если нужно), а дальше для всех свойств, для которых могло бы поменяться состояние валидно оно или нет, вызываем метод OnErrorsChanged. Реализация метода ChangePassword (проверяем все свойства, и если ошибок нет – можем произвести действие): private void ChangePassword(object obj) { ValidateAll(); if (!HasErrors) {

vr-online | октябрь 201 0


53

Кодинг }

}

MessageBox.Show("Bingo!");

ValidationAttribute type"); string name = property.Name;

Данный вариант для валидации мне нравится больше всего. Он намного более гибкий, и более того, он может использовать преимущества всех предыдущих вариантов. А как же DataAnnotations? Нравится использование аттрибутов для описания правил валидации? Давайте напишем метод, который будет собирать все такие правила и преобразовывать в PropertyValidation (изменим так же немного метод AddValidatorFor, точнее сделаем два возможных варианта для его вызова):

var displayAttribute = Attribute. GetCustomAttributes(propertyInfo, typeof(DisplayAttribute)). FirstOrDefault() as DisplayAttribute; if (displayAttribute != null) { name = displayAttribute.GetName(); } var message = validationAttribute. FormatErrorMessage(name);

protected PropertyValidation<TBindingModel> AddValidationFor(Expression<Func<object>> expression) { return AddValidationFor(GetPropertyName(expression)); }

protected PropertyValidation<TBindingModel> AddValidationFor(string propertyName) { var validation = new PropertyValidation<TBindingModel>(propertyName); _validations.Add(validation); }

return validation;

}

}

}

AddValidationFor(propertyInfo.Name) .When(x => { var value = property.GetGetMethod(). Invoke(this, new object[] { }); var result = validationAttribute. GetValidationResult(value, new ValidationContext(this, null, null) { MemberName = property.Name }); return result != ValidationResult.Success; }) .Show(message);

Метод AddAllAttributeValidators не протестирован особо, так что используете на protected void AddAllAttributeValidators() свой страх и риск. Скорее всего будет { поддерживаться локализация (если PropertyInfo[] propertyInfos = GetType(). GetProperties(BindingFlags.Public | BindingFlags. указываете ресурсы для аттрибутов, а не сообщения об ошибках). Последнее Instance); переписывание нашей модели BindingModel: foreach (PropertyInfo propertyInfo in propertyInfos) { Attribute[] custom = Attribute. GetCustomAttributes(propertyInfo, typeof(ValidationAttribute), true); foreach (var attribute in custom) { var property = propertyInfo; var validationAttribute = attribute as ValidationAttribute; if (validationAttribute == null) throw new NotSupportedException(" validationAttribute variable should be inherited from

public class BindingModel : BindingModelBase<BindingModel> { private string _newPassword; private string _newPasswordConfirmation; public DelegateCommand ChangePasswordCommand { get; private set; } public BindingModel() { ChangePasswordCommand = new DelegateCommand(ChangePassword); AddAllAttributeValidators(); AddValidationFor(() => NewPasswordConfirmation) .When(x => !string.IsNullOrEmpty(x._newPassword) &&

vr-online | октябрь 201 0


54

Кодинг string.CompareOrdinal(x._newPassword, x._newPasswordConfirmation) != 0) .Show("Password confirmation not equal to password."); } [Display(Name = "New password")] [Required] [StringLength(80, ErrorMessage = "New password must be a string with maximum length of 80.")] public string NewPassword { get { return _newPassword; } set { _newPassword = value; OnCurrentPropertyChanged(); } } [Display(Name = "New password confirmation")] public string NewPasswordConfirmation {

get { return _newPasswordConfirmation; } set { _newPasswordConfirmation = value; OnCurrentPropertyChanged(); }

} private void ChangePassword(object obj) { ValidateAll();

}

}

if (!HasErrors) { MessageBox.Show("Bingo!"); }

Специально оставил солянку из двух подходов. Все работает, поведение такое же, как в последнем примере.

Moonlight: Moonlight (англ. Лунный свет) — открытая и бесплатная программная реализация фреймворка веб-приложений Microsoft Silverlight. Silverlight первоначально была разработана корпорацией Microsoft. Moonlight была разработана в рамках проекта Mono. Moonlight 1 .0 был выпущен 20 января 2009, а Moonlight 2 вышел 1 7 декабря 2009. Moonlight 2.0 в целом соответствует реализации Silverlight 2.0. Первая завершенная версия Moonlight 1 .0, поддерживающая Silverlight 1 .0, была выпущена 20 января 2009 года. Moonlight 2.0 вышла 1 7 декабря 2009. Этот выпуск также содержит некоторые возможности Silverlight 3, включая дополняемый медиафреймворк, который позволяет Moonlight работать с подключаемыми открытыми кодеками, такими как Theora и Dirac. Предварительный выпуск Moonlight 3.0 запланирован на первую четверть 201 0 года, а финальная версия планируется к выходу в третьей четверти 201 0 года.

vr-online | октябрь 201 0


55

Я прусь

Рублика "Я прусь" Делимся положительными эмоциями...

отступает, словно выжидает моей реакции и вновь факт, что активно туманит мой мозг. Именно развивается рынок осень, помогает мне мобильных платформ и проводить более успешные теперь появился новый участник: Windows Phone 7. манипулирования... хотя это Конкуренция - всегда хорошо, уже другая история. ;) тем более теперь многие мобильные ОСи Kastor: Наконец я начал представляют из себя восстанавливать свою отличный продукт, яркими физическую форму. Я хоть и примерами служат iOS, Android, Windows 7 и т.д. Это не похож на шкаф (даже наоборот, наверное), но наводит на мысль, что «сдутие мышц» после лета неплохо было бы в свои чувствуется. Преодолевая скилы записать хотя бы начальный навык разработки безумную жару, я иногда под мобильные платформы. выходил по утрам на стадион (ох как тяжело было =) просыпаться). Подтягивания на перекладине, отжимания и Jimmy Jonezz: Мне нравится пресс на брусьях. Дальше наматывал пару кругов по осень. Я так сильно люблю это время года, что не знаю стадиону, выходил на край как выразить свое состояние. поля и вспоминал основные Осень каким-то загадочным упражнения. Но эти редкие образом все во мне менят: я получасовые тренировки даже вряд ли поддерживали становлюсь сентиминтальным, слишком мою форму. А теперь уже октябрь и я снова хожу в зал. вдумчивым, романтичным. Снова вспоминаю стойки, Некая грусть витающая в заломы и приемы. Снова воздухе, постоянно работаю с напарниками, оказывает на меня некое воздействие, от которой меня лапами и грушей. Рукопашный бой больше в некотором смысле этого напоминает шахматы, чем слова, разрывает. В это мордобой. Каждым своим время года, я люблю предваться воспоминаниям, движением нужно ставить противника в неудобное размышлениям. Меня охватывает любовь, но не как положение, заставлять отступать его, делать ошибки весной - страстная, жгучая, и в конечном итоге пылающая и проигрывать сражение. всеобъемлющая, а совсем наоборот - ненавясчиво, она Я чувствую кайф, когда через окрыляет меня, затем снова силу продолжаю месить

wwwnet: Замечателен тот

грушу или выворачиваюсь из захвата партнера по спаррингу. Идя домой выжатый как лимон, я понимаю, что не оставил там в зале свои силы, а наоборот что то приобрел. Что-то важное, что может пригодиться в жизни, хоть я надеюсь на обратное.

Spider_NET: Наконец-то в

наш город пришла зима и выпал первый снег. Даже не знаю почему, но снег очень здорово поднимает мне (и уж точно моей собачке) настроение. На улице уже неделю стоит чудесная погода, и прогуливаться вечерами одно удовольствие. Также медленно, но верно мной начинает овладевать дух Нового Года. Буквально вчера перед сном я щелкал каналы и наткнулся на традиционную новогоднюю рекламу: «Праздник к нам приходит. Всегда coca-cola» =). Аж, настроение поднялось! С октября месяца я начал ходить в музыкальную школу на занятия вокалом. Давно хотелось прокачать свой скил в этом нелегком деле, но все как-то не было времени. Не сказать, что его сейчас стало много, но я в очередной раз решил немножко ганстернуть и прыгнуть выше своей головы. С одной стороны глупо жертвовать сном и vr-online | октябрь 201 0


56

Рублика "Я прусь!" постоянно чувствовать себя как белка в колесе, но я от этого прусь и чертовски рад, что мне удается развивать себя сразу по нескольким направлениям.

под Linux. Работать с ним не сложнее, чем с Kerio. Немного гиковский интерфейс, но софтина классная. Советую. Так же я тащусь от своего нового нетбука ASUS 1 001 PX. Вопреки моде он полностью Lord of fear: Я – линуксоид матовый, а не глянцевый. по натуре. Не люблю Отличная администрировать Windows. производительность за Ну, скучно мне и всё. Давно у скромные 1 0700 рублей. :) До меня зреет мысль отказаться этого у меня был в 2004-м на работе от Windows Server ноутбук RoverBook. Такое + Kerio и перейти на Debian + говнище… Он надолго Iptables. До недавнего оставил мне времени я не мог психологическую травму. С определиться с выбором тех пор я изо всех сил графического интерфейса избегал все эти мобильные для управления iptables. Но девайсы. И вот, наконец, моя вот я наткнулся на Firewall фобия прошла, и я приобрёл Builder и понял, что это – то, нетбук. О чем ничуть не что мне надо. жалею. Распространяется бесплатно

zahod5277: В начале ноября

ездил на родину, в Казахстан. Оттянулся от души! Одни позитивные эмоции, ноль негативных! По приезду обратно домой ощутил огромный прилив сил и желание творить возросло в стократ. И я прусь от этого! Отдых где-либо, но подальше от дома - штука нужная.

vr-online | октябрь 201 0


Автор: Роман Костенко aka Lord_of_fear Почта: kostenko.r.khv@gmail.com

57

"Linux­сервер в windows­окружении" Обзоры от VR-ONLINE

Обзор книги

Это – далеко не первая моя книга по Linux, но, чувствую, что последняя. Я не намерен более покупать литературу данной тематики. И на это есть две причины. Во-первых, я набрал уже такой багаж теоретических знаний, что осталось только продолжать оттачивать их на практике. Во-вторых, как не крути, авторы книг во многом пишут поверхностно и не уделяют внимания многим нюансам настройки серверного ПО, поэтому эти моменты приходится изучать на практике методом научного тыка. Лучше уж man почитать. Он хоть бесплатен... В следующем номере, правда, будет обзор ещё одной книги по Posix совместимым системам, которую я закончил читать ещё пару месяцев назад. Но сегодня бы мне хотелось рассказать о “Linux-сервере в windows-окружении”. Автором является наш соотечественник Алексей Стахнов. Книга написана в 2006 году. Скажу честно, что мне значительно большее удовольствие доставляет читать наших авторов. И на это так же 2 причины. :) Первая: ни один перевод не сможет сравниться с оригиналом по стилю изложения материала. В переводе никогда не почувствуешь, что автор общается с тобой. Вторая причина – информация пишется автором, исходя из наших реалий. Т.е. он никогда не напишет “идите купите циску за три тысячи долларов”, если можно обойтись решением за 200 баксов. Какойнить американец пойдёт и выложит 3000у.е. Ведь это – решение из коробки. А иначе нужно возиться с поднятием сервака и настройкой софта. :) У нас же попробуй расскажи начальству, что нужно отдать такую кругленькую сумму за девайс размером с кирпич. Не покатит. Сразу скажу, что эта книга не для новичков. Это – руководство Linux-администратора, а не начинающего убунтолога. :) Нет смыла её

покупать, если ты только начинаешь знакомиться с миром Linux. Раз книга для админа, то и требования к ней я выставил соответствующие. И она их, мягко говоря, не оправдала. ИМХО, обложка книги – полный сакс. Книга должна привлекать покупателя, а не отталкивать. Я даже так и не понял что там такое нарисовано. Судя по всему, зафотана деревянная черепица. Гм... к чему бы всё это? :) Ещё и синим цветом. Оформлением обложки, кстати, занималась женщина. Впрочем, как оказалось, редакторы, корректор, дизайнер – тоже все женщины. Женщины и Linux – несовместимые вещи. :) Конечно, из любого правила есть исключения, но думаю, что это – совсем не тот случай. Начинается книга с установки ОС на сервер. Блин, елки-палки! Ну сколько можно? Ещё и 7 листов уделяется установке Windows 2003 Server. Зачем это??? Я могу без мануала кликать по пимпе “Далее”. Я в шоке! Короче, без комментариев... В результате всю вторую главу можно запросто выкинуть в треш и перейти на 91 -ю страницу, дабы не терять время. :) Что касается содержания материала, то у меня сложилось двоякое чувство. После прочтения оглавления хочется кричать “Вау! vr-online | октябрь 201 0


58

Обзоры от VR-ONLINE Вот это – реальный кладезь информации. Как же хорошо, что я её купил.”. Но когда начинаешь читать, то понимаешь, что всё ОЧЕНЬ поверхностно написано. Взять, например, настройку почтового сервера. Курам на смех! Уделяется этому 6 страниц. 3 страницы занимает описание существующих протоколов для работы с почтой. Одну страницу занимает инфа о почтовых серверах для Windows (читатель, ты ещё не забыл, о какой книге мы разговариваем?). Последние 2 страницы автор пожертвовал sendmail’у и fetchmail’у. Это ещё при том, что последний не является почтовым сервером... Что можно рассказать на 2-х страницах книги? Правильно. Ничего. В противовес почте, например, достаточно хорошо рассказано про настройку Proxyсервера, DHCP-сервера, FTP-сервера. Приведены даже примеры рабочих конфигов. Используя эту информацию, можно без проблем поднять эти сервисы в сети. Полноценный контроллер домена на Linux по мануалу из книги уж точно ни за что не поднять. Автор уделил этому делу всего пару страниц, а сам пишет: “Рассматривать решение на основе Windows не имеет

смысла, во-первых, это краеугольный камень серверов Windows, во-вторых, более-менее внятное описание контроллера домена и Active Directory – такая маленькая книжечка страниц на 400-500”. Офигеть! Значит для поднятия домена на Windows нужно прочитать 400 страниц, а для поднятия на Linux всего 2? o_O Не понимаю так же, зачем было приводить листинги конфигов вместе с оригинальными комментариями... Там же 90% занимают одни комменты... Наверное, чтобы увеличить размер своего труда. Моя оценка книге – 3. Поставить оценку выше рука не поднимается. ИТОГИ: Полезность: 3/5 Стиль изложения: 5/5 Оформление материала: 4/5 Оправданность цены: 60% Покупал я эту книгу примерно за 350 рублей. На данный момент её нет в продаже ни на books.ru, ни на ozon.ru

Немного о Debian: Проект Debian — это ассоциация людей, общим делом которых является создание свободной операционной системы. Созданная нами операционная система называется Debian GNU/Linux или просто Debian. Операционная система - это набор основных программ и утилит, которые обеспечивают работоспособность вашего компьютера. Сердцем операционной системы является ядро. Ядро выполняет всю основную работу и дает возможность запускать другие программы. Системы Debian сейчас используют ядро Linux. Linux начал разрабатывать Линус Торвальдс (Linus Torvalds), и которое поддерживают тысячи программистов по всему миру. Создание Debian начал в августе 1 993 года Иэн Мэрдок (Ian Murdock). Он намеревался создать новый дистрибутив, который будет создаваться открыто, в духе Linux и GNU. Debian был задуман как дистрибутив, который будет собран тщательно и добросовестно, и так же качественно будет сопровождаться и поддерживаться. Он начался как маленькая, тесно сплочённая группа хакеров мира Свободного ПО, а затем постепенно рос, став большим, превосходно организованным сообществом разработчиков и пользователей. vr-online | октябрь 201 0


Автор: Игорь Антонов aka Spider_NET Почта: antonov.igor.khv@gmail.com

59

Обзоры от VR-ONLINE

CSS (Cascading Style Sheets) Рецепты программирования

CSS (Каскадные таблицы стилей) – технология, без которой тяжело представить создание современной web-страницы. Все оформление, а также верстка страницы делается при помощи этой замечательной технологии. Начать применять css несложно. Достаточно прикупить соответствующую литературу и посидеть вечер-другой, проводя эксперименты. Об одной из книг по CSS речь и пойдет в этой статье. На моей книжной полке пока всего две книги по технологии CSS: «Большая книга CSS» (о ней я рассказывал в одном из прошлых номеров нашего журнала) и «СSS: Рецепты программирования». «Рецепты программирования» я купил уже достаточно давно, но прочитать ее все как-то не хватало времени. В этом месяце я ее осилил и теперь готов поделиться своим мнением.

Для кого эта книга

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

Как построена эта книга

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

Мое мнение

Мне книга понравилась. В очередной раз убеждаюсь, что издательство O’Reilly плохих книг не делает. За десять лет своей IT жизни я накопил много книг от O’Reilly и все они оказались полезными и интересными. Если честно, то мне больше нравится читать зарубежных авторов, чем наших соотечественников. Не знаю почему, но многие наши авторы, откровенно говор,я халтурят и предлагают к изучению очень поверхностный материал. Само собой это относится не ко всем, но последние книги от наших соотечественников, которые прочитал были именно такими. Много воды и мало полезной информации. Автор данной книги кажется, американец и вот в его труде воды практически не наблюдается. Буквально недавно я читал книгу про Drupal (кстати, тоже от издательства O’REILLY) и она тоже была написано с целью принести пользу читателю, а не окунуть его в ледяной проруб бесполезной информации. Я бы рекомендовал обзавестись этой книгой всех тех, кто решил разрабатывать сайт/заниматься версткой страниц. Вся книга состоит из готовых решений и все это дело представлено в формате: «Задача»-> «Решение» -> «Обсуждение». На практике очень часто (в начале пути) сталкиваешься с проблемой: «Вроде теорию знаешь, а как применить ее на практике нет». В таких ситуациях можно очень долго биться головой о стену, но лучше не тратить время на vr-online | октябрь 201 0


60

Обзоры от VR-ONLINE

пустяки, а сразу взглянуть на готовое решение и уже на основе него сотворить свой вариант. Именно в таких ситуациях и будет полезна эта книга. Ее просто нужно положить на стол и применять в случае необходимости. Всем новичкам, которые только-только начинают осваивать CSS и хотят сотворить свой первый сайт я бы рекомендовал почитать в этой книге главу про блочную верстку страниц. Автор привел готовые шаблоны, которые используют многие webмастера и лучше сразу перенять этот правильный стиль. Заодно и избавиться от кучи мелких проблем, которые обязательно возникают у новичков. Сейчас я очень жалею, что этой книги у меня не было под рукой, когда я трудился над первым своим проектом. Может быть, мне и удалось бы сэкономить себе кучу нервов. Профессионалам в CSS я бы не рекомендовал покупать эту книгу. Им она вряд ли сможет дать что-то новое. Со всеми описанными в книге ситуациями, опытные верстальщики однозначно сталкивались и уже имеют свои проверенные решения. А если и не сталкивались, то уже знают в какую примерно нужно копать, чтобы найти решение и такая книга имя для этого не нужна. Меня очень порадовал перевод книги. Текст почти везде складный и «левых» слов практически замечено не было. Под левыми словами я подразумеваю неудачный вариант перевода английских слов. Сам знаешь, что есть много англоязычного сленга, который лучше не переводить. К тому же, в нашей стране многие такие слова прижились и без зазрения совести используем в речи англоязычный вариант. С этой книгой повезло, таких вещей было замечено совсем немного. Настолько немного, что я даже затрудняюсь вспомнить пример. Ну да ладно. Единственное, что меня очень расстроило – перевод заголовка книги. Ну скажите, какой умник придумал перевести “CSS Cookbok” как «CSS: Рецепты программирования»? Оставили бы уже просто «Рецепты» или «Поваренная книга» (правда, этот вариант совсем не звучит), но применение слова «Программирование» здесь совсем не в тему.

Наверное, редактор книги не знает, что CSS – это не язык программирования, а следовательно никаких рецептов программирования быть не может. Если ты решишься на покупку этой книги, то в момент заказа/приобретения обязательно обрати внимание на номер издания. Мне достался вариант второго издания, поэтому весь мой восторг и положительные эмоции направлены применительно к этой версии книги. Первое издания выходило намного раньше и скорей всего многие вопросы в нем попросту не рассмотрены. Будь внимателен! P.S. В самый последний момент сдачи этого номера я узнал, что в сентябре этого года вышло третье издание этой книги. Я его сам не видел, но тебе бы рекомендовал сразу заказывать его. Уверен, оно не хуже второго.

ИТОГИ: Полезность: 5/5 Стиль изложения: 5/5 Оформление материала: 4/5 Оправданность цены: 90%

Приобрести эту и многие другие книги ты можешь в интернет-магазинах Books.Ru и Ozon.RU.

vr-online | октябрь 201 0


Автор: Антонов aka Spider_NET Почта: Antonov.igor.khv@gmail.com

61

Nokia E71

Обзоры от VR-ONLINE обзор удобного коммуникатора

В мае этого года я решил найти замену для главного своего мобильного друга и товарища – коммуникатора. На этот серьезный шаг меня подвигло категорическое нежелание пользоваться тяжелой поделкой от компании Toshiba. Многие наши постоянные читатели знают, что вскоре вслед за Horrific'ом я купил себе Toshiba G900. Тогда мне казалось, что мне достался удобный и функциональный девайс. Главной его фичей было наличие полноценной выдвижной клавиатуры. Мне приходится достаточно часто писать различные тексты/отвечать на email, поэтому удобная клава была, чуть ли не основным критерием при выборе. Что ж, с клавиатурой я действительно не пролетел. У тоши она была хорошей и удобной, но все остальное… Не стану сейчас вдаваться в минусы G900, а сразу перейду к обзору девайса, который мне ее заменил. Почему Nokia E71 ?

Перед покупкой нового коммуникатора я долго присматривался. Опять же, основным критерием для меня был наличие удобной клавы и отсутствие тормозов. Постоянные ожидания загрузки меня достали еще в тошибе g900. Пробежавшись по доступным моделям (и подходящей мне цене) я остановился на нескольких моделях: Nokia E63, Nokia E71 и BlackBerry (модель уже не помню). Мой лучший друг Lord_of_fear несколькими месяцами ранее купил себе Nokia E63. Удобный, функциональный и недорого девайс (см. рисунок 1 ).

Мне в принципе в нем все понравилось: внешний вид, клавиатура, функциональные возможности. Смущал только корпус. Как и большинства телефонов, он пластиковый. Причем пластик достаточно тонкий. Одной из моих проблем в общении с телефонами всегда была неосторожность. Бывает гуляешь с собакой и одновременно пишешь sms. Песик дернулся резко и телефон уже на асфальте, с новыми царапинами. Мой предыдущий аппарат страдал этим очень часто. В результате, после года использования могло показаться, что телефоном я пользуюсь года эдак 2-3. Итак, к важным критериям у меня добавилось еще одно – металлический корпус. К моему счастью, оказалось, что модель E71 по функциям точно такая же как E63 только облачена в стильный железный корпус. Поюзав, в магазине E71 , я понял – это то, что я ищу! Пускай, за корпус пришлось переплатить (а также за некоторые ненужные функции), но покупкой я остался доволен.

Комплектация

Рисунок 1 . Nokia E63

Расплатившись с продавцом, мне торжественно (жаль без фанфар) вручили симпатичную коробочку с коммуникатором. Она была маленькой и без проблем вместилась в мой большой пакет. vr-online | октябрь 201 0


62

Обзоры от VR-ONLINE microSD. В настоящее время флешки этого формата одни из самых дешевых. За смешные деньги можно снабдить свой телефон громадным количеством места. Опять же, тут все зависит от потребностей. Лично мне, хватило и 2-х гигабайт. Покупать флешку большего объема для себя – смысла не вижу.

Дизайн/корпус

Дизайн коммуникатора строгий. Никаких блестящих финтифлюшек нет. По внешнему виду напоминает BlackBerry. Правда BlackBerry сразу же выделяется клавиатурой. Один из минусов Nokia E71 в плане юзабилити – слишком близкое Открыв коробку, я обнаружил следующие расположение кнопок клавиатуры друг к причиндалы: другу. Из-за этого, людям с большими 1 . Инструкция. Тут все в лучших традициях – пальцами юзать его будет однозначно несколько языков, картинки. Читай, не хочу! неудобно. В первые два дня я и сам умудрялся делать осечки, но потом привык и Только я ее так и не посмотрел. сейчас достаточно быстро печатаю даже на 2. Зарядка. Я очень люблю телефоны Nokia ходу. за универсальную зарядку. В отличие от младшей модели E63, у E71 3. Стерео гарнитура. кнопка включения коммуникатора находятся в верхней части корпуса (как и на 4. Чехол большинстве коммуникаторов). Лично мне 5. Флешка на 2 гигабайта. такое расположение этой кнопки очень нравится. 6. Дата кабель Набор достаточно полный и позволяет сразу Аккумулятор заюзать коммуникатор на всю катушку. На коммуникаторах этой серии достаточно Единственное, что немного огорчило хорошие аккумуляторы. Емкость идущей в гарнитура. Для разговоров ее более, чем комплекте батареи равна 1 500 мАч. На моем достаточно, а вот для прослушивания музыки предыдущем коммуникаторе батарея была это не лучший вариант. Точнее говоря, для точно такой же емкости, но зарядки едва качественного прослушивания музыки. Я хватало на один день активного плеер использую не сказать, что часто. использования девайса. Под активным Поэтому для того чтобы добраться до использованием я подразумеваю, работы и не уснуть от скуки в автобусе, мне и прослушивание плеера (примерно 2 часа в такие наушники сгодятся. день), звонки (около 30 минут), web-серфинг и т.д. Тошиба G900 меня в этом плане просто Особенно мне хочется отметить чехол, раздражала! Пролежав на зарядке всю ночь, входящий в комплект. Смотрится он очень она умудрялась садиться к 1 8-1 9 часам стильно и пользоваться им удобно. Хочу следующего дня. У Nokia E71 в этом плане заметить, что это не чехол в типичном все грамотно. Видно, что разработчики понимании. Это просто удобная сумочка (я потрудились на славу. Свой новый даже не знаю, как такого рода чехлы коммуникатор я юзаю еще активней, но называются). Я им пользовался с удовольствием, пока мой любимый песик не зарядке мне хватает на 3-4 дня. И это учитывая, что иногда я по несколько часов сделал из него себе завтрак. юзаю wi-fi. Флешки В качестве флешек, Nokia E71 дружит с

Встроенная камера

У Nokia E71 имеется встроенная 3.2 Mpix

vr-online | октябрь 201 0


63

Обзоры от VR-ONLINE камера. Опять же, хочется сразу сравнить с Toshiba G900. Да тут даже особо сравнивать нечего. Небо и земля! Качество фоток у E71 на порядок лучше. Фотки получаются достаточно яркими и насыщенными (само собой до уровня настоящего фотика им далеко). Тоже самое, можно сказать и про видеосъемку. Для любительских роликов, которые потом будут опубликованы на youtube, встроенной видео камеры хватит за глаза. Когда мы с Lord_Of_Fear поздравляли всех посетителей нашего сайта (делали видео обращения) с днем рождения проекта, видео мы снимали на мой коммуникатор (правда, перед загрузкой видео на youtube мы его не кисло сжали =)).

любое желание к использованию. Я сразу же заменил его на Opera mobile. На десктопе мне этот браузер не нравится, а вот мобильная версия просто шикарная. Помимо браузера можно заменить еще и плеер. Lord_of_fear нашел более продвинутый проигрыватель, но я его себе так и не поставил. Пока довольствуюсь стандартным. Уже говорил, что музыку слушаю мало, и для таких эпизодических моментов меня вполне устраивает стандартный плеер. Приятно порадовала программа, позволяющая создавать white/black листы на входящие звонки. Для выходных дней я предпочитаю создавать список «семья», в Качество звука который включены номера самых близких Здесь опять же, у Nokia E71 все в порядке. мне людей. Иногда только так возможно Телефон достаточно «громкий». Если избавится от лишних звонков, и насладиться выставить звук на максимум, то при общении покоем. аж начинает бить по ушам. У меня со слухом В Nokia E71 достаточно много полезного проблем нет, поэтому я сразу установил софта, но пользуюсь лишь малой его ползунок громкости на серединку. Опять же частью. Для моего lifestyle многие софтины в на моей Toshiba G900 с громкостью звука принципе не нужны, но некоторым они была проблема. Я его постоянно держал на обязательно придутся по душе. максимально возможной громкости, но и Для кого этот коммуникатор этого было мало. Особенно проблема проявлялась во время поездок в Я думаю, что этот девайс придется в первую общественном транспорте. очередь по душе тем, кто юзает телефон для работы. Например: набор текста, отправка Программная начинка email, web-серфинг. С этим задачами E71 Как и подобает большинству справляется на ура и создается ощущение коммуникаторов/смартфонов от Nokia, E71 (во всяком случае, у меня), что вроде работает под управлением Symbian OS. больше ничего и не нужно. Однако, тем, кто Используется версия 9.2. До этого у меня не привык совмещать работу с развлечениями, было опыта работы с Symbian, поэтому я бы не рекомендовал покупать этот сказать что-либо плохое или хорошее про телефон. Мультимедийные возможности у предыдущие версии я не могу. Та, которая него стандартные и уступают телефонам, установлена на моем коммуникаторе меня которые специально затачивались под полностью устраивает. Работает шустро и мультимедию. крайне редко зависает (за полгода Заключение использования, зависал 2-3 раза). Сегодня Nokia E71 является устаревшей Из предустановленного программного моделью. Недавно компания Nokia обновила обеспечения, в Nokia E71 есть все необходимое: файловый менеджер, медиа- свой модельный ряд серии E. Если ты проигрыватель (mp3, mp4, wav, wmv), флэш- решишься покупать новый коммуникатор, то я конечно рекомендую тебе присмотреться к проигрыватель, офисный пакет, интернетновинкам, но если вдруг тебе случайно браузер и т.д. Как говориться: «Включай и перепадет E71 , то будет уверен, для работы начинай работать». Часть софта конечно тебе его будет более, чем достаточно. лучше сразу заменить, на более продвинутые аналоги. Например, стандартный web-браузер сразу отбивает vr-online | октябрь 201 0


Автор: Овчинников Михаил aka Night_Storm Сайт: http://imsogeek.tumblr.com

64

Обзоры от VR-ONLINE

"Nobility NH92"

Обзор внешнего жесткого диска

Когда 1 00 Гб винчестера моего ноутбука заполнились с ужасающей быстротой, встал вопрос о покупке внешнего винчестера, призванного бережно хранить в себе сотни гигабайт медиа-файлов. Результатом поисков и раздумий стал маленький симпатичный кореец Nobility NH92, изготовленный фирмой A-Data. Комплектация.

Чем меня привлек этот продукт, так это дизайном. Устройство было упаковано в компактную, стильную коробку из прозрачного пластика. После вскрытия упаковки там обнаружились: сам винчестер, чехол из кожи (возможно даже натуральной, не очень в этом разбираюсь, но на ощупь приятно) и Y-образный USB-кабель. Никакой инструкции и драйверов в коробке не обнаружилось. На упаковке производитель клялся, что все необходимое есть у него на сайте (включая программу для шифрования данных), но зайдя туда, я обнаружил только драйвера для Windows 98. Возможно, сначала требуется зарегистрировать устройство на сайте, а затем только вам предоставится

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

Внешний вид.

Герой нашего обзора выполнен в формфакторе 2.5”, имеет физические размеры 11 4х75х1 2мм, и выглядит очень стильно. Даже если вы являетесь счастливым обладателем продукции Apple, то это устройство не ударит по стилю, и не будет выделяться из общей обстановки. Корпус сделан из метала, окрашен в синий цвет (так же доступны светло-серый и розовый) и имеет радиальный, рельефный рисунок. Сбоку имеется разъем мини-usb для подключения к компьютеру. Сверху расположен синий светодиодный индикатор vr-online | октябрь 201 0


65

Обзоры от VR-ONLINE Подключение и работа.

При подключении к компьютеру на винчестере загорается синий индикатор. Windows без проблем определила его и установила. У меня модель с 500 Гб памяти на борту (имеются также еще разновидности: на 250, 320 и 640 Гб) При работе едва ощутимо вибрирует и практически не гудит (чтобы услышать гул, нужно приложить к нему ухо). Если он лежит у тебя на столе без чехла, то ты будешь ощущать маленький «зуд», в чехле же ведет работы. Снизу имеются маленькие себя смирно. Пробовал отключить резиновые «ножки». Сборка хорошая, без вспомогательный usb-штекер (занимать люфтов. Но при нагреве один «уголок» целых 2 разъема на ноутбуке – деформируется и немного «ходит», внешне непозволительная роскошь) – все работает, этого не видно, но если надавить пальцем, как часы, без неприятностей. то становится заметно. Для меня это не Теперь давайте посмотрим показатели. Aкритично. data обещали нам скорость больше 30 Мб/с, Корпус довольно маркий и легко царапается, но на практике, как видите не все так поэтому прилагающийся чехол - это совсем радужно: не приятная мелочь, а суровая необходимость. Очень хорошо, что разработчики это поняли. В чехле винчестер смотрится несколько громоздко, но это совершенно не бьет по имиджу. Чехол мягкий, приятный на ощупь. Мне приходилось пару раз ронять винчестер, и, благодаря чехлу, он пережил эти падения без последствий.

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

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

Итог.

За небольшую сумму (~1 00$) я получил весьма добротного и стильного помощника. Покупкой своей вполне доволен. Хотелось бы чуть большей скорости чтения и большей длины usb-кабеля, но это - скорее придирки. Так что, когда столкнетесь с выбором внешнего винчестера, рекомендую приглядеться к данной модели.Текст статьи vr-online | октябрь 201 0


Автор: Роман Девятов aka batar Почта:batar27@gmail.com

66

Android

Без рамки

10 самых необходимых приложений для Android

Android стремительно развивается и вместе с ним растет количество приложений. Сейчас в Android Market их уже больше 1 00 тысяч. Выбрать из такого обилия программ лучшие сложно. Тем более если ты только недавно стал счастливым обладателем Android-смартфона. В этом обзоре я хочу рассказать тебе про самый необходимый софт, который может тебе на коммуникаторе. Итак, поехали! Advanced Task Manager

Пожалуй, одно из самых необходимых приложений на Android – менеджер задач. Зачастую бывает, что в памяти висит какаянибудь программа, которая не нужна там в данный момент. Выгрузить ее средствами ОС не получится. Тут и приходит на помощь Advanced Task Manager. Тем более он может не только завершать фоновые приложения. Это целый центр по работе с приложениями. Advanced Task Manager удаляет, переносит на SD карту и делает резервные копии приложений. Так же можно посмотреть, на что уходит заряд аккумулятора.

монстр на фоне других. ASTRO File Manager умеет делать backup приложений, поддерживает ярлыки и zip архивы. Плюс ко всему он совершенно бесплатен.

Apktor

ASTRO File Manager

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

Apktor – альтернатива Market'a, клиент для репозиториев с Android приложенияи. Через такие репозитории в основном распространяют платные приложения бесплатно. Можно конечно скачивать на компьютер apk файлы и устанавливать их через ASTRO File Manager, но это, неудобно. Гораздо удобнее без лишних манипуляций скачать и установить необходимую программу прямо на телефоне.

Dolphin browser HD

Многим может показаться, что у стандартного браузера Android не достаточно функций или он не удобный. Я считаю, что в стандартном браузере неудобно vr-online | октябрь 201 0


67

Без рамки

пользоваться закладками и переключаться между открытыми вкладками. В Dolphin browser HD реализован легкий доступ к закладкам и переключение между вкладками, им можно управлять жестами и самое главное он поддерживает дополнения.

картах сможешь посмотреть только снимок города со спутника. То есть там не отмечено улиц и домов. Тут помогают Яндекс.Карты. Мало того что в них отмечены все дома и улицы, там есть информация о пробках и навигация с использованием GPS. И самое главное: трафик карт для абонентов Мегафон по всей России – бесплатен!

My settings

My settings – бесплатная программа для быстрой настройки часто-используемых параметров Android. MySettings умеет: - менять режим звонка - менять уровень яркости - включать/выключать Wi-Fi, GPS, Bluetooth и режим «В самолете» - включать/выключать авто-поворот экрана и авто-синхронизацию - отображение количества памяти на SDкарте и внутренней памяти, а также уровень аккумулятора в процентах - для быстрого доступа к программе, MySettings можно добавить в панель уведомлений - также можно одним нажатием отключать ключ разблокировки, если вы его используется, а также настроить время выключения телефона при бездействии. Скачать программу можно на Android Market. Программа бесплатная и имеет русский интерфейс (он включается, только если у тебя русская локаль).

Яндекс.Карты

AudioManager Widget

AudioManager Widget - небольшой виджет для регулировки громкости шести главных функций: звонки, уведомления, будильники, мультимедиа, системные звуки, громкость абонента при разговоре. Очень удобен он тем, что можно уменьшить звук мультимедиа (который используется в играх). Да и не только этим. Но мне он больше всего понравился именно за это. Поначалу частенько попадался в институте, когда отключив звук звонка, я запускал игрушку и она «орала» на всю аудиторию.

Chrome to Phone

Если ты юзаешь в качества браузера Google Если ты живешь как я в Хабаровске, то в гугл Chrome, то ты однозначно оценишь это vr-online | октябрь 201 0


68

Без рамки приложение. Для работы приложения на твоем браузере должно быть установлено одноименное расширение. В этом расширении и в программе на телефоне, ты должен быть залогинен на один и тот же аккаунт google. Как это работает? Представь, что ты лазаешь по интернету и наткнулся на интересную статью, а читать ее некогда. Нужно срочно ехать на работу. В таких неприятных ситуациях, тебе достаточно нажать на значок расширения в браузере и ссылка на эту статью приходит тебе на телефон в виде уведомления.

восстановления бэкапа сделанного Titanium Backup не останется ничего, что не восстановится. Восстанавливается все вплоть до настроек системы и расположения гаджетов на рабочем столе.

RockPlayer

RockPlayer – это видео плеер. Ты можешь спросить, зачем мне еще один видео плеер? Ведь в Android уже есть неплохой стандартный. Но дело в том, что стандартный плеер воспроизводит только конвертированное видео. RockPlayer воспроизводит видео практически любых форматов и размеров (лишь бы хватило мощности телефона). Должен сказать делает он это неплохо. Если не хочешь мучиться с конвертацией, обязательно поставь себе RockPlayer.

Хорошего помаленьку

Вот и закончился список из 1 0 программ, с которыми жизнь на Android становится «сказкой». Это сугубо мое мнение и никто не заставляет тебя пользоваться именно этими приложениями. Для многих из этого списка есть хорошие альтернативы. Устанавливай, тестируй и выбирай то, что больше всего понравится.

Titanium Backup

Как видно из названия это программа для создания бэкапов. Выше я уже описывал приложения, которые умеют это делать. Но это программа «король» бэкапа. Она умеет создавать резервные копии буквально всего. Бэкапит: приложения (и их данные), системные приложения (и их данные), сервисы (и их данные), неинсталлированные приложения, смс/ммс, контакты. Умеет записывать приложения в БД маркета, делать бэкап по расписанию. После vr-online | октябрь 201 0


Автор: Jimmy Jonezz Почта: jimmyjonezz@bk.ru

69

Badа

Без рамки

Краткий обзор мобильной платформы от компании Samsung

Интересно наблюдать за «движением» рынка мобильных платформ и операционных систем, участники которой ведут себя довольно разно – некоторые заслуженно находятся в первых строчках популярности «зрительских симпатий», другие же обживают последние места и их имена редко, где проскакивают. По большей части, это - наша с Вами заслуга и заслуга (читай упущения – прим. автора) тех компаний, что продвигают свои разработки. Но не будем вдаваться во все премудрости экономики, и нагружать себя ненужными цифрами и расчетами. Разговор пойдет совсем о другом. Не многие из нас с Вами, частых завсегдатаев различных форумов, сайтов, блогов и других информационных ресурсов, посвященных компьютерной тематике, знают о том, что прошел ровно год с того момента, когда компания Samsung Electronics, впервые анонсировала платформу для мобильных устройств, под названием “Bada”. За основу Bada, была взята платформа SHP (Samsung Hand-Held Platform), давшая начальный виток в развитии сегмента сенсорных телефонов, впервые представленная в Samsung S8000 Jet и Samsung S5230 Star. Под массивным натиском таких гигантов, как Android, iOS, Maemo, особого внимания к себе Bada не получила, хотя все предпосылки к этому есть, но не будем забегать вперед. В отличие от платформы SHP, Bada является открытой, это обусловлено наличием SDK, который был представлен общественности совсем недавно. Плюс к этому: выход нового мобильного коммуникатора Wave 525 (Star S5230 образца 201 0 года – прим. автора) ознаменовал новый шаг в развитии платформы Bada. Можно выделить следующие моменты, которые наиболее отчетливо бросаются в глаза: 1 . Появление открытого API. 2. Возможность установки native-приложений

(приложения, разрабатываемые непосредственно под платформу, с использованием SDK от производителя). 3. Магазин приложений. 4. Использование Touchwiz 3.0 (дает большие возможности по настройке интерфейса, настройке меню по собственному усмотрению, а так же изменению элементов основного экрана). 5. Тестирование приложения с помощью RTL — возможность использования удаленной лаборатории тестирования, позволяющая устанавливать и тестировать приложения на устройствах Samsung через интернет. Если Вы являетесь членом сайта разработчиков Bada, то имеете бесплатный доступ RTL (вне зависимости от статуса), но с небольшой оговоркой - чтобы обеспечить доступность сервиса как можно большему числу людей, используется определенная система кредитов для бронирования времени. Bada – эта мобильная платформа открытого типа. Платформа имеет многоуровневую архитектуру. Слой операционной системы является нижним, а вышележащие уровни используют его функции для доступа к аппаратуре, ее архитектуру можно условно разделить на 4 уровня: Kernel, Device, Service, Framework. vr-online | октябрь 201 0


70

Без рамки в качестве которого ранее выступала Javaмашины, важно отметить, что Bada обеспечивает поддержку многозадачности и доступ программ ко всем функциям платформы. Обобщая все вышесказанное, интересным моментом является то, что компания создает платформу сразу для нескольких ОС, т.е. делает разработку приложений привязанных не к отдельно взятой ОС, а к своим наработкам в области интерфейса и функциональности телефона. Благодаря этому, компания имеет возможность в краткие сроки выводить на рынок телефоны, а также, существенно быстро адаптировать существующие программные решения, но без сторонних разработчиков для платформы Bada определенной доли успеха не бывать. Опять же повторюсь. Имея на руках SDK, разработчик сможет писать полнофункциональные программы, задействующие не только интерфейс, но и другие возможности телефона (не затрагивая ОС, лежащую в его основе). Именно поэтому, за счет поддержки различных ядер и модульной архитектуры, платформа Bada может работать на различных телефонах – от простых и доступных (на которых невозможно использование других платформ из-за минимальных системных требований), до наиболее функциональных и дорогих устройств. В любом случае наличие конкуренции - это основной плюс в развитии рынка мобильных платформ, не зависимо от того, кто лидирует в списке «зрительских симпатий». Пожалуй, на этом, можно закруглиться, и напоследок я хочу напомнить, что мы всегда открыты для ваших предложений и пожеланий. Все свои вопросы, нарекания, предложения и другие идеи смело присылай мне или на форум нашего сайта.

1 . Kernel – это ядро. На данный момент обеспечивается поддержка нескольких вариантов ядер – Linux и несколько ядер систем реального времени (RTOS), например, сюда можно отнести Nucleus и REX, конкретный выбор зависит от того, какая в данном случае используется аппаратная платформа. 2. Device – второй уровень, на котором реализованы основные функции аппаратной платформы и ядра ОС: графика, мультимедиа, коммуникации, основы UI, телефония, протоколы передачи данных. Его можно выделить как некий промежуточный уровень (middleware) между ядром ОС и более высокими уровнями, необходимый для трансляции аппаратно зависимых функции в открытые API и аппаратно независимые программные компоненты. 3. Service – третий уровень, в котором происходит реализация функций и onlineсервисов (на данном уровне происходит взаимодействие с Bada Service Server). Например, сюда можно отнести онлайн игры, социальные сети, веб-приложения, LBSприложения (определение местоположения пользователя, навигация), а Bada Service Server, в свою очередь является неким шлюзом, являющимся связным звеном ряда других сервисов. 4. Framework. Этот уровень обеспечивает поддержку открытых API и функций на C++, Полезные ссылки: наследуемых из предыдущих слоев. Это своего рода каркас приложений, Официальный сайт платформы Bada: http://bada.com предоставляющий пользователям доступ к установке native-приложений (приложений, Сайт для разработчиков: developer.bada.com разработанных специально под платформу Bada). Программы в среде bada Демонстрация возможностей Touchwiz 3.0: http://www.youtube.com/v/qRM5bf35yqs выполняются без использования промежуточного программного обеспечения,

vr-online | октябрь 201 0


Автор: Показаньев Максим Почта: m_pokazanev@mail.ru

71

Без рамки

Как Интернет влияет на жизнь? Какие тайны скрывает Интернет и как он влияет на нас...

Тридцать лет назад, 20 октября 1 969 года, профессор Леонард Клейнрок из Калифорнийского университета в Лос-Анджелесе связался с компьютером исследовательского центра в Стэнфорде и передал первое в истории электронное послание. Послание собственно и не было письмом. Клейнрок пытался зайти со своего компьютера на компьютер, стоящий в Стэнфорде. Для этого последний должен был получить команду LOG. Текст послания был такой: "LO" (на букве "G" система дала сбой). Компьютерная сеть, выросшая спустя некоторое время из этой попытки связать две машины между собой, называлась ARPAnet и была организована американским правительственным исследовательским агентством (Advanced Research Projects Agency).

паутине была изображена пародийная филк- группа Les Horribles Cernettes. В наши дни Интернет – это уже как микроволновка, т.е. есть почти в каждом доме. Кроме конечно тех квартир, в которых ворчливые бабули греют до сих пор всё на плите. Но так ли это хорошо, как кажется? В этом мы с тобой сейчас и разберёмся. Телевидение и интернет: «Аналогия». Если смотря телевизор, мы как бы просто считываем мощный поток информации, т.е. по сути являемся «пассивным пользователем» (пока что ТВ не так далеко ушло), то пользуясь интернетом получаем «свободу» информации, становимся «активными пользователями». И находясь в состоянии этой «свободы» мы постоянно должны выбирать, просматривать, поглощать, поглощать, поглощать миллионы бит информации.

Что есть «свобода»

Впрочем, по мнению некоторых экспертов, днем рождения Интернета на самом деле является не 20 октября, а 2 сентября, когда профессор Клейнрок и его команда подсоединили свой компьютер к коммутирующему устройству (switch). Эта дата считается более важной, поскольку установка связи между компьютерами невозможна без предварительного подключения их к коммутатору.

Интересный факт

На первой фотографии во Всемирной

Интернет стал источником, через который террористы организовывают теракты. Посредством него продают наркотики и детей. В Интернете есть пристанища тысяч извращенцев и психически неполноценных личностей. Свобода!!! И все ринулись туда, но что есть «свобода»? Более 54% пользователей Интернета в США и Канаде уверены, что сеть оказывает положительное влияние на их жизнь, но 22% ощущают негативное влияние Интернета. А вот сейчас мы попытаемся выяснить, что в этом «огромном звере» плохого и хорошего. Так сказать взвесим все «за» и «против». vr-online | октябрь 201 0


72

Без рамки Положительные черты влияния Интернета на человека В чём же плюсы? • Заработок в сети, поиск работы. Реально плюс, много моих знакомых программистов, зарабатывают не малые деньги в интернете. А если тебе, наоборот, по душе не сидеть дома, а работать где-нибудь в офисе (или просто по твоей специальности нет возможности работать через интернет), то пожалуйста, в сети есть сотни сайтов поиска работы. • Возможность оплаты, заказа многих услуг через интернет. Ну не в радость ли нам, дорогие товарищи, не выходя из дома, не простаивая в пробках, потом очередях оплатить какую-либо услугу. Заказать книгу в интернет-магазине, не смотря на то, что в твоём городе она не продаётся. Сейчас уже большинство покупок можно совершать в интернете. • Проявить, показать себя миру. Размести свою страничку в сети, написанные программы, комментируй статьи на форумах, высказывай своё мнение, и тебя обязательно заметят! • Общайся с людьми, найди старых друзей, одноклассников, говори бесплатно по Skype. • в Интернете можно всегда получить самые свежие новости на любую тему.

• Клубы самоубийц. • Клубы наркоманов. • Клубы, обучающие начинающих террористов. • Клубы извращенцев. И многое-многое такое… В таких клубах можно заказать собственную смерть, обучится правильно подбирать и колоть наркотики. А что такого? Ведь тут всё можно и ничего тебе за это не будет. В интернете полно порнографии, да даже дело не в том, что просто порнографии (классические эротические фильмы, которые можно купить в магазине), а именно извращенной. Пожалуйста, смотри, хоть тебе 50 лет, хоть 1 5. Уверен, что существуют такие «парни», которые и подключают интернет, чтобы лазить по таким сайтам. Откуда потом и берутся маньяки, да и просто отморозки. Особенно если учесть что смотрят дети, ведь детский мозг впитывает всё как «губка». Хотя разговор про детей, это конечно всё зависит от родителей, тут не полная вина интернета. Многие «задроты» - люди, которые проводят большинство времени либо за онлайниграми, либо просто в сети имеют трудность в общении в реальности, низкую самооценку, застенчивость. Так и хочется сказать такому: «Иди в чат, представься, кем угодно и выскажи всё что И это только основные плюсы. Потребности думаешь…», так как нормального разговора и запросы Интернет-юзеров самые разные. с ним не получается. Такие люди чувствуют себя в интернете, как в безопасной среде, ни Одни хотят раздобыть новое программное к чему их не обязывающей. В этом есть своя обеспечение. Другие ищут те или иные правда - никто не «даст тебе в глаз» по документы, необходимые им для интернету. У меня есть подозрение, что вот профессиональной деятельности. Третьи эти новые субкультуры типа «ЭМО» и других подключаются к сети, чтобы получать электронную почту. Интернет помогает всем. появляются зачастую за счёт интернета, и это IMHO не есть хорошо. Интернет это здорово!!! Отрицательные черты влияния Интернета на Если зрение, слух могут испортиться посредством клавиатуры, "мыши" или человека монитора, то на психику в первую очередь Интернет дает иллюзию. Да, именно влияют более, так сказать, виртуальные иллюзию вседозволенности. Тут и вещи - игры и интернет. Это то что проявляются (возможно, даже создаётся) "затягивает", то, от чего невозможно испорченность человеческой сущности. Как оторваться, то, без чего многие больше не говорится, всё вылезает наружу. представляют своей жизни - это маниакальная зависимость от интернета или В интернете существуют: от игр. vr-online | октябрь 201 0


73

Без рамки (по итогам исследований в Америке). А знаешь, что самое интересное? Опасные сигналы» я замечаю у себя. Значит ли это, что я становлюсь зависимым? Вредно ли это? Стоит ли мне бояться? Вот что тебе скажет «старый могучий бобёр». Не секрет, что в городах вредно дышать, современная пища в целом вредна, поздно ложится и рано вставать (не выспавшись) Вот какие психологические симптомы может тоже вредно. Учиться в университете по статистике тоже вредно (для здоровья), начать испытывать человек, если он вывод: «Жить вредно, и тогда зачем эти относится к группе риска интернетисследования по поводу вредности зависимых людей (версия психологов): интернета»? • хорошее самочувствие или эйфория за Надо знать всему меру. Всегда есть золотая компьютером; середина. Раздражают эти "новости" от этих • невозможность остановиться; "академиков"? Рассеян он стал, пусть «об стену теперь убьется в панике»! По-моему • увеличение количества времени, эти новости, которыми нас заваливают, проводимого за компьютером; нужны чтобы держать нас в страхе (сам • пренебрежение семьей и друзьями; вдумайся), а людьми в страхе проще управлять. Но они кое-что упустили, нас • ощущения пустоты, депрессии, этим не напугать, «пуганные» уже. Не надо раздражения не за компьютером; бояться, что жизнь закончится, надо бояться, • ложь работодателям или членам семьи о что она не начнётся. своей деятельности; Недавно показывали по телевизору, что • проблемы с работой или учебой; одному школьнику запретили компьютер, так как он от него не отходил. Так он убил родителей. Когда его забирали, то его Собственно все эти симптомы ты можешь интересовал один вопрос, будет ли там встретить и у людей с любой другой компьютер. Вот что страшно. зависимостью, будь то алкоголь, наркотики Интернет делает людей более ленивыми (в или работа. Со временем, если не общей массе, везде есть исключение) и в предпринять никаких мер, состояние тоже время открывает массу возможностей зависимых усугубляется, превращаясь в для саморазвития и манию. самосовершенствования, а тупым человек Опасными сигналами являются также: становится исключительно по своей воле. • навязчивое стремление постоянно Хочу сформулировать и конкретизировать проверять электронную почту; свою точку зрения: У человека всегда есть • предвкушение следующего сеанса онлайн; выбор. И в большинстве случаев он сам • увеличение времени, проводимого онлайн; решает, что хорошо для него, что как на нём отразится, чего он хочет от этого получить... • увеличение количества денег, расходуемых Не судите строго. Ведь вы не можете судить онлайн. меня, так как и сами в глубине души со мной Чаще всего отмечали негативное влияние согласны, раз читаете это. Не интернет Интернета на состояние рук и пальцев, на делает нас бестолковыми, а мы делаем режим сна, зрение. Интересно, что жалобы интернет бестолковым... на вредное влияние Интернета значительно чаще высказывали женщины, чем мужчины vr-online | октябрь 201 0


Автор: Роман Костенко aka Lord_of_fear Почта: kostenko.r.khv@gmail.com

74

Без рамки

Винт с турбонаддувом Нужен ли Raid для дома?

Категорически тебя приветствую! Давно уже убедился, что люди при покупке нового компьютера гонятся за четырьмя ядрами процессора и гигабайтами оперативной памяти. Но большинство не в курсе, что узким местом в плане производительности был и остаётся жесткий диск. Механика… Стоит нагрузить винт записью, скажем, новенького фильма, как сразу становится проблематичным даже запуск любимого браузера. Выход из такой ситуации напрашивается один: нужно увеличить производительность дисковой подсистемы. В этой статье я постараюсь дать ответ на вопрос: “А нужен ли Raid0 массив для дома?”. Что же такое RAID массив?

RAID - массив из нескольких жестких дисков, управляемых контроллером, и воспринимаемых операционной системой как единое целое. В зависимости от типа используемого массива может обеспечивать различные степени отказоустойчивости и быстродействия. Служит для повышения надёжности хранения данных и/или для повышения скорости чтения/записи информации. Не буду тебя грузить подробностями. Только лишь скажу, что наиболее распространены два вида массивов: RAID 0 - скоростной неотказоустойчивый дисковый массив. Два или более HDD одновременно выполняют операции чтения и записи, тем самым увеличивая быстродействие. Но если выходит из строя один жесткий диск, то все данные со всех жестких дисков безвозвратно теряются. RAID 1 - зеркальный дисковый массив. Отказоустойчивый массив. Все диски содержат точные копии данных, хранящихся на первом винте. Производительность как у одиночного жесткого диска. Может проще купить один винт помощнее? Мне поначалу тоже приходила такая же мысль в голову. Western Digital Velociraptor со скоростью вращения шпинделя в 1 0000 оборотов в минуту – весьма достойный претендент. Однако после просмотра

результатов тестов “WD Raptor против RAID0” я понял, что это – не выход. Raptor имеет огромное преимущество – высокая скорость доступа к жесткому диску (Access time). Т.е. он в 1 ,5 – 1 ,8 раза быстрее приступает к операции чтения/записи, чем обычный винт на 7200 оборотов. Однако, уже находясь в процессе чтения/записи, Раптор полностью проигрывает по производительности RAID0, постороенному на жестких дисках серии Caviar от того же Western Digital. Минус WD Velociraptor – его цена. Если не вдаваться в подробности, то цена за 1 гигабайт Raptor’а сегодня примерно в шесть раз выше, чем на гигабайт жесткого диска на 7200 оборотов. Очень дорого! Вывод: на фига козе баян? :) Намного проще купить 2 винта на 7200 и объединить их в скоростной рейд, ведь превосходство Раптора над RAID0 весьма сомнительно…

Как будем тестить?

Тест будет происходить на двух конфигурациях ПК. Первая конфа – достаточно уже старенькая (честно говоря, это – мой комп. :) ). Вторая – новый комп Spider_NET’а. RAID0 будет собираться из двух одинаковых жестких дисков от Western Digital самого низкого ценового диапазона. Сначала будет тестироваться производительность одиночного жесткого диска, а затем двух в RAID’е. В качестве vr-online | октябрь 201 0


75

Без рамки Процессор: Intel Core i5-760 2.80GHz Оперативная память: две планки Hynix DIMM Конфигурация 1 DDR3 2048MB PC1 0666 1 333Mhz Мат. плата: Asus M2N-SLI SocketAM2 Жесткий диск: два винта Western Digital SataПроцессор: AMD Athlon 64 X2 6000+ II 320Gb 7200rpm Cache 1 6Mb Оперативная память: две планки Hynix DIMM Блок питания: Hiper 450W DDR2 1 024MB PC6400 800Mhz Жесткий диск: два винта Western Digital Sata- Операционная система: MS Windows 7 Home Premium x64 II 250Gb 7200rpm Cache 8Mb Материнки от Asus хороши тем, что они на Блок питания: FSP 450W борту уже несут RAID-контроллер. Т.е. для Операционная система: MS Windows 7 Home поднятия RAID’а нужно лишь докупить Premium x86 нужное количество винтов. Конфигурация 2 Таким образом, в тесте участвуют 2 разные модели жестких дисков: Мат. плата: Asus P7P55 LGA11 56 бенчмарка я выбрал CrystalDiskMark.

Жесткий диск SATA-II 250Gb Western Digital Caviar Blue 7200rpm Cache 8MB

Жесткий диск SATA-II 320Gb Western Digital Caviar Blue 7200rpm Cache 1 6MB

Если вдруг ты не знаком с CrystalDiskMark, то дам несколько пояснений. Первая строка – это результаты последовательного чтения и последовательной записи. Остальные строки – результаты рандомного чтения/записи блоками разного размера.

Вердикт.

Результаты теста говорят сами за себя. Прирост в производительности последовательного чтения/записи составляет порядка 80 процентов. А это – очень хороший показатель. Однако синтетические тесты – одно. А повседневная vr-online | октябрь 201 0


76

Без рамки Конфигурация 1 . Один жесткий диск

Конфигурация 1 . Два жестких диска в RAID0

Конфигурация 2. Один жесткий диск

Конфигурация 2. Два жестких диска в RAID0

эксплуатация – совсем другое. Из личного опыта скажу, что значительно уменьшилось время установки и запуска “тяжёлых” приложений. При этом стал возможен запуск приложений при большой нагрузке на дисковую подсистему. Например, при записи больших объемов данных Raid0 массив значительно лучше реагирует на запуск каких-либо приложений. Конечно же, запускается всё с небольшим тормозком, но

в принципе времени требуется немного. Пробовал провести аналогичные тесты с PCI RAID контроллером от Gembird. Хз что за модель. Не написано. Был куплен в магазине за 450 рублей. RAID0, построенный с его помощью, получился полным отстоем. Никакого прироста производительности не наблюдалось как по тестам, так и во время эксплуатации. Вот что выдал бенчмарк:

Показатели RAID0 массива, построенном на PCI RAID контроллере от Gembird с использованием двух HDD Western Digital Sata-II 250Gb 7200rpm Cache 8Mb

Абсолютно невнятные результаты теста. Производительность только уменьшилась. Не советую использовать такие контроллеры для поднятия скоростного рейда. Зеркальный же RAID работает на нём очень хорошо. В заключении хочу сказать, что покупка ещё одного винта за полторы тысячи рубликов и поднятие RAID массива под ОС – весьма достойное решение. Мало затратно и эффективно. Это – моё мнение. А прислушаться к нему или нет, решать уже тебе. На этом всё. Спасибо за внимание.. :) vr-online | октябрь 201 0


Автор: paveldev2k Почта: paveldev2k@gmail.com

77

Бизнес­процессы

Без рамки

Что такое бизнес­процессы и зачем они нужны?

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

современному бизнесу уже не нужно простое разделение – ему нужны наборы В первой статье из предлагаемой серии я операций, которые создают конечный познакомлю тебя с тем, что такое бизнеспродукт. Грубо говоря – последовательность процессы, где они используются и какую таких наборов операций и называется пользу могут принести владельцам фирм и ИТ-специалистам (которые интересуют нас в бизнес-процессом. большей степени). В конце статьи приведу Если обратиться к Википедия, то можно результаты небольшого опроса про бизнес- познакомимся с более точным процессы, сделанного мной среди определением: программистов (или людей, который «Бизнес-процесс — это последовательность непосредственно с этим связанными). взаимосвязанных активностей или задач, которые приводят к созданию определенного продукта или За время подготовки данного материала я услуги для потребителей». узнал много интересного про бизнеспроцессы, познакомился со многими (иногда Действительно – смысл любой организации в том, чтобы предоставить (а чаще всего – немного отличающимися друг от друга) продать) результат своей работы. С определениями и трактовками. Поэтому – ниже приведу вывод из всего того, что я за помощью бизнес-процессов можно наглядным образом показать, какими это время прочитал. действиями организация добивается Бизнес-процессы конечного результата. Условно, бизнес-процесс можно представить следующим образом: какое-то действие (часто называют "функцией"), на "вход" которого поступают один или несколько ресурсов, которые обрабатываются на основе "правил" каким-либо "механизмом" (персоналом предприятия, компьютером, инструментом). В результате чего - на "выходе" создается продукт, который "необходим" потребителям. Если познакомится со стандартом ГОСТ Р Если вспомнить (интернет в помощь) этапы ИСО 9000 2000 (Системы менеджмента качества. Основные положения и словарь), развития экономики в XVIII веке и труды то там есть еще более точное определение: Адама Смита, мы узнаем, что он «процесс - совокупность взаимосвязанных или пропагандировал разделение труда. Но vr-online | октябрь 201 0


78

Без рамки взаимодействующих видов деятельности, преобразующих входы в выходы»

предприятиях (а с этими функциями еще нужно познакомиться). Если организация полностью поддерживает процессный подход – то, как уже было сказано, знакомство с ее деятельностью не займет много времени (все наглядно представлено в виде блок-схем).

Простота создания плана модернизации

Одним из самых популярных методов моделирования бизнес-процессов (с целью их модернизации) является двухэтапный метод: сначала создается описание «как есть» (AS-IS) – то есть, с помощью блоксхем описываются те функции и Зачем нужны бизнес-процессы взаимосвязи, которые в данный момент Итак, с определением бизнес-процесса мы протекают в организации. На основе этого познакомились. Теперь давайте разберемся описания выделяются недостатки нынешней с тем, зачем нам могут понадобиться бизнеспроцессы? В любых организациях протекают модели – и создается улучшенная модель множество процессов (в одних – больше, в бизнес-процессов «как должно быть» (TOBE), в которой устраняются недостатки, других - меньше). Часто бывает так, что выходы одного процесса являются входами которые были в первой модели. Чаще всего, для другого. Поэтому, если мы будем точно этого добиваются с помощью введения информационных систем (ИС), знать, какие у нас бизнес-процессы выполняющих большую часть функций. ИС происходят в организации, как они друг с также отображают на улучшенной модели другом связаны, кем выполняются и с TO-BE. Именно этот пункт нас и будет помощью чего управляются – то мы сразу же интересовать в большей степени. представим себе, структуру организации и все ее достоинства и недостатки. Именно Легкость проектирования ИС на основе такой подход («процессный подход») лежит в плана модернизации основе современной теории управления. Итак, ИТ-специалист уже четко знает, как в Но чем может помочь процессный подход данный момент функционирует организация, ИТ-специалисту (в принципе – любому какие в ней процессы протекают, специалисту)? Я условно разделил все каким образом друг с другом достоинства процессного подхода на три взаимодействуют, а также – у него есть части (на самом деле их больше, но улучшенная модель этих бизнес-процессов. остановимся на этом): Теперь ему необходимо разработать * Быстрое знакомство информационную систему, которая будет * Простота создания плана модернизации реализовывать основные функции улучшенного плана. Так как у нас уже все * Легкость проектирования ИС на основе функции нашей ИС описаны (в улучшенной плана модернизации модели) – то первый пункт проектирования этой ИС уже проведен – функционал *Быстрое знакомство* системы определен – что сильно упрощает Как всем известно, сейчас автоматизация широко шагает по нашей стране, заглядывая жизнь ИТ-специалисту. Подводим итоги уже во все ее уголки. Поэтому – работы у ИТ-специалистов в организациях Итак, на вопросы «что такое бизнесприбавляется; грубо говоря – им нужно процессы» и «зачем они нужны» - ответы создавать системы, которые будут были получены (надеюсь – все было автоматизировать все больше и больше понятно). Ответы получены такие, какими их функций, которые протекают на их видит автор данной статьи, ты можешь их vr-online | октябрь 201 0


79

Без рамки либо принять, либо опровергнуть. В следующей статье мы познакомимся с некоторыми средствами моделирования бизнес-процессов, проведем их сравнение и выберем одно, с помощью которого в дальнейшем и будем работать. А теперь – результаты опроса про бизнеспроцессы (выводы на счет образованности студентов делай сам):

Вопросы:

1 . Как вы понимаете термин «бизнеспроцесс» в двух словах? 2. Необходимо ли проводить анализ бизнес-процессов решаемой задачи? 3. Проводите ли вы подобный анализ при решении задач?

Ответы:

*Инженер-программист на предприятии: 1 . Организация деятельности. 2. Зависит от категории задач. Вообще – всегда надо проводить такой анализ, так как нужно исходить из того, что мы не знаем о задаче ничего. 3. В какой-то степени. *Инженер-программист на предприятии: 1 . Описание деятельности.

2. Нужно. 3. Проводил тогда, когда возникали подобные задачи. *Преподаватель ВУЗа: 1 . Функциональная структура организации. 2. Зависит от требований заказчика, от объема работ и от технического задания. 3. Проводил на крупных проектах. *Преподаватель ВУЗа: 1 . Это упорядоченная совокупность этапов реализации плана по созданию и развитию любого проекта. 2. Если серьезно подходить к реализации задачи – то обязательно. 3. Не всегда. *Студент ВУЗа (почти никто не согласился участвовать в опросе): 1 . Несколько блок-схем, объединенных связями. 2. Наверное надо. 3. Преподаватели заставляют =) *Коллективный разум школьниководиннадцатиклассников: 1 . Чтоооо? 2. Незнаем. 3. …

vr-online | октябрь 201 0


Автор: Игорь Антонов aka Spider_NET Почта: Antonov.igor.khv@gmail.com

80

Issuu.com

Без рамки

Хостинг для электронных журналов

Многие из вас, дорогие читатели, наверняка заметили, что начиная с прошлого месяца, практически все выпуски нашего электронного журнала стало возможно читать прямо в браузере. «А ведь раньше же тоже можно было?» - возразят некоторые. Да, можно было, но никакой верстки и «журнальности» вы увидеть не могли. Мы стараемся оперативно выкладывать статьи из старых номеров, но читать их в обычном виде иногда бывает скучно. Решить проблему с удобным чтением pdf не выходя из браузера, мы попробовали с помощью замечательного сервиса issuu.com. Многие оценили этот ход и теперь я хочу рассказать про этот чудесный сервис более подробно. Возможно, им воспользуешься и ты. Например, для удобного чтения и хранения различных документов (книги, журналы, комиксы и т.д.) в формате pdf.

Что умеет issuu

Главная фича сервиса – сгенирировать из pdf (или другого поддерживаемого формата) flash-приложение, которое может открыть пользователь и в удобном виде ознакомиться с контентом. Это если вкратце. Если посмотреть на issuu с большим пристрастием, то можно разглядеть следующие возможности: - Неограниченное дисковое пространство. Пока разработчики не планируют вводить для бесплатных аккаунтов ограничения на объем загружаемых материалов. Закачивай и расшаривай сколько угодно. - Платные и бесплатные аккаунты. Сразу после регистрации на сервисе issuu.com ты получаешь бесплатный аккаунт. Если по каким-либо причинам его возможностей тебе не хватает, то ты всегда можешь немножко раскошелиться и перейти на тарифный план pro. Он стоит не дорого ($1 9/месяц), но и возможностей у него на порядок больше. Хотя, обычному пользователю все эти фичи как зайцу «стоп-сигнал».

- Организация подписок. На все добавляемые тобой материалы другие пользователи issuu.com могут делать подписки. Оформил и всегда будешь проинформирован при выходе очередного номера издания. Штука в тройне становится полезной, если ты прочувствовал сервис и начал читать через него многие издания. Чтобы не мотаться на официальные сайты и постоянно следить за обновлениями, достаточно один раз оформить подписку и спать спокойно. - Социальная сеть. Разработчики сервиса понимают, что явления вроде «социальные сети» сегодня в моде, поэтому они просто не могли не организовать возможность создания списка друзей, поиск друзей и т.д. Все это замечательно и если толково подойти к идее, то для создания и распространения своего собственного журнала можно обойтись даже без собственного сайта. Лично я не приверженец такого подхода, но это более, чем реально. Особенно если ты только начинаешь пробовать свои силы в роли издателя электронных журналов. Как в любых социальных сетях ты можешь организовывать свои или присоединяться к чужим группа. Фишка групп точно такая же как и у проектов вроде «В Контакте», «Facebook». - Библиотека. Все добавляемые тобой публикации в issuu помещаются в библиотеку. Библиотека – это своего рода большой книжный шкаф, на котором ты можешь расставлять и группировать книги/журналы. vr-online | октябрь 201 0


81

Без рамки Для группировки тебе доступна возможность создания папок, система тэгов, полки и избранное. Создавая аккаунт для vr-online.ru, я сразу завел несколько папок, в которые начал размещать журналы в сортируя их по году выпуска. Теперь, чтобы полистать номера скажем за 2009 год, достаточно просто перейти в соответствующую папку. - Обратная связь. Твои читатели и друзья могут оставлять комментарии к опубликованным тобой материалам. - RSS подписки. Еще одной интересной и удобной возможностью сервиса является возможность создания rss подписок. Ты можешь сделать подписку как на обновления всех публикаций, так и лишь на те, что появляются в определенных директориях. - Статистика. Грош цена такому сервису, если он не умеет предоставлять статистику по прочитанным материалам, количеству просмотров и т.д. Здесь у issuu все в полном порядке и в любой момент ты можешь получить оперативную информацию: - Количество подписчиков; - Число просмотров за период; - Наиболее популярные публикации; - География аудитории; - и т.д.

коммуникаторами, работающими на базе Android (на некоторых других работает, но не стабильно и очень тормазнуто). Возможность чтения с мобилки пока находятся в стадии beta. Разработчики обещают, что скоро появится поддержка iPhone/iPad. Про поддержку остальных мобильных платформ пока ничего не говорится, но я думаю, что Windows 7 Phone обязательно появится в списке поддерживаемых, а вот поддержку таких ОС как Symbian скорей всего мы увидим не скоро.

Рисунок 2. Статистика

Рисунок 3. Issuu доступен и для мобильных пользователей.

Платить или не платить

Я уже сказал, что на сервисе issuu.com существует два варианта аккаунтов – платные и бесплатные. Само собой платный аккаунт круче. У него есть ряд преимуществ, но он нужен далеко не каждому. Для VROnline мы пользуемся бесплатной Рисунок 1 . Библиотека в issuu.com подпиской, и пока нам ее хватает за глаза. - Просмотр публикаций с мобильника. Из преимуществ pro версии можно Сервис issuu старается обхватить все выделить: категории пользователей, поэтому помимо традиционного просмотра через дестктопный - Отсутствие нижней панели с рекламой; бразуер, он предоставляет возможность - Доступ ко всем возможным функциям чтения материалов прямо с мобильника. сервиса issuu. Я совсем забыл сказать, что у сервиса есть ряд платных модулей. Огорчает лишь, что пока сервис дружит с vr-online | октябрь 201 0


82

Без рамки рисунка, расположенного ниже. Другими словами: «приятель, введи сюда капчу и я поверю, что ты не бот». - I accept the Terms of Service – обязательно поставь здесь галочку. Этим ты скажешь, что ты согласен с условиями сервиса; Заполнив все поля, нажимай на пимпу Agree and continue. На этом можно считать процесс регистрации оконченным. Тебе остается лишь проверить свою почту и перейти по Как этим пользоваться ссылке, подтверждающей регистрацию на Тем, кто знаком с языком Шекспира на сервисе. Выполнив это нехитрое действие, уровне «Читаю и перевожу со словарем» без возвращайся на сайт и авторизируйся (если проблем разберутся, куда и что нажимать. этого не произошло после перехода по Для всех остальных я приведу небольшой ссылке из письма) при помощи ссылки «Log мануальчик. Итак, начнем все делать по in». шагам. 1 . Заходим на сайт issuu.com (http://issuu.com/) и сразу клацаем на ссылку “Sign up”, расположенную в верхнем правом углу страницы. Перед тобой должна загрузиться простенькая регистрационная форма (см. рисунок 4). 2. Заполни все поля в форме или воспользуйся кнопкой fconnect ( ) для того чтобы создать аккаунт на основании своей учетной записи в популярной социальной сети facebook. Представим, что у тебя нет такого аккаунта и ты регистрируешь стандартным образом. Из полей тебе Рисунок 4. Регистрационная форма необходимо заполнить: 3. Выполнив вход на сайт, перейди в раздел - First Name – твое имя My Library (Моя библиотека). В этом разделе - Last Name – фамилия будут расположены все твои загружаемые документы (см. рисунок 5). Ты можешь - Profile name – имя профиля. Это очень важное поле и постарайся сюда вбить что-то создавать группы (папки) для классификации материалов. Для vr-online я заводил папки осмысленное и как-то связанное с твоим проектом. Слово, которые ты сюда занесешь пользуясь шаблоном: «vr-online %год%». будет использоваться в ссылке на твои 4. Теперь попробуем загрузить какой публикации. При регистрации аккаунта для документ на этот сервис. Я буду загружать vr-online, я вбивал сюда «vr-online». Чтобы второй номер нашего журнала за 2008 год, а получить доступ ко всем нашим журналам, ты можешь потренироваться на любом достаточно вбить в своей бродилке: другом документе. Щелкни по ссылки http://issuu.com/vr-online «Upload document» и приготовь свою психику к заполнению немаленькой формы. - Email – твой мыльник; - Password – думаю, это слово в переводе не 5. В форме загрузки документа тебе необходимо заполнить следующие поля: нуждается; - Место загрузки. Тебе необходимо - Gender – пол; определиться с местом, откуда ты будешь - Age – возраст; загружать свой документ. Ты можешь отправлять документ со своего ПК (upload a - Enter the words below – видите слова с Пользователи, которые выбрали бесплатную подписку могут купить необходимый модуль отдельно (как я понял), а те выбирает платную версию получает доступ абсолютно ко всем возможным функциям сервиса issuu. - Более безопасный хостинг и возможность создания резервных копий своих документов на хранилище от Amazon; - и т.д.

vr-online | октябрь 201 0


83

Без рамки file) или загружать с удаленного ресурса (upload from URL). В моем случае, файл с журналом у меня находится на жестком диске, следовательно, я должен выбирать первый вариант; - Title (заголовок). В это поле вводи название своего документа. Например, VR-Online (January 201 0). - Description (описание). Чтобы твои читатели не ломали голову над содержанием твоего документа, ты должен ввести в это поле небольшое описание. - Web name (имя, используемое в URL). Строка, которая будет содержаться в URL. Можешь указать здесь имя файла. Например: vr_march2008. В этом случае, к загруженному документу можно будет обратиться при помощи адреса: http://issuu.com/vr-online/vr_march2008.

Рисунок 5. Библиотека пользователя

Рисунок 6. Форма загрузки документа - Keywords (ключевые слова). В это поле впиши все ключевые слова (читай тэги), которые можно сопоставить с твоим документом. - Info Link (Линк на дополнительную информацию). Здесь желательно указать адрес на страницу (на твоем сайте) с закаченным документом. Зачем это делать? Ответ прост – чтобы читатель имел возможность перейти на оригинальный ресурс, на котором расположен документ. Если он переходит, то ты получаешь один из драгоценных ресурсов – трафик. - Type (Тип документа). Тип загружаемого документа. В моем случае нужно выбирать magazine, а что выбрать тебе знаешь только ты. - Child-safe (Безопасно для детей). Просмотр документа безопасен для детей или нет. Если в загружаемом документе имеются сцены насилия или порнография, то указывай No (Contains pornography / violence). - Publish Date (Дата публикации). Тут я думаю и так все ясно. - Category (Категория). Группа, к которой можно отнести загружаемый тобой документ. Категорий достаточно много, выбирать есть из чего. Для VR-Online я всегда выбираю Technology & Internet. - Language (Язык). Язык документа. - Target Area (Зона таргентинга). География твоей аудитории. Я не парюсь и скромно выбираю «The world». - Sound (Звук). Линк до mp3 файла, который будет воспроизводиться при чтении файла. Остальные поля особого интереса не представляют (они не обязательны к заполнению), поэтому я намерено опущу их описание. Заполнив все поля, нажимай на кнопку «Upload File». Сразу после этого начнется загрузка файла на сервер (см. рисунок 7).

А что потом?

Загрузив документ на сервер, ты сразу же можешь приступить к чтению, перемещению в определенную директорию или просто vr-online | октябрь 201 0


84

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

малейший опыт в создании электронных документов. Я видел десятки журналов, которые были чертовски интересными по содержанию, но ужасными в плане верстки/оформления. Вот таким людям я бы в первую очередь и рекомендовал сервис issuu. Документы, демонстрируемые при помощи issuu выглядят более изящно и читать их намного приятней, чем стандартный pdf-файл. Если честно, то об этом сервисе я узнал достаточно давно, но изначально, особого впечатления он на меня не произвел. Напротив, мне показалось, что им совершенно неудобно пользоваться. Когда я Рисунок 7. Загрузка файла на сервер пересилил себя и решился загрузить на issuu несколько номеров нашего журнала, я Upload complete понял, что был неправ. Многим посетителям Если ты занимаешься созданием очень понравилось читать vr-online на электронных журналов или документов, сервисе issuu. А ведь это самое главное! которые ориентированы на неопределенный Если имеется возможность улучшить круг лиц, то обязательно возьми этот сервис качество журнала для небольшой группы на заметку. Очень часто у новичков в читателей, то ей непременно нужно области электронных изданий отсутствует воспользоваться.

vr-online | октябрь 201 0


85

Меня тошнит

Рублика "Меня тошнит"

Выплескивая негатив...

wwwnet: Уже задолбала

красавицы, что бы скачать реферат для учебы. Рассказываю случай. Прихожу в девять утра в клуб, открываю дверь и вижу как админ с ночной смены, сложился на двух стульях и мирно спит. Ну, устал за ночь, бывает. Иду по рядам и за последним компом вижу расплывшегося на стуле спящего пацана лет 1 2-1 4. Подхожу, трогаю за плечо с вопросом: «Парень, с тобой все в порядке?» - А сколько время?! – спрашивают меня эти квадратные глаза. Kastor: По выходным, в свободное от учебы время, я - Девять утра. подменяю в одном - Ой ё! Мне ж домой пора! – и компьютерном клубе своего смотался пацан. знакомого. Работа архилегкая, скоростной инет. Не тратьте свое время понапрасну! Занимайтесь Только комп за целый день надоедает, но речь пойдет о полезными вещами! посетителях клуба. Я понимаю, иногда хочется Va-bank: Меня тошнит от сразиться в контру с шарой Jimmy Jonezz: Меня тошнит своих друзей и выяснить, кто дебильных иностранных законов, касающиеся от пользователей. круче владеет мышкой. воспитания детей. Например Организации, которой я Редко, но раньше сам этим в Голландии детей забирают посвящаяю 8 часов, каждый болел. Но изо дня в день из семьи якобы за то. что с день, я еще и отдаю одни и те же лица, даже большую долю своих нервов. компы для них определенные ними плохо обращаются родители. Уже было Меня как единственного стали родными. Глупо несколько таких случаев. программиста, оператора просиживают свое время. Забрали восьмилетнего ЭВМ, специалиста по Один в кораблики режется, мальчика за то, что он информационной другие в доту рубятся по 4 обмолвился в школе, что его безопасности, часа подряд. А один мужик мама будет ругать за администратора и т.д и т.п. вообще в шок поверг меня. полученную двойку. Т.е. замучило каждодневное Он приходит в клуб, что бы указывание пользователям свой огород полить вконтакте получается мать негативно влияет на ребенка и его надо на их постояные, глупые (или где он там). Разве что срочно забрать из семьи в ошибки. Никакого иногда заскакивают бюрократия. После окончания университета меня начал очень сильно хотеть видеть в рядах защитников Отечества военкомат. И тут понеслось требуется туева куча справок, в половине из которых требуется писать одно и то же. Во-первых, устно спрашивали про семью. Вовторых, в справке с места жительства справка о составе семье. В-третьих, справка с места работы и даже там требуется указать сведения о составе семьи. Причем заинтересовал еще тот факт, откуда моему начальнику должно быть известно, есть ли склонность к суициду у моих домашних или нет? Бред. Пора давно уже пересмотреть множество моментов в бюрократическом аппарате нашей страны.

разнообразия, каждый раз изо дня в день одни и те же ошибки. Инструкции, которые я делал, видимо всем по боку. Я не считаю себя сверх умным человеком, но в обществе глупцов жить сложно. Говорят, что на ошибках учатся, но видимо "мои" юзеры мазохисты, они каждый раз натыкаются на одни и те же ошибки и делают это с частым постоянством. Я уже начинаю подозревать, что здесь что-то не так..

vr-online | октябрь 201 0


86

Обзоры от VR-ONLINE детский дом. Да где это видано!!! Да это просто дибилизм чистой воды. От этого не только тошнит, но это просто бесит и это злит. Если так рассуждать, то меня вместе с моей женой, надо приговорить к смертной казни. Блин, да как еще воспитывать ребенка. Когда он тебя не слушается, ему что надо за это шоколадки покупать? А если он нахрен послал, так его за это похвалить?! Нет, по жопе ремнем за это, если конечно уже замечания не помогают. Может в следующий раз подумает стоит ли так делать. А вот например во Франции (http://www.1 tv.ru/news/world/1 64550). Так тут с точностью да наоборот. Забрали ребенка в пятилетем возрасте от мамы. Как вы думаете в связи с чем? "Чрезмерная материнская любовь"!!! Вы представляете себе. Так мало того. ребенок имеет Российское гражданство и мать тоже, отца нет, и в свидетельстве о рождении в графе отец стоит прочерк. И этого мало. Французский судья ЗАПРЕТИЛ разговаривать на РУССКОМ языке мальчику. И сейчас ему уже 11 лет и он просто ЗАБЫЛ РОДНОЙ ЯЗЫК!!! И даже русское посольство не может помочь. Франция игнорирует все попытки. Они так и говорят что Российский мальчик находится в заложниках Франции. Мама уже 6 лет встречается с ним только по выходным. Блин ну что за дибилизм (я не устану повторять это слово)!!! У меня эмоции через край. Кому интересно.

Spider_NET: В последнее

время меня все больше стало тошнить от чрезмерного упорства и настойчивости некоторых людей. Заведешь спор про какую-нибудь технологию/программу и начинается котовасия. Свое мнение я всегда подкрепляю фактами, а оппоненты это делать категорически не любят. Просто говорят, что я ошибаюсь и пытаются высосать свою правоту из пальца. Таких людей не волнуют тесты и мнение других профессионалов. Эго «Бога» не дает им покоя и они готовы свернуть любые горы, лишь бы доказать, что они правы. Иногда вот сижу и думаю, а за что такие «умники» получают свою (зачастую неплохую) зарплату? Не уже ли из-за прокаченного до 1 00 уровня навыка «усрусь, но не соглашусь?».

было.

Lord of fear: Буквально вчера я написал в блог на эту тему. http://vronline.ru/?q=blog/kuda-mykatimsja-2602 Высказал всё, что накипело. То, от чего конкретно тошнит. Следовательно, не буду повторяться. Поэтому не стесняйся и заглядывай на наши коллективные блоги. ;)

zahod5277: Вот сижу и

думаю - отчего же меня тошнит? Конечно же, произошло несколько неприятных проишествий, но таких, чтобы хотелось плеватся, орать благим матом и стучать кулаками по всему, по чему стучится, не vr-online | октябрь 201 0


Автор: Роман Костенко aka Lord_of_fear Почта: kostenko.r.khv@gmail.com

87

Дружим Debian c AD:

Админинг

Поднимаем корпоративный файловый сервер

Ох, и обленились же в последнее время все системные администраторы. Софт, как и прежде, можно юзать пиратский, поэтому абсолютно никто не мешает им ставить серверные виндовозы для решения элементарных задач. Таких как, например, поднятие файлового сервера. С windows на это требуется каких то пол часа времени. Немного, да? А как насчет Linux? С ним нужно подольше поковыряться? Не согласен. На самом деле для поднятия файлового хранилища на Linux требуется ничуть не больше времени. И сейчас, уважаемый читатель, я тебе это докажу. Я покажу, как настроить Debian Linux для работы с Active Directory, а так же поднять веб-интерфейс для администрирования. Определимся с задачей Пусть у нас имеется контроллер домена на Windows 2003 Server и системник под файловый сервер без ОС. Задача состоит в том, чтобы: установить ОС, ввести машину в домен, настроить аутентификацию доменных пользователей без запроса логина и пароля, поднять веб-интерфейс для управления, создать необходимые общедоступные ресурсы. Итак, приступимс… Условимся, что: Имя нашего нового файлового сервера: vronline

Домен: mydomain Контроллер домена: dataserver Полное доменное имя контроллера домена (FQDN): dataserver.mydomain.local IP контроллера домена: 1 92.1 68.0.1 IP DNS-сервера: 1 92.1 68.0.1 Виртуальная машина – сила! Для удобства будем ставить и настраивать на виртуальной машине Virtual Box. Если тоже захочешь попрактиковаться на виртуалке, то не забудь тип сетевого подключения поставить “Сетевой мост” с сетевой картой, которая смотрит в локальную сеть:

На данный момент последним является Debian Linux 5 под кодовым именем Lenny. Его и устанавливаем.

Установка Дебиана проста до безобразия. Выбирай “Graphical install”, затем укажи нужный язык. Во время установки понадобится ввести следующие параметры: vr-online | октябрь 201 0


88

Админинг

Имя компа : vr-online Домен : mydomain.local Разметка диска : Авто (отдельные разделы

под home, usr, var, tmp). При желании можно разметить вручную. На твоё усмотрение. Выбор программного обеспечения: ТОЛЬКО “стандартная система”, ничего более.

Настройку сети я пропустил, т.к. в любой нормальной корпоративной локалке есть DHCP-сервер. :) Т.е. программа установки получит все параметры автоматом. На этом установка окончена. Логинимся под рутом. Первым делом убираем CD/DVD привод из sources.list. В реале это позволяет физически отключить привод от нашего сервака. Ведь больше он на нём не понадобится.

проще всего c помощью классной утилиты Putty.

Комментируем строчку, что начинается на “deb cdrom” и сохраняем. Теперь:

Можно заходить по SSH. Открываем Putty, пишем IP. В разделе Translation указываем UTF -8. Огромное достоинство Putty заключается в том, что данные из буфера обмена вставляются с командную строку по клику правой клавиши мыши по области

> nano /etc/apt/sources.list

> apt-get update

Поднимаем SSH. Ведь рулить серваком

> apt-get install ssh

Т.к. сервер стоит во внутренней сети, то можно не менять настройки безопасности SSH и сразу логиниться со своего компа от имени рута. Делать так на public сервере ни в коем случае нельзя. :) Теперь смотрим какой IP получил наш сервер: > ifconfig

vr-online | октябрь 201 0


89

Админинг окна. Т.е. скопировал ранее заготовленную команду со всеми нужными параметрами, кликнул по окну Putty, данные попали в командную строку.

> apt-get install mc

Переходим к настройке сервера На всякий случай добавим в hosts инфу о нашем контроллере домена:

Куда же нам теперь без файлового менеджера? Он обязательно пригодится. Ставим Midnight Commander. Кстати в mc при работе через putty можно пользоваться даже мышкой.

> apt-get install samba winbind libpam-smbpass krb5user krb5-config

Небольшое описание того, что мы устанавливаем: Samba - это набор программ, которые > nano /etc/hosts реализуют протокол SMB/CIFS в системах Пишем в файл: unix, позволяя обслуживать запросы к 1 92.1 68.0.1 dataserver.mydomain.local файлам и принтерам клиентов Windows, NT, dataserver OS/2 и DOS. Этот протокол иногда называют Ставим ntpdate для синхронизации времени LanManager или NetBIOS. c DC(Domain Controller), это нужно для Winbind - для получения информации о нормальной работы Kerberos. пользователях и группах с серверов Windows NT. Также служба может выполнять функции > apt-get install ntpdate авторизации через PAM-модуль. Настроим его. Libpam-smbpass – это модуль для PAM. > nano /etc/default/ntpdate Позволяет преобразовывать Unix Прописываем наш контроллер домена пользователей в пользователей Samba. Т.к. у NTPSERVERS=”dataserver.mydomain.local” Samba своя собственная база Запускаем синхронизацию времени вручную: пользователей, поэтому её обязательно нужно синхронизировать с базой Unix. > ntpdate –s dataserver.mydomain.local Krb5-user – позволяет производить Для проверки запускаем: аутентификацию пользователей в сети. > date Kerberos — сетевой протокол Должны увидеть правильное время и дату. аутентификации, позволяющий безопасно передавать данные через незащищённые Пришла пора уточнить сервер(ы) DNS, сети для безопасной идентификации. обслуживающий домен. Обеспечивает взаимную аутентификацию — > nano /etc/resolv.conf оба пользователя через сервер Там обязательно должна быть строка: подтверждают личности друг друга. nameserver 1 92.1 68.0.1 Сообщения, отправляемые через протокол Kerberos, защищены от прослушивания и Ведь наш DC так же несёт на себе DNS атак повторного воспроизведения. Ставим все нужные для работы пакеты. Krb5-conf – создаёт начальную vr-online | октябрь 201 0


90

Админинг конфигурацию пакета. kdc = dataserver.mydomain.local Во время установки появится окно admin_server = dataserver.mydomain. конфигурирования samba. Спросит рабочую local группу/домен. пишем всё, что угодно. Всё } равно потом эти конфиги перезапишем. Следующий вопрос будет об использовании [domain_realm] WINS. нажми “Нет”. Следом выйдет запрос .mydomain.local = MYDOMAIN.LOCAL настройки Kerberos. Пишем тоже всё, что угодно. На следующий вопрос отвечаем mydomain.local = MYDOMAIN.LOCAL аналогично. [login] Всё. Установилось. Настроим сначала krb4_convert = true Kerberos. krb4_get_tickets = false Лёгким жестом руки удаляем всё из конфига: Важно!!! Соблюдать регистр букв! Точно так > cat /dev/null > /etc/krb5.conf же как и у меня!!! Не подумай, что я – маньяк. Просто я не люблю, когда в конфигах находится сотни Обрати внимание, что в разделе [realms] мы строк с комментариями. Всегда удаляю всё пишем DATASERVER.MYDOMAIN.LOCAL, а лишнее. Теперь правим его: не MYDOMAIN.LOCAL !!! > nano /etc/krb5.conf Просто замени MYDOMAIN.LOCAL и Вот мой начальный рабочий конфиг DATASERVER.MYDOMAIN.LOCAL на своё и кербероса: все будет работать. По факту это – и есть стандартный конфиг. Я лишь вырезал из [libdefaults] него комментарии и realms доменов, default_realm = MYDOMAIN.LOCAL которыми ты всё равно никогда не будешь пользоваться. krb4_config = /etc/krb.conf Так же безжалостно поступаем с конфигом krb4_realms = /etc/krb.realms самбы. Дропаем всё. kdc_timesync = 1 > cat /dev/null > /etc/samba/smb.conf ccache_type = 4 > nano /etc/samba/smb.conf Вот мой рабочий конфиг, с которого я всегда forwardable = true начинаю настройку: proxiable = true [global] v4_instance_resolve = false workgroup = MYDOMAIN v4_name_convert = { server string = File server host = { dns proxy = no rcmd = host log file = /var/log/samba/log.%m ftp = ftp max log size = 1 000 } syslog = 0 plain = { panic action = /usr/share/samba/panic-action something = something-else %d } security = ads } realm = MYDOMAIN.LOCAL fcc-mit-ticketflags = true encrypt passwords = true [realms] passdb backend = tdbsam DATASERVER.MYDOMAIN.LOCAL = { obey pam restrictions = yes vr-online | октябрь 201 0


91

Админинг unix password sync = yes passwd program = /usr/bin/passwd %u pam password change = yes socket options = TCP_NODELAY idmap uid = 1 000-20000 idmap gid = 1 000-20000 template shell = /bin/bash winbind use default domain = yes winbind enum groups = yes winbind enum users = yes #======== Share Definitions ============ [homes] comment = Home Directories browseable = no read only = no create mask = 0700 directory mask = 0700 valid users = MYDOMAIN\%S [printers] comment = All Printers browseable = no path = /var/spool/samba printable = yes guest ok = no read only = yes create mask = 0700 Расписывать каждый параметр не буду. Лень :) Описание можно найти без проблем в инете. Потестим конфиг самбы:

group: compat winbind shadow: compat winbind hosts: files dns winbind Модифицируем PAM. Наcтраиваем cиcтемную аутенфикацию и авторизацию контроллером домена. > nano /etc/pam.d/common-account

Пишем:

account required pam_unix.so account sufficient pam_winbind.so > nano /etc/pam.d/common-auth auth sufficient pam_winbind.so auth sufficient pam_unix.so nullok_secure use_first_pass > nano /etc/pam.d/common-password password sufficient pam_winbind.so password required pam_unix.so nullok obscure min=4 max=8 md5 > nano etc/pam.d/common-session session required pam_unix.so session required pam_mkhomedir.so skel=/etc/skel/ umask=0022

Т.к. у нас объявлена в конфиге Samba одна шара (домашняя директория каждого юзера домена), то нужно создать папку MYDOMAIN в /home. Перезапускаем winbind и samba > /etc/init.d/winbind stop && /etc/init.d/samba restart && /etc/init.d/winbind start

Теперь джойнимся в домен: > net ads join -U administrator

Здесь administrator – логин администратора домена. Писать просто логин. Не administrator@mydomain, и не administrator@mydomain.local . А просто administrator! Далее вбиваем пароль. Вуяля! И мы в > testparm домене. Получили: Делаем reload winbind, чтобы он перечитал Load smb config files from /etc/samba/smb.conf информацию о доменных юзерах и группах: > /etc/init.d/winbind force-reload Processing section "[homes]" Поcле чего проверяем что же получили. Loaded services file OK. Отобразим доменных юзеров и группы: Server role: ROLE_DOMAIN_MEMBER > wbinfo –u Отлично. Осталось совсем немного > wbinfo –g -u отобразит cпиcки доменных В файле /etc/nsswitch.conf указать, откуда пользователей брать информацию о пользователях: -g отобразит cпиcки доменных групп passwd: compat winbind vr-online | октябрь 201 0


92

Админинг Поздравляю, мой дорогой читатель! Теперь можно зайти на наш файловый сервер: \\vr-online Пока ты увидишь лишь одну шару – папку с именем своего пользователя. Эта личная папка создастся для каждого доменного пользователя, зашедшего по сети на файловый сервер. Доступ к папке имеет только сам пользователь, и никто более. Дело почти сделано. Теперь нужно поставить удобную панель администрирования Samba. Ставим, конечно же, WebMin. Webmin - это программный комплекс, позволяющий администрировать операционную систему через веб-интерфейс, в большинстве случаев, позволяя обойтись без использования командной строки и запоминания системных команд и их параметров. Используя любой браузер, администратор сервера может создавать новые учётные записи пользователей, почтовые ящики, изменять настройки служб и сервисов, например : веб-сервера Apache, DNS, файл-сервера Samba. Официальный ресурс проекта http://www.webmin.com/ Возможности Webmin значительно шире, чем мы будем юзать. Так что если не сталкивался с ним, то обязательно посмотри остальной функционал. Тебе понравится. Уверен. :) Удобней всего ставить из репозитория. Правим /etc/apt/sources.list. Добавим в него строку:

Логинимся под root’ом. Для начала нужно сменить язык интерфейса: Webmin – Change Language and theme выбираем Russian UTF-8. Надо залогиниться заново, чтобы увидеть русскоязычный интерфейс. Кое-что всё равно останется на англицком, но это не страшно. Вот теперь можно заняться настройкой Samba. Идём Службы – Файл-сервер Samba. Выбирай “Настройка автоматической синхронизации пользователей Unix и Samba”. Ставь галочки: - Добавлять пользователя Samba при добавлении пользователя Unix - Изменить пользователя Samba при изменении пользователя Unix - Удалить пользователя Samba при удалении пользователя Unix Кликай пимпу “Применить”. Аналогично нужно настроить синхронизацию групп Samba с группами Unix. Кнопка “Configure automatic Unix and Samba group synchronisation” Остаётся лишь перенести всех доменных пользователей и группы в Samba. Для этого кликай “Преобразование пользователей Unix в пользователи Samba”. Ну вот и всё. Теперь можно создавать новые файловые ресурсы и админить deb http://download.webmin.com/download/repository существующие, используя удобный вебsarge contrib интерфейс. Далее нужно установить GPG ключ Напоследок. следующими командами: Установку и настройку я производил попутно > cd /root с написанием статьи, поэтому ошибок быть > wget http://www.webmin.com/jcameron-key.asc не может. Но если, всё-таки, ты нашёл > apt-key add jcameron-key.asc недочет, то пиши в личку или на мыло. Теперь: Поправлю. > apt-get update Как видишь, нет абсолютно ничего > apt-get install webmin сверхсложного. Первый раз я копался с Все зависимости подтянуться автоматически. настройкой 2 дня. Теперь мне хватает 30-ти Теперь со своего рабочего места можно уже минут на поднятие файлового сервера на Debian Linux. Качай свой скилл и сможешь заходить на сервер через браузер: делать всё это с закрытыми глазами. :) https://vr-online:1 0000/ Удачи! vr-online | октябрь 201 0


Автор:Игорь Антонов aka Spider_NET Почта: Antonov.igor.khv@gmail.com

93

Админинг

План перехода на OpenSource Все подводные камни перевода компании на OpenSource

Прошлым летом передо мной встала задача разработать план перевода вымышленной компании на OpenSource программное обеспечение. До этого у меня не было опыта в подобном деле. Пришлось опираться на теорию и здравый смысл. Что из этого получилось – читай ниже. Я не могу сказать, что это идеальный план. Повторюсь, у меня нет опыта в вопросах перехода, но если бы мне пришлось переводить реальную компанию на OpenSource, то скорей всего я сделал бы это именно так. Причина перехода

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

Подготовка плана перехода

Определив конечную цель необходимо подготовить подробный план перехода. В идеале их должно быть несколько. Точнее несколько должно быть черновиков. Затем они все анализируются, и на основании их составляется окончательная версия чистовик. Каждый черновой вариант плана должен составляться при взаимодействии начальников (в идеале) каждого отдела (подразделения) компании. Важно четко знать задачи, возлагаемые на каждое подразделение и иметь полное представление о процессе их выполнения. Многие компании допускают в этом месте ошибку (сужу по постам блоггеров). Если составлять план в слепую, то в будущем может выясниться, что одному отделу нельзя

перейти на бесплатное ПО, из-за отсутствия в нем определенной возможности. Само собой об этом узнаешь слишком поздно, и эта досадная ошибка может стать роковой, тем самым затормозив общий процесс перехода на неопределенный срок.

Оценка сил IT службы

Миграция на OpenSource продукты и unix-like системы – задача не из легких. Руководство компании должно отдавать себе отчет и быть уверенным в компетенции IT подразделения или при отсутствии такого – компании, берущая на себя обязанность исполнителя в переходе. В случае, когда выполнение перехода возложено на IT подразделение, то в идеале организовать им какие-то подготовительные курсы или обратится к компаниям проводящих тестирование IT специалистов. Необходимо максимально сократить риски ситуацию «я не могу этого сделать». На стадии перехода эта проблема может стать фатальной и решить ее будет не так просто. Во всяком случае затраты по привлечению специалистов со стороны будут значительными и не факт, что специалисты со стороны смогут быстро все исправить. Сам факт простоя компании может быть слишком долгим.

Выбор дистрибутива unix-like системы

Дистрибутивов бесплатных и открытых unixlike систем много. Выбрать из них идеально подходящий под нужды компании дело vr-online | октябрь 201 0


94

Админинг непростое и требует значительного времени на проведение тестирования. На мой взгляд лучше выбрать два-три дистрибутива, которые максимально соответствуют нуждам твоей компании (на основании описания) и начать проводить тестирование. Тестирование должно быть максимально приближено к реальным условиям и в нем в обязательном порядке должны участвовать представители отделов/подразделений (обычные пользователи), т.е. люди, которые будут непосредственно работать с этими системами в будущем. Чем тщательней пройдет тестирование, тем меньше будет проблем при реальной миграции.

Рисунок 1 . Пингвина или Дьявола? При выборе дистрибутива крайне рекомендуется придерживаться следующих критериев: 1 . Обновляемость. Выбирай дистрибутив как можно популярней. Не нужно брать малоизвестные и экзотичные вещи. Сообщество, занимающееся их поддержкой, может запросто развалиться, и твоя система останется без обновлений. Все серьезные и проверенные временем unix-like системы достаточно часто обновляются и имеют устоявшееся сообщество. Именно такие дистрибутивы и нужно выбирать. Например, на сегодняшний день наиболее устоявшимися системами (linux-like) считаются: Ubuntu, Debian, Red Hat, OpenSuse. Выбирая один из этих продуктов можно быть уверенным, что завтра они точно не разваляться. Если ты решил использовать системы семейства BSD, тот наиболее предпочтительными вариантами будут FreeBSD, OpenBSD. Они опять же имеют развитые сообщества пользователей и постоянно обновляются.

2. Поддержка железа. Unix-Like системы куда более требовательны к аппаратному обеспечению. Крайне важно убедиться в возможности корректного функционирования этих систем на твоем парке машин. Вероятность, что система не распознает какое-нибудь устройство – очень велика и по возможности нужно максимально сократить риски. Особенно это относится к принтерам. От этих устройств зависит работа многих сотрудников типичного офиса и если они не смогут корректно работать в новых системах, то служащие не смогут выполнять возложенные на них задачи, а руководители компании будут терять деньги. Если в твоей компании используются компьютеры одинаковой конфигурации, то много тратить времени на тест тратить не придется. В противном случае, нужно выявить машины с максимально нетипичным железом и выполнить тесты на них. 3. Специалисты. Во всех крупных городах имеются компании специализирующиеся на консалтинге по вопросам связанными с внедрением и использованием OpenSource продуктов. Желательно чтобы такие специалисты (если они имеются в твоем городе) имели опыт работы с дистрибутивом, который ты выбрал для своей компании. В случае возникновения внештатных ситуаций, которые невозможно разрешить силами IT подразделения помощь таких специалистов будет крайне актуальной. Во всяком случае, если потребуется решить проблему оперативно. 4. Дружественность интерфейса. Для unixlike систем существует огромное количество оконных менеджеров, или попросту говоря оформления пользовательского интерфейса. Здесь всегда следует придерживаться правила – «Этим будут пользоваться простые люди». Не нужно ставить сверх урезанный интерфейс, так и слишком красивый. В идеале он должен быть максимально похож на интерфейс операционных систем Windows. Пользователи не должны ощущать большую разницу между системами. Новое всегда воспринимается тяжело. Крайне желательно хорошо потрудится и сделать новое рабочее место пользователя максимально похожее на предыдущее. Если пользователи не могут vr-online | октябрь 201 0


95

Админинг воспринимать интерфейс отличный от MS Windows интерфейс, то какое-то время лучше использовать специальное программное обеспечение позволяющее привести интерфейс unix-like системы к внешнему виду Windows. Сегодня это возможно и подобные проекты достаточно востребованы. 5. Подбор программного обеспечения. При переходе на unix-like системы стоит помнить, что весь софт, который использовался в Windows остался в прошлом. Да, некоторые продукты можно эмулировать через специальные средства, но качество эмуляции еще не достигло приемлемого уровня (особенно это относится к офисным приложениям) и в любом случае, если ты хочешь использовать платный продукт на эмуляторе тебе придется за него заплатить. В связи с этим, компании придется уделить время на подбор бесплатных решений. Особенно это относится к серверным приложениям и жизненно-необходимым пользовательским программам. Вполне возможно, что подобрать бесплатные альтернативы для абсолютно всех платных программ не удастся. В таких случаях начинают рассматривать платные решения, которые могли бы корректно работать через средства эмуляции. Типичным примером таких продуктов являются: 1 С:Предприятие, MS Office, MS SQL Server и многие другие. 6. Миграция приложений. В компаниях, которые несколько лет проработали, используя, решения от компании Microsoft, наверняка накопилась большое количество файлов определенных форматов. Яркий тому пример – документы MS Office. Бесплатный офис OpenOffice от компании Oracle уже достиг того уровня, который позволяет использовать его как надежный текстовый редактор для несложных документов. К сожалению, у него частенько возникают проблемы при открытии документов созданных в MS Office. Особенно это касается новых версий. На этапе внедрения очень важно выполнить ряд тестов и убедиться, что корректный перенос файлов из Windows в Unix-like систему будет успешен и никакие данные потеряны не будут.

Помимо документов огромную важность представляет и почтовый архив пользователей. Если в твоей компании в качестве почтового сервера используется MS Exchange, то за годы активного использования в нем явно скопилось большое количество писем. Среди этой кучи писем наверняка есть очень важные сообщения, которые выловить из общей массы (для принудительного сохранения) почтового потока выловить не так-то просто. Лучше всего когда все письма можно как-то перенести на новый почтовый сервис, но увы, это возможно не всегда и это необходимо предусмотреть. Особенно если почта – важное звено работы твоих пользователей. 7. Базы данных. При работе в системах Windows почти все системные администраторы отдают предпочтение крякнутым версиям MS SQL Server (или лицензионным, если руководство выделяет деньги). Это очень хороший продукт, но при переносе баз на бесплатные альтернативы возникает множество проблем. Первоочередная из них – перенос данных. Как правило, для этого пишут отдельные приложения. Стоит учитывать, что на разработку таких приложений может потребоваться значительное количество времени.

Итоги

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

vr-online | октябрь 201 0


96

VR­Мнение:

Рублика "VR-мнение"

Лицензии дающие свободу

зачем я должен производить выплаты, пускай даже один придумали. Как и большинство принимаемых в процент, ведь нельзя в точности сказать, что на последнее время законов. Здесь есть все - презумпция каждый диск будет записана какая-либо аудо- или виновности, распил и т.д. Я двумя руками против данного видеопродукция, или любой другой вид творчества налога. Бред. Для полной имеющий конкретное коллекции остается ждать авторство. Авторы налога на воздух, ведь им дышат и пираты в том числе! превращаются в халявщиков. На мой взгляд, такие выплаты допустимыми считать никак нельзя. Jimmy Jonezz: Я считаю, ввод данного постановления абсурден. Мне бы хотелось добраться до самого текста и Kastor: Ненавижу налоги! Тем более те, которые не прочитать его, дабы более обоснованны. С какого конкретно вникнуть в суть налоговых выплат авторам. перепуга я должен Не совсем понятно, кому они переплачивать за диск (да и оборудование, как оказалось) будут выплачиваться? только потому, что я могу на Понятно, что в качестве получателя будет выступать него фильмец записать? Давайте тогда сразу аккредитованная организация, но интересует включать в стоимость автомобилей штрафы за именно конечный превышение скорости и получатель. Я не силен, в пересечение двойной экономически-правовых сплошной. Но самое ситуациях, но мне кажется, что здесь может возникнуть интересное в другом. Вот хоть один певец или актер некая путаница, а может даже и неразбериха. Судите выступал с претензиями мол, ему денег не хватает, надо сами, непонятно как будут бы налог ввести на мои производится выплаты, только по тому, что ты автор, фильмы? Я такого не слышал. А теперь приведу или по количеству цитату с выпущенных произведений http://news.rambler.ru/793951 6 или по статусу, каким образом? Другой момент, я, к /: «Хорошее постановление, мы его давно ждали. Нас примеру крупная компания, которая выпускает носители, устраивает и процент, и остальные положения. неважно, что это - жесткие Наконец-то правообладатели диски, съемные носители получат то, что им (USB), оптические диски,

wwwnet: Глупости

полагается». Второе предложение аж улыбнуло, честно =)

Va-Bank: Я даже и не знаю

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

Spider_NET: Это самый

глупый налог, который можно было только придумать. Чем думали наши депутаты и все кто ответственен за его принятие – не знаю, но явно не головой. Иначе как можно объяснить такую глупость. Почему я должен платить фонду Михалкова деньги с покупки болванки, которую я приобретаю для записи своего домашнего видео или фотографий? Ведь многие же берут диски для записи дистрибутивов бесплатных vr-online | октябрь 201 0


97

Рублика "VR-мнение"

операционных систем, личных фотографий, собственных музыкальных записей и т.д. Почему мы должны за это платить какому-то дяде/фонду? Я понимаю, что этот дяде хочет деньги, и он готов нас радовать своими кино шедеврами, но он не думал, что его творчество интересно далеко не всем гражданам? У меня опять одни вопросы и опять я на них не могу получить ответ. Мне вот интересно, а что надо сделать, чтобы стать правообладателем? Вот если сниму домашний фильм (ничего не пошлого я не имел в виду) и запишу его на болванку, то мне потом тоже должен перепасть какой-то процент с этого налога? Я ведь тоже являюсь правообладателем, и мне не хочется, чтобы тетя Зина с соседней квартиры имела теоретическую возможность украсть у меня мое видео и посмотреть на своем телеке, не отчислив мне вознаграждение.

Lord of fear: Насколько бы не zahod5277: Налог на были сейчас популярны торренты, народ всё равно покупает пиратский контент на болванках. Конечно, никто уже не купит диск “8 экранок в одном”. Пиратские диски стали значительно качественнее. С виду даже можно не отличить от лицензионного. В основном, выдаёт их только отсутствие голограмм. Налог Михалкова призван бороться с пиратством. Но каким образом, скажите мне, пожалуйста? От этого не будет толка, ибо продавцы компенсируют потерю денег увеличением стоимость диска для конечного покупателя. И всё. Вот и весь цирк. Но зато у Никиты Сергеевича появится новый источник дохода. :) Что касается лично моего кармана, то мне по фигу. Я давным-давно уже не покупаю диски. Ни болванки, ни диски с контентом. У меня есть безлимит, торренты и 2Тб места на жестких дисках. :)

болванки интересный ход, даже забавный. Главное, чтобы в следствии введения этого налога резко не подскачили цены на эти самые болванки и прочую электротехнику. А то может и такое быть. Потом спросишь у продавца болванок: "А почему вчера эта DVD-R стоила 1 5 рублей, а сегодня уже 30?", а тебе в ответ: "Ну дык налог!". А то, что налог всего 1 процент, мало кто знает, и будут покупать, куда деватся-то.

vr-online | октябрь 201 0


Автор: Токарчук Александр aka Kewa2008 Почта: Kewa2008@yandex.ru

98

Школа

IBConsole + Delphi

Создание БД в IBConsole и приложения в Delphi. Часть 2

Привет. Это – вторая часть статьи, которая познакомит тебя с созданием БД в IBConsole и приложения в Delphi. Первую часть ты можешь прочитать в нашем прошлом номере журнала VR-online. В этой части мы рассмотрим создание свойстве Title указываем значение приложения базы данных. “Сотрудники” Приложение базы данных будет разрабатываться в Delphi. Для начала разработки в папке с файлом БД создай две папки: - App (папка для хранения исходных файлов приложения БД); - Data (папка с файлом БД). После создания папок скопируй файл БД в папку Data. Должна получиться структура папок (Схема 1 ).

Теперь создадим модуль данных, для этого в главном меню окна Delphi выбери “File -> New -> DataModule”, после чего появится модуль данных с именем DataModule1 . В Запускаем Delphi. Свойство Name у формы свойстве Name установи значение DM. меняем на FMain. После чего сохраняем Сохрани изменения в проекте и имя модуля проект, для этого в главном меню Delphi Unit1 .pas поменяй на UDM.pas. необходимо выполнить команду “File -> Save Модуль данных предназначен для хранения All”. В появившемся диалоговом окне выбираем созданную папку (MyBD\App). Имя невизуальных компонентов доступа к данным. Для того, чтобы из модуля UMain модуля Unit1 .pas сохраняем под именем UMain.pas, а модуль приложения Project1 .dpr можно было обращаться к компонентам, размещенными на модуле UDM в разделе сохраняем под именем PrMyBD.dpr. Чтобы форма располагалась по центру экрана при USES модуля UMain необходимо указать имя модуля UDM. Или сделать активной каждом запуске программы, в свойстве Position у FMain пишем poOwnerFormCenter форму FMain и нажать сочетание клавиш Alt + F11 , в появившемся диалоговом окне (или выбираем из выпадающего списка). выбрать имя модуля к которому В главном меню окна Delphi выбираем пункт подключаемся и нажать на “OK” (Рис. 2). “Project -> Options…”, в появившемся окне переходим во вкладку Application и в vr-online | октябрь 201 0


99

Школа - Params – user_name=SYSDBA password=masterkey - LoginPromt – false. Установив данные параметры, мы указали, что база данных находится в папке C:\Temp\MyBD\Data\, а имя файла MYBASA.GDB. Подключаемся и работаем с Преимущество размещения компонентов базой данных от имени встроенного доступа к данным в одном месте администратора в InterBase – SYSDBA с заключается в том, что изменение свойств невизуального компонента, размещенного на паролем masterkey. Теперь необходимо проверить правильность подключения к базе модуле данных, проявится сразу во всех данных, для этого в свойстве Connected компонентах, подключенных к этому не компонента IBDatabase1 выбираем из визуальному компоненту. выпадающего списка True. Если все Для подключения к базе данных из параметры указаны правильно, тогда приложения используется компонент свойство поменяет значение, в противном TIBDatabase (Табл. 1 ). случае на экране появится информация об ошибке. После проверки правильности указания параметров подключения свойство Connected компонента IBDatabase1 устанавливаем в False. Свойство Caption компонента FMain меняем на “Сотрудники”. Размещаем на форме компонент TPanel (2 шт.) с вкладки Standard. У Panel1 в свойстве Align из выпадающего списка выбираем alLeft, в у Panel2 в аналогичном свойстве – alRight. Размещаем на форме компонент TDBGrid (Табл. 3) с вкладки Data Control и компонент TDataSource (Табл. 4) с вкладки Data Access. Размещаем на модуле данных компонент У компонента DBGrid1 в свойстве Align TIBDatabase, располагающийся на вкладке выбираем из выпадающего списка alClient, InterBase. Далее размещаем на модуле свойство Name меняем на GridSotr, а у данных компонент, отвечающий за компонента DataSource1 на DSSotr транзакции – TIBTransaction (Табл. 2). (изменение значения свойства Name является необходимым при разработки больших приложений, т.к. при большом количестве компонентов одного класса возникает путаница). В свойстве DataSource компонента GridSotr выбираем из выпадающего списка DSSotr. Теперь данные, которые будут передаваться на DSSotr, будут отображаться в GridSotr. У компонента IBTransaction1 в свойстве DefaultDatabase устанавливаем IBDatabase1 . Для компонента IBDatabase1 устанавливаем значения в свойствах: - DatabaseName – C:\Temp\MyBD\Data\MYBASA.GDB; vr-online | октябрь 201 0


1 00

Школа

На модуле данных размещаем компонент TIBQuery (Табл. 5) и меняем свойство Name на IBSotr, а в свойстве Database выбираем из выпадающего списка IBDatabase1 (в свойстве Transaction должен автоматически установиться компонент, отвечающий за транзакции - IBTransaction1 , если этого не произошло – указываем это значение в ручную). После чего компоненту DSSotr указываем источник данных – IBSotr (выбираем из выпадающего в свойстве DataSet).

Поле SOTRID отображать в таблице не надо, для этого выбираем соответствующий пункт в окне DM.IBSotr и в свойстве Visible устанавливаем false. Для полей FAM, IMA, OTCH в свойстве DisplayLabel пишем Фамилия, Имя, Отчество. Это необходимо для того, чтобы в таблице заголовки полей отображались на русском языке. Далее в событии FormShow у формы FMain пишем код на подключение к БД и выборку данных из базы данных (Рис. 5).

Компонент IBSotr будет использоваться для выборки данных из таблицы SOTRUDNIK. Для этого в свойстве SQL пишем запрос Рис. Запускаем проект (F9). Если все сделано без 3. ошибок, то приложение запустится на экране и появится форма с таблицей. Закрываем приложение и продолжаем работу с проектом. Приступим к модификации данных в базе данных (добавление, изменение и удаление). Для этого на компоненте Panel1 размещаем три компонента TButton. В свойстве Caption у компонентов пишем Добавление, Изменение и Удаление. Сохраняем изменения (кнопка “OK”). Примерный вариант показан на Рис. 6. Щелкаем два раза на компоненте IBSotr, в появившемся окне щелкаем правой кнопкой мыши и выбираем пункт из выпадающего меню “Add all fields”. В результате появятся новые компоненты, обозначающие поля таблицы, которые вернул SQL-запрос Рис. 4. Создаем новую форму, для этого в главном меню Delphi выполните команду “File -> New -> Form”. Появится новая форма, свойство vr-online | октябрь 201 0


1 01

Школа Name меняем на FAddSotr. Сохраняем проект и новый модуль сохраняем под именем USotrAdd.pas. На новой форме будут размещаться компоненты для добавления или изменения данных в таблице. Т.к. эта форма будет использоваться не все время работы с приложением, то хранить ее в оперативной памяти нет смысла. Выбираем пункт “Project -> Options…” во вкладке Forms с помощью стрелок переносим FAddSotr в правую половину окна Рис. 7.

Теперь необходимо подключить модуль USotrAdd к UMain (раздел uses). Форма FAddSotr будет использоваться только после нажатия на кнопку Добавить или Изменить. Соответственно для событий OnClick пишем код на загрузку в оперативную память формы Рис. 8. Button1 – кнопка для добавления, поэтому в заголовок присваивается “Добавление”; Button2 – кнопка для изменения выбранной записи, поэтому в заголовок присваивается “Изменение”; Для избегания лишних ошибок, форму модификации данных вызываем функцией ShowModal.

Чтобы при закрытии формы она выгружалась из оперативной памяти, в событии OnClose пишем код, выгрузки (Рис. 9).

Теперь делаем активной форму FAddSotr и кидаем на нее компоненты с вкладки Standart: - TButton – 2 шт; - TEdit – 3 шт; - TLabel – 3 шт. У всех Edit’ов очищаем свойство Text. У компонентов TLabel в свойстве Caption пишем: Фамилия, Имя, Отчество. Свойства Caption у компонентов TButton очищаем (присваиваться значения будут в ходе выполнения программы). Должно получиться примерно как на Рис. 1 0.

Для формы FAddSotr устанавливаем в свойстве Position такое же значение, как и у формы FMain. Далее в свойстве BorderStyle из выпадающего списка выбираем bsDialog (это делается для того, чтобы во время выполнения программы пользователь не мог поменять размер формы). В событии OnClick компонента Button2 пишем код закрытия формы (Рис. 11 ).

Открываем модуль данных (для перемещения между модулями можно

vr-online | октябрь 201 0


1 02

Школа использовать сочетание клавиш Shift + F1 2. Появится окно View Form, в котором можно выбрать модуль для работы) и кидаем на него два компонента TIBQuery. Переименовываем компонент в (свойство Name) IBSAdd и в IBSEdit подключаем их к IBDatabase1 (свойство Database). В свойстве SQL компонента IBSAdd пишем запрос на добавление (Рис. 1 2).

досрочного завершения по ошибке, его следует заключать в блок обработки исключений (“защищенный блок”). Таких блоков в Delphi предусмотрено два: Try – except – end. Данный блок обработки исключений пытается выполнить заданный фрагмент программы, в случае если возникает ошибка, то управление передается специальному обработчику, расположенному в секции except. Try – finally – end. При таком способе организации обработки исключений сначала выполняется код заключенный между try и finally, после чего в любом случае (возникла ли ошибка или нет) управление передается блоку программы, заключенного между finally и end.

Для сохранения нажимаем на “OK”. В свойстве SQL компонента IBSEdit пишем запрос на изменение записи (Рис. 1 3). Для всех операций модифицирующие данные в базе данных можно использовать один компонент TIBQuery. Для каждой операции будет использоваться отдельный компонент, это делается для того, чтобы облегчить код в приложении БД и для наглядности каждой операции. Для сохранения нажимаем “OK”. Теперь делаем активной форму FAddSotr и в событии OnClick компонента Button1 пишем код на добавление или изменение записи (Рис. 1 3). Чтобы при открытии формы на добавление новой записи поля для заполнения были пустые, необходимо в событии OnClick компонента Button1 дописать код (Рис. 1 5).

Особое внимание стоит уделить конструкции try – except – end. Если фрагмент программного кода необходимо защитить от vr-online | октябрь 201 0


1 03

Школа В событии OnClick для компонента Button2 добавляем код для присваивания значений выбранной записи из таблицы в Edit’ы (Рис. 1 6).

Теперь открываем модуль данных (Shift + F1 2) и добавляем новый компонент TIBQuery (вкладка InerBase). Подключаем его к IBDatabase1 , в свойстве Name пишем IBSDel, а в свойстве SQL пишем запрос на удаление из таблицы выбранной записи (Рис. 1 7). Сохраняем код – кнопка “OK” и делаем активной форму FMain. В событии OnClick компонента Button3 пишем код на удаление выбранной в таблице записи (Рис. 1 8).

В этом фрагменте кода комментария требует только одно условие на проверку при удалении:

Работу с таблицей SOTRUDNIK мы закончили. Дорабатываем программу так, чтобы при выборе сотрудника в правой части окна выводились его должности и создадим возможность модифицировать записи в таблице DOLZNOST. Для этого в правую часть главной формы (FMain) ‘кидаем’ компоненты: - Вкладка Standard - - Button (3 шт.); - - Label; - Вкладка DataControl - - DBLookupListBox (Табл. 6). Сразу меняем свойство Caption у: - Button1 на ‘Добавить’; - Button2 на ‘Изменить’; - Button3 на ‘Удалить’; - Label1 на ‘Должности сотрудника:’.

Листинг 1 .

if DM.IBSotr.RecordCount=0 then begin MessageDlg('Нет записей для удаления!',mtError, [mbOK],0); exit; end;

Функция RecordCount возвращает количество записей в таблице. В нашем случае если в таблице, из которой берет записи компонент IBSotr, записей нет, тогда выводится сообщение об ошибке, и происходит выход из процедуры.

После всех преобразований форма должна выглядеть примерно так (Рис. 1 9). После чего на модуль данных (для его открытия нажмите Shift + F1 2 и в появившемся списке выберите строку DM) кидаем сразу четыре компонента IBQuery с vr-online | октябрь 201 0


1 04

Школа (изменение), Рис. 23 (добавление) и Рис. 24 (выборка).

вкладки InterBase. Свойство Name переименовываем на: - IBQuery1 – IBDol; - IBQuery2 – IBDAdd; - IBQuery3 – IBDEdit; - IBQuery4 – IBDDel. IBDol будет отвечать за выборку дочерних записей из таблицы DOLZNOST. IBDAdd – за добавление новых должностей. IBDEdit – за изменение старых должностей. IBDDel – за удаление существующих должностей. Если все сделано правильно, модуль данных должен выглядеть примерно как на Рис. 20. Все новые компоненты, лежащие на модуле данных, подключаем к базе данных. Для этого в свойстве Database указываем компонент IBDatabase1 . У компонента IBDDel в свойстве SQL пишем запрос на удаление записи из таблицы DOLZNOST (Рис. 21 ). Теперь делаем активной форму FMain и пишем код на добавление должности в событии OnClick у кнопки с заголовком (свойство Caption) ‘Добавить’ Рис. 25.

Далее для компонентов IBDEdit, IBDAdd и IBDol пишем запрос как на Рис. 22 vr-online | октябрь 201 0


1 05

Школа В этом фрагменте кода следует обратить внимание на конструкцию

b:=InputQuery('Добавление', 'Введите должность', s);

Диалоговое окно InputQuery (как аналог – InputBox) позволяет пользователю вводить данные. Функция InputBox используется в том случае, когда не имеет значения, что пользователь выбирает для закрытия диалогового окна – кнопку ‘OK’ или кнопку ‘Cancel’ (или нажатие клавиши Esc). Если вам необходимо знать какую кнопку нажал пользователь (‘OK’ или ‘Cancel’ (или нажал клавишу Esc)), используйте функцию InputQuery. Функции InputQuery передается три параметра: - Заголовок диалогового окна; - Надпись над строкой ввода; - Переменная, где будет храниться введенная пользователем информация. Информацию о том, какую клавишу нажал пользователь (‘OK’ или ‘Cancel’ (или нажал клавишу Esc)) сохраняем в переменной ‘b’. Данная переменная логического типа. Может хранить два значения true – нажата кнопка ‘OK’ и false – если пользователь отменил ввод текста. Теперь в событии OnClick у кнопки с заголовком (свойство Caption) ‘Изменить’ пишем код на изменение записи в таблице DOLZNOST. Делать это будем при помощи уже известного диалогового окна InputQuery Рис. 26.

s:=DM.IBDolNAIMDOL.Value;

Для удаления записи из таблицы DOLZNOST необходимо в событии OnClick у кнопки с заголовком (свойство Caption) ‘Удалить’ написать код (Рис. 27).

Данный фрагмент кода аналогичен коду удаления записи из таблицы SOTRUDNIK. Так что все должно быть понятно. На этом основная часть программирования закончена. Чтобы все корректно отображалось, необходимо добавить код в несколько событий, которые будут возникать при работе с базой данных. Во-первых, дорабатываем код в событии OnShow у формы FMain (Рис. 28).

Во-вторых, в событии OnCellClick у компонента GridSotr пишем код на передачу значения параметра в SQL запрос для выборки дочерних записей, из таблицы DOLZNOST, у выбранной записи в таблице SOTRUDNIK (Рис. 29).

Главное отличие работы с диалоговым окном InputQuery это то, что в строку ввода (третий Чтобы при выборе строки в компоненте параметр) самостоятельно передается GridSotr выделялась вся строка, и данные значение из таблицы для изменения: нельзя было изменить, в свойстве Options ->

vr-online | октябрь 201 0


1 06

Школа dgRowSelect пишем true. Сохраняем проект и запускаем его. Если все сделано правильно, приложение должно выглядеть как на Рис. 30.

сама их обрабатывает и отправляет SQL запрос на сервер. В правую часть окна (Panel2) с вкладки Standard необходимо поместить: - TRadioGroup; - TEdit; - TLabel; В свойство Items у компонента RadioGroup1 записать значения как на Рис. 31 . Т.е. при Теперь используя функциональные клавиши выбранном первом пункте выборка будет можно добавлять, изменять и удалять записи производиться по фамилии, при выбранном втором пункте – по имени, при выбранном в таблицы. третьем пункте – по отчеству, а если флаг Ну вот и пришёл черёд научиться будет стоять на четвертом пункте, то производить выборку из таблиц базы данных выборка производиться не будет. по заданным критериям. Прежде чем приступать к практике, нужно понять, как именно производить выборку по заданным критериям. Как известно все запросы обрабатываются на сервере. Например, при выполнении запроса: SELECT Fam, Ima, Otch Чтобы при запуске приложения флаг FROM Sotr указывал на четвертый пункт, в свойстве WHERE (Fam=’Иванов’) ItemIndex у компонента RadioGroup1 Сервер вернет представление, содержащее установите значение 3. В свойстве Caption у того же компонента напишите ‘Выборка по:’. только те записи, которые удовлетворяют условию запроса (WHERE (Fam=’Иванов’) ). В аналогичном свойстве компонента Label2 Но пользователю не всегда нужно выполнять напишите ‘Значение’. Теперь очистите свойство Text у компонента ‘Edit1 ’. Если все запрос на выборку с одними и теми же сделано правильно, тогда главное окно значениями в условии. В ситуации, когда программы должно выглядеть как на Рис. 32. значение в условии запроса на выборку меняется в зависимости от желания пользователя, вспомогательную функцию выполняют параметры. Т.е. условие запроса на выборку необходимо преобразовать. Соответственно наш запрос будет иметь вид: SELECT Fam, Ima, Otch FROM Sotr WHERE (Fam=:Par1 )

В результате такого преобразования запроса, пользователь может производить выборку данных из таблицы с разными значениями в условии. Ему только необходимо в параметр ‘Par1 ’ записывать значение. В SQL запросах перед всеми параметрами ставится двоеточие. Теперь мы разберем пример, когда SQL запросы динамически формируются и выполняются в ходе работы приложения. Т.е. пользователь задает какиелибо условия для выборки, а программа

При выборе одного из четырех пунктов SQL запрос на выборку записей из таблицы SOTRUDNIK будет меняться. Поэтому в событии OnClick у компонента RadioGroup1 мы будем работать с компонентом IBSotr, расположенным на модуле данных. При работе с компонентами RadioGroup1 и Edit1 ,

vr-online | октябрь 201 0


1 07

Школа SQL запрос будет формироваться в зависимости от предъявляемых требований, которые будет указывать пользователь. В событии OnClick пишем код на выборку данных из таблицы SOTRUDNIK (Рис. 33). Рассмотрим код подробнее. Прекращаем выборку записей из таблицы SOTRUDNIK. DM.IBSotr.Close; Очищаем SQL запрос в компоненте IBSotr. DM.IBSotr.SQL.Clear;

Добавляем первую строку SQL запроса, которая во всех запросах будет одинаковая.

OnClick компонента RadioGroup1 (Рис. 34).

При использовании данной процедуры мы передаем один параметр – Sender (принадлежащий к классу TObject). Сохраняем проект и запускаем приложение. Для выборки данных по заданному условию, сначала необходимо выбрать по какому полю производится сортировка (Фамилия, Имя или Отчество), а затем в компонент для ввода данных (Edit1 ) ввести значение для выборки. Если выбрать пункт ‘Не производить’, то условия для выборки не будет, и в таблице будут отображены все данные, содержащиеся в таблице. Так же компонент для ввода данных очистится и в него нельзя будет ввести данные.

DM.IBSotr.SQL.Add('SELECT * FROM SOTRUDNIK');

В зависимости от того, какой пункт был выбран, выполняем одно из четырех действий. case RadioGroup1 .ItemIndex of Выборка по фамилии.

0: DM.IBSotr.SQL.Add('WHERE (Fam='''+Edit1 .Text+''')'); 1: Выборка по имени. DM.IBSotr.SQL.Add('WHERE (Ima='''+Edit1 .Text+''')'); 2: Выборка по отчеству. DM.IBSotr.SQL.Add('WHERE (Otch='''+Edit1 .Text+''')'); 3: Выборка записей без условия. В этом случае прост очищаем Edit1 . Edit1 .Text:=''; end;

Возобнавляем запрос на выборку данных из таблицы SOTRUDNIK. DM.IBSotr.Open;

Далее в событии OnKeyUp у компонента Edit1 пишем процедуру вызова события

vr-online | октябрь 201 0


Автор: Игорь Антонов aka Spider_NET Почта: Antonov.igor.khv@gmail.com

1 08

Школа

Знакомимся с 1С:Предприятие Часть 5. Встроенный язык

В прошлом номере нашего журнала я познакомил тебя с типами данных и отладчиком платформы 1 С:Предприятие. Мое опущение, что статьи я написал в не удачном хронологическом порядке. По идее, мне сначала следовало более детально рассмотреть встроенный язык, а уже потом браться за такие темы, как «Типы данных», «Отладка» и т.д. Прошлое уже не исправишь, что сделано, то сделано. Наверстать упущенное, я попробую в сегодняшней статье. Усаживайся поудобнее, тема сегодняшнего урока – «Встроенный язык платформы 1 С:Предприятие». сидеть и ломать голову, пытаясь установить очередное обновление от разработчиков. Платформа 1 С:Предприятие сама по себе Пока не забивай себе этим голову. Про то, мало что умеет (если смотреть с как лучше всего допиливать типовые пользовательской точки зрения). Это просто конфигурации я расскажу в отдельной программа, которая не имеет отношения ни к статье. В этой нас с тобой будет бухгалтерии, ни к зарплате, ни к чему либо. интересовать лишь встроенный язык. Грубо говоря, это просто фундамент. Ты можешь его оставить в таком состоянии как Как будем тренироваться он есть, а можешь построить дом или целый Я тебе настоятельно рекомендую повторять квартал. 1 С:Бухгалтерия, 1 С:Зарплата и на своем компьютере все рассматриваемые управления персоналом – примеры тех мной примеры. Так ты быстрей сможешь самых домов и кварталов. Это конкретные запомнить синтаксис и будешь видеть все программы, разработанные под платформу результаты выполнения небольших 1 С:Предприятие. Для разработки подобных программ собственными глазами. Теперь решений и предназначен встроенный язык. С обсудим вопрос, где ты должен набивать код его помощью ты будешь описывать всех примеров. Если ты читал предыдущие алгоритмы и всю логику программы, тем мои статьи, посвященные знакомству с самым создавая новое или дорабатывая 1 С:Предприятие, то у тебя уже однозначно старое решение. должна быть тестовая база и писать примеры рассматриваемые в этой статье ты Я могу дорабатывать?! можешь в ней. Сам код примеров лучше Да, я не опечатался. Любое решение набирать в новой обработке. Создай новую (конфигурация, обработка, отчет), которое обработку (внешнюю), добавь для нее разработано под платформу 1 С:Предприятие форму, а на форму брось кнопочку. Весь ты можешь доработать в соответствии со рассматриваемый код пиши в обработчике своими желаниями и потребностями. события, срабатываемый при нажатии этой Главное, чтобы автор (ы) позволял это кнопки. Если ты не знаешь, как создать делать и не закрывал от доработок исходный обработку или последние слова тебя ввели в код проектов. Как правило, конфигурации, ступор, то подними предыдущий выпуск разработанные компанией 1 С, ты без журнала и еще раз прочитай, проблем можешь редактировать и опубликованные в нем статьи по 1 С. Ах да, дорабатывать. Главное это делать аккуратно, если не хочешь искать или качать старый руководствуясь определенными правилами. номер журнала, то просто сбегай на наш Иначе есть большая вероятность сайт. Обе статьи доступны для просмотра в наколбасить кучу крутого кода, а потом долго

Зачем нужен встроенный язык

vr-online | октябрь 201 0


1 09

Школа режиме онлайн.

Кроме того, русскоязычный вариант синтаксиса юзают большинство 1 СТочка, точка, запятая разрабтчиков, а это значит, что когда ты Знакомиться со встроенным языком мы придешь на работу и захочешь писать код на начнем с самых основ. Итак, встроенный английском, то тебе просто не дадут этого язык 1 С:Предпряитие (далее, для удобства я сделать. Никому не захочется устраивать в буду употреблять термин «язык 1 С») не конфе лингвистический зоопарк. Как говорил регистро-зависимый. Это означает, что один мой коллега на прошлой работе: переменная с именем «Переменная1 » будет «Пускай безобразно, зато единообразно!». равна «переменная». Если ты до этого Короче, в чужой монастырь со своим программировал на Delphi, то освоение уставом, пусть трижды хорошим, тебя не языка 1 С для тебя будет безболезненным. пустят. Каждая операция в языке 1 С должна Объявление переменных завершаться точкой с запятой. Знак точка с Сначала вспомним (хотя я надеюсь, что ты запятой не ставиться после всевозможных это знаешь) о том, что вообще операторов и других зарезервированных подразумевается под словом «переменная». слов. Впрочем, как и во всех серьезных Если не лезть в дебри, а сказать поязыках программирования. простому, то переменная – это область А писать придется по-русски? памяти. В эту область ты можешь записывать всевозможные данные и Поскольку платформа 1 С:Предприятие в оперировать ими. первую очередь предназначена для российского рынка, то и писать код можно на Встроенный язык 1 С:Предприятия не родном языке. Скажу честно, в самом начале строготипизированный. Это значит, что при своей карьеры 1 С разработчика меня от объявлении переменной тебе не нужно этого просто воротило. Где-то месяц я указывать ее тип (в отличии от Delphi, C# и плевался, и все время хотел написать т.д.). Тип переменной определяется на привычные операторы на английском. основании ее содержимого. Рассмотрим Писать код на русском было крайне пример: непривычно и неудобно. В итоге я себя все Переменная1 = “”; //Объявление строковой же пересилил и теперь мой мозг одинаково переменной хорошо воспринимает как код на языке Переменная2 = 0; //Объявление числовой Шекспира, так и на Великом и Могучем. переменной Про типы данных я уже рассказывал (см. Разработчики языка 1 С наверняка догадывались, что писать на русском смогут предыдущий номер), поэтому повторяться не буду. Также в прошлом номере я затрагивал далеко не все программисты, поэтому типы переменных. Здесь я лишь напомни их: реализовали поддержку англоязычного локальные, глобальные, экспортные. синтаксиса. Это значит, что ты можешь Подробности опять же в предыдущих писать код как на русском, так и на статьях. английском. Об этой возможности я знал с самого начала, но пользоваться ей не стал. Комментарии Почему? Попробую объяснить. Видишь ли, большинство конфигураций, созданных для Комментарии предназначены для записи пояснений к коду программы. В языке 1 С платформы 1 С:Предприятие написаны с использованием русскоязычного синтаксиса. комментарии принято писать после двух символов «слеш». Рассмотрим пример: Если ты не сможешь воспринимать код на Переменная1 = “Привет, мир!”; //В переменную родном языке, то тебе будет крайне “Переменная1 ” присвоили строковое значение проблематично в них разобраться. Уж лучше помучиться пару неделек и перестроить себя То, что идет после двойных слешей и есть на «русский лад», нежели потом долго комментарий. Во многих языка комментарии биться головой о стену, пытаясь понять, что разделяются на однострочные (пример мы понаписали в типовой бухгалтерии только, что рассмотрели) и многострочные разработчики. (предназначены для написания нескольких vr-online | октябрь 201 0


11 0

Школа строк). В языке 1 С разработчики не предусмотрели многострочные комментарии. Это значит, что если ты хочешь наколбасить пять строчек пояснительного текста, то тебе придется перед каждой из них ставить два слеша. Это не совсем удобно, особенно после опыта работы с другими языками программирования, но от этого никуда не денешься. Чтобы как-то облегчить свою жизнь, можно и нужно юзать горячие клавиши. Давай рассмотрим пример. Перейди в редактор кода и напиши в нем (прямо в процедуре обработчика нажатия кнопки) несколько строчек любого текста (см. рисунок 1 ). Теперь попробуем все эти строчки быстренько закомментировать. Выдели их все и нажми сочетание клавиш Ctrl + / (слеш нажимай на дополнительных кнопках, это там где Num Lock). Не успеешь и глазом моргнуть, как весь твой текст обзаведется слешами (см. рисунок 2). Ты также можешь сделать обратный процесс, т.е. раскомментировать какой-то текст/код. Для этого нужно выделить закомментированный текст и нажать сочетание клавиш Ctrl + Shift + /.

Рисунок 1 . Разбираемся с комментариями

Рисунок 2. Быстро стряпаем большие комментарии

Операторы ветвления (условные операторы)

Любая более-менее сложная программа опирается на какие-то условия. Например, если пользователь не задал вводные данные, то программа не будет дальше выполняться. Операторы , обеспечивающие выполнение определенных команд в зависимости от истинности условия называются – операторами ветвления или проще говоря условными операторами. Если

ты программировал на каком-нибудь языке программирования, то наверное уже догадался, что я собираюсь рассказать про операторы If..Then…Else и о том, как с ними работать в языке 1 С. Итак, чтобы обеспечить выполнение кода, который зависит от определенного условия, нам надо воспользоваться условными операторами. В языке 1 С, условные операции записываются следующим образом:

Если <Условие> Тогда //Код, который выполнится в случае истинности условия ИначеЕсли <Условие2> Тогда //Код, который выполнится в случае если основное условие дало ложь, а условие 2 истинно Иначе //Код, который выполнится в случае ложности условия.

Давай рассмотрим небольшой практический пример. Представим, что нужно написать код, который выполняет деление одного числа на другое. Мы знаем, что делить на 0 нельзя, поэтому перед тем как выполнять операцию «деления» нам нужно выполнить проверку делителя. Рассмотрим код: Делимое = 1 0; Делитель = 5; Результат = 0;

Если (Делитель <> 0) Тогда Результат = Делимое / Делитель; Сообщить(Результат); Иначе Сообщить("На ноль делить нельзя!"); КонецЕсли;

Если выполнить этот код, то в окне служебных сообщений ты увидишь число 2. Все верно, десять делим на 5, получаем 2. Но вот стоит тебе переменной «Делитель» присвоить значение 0, как результат выполнения будет совсем другим. Вместо вывода результата деления ты увидишь сообщение «На ноль делить нельзя». Думаю, с этим возникнуть вопросов недолжно. Раз так, то попробуем немножко модернизировать пример. Приведи содержимое кода к виду: Делимое = 1 0; Делитель = 1 ; Результат = 0;

vr-online | октябрь 201 0


111

Школа условием выступает «Делитель = 0». Если действительно, значение переменной «Делитель» равен нулю, то переменная «Результат» получит значение «Неопределено». Ну а если делитель не равен нулю, то в переменную «Результат» попадет результат выполнения выражения «Делимое / Делитель». Чтобы до конца разобраться с этим оператором, попробуй поставить несколько экспериментов и Основное отличие этого кода от предыдущего, добавление нового ключевого внимательно посмотри на результаты их слова «ИначеЕсли». Раз мы ввели оператор выполнения. А я перехожу к рассмотрению циклов. «ИначеЕсли», то у нас появилось дополнительное условие. Я не знал, какой Циклы лучше придумать пример, поэтому в Когда я только начинал учиться качестве дополнительно условия ввел программировать, «циклы» была одна из сравнение с единицей. Если значение самых тяжелых для меня тем. Сейчас я уже переменной «Делитель» равно 1 , то нет не могу представить, как это можно не смысла выполнять операцию деления. понять, но тогда, я с ними намучился. Результат один фиг будет равен значению Помню, как сидел и в 1 00-й раз перечитывал переменной «Делимое». Вот собственно и все. Попробуй прогнать выше приведенный главу книги по Delphi, посвященную циклам. А ведь именно тогда, мои действия код при помощи отладчика. Выполни его выполнялись в цикле! «Я в сотый раз читал» построчно и посмотри, в какой последовательности происходит выполнение - чем, не цикл? Примерно так и раз и навсегда уяснил для себя, для чего команд. предназначены циклы и когда их следует Перед тем как приступить к рассмотрению применять. Уверен, большинство из вас циклов я хочу рассказать тебе про еще один знают, что такое и для чего нужны циклы, но вид условных операторов. Конструкция я буду ориентироваться еще и на «Если…Тогда…Иначе» слишком громоздка и абсолютных новичков, которые только для проверки на совпадение с одним недавно встали (или только собираются условием ее не очень удобно использовать. встать) на тяжелый и тернистый путь Тогда как же быть? Для решения подобных программиста. Итак, Цикл – это задач, разработчики реализовали во повторяющийся участок кода. Из всех встроенном языке оператор «?» (знак определений, которые я слышал, это мне вопроса). Рассмотрим работу с ним на нравится больше всего. Оно простое и реальном примере. В качестве примера отражает главную суть. разберем проверку делителя на 0, т.е. В языке 1 С присутствует несколько видом перепишем ранее рассмотренный код на циклов. Каждый из них хорош для новый лад. определенной ситуации и чтобы начать Делимое = 1 0; разрабатывать свои приложения, тебе Делитель = 0; обязательно нужно со всеми ними Результат = 0; познакомиться. Всего их в языке 1 С три Результат = ?(Делитель = 0, Неопределено, вида: Делимое / Делитель); - Для <переменная = выражение> По <выражение Самым интересным местом в коде является 2> Цикл последняя строчка. Оператор (хотя, - Пока <условие> Цикл правильней сказать «функция») «вопрос» - Для Каждого <переменная1 > Из <Переменная2> работает следующим образом. Если Начнем рассматривать их по порядку. переданное в качестве первого параметра Первым по очереди у нас идет условие истинно, то в качестве результата «Для..по..Цикл». Не могу придумать будет возвращен второй параметр, в интересный пример, поэтому рассмотрю противном случае – третий. В примере, Если (Делитель <> 0) Тогда Результат = Делимое / Делитель; Сообщить(Результат); ИначеЕсли (Делитель = 1 ) Тогда Сообщить("Нет смысла делить на единицу, результат будет равен " + Делимое); Иначе Сообщить("На ноль делить нельзя!"); КонецЕсли;

vr-online | октябрь 201 0


11 2

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

//Создаем массив и перебираем его элементы при //помощи цикла Для..По..Цикл Массив = Новый Массив; Массив.Добавить("Это первый элемент"); Массив.Добавить("Это второй элемент"); Массив.Добавить("Это третий элемент"); Массив.Добавить("А это четвертый элемент"); Массив.Добавить("Ну а это, последний элемент"); //Запускаем цикл Для сч = 0 по Массив.Количество() - 1 Цикл //Выводим очередной элемент Сообщить(Массив[сч]); КонецЦикла;

В вышеприведенном небольшом участке кода я объявил динамический массив и добавил туда пять элементов. Сразу после этого я запустил цикл от нуля до количества элементов (-1 ) нашего массива. После этого, я печатаю в окно служебных сообщений очередной сч элемент при помощи метода глобального контекста «Сообщить()». Обрати внимание на то, что цикл мы начинаем с нуля (начальное значение переменной сч). Первый элемент массива в языке 1 С имеет индекс 0 (как и во многих других языках), а метод «Количество()» объекта «Массив» возвращает количество элементов с учетом того, что нумерация уже начинается не с 0, а единицы. Поэтому, чтобы перебрать абсолютно все элементы мы должны запустить цикл от нуля, до числа - 1 , возвращенного методом «Количество()». Если тебе все таки непонятны вышесказанные слова, то обязательно прогони код примера построчно в отладчике. Так, про этот цикл мне сказать больше нечего. Вроде все просто и понятно, а раз так, то перейдем к рассмотрению второго вида циклов – «Пока <Условие> Цикл». Новый пример придумывать не будем, а модифицируем недавно написанный. Т.е. сейчас я покажу тебе, как перебрать элементы массива при помощи цикла «Пока». Модифицированный код примера я привел ниже.

//для экономии места я не стал повторять код заполнения массива, а сразу //привожу лишь код цикл //Запускаем цикл Индекс = 0; Пока Индекс <= Массив.Количество() - 1 Цикл Сообщить(Массив[Индекс]); Индекс = Индекс + 1 ; КонецЦикла;

В функциональном плане этот код полностью идентичен тому, что мы рассматривали выше (на примере цикла «для..по..цикл»). Единственное различие вместо цикла «для» мы используем цикл «пока». В отличие от цикла «для», цикл «пока» не увеличивает значение переменной счетчика. Более того, здесь и переменной счетчика нет. Цикл выполняется пока условие истинно. Если нам требуется перебрать какую-нибудь коллекцию при помощи этого цикла, то нам нужно самостоятельно позаботиться о многих вещах. Например, чтобы перебрать элементы массива, тебе необходимо завести переменную, которая будет увеличивать значение с каждой итерацией (разом) выполнения цикла. Собственно говоря, именно это я и делаю в своем примере. В качестве условия у меня выступает сравнение переменной «Индекс» с результатом выполнения метода «Количество()» нашего массива. Если значение переменной «Индекс» меньше либо общего количества элементов массива, то значит, наш цикл должен выполняться. В теле цикла я также вывожу текстовое сообщение, но помимо этого я самостоятельно увеличиваю значение переменной «Индекс» на единицу. Если этого не сделать, то наш цикл никогда не завершиться. В таких случаях говорят код «зацикливается». Когда используешь цикл «Пока» для решения подобного рода задач нужно быть крайне внимательным. Стоит только забыть написать одну строчку кода (например, увеличивающую значение переменной) и результаты буду в корне отличаться от ожидаемых. С двумя видами циклов мы познакомились, vr-online | октябрь 201 0


11 3

Школа остался последний и один из самых удобных затем внес одну строку. После этого я запустил цикл, который при очередном циклов. Сейчас ты узнаешь почему. Как выполнении должен выводить текст, обычно, немного видоизменим код: содержащий название номенклатуры и цену. Для Каждого Элемент Из Массив Цикл Переменная «Строка» на каждой итерации Сообщить(Элемент); цикла будет принимать значение типа КонецЦикла; «СтрокаТаблицыЗначений» и содержать считанную строку. Из всех рассматриваемых примеров этот получился самым коротким и это благодаря Процедуры циклу «Для..Каждого..Из». По правде говоря, Как и во многих языках программирования в языке 1 С имеется поддержка функций и это не совсем удачный пример для процедур. Про функции мы поговорим чуть рассмотрения этого типа циклов. Тут не в позже, а процедуры рассмотрим прямо полной мере ощущается удобство от его сейчас. Начнем опять же с определения. использования. Процедура - именованная часть программы, Я уже говорил, что цикл «Для..Каждого» содержащая описание определенного используется для перебора всевозможных набора действий. Вот такое определение коллекций-значений. Массив – как раз процедуре дает знаменитая Википедия. Суть таковым и является. Обрати внимание на оно отражает правильно, но звучит объявленную переменную «Элемент». На каждой итерации цикла (разе выполнения) в несколько заумно. Давай попробуем его упростить. Например, так: Процедура - это нее будет присваиваться очередное считанное значение из массива. Поскольку в отдельный участок кода, выполняющий определенные операции. Уже немного массиве у нас всего одно «поле», то в переменной сразу будет значение. Вот если лучше, но не хорошо. Что ж, недостающую информацию попробуем получить на бы мы перебирали скажем таблицу практике. значений, в которой было бы создано В языке 1 С, процедуры принято описывать несколько колонок, то в этом случае в переменной «Элемент» была бы отдельная следующим образом: строка таблицы значений и ты мог бы Процедура <Имя процедуры> (<параметр1 >, <параметр2>, <параметрN>); <Модификатор> обратиться к любой колонке с целью получения записанного в ней значения. Не Если ты программировал на Delphi или могу не привести пример небольшой пример: любом другом языке, где есть процедуры, то ТаблицаЗначений = Новый ТаблицаЗначений; наверное уже заметил сходство в описании. ТаблицаЗначений.Колонки.Добавить("Номенклатур Перед тем как привести пример реальной а"); процедуры, я хочу обратить твое внимание ТаблицаЗначений.Колонки.Добавить("ЕдиницаИзм на опциональный параметр «Модификатор». ерения"); Под модификатором я подразумеваю, ТаблицаЗначений.Колонки.Добавить("Цена"); возможность процедуры становится экспортной. Помнишь, в прошлом выпуске НоваяСтрока = ТаблицаЗначений.Добавить(); журнала я рассказывал тебе про экспортные НоваяСтрока.Номенклатура = "Масло переменные? С процедурами та же история. подсолнечное"; Если ты создаешь процедуру, скажем в НоваяСтрока.ЕдиницаИзмерения = "Шт"; общем модуле, то чтобы она стала доступна, НоваяСтрока.Цена = "222.24"; тебе необходимо дописать в конце процедуры ключевое слово «Экспорт». Если Для Каждого Строка Из ТаблицаЗначений Цикл этого не сделать, то вызывать процедуру ты Сообщить(Строка.Номенклатура + " " + не сможешь. СТрока.Цена); КонецЦикла; С теорией немного разобрались и теперь самое время попробовать описать свою первую процедуру. Перейди в редактор кода В этом примере я создал новую таблицу и напиши в нем следующий код: значений, добавил в нее три колонки, а vr-online | октябрь 201 0


11 4

Школа Процедура ПерваяПроцедура (Делимое, Делитель) Если Делитель = 0 Тогда Сообщить("Возникла ошибка! На ноль делить нельзя."); Возврат; КонецЕсли; Результат = Делимое / Делитель; Сообщить(Результат); КонецПроцедуры

Учти, этот код нужно писать не в процедуреобработчике события, а отдельно. В обработчике события нажатия кнопки мы должны написать только вызов процедуры: ПерваяПроцедура(1 0, 5);

Попробуй запустить программу и нажать кнопку «Выполнить». Сразу после этого в окне служебных сообщений ты увидишь текст «2» (десять делим на пять - получаем два). Ok, с результатами разобрались. Переходим к более детальному рассмотрению тела нашей процедуры. В нем мы видим, в нем мы видим… Стандартный код, который мы уже неоднократно писали. Единственное чего ты тут можешь не знать – оператор «Возврат». Этот оператор выполняет две функции. Если его использовать в процедурах, то им можно прерывать ход их выполнения. Например, ты выполняешь какие-то проверки и случилось так, что они успешно не выполнились, и поэтому нет смысла продолжать выполнение кода. В таких случаях достаточно вызвать оператор «Возврат» и выполнение процедуры будет прервано. Забегая вперед, скажу, что в функциях оператор «Возврат» используется для возврата значений. Об этом немного позже.

Функции

Функции – это те же процедуры, но с одним отличием. Они должны возвращать какой-то результат. Функции очень удобно применять для кода, который выполняет какие-то расчеты и эти расчеты приходится выполнять несколько раз. Попробуем рассмотреть небольшой пример. Процедура КнопкаВыполнитьНажатие(Кнопка) Результат1 = Сложение(5, 1 0); //1 5 Результат2 = Умножение(32, 42); //1 344 Результат3 = Вычитание(5, 2); //3

КонецПроцедуры Функция Сложение(Число1 , Число2) Возврат Число1 + Число2; КонецФункции Функция Умножение(Число1 , Число2) Возврат Число1 * Число2; КонецФункции Функция Вычитание(Число1 , Число2) Возврат Число1 - Число2; КонецФункции

В этом коде представлено объявление нескольких функций: Сложение, Умножение, Вычитание. Каждая из них выполняет соответствующую математическую операцию. Во всех этих функциях присутствует всего лишь одна строчка кода: Возврат <математическая операция с переменными> Когда я рассказывал про процедуры, я затронул рассмотрение оператора «Возврат». Напомню, при использовании этого оператора в процедурах, он вызывает их прерывания. В функциях, этот оператор предназначен для возврата значения. Получается, что сразу после выполнения математической операции, ее результат будет отправлен в то место программы, откуда была вызвана функция. В нашем случае этим местом будет обработчик события нажатия кнопки. Если сказать еще точнее, то результат расчетов будет записан в соответствующую переменную. Для нашего кода это будет одна из переменных с именем «Результат».

Передача параметров в процедуры и функции

Ты уже знаешь, что и в процедуры и в функции мы можем передавать параметры. Казалось бы, здесь больше-то и добавить нечего, но это только на первый взгляд. В языке 1 С, как и во многих других языках программирования, параметры в функции/процедуры можно передавать двумя способами: по ссылкам и по значению. Изначально, все параметры передаются по vr-online | октябрь 201 0


11 5

Школа ссылкам. А это значит, что если ты передаешь в качестве параметра переменную и произведешь с ней в процедуре/функции какие-то действия, которые изменят ее значение, то значение передаваемой переменной тоже будет изменено. Для большей наглядности взгляни на пример: Процедура КнопкаВыполнитьНажатие(Кнопка) Делитель = 5; ВыводЧисла(Делитель); Сообщить("Число, после вывода: " + Делитель); КонецПроцедуры

Процедура ВыводЧисла(Число) Сообщить("Число, переданное в процедуру: " + Число); Число = Число - 1 ; КонецПроцедуры

В процедуре «КнопкаВыполнитьНажатие» происходит объявление переменной «Делитель», а затем вызов процедуры «ВыводЧисла», в которую в качестве параметра передается переменная «Делитель». Запомни, что в момент передачи переменной ее значение равно 5. После того, как она попала в процедуру «ВыводЧисла» выводится сообщение с ее значением (переменной), а затем присваивается новое. В качестве нового значения я указываю результат вычитания от текущего значения единицу. Итого, переменная «Число» (а если быть точным, то «Делитель») получает новое значение. На этом выполнение процедуры «ВыводЧисла» завершается и начинается самое интересное. После вызова процедуры «ВыводЧисла» я пробую вывести сообщение со значением переменной «Делитель». Как ты думаешь, чему оно будет равно? Пяти или четырем? Правильно, четырем. Почему? А потому, что мы передавали параметр по ссылке, а значит процедура «ВыводЧисла» работала не с копией переменной, а именно с той, которую мы передали.

Теперь представим, что нам требуется написать процедуру, в которую значение должно передавать не по ссылке, а по значению. Как это сделать? Очень просто. Достаточно перед параметрами в описываемой процедуре вставить ключевое слово «Знач». Исправь в предыдущем примере описание процедуры «ВыводЧисла»:

Процедура ВыводЧисла(Знач Число) Сообщить("Число, переданное в процедуру: " + Число); Число = Число - 1 ;

КонецПроцедуры Этот код отличается от предыдущего лишь наличием ключевого слово «Знач» перед параметром «Число». Сохрани изменения и запусти пример заново. Теперь результат будет совсем другим (см. рисунок 4).

Рисунок 4. Передача параметров по значению Поскольку мы принудительно указали, что параметр передается по значению, операции над переменной внутри процедуры никак не влияют на значение переменной, которую передавали в качестве параметра. Запомни этот нюанс и не забывай про него во время разработки своих приложений.

Подводим итоги

Я не планировал, что эта статья получится такой большой. Но получилось то, что получилось. Новой информации я выдал достаточно много, поэтому надо бы написать какой-нибудь полезный примерчик для закрепления всего сказанного на практике. Сегодня я оставляю решение этой задачи на твоей совести. Попробуй потренироваться и написать что-нибудь простенькое, а в следующий раз я продемонстрирую тебе какой-нибудь навороченный примерчик. Удачи!

Рисунок 3. Передача переменных по ссылкам vr-online | октябрь 201 0


Автор: Anthony Soprano Почта: tonysoprano.93@bk.ru

11 6

"Не забуду" Креатиff

Рассказ

Я знаю, что это такое, когда уезжают. Неделю умираешь, неделю просто больно, потом начинаешь забывать, а потом кажется, что ничего и не было, что было не с тобой, и вот ты плюешь на все. И говоришь себе: динго, это жизнь, так уж она устроена. Так уж устроена эта глупая жизнь. Как будто не потеряла что-то навсегда. (с)Джон Фаулз. Волхв Было уже темно, легкий ветер гонял сухие листья по пустому тротуару. Он шёл на трамвайную остановку. Договорился встретиться с другом у кафе в центре города. Голова была беспорядочно забита мыслями, он ни как не мог собраться наконец и сказать себе - "Забудь ее, забудь навсегда, она любит другого и ты ей ни к чему, ни твои признания, ни твои цветы, просто перелестни эту страницу...нет... лучше вырви и выкинь подальше, чтобы никогда не вспоминать о ней...". Но нет. То ли он нарочно создал повод, чтобы не видеть, что происходит вокруг, чтобы хоть на пару минут забыть в каком городе он живет и зачем он в этом городе (как ему все это надоело...), толи эта мысль правда не давала ему покоя. Он шёл, не осматриваясь по сторонам, как обычно, в поисках той, которая могла бы помочь ему забыть о Тане. Он шел, глядя перед собой и докуривая очередную сигарету. Мысли все кружились в голове ураганом, не давая ему ни единого шанса прогнать этот ураган прочь. Звонок: - Здарова! Ну что, ты где сейчас? - Да вот только к остановке подошёл, скоро буду. - Ну ладно, позвоню, когда к кафе подойду. - Окей, давай. После короткого разговора вдалеке стал виден трамвай. Уже понемногу пробирал холодок. Он начал ходить маленькими шажками, чтобы хоть как-то разогнать кровь. Татьяна - простое имя простой девушки из

простого провинциального городка. Но только это имя напоминало ему о том, что он чувствовал к ней на протяжении почти 3-х лет. Он знал, что он совершил большую ошибку, самую большую ошибку в его жизни - он не признался ей до сих пор. Все это время он носил этот ураган в себе. Любое напоминание ее имени или о ней самой погружало его в долгие воспоминания и мечты. Говорят "Время лечит" - он не верил в это. Он понимал, что чем дольше их разделяет время, тем дальше он от нее уходит, и ему становилось только хуже от этого. Он не хочет с этим смириться, но он не в силах сказать ей об этом на расстоянии больше трех тысяч километров, тем более на телефон она не отвечала, а социальных сетях она не была зарегистрирована. Иначе он давно исправил бы свою ошибку. Сидя в трамвае, его голова просто кишила отрывками из жизни, о том, как он мечтал перед сном увидеть ее на следующий день, как они будут гулять по улице, по парку, как он проводит ее до дома и они впервые поцелуются... Но ничего этого не было. Он был достаточно скромен и лишний раз мочалив, чтобы носить всю тяжесть этих воспоминаний в себе. Придя на место встречи быстрее своего друга, он снова закурил. Кадры из фильма, в котором у них с Таней все могло бы быть хорошо, постоянно проносились перед глазами. Негромкое "Привет" вернуло его в реальность - друг, как раз вовремя. Начал моросить дождик, когда они зашли в кафе и заказали по чашечке чая. Непродолжительная беседа о проведенных vr-online | октябрь 201 0


11 7

Креатиff выходных была прервана фразой: - Ну, рассказывай, что там у тебя? Слушая рассказ друга, он снова начал углубяться в свои мысли, но вовремя очнулся и произнес: - ...блин...не помню говорил я тебе или нет... В родном городе девушка есть... наверное, я тебе рассказывал все-таки... не могу никак забыть ее, Таней зовут... - А да-да, помню что-то подобное, рассказывал ты вроде. И что она говорит? - ...да ничего она не говорит, ее ни в Интернете нет, ни трубку она не берет, толи потеряла, толи еще чего... - Ну позвони кому-нибудь их своих тамашних, спроси, может, знают чего? - Я попросил маму позвонить им домой, узнать Танин номер. Наши мамы раньше общались, но моя не хочет с ней больше связываться - поссорились или что-то в этом роде... На телефон она перестала отвечать с того дня, когда он уехал в другой город продолжать учебу. Во время долгой стоянки на какой-то станции, сидя на скамейке, он отправил ей длинную смс-ку, где изложил все, что "накипело". Все, что он так долго хотел ей сказать, но не смог: "Привет! Очень хотел с тобой встретиться, пока был в городе, но видимо какие-то неведомые силы не желают, чтобы это когданибудь произошло. Хотелось сказать тебе те слова, которые держал в себе на коротком поводке все то время, сколько мы знаем друг друга... Но если встречи не случилось, хочу тебе сказать это сейчас - Я люблю тебя. Люблю с того самого дня, когда встретились, и до сих пор. Твои образ несет мне только хорошие и светлые воспоминания о тебе. Я уверен - в моей жизни никогда не будет человека, которого я буду любить так же, как тебя, который сможет подарить столько радости от общения как ты, только лишь от того, что ты есть на этом свете. Я люблю тебя, и не могу с этим ничего поделать... Я не знаю, будет ли это для тебя так важно, как для меня, но просто я очень хотел, чтобы ты узнала об этом." Он ощутил, как что-то, буквально, прокололо

его грудь, его душу (может это были те самые неведомые силы, о которых говорил в смс), когда на экране телефона он увидел: "Сообщение для абонента Танечка не доставлено.", недолго думая, он решил позвонить - "Аппарат абонента выключен....". После того, как собеседник выслушал его рассказ, их разговор продолжался около часа, после чего они собрались по домам. Шагая по мокрой улице к трамвайной остановке, он молча курил и снова пытался прибраться у себя в голове, разгрести весь бардак и поставить себя на место. В трамвае он долго смотрел в окно на прохожих, на проезжающие мимо автомобили и красочные вывески. Пассажиры были озабочены каждый своими проблемами, никому не было дела до какого-то парня в невзрачной куртке и потрепанных джинсах. При всем своем желании вырвать, скомкать, растоптать, выкинуть, сжечь эту страницу из своей жизни он понял: "Нет, я не могу так... я не забуду тебя..."

vr-online | октябрь 201 0


Автор: Gh[]st [HackLabbs Team] Почта: nuw@tut.by

11 8

FAQ по FreeBSD

FAQ по FreeBSD Вы спрашивали ­ мы отвечаем

У многих из нах возникают вопросы и эти вопросы требут ответов, поэтому специально для таких как Вы, ищущих, мы представляем рублику FAQ, на тему unix и unix-подобных систем (помни linux - не unix!). Есть вопросы? Смело присылайте их на мыло nuw@tut.by Q: Выходят новые версии приложений и библиотек, но в пакетах они не обновляются, и в портах лежат устаревшие версии. В качестве OS использую FreeBSD. Как я могу установить приложения новых версий? A: Выход находится в самой системе портов.

Для начала её следует обновить, самый простой способ это - скачать архив портов с официального FTP: ftp.freebsd.org/pub/FreeBSD/ports/ports/ports.t ar.gz Затем переходим в /usr/ports и удаляем содержимое каталога, затем распаковываем скачанный архив, теперь мы можем собирать новые версии.

Q: У меня есть iso образ диска. В качестве OS использую FreeBSD 7.x. Как я могу просмотреть содержимое образа? A: Всё просто, посредством стандартной утилиты mount, но есть один нюанс, для начала нужно создать блочное устройство для образа, на практике это будет выглядеть так: mdconfig -a -f путь к файлу iso

в ответ нам выведется присвоенное блочному устройству имя mount_cd9660 /dev/присвоеное_имя /путь_монтирования Например: unix# mdconfig -a -f /home/MIF/uw71 4.CD1 .Jun2008.iso md0 unix# mount_cd9660 /dev/md0 /cdrom unix# cd /cdrom && ls .extra.d jale LocalDoc javax.comm-relnotes.html TEDdesk kdb

Q: Как с помощью стандартной утилиты tar распаковать и упаковать архив? Я новичок в мире юникса, и научился пользоваться только утилитой ARK, хотел бы понять принцип утилиты tar. ....... A: Утилита tar является одной из древних утилит в мире unix, о ней можно написать целую статью, но вкратце команды: для извлечения архива - tar xf имя архива, параметры: f-файл, x-извлечение из архива. для запаковки архива - tar cfz/y путь к файлу либо диркектории, можно несколько, например: tar cfy /usr/sbin /etc/passwd /bin, параметры: c-упаковываем от create, fанологично распаковке, z-создаём архив с gzip сжатием, y-создаём архив с bzip2 сжатием. За более детальными инструкциями обращайся к man tar.

Для демонтирования: umount /точка_монтирования либо umount /dev/имя_блочного_устройства , и не забываем уничтожить блочное устройство коммандой: mdconfig -d -u имя_блочного_устройства Например: unix# umount /dev/md0 unix# mdconfig -d -u md0

Выполняеться с привелегиями рута.

Q: Имеется компьютер, на нём vr-online | октябрь 201 0


11 9

FAQ по FreeBSD установлена OS Windows, ставил OS FreeBSD на виртуальную машину, понравилась, хочу установить на ПК, но при это я не хочу удалять Windows, как я могу это сделать? A: Всё гениальное просто, есть много

вариантов, опишу элементарные. Всё проходит в несколько шагов: 1 ) выделяем свободное дисковое пространство Partion редактором, например Acronics'ом 2) либо устанавливаем загрузчик FreeBSD install mbr manager, и с помощью него грузимся либо идём по следующему пункту 3) берём файл /boot/boot1 копируем его на винду (на тот диск, на котором стоит Win), и изменяем имя на bootsect.bsd, а потом в C:\boot.ini добавляем строчку C:\bootsect.bsd="FreeBSD" 4) можно установить стороний загрузчик, например grub, SyMON

файловой системе FAT, либо "mount_ntfs -CKOI8-R /dev/устройство /точка монтирования" при NTFS файловой системе. При открытии файла в текстовом редакторе вам нужно выбрать автоопределение кодировки, либо cp1 251 .

Q: У меня такой вопросик, можно ли узнать с какими параметрами был собран порт? (OS FreeBSD) очень нужно, т.к. возникла конфликтная ситуация между портами. A: Переходим в католог /var/db/ports, находим нужный порт и в файле options смотрим, с какими опциями был установлен порт.

Q: Стоит у меня дома ПК с FreeBSD, в офисе у меня Windows XP. Когда я перекидываю файл с офиса на домашний ПК (приношу на флешке), то вместо имени файла получаю набор символов, в самом файле тоже самое, все буквы перепутаны на фиг. В чём моя проблема и как её решить? A: Дело в том что у Windows используется

кодировка CP1 251 , на FreeBSD же, как и положено unix системе, KOI8-R. Следует установить русскую локаль "pw usermod имя -L russian" при монтировании сьёмного накопителя использовать "mount_msdosfs -L ru_RU.KOI8-R -D KOI8-R /dev/устройство /точка монтирования" при

vr-online | октябрь 201 0


VR-ONLINE


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.