Page 1


ПРО

граммист

СОДЕРЖАНИЕ

№13 (апрель) 2011

Издается с марта 2010. Выходит ежемесячно №13, апрель 2011 г.

Редакция: Выпускающий редактор Сергей Бадло Литературный редактор Utkin Редакторы JTG, Василий Мединцев, Natali-Ka, Алексей Шульга, Егор Горохов Редактор-корректор Ян Липлавский

Дизайн и верстка:

Natali-Ka, Сергей Бадло

Авторский состав:

Utkin, Игорь Теслюк, Мират Каденов, Алексей Шишкин, Владимир Яковлев, Виталий Белик, Антон Осипов, Варвара Беженова, Сергей Бадло

Официальный сайт журнала: www.procoder.info

Контакты:

Авторские статьи направляйте на maindatacentr@gmail.com Вопросы и предложения для редакции reddatacentr@gmail.com Вопросы и предложения администратору info@procoder.info

Информационная поддержка:

Международная Академия Информатизации (МАИН) РК www.academy.kz Журнал «Радиолюбитель» www.radioliga.com Журнал «VR-ONLINE» www.vr-online.ru V.K. сайт... www.kotoff.info Free Legal Soft Group www.flsoft.ru Некоммерческая сеть AirNet-Berdyansk www.airnet.sytes.net Электронная электротехническая библиотека www.electrolibrary.info

СЛОВО РЕДАКТОРА

Времена меняются – меняемся и мы ............................... с.3 НЕВЕРОЯТНО, НО ФАКТ

Любопытные факты ............................................... с.4 VIP ПЕРСОНА

Журнал «Я электрик». Интервью с Андреем Повным ................. с.12 МЕРОПРИЯТИЯ, КОНФЕРЕНЦИИ

CodeCamp 2011 – Открытая конференция для разработчиков ......... с.21 BEST – Инженерные соревнования в Запорожье ..................... с.23 НОВОСТИ ПО

Lazarus – альтернатива Delphi или таинственная тень? ........... с.25 Scheme. Некоторые заметки о ФП ................................. с.29 АЛГОРИТМЫ

Арифметика длинных чисел. Часть 2 .............................. с.38 ЛАБОРАТОРИЯ

HTML нараспашку. Часть 1 ....................................... с.50 Запускаем AHCI ................................................. с.63 Цифровой нерекурсивный фильтр на микроконтроллере .............. с.65 ЮМОР

Чего только не бывает .......................................... с.69

Примечание:

Издание некоммерческое. Все материалы, товарные знаки, торговые марки и логотипы, упомянутые в журнале, принадлежат их владельцам. Статьи, поступающие в редакцию, рецензируются. Мнение авторов не всегда совпадает с мнением редакции. Перепечатка материалов журнала и использование их в любой форме, в том числе в электронных СМИ, возможны только с разрешения редакции. Тираж неограничен. Формат A4, 70 стр.

Идея создания журнала: Алексей Шульга

Обложка номера: Дизайн Natali-Ka

Архив номеров журнала!


ПРО

№13 (апрель) 2011

граммист

СЛОВО РЕДАКТОРА Сергей Бадло

http://procoder.info

ВРЕМЕНА МЕНЯЮТСЯ – МЕНЯЕМСЯ И МЫ...

Уважаемые читатели! Текущий выпуск можно считать знаковым для нашего журнала. Проект перешагнул черту в один год: у нас новый дизайн, новые авторы. Ожидается конкурс на лучшую символику*. Мы стали партнерами открытой конференции для разработчиков CodeCamp-2011 http://codecamp.su и Инженерных соревнований BEST http://higenius.org.ua. Читайте об этом на с.21 и 23.

В этом выпуске...

Общие требования к материалам

Рубрика «VIP персона». У нас в гостях автор и

У

журнала «Я электрик», Андрей Повный.

верстки

создатель электронного электротехнического Все больше и больше сторонников свободного ПО

задаются

вопросом:

«Lazarus

альтернатива Delphi или таинственная тень?». В рубрике «Новости ПО» Алексей Шишкин выскажет свою точку зрения. Также в рубрике вас

ожидают

функциональном использованием Каденова. В

рубрике

некоторые

заметки

программировании

языка

Scheme

«Алгоритмы»

наш

от

о с

Мирата

бессменный

нас

нет

категоричных

требований

к

«SCRIBUS»

и

оформлению, но в связи с особенностями в

свободном

ПО

облегчения труда редакторов, есть некоторый желательный минимум: • статья

должна

иметь

выраженную

структуру и содержать название статьи, сведения об авторах, экскурс, информацию о

средствах

разработки,

теоретическую

и/или практическую часть, заключение и ресурсы к статье;

• текст статьи в формате OpenOffice, MS Word, VK WordPad или обычным текстовым файлом, шрифт Arial 10;

литературный редактор Utkin расскажет о

• все

в своих проектах без привязки к языку.

• рисунки к статье должны прилагаться в

нюансах использования длинной арифметики Рубрика

реализацией

«Лаборатория» цифрового

порадует

нерекурсивного

фильтра на микроконтроллере. Читаем статью

Владимира Яковлева. Но сюрпризы рубрики на

этом

не

заканчиваются...

«Наш

ответ

Гуглехрому», – так можно озаглавить цикл

статей про создание собственного браузера от

рисунки,

таблицы

должны

быть

подписаны и иметь упоминание в тексте;

виде отдельных файлов в формате PNG, TIF;

• для

снятия

скриншотов

рекомендуем

использовать freeware программу G.A.P;

• разделы статьи отделять двумя <ENTER>;

• электронный адрес для корреспонденции maindatacentr@gmail.com.

шеф-повара Виталия Белика. Windows Seven и

По присланным материалам автор получает

активировать

замечаниям. Шаблон для написания статьи

AHCI. Что их связывает? AHCI позволяет недоступные

в

многие

режиме

функции

SATA,

совместимости

с

морально устаревшим Parallel ATA. О методике активации режима расскажет Игорь Теслюк...

* Лучшим авторам и победителям конкурсов, а также желающим оставить себе памятный подарок о проекте, будет предоставлена возможность получить и/или заказать кружки, коврики и футболки с символикой журнала. Подробности см. на форуме журнала http://forum.procoder.info.

рецензию и корректирует статью согласно можно взять тут.

С уважением,

выпускающий редактор, член-корреспондент МАИН

3


ПРО

№13 (апрель) 2011

граммист

Сергей Бадло

http://procoder.info

НЕВЕРОЯТНО, НО ФАКТ

ЛЮБОПЫТНЫЕ ФАКТЫ

На днях, пролистывая ресурсы по безопасности, попалась новость про очередную уязвимость в Линуксе через аудиодрайвер caiaq и использование специально сконфигурированного USB драйва. К слову, используется всем известное пресловутое переполнение буфера в strcpy(). Заинтересовало другое: для взлома путем передачи мессаджа имени устройства (согласно протоколу USB) длиной более 80 символов, был использован микроконтроллер серии AT90USB. Смотрю, популярность данных МК возрастет, надо успеть «затариться».

Очередной вариант компактных рулонных

Спустя 30 лет после введения перехода на

Electric Systems на Международной выставке

этой практики. С осени 2011 года россияне не

солнечных батарей представила компания Fuji

по производству электроэнергии фотогальваническими

установками

Устройство

представляет

PV

Expo

2011,

прошедшей в Токио со 2 по 4 марта 2011 года. кейс

весом

3

кг,

в

собой

котором

небольшой находится

аккумулятор и свернутая в рулон солнечная

батарея. Мощность, выдаваемая устройством, составляет 40 Вт: 24 Вт выдает встроенный аккумулятор

и

16

Вт

гибкая

солнечная

батарея. Компания начала продажи устройств

в январе 2011 года по цене около 690$ и планирует за год продать 10000 единиц.

зимнее-летнее время Россия отказывается от

будут переводить стрелки часов на час назад. Об

этом

заявил

президент

РФ

Дмитрий

Медведев 8 февраля на встрече с молодыми

учеными и лауреатами премии президента РФ

в области науки и инноваций за 2010 год, сообщает РИА Новости. «Я принял решение об отмене перехода на зимнее время, начиная с

осени

текущего

года.

И

даю

соответствующее поручение правительству» – цитирует

Медведева

информагентство.

Практика перевода часов на зимнее и летнее время

существует

во

многих

странах.

В

России она просуществовала 30 лет и все это время

велась

жесткая

дискуссия

о

целесообразности перевода часов. Вопрос об отмене подобной практики Медевдев поднял в ноябре

2009

г.

в

ежегодном

Федеральному Собра-нию. Мобильник компания

=

ноутбук

Motorola

=

ПК?

представила

послании Недавно публике

телефон Atrix 4G на платформе Android 2.2. На

первый

смартфон:

взгляд

разрешением 802.11b/g/n, пиксельная

это

просто

четырехдюймовый 540х960

Bluetooth,

камера,

мощный

дисплей

пикселей, GPS,

батарея

на

с

Wi-Fi

пятимега-

264

часа

ожидания и 9 часов трепа, встроенная память * Компания Фуджи тут не первопроходец. К примеру, в Интернет-магазине http://tachanka.com.ua/catalog/i/386rulonnye-gibkie-batarei-solarroll-9-vatt.html уже давно можно купить рулонные гибкие батареи SolarRoll за 290 уе от производителя http://www.brunton.com/product.php?id=256.

4


ПРО

№13 (апрель) 2011

граммист

НЕВЕРОЯТНО, НО ФАКТ Фонд

конкурс

РОСНАНО по

объявляет

отбору

открытый

проектов

создания

нанотехнологических центров и приглашает к участию заинтересованных лиц. Подробное

описание требований к проектам и условий инвестиционного

соглашения,

а

также

порядка проведения конкурса содержится в

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

http://www.rusnano.com/Secti-

on.aspx/Show/24418. объемом 16 ГБ, слот для microSD. Шуршит это все на двухъядерном камне Tegra 2 с частотой 1 ГГц. Оперативка – 1 ГБ… Но, главное в Atrix 4G, конечно, не то, что он мощный. Главное в

нем то, что он может работать как системник десктопа и как «мозг» ноутбука. К нему в

дополнение выпущены полезные док-станции. Одна внешне похожа на ноутбук, но в ней

самой есть только экран, батарея, клавиатура и тачпад. Ноутбуком она становится, если в нее

вставить

позволяет

телефон

подключать

Atrix

4G.

взрослый

Другая

монитор,

человеческую клавиатуру и кучу периферии и использовать

телефон

настольную систему:

как

нормальную

отбираются

Победители

конкурсной

результатам

конкурса

комиссией

по

научно-технической

и

инвестиционной экспертизы. Команды этих проектов

должны

обладать

достаточными

профессиональными знаниями и опытом в

сфере коммерциализации результатов научных

исследований,

а

также

соответст-

вующими финансовыми, кадровыми и иными необходимыми поддержаны

ресурсами,

а

региональными

также

быть

администра-

циями. Победители конкурса получат право на заключение инвестиционного соглашения с

РОСНАНО

о

реализации

проекта

созданию нанотехнологического центра.

по

Касперский предложил ввести интернетпаспорта и взять под контроль пользователей

сети интернет и тем самым снизить уровень с правонарушений в сети, не совсем обычным

образом, сообщает издание Security Lab со ссылкой

на

полиция,

в

вариантов,

ZDNet

может

Asia.

быть

Как

введена

обязанности,

один

из

интернет-

которой

будет

входить: отслеживание право-нарушителей и обеспечение Интернете. откажутся,

соблюдения

Если

что

ж,

законности

какие-либо

эти

страны

в

страны

следует

отключить от Сети. Своими высказываниями Евгений вызвал негатив со стороны многих

блогеров рунета, которые тут же предложили объявить продукции компании «Лаборатория Касперского» бойкот.

5


ПРО

№13 (апрель) 2011

граммист

НЕВЕРОЯТНО, НО ФАКТ

Создан

прототип

антилазера,

который

длинах волн, два лазерных пучка, установлен-

показали

этим материалом. Теперь команда ученых

поглощает свет, а не излучает его. Физики из Йельского рабочий

университета

вариант

устройства,

(США)

простого

полностью

кремниевого

противоположного

лазеру и предназначенного для поглощения когерентного

излучения.

Обычные

лазеры,

напомним, преобразуют энергию накачки в

энергию когерентного, монохроматического и узконаправленного

излучения.

Простейшие

их варианты строятся на базе помещенного в

оптический резонатор инертного газа; сам резонатор

при

параллельных

этом

зеркал,

состоит

одно

из

из

двух

которых

полупрозрачное, чтобы излучение выходило наружу. Такая схема в условиях накачки позволяет

получить

населенностей усиление.

Летом

представили

«обращенного

и

эффект

искомое

прошлого

теоретическое во

ных друг против друга, будут поглощаться перешла от теории к практике, используя кремниевые

микрометров.

плитки В

размерами

эксперименте

всего

луч

110

титан-

сапфирового лазера, работавшего в ближнем ИК-диапазоне, полученные

разделялся

пучки

противоположные

надвое,

и

направлялись

грани

на

кремниевого

образца. Эти грани стали аналогами зеркал, а кремний

занял

место

инертного

газа.

Кремнию удалось поглотить 99.4% ближнего инфракрасного света с длиной волны в 998.5 нм, превратив его в тепло.

инверсии

оптическое

года

времени»

ученые

описание

лазера,

возможности его практического применения. Исследователи использовать

подсчитали,

поглощающий

что

свет

если

материал,

такой как кремний, то, при определенных .

6


ПРО

№13 (апрель) 2011

граммист

НЕВЕРОЯТНО, НО ФАКТ XVIII

конференция

мационные

«Современные

технологии

в

инфор-

образовании:

Южный Федеральный округ» состоится 11-13 мая

2011

года

университете

в

проведения ней

в

Южном

Ростове-на-Дону.

нынеш-

конференции

СИТО-2011 является

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

ис-

инфортехно-

логий в образовании и

науке,

вания

формиро-

инфраструк-

туры

образователь-

ной информационной среды, итогов

обсуждение

деятельности

системы ЦНИТ за 20

лет работы в отрасли. 11

мая

состоится

открытие

российском нальном

в

Южнорегио-

центре

форматизации

ин-

ЮФУ

(ЮГИНФО ЮФУ). 12 мая

участники

приглашаются

федеральном

на

Впервые

Целью

получено

Космические

участвовать студенты, аспиранты, молодые

исследователи от 18 до 28 лет включительно. В

мероприятиях

и

среднесрочной изображение

STEREO-A

и

STEREO-B

Солнца. (Solar

связей), запущенные в космос в октябре 2006 года, приступили к

летие ции

составлен

2

февраля.

изображение

Еще

виден

нашего

зазор

светила.

между

Снимок

снимками

активность

Солнца

аспектах, как выбросы плазмы, вспышки, изменения направлений

работе

сайте

конферен-

GSM

активность, с высокой точностью смогут прогнозировать погоду для

вает

специалисты, видя происходящую на дальней стороне Солнца Земли.

Ранее

трудность

заключалась

в

том,

что

о

влиянии

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

«затылком» к нам. Теперь, обладая трехмерной картиной солнечной

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

размещена

на

конференции

tech2011.

магнитных нитей. Наиболее ценным является то, что теперь

(GSMA) дарт

ассоциация

разрабаты-

единый

виртуальных

SIM-карт, ющих

стан-

позволя-

работать

в

любых сетях мобильным устройствам без чипа с информацией об абоненте. Первые

прототипы предположительно появятся к 2012

году.

неподтвержденной

базе

По

информации,

компа-

аналогичные

разра-

обеспечения

для

ния Apple тоже ведет

заседаний

продолжит

в

за активностью звезды. Ученые получают данные о таких ключевых

ботки

Ученого Совета ЮФУ. СИТО2011

в

http://conf.sfedu.ru/inf

регистрирующими

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

«20-

13 мая конференция

информация

об условиях участия

телескопами,

очередь, объединяют снимки в единое целое. Оба зонда оснащены

рое будет проведено зале

Информацион-

ные технологии. Под-

ции

центров НИТ», котов

участ-

части Солнца, передает их специалистам на Земле, которые, в свою

образования на

с

аппаратов. Каждый аппарат, получая изображения видимой ему

Отбор

вляться по направлеробная

360-градусное

эффек-

ников будет осущест-

точки земной орбиты, аппараты передали на Землю первое в

информатиза-

России

зации. нию:

трехмерного изображения Солнца. Разойдясь в противоположные

их

тивной коммерциали-

выполнению главной возложенной на них задачи – получению

заседание юбилейной конференции

перспективой

Terrestrial Relations Observatory, Обсерватория солнечно-земных

истории

участвуют

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

трехмерное

зонды-близнецы

программы

свою

работу

программного

iPhone, которое поз-

в

волит телефонам американского производи-

СИТО2011 пройдет конкурс участников для

Представители крупнейших операторов мира

ЮГИНФО ЮФУ. В ходе работы конференции программы «У.М.Н.И.К.» В конкурсе могут

теля

работать

в

сети

любого

оператора.

крайне обеспокоены инициативой Apple.

7


ПРО

№13 (апрель) 2011

граммист

НЕВЕРОЯТНО, НО ФАКТ Робот подменяет студента американского колледжа. Одному из студентов первого курса техасского колледжа в силу тяжелой болезни разрешили

вместо

классные

себя

отправлять

занятия

на

дистанционно

управляемого робота Vgo. Молодой парень по имени Линдон Батый (Lyndon Baty) страдает поликистозной

болезнью

сильно

И

лечения

антибиотиками

ослаб.

чтобы

почек.

его

не

После

иммунитет осложнить

заболевание, врачи ему временно запретили Специальные аспирантов

призы

и

для

молодых

студентов,

ученых

учредила

компания НТ МДТ, в рамках V Всероссийского форума

олимпиады

«Нанотехнологии

-

прорыв в будущее». Все победители конкурса будут приглашены в Москву для участия в семинаре очного

рамках

по

нанотехнологиям

(финального)

полезные

семинара

работе

лекции, с

этапа

Вас

но

и

специалистов

института.

по

научным

лекций

ведущих

Часть

лекций

сертификат. Победители конкурса НИР будут закрытии

нанотехнологиям

олимпиады

ценными

по

его

обслуживание

обходятся колледжу в 6000 долларов в год.

запиши

По итогам каждому участнику будет вручен на

и

контроллер,

пройдет в МГУ и московских институтах РАН. награждены

робота

только

современным

обсуждению

Стоимость

не

мастер-классы

8/16-битный

микро-

на видео или сделай фотографию, и получи

бесплатно отладочную плату на базе CortexM0

контроллера

LPC1114

LPCXpresso

LPCXpresso от NXP. Платка эта представляет

собой комплект из отладочного интерфейса JTAG/SWD

с

USB

и

целевого

процессора

LPC1114. Видеоподборка http://www.nxp.com/ campaigns/cortex-m0/index.php?sub=gallery.

подарками,

призами, дипломами. Лучшие работы будут рекомендованы

«Доклады

к

публикации

академии

нанотехнологии», гетика

и

наук»,

в

журналах

«Российские

«Альтернативная

экология»,

«Физико

-

энер-

химия

поверхности и защита материалов», а также к участию в очередном Международном форуме по

нанотехнологиям

Международном форуме msu.ru.

(РОСНАНО)

молодежном

«Ломоносов

2011»

со

посещать колледж и общаться с друзьями.

старый

В

роботу

встроенными веб-камерами, Линдон может

Уничтожь

посвящен экскурсии в РНЦ «Курчатовский и

телеуправляемому

рамках

оборудованием. Один день будет специально институт»

благодаря

в

Олимпиады.

ждут

контактировать со своими сверстниками. Но,

и

научном

http://lomonosov-

8


ПРО

№13 (апрель) 2011

граммист

НЕВЕРОЯТНО, НО ФАКТ полимерами.

Ранее

подобное

сочетание

пластиков проигрывало из-за своей недолговечности,

но

при

помощи

углеродных

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

параметров

достаточно.

А

низкая

новинки

цена

вполне

компонентов

позволяет говорить о серьезной конкуренции традиционному подходу.

Емкостные датчики влажности** Honeywell

предназначены для измерения относительной

влажности воздуха от 0 до 100%. Основа датчиков

структуру,

образуемую

представляющий

чувствительный собой

элемент,

многослойную

двумя

плоскими

платиновыми обкладками и диэлектрическим

термореактивным полимером. Термореактивный полимер, по сравнению с термореактивной пластмассой, обеспечивает датчику более широкий высокую

диапазон

химическую

агрессивным До последнего времени сенсорные экраны

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

токи

цветовой

стекла.

Этот

идеален:

и

спектр

материал

отлично

свободно

экрана.

проводит

пропускает Но

весь

есть

одна

проблема: запасов иридия не так уж и много. Производители гаджетов опасаются, что в перспективе зависимыми материала. института

они

от

цен

Похоже,

станут

полностью

поставщиков

Фраунгофера

исследователи решили

этого из

данную

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

и дешевые полимеры. Состоит новинка из

двух слоев: тонкой подложки из полиэтилентерефталата углеродных

(PET)

и

нанотрубок

пленки с

из

смеси

проводящими

** В ресурсы с журналом включены упомянутых датчиков влажности.

рабочих

изопропил, Выходной

стойкость

жидкостям

бензин,

сигнал

температур

и

их

толуол

датчиков

к

таким

парам,

и

имеет

и

как

аммиак. размах

1.0…4.0 В, что очень удобно для прямого подключения элемент

к

АЦП

МК.

состоит

образованного

из

Чувствительный

конденсатора,

диэлектрическим

полиамид-

ным слоем и нижним электродом. Верхний перфорированный

электрод

обеспечивает

сенсору более высокую чувствительность по сравнению Датчики

обладают ностью

и

со

стандартной

влажности

улучшенной временем

серии

структурой.

HIH-5030/5031

стабильностью,

отклика.

точ-

Пониженное

