ПРО
граммист
СОДЕРЖАНИЕ
№14 (май) 2011
Издается с марта 2010. Выходит ежемесячно №14, май 2011 г.
Редакция: Выпускающий редактор Сергей Бадло Литературный редактор Utkin Редакторы JTG, Василий Мединцев, Алексей Шишкин, Алексей Шульга, Natali-Ka, Егор Горохов Редактор-корректор Ян Липлавский
Дизайн и верстка:
Виталий Желтяков, Олег Резников, Сергей Бадло
Авторский состав:
Алексей Шишкин, Владимир Перминов, Виталий Белик, Виталий Желтяков, Евгений aka kill17, Сергей Бадло
Официальный сайт журнала:
www.procoder.info
Контакты:
Авторские статьи направляйте на maindatacentr@gmail.com Вопросы и предложения для редакции reddatacentr@gmail.com Вопросы и предложения администратору info@procoder.info
СЛОВО РЕДАКТОРА
Новости по проекту ............................................. с.3 НЕВЕРОЯТНО, НО ФАКТ
Любопытные факты ............................................... с.4
VIP ПЕРСОНА
Интервью с Александром Яковлевичем Капланом .................... с.8
ЗЕЛЕНЫЕ ТЕХНОЛОГИИ
Экологичный офис: и себе и природе. Часть 1 .................... с.13 АЛГОРИТМЫ
Поиск пути волновым алгоритмом ................................. с.16
Русская рулетка или взгляд математиков ......................... с.21 WEB ТЕХНОЛОГИИ
cURL. Первое знакомство ........................................ с.24 ЛАБОРАТОРИЯ
Смотка одометра BMW ............................................ с.28
HTML нараспашку. Часть 2 ....................................... с.32 ЮМОР
Чего только не бывает .......................................... с.42
Информационная поддержка:
Международная Академия Информатизации (МАИН) РК 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
Примечание:
Издание некоммерческое. Все материалы, товарные знаки, торговые марки и логотипы, упомянутые в журнале, принадлежат их владельцам. Статьи, поступающие в редакцию, рецензируются. Мнение авторов не всегда совпадает с мнением редакции. Перепечатка материалов журнала и использование их в любой форме, в том числе в электронных СМИ, возможны только с разрешения редакции. Тираж неограничен. Формат A4, 44 стр.
Идея создания журнала:
Алексей Шульга
Обложка номера:
Дизайн Алексея Шишкина, Николая Григорьева, Яна Липлавского
Архив номеров журнала!
ПРО
№14 (май) 2011
граммист
СЛОВО РЕДАКТОРА Сергей Бадло
http://procoder.info
НОВОСТИ ПО ПРОЕКТУ*...
Доброго времени суток, уважаемые читатели. Текущий номер журнала сверстан совместно с Виталием Желтяковым и Олегом Резниковым. Были шероховатости, но мы их победили. В дальнейшем, мне придется отойти от верстки: к сожалению, задержки по зарплате на работе вынуждают брать все больше и больше коммерческих заказов и дополнительных проектов... Ну, хватит о грустном, прорвемся...
Общие требования к материалам
В этом выпуске... Рубрика
«VIP
персона».
У
нас
в
гостях
заведующий лаборатории нейрофизиологии и
У
нас
нет
категоричных
нейро-компьютерных интерфейсов на биофаке
верстки
тель ННКИ и проектов по ИМК в МГУ, доктор
желательный минимум:
в МГУ имени Ломоносова, научный руководи-
биологических наук, профессор, Александр
Яковлевич Каплан. Читаем интервью.
требований
к
«SCRIBUS»
и
оформлению, но в связи с особенностями в
свободном
ПО
облегчения труда редакторов, есть некоторый • статья
должна
иметь
выраженную
структуру и содержать название статьи,
Обратите внимание, в журнале дебютирует
сведения об авторах, экскурс, информацию
будет
и/или практическую часть, заключение и
рубрика
«Зеленые
наш
технологии».
постоянный
автор,
редактор – Алексей Шишкин.
а
Вести
ныне
ее
и
А знаете-ли вы, что автотрассировка печатных
плат сводится к задаче поиска кратчайшего
о
средствах
разработки,
теоретическую
ресурсы к статье;
• текст статьи в формате OpenOffice, MS Word, VK WordPad или обычным текстовым файлом, шрифт Arial 10;
пути в графе? Похожая тема уже поднималась
• все
пути». Пора познакомиться с альтернативным
• рисунки к статье должны прилагаться в
нашим редактором Utkin-ным в статье «Поиск решением на основе волнового алгоритма от Виталия
Желтякова.
«Алгоритмы»
мы
Также
побеседуем
в
о
рубрике шансах
выигрыша в рулетке с Алексеем Шишкиным. В
рубрике
«WEB
технологии»
дебютирует
Владимир Перминов со статьей о практике
использования библиотеки cURL.
Наверняка многим автомобилистам придется
по душе рецепт смотки одометра от Евгения
aka kill17. Читаем рубрику «Лаборатория». И конечно-же, не обойдет вниманием Виталий Белик с нашим ответом «гуглехрому».
* Лучшим авторам и победителям конкурсов, а также желающим оставить себе памятный подарок о проекте, будет предоставлена возможность получить и/или заказать кружки, коврики и футболки с символикой журнала. Подробности см. на форуме журнала http://forum.procoder.info.
рисунки,
таблицы
должны
быть
подписаны и иметь упоминание в тексте;
виде отдельных файлов в формате PNG,
TIF;
• для
снятия
скриншотов
рекомендуем
использовать freeware программу G.A.P;
• разделы статьи отделять двумя <ENTER>;
• электронный адрес для корреспонденции maindatacentr@gmail.com.
По присланным материалам автор получает
рецензию и корректирует статью согласно
замечаниям. Шаблон для написания статьи можно взять тут.
С уважением,
выпускающий редактор, член-корреспондент МАИН
3
ПРО
№14 (май) 2011
граммист
Сергей Бадло
http://procoder.info
НЕВЕРОЯТНО, НО ФАКТ
ЛЮБОПЫТНЫЕ ФАКТЫ
Знаете-ли вы, что фирма Murata выпускает керамические резонаторы в SMD исполнении со встроенными конденсаторами? К примеру, CSTCE16M0V53-R0 резонатор (см. схему включения ниже) является типичным представителем данных компонентов. Обозначены они аббревиатурой CERALOCK. Вы конечно можете сказать: что тут нового? Ведь уже давно применяются SMD кварцевые интегральные генераторы, те же KXO от Geyer Electronic*. Верно, однако и цена их не на уровне пассивных элементов. Вот уж действительно подарок разработчикам и экономия места на плате.
необходимых для работы с разрешениями 1080p (30 кадров в секунду) и 720p (60 кадров
в
секунду).
Без
аппаратного
ускорения
современный многоядерный CPU мобильного устройства способен обеспечить для высоких
разрешений
лишь
кодирование
c
произво-
дительностью 25 кадров в секунду. Кроме
того, использование аппаратной поддержки
позволяет значительно снизить потребление
энергии во время декодирования и кодирования VP8. Так как весь процесс кодирования
вынесен
в
специальный
аппаратный
блок
SOC-чипов, в процессе работы с VP8 нагрузка
на основной CPU почти не заметна. Выложен
видеокодека
исходный
код
аппаратного
WebM/VP8,
позволяющего
производителям чипов интегрировать аппа-
ратную
поддержку
VP8
в
свои
продукты.
Несколько ключевых производителей микро-
схем,
чьи
производстве
продукты
используются
мобильных
устройств,
при
теле-
приставок, медиаплееров, нетбуков и web-
камер,
проекта
уже в
начали
свои
процесс
чипсеты
и
интеграции
планируют
выпустить первые чипы уже в нынешнем году.
Все
подготовленные
схемы
доступны
в
форматах VHDL/Verilog и распространяются в
Протокол ICQ открыли для альтернативных
клиентов. Условия использования прописаны
в новой редакции лицензионного соглашения, которая
была
опубликована
Mail.ru
Group,
10
апреля.
свободно
исполь-
Протокол ICQ, являющийся собственностью сможет
зоваться некоммерческими сервисами. Также разработчиков
альтернативных
клиентов просят не рассылать с помощью протокола спам и не
«выгружать» информацию из баз данных и каталогов сервиса.
рамках лицензии, не требующей от произ-
Первый пластиковый процессор создали
открыты
технологий IMEC, а также компании Polymer
водителей оплаты отчислений. Одновременно исходные
тексты
драйверов,
* В ресурсы с журналом включены спецификации упомянутых SMD генераторов и кварцевых резонаторов.
специалисты
бельгийского
центра
нано-
4
ПРО
№14 (май) 2011
граммист
НЕВЕРОЯТНО, НО ФАКТ Диего
(UCSD).
Процесс
получения
клеток
сердечной мышцы занимает всего 11-12 дней, что позволяет быстро вырастить ткань для
трансплантации. Технология в целом очень
напоминает
ту,
клеток
cells),
создания Ученые
что
используется
индуцированных
(iPS
но
для
плюрипотентных
обходится
без
них.
не стали возвращать фибробласты в
эмбриональное
состояние,
уйти
Они
а
затем
выра-
щивать из них клетки сердца (на это могли недели).
функции четыре
напрямую.
решили
В
этом
транскрипционных
переключить им
помогли
фактора:
Oct4,
Sox2, Klf4 и c-Myc. В результате нужные
клетки были получены в течение 5-6 дней. Ранее генетикам удавалось переделать кожу в
Vision и исследовательской организации TNO
нервную ткань, а клетки сердечной мышцы
собой
клеток. Пока технология опробована только
из
Нидерландов.
гнущуюся
толщиной
всего
Процессор
25
представляет
прозрачную микрон
пленку
с
рисунком
получали лишь из эмбриональных стволовых на мышах, генетически не столь уж близких
проводящих золотых дорожек. Поверх нее
человеку. Но, если прямое перепрограмми-
далее идет еще один изолирующий полимер и
выращивать искусственное сердце из кожи
нанесен тонкий слой золотых электродов, а слой транзисторов. Последние сделаны из
пентацена – органического полупроводника.
Рисунок из транзисторов и их подключение в нужных
точках
фотолитографии.
обеспечивались В
нем
не
методами
используется
кремний. Так что подобный чип может быть в
рование, получит развитие, то медики смогут
пациента. Биологи также получат материал для изучения генетических основ пороков
развития.
статье,
Подробности
вышедшей
в
новой
журнале
работы
Nature
кремниевым собратьям в производительности,
зато легок, гибок и дешев. Чип содержит тысячи
транзисторов
и
может
выполнять лишь одну простенькую программу
из 16-ти инструкций. При этом он работает с восьмибитными
числами,
а
его
частота составляет всего шесть герц.
в
Cell
Biology и в пресс-релизе института Скриппса.
10 раз дешевле обычного. Он сильно уступает
четыре
–
тактовая
Клетки кожи конвертировали напрямую в
клетки сердца. Новый метод перепрограмми-
рования разработали ученые исследователь-
ского института Скриппса (Scripps Research
Institute) и университета Калифорнии в Сан-
5
ПРО
№14 (май) 2011
граммист
НЕВЕРОЯТНО, НО ФАКТ
Прозрачный
сенсорный
ЖК-дисплей,
Специалисты французской компании Wysips
питающийся светом, представила компания
разработали прозрачную фотогальваническую
дисплей заработал, это обеспечить его светом.
телефона – с ее помощью «экранная» батарея
Samsung. Все, что вам нужно сделать, чтобы
пленку,
которая
наклеивается
на
экран
Солнечные батареи питаются не только от
начинает заряжаться от солнца. Покрытие
искусственного света. Поскольку устройство
прозрачность
самого
светила,
но
и
от
источников
сконструировано так, чтобы потреблять мини-
мум энергии, солнечных панелей оказывается вполне достаточно для нормальной работы
дисплея. Соответственно, никаких проводов! Представленный
на
энергии,
поддерживает
дисплей
не
но
только
и
выставке
работает
CeBIT на
имеет
два
важнейших и
свойства:
достаточно
хорошую высокое
напряжение на уровне 1.6 вольт. В среднем
процесс
полной
подзарядки
под
прямыми
солнечными лучами занимает шесть часов, в
2011,
чистой
полное
HD-
разрешение (1920 x 1080 точек), а также
использует
панель
мультисенсорную
распознает
нажатий.
Солнечная
панель
до
в...
10
технологию:
одновременных
экране
телефона.
.
6
ПРО
№14 (май) 2011
граммист
НЕВЕРОЯТНО, НО ФАКТ помещении, дольше.
разумеется,
Второе
придется
поколение
этой
ждать
пленки,
которое должно появиться в следующем году,
будет заряжать такие батареи всего за 30-60
минут. Главное, что во время перезарядки не
нужно
подключать
нужно
прекращать
никакие провода и не
пользоваться телефоном.
Пленка
микрон
не
ности
3D-экрана.
на
даже
Инженеры
научи-
бильники...
водой.
лись
заряжать
Точнее дой
сказать,
следует
токийского
университета
при
департаменте
информации и вычислительной физики Ishikawa Komuro. В ее
основе лежит система трехмерного слежения с использованием
детектор. Особенностью является то, что не требуется камера
сложных и простых предметов, так и нарисованных на плоскости,
опираясь лишь на разницу в цвете. Применение данной технологии
довольно обширно: к примеру, можно сканировать чертежи и
получать
их
увеличенные
изображения
в
реальном
построить интерактивную игру или охранную систему.
времени,
ной
чистой.
Стоит только залить
столовую ложку жид-
кости в отверстие в картридже
вить
и
вста-
картридж
в
устройство, как аппа-
рат начнет вырабаты-
вать ток. PowerTrekk содержит
бу-
литиево-
батарею
при
напряжении 3.7 воль-
во-
та),
энергию
ного
собирающую от
топлив-
элемента
и
отдающую внешнему
устройству,
перенос-
щемуся
в
в
нуждаюзарядке.
Батарею эту можно
подзаряжать
ночью, поскольку не от
слишком
ампер-часов
чистом поле днем и зависит
том
(емкость 1600 милли-
мо-
заправ-
электроники
в
числе соленой и не
ионную
энергию
любой
любой,
также
во, которое способно для
быть
ферную
лять новое устройстпоставлять
работы
выдает H2 при реакции с водой. Она может
Технология «прикрепленного света» (Sticky Light) разработана в
лаборатории
продукт
содержит порошок силицида натрия, который
слежения. Причем можно отслеживать как контур трехмерных
возмож-
экрана,
Побочный
тол-
в
влияет
сенсорные
SiGNa).
генератора – просто водяной пар. Картридж
лазерного диода малой мощности, пара управляемых зеркал и фото-
щину, и она нисколько
(от
неве-
роятно тонка – менее 100
картридж PowerPukk с технологией mobile-H2
и
от
сети. Один порошко-
розеток
вый
или солнечного све-
картридж,
при
та. Шведская компа-
поддержке
канская
ностью зарядить два
батареи, может пол-
ния myFC и америSiGNa
компа-ния
объединив создали
карманных
Chemistry,
При этом, благодаря
новое
заряд-
крошечный
топливный
ное устройство – PowerTrekk. В его основе и
есть
компью-
тера или 15 плееров.
усилия,
портативное
собственно,
полной
элемент
специализация
(это,
myFC).
Водород для него вырабатывает небольшой
лятору, можно
истощившийся менять
электричества.
А
без
встроенному
аккуму-
прерывания
потока
диск
полезная
составляет до пяти ватт.
с
силицидом
мощность
7
тут
ПРО
№14 (май) 2011
граммист
редакция журнала
http://procoder.info
VIP ПЕРСОНА
ИНТЕРВЬЮ С АЛЕКСАНДРОМ ЯКОВЛЕВИЧЕМ КАПЛАНОМ
Миры фантастики все ближе и ближе подбираются к нам. Кто бы мог подумать, что еще недавно мы зачитывались «Ариэлем», а сегодня обычный человек с портативным нейрокомпьютерным интерфейсом может силой мысли управлять игрушечной машинкой и складывать пазлы. Да-да, именно так. И не путайте с системами на основе отслеживания направления взгляда. Вдвойне отрадно, что это наши отечественные разработки. Сегодня разработкой интерфейса мозг-компьютер (ИМК) занимаются в лаборатории нейрофизиологии и нейро-компьютерных интерфейсов на биофаке в МГУ имени Ломоносова http://brain.bio.msu.ru/bci_r.htm. Мы решили пригласить к нам в гости заведующего этой лабораторией, научного руководителя ННКИ и проектов по ИМК в МГУ и в национальном Курчатовском центре – доктора биологических наук, профессора, Александра Яковлевича Каплана. Интервью по-прежнему проведем в режиме вопрос-ответ... Редакция:
Яковлевич.
Здравствуйте,
Добро
Александр
пожаловать
в
нашу
рубрику. Для начала, расскажите немного
о себе, кто вы, откуда, семья, дети?
вашей работе? Александр: Уважительно, но без энтузиазма. Редакция: Когда появились первые подоб-
Александр: Все как у всех, и семья и дети.
ные интерфейсы?
настоящего времени одно и то же – кафедра
Александр: Первые попытки начались в 80-х
Место работы: со студенческих времен и до
физиологии человека, биологический факультет МГУ имени М.В.
годах прошлого века в Германии, чтобы по-
Ломоносова.
мочь полностью парализованным
людям
управлять инвалидным
Редакция: Почему вы
креслом
тельность с наукой?
внутри себя и не имеют
Александр: Так полу-
тировать с миром, их
связали
свою
дея-
возможности живой
ручивания будильника,
выходов
пошло,
двигать
затем компаса... так и вот,
Редакция: Как
род-
мозг человека.
ные
относятся
к
общаться.
Такие люди замкнуты
чилось. Начал с раск-
теперь
и
Сначала
Психофизиолог, доктор биологических наук, профессор, заведующий лабораторией нейрофизиологии и нейрокомпьютерных интерфейсов (ННКИ) биологического факультета МГУ имени М.В.Ломоносова, Александр Яковлевич Каплан
мониторе и
мозг их
лишен
наружу.
научили
курсором
на
компьютера
отвечать
«нет».
контак-
«да»
Затем
или
был
найден способ, позво-
8
ПРО
№14 (май) 2011
граммист
VIP ПЕРСОНА ляющий писать: когда на мониторе появляется
задуманная пациентом буква, на ЭЭГ возникает
более четкий пик. Но здесь возникает проблема скорости «письма». И мы тоже работаем над
ней.
Редакция: Как появился проект, чьи идеи
явились основополагающими? Александр:
Если
вы
говорите
о
проекте
интерфейса мозг-компьютер (ИМК), то это было
естественным продолжением наших разработок
по расшифровке ЭЭГ. Захотелось проверить, насколько
мы
понимаем
природу
тех
электрических отголосков активности мозга, которые можно зарегистрировать непосредст-
венно с кожной поверхности головы. Ключевой вопрос:
сможет
характеристиками
ли
ЭЭГ,
человек
какими
управлять
именно
и
насколько оперативно. Вот мы поначалу и связали
напрямую
изменение
этих
характеристик с RGB движком компьютерного
монитора. Испытуемых не информировали об
этих тонкостях исследования. Оказалось, эта техническая оснастка позволила мозгу подби-
рать
себе
«силой
предпочитаемый
мысли»
и
без
цвет
буквально
сведения
самого
Профессор А.Я.Каплан проводит очередное тестирование интерфейса мозг-компьютер, управляя игрушечной машинкой. Изменения ЭЭГ, связанные с мысленными командами, интерпретируются портативным компьютером и передаются на машинку
владельца мозга. С опубликования статьи на
десятки лабораторий. В последние годы в
2005
стартовавших с проектами ИМК.
эту тему в International Journal of Neuroscience в году
все
и
началось.
Потом
пошли,
машинки, буквопечаталки, пазлы, браузеры и теперь
беремся
за
проект
управляемого
России
появилось
Редакция:
Каковы
мыслью манипулятора, компьютерные игры.
рования ИМК?
Редакция: Кто еще работает* над ИМК-
Александр:
проектами?
Александр: За рубежом уже лет 15-ть работают
Из
несколько
источники
наиболее
коллективов
финанси-
известных:
Российский фонд фундаментальных исследо-
ваний (РФФИ и Фонд содействия развитию
малых форм предприятий, Фонд Бортника).
* Исследователи AutoNOMOS из Свободного университета Берлина разработали гарнитуру для управления машиной силой мысли. Датчики передают мысленные приказания водителя по беспроводной технологии к электронике машины. Все, что нужно сделать, это подумать: «влево или вправо», «быстрей или медленней», и машина послушно выполнит приказы. Технология, которой дали название BrainDriver, использует данные, полученные от видео камер, радаров и лазерных датчиков, которые дают 3D-картинку окружения. Водитель одевает специальные наушники, оборудованные 16-ю датчиками, которые считывают электромагнитные сигналы мозга. Полученные сигналы обрабатываются компьютером, который научили различать между командами «влево или вправо». В первом тесте, водитель смог поворачивать, хотя и с небольшой задержкой между командой и реакцией машины. Во втором испытании, машину научили распознавать четыре команды, добавив возможность прибавлять и убавлять скорость. Пока решение о том, будет ли данная технология пущена в серийное производство не принято http://globalscience.ru/article/read/19170 / Редакция.
9
ПРО
№14 (май) 2011
граммист
VIP ПЕРСОНА Редакция:
Мы
просмотрели
видео**
http://www.1tv.ru/news/polit/156208 о ИМК-
пазле,
созданном
в
ННКИ
и
продемон-
стрированном на выставке, приуроченной к
заседанию
Комиссии
по
техническому
развитию, которое провел в МГУ президент
России Д.А.Медведев. Каковы впечатления руководителей
«высших
данной реализации?
эшелонов»
от
Александр: Задавали ключевые вопросы и были впечатлены
успехами
отечественной
науки.
зировать»,
то,
действующие
макеты
Редакция:
Иностранные
наверняка
интересуются?
Александр:
Наши
засекречены?
наши
отдавать
«на
работы
коллеги
ведь
идут
русле
Ваши
работы
в
мирового тренда гражданских исследований в
этой области, предусматривающего свободный
обмен информацией через научные журналы и
конференции.
проект.
патенты.
Редакция: Датчики для ИМК отечествен-
надо
что
переделку» куда-нибудь в Китай...
Руководители проекта Сколково дали высокую
оценку и рекомендовали «встраиваться» в этот
получается,
работах
нет.
Ничего
Правда,
секретного
стараемся
в
наших
оформлять
Редакция: Наши военные проявляют инте-
ного производства?
рес к ИМК?
Александр: «Датчики для ИМК» – это целый
Александр: Мне это не очень известно, хотя,
для
Конечно,
предупреждения антисоциальной и антитерро-
современные, даже пробники использовали, но
бы реализовать потенциал технологий ИМК,
тракт: от электродов до транслятора команды исполнительных
электронные
схемы
их
программы,
элементы
соединения
устройств.
заграничные, и
естественно,
все
наши.
самые
алгоритмы,
Поэтому
«Датчики для ИМК», очевидно, отечественного
производства. А вот, если их «коммерциали-
несомненно, и в этой области и в сфере
ристической деятельности также можно было
которые
по
своей
природе
работают
с
проявляющимися на уровне ЭЭГ намерениями
человека.
Редакция: заняты?
Какими
еще
проектами
Вы
Александр: Помимо нескольких проектов с
ИМК,
базовых
продолжаем
заниматься
механизмов
мозга,
изучением
природой
некоторых его патологий, пытаемся продвинуть наши
знания
о
мозге
в
создании
интер-
нетовских социальных сетей нового поколения. Редакция: У вас есть публикации? Где,
если не секрет? Участник Фестиваля науки (Москва, 2009) собирает пазл «силой мысли» с помощью ИМК, разработанного в ННКИ ** В ресурсах к журналу прикреплены видеосюжеты: • А.Я.Каплан об интерфейсах мозг-компьютер в передаче канала ТВ-5 «Прогресс» от 15 февраля 2009 года; • Выставка гаджетов в передаче The.Gadget.Show от 2009 года.
Александр:
Это
не
может
быть
секретом.
10
ПРО
№14 (май) 2011
граммист
VIP ПЕРСОНА Публикации – это фактически единственная
Редакция: Ваши выпускники или ученики
отчетная документация ученого! Конечно, у
помогают Вам при случае по жизни?
научных изданиях, и в зарубежных журналах
Александр: Конечно... как друзья-товарищи.
нас есть публикации в ведущих отечественных соответствующего
профиля.
Посмотрите
на
нашем сайте http://brain.bio.msu.ru, там все
выложено
для
профессионалов.
начинающих
коллег
и
для
Редакция: Есть ли у Вас какие-то изобре-
тения,
какие?
рацпредложения,
если
есть,
то
Александр: Есть российские и международные
патенты, в том числе и на ИМК.
Редакция: Где лучше работается «нашему ученому», на родине или зарубежом?
Редакция: Что из литературы, порекомен-
дуете
нерам?
начинающим
физикам-биоинже-
Александр: Прибрам К. Языки мозга, Вулдридж
Д. Механизмы мозга, Г.Уолтер Живой мозг, D.J.
DiLorenzo Neuroengineering, T.W. Berger еt al. Brain-Computer
Interfaces:
An
international
assessment of research and development trends.
Редакция: Что в современном институте отечественной
науки
доработали?
Вы
бы
изменили,
Александр: Всем по-разному, но общее правило
Александр: Во-первых, обязательное между-
родился, там... не пригодился...».
проекты. Во-вторых, обратил бы внимание на
все
же
просматривается
Редакция:
У
вас
есть
пока
такое:
ученики?
C
«где
чем
связана ваша преподавательская деятель-
ность?
Александр: Моя должностная обязанность – это
выяснять закономерности Природы, я научный работник. Однако, работая в Университете,
конечно, инвестирую в него свои опыт и знания в
виде
учебных
и
популярных
лекций
и
практических занятий со студентами, слуша-
телями разных курсов и проектов, а главная
педагогическая деятельность – это работа со
своими дипломниками и аспирантами.
Редакция: Какими проектами заняты ваши
ученики?
Александр: Самыми разными, в России и
во
многих странах мира, но все про мозг человека.
народное
рецензирование заявок на научные
необходимость не только накачивания науки
деньгами и строительства новых институтов, но
и на создание оптимальной
инфраструктуры
науки, чтобы деньги и институты работали в
правильном месте, в нужное время и были
обеспечены информационной поддержкой.
Редакция: Как помогает знание инфор-
мационных
деятельности?
технологий
в
научной
Александр: В настоящее время – это 75% успеха.
Редакция:
И
традиционные
наши
вопросы... Какие из электронных журналов
читаете? А из печатных? Какие являются ориентиром для Вас?
Александр: В сетях практически не сижу...
11
ПРО
№14 (май) 2011
граммист
VIP ПЕРСОНА только
на
библиотечных
профессиональных
и
персональных
сайтах:
страницах
Александр: Mail.ru, Google, PabMed, Yandex.
коллег. Из печатных – в основном от 20-ти до
Редакция: Каковы планы на будущее?
интересов. Ориентиром являются не журналы,
Александр:
везде, где попадется, но сильно фильтрую.
заказным
30-ти зарубежных журналов по теме основных
а достижения в научном мире... Про них читаю
Редакция: Как Вы распределяете время между
оплачиваемой
работой,
хобби-
проектами и отдыхом? Читаете ли Вы в
дороге? Какими гаджетами пользуетесь?
собственным
Все
больше
времени
интересам,
работам...
и
Но,
– наверное, возьмусь за проект управляемого
от ЭЭГ протеза кисти... и еще – за управляемые
от ЭЭГ компьютерные игры. Редакция:
Cпасибо
пожелать нашим читателям?
и
этот
отдых
еще
и
оплачивается... В дороге я, в основном, читаю
свои собственные мысли и пользуюсь для этого
за
Вам,
работа
отдыхом,
–
работы,
обеспечивают эти самые собственные интересы
Яковлевич,
–
меньше
заказные
Александр: Время само как-то распределяется,
так как иной раз отдых оказывается работой, а
все
отдавать
столь
Александр
увлекательное
интервью. И напоследок, чтобы Вы хотели
Александр: Чтобы у каждого было свое дело по
соответствующими гаджетами.
собственному интересу, да еще полезное для
Редакция: ТОП-5 ежедневных просмотров
вместе творить…
Интернет-ресурсов?
всех.
А
вообще
–
присоединяйтесь,
будем
12
ПРО
№14 (май) 2011
граммист
Алексей Шишкин
http://flsoft.ru
ЗЕЛЕНЫЕ ТЕХНОЛОГИИ
ЭКОЛОГИЧНЫЙ ОФИС: И СЕБЕ И ПРИРОДЕ. ЧАСТЬ 1
Эта статья – начало цикла статей о том, как превратить рабочее место в офисе или дома в экологически полезное и финансово выгодное. Выгода в случае использования советов из данной статьи будет двойной: во-первых, для того кто будет использовать советы и во-вторых для всей природы в целом. Данная статья посвящается бумаге, офисному мусору и оптимизации оплаты счетов. Введение
понятно, не правда ли?
Ежеминутно
вырубается
такое
количество
леса, которым можно было засадить 36-ти
Don`t panic!
футбольных полей [1]. И это не шутка. Такое
Но паниковать не стоит. Свою «долю» лесов
представить.
простых
количество
бумаги,
древесины
Но
которое
очень
представить
изготавливается
трудно
количество из
этой
древесины еще труднее. Миллионы миллионов
листов ежедневно используются в офисах и дома. Миллионы киловатт и человеко-часов
спасти вполне реально, если следовать паре советов,
предназначенных
для
превращения офиса и домашнего рабочего
места в экологически чистый и полезный для природы объект. Итак…
используются для того, чтобы эти деревья
Бумага
сварить,
1. Покупайте два типа бумаги: обычную для
срубить,
распилить,
выдержать
в
измельчить кислоте,
в
щепки,
разрыхлить,
выжать воду, высушить... И все ради того,
отчетов
(документов
бумаги. Но вся эта энергия (как биологическая,
пойдут дальше вашего офиса).
на
2. Используйте бумагу повторно (не забывайте,
черновика
еще
пару
листов
так и техническая) появилась как предложение спрос.
покупают
Миллионы
тетради,
блокноты, книги и т.д.
людей
бумагу
для
ежедневно
принтеров,
Если производство бумажной продукции будет
расти такими же темпами, то вскорости от девственных лесов останутся только пеньки. «А
это только старушкам хорошо», – как говаривал
данных
и
дешевую
для
внутренних
«чистовиков»)
чтобы кто-то напечатал свою объяснительную, потратив
для
и
(записок
подчиненным, записей, которые никогда не
что у бумаги две стороны, и не забывайте про
ГОСТ 2.106-96 [2]) и после того, как одна из них
будет
использовать
использована
переворачивать принтеров.
вторую.
листы,
–
самое
Не
время
ленитесь
выходящие
из
кот Матроскин. Без лесов вода не сможет
3. Старайтесь покупать бумагу, которая была
окружающие пространства. Без лесов не будет
сертифицирована
впитываться в почву, она будет затапливать вырабатываться
кислород,
необходимый
для
дыхания людям, растениям и животным. Без лесов... Да что тут говорить, ведь и так все
создана
с
помощью
по
вторсырья
схеме
попечительского совета (FSC) [3].
или
была
Лесного
4. Заведите специальное ведро только для
13
ПРО
№14 (май) 2011
граммист
ЗЕЛЕНЫЕ ТЕХНОЛОГИИ бумаг и сдавайте получившийся в течение
месяца
«бумажный
макулатуры.
лом»
в
центр
приема
для
природы.
1. Собирайте офисный мусор минимум по трем
категориям: пластик, стекло и бумага. В том
случае, если в офисе стоит аппарат по продаже
напитков и пищи, нелишне будет и место для сбора металл-содержащих отходов.*
не
бросайте
такие
лампы в обычную корзину для мусора. Свайте
поломанные приема [5].
Мусор
Никогда
лампы
в
специальные
пункты
Счета 1.
Для
полезным
уменьшения поставить
электричества
(в
счетов
счетчики
случае
всегда для
наличия
будет
воды
и
кухни
нелишним будет и счетчик на газ, если таковой
имеется, однако, установка счетчика на газ не
2. Обращайте внимание на поломанную тех-
всегда разрешена законодательно).
содержании ртути** (mercury). Такую технику
2. Используйте энергоэффективные лампы. Для
контейнер. Помните формулу смерти – один
электронные пускорегулирующие аппараты.
целых
3. По возможности установите автоматические
нику,
нельзя
на
которой
просто
есть
упоминание
выкидывать
в
и
мусорный
выброшенный грам опасного вещества - это сто
килограмм
погибших
живых
люминисцентных
ламп
используйте
организмов. Не поленитесь узнать, где в вашем
выключатели света там, где в течение дня
3. Остальную же электронику лучше выбра-
4. Обогревайте только те помещения, которые
городе находится пункт приема такой техники.
сывать только тогда, когда есть абсолютная
уверенность (которая не существует в природе),
что из этих микросхем не получится извлечь что-то полезное. Вероятно, вам не понравится
люди могут отсутствовать.
действительно в этом нуждаются.
5. Лучше потратить полдня на утепление окон
в офисе, чем мерзнуть зимой и платить больше
узнать, что сервер можно было починить при
за электроэнергию.
плате, выброшенной неделю назад), но теперь
Химия
лишнюю строчку в графе «расходы».
1. Старайтесь не использовать изделия (кабели,
помощи замены одного диода (который был на придется отдавать его в ремонт и создавать
4. После запрета [4] на продажу ламп нака-
ливания***
появляется
более
страшная
проблема, чем переплата – газы и вещества, использующиеся в таких лампах крайне опасны
канцелярские изделия, техника), содержащие
поливинилхлорид (ПВХ, PVC). Хоть он сам по
себе
не
выделяются
вещества.
ядовит,
крайне
при
его
токсичные
утилизации
и
опасные
* Помните, что до 90% офисного мусора может быть переработана и полученная продукция сэкономит до 50% природных ресурсов и энергозатрат / Автор. ** Ртуть (англ. Mercury, франц. Mercure, нем. Quecksilber) входит в число семи металлов древности. Она была известна по крайней мере за 1500 лет до н.э., уже тогда ее умели получать из киновари. Ртуть считали основой металлов, близкой к золоту и поэтому называли меркурием (Mercurius), по имени ближайшей к солнцу (золоту) планеты Меркурий. С другой стороны, полагая, что ртуть представляет собой некое состояние серебра, древние люди именовали ее жидким серебром (откуда произошло лат. Hydrargirum) / Справка. *** Необдуманное решение. Очевидный расчет и опыт эксплуатации показывают, что экономия от внедрения энергосберегающих ламп несколько надумана, так как не учитываются срок эксплуатации, дороговизна таких ламп и меньшая яркость при одинаковых заявленных мощностях / Редакция.
14
ПРО
№14 (май) 2011
граммист
ЗЕЛЕНЫЕ ТЕХНОЛОГИИ 2. При замене окон выбирайте те, которые не
содержат ПВХ.
3. Не пользуйтесь в офисе одноразовой посу-
вышеперечисленных сэкономить
около
советов
12-ти
административных затрат [8].
позволит
процентов
всех
дой. Если по гигиеническим соображениям это
Вместо заключения
влагопрочного
Надеюсь, данные советы помогут вам не только
невозможно,
приобретайте картона.
изделия
из
Использованную
посуду можно затем сдать в макулатуру.
дать природе маленький шанс на спасение, но
и дадут вам дополнительный доход в виде
4. Не покупайте продукты питания, содержа-
сэкономленной суммы каждый месяц.
человека
В следующей статье читайте о том, какие
щие ГМО. Хоть их негативное действие на и
не
было
доказано,
на
мелких
животных, питающимися отходами человека
растения более полезны для офиса и дома.
питаться
Ресурсы
эта пища может оказаться опасной. Старайтесь только
натуральными
продуктами,
выращенными не в производственных условиях.
Это может быть зелень и овощи с рынков,
выращенные на собственном огороде. Это не
только позволит уменьшить спрос на ГМО, но и
улучшит ваше здоровье за счет натурального
питания.
5. Не пользуйтесь опасными дезинфицирующими
средствами,
содержащими
хлор
и
хлорорганические соединения или фосфат и фосфонаты.
специальным Практически
Эти средства легко опознать по знакам
все
моющие
заменить на натуральные [6].
на
этикетках.
средства
можно
–
Forests
and
Climate
Change
http://worldwildlife.org/what/globalmarkets/fore
sts/item3577.html
• ГОСТ 2.106-96 ЕСКД. Текстовые документы http://www.skonline.ru/doc/5355.html
• Лесной
попечительский
http://www.fsc.ru
совет
в
России
• Федеральный закон Российской Федерации от
23
ноября
2009
энергосбережении
и
г.
N
261-ФЗ.
о
Об
повышении
энергетической эффективности и о внесении
изменений
в
отдельные
законодательные
акты Российской Федерации. – Российская газета. Документы http://rg.ru/2009/11/27/
energo-dok.html
Сотрудники Агитируйте
• WWF
• Утилизация отработанных люминесцентных ваших
коллег
и
подчиненных
экономить. Используйте старый, добрый метод
ламп
–
пункты
приема
в
регионах
средства
http://tree-
http://greenpeace.org/russia/ru/campaigns/ecod om/electricity/utilization
агитации – плакаты [7].
• Безопасные
Но лучше использовать не готовые варианты, а
• Плакаты
не только полезно, но и выгодно для бизнеса.
• Руководство «Как сделать офис зеленым»
организовать конкурс на лучший плакат. Это
Согласно данным статистики, использование
моющие
land.ru/article/eko/moy.htm Гринпис
http://greenpeace.org/rus-
sia/ru/campaigns/green-office/posters
http://greenpeace.org/russia/Global/russia/repor t/green-office/Greenoffice%20guide.pdf
15
ПРО
№14 (май) 2011
граммист
Виталий Желтяков
vita-zhelt@yandex.ru
АЛГОРИТМЫ
ПОИСК ПУТИ ВОЛНОВЫМ АЛГОРИТМОМ
Волновой алгоритм является наиболее простым способом для поиска кратчайшего пути на графе с ребрами единичной длины. Основные его применения – это автоматизированная трассировка (разводка) печатных плат и поиск кратчайшего расстояния на карте в стратегических и тактических играх. Несмотря на простоту алгоритма, мне довольно часто приходится встречаться с очередными «велосипедами на квадратных колесах», основанных на параметрических уравнениях или поиске в глубину. Причина «неиспользования» волнового алгоритма для поиска кроется в том, что работу данного алгоритма достаточно сложно представить при первом знакомстве. В этой статье мы рассматриваем реализацию и поэтапную работу по поиску пути волновым алгоритмом на игровом поле. Немного теории…
связь есть только между соседними ячейками
Граф – это совокупность непустого множества вершин и множества пар вершин. Основные
элементы графа это объекты (узлы) и связи (ребра).
Поиск в ширину (BFS, Breadth-first search) – метод
обхода
и
разметки
вершин
графа,
основанный на поочередном переборе соседних
объектов с последующим переход на более
глубокий уровень после опроса всех соседей.
Волновой алгоритм – алгоритм, позволяющий
(см. рисунок 1). Здесь стоит отметить, что
форма ячеек и, соответственно, количество
связей
между
ними
не
имеет
никакого
значения для работы алгоритма. Можно без каких-либо
трудностей
и
изменений
реализовать поиск волновым алгоритмом и на четырехугольных
ячейкам
с
четырьмя
соседями, и на треугольных ячейках с тремя соседями. Игрок
находиться
в
ячейке
«А»
и
необходимо переместиться в ячейку «Б».
ему
найти минимальный путь в графе с ребрами единичной
поиска
в
нахождения
длины.
Основан
ширину.
кратчайшего
на
алгоритме
Применяется пути
в
для
графе,
общем случае находит лишь его длину.
в
Задача Дано игровое поле, состоящее из 18 ячеек-
гексагонов (шестиугольников). Игрок может
перемещаться
из
одной
ячейки
только
в
соседнюю ячейку, граничащую с ней. То есть,
Рис. 1. Игровое поле - Постановка задачи Требуется
определить
дальность,
то
есть
возможность достижения цели и найти сам
16
ПРО
№14 (май) 2011
граммист
АЛГОРИТМЫ путь,
пути.
учитывая
возможные
препятствия
на
// Создаем массив ячеек var map_cell = new Array(); // Создаем массив ячейки 1
Реализация игрового поля
map_cell[1] = new Array(); // Создаем массив связей ячейки 1
Сразу хочу обозначить, что для реализации
map_cell[1]['join'] = new Array();
выбран язык JavaScript, так как он знаком
большинству
программистов,
// Ячейка 1 в направлении 1 связана с ячейкой 2
которые
map_cell[1]['join'][1] = 2;
занимаются разработкой игр. Реализовать же
// Ячейка 1 в направлении 2 связана с ячейкой 5
этот алгоритм на другом языке просто даже
map_cell[1]['join'][2] = 5;
для начинающего программиста. Начинаем
разбираться.
Если
...
вспомнить
В этом массиве содержатся данные о связях
увидеть, что игровое поле это частный случай
направлении. Первая размерность массива –
теорию, описанную выше, то можно спокойно
определенной ячейки с соседней в заданном
графа, а именно, графа с ребрами единичной
это
игровом поле можно применять аналогичные
направлений.
отдельный номер, как показано на рисунке 2.
можно использовать буквенное обозначение.
длины. Отсюда следует, что для поиска пути на алгоритмы для графов. Каждой ячейке задаем
Желательно,
номера
последовательными.
должны
быть
номер
текущей
ячейки.
Вторая
задания
номера
размерность массива – это одно из шести Порядок
направления Значение
можете
элемента
задать
массива
произвольно,
–
это
номер
соседней ячейки в требуемом направлении.
Написание массива связей – это, пожалуй,
самый трудоемкий момент. Чем больше ячеек, тем больше массив. Но результат того стоит.
Реализация условий После создания игрового поля нам необходимо
обозначить условия поиска пути – начальную и
конечную точку, а также препятствия. Случай
Рис. 2. Разметка ячеек игрового поля
с препятствиями – ячейками, не участвующими
Почему каждой ячейке отдельный номер, а не
в поиске (особенности игрового поля, другие
игроки
и
т.д.),
расчета пути. В этом поле массива мы будем
легче.
реализуется
На
при
данных
практике
помощи
и
перебирать
игровое
поле
карт-изображений
работой
после
ячейки
меньше
общей
рассмотрим
ознакомления
передавать
с
мы
две-три координаты? Потому что в этом случае
алгоритма.
Дополняем массив связи ячеек полем path для
отражать, какие объекты находятся на карте, и
(теги <map> и <area>). Это объекты графа, а
в
массива:
и задаем для поля path следующие значения:
как же связи? Связи реализуются в виде
нем
будем
производить
расчет
пути.
Перебираем в цикле все ячейки массива связей
17
ПРО
№14 (май) 2011
граммист
АЛГОРИТМЫ • для пустых ячеек, перемещаться – 21;
по
которым
можно
function SearchPath(ni) { // Если итераций рекурсии много, то останавливаем ее
• для начальной ячейки – 20; • для конечной ячейки – 0;
if (ni>40) return -1; // Перебираем все ячейки арены
• распределение значений поля path должно получиться как на рисунке 3.
for (cell in map_cell) { // Если ячейка начала текущего поиска if (map_cell[cell]['path']==ni){ // То перебираем связи, найденной ячейки for (j in map_cell[cell]['join']) { // Получаем номер ячейки, с которой она связана celljoin = map_cell[cell]['join'][j]; // Если мы нашли начальную ячейку, то возвращаем // количество шагов до нее минус 1 шаг if (map_cell[celljoin]['path']==20) return ni; // Если ячейка, по которой можно идти, то в // path записываем удаленность от конца
Рис. 3. Значения поля path
if (map_cell[celljoin]['path']==21) map_cell[celljoin]['path']=ni+1;
Массив же будет такого вида: map_cell[1]['path'] = 21;
// Если конечная ячейка не найдена, то повторяем
// Пустая ячейка
map_cell[15]['path'] = 20; map_cell[4]['path'] = 0;
} } }
// процедуру для ячеек следующего шага
// Начальная ячейка
return SearchPath(ni+1);
// Конечная ячейка
}
... // Вызов процедуры. В качестве параметра для
Таким вот витиеватым способом мы задаем
// начала поиска передаем 0
условия поиска.
steps = SearchPath(0);
Числа 20 и 21 – условные. Можете использовать
Это рекурсивная функция, производящая поиск
нас количество ячеек равно 18-ти).
выдающая как результат количество шагов
Волновой алгоритм
процессе выполнения помечает ячейки вокруг
любые числа, но больше количества ячеек (у
условий производим поиск кратчайшего пути. над
полученным
массивом
«магическую» рекурсивную функцию волнового
поиска:
от
конечной
точки
к
начальной
и
минус 1 шаг (-1 – цель недосягаема). Функция в
После построения игрового поля и задания Применяем
пути
конечной точки пути количеством шагов от нее, пока не будет найдена начальная. Входной
параметр текущее количество рекурсий или
сделанное количество шагов. В
результате
значения
применения
поля
path
данной
массива
функции
приобретет
18
ПРО
№14 (май) 2011
граммист
АЛГОРИТМЫ следующий вид, показанный на рисунке 4:
от целей поиска пути. В итоге у нас получиться возможный
вариант
кратчайшего
пути,
показанный на рисунке. Следует не забывать,
что если кратчайшего пути нет, то функция поиска выдаст в ответе минус 1.
Поиск пути при наличии препятствий Мы рассмотрели простейший случай. Такие же
результаты,
Рис. 4. Поле path после обработки
какие
мы
получили,
можно
рассчитать и другими даже более легкими
способами,
например,
при
Сама функция вернет ответ – 4 (5-1 шагов).
параметрических
останавливает работу при нахождении первого
том, что он работает вне зависимости от формы
Следует
отметить*,
что
волновой
алгоритм
кратчайшего пути, то есть вполне возможна ситуация когда часть полей path массива не
уравнений.
помощи
Одно
из
преимуществ волнового алгоритма состоит в
графа, то есть на его работу никак не влияет наличие
препятствий
на
игровом
поле.
нашем случае 21).
наличии
препятствий
на
игровом
поле.
Построение пути
препятствия, как показано на рисунке 6:
будут обработаны и сохранят свое значение (в
Рассмотрим, как будет вести себя алгоритм при
Допустим, у нас на поле расположилось два
Здесь все просто. Перебираем связи начальной ячейки и ищем соседнюю ячейку со значением
поля path равному числу шагов минус 1 (в
нашем случае это 5-1=4). После нахождения
такой ячейки, помечаем ее или передвигаем
игрока
и
рекурсивно
повторяем
эту
же
операцию поиска соседей, но уже на шаг
меньше.
Пример
программного
кода
я
приводить не буду, так как тут многое зависит
Рис. 6. Игровое поле с препятствиями Зададим
условия
поиска.
У
ячеек
с
препятствиями поле path будет равно 22 (см. рисунок
7).
После
применения
алгоритма
получим результат, отображенный на рисунках
8 и 9. Результат достигнут легко и просто, в отличие от многих других алгоритмов.
Рис. 5. Возможный вариант пути * Еще один важный момент: почему мы осуществляем поиск от конечной ячейки к начальной? Мы это делаем для того, что бы упростить последующую обработку результатов. При таком подходе кратчайший путь представлен в виде последовательности чисел – 0, 1, 2, 3, 4 и его легко обрабатывать.
Как рассчитать, что препятствие загораживает
нам
путь?
Очень
легко.
Сначала
19
мы
ПРО
№14 (май) 2011
граммист
АЛГОРИТМЫ заполнять
заполнение
очень
большой
которого
в
массив
реальных
связей,
условиях
нельзя автоматизировать. Это много нудной
работы написания кода. Во-вторых, алгоритм
выдает первый возможный кратчайший путь. К
сожалению, таких кратчайших путей может быть несколько и не всегда первый полученный
путь визуально очевиден, то есть идет по
прямой.
Рис. 7. Разметка поля path
На
больших
препятствий это заметно.
игровых
полях
без
Подведем итоги • игровое поле – это граф с ребрами единичной длины и для поиска кратчайшего пути на нем
можно использовать волновой алгоритм;
• как
результат
функция
поиска
выдает
количество шагов до цели минус 1 шаг. При
Рис. 8. Значение поля path после обработки
отсутствии решения выдает минус 1;
• алгоритму поиска «нестрашны» препятствия на игровом поле;
• данный алгоритм универсален. Его можно без особых изменений применять в любых языках программирования;
• скорость
алгоритма
проверено
феноменальная
(полученные
обрабатывать);
данные
–
легко
• алгоритм выдает первый кратчайший путь, Рис. 9. Возможный вариант обхода препятствия
который визуально может быть непрямым.
производим расчет шагов с препятствиями по
Заключение
шагов без препятствий. Сравниваем резуль-
Я думаю, многим читателям будет интересно
данному алгоритму. Затем производим расчет
таты: если они различаются, то препятствие
преграждает нам путь.
взглянуть
на
простую
и
интересную
демонстрацию волнового алгоритма http://vzweb.narod2.ru/tachikoma/tachikoma.html.
Ложка дегтя При всех преимуществах, у алгоритма есть две
отрицательные большом
числе
стороны. ячеек
Во-первых,
нам
при
потребуется
20
ПРО
№14 (май) 2011
граммист
Николай Григорьев
Алексей Шишкин
http://flsoft.ru
АЛГОРИТМЫ
РУССКАЯ РУЛЕТКА ИЛИ ВЗГЛЯД МАТЕМАТИКОВ
Как часто вы считаете свои шансы на выигрыш? Скорее всего, не столь часто, как могли бы. Тратили-ли вы деньги в казино? А играли ли вы в рулетку? Скорее всего, хоть раз, да играли. Хоть и в виртуальную. Но вот в один из видов рулеток вы не играли точно. В русскую рулетку. О шансах выигрыша в русскую рулетку и пойдет речь в этой статье. Введение
тишина. Все пытались безуспешно осилить
произнесенное лектором. Было слышно, как недоумевающие студенты скрипят ручками, и
– Извольте извиниться перед дамой, господин Романов!
немного
– Только после дуэли с вами, господин Мещанский!
надпись*:
– Тогда извольте выбрать способ вашей смерти: на шпагах, или изволите стреляться? – Стреляться, господин Мещанский! В рулетку...
извилинами.
На
доске
появилась
P(AB) = P(B) * PB(A)
Возможно, каждый читатель понял, о чем
«А можете пример привести?», – раздался чей-
Да, да, той самой, в которой победа или
чик, примерчик…
говорил господин Романов – о русской рулетке. поражение
определяется
не
умением,
а
то озадаченный голос. «Примерчик? Пример-
случайностью. Или, иными словами, степенью
Пусть в коробке находятся шесть кубиков, на
диспут на лекции по теории вероятности.
Исходное, составленное из них слово КАРЕТА.
вероятности. Именно об этом и шел жаркий
Кубики
С чего все началось «Вероятность
события
А,
вычисленное
в
называется условной вероятностью события А после В», – скрипучий, как старые половицы, звучал
в
аудитории,
наполовину
заполненной сонными студентами.
– Не-а.
«Вероятность
события
любого
равна
из
них
произведению на
условную
вероятность другого», – продолжал все тот же
голос.
В
коробке
перемешивают.
Какова
аудитории
кубиков из коробки образуется слово…».
Сквозь с трудом сдерживаемый смех сбоку
раздался шепот: – Телега – слово РАКЕТА
Тот же голос сбоку заметил:
– Ты чего-нибудь понял?
вероятности
в
вероятность того, что в порядке вытаскивания
предположении, что событие В уже наступило –
голос
каждом из них записано по одной букве.
повисла
угнетающая
– 50%. Либо вытащим, либо не вытащим. – Да у тебя все 50%. – Даже вероятность того, что сейчас сюда астероид врежется. – Вероятность равна...
* В прошлых сериях лекций по теории вероятности студенты (те, кто сумел не заснуть) узнали, что P – есть вероятность какого-либо события, P(AB) – есть вероятность сложного события (т.е вероятность события, состоящего из событий А и B), а PB(A) – есть вероятность наступления события А, после того, как событие B уже наступило. К примеру, если в коробке три карты и уже достали первую, PКАРТА1 (КАРТА2) есть вероятность вытаскивания карты #2 после того, как карту #1 уже достали.
21
ПРО
№14 (май) 2011
граммист
АЛГОРИТМЫ
– Профессор, а почему вероятность правильно-го выпадения второй буквы 2/5 а не 1/5? – Потому что букв «а» у нас целых две, значит вероятность ее вытащить больше. – Аааа… – Именно «а», все верно, итак продолжим.
Рис. 2. Порядок передачи револьвера
А тем временем на одной из парт студент
делает страдальческое лицо, и говорит своему
соседу:
– С чего бы это? Хотя мы сейчас возьмем, и посчитаем, каким выгоднее быть. Так, вот смотри, вероятность того, что первый
– Застрели меня… – С удовольствием (наставляет на соседа пальцы сложенные «пистолетом»). Чик–чик. – Осечка? – Ага. Забыл вставить патрон и прокрутить ба-рабан. – Напоминает русскую рулетку. – А давай для неё вероятности посчитаем, все равно делать нечего. – Давай.
застрелится – 1/6. То, что застрелится второй... Эээ... – 1/5. – Почему? – Барабан прокрутился, осталось пять ячеек, одна из которых содержит пулю. Одну отмели. – А, точно. Так, вероятность второго – 1/5...
Спустя некоторое время в тетради появился такой расклад:
Сухой расчет Спустя двадцать секунд в тетради появилась следующая схема:
Рис. 1. Общая расстановка
Рис. 3. Шансы каждого участника – Так, считаем – шансы того, что до тебя в очереди дойдет револьвер...
– Я, чур, буду последний. Больше шансов.
22
ПРО
№14 (май) 2011
граммист
АЛГОРИТМЫ Это будет... Заклацали кнопки калькулятора: – 1/720.
произведении дают 1/6. Похоже такая вероятность у всех. – Читерская игра, какая–то. – Вот мне интересно, когда они револьвер проектировали, они
– Нет.
высчитывали все эти вероятности?
– Почему это? – У тебя получается, что каждый уже по пуле отхватил. – Вот те раз, точно. Значит наоборот – шансы остаться в живых – это 1 – 1/n
Ответом на этот вопрос послужили сразу два события – широкая улыбка собеседника и
звонок с пары... Заключение
Вот так всегда в жизни, как веревочке не
виться, конец – вот он. В каком порядке вы бы
не стояли, шансы у всех равны. Это конечно,
если не прокручивать барабан, после каждой
попытки, но это уже тема для следующей
лекции.
Можете, кстати говоря, проверить. Правда, разумеется,
не
с
револьвером.
Существует
голландский слабоалкогольный напиток***, с
крайне интересными свойствами – продается
он в упаковках по четыре банки, одна из которых,
Рис. 4. Шансы выжить – Так, давай на десять сократим, получится 12/72. – Та-а-а-ак, калькулятор говорит, что это будет 0.1666667. – 17%. Хм... Я бы стрелялся.
не
выделяясь
зеленый краситель.
внешне,
содержит
Интересно было бы сыграть в такую рулетку.
Но, помни, читатель: азартные игры никогда не
доводили до добра. Разве что, если вы не
владелец казино.
– Подожди, тут еще на 12 можно сократить.
Страшная догадка озарила оба тянущихся к истине разума: – Это же 1/6! – Так, давай первого считать. – Револьвер он получит однозначно**, а шансы застрелиться у него 1/6. – Не верю, что все так просто. Как дела у второго? – Шансы получить револьвер 5/6. Его шансы застрелиться – 1/5. В
** Событие, которое имеет стопроцентную вероятность, называется достоверным – оно всегда наступает в рассматриваемом эксперименте. *** Минздрав предупреждает: сами знаете, что...
23
ПРО
№14 (май) 2011
граммист
WEB ТЕХНОЛОГИИ Владимир Перминов
p_VS@rip-game.ru
CURL. ПЕРВОЕ ЗНАКОМСТВО
В свое время, столкнулся с необходимостью использования простого способа получения файлов по HTTP протоколу. Выбор был невелик: писать свой велосипед (область слишком большая, но, конечно же, для конкретной задачи вполне выполнимая), использовать Win API, привязав себя к данной платформе (при изучении обнаружились проблемы с докачкой), использовать тяжеловесные библиотеки QT или boost, и использовать небольшую, но функциональную cURL. cURL – что это? Пожалуй,
многие
слышали
о
библиотеке
cURL, но до реального использования хватало
не всех. Но, давайте разберемся, а так ли в
ней все запутано. Это программа! Готовая программа,
которая
позволяет
через
командную строку делать URL запросы, в
использовать всю ту мощь, что дает нам cURL.
основном для получения файлов, но это не
Как подключать, и устанавливать библиотеку
протоколы:
мануалов.
обязательно.
Поддерживает
следующие
DICT, FILE, FTP, FTPS, GOPHER,
HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS,
POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP,
SMTPS, TELNET, TFTP. Закачку данных на сервер посредством HTTP POST, HTTP PUT,
вы
можете
узнать
Все
что
из
#define CURL_STATICLIB // Если хотим статическую линковку
(Basic, Digest, NTLM, Negotiate, kerberos...) и,
#pragma comment(lib,"libcurl.lib")
Но, речь, конечно же, пойдет о библиотеке
Libcurl*,
на
которой
и
основана
данная
программа. Libcurl – это прослойка между
программами
пользователей
и
всеми
функциями описанными выше, написана она на языке Си, и является кроссплатформенной. Также стоит заметить, что более 30-ти языков программирования
имеют
использования библиотеки.
интерфейсы
для
теперь
давайте
взглянем,
Перед каким либо использованием нужно инициализировать curl_global_init
(при
необходимо
cURL
вызовом
использовании
передать
SSL
флаг
CURL_GLOBAL_SSL, если сборка для Windows
укажем это флагом CURL_GLOBAL_WIN32).
Дальнейшее знакомство мы продолжим на
примере создания объекта, который скроет в
себе все взаимодействие с cURL. Downloader и DFile
Как это выглядит А
для
файл и указать линковщику Libcurl.
#include "curl/curl.h"
что немаловажно, докачку.
нужно
использования, это подключить заголовочный
FTP и HTTP форм. А также поддерживает:
proxies, cookies, user+password- авторизацию
многочисленных
нам
как
же
Для
решения
упоминания
в
задачи,
начале
о
которой
статьи,
было
создадим
* Далее по тексту под cURL будет подразумеваться Libcurl.
24
ПРО
№14 (май) 2011
граммист
WEB ТЕХНОЛОГИИ простой
объект,
требоваться:
от
которого
будет
• установка URL файла, который требуется скачать;
• установка пути, куда скачать файл; • получения состояния скачивания;
• скачивание в фоне (отдельном потоке) и непосредственное скачивание.
Интерфейс данных объектов:
{ _iFileBadAttempts = iFileBadAttempts; } // Скачка завершилась ? ВАЖНО! Пока скачка не будет // завершена, объект нельзя удалять, // GetState == DFILE_STATE_DOWNLOADING int GetState()
{ return _iState;
const char* GetError()
{ return _sError.Get();
}
// Получить размер скачанных данных const size_t GetLength() { return _iLength; } // Получить данные const UCHAR* GetData()
{ return _pData;
}
// Получить завершенность скачки float GetPercent()
class Downloader
}
{ return _fPercentComplete;}
{ // Готов кусок для записи в буфер
public:
static size_t CallbackWriteMemory( void* pNewData,
class DFile
size_t size,
{
size_t nmemb,
public:
DFile* pDFile );
enum eDFileState // Готов кусок для записи в файл
{ // Ещё не начали скачку ( не вызывали Work ) DFILE_STATE_NONE
static size_t CallbackWriteStream( void* pNewData,
= 0,
size_t size,
= 1,
FILE *stream );
size_t nmemb,
// Идет процесс скачки DFILE_STATE_DOWNLOADING
// Произошла ошибка ( GetError подробности )
// Обновился статус готовности скачки
DFILE_STATE_ERROR
static int CallbackProgress( DFile* pDFile,
= 2,
double t,
// Успешно скачано DFILE_STATE_COMPLETE
double d,
= 3,
double ultotal,
}; DFile();
// Конструктор, обнуляет данные
~DFile();
// Деструктор, чистит за собой
void Clean(); // Очистить данные, что бы можно // было использовать объект повторно
double ulnow ); // Скачать, запускает в отдельном потоке метод Work void DownloadThread();
// Установить урл для скачки
// Непосредственная обработка скачки
void SetURL( const char* sUrl );
void Work();
// Установить файл для записи, если не установлен
private:
// скачка происходит в буффер
String
_sURL;
// Собственно откуда скачиваем
void SetToFile( const char* sToFile );
String
_sToFile;
// Куда сохранить ( на диске )
// Установить строку UserAgent
String
_sError;
// Получить информацию об ошибке
void SetUserAgent( const char* sUserAgent );
String
_sUserAgent; // Строка HTTP заг-а UserAgent
UCHAR*
_pData;
void SetFileBadAttempts( int iFileBadAttempts ) // Установить сколько допустимо ошибок
// Куда сохранить ( в памяти )
25
ПРО
№14 (май) 2011
граммист
WEB ТЕХНОЛОГИИ size_t
_iLength;
// Сколько байт скачано
curl_easy_setopt( curl, CURLOPT_USERAGENT,
float
_fPercentComplete;
// Процент завершенности
int
_iState;
// Состояние закачки
_sUserAgent.Get() ); // Установим смещение для скачиваемого файла,
// Макс количество неудачных попыток скачки,
// если мы уже часть закачали
// используется для варианта с записью в файл ( обрывы
curl_easy_setopt( curl, CURLOPT_RESUME_FROM,
// связи например ) int
ftell( outfile ) );
_iFileBadAttempts;
}; // Запускаем обработку
static void Init();
// Иници-ть необходимые данные
static void Destroy();
// Почистить за собой
};
// Почистим curl
Полный исходный код с реализацией данных объектов
журнала,
res = curl_easy_perform(curl);
можно
будет
далее
непосредственное использованное Dfile:
скачать
будут
взаимодействие
в
реализации
с
сайта
с
cURL,
расписано
интерфейса
curl_easy_cleanup(curl);
Основное в данном коде, это вызов метода
curl_easy_setopt
параметров, обратного
с
таких
вызова
установкой как
при
URL,
различных
функции
скачивании
блока
данных, получение процента завершенности.
CURL *curl; CURLcode res; // Получим экземпляр, для взаимодействия с cURL curl = curl_easy_init(); FILE *outfile; outfile = fopen( _sToFile.Get(), "wb"); // Что качать curl_easy_setopt( curl, CURLOPT_URL, _sURL.Get() ); // Устанавливаем callback функции и данные для них curl_easy_setopt( curl, CURLOPT_WRITEDATA,
outfile );
curl_easy_setopt( curl, CURLOPT_WRITEFUNCTION, CallbackWriteStream); curl_easy_setopt( curl, CURLOPT_NOPROGRESS,
0 );
curl_easy_setopt( curl, CURLOPT_PROGRESSFUNCTION,
Обратите внимание, как, используя данный объект можно легко скачивать файлы: Downloader::Init();
// Инициализируем cURL
Downloader::DFile* remoteFile = new Downloader::DFile;
CallbackProgress ); curl_easy_setopt( curl, CURLOPT_PROGRESSDATA,
this ) ;
// Что будем скачивать, для того, чтобы уведеть прогресс // надо скачивать большой файл
// Тут установим необходимые заголовки и timeout curl_easy_setopt( curl, CURLOPT_CONNECTTIMEOUT, 20 );
remoteFile->SetURL( "http://curl.haxx.se/pix/ curl-refined.jpg" );
26
ПРО
№14 (май) 2011
граммист
WEB ТЕХНОЛОГИИ remoteFile->SetToFile( "curl_logo.jpg" ); remoteFile->DownloadThread(); // Пока идет скачка while( remoteFile->GetState() <= Downloader::DFile::DFILE_STATE_DOWNLOADING ) { // просто отображаем завершенность printf( "\rDownloading... %.2f%%", remoteFile->GetPercent()*100.0f ); } if( remoteFile->GetState() == Downloader::DFile::DFILE_STATE_COMPLETE ) printf( "\rDownload complete.\n" ); else printf( "\rDownload error %s\n", remoteFile->GetError()); // Сбросим все, чтобы безболезненно использовать // объект снова remoteFile->Clean(); remoteFile->SetURL( "http://curl.haxx.se/" ); remoteFile->Work(); // Уже без потока скачаем if( remoteFile->GetState() == Downloader::DFile::DFILE_STATE_COMPLETE ) printf( (const char*)remoteFile->GetData() ); delete remoteFile; Downloader::Destroy(); // Освободим ресурсы занимаемые cURL
Конечно, мы не раскрыли всю мощь данной
Подведем итоги Получился
библиотеки, но мы и не ставили такой цели.
очень
простой
в
обращении
используя
различные
объект, буквально тремя строчками: когда, мы
скачиваваем
файл
протоколы. Также мы выяснили, что сам cURL тоже несложен, всего то необходимо четыре
функции,
две
из
которых
просто
инициализируют и чистят, одна обрабатывает, а
последняя
параметры.
устанавливает
различные
Мы
просто
взаимодействие
облегчили с
ней
себе
для
будущее
самой
часто
используемой функции: получения файла с удаленного сервера.
Ресурсы •
Официальный сайт cURL http://curl.haxx.se
• Страничка о cURL на википедии http://ru.wikipedia.org/wiki/CURL
27
ПРО
№14 (май) 2011
граммист
Евгений by kill17
http://kill17.narod.ru
ЛАБОРАТОРИЯ
CМОТКА ОДОМЕТРА BMW
И так, моя приборка подошла к 280050 км, поэтому стал задумываться по поводу решения проблемы повисания одометра на 299960, да и к тому же обычно все одометры сматывал на ноль при покупке авто. Значит, цель была проста – установить на одометре 17000 км, при этом не угробить приборку.
Дано – приборка Motometer, SW-17.0: HW-10.3, EEPROM – 93c56. Что нам понадобится:
теста
приборной
панели,
сброса
суточного
кнопку
• приборка;
активировать
его
можно так – выключаем зажигание, нажимаем километража
и,
удерживая ее, поворачивает ключ в замке
• программатор;
зажигания во второе положение, после чего
• калькулятор пробега;
тест активируется. Выглядит это примерно так,
• компьютерный блок питания;
всякие
• тестер;
вначале приборная панель начинает писать
• паяльник.
цифры
и
т.д.,
затем
загораются
лампочки, и все стрелки синхронно начинают
Первое что нам нужно, подключить приборку
на столе, ибо бегать каждый раз в машину
двигаться от начала до конца шкал. После того
как приборная панель уже подключена к блоку
надоест жутко. Для этого нам понадобиться
питания
и
включении, переходим на следующий этап.
подключения
Первый
шаг
обычный компьютерный блок питания, метод каждый
выбирает
сам,
я
припаивался с обратной стороны приборки, кто-то,
если
захочет,
через сам разъем:
может
• Блок питания - приборка; • +12V
(Желтый
• GND
(Черный
колодки); колодки).
провод)
провод)
подключиться
включить
проверить блок
-
16
pin
(синей
-
24
pin
(белой
работоспособность,
питания,
признаки
сделан,
Для
теперь
этого
жизни
нам
при
надо
откручиваем
ее
три
самореза на задней крышки и отщелкиваем две
пластиковые защелки. Выворачиваем защелки
и снимаем приборы с платы, Теперь ищем
После того, как вы подключили блок питания нужно
разобрать.
подает
при
этом
те
панель
развальцованные
пластиковые
стержни,
которые держат плату, и срезаем их. Я срезал
их канцелярским ножом (см. рисунок 1).
После того как вы их срезали, переворачиваем
плату и отщелкиваем пластиковые разъемы от
крышки корпуса тоненькой отверткой, процесс
очень увлекательный и иногда долгий, так как там
три
разъема.
дальше, если нет, ищем причину. Если кто не
что-нибудь при разборе приборной панели (для
все
получилось,
идем
знает, то на машинах марки BMW есть функция
столе
можно
подключить
Если
на
чего,
приборов должна включиться и высветить ваш
километраж.
плату
После
снова,
для
проверки работоспособности, не сломали ли вы
этого придется применить силу без включения
28
ПРО
№14 (май) 2011
граммист
ЛАБОРАТОРИЯ
Рис. 1. Начинаем разборки мозговой деятельности, см. рисунок 2):
общий и суточный, общий пробег записываем
на бумажку, а суточный будет показывать ноль.
Все калибровочные данные приборов, а так же
пройденный километраж и пробеги до ТО
содержаться
в
EEPROM’е.
Так
что
если
«запорите» EEPROM. то приборка работать не
будет.
Еще хочу упомянуть о методах подключения к EEPROM'у, их несколько, один (я использовал
Рис. 2. Плата во всей своей красе При включении у вас высвечивается пробег
этот)
–
выпаять*
пока
можно
микросхему,
а
другой
–
подпаяться к ней на самой приборке. Все это
преступаем рисунок 3):
к
отложить сборке
в
сторонку.
Теперь
программатора
* Лично у меня выпаять микросхему обычным паяльником безболезненно не получилось, я сломал несколько ног и порвал несколько дорожек на плате, в связи с этим была куплена новая микросхема (покупал в Питере в Мега-электронике, стоила 9 рублей 20 копеек). EEPROM – 93c56 (SO8) ПЗУ в 256 байт. После этого в руки попадалось еще 3-4 таких же панели, где-то я выпаивал микросхемы, но уже термофеном, а где-то подпаивался прямо к плате.
(см.
29
ПРО
№14 (май) 2011
граммист
ЛАБОРАТОРИЯ
Рис. 3. Схема электрическая принципиальная программатора Работает очень стабильно, простой и очень
Если вы выпаяли микросхему, то подключаем
дешевый, я собирал его навесным монтажом на
ее согласно схеме программатора и Datashit'а
уместиться в стандартный корпус COM-порта
программатором
разъеме COM-порта, но при желании он легко
(см. рисунок 4):
на микросхему, если нет, тогда припаиваемся к
плате.
Не
пытайтесь
и
прозвоните
припаяться к самой микросхеме, это очень неудобно,
возьмите
тестер
дорожке, таким образом, вы найдете места для
пайки гораздо удобней (см. рисунок 5). Ура!
Теперь включаем PonyProg 2000, выполняем
калибровку,
находим
интересующую
нас
микросхему в правом верхнем углу. Теперь
маленький нюанс, для работы программатора
нам понадобится всего +5В и GND, питание на саму приборную панель, мы НЕ ПОДАЕМ! Подаем питание на программатор и жмем в
Рис. 4. Программатор.
PonyProg 2000 кнопку считать.
Сборка навесным монтажом
Если все
хорошо, то на экране появятся разные байты, а
Хочу добавить, что COM-порт должен быть
аппаратным! То есть всякие переходники USB – COM вам в данном случае не помогут. Питание
не FF. Сохраняем полученную прошивку в файл.
Далее
идем
в
программу
Licznik4,
выбираем нужное авто и модель, открываем
полученную ранее прошивку и вот он, в правом
для него брал все с того же компьютерного
зеленом
+5 В берется с красного провода. Как вы уже
записывали на бумажку, он может немного
блока питания, с единственной поправкой, что
окне
сравниваем
его
догадались, самой программой для прошивки
отличаться
от
есть
Enter.
является PonyProg 2000, в прилагаемом архиве сам
программатор,
его
схема
и
русификатор. Все собрали и установили? Тогда приступим к самому ответственному шагу.
** По работе с PonyProg2000 и возможными проблемами весь материал вы найдете в Интернете, в связи с этим, а так же с тем, что он прост как «три копейки», подробная информация не приводилась.
наш с
родимый
тем
нашего,
километраж,
который это
не
мы
ранее
страшно.
Вписываем нужный нам километраж и жмем Далее
сохраняем
прошивку
с
исправленным километражем и снова идем в PonyProg
2000**.
Открываем
нужную
30
ПРО
№14 (май) 2011
граммист
ЛАБОРАТОРИЯ
Хочу
от
риск,
я
себя
добавить,
что
все
выше
это
в
чисто
написанное, вы проделываете на свой страх и изложил
все
ознакомительных целях. Статья была написана специально для форума http://e36club.ru/forum.
Ресурсы • Персональный сайт автора http://kill17.narod2.ru
• Datashit http://kill17.narod2.ru/odometr_bmw/ Datashit.rar
Рис. 5. Места подпайки прошивку, и жмем загрузку в EEPROM, если
все получилось, то отпаиваем (или впаиваем на место
микросхему)
подключаем
приборку.
программатор
Если
на
ней
и
нет
• Soft http://kill17.narod2.ru/odometr_bmw/ Soft.rar
• Programmator
http://kill17.narod2.ru/odometr_bmw/Programm
ator.rar
надписи Code и PPPPPP, и видим мы наш новый
• PonyProg http://kill17.narod2.ru/odometr_bmw/
осталось дело за малым – собрать все обратно.
• Форум E36club http://www.e36club.ru/forum
километраж,
то
можно
уже
радоваться,
** По работе с PonyProg2000 и возможными проблемами весь материал вы найдете в Интернете, в связи с этим, а так же с тем, что он прост как три копейки, подробная информация не приводилась.
setup.exe
31
ПРО
№14 (май) 2011
граммист
ЛАБОРАТОРИЯ http://programmersforum.ru
Виталий Белик
HTML НАРАСПАШКУ. ЧАСТЬ 2
С Дельфи разобрались. Аналогию с этой вариацией можно провести в Си. Но тут уж я укажу, на всякий случай, что буду работать в Visual Studio 2010 Beta эм… Как вариант Visual Studio Express. Особо я ничего не накручивал. И не очень накручивать хочу, так что бесплатные компиляторы, по крайней мере, от Микрософта вполне подходят. Си... Как вы думаете, пройдет в Си та же схема что и в Дельфи, описанная выше? Давайте посмотрим.
Loading… 60% remained
переходник в технологии будущего (.NET имею
Есть класс, который порождает сопроцесс. В
нет смысла. Однако «нет смысла» и «можно
этой библиотекой обладают только продукты
бы нет? Любителям Делфи выше, а любителям
Делфи мы обошлись VCL библиотекой. Однако
Borland-Code
Gear-Embarcadero.
Смысла
нет
писать тот же код на Билдере, он не будет
ввиду), и заострять на нем особого внимания
попробовать» это не одно и то же. Так почему С++ ниже в этом разделе. Надеюсь, каждый
найдет в этой статье что-то свое, привычное, и
особен-
использует по назначению. Отставим мыло, его
типами будет та же самая. А вот поэтому VS
к изваянию Галатеи. Предлагаю создать проект
Показать его второе личико.
мнение – это самый простой вид проекта. Сразу
ничем
отличаться
кроме,
пожалуй,
ностей языка Си. Но вся схема с модулями,
призвано внести малое разнообразие в проект. Например,
отличительная
особенность
–
сопроцесс может быть инициализирован на чистом,
WinAPI.
Что
может
послужить
показателем разнообразия. Не все любят VCL (впрочем, не все любят WinAPI, как и Винду в частности).
Я
лично
не
сторонник
WinAPI
заморочек – неудобно, или если быть более
правдивым избалован
–
непривычно.
Дельфийскими
Наверное,
красивостями
я
и
удобствами, однако это (к счастью видимо) не
итак в этой опере с головой, давайте приступим
на основе «Приложение Windows Forms». Мое
на форму можно скинуть TextBox, задав ему свойство
MultiLine.
А
на
котором
рующую
создать
запуск
Visual
Studio.
Главное
предоставляю вам выбор. Потому и решил
все, что необходимо для работы, хотя многие
твердят (и тут я согласен) что CLR всего лишь
инициализи-
Это
все
не
это
–
украшательства, «Главное – хвост», хе-хе).
вы
это
Далее нужно собрать «кишки» в программу. 1. Наша
попробовать их фишку – CLR классы. Там есть
кнопку,
литературу про создание такого рода проектов
в
задачи, будем надеяться, что и читателям
на другую систему, в любом случае сейчас я
положить
оформите сами, если не знаете как, почитайте
Схема может быть такой:
нашего журнала не сильно отвратно переходить
же
загрузчика.
мешает мне использовать другой механизм,
другие принципы для решения поставленной
так
компонент ToolStrip, аналог ToolBar'а в Делфи,
форма
передаст
создает
адрес
сайта,
объект,
которому
который
нужно
получить, и укажет процедуры-обработчики
событий.
2. Загрузчик кинется загружать. Но не сам. Он «жук хитрый», он наймет в чернорабочие
.
32
ПРО
№14 (май) 2011
граммист
ЛАБОРАТОРИЯ класс-сопроцесс, который в дополнительном
потоке
будет
посасывать
тихонько
себе
контент страницы, уведомляя загрузчик об
очередной откачанной порции. В принципе
эту
порцию
можно
сразу
передавать
загрузчику, чтоб тот отправил ее главной форме.
прошлой статье: // класс загрузчика public ref class TLoader { public: // свойство принимающее адрес закачки char* _url;
3. Cам сопроцесс уже будет построен на цикле выкачки, «пардонте» считывания, из сайта.
// свойства контента и порции страницы
Поскольку загрузка страницы будет идти
System::String^ Content;
порциями, загрузчик будет в курсе хода
System::String^ Partial;
выкачки. Даже если загружаемая страница
TLoader(void);
пока загрузится страница полностью. Форма
// события завершения закачки и получения порции
мере их поступления. Хотя конечно можно
event TLoaderNotifyEvent^ OnPartion;
завершения выкачки всей страницы. Тут уж
// процедура загрузки
очень большая, форме не придется ждать,
сможет обрабатывать закачанные порции по
описать
обработку
контента
event TLoaderNotifyEvent^ OnDone;
после
кому как больше нравится. В любом случае
void url(System::String^ aurl);
поступающих порциях.
// Процедуры вызова событий, назначенных формой
загрузчик
будет
уведомлять
форму
о
// при закачке порции и завершении закачки
Схема из предыдущих рассуждений. В нашем
void AfterDownload(){
реализации
}
Си,
как
и
обустройства
подключаемых всего два:
Дельфи,
такого
есть
возможность
механизма
событийной
заголовков
модели.
нам
OnDone(this);
путем
Из
понадобятся
// если порция получена, дописать ее в контент и // передать порцию в обработчик формы void LetMePart(char *_Partial,int aSize){
#include <windows.h>
int k;
/*В WinInet есть типы, которые описаны в windows.
Partial="";
Если не подключить этот хеадер могут всплыть ошибки на typedef
for(k=0;k<aSize;k++)
LPVOID HINTERNET;*/
Partial+=wchar_t(_Partial[k]);
#include <WinInet.h>
Content+=Partial;
Учтите, хеадер WinInet зависим от Windows,
OnPartion(this);
посему Windows нужно обязательно указать первым, ну, или, по крайней мере, раньше.
Этих модулей для описания загрузчика хватит,
другие тут не понадобятся, по крайней мере, для описания и реализации загрузчика.
Описание
загрузчика
предлагаю
как
и
в
} };
Тем, кто знает про классы в Си на легком уровне,
сразу
видна
одна
особенность
–
ключевое слово ref class перед именем. Это
33
ПРО
№14 (май) 2011
граммист
ЛАБОРАТОРИЯ означает, что класс управляется машиной CLR.
Это
процедурный
тип,
где
В современном .NET Си есть разделение на
спецификация
и создаются по-разному, и удаляются тоже по-
вернет в случае описания как функция. Причем
управляемые и неуправляемые структуры. Они
разному. Например, за управляемыми классами следит уборщик мусора .NET, который в случае,
процедуры,
указана
т.е.
какие
параметры она принимает, и какой результат процедура это обязана принадлежать классу или точнее – являться методом класса, о чем
когда объект класса остается висеть в памяти
говорит инструкция of object.
программе
Разработчики Си тоже пришли к аналогичному
без якоря (если на объект не ссылается в ни
одна
из
переменных)
самостоятельно объект этот освобождает. Это
удобно для программиста, ему теперь не нужно
бояться утечек памяти, умная машина сама приберется
после
бурной
вечеринки.
Считается, что нам это на руку, допустим наш
компьютер
достаточно
мощный,
чтоб
нормально выполнять «кучу ненужных действ Микрософта».
В состав свойств загрузчика входят свойства строки адреса страницы (он будет передан
потоку), строки всего контента страницы и очередной подкачанной порции. В принципе
можно обойтись без свойства адреса, если открывать
страницу
дополнительном открытое,
но
в
потоке
это
загрузчике,
просто
свойство
пригодиться в дальнейшем.
а
в
подкачивать
вполне
может
А вот дальше пару сюрпризов. Во-первых, это
поля событий. В Си, как и в Делфи, события описываются
аналогичным
Терминология
только
образом.
разная.
Что
такое
события? По сути, это всего лишь поля класса, содержащие которую
адрес
объекту
процедурного
типа
на
некую
назначат. можно
процедуру,
Т.е.
поле
автоматически
зачислить в звание «события». Например, в Делфи
дядьки
стандартный
из
тип
Борланда
события
прикрутили
TNotifyEvent,
который описан достаточно тривиально: TNotifyEvent = procedure(Sender: TObject) of object;
решению
описания
процедурных
типов,
назвали это словом delegate.
Делегат,
это
описание,
шаблон
но
некой
процедуры. Как она должна выглядеть в реале,
какие параметры принимать и т.д. Например,
если заглянуть на [1], то можно убедиться в
том,
что
делегат
призван
представлять
статический метод или метод объекта. Короче
процедурный тип, как ни крути. Вот таким вот Си-шным описанием и раскатаны обработчики
событий
event TLoaderNotifyEvent^ OnDone; event TLoaderNotifyEvent^ OnPartion;
А сам тип собственно имеет следующий вид // шаблон обработчика событий public delegate void TLoaderNotifyEvent(System::Object^);
Говоря по-русски, это процедура, параметром
которой по методу Борланда будет объект,
вызвавший этот обработчик. (^ говорит о том что объект управляемый, .NET-ный).
Методы
необходимы
AfterDownload для
вызовов
и
LetMePart
соответствующих
событий. Во втором методе единственное что,
так
это
идет
достыковка
к
контенту
загруженной порции, а уж потом вызывается
обработчик порции,
события
назначенный
принятия формой.
очередной
Вообще
по
одному символу приплюсовывать не самый
34
ПРО
№14 (май) 2011
граммист
ЛАБОРАТОРИЯ оптимальный
мне
вариант,
известно,
при
пожалуй,
добавлении
насколько
к
for(i=0;i<aurl->Length;i++)
строке,
_url[i]=aurl[i];
создается новая строка с уже дописанным
_url[i]=0;
добавлением в конец, а старая освобождается.
}
Постоянно
ThreadLoader^ TL=gcnew ThreadLoader();
в
памяти
туда-сюда
// Управляемый доппоток, конечно же
гоняются
огромные массивы данных, различающиеся в одном
символе,
посему
// передав ему ссылку на себя любимого
оптимальным
TL->Loader=this;
решением было бы пристыковывать к строке
ThreadStart^ ThreadLoadProcedure=gcnew
строку. Но как вариант сгодится и в цикле
Thread^ MainLoadThread=gcnew
функции закачки все-таки WinAPI-шные, и как
// и после собственно говоря создания и
не посимвольно, а сразу всю дописываемую
посимвольный
перенос,
учитывая,
ThreadStart(&ThreadLoader::Load);
что
Thread(ThreadLoadProcedure);
бы не совсем подходят для использования в управляемом можно
CLR-ом
укомплектовать
коде.
класс загрузчика.
Позволю
себе
Этим,
хэдер,
маленькое
// инициализации всего что нужно для потока
кстати,
где
// запустить его на выполнение
описан
отступление
и
скажу, что я никак не могу понять смысл в
MainLoadThread->Start(); }
Здесь
создается
–
классов, а уже их реализация в исходнике Си,
надежды)
быть
только
описание,
шаблоны
но как видно и в хедерах можно писать код.
Смысл тогда в них? В Паскале проще – все
сгруппировано лишних
в
файлов.
одном
Как
идеология
хедеров
Ну,
пожалуй,
бы
модуле, там
не
написанию хороших программ. а
нам,
незавершенную загрузчика,
и
часть
ни
было,
препятствует
останется
реализации
поскольку
никаких
Студия
CLR-ом
сопроцесс, которому назначается обработчик
сегодняшнем Си хедеров. По идее в них должно
управляемый
главная
сопроцесс
процедура
отпускается
потока, на
после
волю
чего
ветрам
Стоит отметить важный момент. Доппотоки в
CLR оформлены в виде классов. В отличие от
WinAPI-шной
идеологии
callback-ов,
когда
метод, указанный программистом как некий
обработчик, выступает в роли указателя на
процедуру (причем в WinAPI четко указана
дописать
спецификация этой процедуры – функция с
любезно
процедуру,
класса
одним
единственным
которая
параметром), будет
создала самостоятельно CPP файл для тел
виндовсом
ради, разместить в нем процедуру старта
опять-таки по аналогии с VCL Делфи, уже
классов хедера загрузчика, предлагаю, хаоса загрузки. Смотрите:
// метод старта загрузки будет вызывать доппоток void TLoader::url(System::String^ aurl){ _url=new char[aurl->Length+1]; { int i=0;
параллельно
чистую
вызываться
с
остальными
процессами в системе. В .NET все это счастье,
более подходит для работы под крылышком объектного
проектирования.
Это
класс,
в
общем-то, похожий на Дельфийский TThread,
тем, что в нем обязан присутствовать один (в
общем главный) метод, который программист
заполняет
начинкой,
вращаемой
операционкой в дополнительном потоке.
* Вот что написано в MSDN: «Объект String называется неизменяемым (доступным только для чтения), поскольку после его создания его значение не может быть изменено. Методы, используемые для изменения объекта String, на самом деле возвращают новый объект String, содержащий измененные данные [2].
35
ПРО
№14 (май) 2011
граммист
ЛАБОРАТОРИЯ В Си это классы ThreadStart^ и Thread^.
using namespace System::Threading;
Поскольку я описал поля контента и порции
а так же прикрепить ключ компилятору, с
логике вещей, они должны быть созданы где-
WinAPI-шных процедур библиотеку, в которой
освобождении экземпляра класса, собственно
Интернетом.
не как статические (см. листинг выше), по
то прописанным программистом кодом, и по
говоря, освобождены. Т.е. конструктор класса должен, по-хорошему, выглядеть так:
просьбой
задействовать
реализованы
функции
уже
представлен
получение
Partial=gcnew System::String("");
из
указывал,
работать так же, как будто они есть, созданы.
демонстрации
убирает, но и создает объекты, в том случае
втором
программа
будет
не
мусор
только
если к ним идет обращение, но программист
не
позаботился
об
портала
значит
которая
сам
способ
определенной
страницы. Собственно говоря, страницу я не
Однако если закомментировать эти строки по CLR
другой
открыть файл, а именно подав запрос GET на
};
вывод?
с
получения контента из страницы. Не просто
Content=gcnew System::String("");
Какой
работы
#pragma comment (lib, "wininet.lib")
Здесь
// в конструкторе создадим объекты контента и порции // загруженного
объектов-строк
для
для
Опишем тело процедуры-загрузчика. Видите?
TLoader::TLoader(void){
созданию
необходимые
их
создании
на
выставлена. можно
WEB
портале
Например, этого
указать
сервер по
вернет
<index.php>.
хватит,
но
конкретную
ту,
умолчанию если
Для
страницу
параметре
что
во
функции
HttpOpenRequest().
Этот
Еще один момент – обработка ошибок. Я не
статуса «неизменяемости» (термин immutable
предмет выяснения кода ошибки, в случае
смысле).
описана
самостоятельно?
Не-а.
Все
проще.
побочный эффект проявляется по причине
слышали?)
этого
Любое
класса
(класса
присваивание
строк
в
значения
описывал каждую функцию, как положено, на чего, однако GetLastError вполне может быть после
каждой
API
функции
для
объекту класса с таким статусом означает
обработки ошибочной ситуации.
экземпляра
Обратите внимание, еще один момент: выход
создание (я выше процитировал MSDN) нового
создано
ни
класса, одного
даже
если
объекта
не
такого
было
типа,
потому тело конструктора можно оставить
из
цикла
осуществиться
получения как
пустым [3].
размера
очередной
Loading… 70% remained
так
по
А раз так, то можно перейти к описанию
тоже
по
порций
результату
порции
(если
может
запроса
размер
равен нулю, значит получать более нечего), и
ошибке
отработки
функции
InternetReadFile. По-хорошему, ее, ошибку, стоит
обработать
и
либо
вернуть
сердца загрузчика. Того самого сопроцесса,
сообщение в загрузчик, чтобы тот уведомил
из Интернета. Для этого, не забыв объявить
еще
который порциями будет выкачивать контент указание работы с пространством имен:
пользователя программы, либо же прикрутить одно
событие
–
событие
обработки
ошибок загрузки. Я не стал этого делать
36
ПРО
№14 (май) 2011
граммист
ЛАБОРАТОРИЯ Тело процедуры-загрузчика
public ref class ThreadLoader { public: // загрузчик, вызвавший процесс static TLoader^ Loader; // процедура потока static void Load() { // возможный код ошибок int err=0; // переменки сессии, запроса и коннекта HINTERNET hSession,hConnect,hRequest; // открываем окошко в интернет hSession=InternetOpen(L”А мы тут плюшками балуемся”, INTERNET_OPEN_TYPE_PRECONFIG, 0, 0 ,0); // если это удалось if (hSession) { // Падаем на хвост порталу,
с которого качать страничку нужно
hConnect= InternetConnectА(hSession, (LPCSTR) Loader->_ur1, INTERNET_DEFAULT_HTTP_PORT,
0,
0,
INTERNET_SERVICE_HTTP,
0,
1);
// Если портал не против if (hConnect) { // Формируем просьбу выдать страницу. hRequest = HttpOpenRequest (hConnect, L”GET”, L””, HTTP_VERSION, //
0, 0, INTERNET_FLAG_KEEP_CONNECTION,
1);
Коль скоро и это нам позволено
if (hRequest) { // Отправляем депешу порталу в надежде на лучшее // Если портал не против дружить это хорошо if (HttpSendRequest(hRequest, 0, 0, 0, 0) ) { DWORD Size=0; // Выясняем по сколько портал нам будет // высылать байт в очередной порции InternetQueryDataAvailable (hRequest, &Size, 0, 0); // и поехали... for (;Size;) { // зарезервируем массив байт для очередной порции char *s=new char[Size]; // эта переменка будет получать число считанных байт DWORD
nbr = 0;
// Если считывание удается if (!InternetReadFile(hRequest,s,Sise,&nbr))
break;
// To сгенерируем событие, передав ему строку с очередной порцией Loader->LetHePart(s, nbr); // После чего строку освобождаем delete[]
s;
// и выясняем как там со следующей порцией InternetQueryDataAvailable (hRequest, &Size, 0, 0); }
37
ПРО
№14 (май) 2011
граммист
ЛАБОРАТОРИЯ } else { // если произошла ошибка, получить ее код
Тело процедуры-загрузчика (продолжение)
err=GetLastError(); } // и закрыть запрос InternetCloseHandle(hRequest); } // …связку InternetCloseHandle(hConnect); } // …и сессию, отключившись от Интернета InternetCloseHandle(hSession); } // …после чего сгенерировать событие завершения Loader->AfterDownload(); // …и боагополучно покинуть доппоток return; } };
сейчас, как прикручивать события я описал
привязавшись
и окончания загрузки, так что вы сами вполне
уборщик мусора пусть подметает сам.
выше на примерах событий получения порции сможете
поправить,
если
необходимо,
после
к
локальной
отработки
переменной,
сопроцесса
а
загрузки
загрузчик всем функционалом такого рода.
Как по мне, в данном контексте задачи это не
Loading… 80% remained
его сразу в конструкторе, привязав к форме и
На
этом
вполне
можно
считать,
имеет никакой разницы. Я предлагаю создать
что
разработка загрузчика завершена. Его модуль
можно прикрутить к модулю формы (хедер
вписать),
и
пропитать
самым загрузчиком.
класс
формы
этим
То есть в классе формы описать его поле private: TLoader^ Loader;
вопрос, где создавать экземпляр класса, в
конструкторе формы, дабы загрузчик жил с формой
все
ее
принадлежит форме, а не является локальной переменной
обработчика
клика.
Опишем
создание загрузчика в конструкторе формы: Form1(void) { InitalizeComponent(); // TODO: добавьте код конструктора Loader=gcnew TLoader;
Собственно говоря, после остро может стоять
непосредственно
к ее жизни, поэтому пусть свойство Loader
по
время,
клике
или
на
создать
кнопку,
Loader->OnPartion+=gcnew TloaderNotifyEvent(this, &HTTPLoader::Form1::OnDownloadPortion); Loader->OnDone+=gcnew TloaderNotifyEvent(this, &HTTPLoader::Form1::OnDownloadDone);
38
ПРО
№14 (май) 2011
граммист
ЛАБОРАТОРИЯ FormOnGetPart=gcnew
public:
_FormNotifyEvent(this,
void FormGetPart(System::Object^
&Form1::FormGetPart);
sender)
{this->textBox1->Text+=((Tloader^)sender)->Partial;}
FormOnDownloadDone=gcnew
void FormAfterDownload(System::Object^
_FormNotifyEvent(this,
sender)
{this->Text=”Загружено”;}
&Form1::FormAfterDownload);
Они сами по себе никак еще не связаны, или
}
точнее
никакого
отношения
не
имеют
к
Немного отступая от темы, хочу признаться,
загрузчику. Однако принадлежат форме. И
понять сам механизм назначения событий в
событий, генерируемых загрузчиком. Ничего
красотам Делфи, но уж больно сложным и
знают о каком загрузчике идет речь, ведь в их
что, честно говоря, мне с трудом удалось CLR.
Ей
богу,
может
быть,
я
привык
к
избыточным лишними телодвижениями мне
показался сам механизм CLR. Посмотрите на код.
Я
создал
экземпляр
TLoaderNotifyEvent,
указав
делегата в
нем
типа сам
обработчик, принадлежащий форме, который называется
Form1::OnDownloadPortion.
По
логике этого должно хватить. Форма связана с загрузчиком (или правильнее сказать – метод
формы), и остается только вызвать из самого
загрузчика
это
оказывается мало.
событие...
Однако
этого
Из-за чрезвычайно необоснованной и, я бы
сказал,
губительной
политики
Microsoft,
помешанной на безопасности (тупость какаято,
их
продукты
самые
взламываемые
и
именно в них будет происходить обработка
страшного нет в том, что эти обработчики не пенаты
передается
параметром
объект,
который собственно и будет представлять
загрузчик. Однако эти события еще нужно связать:
private: void OnDownLoadPortion(System::Object^
sender)
{Invoke(FormOnGetPart, sender);} private: void OnDownLoadDone(System::Object^
sender)
{Invoke(FormOnDownloadDone, sender);}
Помня о том, что написано в заметке MSDN'а
о
потокобезопасности,
я
привязываю
обработчиках методом Invoke вызывается уже события, принадлежащие собственно форме,
и при этом им передается параметр – объект.
дырявые, а они «церберов» всюду стараются
Получается некое подобие провайдинга:
с другим объектом, если они принадлежат
• загрузчик
понаставить) объект не имеет права работать
разным
потокам,
описал
делегат
о
чем
нам
скажет
их
статейка в MSDN [4]. Именно поэтому я отдельно:
и
события
для
public ref class Form1 : public System::Windows::Form { public delegate void _FormNotifyEvent(System::Object^); _FormNotifyEvent^
FormOnGetPart;
_FormNotifyEvent^
FormOnDownloadDone;
формы
эти
обработчики к загрузчику. А уже в этих
вызывает
метод
дополнительного потока;
из
своего
• тот понимает, что он не имеет права так просто достучаться до формы, ведь форма
его
может
террористом,
посчитать
желающим
башенки-близнецы;
каким-нибудь
грохнуть
ее
• тогда метод идет в посольство к послу по имени Invoke, и просит его «Сэр, передайте это немедленно президенту США лично в
39
ПРО
№14 (май) 2011
граммист
ЛАБОРАТОРИЯ
Рис. 1. Выдержка из MSDN руки,
и
не
рассыпьте
по
дороге,
«сибирки» только на одного хватит;
там
• «Сэр» Invoke – посол с доверенностью. Ему форма
доверяет.
Поэтому
вызов
FormOnGetPart происходит без каких-либо сложностей.
хорошо
и
Форма
безопасно,
считает, хотя
что
все
террористик
«Загрузчик» уже проник по параметрам делегата под коварным именем «sender» и,
преобразившись (имею ввиду приведение
взаимодействия
разных
потоков.
Как
вы
думаете, справится безопасность .NET если какой-нить
настоящий
вирус
попытается,
попав в один поток, захватить остальные?
Сможет ли он обойти бдящего стража CLR-а,
пронзив и покорив сердце каждой программы,
настолько,
что
те,
повернувшись
к
пользователю спиной, тихонько выпьют яду и повесятся на рее BSOD-а?
типа), творит свой беспредел в предыдущем
«Билл его знает»... По крайней мере, еще
всякие
Вполне
листинге, «малюя» на канве Edit-а формы
словечки,
непотребные с
и
завезенного
нецензурные
им
скачанного с указанного сайта.
контента,
Loading… 90% remained В общем-то, не так уж и сложен сам механизм
такие
вирусы
пока
возможно,
Микрософта
таки
не
что
распространены.
параноидальность
сможет
добрые плоды в ИТ-мир.
принести
свои
Как бы там ни было, к способам написания
безопасного привыкнуть
кода
в
Си
простому
для
.NET
можно
программисту,
40
ПРО
№14 (май) 2011
граммист
ЛАБОРАТОРИЯ несмотря на то, что писанины получается как-
то
многовато.
Да
и
сама
работа
начаться жизнь нового браузера. Браузера,
через
возможно, не уступающего по скорости и
на треке формула-1. Но даже тракторы иногда
которого еще нужно придумать кузов, салон и
неплохой результат, а посему нам остается
остальные «красивости».
посредников выглядит как трактор «Кировец»
выступают на гонках, и показывают вполне лишь
прикрутить
возможность
педаль
форме
газа,
возможность
«ацкую» машину в действие:
дав
привести
(System::Object^ sender, System::EventArgs^
обработчик
кнопку?
кнопки
формы.
Вы
The Чтиво en-us/library/system.delegate.aspx
• String Class http://msdn.microsoft.com/
e)
ru-ru/library/s1wwdcbf.aspx
{Loader->url(“programmersforum.ru”);}
инструментов
мотор разборщика HTML тегов, а также все
• Delegate Class http://msdn.microsoft.com/
private: System::void toolStripButton1_Click
Это
удобствам другим браузерам. Это шасси, для
на
ведь
панели
создали
Теперь таки можно приоткрыть дверцу в клуб
программистов собственноручно написанным
• Строки C#. Класс String. – Уроки на
Intuit.ru http://intuit.ru/department/pl/ csharp/14
• Control.InvokeRequired
http://msdn.microsoft.com/ru-ru/library/ a82t6122%28v=VS.90%29.aspx
загрузчиком (см. рисунок 2):
Рис. 2. Работа Си загрузчика Download complete… Конечно,
форточка
Используя
это в
еще
не
браузер.
бесконечный
функции
мир
WinAPI
Это
так,
Интернета.
можно
лишь
протоптать себе путь в море всякой ср... гм, кхм, sorry…
В общем, отсюда и до Бог знает когда, может
41
ПРО
№14 (май) 2011
граммист
ЮМОР Программисту
попалась
распечатка
человека. Посмотрел, почесал репу:
ДНК
– И какой же ламер так кодирует?!
Вот за что я так не люблю американцев: так это
за
то,
переключать...
что
им
раскладку
не
надо
Если спросить антоним к слову «одноглазый»,
обычный
человек
ответит
«двуглазый»,
только программист ответит «слепой». Представители спорят,
кто
программист:
– А
профессии
Бог.
профессий
Выходит
я сейчас докажу, что Бог по профессии
программист.
– ???
по
различных
и
– Расстояние от земли до луны составляет 384 тысячи километров. А это 128 плюс 256!
– У вас есть модулятор–демодулятор?
– Нет.
– Как, у вас нет модулятора–демодулятора???
– Нет!!!
– А это что??? – Это модем.
Как-то раз Билла Гейтса спросили:
– Какая из операционных систем, когда-либо создававшихся человеком, самая лучшая? – UNIX, – не задумываясь, ответил Гейтс. – Но... а как же Windows?
– Windows создал Бог, – скромно ответил тот. Ты когда принтер включал, он у тебя тоже
42
ПРО
№14 (май) 2011
граммист
ЮМОР
дрова потребовал? Эмм.. А он у меня это... от
электричества работает.
даже не знают. Поэтому мы решили дать вам несколько полезных рекомендаций, тем самым
обезопасив от этой напасти (и вашей головной
Вопрос:
боли):
лампочку?
• перед использованием компьютера (неважно
– Сколько программистов надо, чтобы вкрутить – Пpогpаммисты не нyжны, нyжен iRotateLamp-
AcrossHourAroow (int iSpeed, long int lTime).
Семь советов по борьбе с вирусами. В наше
время всеобщей компьютеризации проблема компьютерных
кипяченой
воде
(остывшей,
конечно)
и
тщательно вытрите чистым накрахмаленным
полотенцем;
• работая за компьютером – дышите только
разными, но всегда они приносят одни только
лишь в исключительных случаях. Ведь во рту,
вооружились
огромное
вирусов
известна
мылом SafeGuard. Затем прополосните их в
каждому.
Последствия
вирусов
в каких целях) долго и тщательно мойте руки
могут
быть
самыми
неприятности. И не смотря на то, что уже все
«докторами»,
различными
элементарных
тестами правил
и
по
профилактике компьютерных вирусов многие
носом! Рот вообще старайтесь открывать
как
утверждают
медики,
количество
скапливается
болезнетворных
микробов! Кстати, вы уже обрели защитный
экран? Если нет – обязательно приобретите
9 43
ПРО
№14 (май) 2011
граммист
ЮМОР марлевую
повязку
и
работайте в ней;
за
компьютером
• перед тем, как вставить дискету в дисковод, не забудьте ее предварительно вымочить в
спирте. При выполнении данной процедуры
существенную накопителя.
роль
Так,
играет
например,
вместимость
для
дискеты
объемом 360 Кб (если ими еще кто-нибудь
пользуется) достаточно нескольких минут,
1.44
МБ
–
уже
порядка
10–15
минут.
Внимательно следите за временем. Лучше
продержать дольше: тогда вирус наверняка погибнет;
проследите за клавишами Enter, Esc, Shift, Ctrl и F1–F10. Только полностью убедившись
в
том,
что
вирус
покинул
клавиатуру,
высуньте ее, ополосните чистой водой и высушите
в
предварительно
горелого,
можете
нагретой
духовке. Когда услышите небольшой запах смело
вытягивать
клавиатуру: вирусы, которые не утонули – уже сгорели;
• всем уже, наверное, известно, что вирус можно подцепить также через электронную почту.
Поэтому
защищенности
чтобы
от
достичь
вирусов,
100%-ой
поступающих
• с компакт-дисками следует поступать иначе.
через это гениальное создание человечества,
их уже проверенным средством Comet (еще
кабель, тянущийся от модема. Все так просто
Перед использованием тщательно вычистите
лучше – новый Comet). Hе сомневайтесь,
Comet
прекрасно
очистит
даже
самые
достаточно
взять
ножницы
и
перерезать
– не правда ли?
глубокие дорожки и придаст вашим дискам
И все же, если, несмотря на все предпринятые
• коврик и мышка, как известно, работают в
обезопасить свой компьютер от заражения – не
ощущение свежести и новизны;
самых антисанитарных условиях и, в то же
время,
являются
прямыми
источниками
заражения компьютера: ведь курсор мышки
попадает на все компоненты вашего рабочего
стола.
гигиены
Поэтому –
ваша
соблюдение святая
их
личной
обязанность.
За
меры предосторожности, вам так и не удалось
отчаивайтесь, а примите наш добрый совет: зараженному
компьютеру
обеспечьте
постельный режим. Hе переживайте, никто из
домашних не будет сильно возражать. Даже наоборот – все будут рады.
мышкой каждый из вас ухаживает по–своему
(это очень личная гигиена), а вот коврик
желательно
проглаживать
утюгом;
• обработка
хотя с
бы
обеих
раз
в
сторон
клавиатуры.
неделю
горячим
Аккуратно
отсоедините клавиатуру от системного блока (если она, конечно, присоединена к нему) и замочите
стиральном
на
целую
порошке.
ночь
Утром
в
хорошем
проверьте
–
отмокли-ли все подозрительные на вирус мелкие
частички.
Особенно
внимательно
44