напряжение питания (до 2.7В) и потребление тока (200 мкА), позволяют

использовать

датчик в портативных системах,

работающих

на батареях.

спецификации

9 12


ПРО

№13 (апрель) 2011

граммист

НЕВЕРОЯТНО, НО ФАКТ Завод по производству UTP-кабеля будет

этом

Организаторы производства намерены сразу

что до пяти раз больше, чем у продуктов Sony

открыт

в

Караганде

(Казахстан).

рынках

Европы

СНГ

хватит

и

для

всех – из-за высокого спроса

и

необос-

нованно завышенных цен

витую

на

западную

пару.

Завод

принадлежит

«Кэлсис»,

которым

владеет фонд

ТОО

венчурный

Delta

Techno-

logy. Заявленная стоимость

проекта

793.15 млн. тенге. Sony

Человеческие

120 кадров в секунду. Сообщается

всяком

научилась

печатать

помощью

ского

с

струйных

именно

клетки

CMOS

сенсор

принте-

ров Hewlett Packard и Canon живые биологические объекты. Да, использовались

17.7

авторитетного

япон-

Mpix. По сведениям

ского издания Nikkei, корпорация

Sony

отметилась

очеред-

ным достижением в

сегменте компактных

биологами

вместо

чернил.

Разумеется, для этого пришлось тщательно очистить картриджи от

Столь

необычный

проект

плод

сотрудничества

Владимира

работка

раз-

способна

одновременно разовывать трические

в

преобэлек-

сигналы

доста-

точно низком уровне

ких

Южной

Каролины

of

South

Carolina) и Томаса Боланда из

университета Клемсона (Clemson University). Команда уже провела несколько

экспериментов,

ис-

пользуя легко доступные клеточ-

ные культуры, типа клеток яичника хомяка. Идея опирается на ряд простых фактов. Клетки, напыляемые принтером, через некоторое

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

Миронов, профессор Медуниверситета Южной Каролины в феврале неопределенный

Открыт

(Medical

University

срок

отправлен

руководством

измене-

внесенным

тивный

верситета

на

ниям,

Миронова из медицинского уни-

был

новая

на

конструкцию схемы.

«живых чернил».

что

ее

новинки

над температурой, электрическим сопротивлением и вязкостью

еще потребовалось создать программное обеспечение для контроля

CMOS сенсоров для

Сообщается,

энергопотребление благодаря

Как сообщается в последнем номере журнала Nature, Владимир

камер.

гиганта

удержать

чернил обычных и несколько переделать конструкцию принтера. Да

с

разрешением

IT

удалось

переделанных

старых

также,

что инженерам япон-

случае, группа ученых уже

представила

сверхбыстрый

Mpix на скорости до

органы

Во

у

позволяет вести съемку с разрешением 17.7

смогут печатать струйные принтеры.

информации

предыдущего поколения. Это теоретически

и Восточной Европы. Прямые конкуренты на

обработки

нового CMOS сенсора достигает 34.8 Гбит/с,

поставлять свою продукцию на рынки России убеждены, что места

скорость

в

альтернапринцип

работы

биологичес-

часов.

Циано-

бактерии со встроенным светящимся белком, выработка которого

зависит

экспрессии

от

часовых

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

работу

исследоциркад-

механизмов

у

живых клеток. Извес-

Университета в оплачиваемый отпуск. Официальная формулировка

тно, что биохимичес-

причиной считается его конфликт с коллегой и неосторожное

клетке

отстранения смутная – «в силу ряда причин», однако главной обращение с компьютером...

процессы

в

синхронизи-

руются и упорядочиваются,

сверяясь

генными

преобразования

жизнедеятельности с периодом в 24 часа. Но

позволяет

на

сократить 75

время

процентов

по

сравнению с существующими аналогами. При

гены»

задают

специальные

с

световой поток сразу с множества пикселей, что

часами:

кие

ритмичность

«часовые

процессов

оказалось, что и без таких генных механизмов

10


ПРО

№13 (апрель) 2011

граммист

НЕВЕРОЯТНО, НО ФАКТ в

клетке

поддерживается

циклическая

динамика биохимических процессов. И период этих

циклов

Биохимические одноклеточных человеческих генных

часов

также

составляет

часы

24

обнаружены

животных,

тканей.

Для

необходимо

и

в

часа.

и

у

клетках

организации

отладить

петлю

обратной связи: экспрессия гена приводит к выработке работу.

В

фермента

фермента,

ингибирующего

результате

производство

прекращается,

его

этого

накопленный

его

запас распадается, запрет на работу гена

чем обычное, оно не разбивается от удара

ингибитора.

поцарапать. Новая версия стекла может быть

снимается и ген снова начинает производство обладает

Однако

генный

достаточным

организации

метроном

разрешением

ансамблей

не

для

биохимических

реакций: его временной масштаб – часы и

сутки. Тут нужен кандидат из мира биохимии. До настоящего времени таких кандидатов не было известно, расшифровке поддавались в основном

генные

синхронности

и

механизмы

жизнедеятельности. говорили

о

поддержания

ритмичности Но

том,

процессов

кое-какие что

данные

невидимый

биохимический дирижер (или несколько) в

клетке все же работает, суточные ритмы

поддерживаются и в том случае, если гены не считываются

и

не

транслируются.

выделенных

цианобактериальных

Это

показало, например, недавнее исследование поддерживающих

ритмичную

белков,

работу

молотка,

его

практически

невозможно

достаточно тонкой, при этом лист толщиной в

1 мм может выдержать 60 кг веса, под которым будет просто прогибаться, но не разбиваться. Новинка не разбивается после падения с высоты в полтора метра. Pepsi

придумала

бутылку,

созданную

растительных, материалов.

а

экологически полностью не

«Зеленая»

на

чистую основе

синтетических

бутылка

изготавливается из биологического сырья, в

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

обычные пластиковые бутылки. Разработка ь обошлась в несколько миллионов долларов.

в

пробирке (см. M. Nakajima, et al. Reconstitution

of Circadian Oscillation of Cyanobacterial KaiC

Phosphorylation in Vitro // Science. V. 308. P. 414-415. 15 April 2005).

Сверхпрочное стекло для мобильников под названием

Dragontrail

продемонстрировала Asahi

glass.

чрезвычайно

(след

компания

стекло

Dragontrail,

Компания,

прочное

предназначенное

дракона)

японская

для

заявляет,

смартфонов

что и

мобильной электроники, в шесть раз прочнее,

11


ПРО

№13 (апрель) 2011

граммист

VIP ПЕРСОНА Сергей Бадло

http://procoder.info

ЖУРНАЛ «Я ЭЛЕКТРИК». ИНТЕРВЬЮ С АНДРЕЕМ ПОВНЫМ

Быть энергетиком трудно и ответственно. Каждый из нас, будь то программист или домохозяйка, так или иначе каждодневно сталкивается с электричеством в доме. То ли это ремонт проводки, замена розеток или лампочек, установка различных систем защиты или организация освещения на рабочем месте. Сегодня у нас в гостях, специалист по инженерным сетям и электрике, автор, создатель и редактор электронного электротехнического журнала «Я электрик» http://www.electrolibrary.info, Андрей Повный. Интервью по-прежнему проведем в режиме вопрос-ответ...

Cергей: Доброго времени суток, Андрей.

трик-психолог». Необходимость в получении

начала, расскажите немного о себе: где

моей трудовой деятельности. Просто, как мне

Добро пожаловать в нашу рубрику. Для живете, семья? Андрей:

Здравствуйте,

Белоруссии в городе Гомеле.

Работаю

преподавателем в гомельском ственном ческом

государ-

политехниколледже.

Моя семья – это жена

и двое детей. Старшему, Артему – 7 лет, младшему, Диме – 4. В

свое время я закончил в

Минске

Белорус-

ский

национальный

ситет

по

технический

универ-

Сергей.

Я

живу

в

второго высшего образования возникла из-за всегда

казалось,

преподавателем,

чтобы

пусть

быть

даже

и

нормальным в

области

электротехники, просто необходимо хорошо ориентироваться

в

психологии и педагогике.

Вот

окончание

Университета и помогло

все

эти

знания

что-то

новое

узнать,

все

это

совсем

не

систематизировать

и

ну и в жизни теперь очень

помогает, так что я жалею

о

времени потраченном на обучение.

специаль-

До колледжа около 5

рик. Год назад полу-

предприятиях Гомеля

ности

инженер-элект-

чил вторую специальность, уже в Гомеле в Университете

им.

Ф.Скорины – педагогпсихолог. Так что вот такая гремучая смесь получается

«элек-

лет

работал

на

инженером по наладке оборудования, инженером-конструкто-

ром отдела главного энергетика,

замести-

телем главного энергетика. Многие знако-

12


ПРО

№13 (апрель) 2011

граммист

VIP ПЕРСОНА мые до сих пор очень удивляются тем фактом, что я ушел в колледж, так как, по их мнению, мог сделать неплохую карьеру. Но тут сердцу

не прикажешь. Просто, многое попробовал и, как оказалось, это было «не мое». В

колледже,

деятельности,

похоже,

нашел

которая

меня

ту

область

полностью

устраивает и удовлетворяет. Параллельно, вот уже более 5 лет,

занимаюсь созданием и

развитием различных интернет-проектов. Можно

считать

это

хобби.

Хотя,

если

суммировать время и энергию, затрачиваемое мной

хобби

на в

официальную

деятельность

Интернете,

то

тут

еще

и

на

надо

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

по

профессии

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

Cергей: Какими еще интернет-проектами вы заняты?

Андрей: В настоящее время, работаю над

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

выполняю роль администратора и редактора. Из

моих

проектов

для

читателей

вашего

большей

степени,

журнала может быть наиболее полезен сайт http://electrik.info.

Он,

в

предназначен

не

для

профессиональных

увлекающихся

электротехникой

электриков, а для людей интересующихся твом электропроводки в квартире. Также

у

меня

есть

неплохая

и

и

устройс-

ность с электрикой?

Андрей: Если честно, то как-то случайно все

получилось. У меня отец электрик, причем с

очень большим стажем, работает в Речицких* электрических сетях. Еще в школе, я активно интересовался историей, географией. Хотел поступать

в

институт

на

исторический

факультет. Но время было тяжелое, середина 90-х, учителя в школе в то время получали копейки

и

меня,

в

конце-концов,

все

родственники переубедили в необходимости приобретения Мой

отец,

скептически колледже.

технической

кстати,

Так

профессии

до

относится

сих

к

получается,

повлияли

специальности.

моей

пор

очень

на

выбор

что

работе

родители,

определенное стечение обстоятельств.

ну

в

и

Поступил в техникум. Неплохо его закончил. Затем учеба в Минске в БНТУ. Вот там по настоящему и зацепило. Главная причина этого

преображения

преподавательский

состав

великолепный кафедры

«Электрические системы и сети» где я учился

– мэтры белорусской энергетики, профессора: Поспелов, другие

Федин,

сумели

Короткевич привить

и

многие

любовь

к

специальности. Все-таки насколько важно в нужное просто

время

встретить

безумно

неординарных

влюбленных

в

и

свою

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

данный

момент

это

одно

из

самых

востребованных, очень интересных и активно развивающихся направлений.

рассылка

Cергей: Ваш проект существует с 2006

Рассылка

некоммерческого издания. Как был заду-

«Электротехническая энциклопедия» http://subscribe.ru/catalog/tech.electrotech.

Cергей: Почему вы связали свою деятель-

выходит уже несколько лет и имеет более 13 тысяч подписчиков.

* Ре́чица (белор. Рэчыца) – город в Гомельской области в Беларуси, районный центр Речицкого района. Это один из старейших городов Беларуси. Население – 64.6 тыс. человек (2010) http://ru.wikipedia.org/wiki/Речица.

года.

Солидный

возраст

для

ман и как появился на свет электротехнический журнал «Я электрик»?

13


ПРО

№13 (апрель) 2011

граммист

VIP ПЕРСОНА Андрей: В начале 2005-го года я подключился

люди и требовать продолжения.

желание не просто потреблять информацию,

Сделал

электротехнический сайт на narod.ru. Проще

следующих номеров журнала. Потом случился

к Интернету и у меня сразу возникло дикое

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

разбирался. На сайте я выложил несколько десятков

советского

старых

периода

отсканированных из

своей

книг

коллекции,

предварительно перегнав их в формат DjVu, а о нем тогда вообще мало кто знал и мог им

пользоваться. Только писем с вопросами «что это за DjVu» я получил, наверное, больше сотни.

В то время в моей нише было только пара

форумов и она была полностью свободна. Помню, как в одном письме мне написали, что,

«вот

уже

и

электрики

в

Интернет

полезли, скоро там, наверное, и сантехников

встретим …». Сайт стал быстро популярным и

проект, который был начат, буквально, «от

нечего делать» затянул. Правда, у меня тогда

не было ни знаний, ни, что самое главное, опыта.

Очень

сдерживал

развитие

и

бесплатный хостинг. В то время я очень много

вопросом.

начал

делать

обзоры книжных новинок со ссылками на

книжные Интернет-магазины. Кстати, именно это

позволило

в

платный хостинг.

дальнейшем

перейти

на

В качестве обычного эксперимента сделал и первый

номер

электронного

журнала

«Я

электрик». Как мне кажется, первый номер получился просто ужасным. Я его не хотел

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

пришло

Уже

даже

не

помню,

что

книга в DjVu, указал страницы, переслал ее по почте. А мне приходит ответ: «О, книга, это все хорошо, но сложно и долго. Вот, если бы

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

информация.

увлечение

На

этом

отсканированными

закончилось,

и

я

стал

делать

мое

книгами

большой

статейный образовательный сайт. Журнал «Я электрик»

стал

одним

из

его

важных

очень

мощный

составляющих частей. Потом, как оказалось, он

превратился

еще

и

инструмент для раскрутки. Cергей:

издания?

т.е.

называется),

сразу

спрашивали. Я ответил, что есть вот такая

Запустил почтовую рассылку, пробовал вести блогом

и

такой случай. Пришло письмо, с каким-то

Андрей:

делаю

номер,

несколько писем с пожеланиями по тематике

экспериментировал, что-то придумывал.

блог (правда я тогда не знал, что то, что я

второй

Какова Девиз

в

целевая журнала

аудитория

«Журнал

для

облегчения жизни специалистов-электриков», сайт

для

техническое

людей,

имеющих

образование.

электро-

Я

всегда

придерживался мнения, что каждый должен

заниматься своим делом и любые работы, связанные

с

ремонтом

монтажем,

эксплуатацией,

электрооборудования

электропроводки

должны

и

выполняться

квалифицированными специалистами. Журнал

массовое

из

профессионального

«школьники»,

и

популярное

издания

в

превратили

занимающиеся

распространением его по «варезным» сайтам с

установкой

Делали

и

ссылок

делают

по

на

сей

файлообменники. день

они

14

это,


ПРО

№13 (апрель) 2011

граммист

VIP ПЕРСОНА конечно, не из-за любви к электротехнике и к моему

журналу.

В

очень

короткий

срок

описание журнала и ссылки на его загрузку оказались на сотнях варезных сайтов. Но, еще

притягивает

людей

и

заставляет

дожидаться выхода каждого нового номера. Cергей:

Какова

из того, что изложено в журнале, бесполезно,

Андрей:

Жесткого

имеющих электротехнического образования.

материала. Иногда раз в два месяца, иногда

раз хочу отметить, что журнал «Я электрик» – это журнал для специалистов и очень многое, а иногда и очень небезопасно для людей, не Журнал

может

собирающимся написано

быть

полезен

повторять,

все,

самостоятельно,

а

людям что

не

там

желающим

разобраться, как все должно быть правильно устроено,

например,

для

правильной

издания?

периодичность

их

графика

выхода

нет.

Журнал

выходит по мере накопления подходящего реже. Раньше получалось выпускать журнал чаще. Просто всегда хочется сделать каждый номер

журнала

оригинальным,

запомина-

ющимся и полезным, а делать просто так по графику не интересно.

постановки задачи и контроля за работой

Cергей: Тематика издания постоянна или

А теперь почему журнал «Я электрик!» так

Андрей: Первоначально тематика статей в

колледж есть возможность поступить после

уровни

электриков в вашей квартире или доме.

важен конкретно для специалистов. У нас в

окончания училища по собеседованию. И вот уже

три

года

присутствуя

в

приемной

выпускников

учебных

комиссии, я с ужасом понимаю, что общий уровень

заведений имея

знаний

удручающе

диплом

элементарных которые,

низок.

училища,

вещей.

работая

где-то

А

Большинство, не

сколько

на

знают

людей,

производстве,

просто натасканы на выполнение какой-то

работы, при этом, начинают «дико плавать», переведи их куда-то на другое место. Хороших спецов

очень

и

очень

мало.

Вот

для

повышения общего уровня образованности по своей профессии и нужен мой журнал.

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

она меняется? каждом

номере

выпуски.

технологии.

Я

думаю,

это

тоже

очень

Были

современный

разные

сложности.

выпуски

про

освещение,

электропривод,

энергосбере-

гающие технологии и оборудование. Сейчас я вернулся

к

созданию

номере

есть

содержанию

номеров

начинающих

электриков,

продвинутых. выходят

в

разнообразных

журнала.

информация,

В

так

и

приложений

к

Узкотематичекие

виде

Последний

тематический

по

каждом

как

для

для

уже

выпуски

выпуск

журналу. –

это

буквально

«на

сборник статей «Школа для электрика. Курс молодого

пальцах»,

бойца».

В

объяснены

электротехнике.

находятся

новые

под

монтаж электропроводки в деревянном доме,

отрасли.

оборудование,

разной

Потом были попытки сделать тематические

Все

Новое

и

Освещался довольно широкий круг вопросов.

журнале «Я электрик!» я пытаюсь освещать все то новое и интересное, что появляется в

подбиралась

подготовки

номера

нительными

нем,

базовые

журнала

со

тематическими

на

электротехническая

сайте

понятия

всеми

по

допол-

выпусками

«Электронная

библиотека»

15


ПРО

№13 (апрель) 2011

граммист

VIP ПЕРСОНА http://www.electrolibrary.info. Правда сайт этот

и ряд статей никак в него не попадает.

именно им я уже давно не занимался, поэтому

практико-ориентированные

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

Прежде всего, принимаю в журнал статьи количеством

иллюстраций

большим

и

с

ярко

выраженной авторской подачей материала. Единственное хочется отметить, что журнал некоммерческий, плачу.

Cергей: Что используете для верстки?

с

поэтому

Большинство

гонорары

я

не

авторов

устраивает

как

в

обратная ссылка на их сайт в конце статьи.

Андрей: В этом плане все очень примитивно.

Cергей:

редактирую и обрезаю в Picture Manager, в

привлекает, по-вашему? Часто присылают

Текст PDF

форматирую

журнал

в

Ворде,

перегоняю

картинки

с

помощью

OpenOffice. Этого вполне хватает, что бы

Наверняка,

материалы? Андрей:

Очень

плохо. Но, как мне кажется, важно, прежде

поэтому

постоянных

наверное,

журнал

выглядит

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

К сожалению, я не люблю долго возиться с программами, разбираться с их настройками и

действую

часто

не

очень

эффективно.

Всегда жалко потраченного на это времени. Может для читателей вашего журнала, людей занимающихся

программированием

и

пишущим программы все это и будет звучать дико,

но если я открыв какую-то новую

программу в течении пяти минут не могу

любом

журнале есть постоянные авторы. Что их

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

и

мало

в

Интернете

людей

регулярно пищущих на нужные мне темы, человек

количество

способен

авторов

мало.

создавать

полезного

Если

большое

контента,

то

ему

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

мне

приходится

самому

искать

Интернете интересных авторов и предлагать им

опубликовать

Много

контента

свои

для

статьи

журнала

в

журнале.

присылают

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

понять как в ней работать, то чаще всего, я

Cергей: Что дает оставаться на плаву?

не возвращаюсь.

Андрей:

просто закрываю ее и никогда к ней больше Cергей:

издании? Андрей:

Кто

может

Автором

стать

может

стать

автором

в

абсолютно

любой пишущий доступные для понимания

статьи человек. Правда, отбор у меня очень

жесткий и большинство статей я отсеиваю. Просто журнал имеет определенный формат,

в

Любовь

к

тому

делу,

которым

занимаешься. Мне просто очень нравиться

работать над сайтами, выпускать рассылку, подбирать материалы в новый номер журнала. Когда

видишь,

что

твой

труд

очень

востребован, то и энтузиазм возрастает в

несколько раз. Потом постоянное развитие, движение вперед. Да и жалко бросать дело, которым занимаешься несколько лет. Даже в моменты

кризиса

и

упадка

сил

остается

16


ПРО

№13 (апрель) 2011

граммист

VIP ПЕРСОНА мотивация что-то делать. Проходит день, два и

техника».

Может

этой книги я тоже внес небольшую лепту и

опять очень начинает тянуть к компьютеру. это

уже

форма

зависимости такая. Cергей:

А

психологической

вообще,

предлагают-ли

поддержать проект? Если да, то в чем выражается?

Андрей: Деньги не предлагают, а вот на своих

сайтах (частных и корпоративных) журнал активно выкладывают и рекламируют. Чем не форма

поддержки?

Меня

устраивает.

Электронный журнал – это, вообще, очень классный

инструмент

раскрутки.

Знаете

сколько естественных ссылок на мои сайты я

получил благодаря журналу? Получается чтото

вроде

вирусного

интересно

отслеживать

маркетинга. то,

на

Даже

каких

экзотических сайтах он иногда всплывает.

Cергей: Что из литературы, кроме ПТЭЭП, порекомендуете

начинающим

кам?

Андрей:

Тут

прорекламирую вательный

воспользуюсь

проект

свой

электри-

случаем

большой

«Школа

http://electricalschool.info.

для

и

образо-

электрика»

Большинство

из

того, что может понадобится начинающему электрику ровано

по

сложности, Над

этим

там

присутствует.

тематикам,

неплохо

сайтом,

активно работаю. Если

из

книг,

в

то

Все

разным

отсорти-

уровням

проиллюстрированно.

настоящее

время,

я

есть

много

хорошей

не

убъет!

Реальная

литературы. Очень мне нравиться книги А.В. Перебаскина помощь

«Влезай

домашнему

электрику»

и

книга

Т.Галлозье «Энциклопедия электрика». А еще

можете приобрести книгу, которая вышла совсем

недавно

в

издательстве

«Наука

и

Она

называется

«Справочник

электрика для профи и не только». В создание числюсь одним из ее авторов.

Cергей: В последнее время в СМИ стали

много внимания уделять энергосберегающим

технологиям.

Насколько

это

реально в наших городских квартирах в

отличие от частных домов? Я тут на днях прочитал

«разгромную»

статью

в

киевском журнале «Электрик». Основная линия

в

световой

материале день

применение

была

на

то,

что

панелей

не

Украине

солнечных

оправдывает

про

вложенных

мал

и

средств.

Насколько по вашему мнению экономически

целесообразно

солнечной

солнечных

территории частности? Андрей:

использование

энергии

и

Украины,

России

элементов,

в

производства

частности,

Энергосбережением

и

СНГ

на в

заниматься

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

экономить

наиболее

востребованное

электроэнергию популярное

это

замена

в

и

ламп

накаливания на компактные люминесцентные (в перспективе, на светодиодные). Что же

касается использования солнечной энергии для

производства

электроэнергии,

то

на

данный момент это не выгодно. В Испании, Италии, Португалии и солнце намного больше времени

светит,

да

и

государственные

субсидии при установке солнечных панелей дают.

Эффективно

же

использовать

солнечную

энергию у нас можно для нагрева воды, где

нибудь в частном доме или на даче. Для этого существуют

специальные

водонагревательные

коллекторные

системы,

как

17


ПРО

№13 (апрель) 2011

граммист

VIP ПЕРСОНА промышленного самодельные.

изготовления,

Такие

установки

так

и

состоят

из

солнечных вакуумных коллекторов, которые поглощают энергию солнца и передают ее жидкости и емкости-резервуара для хранения нагретой

воды.

Чертежи

самодельных

установок такого типа можно без труда найти

стандартной

двухкомнатной

квартиры

обойдется в 500-600 долларов, т.е. локальная

автоматизация вещь доступная. А так, я верю, что совсем скоро мы все будем жить, по настоящему, в «умных домах».

Надо только

немного подождать.

в Интернете.

Cергей: Ремонт – вечная тема. На что из

Cергей: Понятие «Умный дом» стало уже

обратить внимание, приступая к ремонту в

«притчей во языцех». С чем ассоциируется у

вас

«умный

практически

дом»?

Довелось-ли

столкнуться

с

данным

направлением домашней автоматизации? Что

из

существующих

решений,

по

вашему мнению, оптимальнее? Андрей:

В

появляется

наших

домах

все

с

больше

каждым

днем

электронных

устройств. Понятно, что в идеале все эти

устройства удобно было бы объединить в одну

систему, для того, что бы облегчить процесс

управления ими, т.е. «умный дом» – это полностью

автоматизированная

система

новинок в сфере электроснабжения стоит квартире?

Андрей: Это очень глобальная тема. Очень сложно

кратко

Старайтесь

ответить

приобретать

на

этот

вопрос.

качественную

продукцию известных брендов. Конкретно по новинкам: смотрите на специализированных форумах,

а

затем

уже

на

сайтах

производителей. Доверьте ремонт профессионалам,

хорошее

и

они

сами

современное

порекомендуют

оборудование

вам

и

материалы, подходящие в вашем конкретном случае.

управления и контроля, в которую входят все

Cергей: Что в существующих отраслевых

вентили,

вы бы изменили?

контролирующие датчики, терморегуляторы, выключатели,

другие

исполнительные устройства, линии связи и органы управления. На

данный,

автоматизировать удовольствие,

но

момент

полностью

весь дом очень дорогое

вот

элементы

автоматики

активно

используя

устройства,

локальной

используются

уже

в

некоторых домах и квартирах. Для примера, работающие

по

технологии Х10** можно быстро автоматизировать процесс управление освещением. При

строительных стандартах и/или СНиП-ах Андрей: К сожалению, а может быть и к счастью,

ошибки

старые

выключателей

и

розеток. Полностью автоматизация освещения по

технологии

Х10,

например,

для

** X10 – это открытый индустриальный стандарт для связи электронных устройств в системах домашней автоматизации. Стандарт определяет методы и протокол управления устройствами, к которым подключены бытовые приборы, с использованием электропроводки или беспроводных каналов.

поэтому,

нормативных

планировании к

рабочему

подвода месту

компьютерщика и вообще ПК?

идеале,

заменить

при

электропитания

установочные

коробки

проектировщик,

действующих

Cергей: Какие самые распространенные

Андрей:

только

не

документов меня полностью устраивает.

этом в самом простом случае при установке потребуется

я

содержание

Могу

сказать,

что

обязательно

должно быть при подключении компьютера. В у

проложена

Вас

электропроводки

в

квартире

трехпроводная и

должна

компьютер

быть

система должен

18


ПРО

№13 (апрель) 2011

граммист

VIP ПЕРСОНА включаться

в

контактом. К

розетку

сожалению,

с

заземляющим

полной

модернизации

электропроводки в стояках многоквартирных

домов мы будем ждать еще очень долго, поэтому только

часто

приходится

установкой

поставить

в

ограничиваться

УЗО

любом

(вот

случае).

его

надо

Кроме

этого,

очень рекомендую вместе с УЗО в электрощит поставить Ресаната

реле

напряжения,

или

УЗМ

(они

например,

спасут

ваше

оборудование от повышения напряжения и от последствий

подключайте

отгорания

нуля),

компьютер

через

бесперебойного питания.

ну

и

источник

Cергей: Как порекомендуете организовать

освещение на рабочем месте программиста?

Андрей: зуйте

Кроме

общего

настольные

освещения

светильники,

исполь-

так

как

рабочий стол должен быть очень хорошо освещен, причем, освещен он должен быть

равномерно. Не допускайте, что бы свет от

лампы попадал вам в глаза. Важно, чтобы на экране не было бликов.

Cергей: Расскажите о ваших увлечениях?

речицкого

борисовский

«Ведрича». БАТЭ

и,

в

Сейчас

более

целом,

за

за

весь

белорусский футбол. Любимый футболист, не

смотря на то, что его очень сейчас ругают – Александр Глеб. Это просто феноменальный талант,

который,

полностью

и

к

не

сожалению,

смог

себя

так

пока

реализовать.

Стараюсь не пропускать матчи его команды. Благо, сейчас Интернет помогает смотреть любой футбольный матч. Из

музыки

очень

люблю

блюз.

Собираю

видеозаписи с концертов блюзовых музыкантов.

Cергей: И традиционные наши вопросы... Какие

из

журналов

электронных

вы

читаете?

ориентиром для Вас? Андрей:

журналы.

Читаю

в

и

Какой

основном

Просто

они

бумажных является

электронные

более

доступны.

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

на

автоматизации» электронику». журналы

основном,

на

по

«Современные

Также

и

читаю

компьютерную оптимизации

технологии

«Современную электронные

тематику,

и

сайтов: «SEODigest», «SeoPlaza».

в

раскрутке

Андрей: Есть очень много вещей, которые

Все журналы хороши, имеют свою концепцию,

мне очень интересна японская культура и все

из них заимствую. Но, в целом, угнаться за

меня увлекают. Люблю историю, психологию, что с ней связано. Кстати,

японских

у

меня

есть

большая

художественных

коллекция

фильмов.

В

свободное время смотрю различные, чаще всего,

научно-популярные

и

дизайн, и, иногда, какие-то фишки я для себя журналами,

которые

коллективами поэтому

дорогой.

буду

и

и

выпускаются

редакциями дальше

не

целыми

реально,

двигаться

своей

исторические

Cергей: Читаете ли вы в дороге? Какими

Когда-то в юности был рьяным болельщиком

Андрей: Если по дороге из дома на работу, то

документальные фильмы. Люблю футбол.

гаджетами пользуетесь?

19


ПРО

№13 (апрель) 2011

граммист

VIP ПЕРСОНА ничего

не

читаю.

Это

время

стараюсь

использовать для планирования и решения каких-то просто

стратегических

для

отдыха.

вопросов,

В

дальние

ну

и

поездки

выбираюсь редко, в основном, из-за маленьких

детей. Просто часто не с кем их оставить. Подрастут, буду ездить чаще. Гаджетами не пользуюсь.

Есть

более-менее

нормальный

мобильный телефон и его возможностей для удовлетворения

всех

возникающих

потребностей мне хватает. Правда, на днях

собираюсь купить нетбук. Надеюсь, что не разочаруюсь в своей покупке. Cергей:

ТОП-5

ежедневных

Интернет-ресурсов? Андрей:

Новости

на

просмотров

Яндексе,

mail.ru

(пользуюсь не только почтой, но и многими сервисами), основном,

трекер

ищу

rutracker.org

музыку

и

(там,

в

документальные

фильмы), статистика ключевых слов Яндекса http://wordstat.yandex.ru (люблю там полазить и поискать новые ключевики и идеи для

статей), http://forum.searchengines.ru – форум для

оптимизаторов

читатель,

нахожу

(правда всегда

я

там

очень

только много

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

Cергей: между

по

Как

каким-либо

Вы

«монгольским»

распределяете

оплачиваемой

проектами и отдыхом?

работой,

время

хобби-

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

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

это

активно

использую

при

создании

презентаций для колледжа, и тех же лекций. Работа и отдых, тут тоже все относительно. Делая что-то для своих сайтов я получаю

такой заряд энергии, что никакой пассивный отдых

с

этим

стараюсь

не

сравнится.

придерживаться

А

вообще,

принципа

движения вперед маленькими шагами. Лучше

поработать в день 2-3 часа, но продуктивно и сконцентрировано, чем просидеть 12-14 часов

в Интернете и ничего полезного в итоге не сделать.

Я

времени

заметил,

очень

что

влияет

на

ограничение

по

эффективность

работы, поэтому каких-то проблем в нехватке

времени я не ощущаю. Может только жена

ревнует к компьютеру и Интернету. Ну, к этому я уже привык.

Cергей: Каковы ваши планы на будущее? Андрей:

Хочется

научиться

значительно

больше времени уделять семье. Все-таки, в

моей жизни, семья – это самое главное, а все остальное плане

не

вторично.

В

профессиональном

останавливаться,

развивать

работающие интернет-проекты, реализовать

все свои новые идеи. Интернет завоевывает мир,

количество

меня

открывает

интернет-пользователей

с

каждым днем растет, поэтому все это для новые

перспективы

и

просторы для творчества. Все еще только начинается! Cергей:

Андрей,

благодарю

за

столь

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

Андрей: Самое главное – это здоровье. Ну, а потом, важно найти в себе те способности и таланты, которые заложены в вас природой и используя

их,

целеустремленно

действуя

достигать

настойчиво своих

и

целей.

Очень надеюсь, что источником вдохновения может послужить для вас это интервью!

20


ПРО

№13 (апрель) 2011

граммист

Антон Осипов

http://codecamp.su

МЕРОПРИЯТИЯ, КОНФЕРЕНЦИИ

CodeCamp 2011 – ОТКРЫТАЯ КОНФЕРЕНЦИЯ ДЛЯ РАЗРАБОТЧИКОВ

Доброго времени суток, уважаемые читатели журнала «ПРОграммист»! 13-14 мая 2011 года в Санкт-Петербурге мы приглашаем на конференцию разработчиков и будем рады видеть всех тех, кто разрабатывает системы навигации для кораблей, комплексы защиты для атомных станций, программное обеспечение для интернет-компаний, системы управления для светофоров, приложения для мобильных телефонов и многое другое. Конференция для тех, кто день за днем решает сложнейшие задачи в области разработки программного обеспечения и всех, кто с ними связан.

Тематика конференции Разработка

обеспечения.

и

реализация

увеличивают быстродействие компьютеров и программного

емкость флешек. Они выводят жизнь человека на

совершенно

уровень.

Это открытая конференция, на которой вы

открылся океан задач, проблем и вопросов, о

программного обеспечения;

• познакомиться и пообщаться с большим количеством коллег и единомышленников; собственным • поделиться взглядами на разработку, докладом;

опытом

выступив

и

с

• поучаствовать в организации конференции; следить за ходом подготовки через Facebook, ВКонтакте и Twitter.

открытий.

в

Перед

эпоху нами

подавляющем большинстве которых мы еще даже не подозреваем. И вся его прелесть в

том, что любой может найти там свой остров, большой или маленький.

Перед нами – весь мир. Мир, в котором

постоянно происходит что-то новое, который постоянно изменяется и бросает нам новые

вызовы. И все, что нам необходимо – это

желание работать. Желание сделать что-то, что

будет

полезно

другим.

Разве

это

не

здорово: работать в свое удовольствие, имея в

своем распоряжении весь мир и занимаясь реальностью, мы и организуем CodeCamp. Мы

Ни у кого нет сомнений в том, что технологии беспредцендентный

скачок

за

хотим раздвинуть горизонт, и нам никак не обойтись без вас.

последние десятилетия. И только сейчас мы

Участникам

они изменят нашу жизнь. Не стоит думать,

Наилучший

начинаем осознавать то, насколько сильно что

жить

любимым делом? Для того, чтобы это стало

Наши цели совершили

географических

что

ранее

Это

• узнать о новых методах, технологиях и тенденциях в области разработки

равно,

невиданный

Особенности сможете:

все

новый,

современные

технологии

просто

способ

участия

в

нашей

конференции – быть ее активным участником.

21


ПРО

№13 (апрель) 2011

граммист

МЕРОПРИЯТИЯ, КОНФЕРЕНЦИИ

Участвуя в дискуссиях, задавая вопросы и

делая доклады, вы не только узнаете много нового и приобретете уникальный опыт, но и познакомитесь с очень интересными людьми. Итак, участие в конференции позволит вам: • узнать о последних тенденциях в области разработки (поскольку конференция посвящена новым технологиям в разработке программного обеспечения);

• расширить свой кругозор (порой, мы так сильно углубляемся в решение своих, узкоспециализированных проблем);

• познакомиться с новыми людьми (именно на конференции проще всего познакомится

с известными разработчиками, представи-

• найти единомышленников (рассказав о современных технологиях и поделившись своим опытом работы с ними, вы найдете

людей, которые решают те же самые или похожие задачи);

опытом (выступление на • обменяться конференции – самый быстрый и простой

способ привлечь внимание специалистов к своей проблеме. Расскажите о ней, вполне возможно, что кто-то ее уже решил. Более

того, можно будет устроить на эту тему мозговой штурм и наметить возможные пути решения);

о • заявить конференции

себе

(выступление

укрепит

ваш

профессионала в своей области;

на

статус

и

• проверить свои идеи (поделиться своими идеями с большим количеством коллег и

(очень тяжело • развиртуализироваться общаться с человеком, если вы не знакомы

Стандартное время выступления 45 минут

телями

крупных

руководителями);

компаний

лично).

обновить,

структурировать ваши знания);

предоставляется

ноутбук и помощь в подготовке.

• по-новому взглянуть на знакомые вопросы (в ходе подготовки к выступлению, вы будете

(может быть увеличено в два раза). Для выступления

А выступление с докладом поможет:

должны

получить от них обратную связь).

четко

проектор,

Регистрация на конференцию обязательна и уже началась.

Участие – бесплатное. И добро пожаловать!

22


ПРО

№13 (апрель) 2011

граммист

Варвара Беженова

http://higenius.org.ua

МЕРОПРИЯТИЯ, КОНФЕРЕНЦИИ

BEST – ИНЖЕНЕРНЫЕ СОРЕВНОВАНИЯ В ЗАПОРОЖЬЕ

BEST (Board of European Students of Technology) – Совет студентов технических университетов Европы (http://BEST.eu.org) – некоммерческая, неполитическая, волонтерская международная организация. Нашей основной целью является предоставление качественного дополнительного образования студентам технических вузов с помощью разнообразных мероприятий.

11-15 апреля 2011 года в Запорожском

BEST студенческая сеть. Мы обеспечиваем

пройдут Инженерные Соревнования BEST при

знаниями между студентами по всей Европе.

национальном

техническом

университете

поддержке ректората и профкома студен-

сотрудничество,

тов, аспирантов и докторантов ЗНТУ.

Одним

Визия

предлагаем

Продвижение инженерной мысли в Украине путем создания благоприятных условий для ее возникновения и развития. Миссия

из

являются

коммуникацию

главных

мероприятий

Инженерные

студентам

креативность,

и

обмен

BEST

Соревнования.

применить

испытать на

Мы

свою

практике

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

мы

обеспечиваем

университетов

и

компаний-

партнеров

соревнований

возможность студентам технических универ-

Куда

движемся

благодаря сотрудничеству с компаниями и

команда организаторов определила в визии и

В рамках инженерных соревнований мы даем

ситетов развить и реализовать свои идеи общением с образовательным сообществом.

С 1989 года динамично растет создаваемая

новой для них среде. мы

в

контакт

и

принципиально

зачем

проводим

Инженерные Соревнования из года в год, миссии нашего проекта.

В 2009 году впервые прошли Всеукраинские инженерные которых

соревнования,

приняли

инженерных

участие

соревнованиях

в

победители

Европейских

EBEC

(г.Гент,

Бельгия). В 2010 году последовали Вторые Всеукраинские

«UBEC»,

победители

Европейский Румыния.

инженерные

В

этап

в

которых

отличие

город от

соревнования поехали

на

Клуж-Напока,

прошлогодних

соревнований, организаторы сделали упор на локальном этапе: уделили большее внимание заданиям

и

мероприятия Варвара Беженова Главный организатор +38 099 385 19 35 varvara.bezhenova@BEST.eu.org

организации на

качественного

локальном

уровне.

23


ПРО

№13 (апрель) 2011

граммист

МЕРОПРИЯТИЯ, КОНФЕРЕНЦИИ во, выполняющее требования поставленного задания.

Case Study – решение аналитической задачи, детальное исследование какого-либо объекта, проблемы,

процесса.

В

данной

категории

команды-участницы обычно решают вопросы

управленческой деятельности или технической

сферы,

применяя

свое

нестандартное,

критическое мышление, при этом реализовывая

свои

действенные,

инновационные

идеи с ограничением во времени.

В Запорожье будут соревноваться по 6 команд в каждой из категорий, по 4 человека в команде.

Победителей

определит

компе-

тентное жюри из преподавателей, представителей компаний и/или организаторов. Инженерные

соревнования

BEST

в

Запорожье – это 5- увлекательных дней, 4 часа полезных Аналогичные

мероприятия

проходят

в

Виннице и Львове на базе университетов

тренингов

лекции для наибольшего понимания заданий. Во

Победителям Инженерных соревнований бу-

участниками,

мероприятии-партнере Виннице в мае.

«Эксперт»

в

презентационным

навыкам для всех участников, вступительные

данных городов.

дет предоставлена возможность участия в

по

время

возможность тонкости вживую.

соревнований встретиться узнать

заданий

и

и

все

у

увидеть

Вас

будет

пообщаться «секреты» весь

Структура Инженерных Соревнований включает в себя 2 категории:

Team Design – командное проектирование. технической

задачи,

удовлетво-

рам, используя лишь имеющийся

в наличии

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

Результатом соревнований является устройстАртем Степанченко Пресс-секретарь +38 063 162 15 84 artem.stepanchenko@BEST.eu.org

и

проект

Формат мероприятия

Решение

с

24


ПРО

№13 (апрель) 2011

граммист

НОВОСТИ ПО Алексей Шишкин

http://flsoft.ru

LAZARUS – АЛЬТЕРНАТИВА DELPHI ИЛИ ТАИНСТВЕННАЯ ТЕНЬ? Все мы рано или поздно сталкиваемся с моментом, когда надо задуматься о законности нашей программистской деятельности. Что будет, если программировать на украденной Delphi? Где найти замену? Что делать, если хочется научиться программировать, но денег на лицензионную копию Delphi нет? Именно на эти вопросы автор статьи и собирается ответить.

Вступление

Без паники

Итак, дорогой читатель, ты хочешь стать

программистом. Если у тебя есть задатки, это хорошо. Ты идешь в школу/университет и

посещаешь уроки информатики. Но – о боже – там

же

Паскаль!

программировать

на

Когда

же

Delphi?

мы

Но

будем

проходят

годы, и дальше Паскаля дело не идет. Лишь в единичных

Именно

так,

как

и

было

написано

меня

есть

предложение

вам

для

случая. Нет, я не продаю Delphi. Но

позвольте

вам

представить

Delphi

школе

а-а, ну это я уже

в

могу

универсимой

и

вать».

ре-

тановить

ус-

Подождите-

ка, а так ли

себе Delphi. Как

ный век

это

чест-

мом

чело-

ты

находишь

некоммерческих стоит

899.00

рублей)*.

на

са-

деле?

Является

за-

ходишь на официальный сайт Embarcadero, но не

прог-

раммиро-

до-

шаешь

на

нем

Ты

идешь

видел,

гадость, не

или

тете.

Lazarus. «А-

лицен-

Delphi

некоторую

замену для

имеем дело зионной

такого

равносильную, а иногда и более полезную

случаях мы с

в

«Путеводителе по Галактике». Без паники. У

Они

полной

проектов.

евро

что,

студента/школьника Так что же делать?

версии

Полная

(около

36-ти

думают,

есть

такие

для

версия

тысяч

что

у

деньги?

* Цена указана за Delphi XE по ценам Euro Shop [1]. Кстати говоря, о продаже. На сайте Embarcadero НЕ УКАЗАН [2] официальный партнер в России.

полноценной рассмотрим

заменой все

ли

по

Delphi?

Lazarus

Давайте

порядку.

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

ни

странно,

интерфейс

Lazarus'а

практически полностью повторяет интерфейс

25


ПРО

№13 (апрель) 2011

граммист

НОВОСТИ ПО Delphi.

Те

же

инспектор

окна

редактора,

объектов,

та

же

тот

область

же

с

контролами сверху. В темноте, как говорится, и не отличишь. И

меня

всегда

искренне

удивляли

люди,

(показывающая

ограничения

библиотеки

виджетов в целом). Полезно знать это при кроссплатформенной разработке. Main window

которые говорят, что могут писать программы

Итак, а что у нас с тем длинным окошком с

Lazarus'е. Когда показываешь этим людям,

единственным

в Delphi, но не могут делать то же самое в

что код вводится туда же, такие люди говорят:

«А я не могу!» Между прочим, мне однажды

удалось посадить человека за Lazarus, сказав, что это Delphi. Доказать обратное удалось только

через

неделю,

продемонстрировав

окно «О программе» более пяти раз подряд. Разберем

же

интерфейс

рассматривая отличия:

на

кирпичики,

вещью

у

него

нет

субокна

Explore. Это субокно в Lazarus'е является

отдельным окошком и может быть вызвано через «Вид/Обозреватель кода».

Lazarus’а

меньше вкладок с контролами, что вызывает

уныние у новичков, привыкших бросать на

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

в

контролы,

для

отчаивайтесь.

Во-первых,

доступные

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

проекте.

Но

не

практически Delphi,

под

изменениями,

все

можно

Lazarus а

с

во-вторых,

это

окошко

говоря, советую пройти по ссылке и изучить проект,

даже

если

использовать Lazarus).

вы

является

единым

не

собираетесь

Итак, визуальные отличия мы с вами вкратце рассмотрели,

настало

отличия внутренние:

Object Tree View Lazarus'е

У

невизуально, как, например FTP [3] (кстати

Отличается от дельфийского только одной

В

замечанием.

большинство контролов можно использовать

Code Editor маленькой

контролами наверху? Да все так же, но с

время

рассмотреть

Размер приложения

целым с Object Inspector. Но так как обычно

А вот тут Lazarus несколько уступает Delphi.

можно и не считать.

кажущаяся.

они располагаются вместе, за отличие это

13 Мб против 800 Кб. Но уступка эта лишь Достаточно

установить

пра-

вильные флаги компиляции (об этом позже) и

Object Inspector

отличие будет не таким уж большим – 900

А вот здесь как раз-таки есть пара отличий. Но только если копаться в недрах разработки

визуальных компонентов. У Object Inspector'а

против 800. К слову сказать, при больших

проектах рост размера приложения в Delphi и C++ больше, чем у Lazarus'а.

Lazarus’а есть пара дополнительных вкладок:

Т.е., иными словами, проект на Delphi в

часто

весить

«Избранное» (куда можно поместить наиболее используемые

полезная

штука)

свойства, и

кстати,

«Зависимости»

несколько десятков тысяч строк кода будет БОЛЬШЕ,

Lazarus'е.

чем

аналогичный

26

на


ПРО

№13 (апрель) 2011

граммист

НОВОСТИ ПО Таблица. Параметры в пункте меню «Проект/Параметры компилятора»

** Более подробное описание всех параметров можно найти здесь [4].

27


ПРО

№13 (апрель) 2011

граммист

НОВОСТИ ПО Настройка

По сути дела Lazarus пришел на смену Delphi.

В этот раз очко в пользу Lazarus'а. У него есть

опыт (достаточно неудачный) других языков

возможность полностью переписать код его же

интерфейса,

функции.

добавив

Любые

новые

кнопки

изменения

в

поощряются лицензией GPL/LGPL.

и

коде

со

стороны

в

сторону

Lazarus'а. Возможность полноценно настроить код

позволяет

использовать другие отладчики и редакторы. Итак, рассмотрим, какие флаги компилятора

следует рассмотреть в первую очередь (см. таблицу).

Режим работы Как

Lazarus ваются Delphi,

просто

обязан

режимов

был

компилятор,

поддерживать

синтаксиса.

следующие

Turbo

Pascal,

режимы: Object

Поддержи-

FreePascal,

Pascal

(по

умолчанию) и Mac Pascal. Если вы хотите не видеть

отличий

сделать,

не

от

Delphi,

выставьте

соответствующий режим. Проще всего это выбрав

его

в

настройках,

а

исправив директиву компилятора – в начале каждого

сегодняшней

перестала

последней

походить лет

на

назад

то,

Delphi в

XE

она

школах

и

что

изучалось

просят, было бы лучше провести ремонт в

аудитории, а не устанавливать ее на один

компьютер. Таким образом, на мой взгляд, Lazarus

более,

чем

достойная

замена***

данного проприетарного продукта. Главное – читать документацию [5], а не кричать на форумах о том, что код, ориентированный для Delphi «вдруг» не компилируется в Lazarus’е. Ссылки

кроссплатформенный

несколько

К

университетах. На деньги, которые за нее

новичков

скомпилированный

разработки, усложнять работу пользователя.

несколько

Настройка компиляции Камень

После 7-й версии Delphi стала перенимать

модуля

следующая строка:

по

умолчанию

{$mode objfpc}{$H+}

есть

• Delphi XE Architect – NEW

http://store.embarcadero.com/store?Action=Di

splayCategoryProductListPage&SiteID=borlan de&Locale=en_IE&categoryID=656300

• Embarcadero Online Stores

http://www.embarcadero.com/online-stores

• Description FTP client protocol

http://synapse.ararat.cz/doc/help/ftpsend.html

• Options

controlling

the

kind

of

output

http://www.freepascal.org/docs-html/user/ usersu15.html#x38-450005.1.4

• Lazarus

wiki

http://wiki.lazarus.freepas-

cal.org/Lazarus_Documentation

Просто исправьте ее на: {$mode delphi}{$H+}

и смело используйте ее синтаксис. Постcкриптум

*** Следует отметить, что есть свободные бесплатные версии Delphi, к примеру TurboDelphi-Lite portable (TDL) на базе BDS-2006. Получить ссылку на закачку и почитать про опыт использования TDL вы можете на нашем форуме http://forum.procoder.info/index.php/topic,353.0.html / Редакция.

28


ПРО

№13 (апрель) 2011

граммист

Мират Каденов

http://mathdev.org/mirat

НОВОСТИ ПО

SCHEME. НЕКОТОРЫЕ ЗАМЕТКИ О ФП

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

Постановка задачи

этому даже такие тривиальные задачи, как

Ну вот, к примеру, такая простая задачка: на

очень непривычно, но, в то же время, красиво

вход

дано

одинаковых

два

множества

элементов,

(списка)

надо

найти

без их

«симметрическую» разность т.е, все элементы, которые

встречаются

исходных множеств.

только

в

одном

из

Поиск элемента Как решать эту задачу? Начнем с того, что полезно бы иметь функцию, принимающую

элемент и множество, и выдающую true или

false в зависимости от того, есть этот элемент в данном множестве или нет.

Такую функцию в Scheme можно объявить так:

(define (search elem list) (if (null? list) #f (if (equal? elem (car list)) #t (search elem (cdr list) ) ) ) )

Как видим, циклов в Scheme нет*, переменных

тоже. Все, что есть – рекурсия. Благодаря

поиск элемента в списке иногда решаются и элегантно.

Пересечение множеств Дальше – больше. Итак, вопрос: как найти

пересечение двух множеств A и B?. То есть

такое множество, каждый элемент которого содержится

в

A

и

B

одновременно.

Естественно возникает желание сделать два вложенных

цикла:

внешний

проходит

по

элементам первого множества, а второй ищет эти элементы во втором.

Еще один нюанс: в Scheme нельзя передавать в

функцию

параметры

затруднительно

найти

по

ссылке.

способ

Да

и

этим

воспользоваться: язык не позволит. И вообще переменных

в

обычном

смысле

слова

в

Scheme нет. Есть императивные (звучит, чуть ли

не

как

империалистические)

хаки,

но

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

поиска

пересечения

будет

накапливать элементы искомого множества? Правильно, она будет передавать себе же

множество, а возвращать это же множество плюс

найденные

элементы.

Сама

верхняя

функция вызывается с пустым аргументом.

Ну, а так как теперь рекурсия правит балом,

* Не совсем верно, зависит от диалекта / Редакция.

29


ПРО

№13 (апрель) 2011

граммист

НОВОСТИ ПО искать ответ надо примерно так: • отщепляем

от

первого

Объединение множеств

множества

один

элемент, а если оно пустое, возвращаем ответ;

• ищем его во втором множестве (у нас уже есть функция Search());

• если он есть, добавляем его к ответу;

• если нет, то применяем эти же шаги к остатку первого множества (то есть к этому же множеству без первого элемента).

Вот мой вариант (наверняка можно сделать

Как

вы

поняли,

множество

представляется просто списком. Теперь стоит задача объединить два списка (множества) в

один. Используя стандартные операции над

списками cdr (получить остаток списка без

первого элемента) и car (получить голову списка) эту задачу можно решить так: (define (concat l p) (if (null? l) p

оптимальнее, но пока пойдет):

(if (null? (cdr l))

(define (_intersection l p accum)

(cons (car l) p)

(if (null? l)

(cons (car l) (concat (cdr l) p) )

accum

)

(if (search (car l) p)

)

(cons (car l) (_intersection (cdr l) p accum) ) (_intersection (cdr l) p accum)

)

Если первый список пустой, то возвращаем

)

второй. Если его остаток пустой (то есть в нем

)

только один элемент), то приделываем этот

)

Где: l и p – множества, пересечение которых

надо искать, accum – тот самый аккумулятор, в новых реинкарнациях которого и копится ответ. Все-таки стек – великая вещь. Если вы писали

уже

интерпретатор,

реализация

фреймов

и

то

понимаете,

стека

при

что

оставшийся

элемент

ко

второму

и

возвращаем. А иначе – приделываем первый элемент

первого

множества

к

тому,

что

вернет эта же функция, вызванная к остатку первого списка и второго.

вызове

Исторически так сложилось, что эта задача

невозможно сделать рекурсию. Только нашего

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

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

список на самом верху рекурсии, поэтому определим функцию intersection: (define (intersection l p) (_intersection l p '()) )

Это так, чтобы не было неожиданностей.

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

проблем

нет,

надо

найти

такое

множество, элементы которого содержатся в

первом списке, но не содержатся во втором. Решается

абсолютно

аналогично

пересече-

30


ПРО

№13 (апрель) 2011

граммист

НОВОСТИ ПО нию множеств, разве что действия под if'ом переставлены местами:

Их

пересечение

это

то,

что

закрашено серым цветом. А то, что мы ищем, – зеленым. Если от всего, что внутри кругов, отнять закрашенное серым, – остается как раз

(define (_substraction l p accum)

зеленое.

(if (null? l) accum

Scheme в действии

(if (search (car l) p) (_substraction (cdr l) p accum) (cons (car l) (_substraction (cdr l) p accum) ) ) )

Свяжем нашу функцию с внешним миром: (display (process (read) (read)) )

)

(display "\n")

И запустим. Я использую в качестве среды

(define (substraction l p)

DrScheme, входящий в состав PLT Scheme**

(_substraction l p '() )

http://www.plt-scheme.org. Но рисовать скрины

)

здесь неудобно, так что запустим программу в

Приступим к самой задаче У

кругов.

нас

есть

много-много

командной строке: множественных

операций. А теперь собственно маленькое чудо:

mirat@mirat-laptop:~/Documents<img class="teximage" src="/sites/default/files/tex/ 5d47e3cd417d8319f8a20411e81dadb3af8b7df4.png" alt="$

mzscheme -qUr

example.txt

(define (process l p)

(a b c d e f) (r t b c x)

(substraction (concat l p) (intersection l p))

(a d e f r t x)

)

mirat@mirat-laptop:~/Documents $" />

Вот и вся задача. Почему «симметрическая»

В первой строке – это то, что я сам ввел, на

и

Scheme парсит ввод – это просто сказка. Здесь

разность A и B равна разности их объединения пересечения?

Это

можно

на

бумажке

нарисовать. Круги Эйлера называются (см. рисунок):

второй – результат. А как интерпретатор я вспомнил все эти лихие годы: разбор данных на

Pascal

(readln)

потом

C++

(sscanf,

std::stringstream) и много других ужасов. Да, Scheme мне определенно нравится. Scheme: Идем дальше Дальше Рисунок. Круги Эйлера

Объединение A и B – это все в пределах обоих ** На данный момент PLT Scheme эволюционировал в Racket http://racket-lang.org.

больше.

В

Scheme

есть

такие

операции над списками (вернее не в самой

схеме, а в одной из ее библиотек), как find (поиск

первого),

filter

(поиск

всех),

map

(поэлементная обработка списка) и самая

31


ПРО

№13 (апрель) 2011

граммист

НОВОСТИ ПО интересная fold (свертка). Первые

три

диссонанса

не

при

На

вызывают

обработке

императивно-декларативном

когнитивного

их

в

моем

разуме,

они

выполняют вполне естественные для своего названия действия***.

Ну, тут все просто, find принимает функцию и Вообще,

find-filled

подается

список

lstlst

списков (кстати, пока не проверяется, каждый ли

элемент

lstlst

является

списком).

Возвращается первый элемент списка lstlst, который является непустым списком.

Тавтология здесь неизбежна. Чтобы понять рекурсию, надо понять рекурсию.

Find список.

вход

надо

привыкать,

что

передавать функцию в другую функцию – это норма. find применяет функцию к элементам

списка (начинает слева и идет дальше) и

возвращает тот элемент, для которого эта

Вот пример для разрядки ситуации: (display (find-filled '( () () (a b c) (a) () ) ) )

функция впервые вернет #t (true).

Программа напечатает (a b c).

Возможная реализация find:

Filter filter работает как find, с той лишь разницей,

(define (find func lst)

что он возвращает список из всех элементов,

(if (null? lst)

удовлетворяющих условию func, то есть func

'()

на этих элементах вернет #t:

(if (func (car lst)) (car lst) (find func (cdr lst))

(define (_filter func lst accum)

)

(if (null? lst)

)

accum

)

(if (func (car lst)) (cons (car lst) (_filter func (cdr lst) accum ) )

Все просто, если на входе пустой список – возвращаем применяем

пустой

функцию

список. к

Если

первому

нет

(_filter func (cdr lst) accum)

элементу

) )

входного списка. Если функция вернет #t,

)

вызываем себя же для остатка списка.

(define (filter func lst)

возвращаем

этот

элемент.

Если

нет

(define (check-not-null lst) (not (null? lst)) ) (define (find-filled lstlst) (find check-not-null lstlst) )

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

(_filter func lst '() ) )

Очень полезно для мозга разбираться в том, как

работают

эти

функции.

Все

просто:

строим в голове стек, списки, снабжаем это красивой графикой (а-ля фильмы про крутых

32


ПРО

№13 (апрель) 2011

граммист

НОВОСТИ ПО хакеров), добавляем звуки (все те же фильмы про

хакеров)

получаем

красочную

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

Вот псевдокод: fold(func,init,lst) = func ( lst[n],

пестрит, переливается.

func ( lst[n - 1], func ( lst[n - 2],

Map

... func ( lst[1],

Принимает список и функцию. Возвращает

func ( lst[0], init)

список – результат применения функции ко

)

всем элементам исходного списка:

... )

(define (_map func lst accum)

)

(if (null? lst)

)

accum (cons (func (car lst)) (_map func (cdr lst) accum ) ) )

Так работает левая свертка. В вызов func для элемента элемента

)

lst[0]

передается,

lst[0],

аккумулятора

init.

кроме

начальное Этот

вызов

самого

значение

вернет

следующее значение аккумулятора, которое

(define (map func lst)

будет передано в вызов func для элемента

(_map func lst '() )

lst[1] и т.д. А сам fold вернет то, что вернет

)

func для последнего элемента списка lst:

Пример:

(define (fold func accum lst)

(define (plus-one x)

(if (null? lst)

(+ 1 x)

accum

)

(fold func (func (car lst) accum) (cdr lst) ) )

(display (map plus-one '(1 2 3 4) ) )

)

Вообще должно получиться**** (2 3 4 5).

Красивый пример использования fold – это

Fold

котором

У нас есть список lst. Есть функция func от

реверсирование списка (получение списка, в порядке):

элементы

двух аргументов: x – текущий элемент списка

(define (reverse lst)

func

)

lst и accum – текущее значение аккумулятора. возвращает

аккумулятора. функцию

fold

func,

следующее (свертка)

начальное

значение

принимает значение

аккумулятора init и список lst, возвращает конечное значение аккумулятора.

следуют

в

обратном

(fold cons '() lst)

Где: cons – функция как раз двух аргументов, элемента

и

списка.

Добавляет

элемент

в

начало списка и возвращает результат. Если

**** Вообще-то ничего получиться не должно. Display обладает побочным действием, печатает список на экран и не возвращает значение. Это значит, что результат будет получен только на устройство вывода, для программы он будет недоступен. Чтобы что-то получилось, в данном случае требуется использовать конструкцию (begin (выражение1) … (выражениеN)), которая всегда возвращает результат последнего выражения (опять же, если он есть) / Редакция.

33


ПРО

№13 (апрель) 2011

граммист

НОВОСТИ ПО проследить вызовы в этом примере, нетрудно

(if (null? lst)

увидеть, что результатом вызова reverse будет

accum

реверсированный список.

(cons (func (car lst)) (_map func (cdr lst) accum ) ) )

Рассмотрим еще один пример:

)

(define (summ lst)

(define (map func lst)

(fold + 0 lst)

(_map func lst '() )

)

)

lambda

(display

Лямбда-функции давать

в

функциям

Scheme

позволяют

имен,

т.е.

(map

не

(lambda (x) (+ 1 x) )

объявлять

'(1 2 3 4)

безымянные функции. Это может показаться

)

абсурдом: как это – не давать имени? А как к ней обращаться? Но

вспомним,

что

в

примерах

выше

все

)

Как видим, мы избавились от plus-one.

рассмотренные функции (find, filter, map и

А

ожидали

_map

fold)

в

объявлять

качестве

одного

функцию.

ее

отдельно

Нам с

из

аргументов

приходилось

помощью

define,

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

здесь

и

можно

сэкономить

на

может

ли

на

лямбда-функцию

подчеркивание рекурсивно

вызвать

рекурсивная функция).

из

исчислением,

зачем

безымянные

функции

нужны. Вторую рассмотрим чуть позже.

x1,

x2

аргументы,

Не отходя от кассы – пример: (define (_map func lst accum)

возникает

тического

может. ада,

Но

сразу

себя

же

из

глубин

называемого вылезают

(_map

матемалямбда-

на

свет

комбинаторы, теория вычислимости и прочие

Так что не будем пока углубляться. Если функция должна быть рекурсивной – дадим ей

(lambda (x1 x2 ... xn))

функции.

Тут

ужасы.

Синтаксис объявления лямбда-функций:

Где:

выглядит).

(некрасиво

имени, она не может внутри себя просто так

Вообще-то

причин,

быть

проблема: так как лямбда-функция не имеет

придумывании имени, если объявить функцию

прямо в том месте, где она нужна. Но это одна

лямбда-функция

рекурсивной? Например, хочется заменить

lambda

тело

имя, так уж и быть. Замыкание А

теперь

сформировать

рассмотрим список

из

задачу.

всех

Надо

элементов

списка lst, которые больше заданного числа

34


ПРО

№13 (апрель) 2011

граммист

НОВОСТИ ПО min. Вот одно из возможных решений:

; Попытка #3

(define (_process lst min accum)

(define (check x min)

(if (null? lst)

(> x min)

accum

)

(if (> (car lst) min) (cons (car lst) (_process (cdr lst) min accum) )

(define (process lst min)

(_process (cdr lst) min accum) )

(filter check???? lst)

)

)

) )

(display (process '(1 2 3 4) 2) )

(define (process lst min) )

громоздко

и

в

эту

списка.

вспомним,

что

filter

принимает

работает.

функцию

Изменить

только

текущий

поведение

filter

элемент мы

не

можем, кроме как переписать его, но это «не

(display (process '(1 2 3 4) 2) )

принципе,

теперь

функцию только одного параметра и передает

(_process lst min '() )

В

А

Но

неудобно.

как-то

Нам

все

надо

по

фэн-шую».

Поэтому

функция

должна иметь один аргумент*****.

проверки

сформировать подсписок из элементов списка,

Здесь и задумаемся: число min неизвестно в

Почему бы не использовать для этого filter?

filter.

которые удовлетворяют какому-то условию.

но

(> x ???)

в

контексте

желанный min. А

(define (process lst min)

бы

вызове

тогда

проверки

не

filter

контекста.

(display (process '(1 2 3 4) 2) )

натыкаемся

на

есть

определить

прямо

filter? Да-да, лямбда-функция:

)

внутри

наш

нашу

вызова

; Попытка #4 (наконец-то верная)

препятствие.

Как

функция check узнает, с чем сравнивать x? В вопросиками.

почему

функцию

(filter check lst)

это

понятие

Внутри check мы видим только переменную x,

)

коде

возникает

переменных, видимых в данной точке кода.

(define (check x)

мы

Здесь

Простите меня за нестрогость определения, но под контекстом я понимаю совокупность

; Попытка #2

Тут

check, но зато оно известно в момент вызова

недоразумение

отмечено

Можно было бы передать это как параметр в check:

(define (process lst min) (filter (lambda (x) (> x min) ) lst) ) (display (process '(1 2 3 4) 2) )

Как

видим,

переменная

min

не

является

***** Раздается звук отката к попытке номер 2.

35


ПРО

№13 (апрель) 2011

граммист

НОВОСТИ ПО аргументом

лямбда-функции,

но

все

же

попадает внутрь нее и используется в ней (захватывается переменная

из

контекста).

называется

Такая

свободной

переменной для лямбда-функции. А лямбдафункции,

которые

переменные,

содержат

называются

свободные

замыканиями.

Казалось бы, ничего особенного. И зачем только придумывать новые термины?

Давайте рассмотрим другой пример (взят из Википедии):

(display ((adder 7) 4))

очередь,

где мы adder вызвали. То есть получается, что значение b внутри лямбда-функции замкнуто на внешнее (по отношению к этой функции) значение

фактического

параметра

(да,

думаю написать это по-человечески).

я

Кэрринг (карринг, currying) При объявлении функции перечисляем список

Важно понять, что при каждом вызове adder, он создает и возвращает новый экземпляр

лябмда-функции. Вызывая adder 10 раз с разными параметрами b, мы получим в итоге

десять разных функций. Каждая из них будет

функцией одного аргумента. И каждая будет сумму

своего

остановимся. Осмыслим.

С

аргумента

каким?

будет

к

бы,

это

с

; и x и y - формальные параметры данной функции ) )

Стало: (define (func x) (lambda (y)

Опять

( ; здесь то же самое выражение, содержащее x и y ; но теперь y - это формальный параметр этой ; внутренней лямбда-функции,

своему

наверное, и проявляется основное значение Казалось

как

; здесь выражение, содержащее x и y

; а x - свободная переменная

аргументу прибавлять число 7. Вот здесь, «замыкание».

Вот

(

Если мы вызывали adder с числом 7, то функция

переменной.

(define (func x y)

Так. Остановимся, передохнем и осмыслим.

числом.

одной

Было:

; будет напечатано 11

аргумент b и возвращает лямбда-функцию.

слово

свою

adder (оно равно 7) из контекста того места,

делается…

Что делает функция adder? Она принимает

возвращенная

в

связано с фактическим параметром функции

функцию

(+ x b))

некоторым

значение,

многих переменных можно определить через

)

возвращать

Его

ее параметров. На самом деле, функцию от

(define (adder b) (lambda (x)

параметр.

где

в

объявлении нашей лямбда-функции число 7?

) ) )

Его нет, есть только b. Но значение этого b

Другими

лямбда-функцию родили на свет, – внутри

функция

берется из контекста того места, где мы эту вызова функции adder. А b – это формальный

словами,

функция

func

двух

переменных может быть представлена как возвращает

одной

переменной,

лямбда-функцию

которая

одной

36


ПРО

№13 (апрель) 2011

граммист

НОВОСТИ ПО

переменной, причем возвращенная лямбда-

Однако,

Таким

ного языка, то кэрринг может быть полезным

функция

x

будет

образом,

x

свободной

внутри

переменной.

лямбда-функции

будет замкнуто на то значение x, с которым мы вызовем внешнюю функцию func:

интерпретатор

вы

разрабатываете

какого-нибудь

функциональ-

для «выливания воды из чайника» – сведения одной

задачи

переменных)

(обработки

к

другой,

функции уже

многих

решенной

(обработка функций одной переменной).

(define (sum x) (lambda (y)

Исходники тестового проекта приложены в

(+ x y)

виде ресурсов непосредственно в архиве с

)

журналом.

)

Ресурсы

(display ( (sum 10) 1) )

Постскриптум Кэрринг

если

теоретических

очень

полезная

вещь

исследований,

для

позволяет

вообще не рассматривать функции многих переменных

применения

отдельно.

этого

приема

программировании я не вижу.

Практического в

обычном

• Тестовый пример материалу http://mathdev.org/sites/default/files/example.ss

• Utkin. Введение в Sheme. Часть 1. – ПРОграммист, некоммерческий электронный журнал, 2010, №4, с.8

• Utkin. Введение в Sheme. Часть 2. – ПРОграммист, некоммерческий электронный журнал, 2010, №5, с.9

37


ПРО

№13 (апрель) 2011

граммист

Utkin

http://procoder.info

АЛГОРИТМЫ

АРИФМЕТИКА ДЛИННЫХ ЧИСЕЛ. ЧАСТЬ 2

Доброго времени суток, уважаемые читатели. Сегодня мы продолжим наш материал и рассмотрим более сложные операции, такие как умножение и деление, а также сравнение чисел. Продолжение. Начало см. в предыдущем выпуске журнала

Сравнение двух чисел между собой

числами – они представлены там как числа с

По сути, вспомогательная операция, она не

одно

предназначена для решения неравенств и использования в условных операторах.

Я

старался получить только четыре основных математических числами

действия

произвольной

над

длинными

точности,

все

остальное есть побочные алгоритмы, цель

которых – поддержка этих самых действий. Таким

образом,

операция

реализована

сравнения

возвращающий

это

результат,

в

следующая

предикат,

случае

если

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

для решения поставленной задачи, и хотя с помощью данной операции можно выразить все

остальные

операции

сравнения

(на

равенство, неравенство, меньше, меньше или равно, больше или равно), я не рекомендую делать это. Так как медленно. И каждая операция

сравнения,

написанная

отдельно

даст однозначно меньшее время выполнения.

плавающей точкой. Плавающая точка имеет очень

нехорошее

свойство

различных

операциях

могут

различными

числами,

начинающих

программистов.

погрешность

и

все

это

справедливое

Собственно,

возвращающая

этот

предикат

логическую

(функция,

величину)

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

Прежде всего, нужно обратить внимание, как процессор

работает

с

вещественными

удивление

Наши

числа

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

ограничена

компьютера.

В

только

связи

свободной

с

этим

и

сравнение работает аналогичным образом – то есть числа, отличающиеся друг от друга даже

на один миллионный разряд в дробной части, являются разными. Так как многие задачи

даются с ограничением в виде погрешности, следует помнить о том, что наши операции

(например, вычитание с учетом знаков чисел) дают

очень

погрешности.

точные

результаты,

рассмотрим сравнение двух чисел:

чисел.

вызывает

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

функций

длинных

считаться

одинаковыми (равными, эквивалентными) и

Немного

сравнения

числа,

близкие по значению, но разные числа в

Но данную операцию можно использовать, например, для тестирования своих процедур и

особняком

стоит

деления, но об этом позже.

без

операция

Итак, давайте

1. Выравняем разряды, относительно разделителя

разрядов

целой

и

дробной

частей

операндов. Это нужно, потому что сравнение мы будем производить поразрядно.

2. Определим число разрядов в числах. 3. Начнем поразрядное сравнение.

38


ПРО

№13 (апрель) 2011

граммист

АЛГОРИТМЫ При этом сравнение будем производить со

остальных случаях (то есть пункт 3.3, а также

очень

действий

старших разрядов – это немного быстрей для разных

относительно

чисел

и

близких

медленно

чисел.

для

Если

вы

предполагаете, что производимые действия

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

3.1. Получим очередной разряд.

3.2. Если числа равны, то продолжим с пункта

3.1. То есть, ситуация неоднозначна и требуется дальнейшее сравнение разрядов.

если

числа

равны

между

производить

не

собой)

нужно,

никаких как

и

предполагали, первый операнд не больше

второго. Теперь самый медленный вариант

развития событий – это ситуация, когда числа

равны между собой, следует помнить, что время работы операции сравнения различно в

зависимости от числа разрядов и самих чисел. Это еще одна причина гасить незначащие разряды в числах.

3.3. Если разряд второго операнда больше

Умножение

закончено – и так понятно, что первое число

Великие люди учили нас, что решение задачи

соответствующий флаг, для нашей функции

С

разряда

первого

меньше

операнда,

второго

то

(нужно

сравнение

выставить

логично использовать False).

3.4. Если разряд первого операнда больше разряда также

второго

операнда,

то

число

закончено,

(выставим второго.

True)

причем первое

сравнение

положительно больше

Как видите, нам не надо сравнивать числа до конца, только до первых отличных друг от

друга разрядов. Это как раз и приводит к тому,

что

сравнение

для

близких

чисел

производится дольше, чем для чисел, сильно различающихся друг от друга, – нам требуется больше

итераций,

чтобы

различающимся разрядам. Еще

нюанс:

нам

надо

подобраться

к

предусмотреть

ситуацию, когда числа равны между собой. В таком случае должно быть False –

можно достичь, разбивая ее на ряд подзадач. умножением

это

также

возможно.

Вспоминаем, как мы умножали на бумажке – цифру за цифрой, иными словами поразрядно. Поэтому мы сильно упростим себе жизнь, если сначала рассмотрим процесс умножения

какого-либо числа на один разряд (то есть на

целое число от 0 до 9). При этом, как показывает

опыт,

опять

же

нет

никакой

разницы, целое ли число будет умножаться на разряд или же дробное. Результат в обоих

случаях будет верным. Иными словами, нам нет

необходимости

разрядов

в

дробной

заботиться части

останется от первого операнда:

о

это

числе

число

1. Инициализируем результат. Обратите внимание: мы не копируем здесь это не требуется.

первый операнд,

ведь

2. Умножение на нуль? Это проверка частного

Специально проверять это нет необходимости,

можно очень быстро, собственно мы это уже

первый операнд не больше второго операнда. если

поступить

следующим

образом

изначально выставить результат как False – мы сразу сомневаемся что первый операнд

больше второго. True, как известно, наступит только в пункте 3.4 (если наступит), во всех

случая, дело все в том, что на нуль умножать сделали в первом пункте. То есть пустая байтовая

последовательность

всегда

есть

нуль. И если перед нами умножение на нуль, то

поразрядное

медленней

умножение

проверки

второго

однозначно

разряда.

39


ПРО

№13 (апрель) 2011

граммист

АЛГОРИТМЫ Обратите

внимание,

что

я

не

провожу

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

что

вполне

данную

однозначно,

отчасти

проверку

можно

выполнить позже (чтобы избежать повторных

операций). Иными словами, гасите разряды везде, где только можно.

3. Выравняем разряды. Если мы достигли данного пункта, то число, на которое мы будем

умножать, не равно нулю. А это значит, что нам нужно в результате подготовить такое количество

разрядов,

которое

мы

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

4. Добавим разряд к числу. Умножение и

сложение – во многом похожие операции, а

это значит, что возможна ситуация, когда

возникнет перенос в несуществующий старший разряд.

5. Определим число разрядов в первом операнде. Требуется, чтобы знать количество итераций процесса умножения разряда на разряд. 6.

Есть

проводить

разряды?

Здесь

проверку

мы

на

уже

можем

стандартное

представление нуля. Его особенность в том, что

байтовая

последовательность,

не

содержащая разрядов, считается нулем, а умножение нуля на любое число также в

готовы к умножению. Почти? Да, не забываем

про перенос, для самых младших разрядов он должен

быть

равен

нулю

(это

нужно

запомнить как аксиому). И только потом уже переходить к поразрядному умножению. 7.1.

Собственно

сам

процесс

умножения.

Здесь я не стану заострять внимание на таких вещах,

как

чтение

разряда

из

байтовой

последовательности первого операнда (то есть

что надо умножать). Операция, в общем виде, выглядит так: результат умножения равен очередному

разряду,

множитель + перенос. 7.2.

Переполнение?

умноженному

Как

и

со

на

сложением,

ситуация, когда результат не уместится в

один разряд, вполне возможна (и даже более

вероятна, чем во время сложения). Итак, если результат

больше

получить

результата, которое

перенос чтобы

должно

9,

и

то

сначала

вычесть

получить

занимать

то

наш

нужно

его

из

значение, разряд.

Перенос можно получить, если из результата умножения

вычесть

остаток

от

деления.

После получения значения для помещения в

разряд перенос будет содержать двухзначное число, обратите внимание на это (так проще получать

значение

результирующий

для

разряд).

внесения

Поэтому

в

следу-

ющий перенос необходимо поделить на 10. Однако возможна ситуация, когда резуль-тат умножения

не

превысит

одного

разряда,

тогда все просто, внесем данное число в разряд, а перенос установим в нуль.

7.3. Внесем результат в результирующий разряд.

результате дает нуль. Как и было отмечено

8. Внесем остаток. Да, все как в сложении – в

возможна

возможен перенос, который также следует

выше,

если

Вы

создадите

ситуация

представлено

когда

незначащими

нуль

вручную,

число

будет

разрядами

данная проверка этого отследить не сможет.

и

7. Умножаем в цикле. Вот теперь мы почти

результате операции над старшим разрядом внести в результат (специально для него в 4-м пункте мы резервировали место).

9. Внесем разделитель. Мы ведь не копиро-

40


ПРО

№13 (апрель) 2011

граммист

АЛГОРИТМЫ вали

какое

первый

операнд,

значение

имеет

помните? число

Поэтому,

разрядов

в

дробной части результата никому неизвестно. Это

число

нужно

первого операнда).

перенести

вручную

(из

10. Сбросим незначащие разряды слева. Гашение незначащих нулей на тот случай, если нет необходимости в пункте 8.

Вот такая вот промежуточная ступенька в

операции умножения. Теперь само умножение двух длинных чисел: здесь нам потребуется еще

одно

длинное

число

для

Теперь

алгоритм

пошагово

рассмотрим

сам

1. Инициализация. Подготовим наш результат: таким образом, после данной операции

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

2. Выравняем множители. Результат выравнивать

нет

необходимости:

понятно ниже по алгоритму.

почему

будет

хранения

3. Получим количество разрядов в операнде.

немного отклонился от школьного умножения

хоть из первого, хоть из второго операнда.

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

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

4. Умножаем столбиком в цикле. Здесь нам

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

промежуточных

складываем.

Для

результатов,

экономии

а

памяти

(числа могут быть очень длинные, сотни и тысячи

разрядов

помните?),

я

немного

схитрил и не храню несколько чисел, а сразу добавляю полученные числа в результат: Шаг 1

4.1. Получим очередной разряд второго операнда.

Нам

необходимо

последовательно

умножать первое число на разряды второго.

4.2. Поразрядное умножение. Для этого мы воспользуемся алгоритмом разряд.

уже

рассмотренным

умножения

любого

выше

числа

на

4.3. Осуществим сдвиг запятой. Именно для

этого нам и нужна была дополнительная переменная,

нам

нужно

было

где-то

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

Шаг 2

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

том, что нам необходимо учитывать тот факт, Шаг 3

что второй операнд тоже может содержать дробную часть.

Сделать это можно так: Число

разрядов

в

дробной

части

41


ПРО

№13 (апрель) 2011

граммист

АЛГОРИТМЫ промежуточного результата определяется

иначе наш знак будет плюс. Правило можно

операндов за минусом текущей итерации.

равны, то результат будет положительным,

как сумма разрядов в дробных частях Текущая итерация на самом деле определяет положение

разряда

во

втором

операнде

переформулировать:

если

знаки

операндов

иначе отрицательным.

относительно разделителя разрядов целой и

Деление

информацию о числе разрядов в дробной

Самая трудная часть всей арифметики. И

разделителя разрядов целой и дробной части

легких путей, к тому же без нее никак не

дробной части (не путайте, мы храним только части в

числа,

числе).

но

А

никак

сумма

не

потому

позицию

что

при

умножении число разрядов в дробных частях

суммируется. Наверняка всему этому есть математическое

обоснование

где-нибудь

в

численных методах, но наш метод школьный, а потому выведен опытным путем.

4.4. Копим результат. То есть, складываем наш промежуточный результат с результатом

окончательным (без учета знаков чисел, здесь знаки

нам

не

нужны)

это

то

самое

жульничество, мы не копим числа, а значит, экономим пункту

ресурсы.

4.3,

наше

промежуточный

При

этом,

волшебство

результат

благодаря

дает

нам

уже

с

соответствующей дробной частью (если она должна быть).

Кстати, если применять правило из пункта 4.3 к

целым

числам,

промежуточных отрицательным дробной

части.

то

мы

результатах

количеством Однако

получим

в

разрядов

в

числа

результат

с

всей

операции будет все равно правильным – за это ответственна

операция

по

выравниванию

разрядов относительно позиции разделителя

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

5. Учтем знаки. Здесь все просто, минус возможен только в случае, если один из

операндов имеет знак плюс, а второй минус,

обычно самая медленная. Но мы ведь не ищем обойтись,

особенно

если

вам

захочется

добавить прочие операции (корни, степени, тригонометрию и т.д.). Итак, прежде нужно вспомнить принцип соразмерности – основная работа

будет

производиться

над

целыми

числами, и только потом мы будем трактовать

результат как дробное число (если оно будет

дробным). Для этого уже давно придумана операция деления нацело (х mod y). Кстати,

за

делением

замечено

одно

интересное явление (в том плане, что нам

придется это учитывать). Деление – единственная

операция,

которая

способна

порождать бесконечное число разрядов (в предыдущих трех операциях число разрядов результата

можно

предсказать

заранее).

Попробуйте разделить 1 на 3. Да, в школе мы результат

получали,

однако

уникальное

правило – как определять, что результат будет

0.(3) (3 в периоде), – мне найти не удалось. Поэтому мы будем ограничивать результат определенным числом разрядов. Обратите

округлять.

внимание То

есть

ограничивать,

программист,

а

не

который

будет использовать данную функцию должен

сам решать, сколько разрядов ему не хватает для полного счастья. Это позволяет нам уйти

от проблемы округления… Что за проблема? Дело

в

том,

что

существует

несколько

способов округления числа, и основываются

они на том, что последний разряд может быть

42


ПРО

№13 (апрель) 2011

граммист

АЛГОРИТМЫ цифрой 5. Добавлять единицу в следующий

деления на нуль. Школьный курс математики

Так что пусть программист сам решает, как

математика уточняет: операция возможна, но

разряд или не добавлять? Вот в чем вопрос... ему округлить удобней (за счет манипуляций с последними разрядами).

Однако вернемся еще раз к делению. Чтобы

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

имеются

два

числа:

0.5

и

0.2.

В

результате выравнивания мы получим числа 5

и 2, от деления которых (нацело, разумеется) мы получим число 2. Всего один разряд, а нам

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

нужное количество разрядов. 50, деленное на 2, даст нам 2 разряда, 500 на 2 даст три

разряда (правда, один незначащий, то есть для

нашей

операции

достаточно

двух

разрядов) и т.д. Здесь есть пара нюансов, сразу не видных. Первый:

вы

получите

сколько

надо,

деленное

на

однако

столько

деление

разрядов, может

закончиться раньше. В том же примере 0.5, 0.2,

даст

2.5,

то

есть

два

действительных разряда, независимо от того насколько бы 5 ни домножали. Второй:

вычитания

как

с

операцией

нужно

беззнакового

учитывать

старшие

разряды. То есть для деления 0,2 на 0,5 нужно брать на разряд больше, потому что операция

деления нацело 2 на 5 даст в результате нуль – кстати, весьма справедливо (можно считать его целым нулем, за которым следует дробная

часть числа). То есть осуществлять деление 20 на 5 и 5 на 2 (а не 50 на 2).

Кстати, деление имеет немалый философский и логический подтекст. Например, в случае

говорит, что это просто невозможно. Высшая

с большим числом оговорок. В нашем случае будет три операции деления (одна деление нацело),

учитывающих

такой

вариант

развития событий как деление на нуль. В

одном случае деление на нуль невозможно. Это

отражается

в

форме

исключительной

ситуации при делении на нуль. Во втором

случае деление на нуль вернет очень большое

число (конкретно я предлагаю возвращать 0.(9)*10^100), что имеет смысл при решении ряда

практических

задач.

Вообще-то

положено возвращать максимально большое

число из представимого системой диапазона чисел (это установлено методом приближения

– на нуль поделить проблематично, однако, можно

делить

числа,

по

величине

стремящиеся к нулю, попробуйте сами 1/1, 1/0.5, 1/0.25, 1/0.125 и т.д. – с каждым шагом результат увеличивается).

К сожалению, для разных компьютеров (а также для разных моментов времени работы

программы на данных компьютерах) это число различно и определяется памятью, которую операционная система готова дать вам под

максимальное число. Кроме того, даже если

система и даст вам такое число, то, как правило,

затрачиваемая

на

него

память,

предельна для работы данной программы, и дальнейшая

работа,

скорее

всего,

будет

невозможна. То есть это приведет к краху программы. Но раз уж если мы условились

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

количество должно

нефатальное разрядов:

быть

для

вместе

достаточно

с

программы тем

большим,

оно

чтобы

приблизиться к нашей модели вычислений. С учетом количества памяти в современных

43


ПРО

№13 (апрель) 2011

граммист

АЛГОРИТМЫ компьютерах, я считаю, что ста разрядов в

листке бумаги. Еще пример: 195 mod 7. Итак,

точности) вполне достаточно. Таким образом,

знали), сколько же будет 195 поделить на 7,

целой части (и ста разрядов в дробной, для следует помнить, что деление на нуль для

чисел от 90 разрядов и больше не дает

приемлемых результатов: мы получим число, которое

не

будет

сильно

выделяться

от

операндов (с другой стороны, следует вообще

избегать деления на нуль – считайте это черной

дырой

необходимо

математики).

показать

превосходящее

Нам

число,

операнды

же

значительно

по

величине:

помните об этом при построении операций деления на нуль в своих алгоритмах (если ваши

вычисления

проводятся

с

числами,

имеющими сто разрядов, можно возвращать, например, 0.(9)*10^1000).

данную

Вообще

операцию данный

рассмотрим

алгоритм

не

уникален (как и все предыдущие) – ни в плане скорости

его

работы,

ни

в

плане

его

организации. Как и большинство сложных

алгоритмов, деление нацело можно разбить на ряд подзадач. В основе* данной операции лежит операция получения первого разряда.

Перед тем как взяться за алгоритм данной операции,

давайте

немного

проясним

ситуацию. Возьмем конкретный пример: 5

mod 6. Ответ, как известно, – нуль и это правильно:

это

нуль

целых

и

сколько-то

дробных (десятых, сотых, тысячных и т.д.). На

данном этапе нас интересуют только целые, поэтому если делимое меньше делителя, то в

результате деления нацело получится нуль. Само же деление нацело можно представлять итеративным получения

будем

это

делать?

Для

начала

получим

первый разряд. Для этого нам надо поделить 19 на 7. Почему 19? Потому что первый

разряд делимого меньше первого разряда делителя. Вообще от делимого нужно брать столько же разрядов, сколько и в делителе +

еще один разряд, в случае если старший

разряд делимого меньше старшего разряда делителя. А если его нет? Такая ситуация

возникать не должна – это означает, что

делимое меньше делителя, а мы условились, что

это

стопроцентный

нуль

и

дальше

вычислять нечего. Поэтому всегда возможен получим от делимого новое число с числом

Основа всего деления – это деление нацело, подробно.

поэтому нам придется вычислять это. Как мы

только один из двух вариантов – либо мы

Деление нацело поэтому

скорее всего вы не помните (если вообще это

(цикличным)

первого

разряда

от

процессом

деления.

Собственно, так я и произвожу деление на

* Напомним школьный курс: Деление – это такая операция, в результате которой получается число (частное), которое при умножении на делитель дает делимое.

разрядов равным делителю (и это число будет больше

или

равно

делителю),

либо

мы

получим заведомо большее число с разрядами на один больше, чем в делителе. Здесь все

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

работы процесса может надолго испортить вам настроение.

Итак, мы остановились на том, что нужно

поделить 19 на 7. Мы знаем, что ответ – 2. Однако что будет, если нам нужно делить

1956 на 73? Тогда берем 195 и делим на 73. Это понятно, но как считать результат в

данном случае? А в случае, когда оба числа

имеют десятки и сотни разрядов? Правило, по которому

мы

взяли

старшие

разряды

делимого (того числа которое нужно поделить

на 73), дает нам одну особенность – результат от данной операции всегда гарантируется в

рамках одного разряда, то есть ответ будет находиться

в

диапазоне

0..9.

Но,

к

сожалению, более точно вычислить сразу не

44


ПРО

№13 (апрель) 2011

граммист

АЛГОРИТМЫ всегда представляется возможным (иногда,

дробной

проводить

случаем все и так ясно и понятно, а насчет

даже

решая

на

листочке,

дополнительные

приходится

промежуточные

деления либо и вовсе жульничать с помощью калькулятора). настоящим

Здесь

мы

гаданием.

займемся

самым

Приблизиться

к

результату можно опять-таки делением самых

части

результата),

остатка

вообще

не

первого

напомню:

останется.

деление

либо Со

когда

вторым

нацело

имеет

смысл только в случае, если делимое больше делителя, иначе ответ нам известен.

старших разрядов – уже в последний раз. То

Итак, сам алгоритм деления нацело

1956 на 731 или 19569 на 7315 или 195693 на

1.

на 7, только старшие разряды и ничего более.

нулю (весьма вероятная ситуация). Также

есть здесь, при делении 195 на 73 (равно как и 73159 и т.д.), нужно рассмотреть 19, деленное

В результате мы получим 2, но этот результат

пока не окончательный. Можно сказать, что результат около двух (а именно – находится в

интервале от 1 до 3). Далее мы должны подтвердить

опровергнуть

результат,

то

есть

здесь

подготовим

понадобятся

нам

операциях.

еще

в

два

числа,

они

промежуточных

полученное

2. Сравним оба числа. Если делитель больше

помножим наше 73 на 2 и вычтем полученное

время мы можем сразу сказать результат: это

значение.

или

Инициализируем

предполагаем, что результат операции равен

Сделать

это

можно,

если

мы

из 195. 73, помноженное на 2, даст 146. А 195146 даст 46. Значит, действительно первый разряд будет равен 2.

делимого, то деление невозможно, в тоже

нуль. В таком случае просто вернем результат

(то есть предположение из первого пункта верно).

Однако вполне возможны ситуации, когда 2 не

3. Определим количество разрядов делителя

Это очевидно, когда мы попытаемся поделить

нужно

будет соответствовать истинному результату. 145 на 73. Также возьмем старшие разряды – 14 div 7 вернет 2. Но 73 помноженное на 2

(числа, на которыее мы будем делить). Нам знать,

делимого.

сколько

разрядов

брать

из

даст 146. Данный результат больше, чем нам

4. Получим необходимое для деления коли-

1.

называемое

требуется, следовательно, настоящий разряд Такое

алгоритма Однако,

вот

неформальное

получения

процесс

старшего

деления

на

описание

разряда.

этом

не

заканчивается, но, по-крайней мере, виден

свет в конце туннеля. Снова вспомним запись в школьной тетради – как только мы получили разряд, мы помножаем на него делитель и

чество

разрядов

делимого.

приближение

Это

(делимого

так к

делителю: цель получение числа в диапазоне

от 0 до 9). С этого момента мы работаем с двумя делимыми – старшей частью (которую получаем

сейчас)

разрядов, не числа!).

и

младшей

(остатком

вычитаем его из делимого. Эта разница снова

5. Получим остаток разрядов делимого. Это

старшего

последовательности

принимает

участие

разряда

в

нахождении ответа.

самого

Процесс

повторяется до тех пор, пока остаток от делимого (признак

не

того,

станет что

меньше

далее

идут

делителя разряды

достигается

удалением

из

нужного

байтовой

количества

разрядов слева (число разрядов делителя). Таким образом, с данного момента идет уже физическое

разделение

делимого

на

45

две


ПРО

№13 (апрель) 2011

граммист

АЛГОРИТМЫ группы разрядов. 6.

Далее

она должна немного ускорять процесс (все

следует

рассматривать разрядов

его

цикл как

результатов,

деления

(можно

однако

следует

цикл

получения

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

разрядов

уже

неоднократно

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

первой группе разрядов делимого не хватает разрядов или число, формируемое из данных разрядов,

менее

делителя,

то

также

недостаточно или вовсе нет разрядов и во второй

группе

перенесены

в

(иначе

первую).

они

были

Следовательно,

бы в

результате процесса деления (либо сразу как входящий делителя,

а

параметр) значит

нацело невозможно.

делимое

меньше

дальнейшее

деление

6.1. Получим предполагаемый разряд: как это сделать, подробно рассмотрено выше.

6.2. Подкорректируем разряд. Дело в том, что

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

потому

что

операции

медленны).

независимо

над

десятками

Здесь

нам

от

платформы

разрядов

нужно

проверить

вторую группу разрядов делимого. Если там

пусто (в том плане что там нет больше разрядов, являются

так

как

нули,

значащими

внесенные

деление

завершено.

необходимо прервать.

В

таком

случае

6.7. Теперь берем один из оставшихся во

второй группе разрядов и добавляем их к остатку

операции

от

в

вычитания пункте

(от

результата

6.4).

При

этом,

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

6.8. Сравним делимое и сравниваем с результатом пункта 6.7. Эта операция циклична.

6.8.1. Добавляем разряд аналогично пункту 6.7. Нам нужно добрать недостающие разряды 6.8.2.

Добавляем в байтовую последователь-

6.8.3.

Аналогично

ность результата деления нацело нуль вправо пункту

6.6

проверим,

остались ли разряды во второй группе. Если

их нет, осуществим выход из данного цикла (цикла пункта 6.8)

(второе из чисел использовано под хранение

Разобьем делимое на две группы: 19 и 56.

число

мы

поместим

результат

то

добавление в первую группу невозможно и

Еще

первой группы разрядов делимого). В это

там,

разрядами),

6.3. Теперь задействуем одно из чисел, которые мы подготовили заранее в пункте 1

всегда

немного

о

делении

нацело

для

наглядности. Итак, мы делим 1956 на 7.

умножения

делителя на полученный в пункте 6.2 разряд.

6.4. Осуществим вычитание из первой группы

В результате мы получим остаток от деления

поведенной в пункте 6.3.

мещение разряда из группы в группу. Таким

разрядов

делимого

результат

операции,

6.5. Внесем результат, полученный в пункте

6.2 в общий результат деления нацело. Это

можно сделать за счет добавления разряда к байтовой справа.

последовательности

5 (19-7*2). Следующий шагом будет переобразом, получим следующее состояние групп 55 и 6.

результата

6.6. Используем дополнительную проверку:

В результате получим остаток от деления 6

46


ПРО

№13 (апрель) 2011

граммист

АЛГОРИТМЫ (55-7*7).

Следующим

шагом

будет

пере-

3. Вместо физического разделения разрядов

образом, получим следующее состояние групп

границу, конечно, помнить следует, чтобы

мещение разряда из группы в группу. Таким 66 и все, вторая группа пуста.

можно организовать работу с одним делимым, сохранить

принцип

получения

одного

старшего разряда от деления, однако для этого достаточно будет одной переменной.

В результате получим остаток от деления 3 (69-7*9).

Дальнейшая

можна потому, что:

работа

цикла

невоз-

а) вторая группа пуста (наступит пункт 6.6 приведенного выше алгоритма);

б) 3 меньше 7 (это глобальное условие цикла)

4. Сам наш алгоритм несовершенен, за счет операции угадывания числа.

Итак, покровы сорваны, но теперь осталось добавить

алгоритма:

несколько

слов

в

оправдание

В результате получено: 1956 div 7 = 279 и 3 в

1. Это наглядный процесс создания подобных

часть числа).

операций

остатке (которую можно развить в дробную

операция

и

физическое

неоптимизирована,

перемещение

ее

разрядов

между двумя группами (это всегда медленно), и неудачная реализация пункта 6.8. И самое главное

это

вообще

процесс

делимого на две группы разрядов.

разбития

1. Физическое перемещение разряда из числа в число требует от нас погружаться на другой уровень

абстракции,

проводить

работу

с

байтовыми последовательностями. Все это не

способствует работе с сотнями и тысячами разрядов делимого числа.

2. Следует пересмотреть пункт 6.8, чтобы

вообще избежать цикла. Для этого требуется вычисление

Перемещение

общего

разрядов

числа

разрядов.

группой

будет

намного быстрей, чем организация цикла со сравнением

длинных

чисел

в

качестве

условия выхода из него (тем более что выше

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

процесс

математических

циклического

чисел). Поняв работу данной операции, вы

работу можно ускорить. Проблем несколько: это

Большинство

есть

применения действий к разрядам числа (или

Что не так в нашей операции mod Данная

операций.

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

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

совсем

материала.

не

Это

способствует

некий

баланс

усвоению

между

простотой и эффективностью (который сильно

смещен в сторону простоты). Кроме того, данный

алгоритм

работает

так

же,

вопрос,

который

как

производит деление человек. Между прочим, есть

еще

один

был

специально оставлен на десерт – это наше

деление на нуль. Вообще-то для операции mod

деление на нуль невозможно (поскольку это не совсем математическая функция), то есть операция

с

неподходящими

параметрами

должна приводить к исключению. Однако у нас

будет

существовать

две

полноценные

операции деления, одна из которых деление

на нуль допускает (пусть и с оговорками на

точность результата). Поэтому, на мой взгляд, не совсем справедливо не иметь операцию

деления нацело, не имеющую право делить на нуль.

Делается

это

просто

оберткой

над

нашей операцией деления нацело, которая

47


ПРО

№13 (апрель) 2011

граммист

АЛГОРИТМЫ помимо

прочего

дополни-

образом, чтобы при делении нацело сразу

возможность выбора поведения функции при

5. Найдем разницу в числе разрядов делимого

тельный

получает

параметр.

Этот

еще

параметр

дает

делении на нуль. Вариантов, как уже было

сказано два – либо генерировать исключение, либо

возвращать

результат разрядов

в

(это

заведомо

очень

делается

байтовой

большой

формированием

последовательности).

Реализовывать ли данную операцию или нет, остается на ваше усмотрение (я себе такую сделал).

переходим

к

предыдущие

передаваемых операндов

ей

и

реализации

обычного

операции

параметров.

результата,

для

за

ее

счет

Помимо работы

требуется уточнить число разрядов в дробной части**:

2. Проведем контроль второго операнда и тут

мы ищем нуль, напоминаю еще раз это число не содержащее разрядов. Это очень важный

момент. Если вы передадите сюда несколько данная

результат

проверка

работы

не

сработает

функций

и

будет

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

пор, пока система будет давать ей память под результат.

2.1. Исключение.

2.2. Формирование результата из большого числа 9-к.

3. Выравняем оба числа (то есть установим

незначащие нули таким образом, чтобы числа разрядов в целых и дробных частях чисел совпадали).

4. Получим число разрядов в обоих числах. С этого

нужно

момента сразу

делимом и делителе соответственно, Len1 и Len2 – число разрядов в числах. В таком случае, если r1<r2, то разница между числом

разрядов в делимом и делителе равна Len2Len1+1, иначе Len2-Len1.

6. Если полученная разница меньше нуля, то

стратегия

домножить

числа

разрядов

следующая: делимое

нам

таким

** Поскольку есть числа, которые можно делить бесконечно, а также специальный флаг поведения (выпадать в исключение при делении на нуль или возвращать определенный результат?

делимого

числа,

будут

использованы

для

При

этом

делимое

которые

получения

целой

части результата (правда, со знаком минус). само

подразделяется,

вся

никак

операция

проведена над одним делимым.

не

будет

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

1. Инициализируем результат.

нулей,

конкретно: пусть r1 и r2 – число разрядов в

пунктов 5 и 6 заключается в определении

настоящего деления. Она немного непохожа на

и делителя с учетом старших разрядов. Более

считаем ее равной нулю. Физический смысл

Полноценное деление Итак,

получить нужное нам число разрядов.

Достигается

это

добавлением

необходимого количества нулей в байтовую

последовательность делимого числа справа. Нужное количество нулей определяется так: нужно к разнице, полученной в пункте 6 (число разрядов делимого, необходимое для

получения целой части результата) добавить входящий

параметр

необходимое

в

дробной

число

части

разрядов

результата.

Здесь нужно знать, что данная операция не

обязательно приведет к тому, что результат от деления

обязательно

будет

содержать

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

являются

незначащими

нулями.

Число разрядов может быть и больше, в таком

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

разрядов

не

меньше

действительных разрядов.

чем

число

48


ПРО

№13 (апрель) 2011

граммист

АЛГОРИТМЫ 8. Осуществляем деление нацело. Все разря-

существует

сколько их находится в дробной части числа.

исследованы и математически обоснованы. В

ды получены, осталось только определить,

9. Снова проанализируем разницу, полученную в пункте 6.

9.1. Если это число больше нуля, то это число однозначно

меньшее

1.

Добавим

слева

большинство

немало из

иных

алгоритмов,

которых

тщательно

частности, этим занимался сам Дейкстра***, были

и

разработки

советских

Интернете найти не очень сложно.

ученых.

В

столько нулей, сколько составляет разница.

Но я бы хотел обратить внимание на еще

общего числа разрядов в числе (то есть это

называемая ведическая математика. Создана

Число дробных разрядов на разряд меньше нуль целых и сколько-то дробных). 9.2.

Если

число,

полученное

в

пункте

одну она

систему

была

в

арифметики.

глубокой

Это

древности,

так

в

таких

6

«мохнатых веках», что история уже и сама не

часть. Для этого нам нужно взять число,

предположительно в Индии). Легенды гласят,

меньше нуля, то наш результат имеет целую полученное в пункте 5 (в пятом, не в шестом пункте!),

и

инвертировать

его,

добавив

единицу (она связана с разделением разрядов, считайте ее особенностью алгоритма, просто константой).

Теперь

нам

необходимо

правильно выставить разделитель разрядов

между целой и дробной частями результата. Нужно

учесть,

что

в

числе

мы

храним

количество дробных разрядов, а вовсе не целых. Иными словами, разделитель разрядов определяется

как

разница

между

общим

числом разрядов и числом разрядов в целой части числа. В итоге детальное рассмотрение

алгоритма деления нацело сильно помогло нам в построении обычного деления. Однако на

этом

является

не

закончили.

универсальной,

удобной из-за передачи

Данная но

не

операция

совсем

флага поведения,

поэтому будем считать ее промежуточной. От нее получим еще две, уже окончательные

операции. Задача наших операций деления – просто передавать входящие параметры, но с таким значением флага поведения, которое

помнит

точно,

когда

это

было

(но

что ведическая математика была подарена индусам людьми с неба (веды – «истинное знание»),

такие

дела.

Поэтому

никаких

исследовательских трактатов нет, это сборник

рецептов (часть из которых не универсальна), выраженных

в

виде

набора

сур

(сура

дословно «нить знаний»), линии поведения или набора знаний, сборник правил. Народная

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

работают,

службу,

получены,

но

рецепты

способы,

отсутствуют

действительно

какими (если

они

не

были

считать

людей с неба), что не дает возможности поиска новых способов. К сожалению, труды по

ведической

математике

весьма

малочисленны, взять кое-что можно отсюда http://badnews.org.ru/news/iz_istorii_vedichesko j_matematiki_chast_1/2010-11-30-5128. Анализ

манипуляций

показывает, что:

над

числами

бы отражало суть нашей модели деления –

ведется не математическими • работа способами (насчет прямого преобразования

Постскриптум или… Еще арифметика

• число циклических итераций на порядки меньше в сравнении с традиционными

деление на нуль невозможно, или возможно….

Помимо школьных операций, на самом деле

разрядов операндов);

алгоритмами (за счет групповой обработки разрядов).

*** Эдсгер Вибе Дейкстра (нидерл. Edsger Wybe Dijkstra (11 мая 1930, Роттердам Нидерланды – 6 августа 2002, Нуенен, Нидерланды) – нидерландский ученый, идеи которого оказали влияние на развитие компьютерной индустрии http://ru.wikipedia.org/wiki/Дейкстра,_Эдсгер_Вибе. Смотрите раздел «Литература. Алгоритмы, теория и практика программирования» на нашем форуме http://forum.procoder.info/index.php/topic,260.0.html.

49


ПРО

№13 (апрель) 2011

граммист

http://programmersforum.ru

Виталий Белик

ЛАБОРАТОРИЯ

HTML НАРАСПАШКУ. ЧАСТЬ 1

Однажды мой друг попросил меня быстро написать программу, которая помогла бы ему распарсить страницы из КЭШа поисковиков. Это смогло бы восполнить потери в базе его сайта, которую он «случайно» почистил. Я посмеялся и написал ему простейший парсер конкретно для Яндекса, Гугла, а потом подумал: «А что если попробовать сделать свою качалку страниц? А может, даже и свой браузер... Как он будет выглядеть? Сложно ли это сделать?» Это заинтересовало меня – ответ «Гуглехрому» своими руками достаточно неплохая задача, верно?

Prehistory

отображать». Браузер согласно указаниям в

Что же такое браузер? Википедия ответит на

в нужном месте, или в аудиоколонки, если

этот

вопрос

бра́узер

броузер

строчками

(от

англ.

Web

«Веб-обозрева́тель, browser;

устаревшая

вариант

это, скажем, песня.

менее

Допустим,

обеспечение для просмотра веб-сайтов, то

считывать

предпочтительная

форма)

есть

запроса

для

и

HTML- разметке выдает загруженное на экран

программное

веб-страниц

(преимущественно из Сети), их обработки, вывода и

перехода от одной

страницы

к

другой». И будет совершенно права. Исконно браузерами

отображения

называли WEB-

инструментарий

сайтов

у

клиента.

для

Но

чтобы отобразить (я бы сказал – отрисовать) страницу

браузер

должен

обладать

двумя

важными функциями: Загрузчиком страницы и парсером страницы.

Загрузчик страницы должен быть достаточно умен, чтоб загружать контент (содержимое

страницы в данном случае) по требованию браузера. Не секрет, что HTML- страницы

содержат ссылки на картинки, мультимедиа и

прочие файлы, которые необходимо клиенту

открыть (проиграть, отобразить), и загрузчик просто-таки обязан все эти вещи запросить из Интернета, контентом

создать

этой

файл,

наполнить

мультимедиа,

и

его

сообщить

браузеру: «Эй, дружище, я закачал, можно

схема

может

быть

такой:

Загрузчику браузер указывает, сколько байт «посасывает» порции

быстренько потоке)

страницу.

Тот

в

потихоньку,

передает (может

разбирает

цикле

после

парсеру,

быть

часть

даже

кода,

ее

каждой

в

который другом

определяя,

насколько он цельный, насколько из того, что

уже пришло, можно понять, что отображать. Если ему удается определить, что часть тегов уже

закачалась,

правилам

они

HTML

и

(теги)

закрыты

представляют

по

собой

цельный объект, который о чем-то говорит

точно и неоднозначно, парсер просит браузер согласно этому тегу что-то отрисовать вне

очереди. Браузер создает объект в памяти, наполняет его свойствами из этого тега и отрисовывает этот объект и все последующие

согласно их свойствам. Все замечали: что иногда бывает, что страница в начале закачки выглядит

на

весь

экран,

а

потом

резко

сжимается – это как раз говорит о том, что тот

объект,

который

теснит

объекты

еще

загрузчиком не подгрузился, парсер еще не разобрал

его,

а

браузер

уже

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

спешит

50


ПРО

№13 (апрель) 2011

граммист

ЛАБОРАТОРИЯ отрисовать полагая,

на

экране

что

он

неожиданностей

не

страницу,

самый

будет.

наивно

умный

Однако

и

потом

загрузчик закачивает какую-нить картинку, которая

теснит

своими

размерами

ее.

Браузер, узрев «сие неподобие», о коем ему

поведал парсер («Эй, брателло, зацени фотку. Только учти: она размером метр на метр»), чешет

в

своей

киберпальцами,

электронной

создает

такой

шевелюре

объект

«картинка», задавая ему размеры «Дофинта на бог знает сколько» согласно поведанному ему

парсером, и запускает цикл отрисовки заново, по всем объектам, уже имеющимся в его памяти. Здесь происходит масштабирование всех

объектов

какие

гвозди

будем

забивать. Начнем с Дельфи. Он имеет ряд преимуществ

(на

наличия

первый

компонентов

взгляд)

в

виде

быстрого

проектирования. Не зря сегодняшние версии

Дельфи имеют аббревиатуру RAD Studio – Rapid Developing Studio – Студия быстрой разработки. Кинул на форму компоненты и запускай. Все программа готова. Это как если

бы автомобили продавали с конвейерами – набрал тип авто, жмакнул кнопку – получай какое (имеется ввиду авто) захотел.

колес. Вот, кстати, аналогия с Need for Speed:

окно?

вся

оперировать,

браузера, в довольствии? В общем-то, нельзя

Экран,

чтоб

смогут

Прикольно было бы свои машины штамповать.

в…

так,

Давайте посмотрим, чем наши инструменты

страница

вписалась

можно воспользоваться для «кашеварства».

Что

там,

у

сказать, что все сложно. Не беря во внимание скрипты и прочие «прибамбасы» современных браузеров.

Но

отрисовать

форматированно,

красиво текст на экране – главная задача, испокон веков приписываемая HTML. Сразу

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

делали наши деды и отцы. Наипростейшее, способное

пролить

некий

свет

на

темное

царство интернет-клиентов (Наипростейшее

что? Из предыдущего предложения неясно и из этого тоже).

Заметили, как я уже говорил, написать это стоит на разных языках? Для кругозора, для

интереса, предлагаю выбрать четыре языка для

сравнения:

возьмем

Дельфи,

Си

«современные»

(для

красоты

плюсы,

состыкованные с .NET). Дельфи и С++ это только два языка, а где еще оставшиеся? Loading… 90% remained Прежде

всего

предлагаю

Имеешь набор стандартных крыш, кузовов, там

ты

можешь

«отрапидить» запчастями

одну

и

разными

буквально

ту

одним

же

машину

компонентамикликом.

Не

нужно перебирать вручную движок, свечи подбирать, систем

покупать

окраски,

граффити.

Все

пневмопистолеты

нанимать

уже

художника

вывалено

на

для

для

палитре

компонентов, достаточно только протянуть руку и взять это счастье. В случае с Дельфи

нам предоставлена их (ну или почти их) знаменитая почему-то

библиотека

INDY

расшифровывается

как

(которая

Internet

Direct), упавшая на хвост борландовцам в свое

время и продолжающая развиваться по сей день.

Вообще

можно

сказать,

что

эта

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

стала похожа на монстра типа этого (см. рисунок 1). Говорят, что это пишушая ручка.

Как бы там ни было, INDY в целом способна порыться

по

«сусекам», выудив на кухонный стол все, чем

(или способно? Какого оно пола-то?) решить проблемы

с

загрузкой

принадлежащих

ей

страницы

файлов

сайта

и

мультимедиа

51


ПРО

№13 (апрель) 2011

граммист

ЛАБОРАТОРИЯ

Рис. 1. INDY в разрезе контента. Для этого достаточно бросить на

Хы.

передать адрес URL, и он вернет в качестве

ничего лишнего, капающего в глаза жуткими

форму компонент IdHTTP, через метод Get строки весь код HTML (см. рисунок 2):

Все,

загрузчик

написан.

Вот

вам

преимущества Rapid- технологий. А заодно изворотами

многотонного

кода,

строчка и можно парсить текст из Мемо. Однако имеют

границе

преимущества

свойство

резко

рапидных

таких

компонентов

заканчиваться

проектов.

одна

Далее

на

идет

пустыня, где ветра багов сметают песок с дюн надежности компонентов, унося его в далекие

места. Никто не спорит, что, используя эти компоненты,

можно

написать

рабочую

программу, но чего это может стоить от задачи к задаче? Может быть тогда уже проще будет воспользоваться компонентом Рис. 2. INDY в действии

TWebBrowser, закачать с его помощью (точнее

с помощью ядра Internet Explorer, коим он

52


ПРО

№13 (апрель) 2011

граммист

ЛАБОРАТОРИЯ вовсю пользует) страницу. Им же и распарсить. И отрисовывать ничего не надо – все уже готово. Но так неинтересно. Студенты не ищут

легких

путей.

энтузиасты, впрочем, тоже.

Изобретатели

и

«Всего-то четыре строчки и никакой мороки», – сказал я себе и жмакнул F9, он же пуск, и... жестко

сообщил,

обломался, что

ибо

мой

антивирус

созданный

экзешник

инфицирован (см. рисунок 4):

А коль скоро так – предлагаю взять на заметку эту святую простоту, может, где и пригодится. Что

еще

сторонних

Дельфи

может

компонент,

предложить?

скажем,

Из

библиотеку

Synapse Ararat, которую можно скачать с портала [1]. Почему бы и нет, тем паче

Рис. 4. Предупреждение антивируса

(на момент написания статьи) Stable версию:

Ой, держите меня... Я «пацталом» (извиняюсь

demos and documentation. If you found some

это за вирус, хоть приблизительно, нашел

отзывы не самые плохие. Можно скачать их

«This is latest full release of Synapse, including bugs

here,

snapshot

see

to

first»

SynaSnap

2009-10-09

development

release

no.39.

Скачать труда не составляет. Возможно, даже

проинсталлировать в палитру компонентов. Или по-простому, по-деревенскому ручками подключить

симпатичной статьи). Ничего

(все на

вид

сложного

единственным

это

описано

в

[2]

мадамой

автором

так

же

одним-

методом

можно

контент страницы (см. рисунок 3):

получить

за нелитературщину). Я поинтересовался, что примерно

такое:

«Вредоносная

программа,

предназначенная для несанкционированного пользователем

обращения

Достигается

это

ресурсам

(обычно

соответствующих заменой указаны

ресурсов

к

команд

системных

(например, Мда...

интернет-

веб-страницам).

либо

файлов,

И

посылкой

браузеру,

«стандартные»

Windows)...».

к

в

адреса

файл это

которых

интернет-

hosts

при

либо

в

том,

MS

что

Synapse распространяется в виде исходников.

Еще один «Nine Inch Nail» в крышку гроба сторонних

компонентов

и

библиотек.

Не

обижайтесь фаны Синапса, но я однозначно

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

Ладно уж... Что нам еще предлагает Дельфи? Стандартные

ClienSocket.

Например,

на

просторах Интернета есть такая статейка [3]. Как вариант, можно взять на заметку. Однако Рис. 3. Атака Synapse

скажу, что, слегка попробовав этот пример, нарвался на ошибку (см. рисунок 5):

53


ПРО

№13 (апрель) 2011

граммист

ЛАБОРАТОРИЯ страница с заголовком, неочищенная, да еще не факт, что целиком (см. рисунок 7). Не

лучший

способ,

согласитесь.

Вроде

и

можно, но... Зубной щеткой пол мыть, короче

говоря. Да и IP передавать неудобно. Значит, этот способ загрузки тоже не очень подходит.

Рис. 5. Ошибка (неправильный адрес)

Тем более что эти компоненты уже успели

Эта ошибка происходит из-за того, что я в

свойство Address передаю имя сайта в www форме (см. рисунок 6). А

нужно

передавать

закомментировал).

IP

Если

в

коде

прописать

его

IP,

программа отработает, но, опять-таки, придет

устареть и сегодняшнее Дельфи предпочитает их держать про запас, но не в активе. Что же остается?

А давайте посмотрим, что нам предложит... WinAPI. Да-да. Именно она (или он, или оно?)

(API– программный интерфейс, значит он). Ведь

все

равно,

как

ни

крути,

все

Рис. 6. Пример работы ClientSocket

54

эти


ПРО

№13 (апрель) 2011

граммист

ЛАБОРАТОРИЯ

Рис. 7. Вот какая бяка пришла злосчастные

компоненты

сработала во всех языках. Сразу скажу, что

данном случае Windows). Ну, так, а что нам

живет в библиотеке Wininet.dll. Она есть во

используют

двуличные

функционал

операционки

мешает их использовать? Тем более ту же схему

функциями

операционки)

можно

провернуть на любом языке. На Си, Обероне, Яве... Будем надеяться, что и в C# есть свои классы,

которые

можно

попользовать

для

этого (как и в Яве, заявлена попытка на кроссплатформенность, поэтому с некоторой осторожностью).

вырисовывается

подобрать

закачки нужно,

задача

сайта,

чтоб

функционала

Виндовсах,

начиная

загрузчика

с

2000-го,

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

изучения

ее

функционала

можно

«забуриться» в MSDN [4] (к слову, одна из

самых неудобных и непонятных справок). Эта статьи, не думаю, что ее скоро отменят. Там

выяснить,

какие WinAPI функции помогут нам в решении проблемы

всех

костяк

страница существовала на момент выхода

Loading… 80% remained Сразу

основной

да

еще

одинаковая

так

их

схема

описан функционал для работы с Интернетом. Весьма

внушительная

библиотечка,

надо

сказать. Несмотря на все ее «разнообразие» нам понадобятся далеко не все функции, а только некоторые из них:

55


ПРО

№13 (апрель) 2011

граммист

ЛАБОРАТОРИЯ • InternetOpen

инициирует

работу

массива...

имя Агента НТТР протокола**. Фактически –

символов.

приложения с Интернетом. Здесь задается

это название нашего браузера. Туда можно впихнуть

название просто

любое

города,

набор

имя,

имя

любимого

символов

подружки,

киногероя,

ничего

не

означающих. В эту же функцию передается тип

соединения,

в

нашем

INTERNET_OPEN_TYPE_PRECONFIG, рый

заставляет

реестра

винды

функцию

базовые

случае

получать

котоиз

настройки

Интернета (если не ошибаюсь, речь идет о настройках

Internet

Explorer,

которые

считаются для Windows основными).

Либо же остальные флаги (читайте MSDN) с указанием

прокси-сервера.

Прикинемся

карандашами и будем считать, что проксисерверов у нас либо нет, либо в IE все настроено как надо; • Получив

хендл

сессии

предыдущей

функции, если он верный, можно открывать страницу.

За

InternetOpenURL,

это

ответит

которой

мы

функция

передадим

адрес сайта строкой. Остальные параметры

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

флага,

в

который

стоит-таки

подставить константу INTERNET_FLAG_

RELOAD, которая заставит винду считать

страницу с сервера по-любому. Страница-то,

байтов,

уместнее

символов...

все-таки Чем

и

байтов

или

займется

Думаю, ANSI

функция

InternetReadFile. Она чертовски похожа на аналог, работающий с файлами. Здесь тоже

нужно указать хендл (в нашем случае то, что

вернула

массив

байт.

InternetOpenURL), Куда

будет

буфер

считываться

поблочно страница. ПОБЛОЧНО. Что дает возможность считывание, ProgressBar,

контролировать

отображая

например.

ход

А

каждое

процесса

также

в

можно

парсить прямиком в ходе считывания, что уже, согласитесь, неплохо;

• Считали? Не забудем закрыть за собой файл, убрав мусор. Чем и займутся функция InternetCloseHandle для файла и для сессии.

Альтернатива этой схеме – функции из той же библиотеки

HttpOpenRequest,

HttpSend-

Request. Всего-то разницы, но они специально предназначены

для

работы

с

http.

Я

предлагаю так: в Дельфи мы воспользуемся функциями InternetOpenURL, а в Си – для разнообразия

HttpOpenRequest.

Какая

разница? Есть разница, но пока что в целом

значения этому придавать не будем. Все. Это основная схема загрузки. Чистый WinAPI без

«прибабахов»

и

жестоких

проделок

с

компонентами. Предлагаю, кстати, заметить на будущее***, как дело обстоит в C#.

может быть, уже кем-то считана на нашей

Loading… 70% remained

Нам это не с руки, потому заставим эту

Итак, думаю направление для движения у нас

машине и хранится у нас локально в КЭШе. страницу перечитаться, игнорируя КЭШ; • Соединение

открыто,

сессия

тоже.

Предыдущая функция дала хендл файла. Теперь можно с ним поступать точно так

же, как с обычными файлами в виндовсе: считывать

поблочно

в

переменную

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

в ботинки с названием Delphi. Наша задача сейчас

описать

класс,

способный

по

переданному ему URL загружать основной контент

наделить

WEB-

наш

страницы. класс,

Чем

чтоб

** Первоначально протокол HTTP разрабатывался для доступа к гипертекстовым документам Всемирной паутины. Поэтому основными реализациями клиентов являются браузеры (агенты пользователя). Популярные браузеры (в алфавитном порядке): Epiphany, Google Chrome, Internet Explorer, Konqueror, Mozilla Firefox, Opera, Safari.

же

стоит

загрузка

56


ПРО

№13 (апрель) 2011

граммист

ЛАБОРАТОРИЯ происходила максимально удобно? Прежде

всего, она должна быть надежной, ошибки

должны (вернее желательно) обрабатываться. Если сессия не открыта, если файла такого нет,

стоит

предупредить

человека,

что

возникло исключение, но не по-борландовски, не назойливо: окошко с сообщением о конце

микросовтовцы

не

наворачивали

этот

«механайз» тяжелым интерфейсом с кучей функционала. использовать

В

его

Дельфи VCL,

а

я

покажу,

точнее

как

класс

(потомок класса) TThread. В Си же можно поискать

аналогичный

набор

для

организации

сопроцессов

программа любит просто закрываться. Нет,

В

затравки

обрабатываться ошибка. Захочет программист

загрузки, а уж потом их тела. Взглянем на

мира, на котором поставлен белый крест в

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

– опишет обработчик, не захочет – получит по шапке и уронит свою репутацию. Но такую

возможность, сохранить свою репу, ему нужно дать.

Также

срабатывающее

стоит при

прикрутить

получении

событие,

очередной

порции контента. Парсер при этом может

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

предлагаю

изначально

избавить

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

котором загрузчик пусть и отрабатывает. Это придаст ему некой независимости. Скажите

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

солнцем? Я не видел таких браузеров. Может

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

уважающий привинтить

на

параллельность,

себя

представляемый

программист

механизм ему

каждый

старается

сопроцессор,

операционкой,

если

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

Поскольку

сопроцессы придется

стоит

писать

я

использую

учесть,

много

более

кода.

К

Windows, того

не

счастью,

(или

классов

доппотоков,

кому какой термин нравится больше). качестве

предлагаю

описать

сначала интерфейсы загрузчика и сопроцесса листинг:

THTTPLoader=class private // Сопроцесс загрузки LoaderThread:TThread; // Строки адреса и содержимого WEB страницы FURL,FContent: String; FOnDoneLoad: TNotifyEvent; FOnDownloadPortion: TNotifyEvent; FOnError: TNotifyEvent; function GetContent: String; procedure SetURL(const Value: String); procedure SetOnDoneLoad(const Value: TNotifyEvent); procedure SetOnDownloadPortion(const Value: TNotifyEvent); procedure SetOnError(const Value: TNotifyEvent); Public // Строки ошибки и порции очередной закачки ErrorString,Portion:String; // Для мобильности код ошибки ErrorCode:Integer; // и размер порции, скач-й на очер-й итерации загрузки PortionSize:Cardinal; Property Content:String read GetContent; Published Property URL:String read FURL write SetURL; // События, возникающие по окончанию загрузки Property OnDoneLoad:TNotifyEvent read FOnDoneLoad write SetOnDoneLoad;

*** Тут Микрософт тоже постарался позаботиться об удобстве загрузок. Если набрать в поисковике запрос «C# Закачка WEB страниц», то можно легко увидеть, что за все это безобразное шастанье по всемирной паутине в .NET отвечает пространство имен System.NET. Что ж. Давайте заглянем в его описание в MSDN, набрав в поиске MSDN'а эту фразу. Получим выход на страницу [5]. Ух, ты. Она на русском, это гут. По крайней мере, была на русском и в частности вообще была на момент написания статьи.

57


ПРО

№13 (апрель) 2011

граммист

ЛАБОРАТОРИЯ Loader

активно

Property OnDownloadPortion:TNotifyEvent read

его

средствами

описывается

типичный

URL

адреса

набор

Дельфи

свойства,

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

котором

инициироваться

пройдет

будет

загрузка

происходить

по

частям в цикле, каждая загруженная часть может

быть

обработана

OnDownloadPortion,

после

в

событии

чего

пойдет

загрузка следующей порции. Размер порции загрузчик определит сам. После окончания загрузки

сработает

событие

окончания

загрузки, дабы уведомить программу о том, что

весь

контент

предоставлен

в

ее

распоряжение. Естественно, загрузчик имеет

свойство, указывающее на объект сопроцесса LoaderThread,

класс

которого

описан

в

следующем листинге. Он достаточно прост, не содержит

ничего

лишнего.

Я

предлагаю

поместить его в коде после описания класса загрузчика.

Так

закачки

передавать

ему

(если

в

они

назначены

основной

программе).

это

свойство

как

THTTPLoader,

потому что я поместил этот класс выше,

end;

в

ходе

событий

описать

write SetOnError;

Загрузка

работодателя,

Обратите внимание – Дельфи позволило мне

Property OnError:TNotifyEvent read FOnError

страницы.

в

программистом

// при ошибке

сопроцесс,

своего

закачанные данные и вызывать обработчики

FOnDownloadPortion write SetOnDownloadPortion;

строки

знать

который этот сопроцесс вызывает, и будет

// по загрузке очередной порции

Стандартными

будет

будет

удобнее

приводить

типы, ведь основная работа все-таки придется на долю этого потока:

TThreal_Loader = class(TThread) private Loader:THTTPLoader; { Private declarations } protected procedure Execute; override; end;

Тут и описывать, собственно, нечего. Свойство

таким образом, поток видит его. Если бы я

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

этим классом в модуле, мне бы пришлось приводить типы. Например,

для

помещения

в

свойство

FContent мне бы пришлось писать что-то вроде THTTPLoader(Loader). FContent – в то время

как

сейчас

я

просто

напишу

Loader.FContent (поскольку тип Loader'a уже известен

компилятору

при

анализе

этой

части). Меньше букв писать – читабельнее

программа получается, хороший программист старается

это

учитывать

и

помещает

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

Выше всех класс, которому не обязательно работать классы, полями

с

полями

которые

других

классов,

интенсивно

вышестоящего

класса.

ниже

работают Жаль,

с

что

Дельфи (та и Паскаль), соблюдая строгость, не хотят находить тип класса в любом месте

программы, а смотрят только в начале перед

использованием типа. Ну да ладно, видимо, причины,

соблюдать

такую

строгость

у

разработчиков были. Как бы там ни было, сопроцесс знает своего работодателя в лицо и

преспокойненько с ним работает на «ты». Само

тело

хиленькое.

стероидами,

Мы

работодателя не

пусть

будет

будет

его

THTTPLoader накачивать

стройный

и

маленький. От него особых телодвижений не потребуется

он

выступает

в

роли

58


ПРО

№13 (апрель) 2011

граммист

ЛАБОРАТОРИЯ посредника:

полем, вдруг нашему «хилячку» понадобится сопроцесс

этот

свойства

Loader

знакомится

{ THTTPLoader }

с

«уволиться»

function THTTPLoader.GetContent: String;

контролировать),

загрузчиком,

задается

после

окончания

который

посредством

указание

загрузки

больше он не понадобится) и запускается

begin

машинка загрузки. Тут и начинается самое

Result:=FContent;

интересное:

end; procedure THTTPLoader.SetOnDoneLoad(const Value:

procedure TThreal_Loader.Execute;

TNotifyEvent);

var hSession,hFile:HINTERNET; s:string; Size,nbr:Cardinal;

begin

begin

FOnDoneLoad := Value;

inherited;

end;

Loader.FContent:=''; // Откроем сессию.

procedure THTTPLoader.SetOnDownloadPortion(const Value:

Loader.ErrorString:=''; Наш агент наз-ся

// красивым женским именем. :)

TNotifyEvent);

hSession := InternetOpen('Анютка',

begin

INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);

FOnDownloadPortion := Value;

// Если сессия открыта, хендл сесии создан

end;

if hSession<>nil then begin // Запросим c указанием всенепременно загр-ть с сервера

procedure THTTPLoader.SetOnError(const Value: TNotifyEvent);

hFile := InternetOpenURL(hSession, PChar(Loader.FURL),

begin

nil, 0,INTERNET_FLAG_RELOAD, 0);

FOnError := Value;

// Если запрос удался

end;

if hFile<>nil then begin // выясним сколько нужно памяти для первой порции

procedure THTTPLoader.SetURL(const Value: String);

InternetQueryDataAvailable(hFile,Size,0,0);

begin

// Если конечно сервер нас не пошлет, сказав,

FURL := Value;

// что порции не будет

LoaderThread:=TThreal_Loader.Create(true);

if Size<>0 then begin

with TThreal_Loader(LoaderThread) do begin

// Но пока он нам их отсыпает

Loader:=self;

while Size<>0 do begin

FreeOnTerminate:=true;

// мы с благодарностью протягиваем ладошки

Resume;

SetLength(s,Size);

end;

// и получаем очередную жменьку

end;

Собственно

if not InternetReadFile(hFile,@s[1],Size,nbr)

говоря,

его

сердце

также

печень, легкие и прочие органы) помещено в единственную обработчик

важную

свойства

URL

процедуру

SetURL.

Здесь

создается сопроцесс (на всякий случай я переменную

на

него

предлагаю

сделать

then break; // которую отдаем загрузчику на съедение со всей // кожурой, и размерами Loader.FContent:=Loader.FContent+s; Loader.Portion:=s; Loader.PortionSize:=nbr; // о чем уведомляем основную программу -

59


ПРО

№13 (апрель) 2011

граммист

ЛАБОРАТОРИЯ

// "Смотрите, а он семки хавает" if Assigned(Loader.FOnDownloadPortion) then Loader.FOnDownloadPortion(Loader); // не забыв о вежливости, приостанавливаемся на // некоторое время, чтоб не загружать процессор, // дав ему возможность поработать с другими // запущенными приложениями без напряга sleep(10); // После чего получаем размер очередной порции и // опять в ту же степь InternetQueryDataAvailable(hFile,Size,0,0); end; end else begin //Если Размер файла по каким то причинам нулевой Loader.ErrorString:='Запрашиваемый файл пуст'; Loader.ErrorCode:=1; if Assigned(Loader.FOnError) then Loader.FOnError(Loader); end; // в конце загрузки не забываем закрыть хендл... InternetCloseHandle(hFile); end else begin //Если файл не откр-ся сгенерируем ошибку для обр-тки Loader.ErrorString:='Не могу открыть файл'; Loader.ErrorCode:=2; if Assigned(Loader.FOnError) then Loader.FOnError(Loader); end; // ...и освободить сессию InternetCloseHandle(hSession); end else begin // Если сессия не откр-я сгенерируем ошибку для обр-тки Loader.ErrorString:='Не могу открыть сессию'; Loader.ErrorCode:=3; if Assigned(Loader.FOnError) then Loader.FOnError(Loader); end; // и по джентльменски уведомим прогр-у об оконч.загрузки if Assigned(Loader.FOnDoneLoad) then Loader.FOnDoneLoad(Loader); end;

Обратите

внимание:

функции

считывания

функции

получения

контента из Интернета жутко смахивают на Интернет

это

та

файла.

же

сеть,

Для с

винды

теми

же

файлами. А адреса порталов – «расшарки», с которых можно что-то скачать, скопировать.

Так что принципы везде одни и те же, не

нужно что-то новое отличное от привычного изучать. Это хорошо, зачет Микрософту за это,

могли

ведь

написать

страшилище, но не скопировали.

какое-нибудь

Можно еще обратить внимание, что я не все ошибки

(не

на

каждую

функцию)

обрабатываю. Впрочем для минимума такой бдительности думаю хватит. Надеюсь всем понятно,

что

стоящим

решением

будет

выделить его в отдельный модуль? Если нет, то рекомендую именно это. Для каждого свой

«Хаус».

На данном этапе появляется возможность

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

которую можно поместить, скажем, Мемо. И кнопку, по жмаку которой будет загружаться

страница. Это основы Дельфи, я не буду

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

дизайнере. Тут же я уточню, что модуль с загрузчиком подключим в раздел uses и для

формы создадим свойство-переменную private l:THTTPLoader.

Надеюсь, никого не смущает, что я поместил переменную загрузчика в приватную секцию формы?

Он-то

и

нужен

только

форме,

в

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

60


ПРО

№13 (апрель) 2011

граммист

ЛАБОРАТОРИЯ важно (сейчас) куда его поместить. Пусть

будет в приватной комнате. Теперь на форму

кинем Мемо, растянем его на все форму, выставим (для красоты) полосы прокрутки и кнопку. Куда-нибудь в угол. Можно меню вместо кнопки. кнопки

В любом случае по клику

(или

менюшки)

нужно

будет

выполнять процесс загрузки. Но для начала не забудем корректно создать и освободить компонент:

procedure TForm1.OnPortion(Sender: TObject); begin Memo1.Lines.Add('Загружено'+ IntToStr(THTTPLoader(sender).PortionSize)); end; procedure TForm1.OnTerm(Sender: TObject); begin Memo1.Lines.Add(THTTPLoader(sender).Content); end;

procedure TForm1.FormCreate(Sender: TObject); begin

procedure TForm1.OnError(Sender: TObject);

l:=THTTPLoader.Create;

begin

l.OnDoneLoad:=OnTerm;

Caption:=THTTPLoader(sender).ErrorString;

l.OnDownloadPortion:=OnPortion;

end;

l.OnError:=OnError; end;

Не будем особо оригинальничать:

procedure TForm1.FormDestroy(Sender: TObject);

• OnPortion

переменка и

с

Загрузчику

загрузчика,

формой

указываем

же

ее

создаем

с

освобождаем.

обработчики

его

событий. В них отразим ход, так сказать, загрузки.

для

каждой

• OnTerm – обработчик окончания загрузки.

end;

формой

обработчик

отражать статистику загрузки;

l.Free;

L

загруженной порции. Заставим его в Мемо

begin

И саму соль

«напряг» загрузчика:

– клик кнопки

и

Здесь

просто

впишем

в

полученный контент страницы;

Мемо

весь

• OnError – сработает если произойдет какаято

ошибка.

произойдет.

Будем

надеяться,

что

не

Теперь все счастье у нас в руках, и можно выпускать его на волю. Жмем F9 и кнопку (см.

procedure TForm1.Button1Click(Sender: TObject);

рисунок

8).

Э-э-э...

Что

случилось?

Ошибка! Хотя так даже лучше – проверили,

begin

что работает обработчик ошибок (видите в

L.URL:='http://www.programmersforum.ru';

заголовке

end;

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

«чесать

формы

репу»...

устраивать...

сообщение?).

Лезть

в

код...

Придется

Пошаговку

простоты полагаться на автоматику портала –

Стоп! Ведь это могут быть последствия работы

демонстрации

на

получать

страницу

по

умолчанию.

возможностей

этого

Для

хватит.

Чтобы окончательно ничего не забыть опишем обработчики событий загрузчика:

файрволла? А ну-ка пообщаемся с «файером» предмет

пропустить

Интернет (см. рисунок 9).

наше

детище

61

в


ПРО

№13 (апрель) 2011

граммист

ЛАБОРАТОРИЯ

Рис. 8. Работа программы Во! То, что надо. В работе с Интернетом

скажем, новую версию Дельфи. Это хорошо.

Обратите

на то, что я писал программу на D6 (D2001)

правила файрволла учитывать обязательно. статистика

внимание о

том,

в

какие

Мемо

прошла

порции

были

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

сама

страница

расположилась в Мемо.

во

всей

ее

наготе

На данный момент можно сказать, что Дельфи между

удалось

прочим

осуществить малой

загрузчик,

кровью.

в

и

на

масштабируемость

она вполне откомпилируется в последующих версиях.

Ах да... Я не указал, какую версию Дельфи будем

использовать.

проекта

в

будущем, если понадобится перенести его на,

Будет

лучше,

если

проект вообще не будет зависеть от версий.

Без

зависимости от компонентов, что уже дает надежду

Это плюс, и достаточно ощутимый. Несмотря

Продолжение следует… The Чтиво • Project Ararat Synapse

http://synapse.ararat.cz/doku.php

• Блог о программировании парсеров

http://parsing-andi.blogspot.com/2010/02/ synapse-in-delphi-first-steps.html

• E.J.Molendijk. Как получить страницу с вебсервера

поместить

при

ее

помощи

в

TClientSocket

строковую

и

переменную

http://www.disketa.info/page.asp?page=doc&i dd=1233&raz=3

• WinINet Functions

http://msdn.microsoft.com/ru-ru/library/

aa385473%28v=VS.85%29.aspx

• System.Net - пространство имен Рис. 9. Совсем другое «тело»

http://msdn.microsoft.com/ru-ru/library/ btdf6a7e.aspx

62


ПРО

№13 (апрель) 2011

граммист

http://tigor.org.ua

Игорь Теслюк

ЛАБОРАТОРИЯ

ЗАПУСКАЕМ AHCI

С выходом операционных систем Windows Vista и Windows Seven появилась возможность использовать режим AHCI для жестких дисков. Что же такого замечательного в этих четырех буквах? AHCI позволяет активировать многие функции Serial ATA, которые недоступны в режиме совместимости с морально устаревшим Parallel ATA.

Включение AHCI вызывает BSOD

NCQ

Если во время установки Windows у вас был

Native

жестких дисков, то, выбрав в BIOS режим

контроллеру жесткого диска самому выбирать

выбран

режим

совместимости

с

IDE

для

AHCI, вы получите Синий экран смерти (Blue Screen Of Death) во время загрузки системы

«0x7B

Blue

Screen

of

Death

STOP»

(INACCESSIBLE_BOOT_DEVICE). Это вызвано тем,

что

во

время

установки

Windows

Command

установка

Queuing

очередности

команд.

аппаратная

Позволяет

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

Принцип

довольно простой: загрузка данных в том

порядке, в котором они записаны на диск, а не в том, как они поступили в очередь.

определяет оборудование и загружает только

Чтобы представить плюсы и минусы этой

проблему нужно активировать драйвер AHCI:

диск

необходимые драйверы. Чтобы решить эту <regedit.exe> (Пуск → • запускаем Выполнить → regedit) и переходим в ветку HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/Msahci

• выбираем параметр Start и присваиваем ему значение 0; компьютер • перезагружаем выставляем режим AHCI.

и

в

технологии,

можно

круглой

рассмотрим

представить

дороги,

транспорт

перемещается

по

(головка по

пример. в

которой

виде

длинной

ездит

жесткого

магнитным

Жесткий некий

диска

пластинам).

Команды, которые выполняет жесткий диск, это люди, которые «голосуют» на дороге (см. рисунок):

BIOS

Преимущества использования AHCI* Включая AHCI, вы получите доступ к более современным

технологиям,

главное,

чтобы

производитель добавил их в свое устройство. Например,

не

все

жесткие

диски

SATA

первого поколения были оборудованы NCQ.

* AHCI протокол был разработан специальной инициативной группой во главе с Intel. Он является дополнением к стандарту Serial ATA, который, в общем-то, не описывает требования к хост-контроллерам (контроллерам со стороны вычислительной системы, к которой подключен винчестер).

Рисунок. Упрощенное представление жесткого диска

63


ПРО

№13 (апрель) 2011

граммист

ЛАБОРАТОРИЯ А

теперь

в

качестве

транспорта

выберем

подключенными устройствами.

единственный

человек,

Staggered Spin-Up

такси. В определенный момент времени там может

находиться

все

остальные

которого везут по месту назначения. В итоге высвобождения максимизирует команды,

ресурса.

скорость

но

падает.

вынуждены

общего

общая

ждать

Поочередный запуск дисков. Жесткий диск

Это

потребляет наибольшую мощность в процессе

выполнения

раскрутки пластин.

производительность

Если

питания

(NCQ), то в процессе работы в нем могут несколько

человек,

в

но,

в

целом,

пропускная способность всей системы выше.

замена.

Термин

выдержать

суммарной

разные

времени,

уменьшая

моменты

Поддержка контроллеров

если она и была реализована аппаратно, то

обозначает

возможность подключать-отключать оборудов

не

контроллерах реализована поддержка AHCI. А

Горячая

выключать

может

Это вещь очень специфическая. Не во всех

Hot Swap

вание

установлено

пиковую мощность при запуске компьютера.

каждого конкретного человека такой способ медленнее,

компьютере

нагрузки. С этой технологией диски стартуют

которые

входят и выходят в нужных им местах. Для путешествия

вашем

несколько жестких дисков, то слабый блок

Если мы пустим на дорогу маршрутное такси перемещаться

в

компьютере,

применяется производить

без

питание. в

необходимости

Технология

серверах,

замену

когда

сломанного

давно

производитель мог не добавить эту функцию в BIOS.

Детальней

это

можно

изучить

руководстве по эксплуатации либо поискав нужный пункт в BIOS.

нужно

оборудо-

вания без ущерба для работоспособности.

Поддержка Windows Нормальная

В домашних условиях эта технология также

реализована

актуальна. Если у вас есть внешний жесткий

поддержка**

только

в

AHCI

последних

была

версиях

Windows. Windows XP и более ранние требуют

диск или карман для жесткого диска, то вы

дополнительных

без проблем сможете отключать их прямо в

драйверов

во

время

установки, иначе установщик выдаст ошибку

процессе работы.

об отсутствии жестких дисков на компьютере.

Port Multiplier

Ресурсы

В интерфейсе PATA можно было подключить

• AHCI Specification http://www.intel.com/

В SATA реализована технология подключения

• Вики о AHCI http://ru.wikipedia.org/wiki/

Реализация

• Драйверы Intel Matrix Storage

только 2 устройства на канал (Master и Slave). до

15-ти

устройств

к

одному

похожа

на

USB-Hub.

канала

делится

каналу.

Правда,

придется мириться с тем, что пропускная способность

между

всеми

** Винчестер в данном случае не затрагивается форматировать, перешивать и т.п., ничего не нужно.

в

technology/serialata/ahci.htm

Advanced_Host_Controller_Interface http://downloadcenter.intel.com

• Персональный блог автора http://tigor.org.ua -

64


ПРО

№13 (апрель) 2011

граммист

Владимир Яковлев

http://avrall.com.ua

ЛАБОРАТОРИЯ

ЦИФРОВОЙ НЕРЕКУРСИВНЫЙ ФИЛЬТР НА МИКРОКОНТРОЛЛЕРЕ

В данной статье рассмотрен алгоритм работы КИХ-фильтра и метод упрощенного вычисления промежуточных значений. Следует отметить, что минус проекта в том, что опрос АЦП в микроконтроллере (МК) реализован в ручном, а не автоматическом режиме (лень было настраивать таймеры), вследствие чего частота дискретизации фильтруемого сигнала будет «плавать», так как запуск АЦП происходит только после предыдущего вычисления выходного значения Y(n). Да, и чтобы не вникать в глубины теории фильтрации, скажу, что я не сидел и не вычислял ничего. Я просто нашел готовую формулу и табличные значения для треугольного окна и реализовал математическую обработку полученных данных на МК.

Введение

Типы фильтров

Задача – реализовать на микроконтроллере

Выделяют три основных группы частотных

цифровой нерекурсивный* фильтр:

фильтров:

ФНЧ

(пропускание

фильтры

низких,

низких

подавление

частот

высоких

частот во входном сигнале), ФВЧ – фильтры высоких

частот

(пропускание

высоких,

подавление низких частот) и ПФ – полосовые

фильтры (пропускание определенных частот с подавлением Входные значения поданы с 8-битного АЦП (количество

отсчетов

выводится на ЦАП.

16),

а

результат

Вдаваться в теорию подробно не буду, она хорошо расписана в литературе [1...3]. К наиболее

цифровых

известным

фильтров

типам

нерекурсивных

(НЦФ)

относятся

остальных

частот

сигнала).

режекторные

фильтры,

Среди последних в отдельную группу иногда выделяют

РФ

понимая под ними фильтры с подавлением

узкой полосы частот во входном сигнале, и СФ – селекторные фильтры, обратные РФ. Схематические

частотные

характеристики

фильтров приведены на рисунках 1-3:

частотные фильтры (КИХ, FIR), для которых

имеет место такое выражение (cм. формулу 1):

; (1)

Где:

bk

отсчеты.

коэффициенты

фильтра,

Xn

Рис. 1. Фильтр низких частот

* Нерекурсивные фильтры реализуют алгоритм свертки двух функций: yk = hn * xk-n, где xk – массив входных данных фильтра, hn – оператор (импульсный отклик) фильтра, k и n – нумерация числовых значений массива данных и числовых значений коэффициентов фильтра, k = 0,1,2, … ,K; n = 0,1,2, … ,N; K ≥ N. Значения выходных отсчетов свертки yk для любого аргумента k определяются текущим и «прошлыми» (до k-N) значениями входных отсчетов. Такой фильтр называется нерекурсивным цифровым фильтром (НЦФ).

65


ПРО

№13 (апрель) 2011

граммист

ЛАБОРАТОРИЯ

b7 =0.875 b8 =1 b9 = 0.875 b10 =0.75 b11 =0.625 b12 =0.5 b13 =0.375 b14 =0.25

Рис. 2. Фильтр высоких частот

b15 =0.125 b16=0

Имеем

кучу

дробных

неудобно работать.

чисел,

с

которыми

Чтобы меньше мучиться с данными дробными

коэффициентами, переведем их в неправильные дроби. Получим: b1 =0.125 =1/8

Рис. 3. Полосовой фильтр

b2 =0.25 =2/8 =1/4

Между частотными интервалами пропускания и

подавления

которая

сигнала

называется

проектирования

существует

переходной.

нерекурсивных

зона,

Практика

цифровых

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

низких частот соответствующим преобразованием. Более подробно в [3, 4].

b2 =0.25 b3 =0.375 b4 =0.5 b5 =0.625 b6 =0.75

=4/8 =1/2

b5 =0.625 =5/8 b6 =0.75 =6/8 =3/4 b7 =0.875 =7/8 b8 =1 =8/8 b9 = 0.875 =7/8 b10 =0.75 =6/8 =3/4 b11 =0.625 =5/8 b12 =0.5 =4/8 =1/2 b14 =0.25 =2/8 =1/4

значения

коэффициентов

треугольного окна будут следующими: b1 =0.125

b4 =0.5

b13 =0.375 =3/8

Практика Табличные

b3 =0.375 =3/8

для

b15 =0.125 =1/8 b16=0

Таким

образом,

наш

МК

будет

работать

только с целыми числами. Для этого значение

отсчета необходимо вначале умножить на числитель и разделить на знаменатель.

Операция умножения двух 8-разрядных чисел давно описана

на различных ресурсах. Вот

66


ПРО

№13 (апрель) 2011

граммист

ЛАБОРАТОРИЯ

Рис. 4. Общий алгоритм работы КИХ-фильтра один из наиболее интересных [5, 6] (мануал AVR200 и исходник к нему). А

деление,

значения,

как

кратные

видно,

происходит

степени

двойки,

на

т.е.

Рис. 5. Алгоритм вычисления выходного на

рисунке

значения Y(n) 4. Алгоритм

вычисления

выходного значения отклика КИХ фильтра Y(n) показан на рисунке 5. Заключение

реализовать деление можно простым сдвигом

Исходя из представленного алгоритма, была

алгоритм работы данного устройства показан

фирмы Атмел. Был задействован внутренний

вправо, на нужное количество раз. Основной

** Обратите внимание: данный МК имеет функцию аппаратного умножения, но для сохранения универсальности, применено - программное.

написана

программа

для

МК**

ATmega8

67


ПРО

№13 (апрель) 2011

граммист

ЛАБОРАТОРИЯ аналого-цифровой

преобразователь

микро-

Перевод

контроллера (порт PC0), PortB – младший

приложены

проекта в

журналом.

FIR

архиве

с

комментариями

непосредственно

с

редакцией

А.Антонью. Цифровые фильтры. Анализ и проектирование. – М.: Радио и связь, 1983

• Р.Хемминг. Цифровые фильтры. Перевод с английского

• R.Hamming,

В.Ермишина.

издания

(Digital

Prentice-hall. Под

Inc.

редакцией

А.Трахтмана. – М.: Сов.радио, 1980

Ресурсы

Filters, 1977)

проф.

AVR200: Процедура умножения и деления

У.Кестер.

Аналого-цифровое

преобразова-

• ние. (Analog-Digital Conversion). Редактор оригинального Перевод

под

электроники

ЦАП. При расчетах было использовано два Исходники

английского

А.Власенко. – М.: Техносфера, 2010. – Мир

байт, PortD – старший байт значения Y(n) на массива данных: числители и знаменатели.

с

с

издания

английского

Уолт

под

Кестер.

редакцией

Е.Володина. – М.: Техносфера, 2007. – Мир электроники

У.Кестер. Проектирование систем цифровой

• и смешанной обработки сигналов. Редактор оригинального

издания

Уолт

Кестер.

http://www.gaw.ru/pdf/Atmel/app/avr/AVR-

• 200.pdf

Исходники к AVR200

http://www.gaw.ru/data/Atmel/avr/AVR200.zip

• Ресурс

организации

Electronic

Foundation https://www.eff.org

Frontier

• Ресурс автора http://avrall.com.ua •

68


ПРО

№13 (апрель) 2011

граммист

ЮМОР

Лежат два программиста на берегу моря. Один другому: Смотри какие облака. Другой: Да это они умеют!

Кошка – это тоже самое, что и кот, только без архитектурных излишеств.

другой завод (благо их тогда в Киеве было валом) и запускал тетрадку по новому кругу. Из разговора:

– Сижу я в Нортоне. Слева у меня диск С. Справа у меня диск С. Я думаю, зачем мне два диска С? Ну, я один диски стер.

C казус-форума...

Еще в техникуме (80-е), на практике на заводе

Сообщение об ошибке:

показали одного кадра - пришел на завод, через

"Out of paper on drive C:".

раз в неделю или в две писать рацухи и

Надпись на могиле пpогpаммеpа:

тетрадка кончалась (3-5 лет) кадр переходил на

Пpичина pождения – GPF at: 18:12:97

полтора месяца достал общую тетрадку и начал получать

за

это

вознаграждения.

Когда

Пpичина смеpти – Run-time error at 18:12:97

69


ПРО

№13 (апрель) 2011

граммист

ЮМОР Заповеди программиста

означает "Format drive C: completed"?

• чти операционную систему свою и не хай ее

Программист

разработчиков, ибо им и без тебя икается (а то и сам таким станешь);

• если у тебя хакер украл файл, пошли ему еще

два по e-mail (в твоем каталоге сроду ничего путного не водилось, а мелкий спам душу согреет);

• если тебя друзья величают хакером, знай, ламер ты, ибо настоящего хакера не видно, не слышно и нет у него никаких друзей кроме компьютера;

• не укради программы чужой (да и зачем тебе

чужие баги, если ты от своих не знаешь, как

заходит

поздно

вечером

подъезд своего дома. А там лампочка снова разбита, темнота, шорохи подозрительные. Он огляделся

по

сторонам

и

проворчал:

кажется, нужно было засэйвиться...».

«Да,

Заходит учитель информатики в класс за пять минут до начала урока. Смотрит – все ученики

уже

сидят

за

машинами,

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

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

избавиться?); • если

жена

конфликтует

с

компьютером,

брось жену, ибо компьютер кормит тебя, удовлетворяет и развлекает лучше (а жену можно подобрать новую, побродив по сайтам знакомств);

• возлюби

ближнего

своего,

но

в

через

Интернет, ибо СПИДом от этого еще никто не заражался;

• лучше компьютера может быть только пиво, но одно другому не мешает.

Перевод сообщения «Abort, Retry, Ignore»:

«Попытку аборта игнорировать».

Домашняя идиллия в семье программиста.

Папа смотрит телевизор. Сынишка выходит изза компьютера и спрашивает: – Папа, а что

70

PROgrammist, №13  

Official editorial layout

Read more
Read more
Similar to
Popular now
Just for you