2
Интро
Intro Долой холивары, давайте работать! Я никогда не был большим любителем «святых» войн и бесполезных дискусий. Всегда считал и, наверное, буду считать, что каждая существующая технология хороша по своему. Она обязательно комуто нужна и нет смысла поднимать спор, который все равно миром не разрешится. Это тоже самое, что спорить с кофеманами, предпочитающими варить бодрящий напиток в турке. Хоть целый день им рассказывай про плюсы кофеварок — они не примут вашу сторону. Почему? Ведь это долго и неудобно? Потому, что истинный любитель кофе знает, что в турке получается намного вкуснее.
Буду откровенен, меня достали всевозможные необоснованные наезды на компании производящие софт или на сами программные продукты. Ну почему ктото до сих пор считает, что Delphi полное говно? Да пускай он и проигрывает тому же C# (в плане ООП), но это очень мощный язык. Он прост в освоении и на нем очень просто создавать нативные приложения. Хоть закидайте меня помидорами, но против фактов не попрешь. Много знаменитых и качественных продуктов были созданы на Delphi: Total Commander, Skype, TheBat!, Unreal Commander и т. д. Ими пользуются тысячи людей и все довольны. Софт полностью выполняет возложенные на него задачи, а это самое главное. Не подумай, что в предыдущем абзаце я просто пытался отмазать Delphi. Вышеприведенные слова справедливы для любой технологии. За свои 8 лет IT'шной жизни я сделал один простой вывод: «Технологии нужно использовать для облегчения жизни, а не ради технологий». Под этими словами я подразумеваю, что для каждой задачи нужно выбирать оптимальное решение. Нельзя пытаться засунуть одну технологию во множество областей. Быть может с ее помощью и возможно решить большинство задач, но будут ли эти решения эффективны? Однозначно говорю — нет. Пускай разработчики языков программирования, и пытаются сделать свои детища универсальными, но на практике все выглядит иначе. Тот же Delphi позволяет создавать WEBприложеения, но я бы никогда не согласился делать их на нем. С операционными системами аналогичная ситуация. Linux хорош, но для домашнего использования он, мягко говоря, не очень. Чтобы не говорили матерые линуксойды, а для дома лучше животных не держать, а завести игрушку с именем Windows.
Выбирая способ для решения поставленной задачи обращайте внимание на критерий с именем «Эффективность». Решайте задачи эффективно, качественно и быстро. Не стыдитесь использовать технологии (если они действительно позволяют решить задачу проще и лучше), которые стали аутсайдерами изза эффекта толпы. Делайте рациональный выбор! Приятного чтения!
Игорь Антонов
vronline | сентябрь 2010
3
Содержание
Содержание
Сентябрь 2010
It-News Hard-News Кодинг
Берем WEBкамеру под контроль 1 2. C# Бинарные деревья поиска 1 8. C# Элегантное сохранение параметров 20. C# 22. Processing приложения Записки начинающего художника 24. Delphi Получаем DNS записи 27. Delphi Как я писал WinLocker 34. Python Раскручиваем сайт злобоскриптом 37. Python Иди ты на фиг, twitterfeed!
Я прусь! Обзоры от VR Без рамки
41 . Linux глазами хакера 42. Обзор плеера Samsung YPR1
Школа
72. Incendia. Первый раз в первый класс 82. PHP. Счетчик посещений 83. Создание БД в IBConsole и приложения в Delphi. Часть 1 89. Знакомимся с 1 С:Предприятие. Часть 3. Типы данных 1 00. Знакомимся с 1 С:Предприятие. Часть 4. Отладка 1 06. C#. Напиши мне, напиши
Мнение VR
47. 1 0 лучших дистрибутивов Linux. Версия 201 0 51 . Как я ставил Linux на netbook 54. VK Music: Скачаем все! 56. Ноутбук + GPS = картографирование 59. Синхронизация без границ
Меня тошнит! Креатиff
67. Inkscape. Создаем постер 70. Photoshop. Расскрашиваем фото
Идея проекта
Фленов Михаил aka
Horrific
(http://flenov.info)
Редакторы номера
Антонов Игорь aka
Spider_NET
Верстка и оформление
Антон Козлов aka
Jimmy Jonezz
Роман Костенко aka
Редькин Дмитрий aka
Lord_of_Fear
zahod5277
Вопросы и предложения
mail@vronline.ru
antonov.igor.khv@gmail.com
vronline | сентябрь 2010
Новости подготовили: AnyKey и Spider_NET
4
IT-News
ITNews
Еженедельная сводка новостей от VR-Online
В самом начале октября мы решили сделать одно интересное нововведение для нашего сайта – аудио версию самых интересных новостей за неделю. Новинка должна понравиться в первую очередь тем, кто больше любит слушать, чем читать. Зашел в конце недели на сайт – нажал плей и ознакомился со всеми интересными событиями. Если эта фича станет популярной, то не исключено, что появится подобная ежедневная сводка новостей. Приятного прослушивания!
Создан первый компьютерный вирус, угрожающий миру
Компьютерные хакеры создали первый вирус, способный нанести вред объектам реального мира, остановив работу заводов, электростанций и промышленных предприятий.
Специалисты полагают, что создание вируса спонсировано некоей правительственной программой. Об этом сообщает британский телеканал Скай ньюс со ссылкой на израильского специалиста по кибербезопасности Гади Эврона. По словам Эврона, вирус, получивший название Стакснет, стал первым из известных вирусов, созданных для уничтожения или затруднения работы заводов, электростанций и других промышленных объектов.
На создание Стакснет, который охотится за специальными компьютерными системами, созданными немецкой фирмой Siemens, потребовалось от шести месяцев до года.
"Для создания такого червя требуются ресурсы на уровне государства. Я полагаю, что его создание было наверняка спонсировано некоей правительственной программой", сказал Эврон в интервью Скай ньюс. Также специалист добавил, что на вооружении спецслужб этот вирус может использоваться для атаки специфических целей. "Невозможно представить, что его использует отдельный хакер, сидя у себя дома", считает Гади Эврон. Другой специалист в области компьютерной безопасности Ури Ривнер заявил, что за несколько месяцев во всем мире червем Стакснет были заражены от 30 тысяч до 50 тысяч компьютеров на многих предприятиях и корпорациях. Такое обширное заражение позволило специалистам выявить новый вирус и помогло предпринять меры к его нейтрализации.
Состоялся релиз финальной версии iOS 4.1
Apple в США начала продажу нового поколения плееров iPod, одновременно разместив в системе обновления новую версию операционной системы iOS 4.1, которая доступна для предыдущих поколений устройств iPod и iPhone. Напомним, что подробно о возможностях новой системы около недели назад рассказывал глава Apple Стив Джобс, презентовавший новые iPod и AppleTV. На данный момент все пользователи последних и предпоследних поколений iPod и
vronline | сентябрь 2010
5
IT-News
iPhone могут обновить программное обеспечение через iTunes бесплатно.
В обновлении содержатся несколько новых функциональных дополнений, в том числе динамическое масштабирование фото, поддержка аренды видеофайлов через iTunes, возможность загружать HDвидео на YouTube и MobileMe, расширенная поддержка аксессуаров, совместимых с AVRCP и новые варианты работы системы видеотелефонии FaceTime.
Компьютер читает мысли с точностью 90%
Американские ученые разработали технологию, позволяющую читать чужие мысли. Российская пресса уже окрестила аппарат миелофоном по аналогии с прибором из отечественного фантастического фильма "Гостья из будущего".
Открытие американских биоинженеров преобразует поступающие из мозга сигналы в слова, сообщают детали Вести.Ru. Точность, с которой аппарат читает мысли, составляет до 90 процентов. В первую очередь он может помочь парализованным пациентам и людям с ограниченными речевыми возможностями. Внедрение прибора в медицину может состояться в ближайшие несколько лет.
Впервые аппарат был испытан на больном эпилепсией пациенте. Биоинженеры подключили к участкам его головного мозга, отвечающим за речь, 16 небольших электродов и попросили испытуемого прочитать несколько простых слов. После того как пациент мысленно повторил эти слова, компьютер, проанализировав мозговые волны, смог распознать их с точностью от 76 до 90 процентов. Группа ученых уверена, что в ближайшее время у них получится создать специальное голосовое устройство, повторяющее то, о чем думает пациент, пишет The Daily Telegraph.
Dell представляет ноутбук-трансформер
Забавный мининоутбук представила компания Dell на конференции IDF 2010 в СанФранциско. Устройство способно преображаться в планшетный компьютер. Новинка называется Inspiron Duo.
С виду обычный нетбук легким движением руки превращается в планшет благодаря тому, что его дисплей закреплен внутри рамки с помощью двух шарниров, рассказывает портал «Компьютерра–Онлайн». С их помощью экран можно перевернуть и «положить» тыльной частью на клавиатуру. В итоге получится планшет с 10 дюймовым тачскрином.
Известно, что в основе компьютера лежит двухъядерный 1,5гигагерцевый чип Intel Atom N550, а работает он под управлением операционной системы Windows 7 Home Premium. Продажи Dell Inspiron Duo стартуют до конца 2010 года.
Mail.ru четырежды уязвимо
По меньшей мере, четыре бреши Mail.ru свободно выложены в Сети. Специалисту, который их обнаружил, просто надоело ждать, когда компания устранит проблемы в своих сервисах. Ведь он заботливо сообщил о них руководству компании еще месяц назад. По этому поводу специалист некто Илья А. (полная фамилия не называется) дал интервью Сnews. Он рассказал, что выявил «дыры» в безопасности, когда готовился к собеседованию на руководящую позицию в Mail.ru.
Информация об уязвимостях была передана по назначению. Но прошел месяц, а «дыры» в безопасности Mail.ru до сих пор не закрыты. Потеряв терпение, Илья опубликовал описание четырех «дыр» в популярном ИТблоге. Помимо описания проблем, он привел готовые скрипты, vronline | сентябрь 2010
6
IT-News
нужные для эксплуатации уязвимостей.
Использование самой безобидной из уязвимостей удаляет письма пользователя по мере их прочтения. Другая позволяет организовать спамрассылку средствами Mail.ru. Следующая предназначена для уничтожения всех записей в сервисе "Еженедельник" Mail.ru. С помощью еще одной злоумышленник получает возможность заблокировать чужой аккаунт в сервисе Деньги.Mail.ru. По словам Ильи, единственный мотив, который он преследовал при публикации скриптов, – поторопить компанию с закрыванием уязвимостей имеющихся в работающих сервисах. "Я хотел объяснить руководству Mail.ru, что надо больше думать о безопасности пользователя".
Flash Player опасен для компьютера
Компания Adobe предупреждает пользователей об опасной уязвимости во Flash Player. Прореха настолько серьезная, что позволяет киберзлодеям захватить контроль над компьютером пользователя, сообщает официальный сайт Adobe.
Критической уязвимости подвержен Adobe Flash Player версии 10.1.82.76 и более ранних версий для платформ Windows, Macintosh, Linux, Solaris, а также Flash Player 10.1.92.10 для смартфонной операционной системы Google Android, уточняют РИА Новости.
Ошибка также затрагивает Adobe Reader 9.3.4 для всех поддерживаемых настольных операционных систем и Adobe Acrobat 9.3.4 для Windows и Macintosh. Уязвимы также более ранние версии этих программ.
Уязвимость существует изза неизвестной ошибки при обработке Flashданных. Подробности не сообщаются. Но по сведениям Adobe, уязвимость уже активно используется хакерами для поражения Windowsкомпьютеров с Flash Player. Об атаках против программ Reader и Acrobat пока неизвестно. Adobe планирует выпустить обновление Flash Player для Windows, Macintosh, Linux, Solaris и Android в течение двухтрех недель. Обновление Reader и Acrobat ожидается на неделю позже.
Телефон может подзаряжаться от звука голоса
Ученые из Южной Кореи придумали технологию, благодаря которой мобильники будут заряжаться во время разговоров от... звука голоса. Они предлагают использовать в мобильных телефонах устройство, преобразующее звуковые волны в электричество.
В будущем телефоны вообще смогут обходиться без дополнительных зарядных устройств, считают южнокорейские исследователи. Чтобы зарядить такой телефон, нужно будет просто поговорить по нему.
Как сообщает www.mobus.com, устройство, способное преобразовать звуковые волны в электричество, уже разработано. В его прототипной версии используется нанопроволока из оксида цинка, проложенная между двумя электродами.
Под воздействием звука громкостью в 100 дБ устройство дало ток в 50 милливольт. Этого недостаточно для зарядки мобильного телефона, но исследователи надеются, что в будущем они создадут более мощные преобразователи. Устройство, преобразующее звуковые волны в электричество, может использоваться не только в телефонах, но и, например, на автотрассах. Шум машин позволит обеспечить электроэнергией кварталы города.
По три - каждому!
Стало известно, что компания Marvell решила удивить всех своим новым проектом. В настоящее время они работают над созданием (а точнее тестированием) процессора с тремя ядрами для мобильных устройств (коммуникаторы, смартфоны, планшеты и т.д.). Известно, что кодовое имя нового чипа Armada 628 и он создан на базе архитектуры ARM. Главными фишками нового процессора должны стать: высокая производительность (еще vronline | сентябрь 2010
7
IT-News
бы!), и низкое потребление энергии. Чтож, поживем увидим. Кстати, появление первых устройств на новом процессоре ожидается уже в начале следующего года.
Состоялся релиз PostgreSQL 9.0
Както мы отвлеклись и забыли сообщить, что 20 сентября обновился популярный бесплатный сервер баз данных PostgreSQL (http://postgresql.org). В новой версии продукта разработчики реализовали: Улучшенную поддержку хранимых процедур;
Более простое управление разрешениями для объектов;
Полная поддержка Windows x64
Исключающие ограничения (exclusion constraints)
Поддержка аутентификации через RADIUS и LDAP
Поддержка Python 3 в PL/Python Анонимные блоки кода
Новые возможности для триггеров и т.д.
С полным списком нововведений можно ознакомиться на этой странице.
Лицензионную музыку закачали в Интернет бесплатно В Интернете появился сервис "Яндекс.Музыка". Благодаря ему слушать песни известных отечественных и зарубежных исполнителей можно не только легально, но и бесплатно. В музыкальном каталоге собраны около 800 тысяч композиций.
Если ранее пользователи могли прослушать искомую композицию в плеере "Яндекса" прямо на странице результатов поиска, передает РИА Новости, то теперь они имеют возможность искать и слушать не только треки, но и альбомы исполнителей из музыкального каталога "Яндекса". Также с помощью нового сервиса можно составить свой плейлист из любимых композиций. "Сервис позволяет добавлять в плейлист как треки, так и альбомы разных исполнителей и слушать их хоть целый день в хорошем качестве и абсолютно бесплатно", говорится в сообщении компании. Зарабатывать же поисковик планирует за счет размещения баннерной рекламы на странице сервиса.
Контент для "Яндекс.Музыки" предоставили более 50 правообладателей, среди которых компании Universal, EMI, Warner Music Group, Sony Music, "Первое музыкальное издательство", "Монолит", "СБА Продакшн" и многие другие.
Qt обновился до версии 4.7.0
Буквально пару дней назад обновился инструментарий для кросс платформенной разработки приложений Qt (http://qt.nokia.com/products). Из наиболее значимых изменений можно отметить: Повышение производительности
Исправление множества ошибок
Улучшение производительности в Qt Webkit Integration
Qt Quick
vronline | сентябрь 2010
8
IT-News
Власти США хотят поставить Интернет на прослушку
В США разрабатывается законопроект, согласно которому поставщики услуг интернетсвязи обязаны будут обеспечить возможность незаметного перехвата и расшифровки данных, передаваемых по Сети. А разработчикам приложений для электронной почты, мгновенного обмена сообщениями, социальных сетей и т. д. придется модифицировать свои программы.
Сегодня многие поставщики популярных сервисов и приложений для связи через Интернет уделяют особое внимание защите данных. Современные алгоритмы шифрования предельно затрудняют взлом и перехват информации, что не позволяет сотрудникам спецслужб прослушивать переговоры преступников и террористов, комментирует американский законопроект Софтклуб.
"В данном случае речь идет не об установлении всеобъемлющего контроля над электронными коммуникациями, объясняет консультант ФБР Валери Капрони в своем интервью газете The New York Times, Государство уже предоставило нам такие полномочия и разрешило организовывать прослушку в тех случаях, когда это касается защиты общественной и государственной безопасности".
Законопроект будет представлен на рассмотрение конгресса в следующем году. Разумеется, далеко не все граждане США уверены в полной необходимости предпринимаемых мер. По мнению противников закона, "черные ходы" в системах защиты будут использоваться хакерами и другими злоумышленниками для незаконного перехвата защищенных коммуникаций.
Google исполнилось 1 2 лет!
27 сентября Google отпраздновал свой 12й день рождения. За 12 лет Ларри Пэйдж и Сергей Брин подняли свой стартап (тогда он ещё назывался BackRub) до транснациональной корпорации, а сами делят 11е место в списке "Forbes".
MS Security Essentials стал еще халявнее
Несмотря на то, что многие пророчили антивирусу от MS неминуемую гибель, он продолжает жить и завоевывать сердца пользователей. Еще бы, ведь он совершенно бесплатен и неплохо справляется с возложенными на него обязанностями. Я и сам юзаю MS Essentials уже почти год и пока полностью доволен его работой. Начиная, с октября, поклонников MS Essentials станет еще больше. Компания MS пересмотрела условия лицензионного соглашения, добавив возможность использовать антивирусный продукт в среде малого бизнеса (до 10 компьютеров).
Девятого ослика скачали 2 млн раз
Компания MS поспешила поделиться радостной новостью. Бета версию IE 9 загрузили 2 млн пользователей со всего мира. Как сообщает представитель MS, популярность IE9 превзошла их ожидания. Еще бы было подругому! Пиар сделал свое дело.
Диета для графики от Google
Корпорация зла добра представила на суд общественности новый формат сжатия изображений WebP. Нетрудно догадаться, что главная особенности WebP от остальных форматов более высокая степень сжатия данных.
Как утверждают представители Google, формат WebP в состоянии уменьшить размер изображений (без видимой потери качества) до 39% по сравнению с JPEGфайлами. В основе WebP лежит технология предиктивного кодирования. Ее суть в том, что во время сжатия происходит анализ содержимого соседних блоков пикселей для vronline | сентябрь 2010
9
IT-News
"угадывания" содержимого текущего блока. Такой подход позволяет кодировать лишь различия между фактическими и предсказанными значениями.
Кто желает протестировать новый формат и увидеть его преимущества своими глазами, может загрузить бесплатную тулзу для конвертировании картинок (разных форматов) в WebP. К сожалению, в настоящий момент программа доступна лишь для Linux. Версия под Windows будет представлена в ближайшее время.
Разработчики OpenOffice.org объявили о независимости от Oracle
Разработчики офисного пакета OpenOffice.org создали организацию The Document Foundation, которая займется созданием пакета под названием LibreOffice, пишет TGDaily. Новый продукт станет логическим продолжением OpenOffice.org, однако не будет использовать это название, которое является торговой маркой Oracle. Последняя получила права на OpenOffice.org, купив корпорацию Sun. Пока неизвестно, будет ли Oracle, которая является одним из ключевых спонсоров проекта OpenOffice.org, спонсировать LibreOffice.
LibreOffice уже поддержал ряд компаний и организаций, в том числе Google, Free Software Foundation, Novell и Red Hat. Представители компании Canonical пообещали включить LibreOffice в будущие версии дистрибутива Linux Ubuntu. Представители The Document Foundation уже выложили первую бетаверсию LibreOffice. Она доступна для Windows, Mac OS X, систем на базе Linux, а также в исходных кодах. Пока LibreOffice существует лишь в английской версии, в то время как OpenOffice.org доступен более чем на 110 языках.
vronline | сентябрь 2010
Новости подготовил: Lord_of_Fear
10
Hard-News
Железные новости
Verbatim выпустила первую карту памяти SDXC емкостью 64 ГБ
Компания Verbatim выпустила свою первую карту памяти формата SDXC (Secure Digital Extended Capacity), которая отличается высокой емкостью и высокой скоростью передачи данных. Представленная карта памяти Verbatim SDXC имеет емкость 64 ГБ. Такая новинка отмечена рейтингом скорости UHSI, что свидетельствует о её способности обеспечивать скорость передачи данных до 104 МБ/с. Другой рейтинг скорости – Class 10 – обещает, что минимальная скорость передачи данных не опустится ниже 10 МБ/с.
NVIDIA считает, что смартфоны вытеснят персональные компьютеры
Сложно оспаривать тот факт, что сегмент устройств на базе процессоров с архитектурой ARM сегодня растёт уверенными темпами не зря же процессорный гигант Intel пытается предложить конкурирующие решения с x86 совместимой архитектурой. Компания NVIDIA тоже считает ARMпроцессоры приоритетным направлением развития, хотя пока для его поддержки выделяется не так много средств, как следовало бы.
Глава NVIDIA на недавней профильной конференции выступил со смелым заявлением. По его словам, в будущем основную часть функций персонального компьютера возьмут на себя мобильные устройства, по размерам не превышающие габаритов смартфона. Для подключения к внешним экранам будут использоваться беспроводные интерфейсы. ARM уже сейчас является самой быстрорастущей с точки зрения ёмкости рынка процессорной архитектурой, и в будущем она станет доминирующей, как считает господин Дженсен Хуан.
Seagate выпускает первый внешний жёсткий диск объёмом 1 .5 Тб
По заверению компании, это первый в мире ультрамобильный жёсткий диск с таким большим доступным объёмом. Среди преимуществ упоминаются надёжность и скорость работы. Для сравнения производитель приводит такие данные: фильм, занимающий 25 Гб, запишется на диск за 5 минут, в то время как при использовании USB 2.0 потребуется уже 14 минут. Цена новинки в американской рознице равна $249.
Модель будет поставляться на территории США сразу с USB 3.0 кабелем (естественно, совместимым с предыдущей версией USB интерфейса), после подключения накопителя пользователь также найдёт на нём лицензионный фильм StarTrek. Продажи по всему миру назначены на конец текущего года.
Появились результаты первых тестов производительности процессоров Intel Sandy Bridge
Данный процессор Intel Sandy Bridge носит маркетинговое название Core i52400 и работает на штатной частоте 3,1 ГГц. Такой чип не обладает поддержкой технологии Turbo Boost, но обеспечивает поддержку HyperThreading, хотя серийные устройства лишатся такой поддержки. В процессоре Intel Sandy Bridge используется графическое ядро, расположенное на одном чипе с вычислительными ядрами, также для всех ядер предусмотрено использование общей кэш vronline | сентябрь 2010
11
Hard-News
памяти третьего уровня. Производительность такого графического ядра сопоставима с видеочипом AMD Radeon HD 5450.
Производительность процессора Intel Sandy Bridge Core i52400 по сравнению с современным чипом с аналогичной частотой 3,1 ГГц повышена, в среднем, на 10%. При этом новинка обладает более низким энергопотреблением и тепловыделением. Также, по предварительным данным, цена такого процессора будет несколько ниже. Так, если сравнивать процессор Sandy Bridge Core i52400 с чипами Intel аналогичного ценового диапазона, то прирост производительности достигает 23%.
Ноутбуки от HP с оригинальными улучшениями
Компания HP подготовила к выпуску несколько новых моделей потребительских ноутбуков, в которых реализованы улучшенные технологии воспроизведения трехмерного контента, воспроизведения звука и охлаждения компонентов устройств.
Модель HP ENVY 17 3D позиционируется в качестве первого 17 дюймового ноутбука, обладающего поддержкой воспроизведения стереоскопических изображений и содержащего привод Bluray и улучшенную акустическую систему. В новинке применяется 17,3 дюймовый дисплей 3D Ultra BrightView, который обладает поддержкой Full HD разрешения 1080p. Для просмотра стереоскопических изображений на таком дисплее пользователю необходимо использовать специальные очки с активным затвором с беспроводной синхронизацией. Такой ноутбук содержит высокопроизводительный 4ядерный процессор Intel Core i7, дискретную видеокарту ATI Mobility Radeon HD 5850, дисковую подсистему емкостью до 2 ТБ, оптический привод 3D Bluray и акустическую систему Beats Audio с сабвуфером HP Triple Bass Reflex. Также компания HP представила ноутбук ENVY 14 Beats Edition, в котором используется улучшенная акустическая система Beats Audio. Также новинка содержит производительный процессор Intel Core (модель не уточняется) и дискретную видеокарту ATI Mobility Radeon HD5650. Отмечается, что со стандартным аккумулятором данная модель способна работать в автономном режиме до 6,5 часов, а при использовании батареи увеличенной емкости – до 13 часов. В комплект поставки устройства включаются наушники Beats by Dr. Dre Solo Headphones.
vronline | сентябрь 2010
Автор: Игорь Антонов email: antonov.igor.khv@gmail.com
12
Кодинг
C#
Берем WEBкамеру под контроль «Раскрыть тайны. Показать все, что скрыто. Узнать только самое главное и интересное. Все это в программе….». Не подумай, это не реклама одной из известных телевизионных передач. Примерно так у меня ассоциируется тема сегодняшней статьи. Современный комп/бук тяжело представить без наличия WEB камеры. Видео чаты, скайп, youtube – изрядно стимулируют на использование подобных девайсов. А что? Заснял прикольный ролик с участием себя и Иринки из пятой квартиры и стал порно…, сорри, звездой. Идей применения – масса! Сегодня я хочу на реальных примерах показать, как заюзать самую стандартную web камеру по максимуму. Итак, как сказал Гагарин: «Поехали!».
На что еще сгодится камера?
WEBкамера – это девайс не только для видеоконференций и баловства. Немного творческого подхода и на ум невольно приходит несколько идей:
1. Видеоглазок. Я даже не знаю, можно ли отнести эту идею к разряду нестандартных. Про такой способ использования WEBкамеры я услышал еще в далеком 2002 году. Суть заключается в возможности применения камеры вместо дверного глазка. Монтируешь камеру к двери и раз и навсегда забываешь, что нужно отрывать задницу от компьютера, когда в твою дверь ктото настырно звонит. Открыл приложение, посмотрел лик негодяя и забил на подъем из мягкого и нагретого кресла. Скажу по секрету, такой способ я пробовал еще во времена своего недолгого студенчества. Реально удобно. 2. Детектор движения. И вот, обычная web камера легким движением руки превращается в бр… полноценный детектор движения. Идея просто как две копейки. Ставим камеру в нужное место (ничего пошлого и ругательного я не имел в виду) и при помощи хитрой тулзы делаем постоянное сравнение кадров. Если изображение начинает меняться, значит, враги проявляют активность и пора начинать бить
тревогу. Один из моих интернетзнакомых заюзал такой трюк для охраны гаража. Он просто взял захудалый комп, обеспечил ему выход в инет (благо сегодня организовать беспроводной доступ не проблема) и развесил по периметру камеры. Все камеры постоянно делают снимки и отправляют на комп, а там уже небольшая программа производит сравнение. При обнаружения сильных различий, комп спешил отрапортовать хозяину по email и sms. Неплохая идея, правда?
3. Камера видеонаблюдения. Эта идея также проста, но пользы от нее не меньше, чем от предыдущей. WEBкамера вполне сгодиться для организации системы видеонаблюдения. Профессиональных фишек (типичных для таких задач) из нее выжать вряд ли удастся, но организовать постоянную запись видео реально. Качество, конечно же, будет, не ахти, но для домашних целей хватит. Плохое качество видео несет не только минусы, но и плюсы. Один из них – сэкономленное на винте место. Кстати, если ты думаешь, что видеонаблюдение – это лишь игра, то глубоко заблуждаешься. Купив камеру покруче, реально без проблем организовать систему видеонаблюдения в своем офисе. Если ты начинающий предприниматель и у тебя каждая копейка на счету, то считай, что несколько убитых енотов сэкономлено. Видеонаблюдение, созданное своими руками, обойдется значительно дешевле. 4. Продвинутый логон в систему. В старых фантастических фильмах часто показывали как герои выполняют вход систему после того, как компьютер произведет сканирование их образа. Тогда это казалось чемто нереальным и выглядело потрясно, а сегодня такой эффект реально замутить у себя дома, потратив при этом 2030$ (цена дешевой webкамеры). А может даже не придется платить. Со многими буками уже идет весь необходимый софт. Установил, настроил и приготовься удивлять друзей. 5. Управление компьютером. Особые умельцы успешно юзают webкамеру для управления
vronline | сентябрь 2010
13
Кодинг
своим компом. Выглядит это примерно так. Настраивается специальный софт и производится базовое «обучение». После этого комп будет выполнять твои команды как дрессированный пес. Махнул ты рукой, а он сразу отдал тебе честь и запустил FireFox или еще чего. Идею ты понял, а если нет, то сбегай на youtube и посмотри соответствующие ролики (см. ссылки во врезке).
Первые досадные огорчения
Я был очень удивлен и растроен, когда узнал, что в великом и могучем .NET Framework напрочь отсутствует возможность взаимодействия с WEBкамерами (точнее простого взаимодействия). В четвертой версии ситуация вроде улучшилась (для SilverLight проектов точно появились соответствующие классы), но протестировать я их не успел. Пример для данной статьи я начал писать еще до официального выхода VS2010 и 4го дот нета. Уже было, отчаявшись, я полез в любимый гугл и подобно поисковой ищейки стал вбивать один запрос за другим. Вначале я исследовал лишь рунет. Результаты были бедноватыми. Все что удалось найти ссылки на MSDN и технологию DirectDraw. Я даже попробовал набросать простенький примерчик, но изза отсутствия опыта в работе с DirectDraw полоховски облажался. У меня получилось собрать совсем простенькое приложение, но я так и не смог выловить в нем все глюки. Закодить на раз два три приложение на основе данной технологии дело не простое!
Еще больше отчаявшись, я принялся сечить ресурсы наших западных товарищей. У них всегда есть чем поживиться. Проштудиров несколько десятков ссылок мне удалось нарыть много вкусностей. Среди них были всевозможные примеры и небольшие статейки (американцы не любят много писать). Мне даже удалось найти рабочий пример на основе DirectDraw, но когда я увидел код, то ужаснулся. Разобраться в нем новичку будет проблематично. Поэтому я решил с ним незаморачиваться, а попытаться найти способ проще. Не успев попрощаться с примером на DirectDraw, мне на глаза попался еще один. Автор примера закодил целую библиотеку для работы с webкамерами и другими устройствами видео захвата, используя технологию VFW (Video For Windows). Жаль, что проект автора (я про библиотеку) был максимально кастрирован. Все что она позволяла библиотека сделать вывести изображение с webкамеры. Ни захвата отдельных кадров, ни записи видео и других полезных нам фич не было. Тут мое шестое чувство взвыло и всячески
начало пытаться намекнуть, что этот проект именно то, что я искал. Не тратя драгоценное время на размышления, я решил залезть и покопаться в сорцах американского коллеги.
Не успел я беглым взглядом пробежаться по коду, как увидел имена знакомых winсообщений и не менее знакомых названий WinAPI функций. Когдато давнымдавно мне приходилось писать приложение для работы с webкамерой на Delphi. Тогдато я и столкнулся с этими функциями впервые. Соответствующих модулей для Delphi не было, поэтому пришлось мне портировать C++ код в царство дельфяндии. Эх, намучился же я тогда. Прошу прощения, чтото я немного отвлекся. Посмотрев сорцы, я решил написать свою версию библиотеки и снабдить ее нужным функционалом.
WinAPI в королевстве .NET
Взвод, готовность №1
Вполне возможно, что в одном компе/ноуте может быть несколько webкамер. За примером далеко ходить не надо. Мне по работе часто приходится организовывать простенькие видеоконференции. Обычно в них участвуют два человека. Каждого из участников снимает отдельная камера. Сами камеры подключены к моему компу. Когда я начинаю съемку, то выбираю в программе для работы с видеокамерами нужную в настоящий момент камеру. Раз уж мы решили взять камеру под контроль, то обязаны разобраться, как получать список установленных устройств видео захвата и произвести выбор того, с которым будем работать в настоящий момент. Для решения этой нехитрой задачи в WindowsAPI предусмотрена функция capGetDriverDescription(). Она принимает аж пять параметров: 1. wDriverIndex индекс драйвера видео захвата. Значение индекса может варьироваться от 0 до 9. 2. lpszName указатель на буфер, содержащий соответствующее имя драйвера
3. cbName размер (в байтах) буфера lpszName vronline | сентябрь 2010
14
Кодинг
4. lpszVer указатель на буфер, содержащий описание определенного драйвера.
5. cbVer размер буфера (в байтах), в котором хранится описание драйвера.
В случае успешного выполнения, функция вернет TRUE и FALSE в случае ошибки. Описание функции у нас есть, теперь посмотрим, как определить ее в C#. Делается это так: [DllImport("avicap32.dll")] protected static extern bool capGetDriverDescriptionA (short wDriverIndex, [MarshalAs(UnmanagedType.VBByRefStr)] ref String lpszName, int cbName, [MarshalAs(UnmanagedType.VBByRefStr)] ref String lpszVer, int cbVer);
Обрати внимание, что перед тем, как указать имя подключаемой функции, в обязательном порядке требуется написать имя DLL, в которой она определена. В нашем случае это avicap32.dll. Так, функция импортирована, теперь можно написать класс, в котором она будет использоваться. Весь код класса для получения списка устройств я приводить не стану, покажу лишь код ключевого метода:
public static Device[] GetAllCapturesDevices() { String dName = "".PadRight(100); String dVersion = "".PadRight(100); {
for (short i = 0; i < 10; i++)
if (capGetDriverDescriptionA(i, ref dName, 100, ref dVersion, 100)) { Device d = new Device(i); d.Name = dName.Trim(); d.Version = dVersion.Trim();
} }
}
devices.Add(d);
return (Device[])devices.ToArray (typeof(Device));
Код выглядит проще некуда. Самое интересное в нем место – цикл, в котором происходит вызов упомянутой выше функции capGetDriverDescription. Из MSDN мы знаем, что индекс (первый параметр функции capGetDriverDescription()) может варьироваться от 0 до 9, поэтому мы целенаправленно запускаем цикл в этом диапазоне. Результатом
выполнения метода будет массив классов Device (этот класс определил самостоятельно, см. соответствующие исходники). С получением списка устройств разобрались, теперь позаботимся об отображении видео потока с камеры. Тут нам сослужит хорошую службу функция capCreateCaptureWindow(), предназначенная для создания окна захвата.
Немного забегая вперед, скажу, что дальнейшие действия с камерой будут происходить путем банальной отправки сообщений окну захвата. Слух тебе не обманул, придется воспользоваться до боли знакомой windows программисту (особенно приколисту) функции SendMessage(). Теперь присмотримся повнимательнее к функции capCreateCaptureWindow(). Ей требуется кинуть шесть аргументов:
1. lpszWindowName Нультерминальная строка, содержащая имя окна захвата. 2. dwStyle стиль окна 3. x координата X 3. y координата Y
4. nWidth ширина окна
5. nHeight высота окна
6. hWnd handle родительского окна 7. nID идентификатор окна
Результатом выполнения функции будет handle созданного окна или NULL в случае ошибки. Поскольку эта функция также относится к WinAPI, то ее опятьтаки нужно импортировать. Код импортирования приводить не буду, т.к. он практически идентичен тому, что я писал для функции capGetDriverDescription(). Лучше сразу взглянем на процесс инициализации камеры: deviceHandle = capCreateCaptureWindowA(ref deviceIndex, WS_VISIBLE | WS_CHILD, 0, 0, windowWidth, windowHeight, handle, 0); if (SendMessage(deviceHandle, WM_CAP_DRIVER_CONNECT, this.index, 0) > 0) { SendMessage(deviceHandle, WM_CAP_SET_SCALE, -1, 0); SendMessage(deviceHandle, WM_CAP_SET_PREVIEWRATE, 0x42, 0); SendMessage(deviceHandle, WM_CAP_SET_PREVIEW, -1, 0); SetWindowPos(deviceHandle, 1, 0, 0, windowWidth, windowHeight, 6); }
В этом коде, сразу после создания окна производится попытка отправки сообщения WM_CAP_DRIVER_CONNECT. Результат выполнения больше нуля будет говорить об vronline | сентябрь 2010
15
Кодинг
успешности.
Представим, что сегодня боги на нашей стороне производим незамедлительную отправку нескольких сообщений: WM_CAP_SET_SCALE, WM_CAP_SET_PREVIEWRATE, WM_CAP_SET_PREVIEW. Увы, как и в случае с функциями, C# ничего не знает о существовании этих констант. Тебе опять придется определять их самостоятельно. Список всех необходимых констант с комментариями я привел в листинге 1. //Пользовательское сообщение private const int WM_CAP = 0x400; //соединение с драйвером устройства видеозахвата private const int WM_CAP_DRIVER_CONNECT = 0x40a; //разрыв связи с драйвером видеозахвата private const int WM_CAP_DRIVER_DISCONNECT = 0x40b; //копирование кадра в буффер обмена private const int WM_CAP_EDIT_COPY = 0x41e; //вклбчение/отключение режима предпосмотра private const int WM_CAP_SET_PREVIEW = 0x432; //включение/отключение режима оверлей private const int WM_CAP_SET_OVERLAY = 0x433; //Скорость previewrate private const int WM_CAP_SET_PREVIEWRATE = 0x434; //Включение/отключение масштабирования private const int WM_CAP_SET_SCALE = 0x435; private const int WS_CHILD = 0x40000000; private const int WS_VISIBLE = 0x10000000; //Установка callback функции для preview private const int WM_CAP_SET_CALLBACK_FRAME = 0x405; //Получение одиночного фрейма с драйвера видеозахвата private const int WM_CAP_GRAB_FRAME = 0x43c; //Сохранение кадра с камеры в файл. private const int WM_CAP_SAVEDIB = 0x419; Необходимые константы
Дальнейшее описание класса для работы с web камерой я опущу. Каркас я рассмотрел, а со всем остальным разберешься в хорошо прокомментированном исходнике. Единственное, что я не хотел, бы оставлять за кадром – пример использования библиотеки. Всего в библиотеке я реализовал (точнее дописал) пару методов: GetAllDevices (уже рассматривали), GetDevice (получение драйвера устройства виде озахвата по индексу), ShowWindow (отображение изображения с web камеры), GetFrame (захват отдельного кадра в графический файл) и GetCapture (захват видео потока).
В качестве демонстрации работоспособности изготовленной либы я набросал небольшое приложение (см. соответствующий скриншот). На форме я расположил один компонент ComboBox (используется для хранения списка имеющихся устройств видео захвата) и несколько кнопок – «Обновить», «Пуск», «Остановить» и «Скриншот». Ах да, еще на моей форме пестреет компонент Image. Его я применяю для отображения видео с камеры
Разбор полетов начнем с кнопки «Обновить». По ее нажатию я получаю список всех установленных устройств видео захвата. Начинка этого обработчика события: Device[] devices = DeviceManager.GetAllDevices(); foreach (Device d in devices) { cmbDevices.Items.Add(d); }
Правда, просто? Разработанная нами библиотека берет на себя все черную работу и нам остается лишь наслаждаться объектно ориентированным программированием. Еще проще выглядит код для включения отображения видео потока с камеры: Device selectedDevice =
DeviceManager.GetDevice(cmbDevices.SelectedInd ex); selectedDevice.ShowWindow(this.picCapture); Опять же, все проще пареной репы. Ну и теперь взглянем на код кнопки «Скриншот»: Device selectedDevice =
DeviceManager.GetDevice(cmbDevices.SelectedInd ex); selectedDevice.FrameGrabber();
Я не стал уделять особого внимания методу FrameGrabber(). В моем исходнике вызов метода приводит к сохранению текущего кадра прямо в корень системного диска. Поступать так в реальном приложении нельзя, не забудь внести все необходимые поправки.
Камера под нашим контролем
Делаем фотки одной кнопкой
vronline | сентябрь 2010
16
Кодинг
Готовность № 3
Теперь настало время поговорить о том, как соорудить простенькую, но надежную систему видео наблюдения. Обычно, такие системы базируются на основе двух алгоритмов: различие двух фреймов и простое моделирование фона. Их реализация (код) достаточно объемная, поэтому в самый последний момент я решил пойти по более простому пути. Под легким путем подразумевается использованием мощного, но пока малоизвестного фреймворком для .NET AForge.NET. AForge.NET в первую очередь предназначен для разработчиков и исследователей. С его помощью, девелоперы могут существенно облегчить свой труд при разработке проектов для следующих областей: нейросети, работа с изображениями (наложение фильтров, редактирование изображений, попиксельная фильтрация, изменение размера, поворот изображения), генетика, робототехника, взаимодействие с видео устройствами и т.д. С фреймворком поставляется хорошая документация. В ней описаны абсолютно все возможности продукта. Не поленись хорошенько с ней ознакомиться. Особенно мне хочется отметить качество кода этого продукта. Все написано цивильно и копаться в коде – одно удовольствием.
motionAlarmLevel )
if ( motionLevel > {
flash = (int)
( 2 * ( 1000 / alarmTimer.Interval ) ); } if ( detector.MotionProcessingAlgorithm is BlobCountingObjectsProcessing ) {
BlobCountingObjectsProcessing countingDetector = (BlobCountingObjectsProcessing) detector.MotionProcessingAlgorithm; objectsCountLabel.Text = "Objects: " +
countingDetector.ObjectsCount.ToString(
);
} else {
= "";
} }
objectsCountLabel.Text
}
Теперь вернемся к нашей непосредственной задаче. Скажу честно, средствами фреймворка она решается как дважды два. "Тогда зачем ты мне парил мозг WinAPI функциями?" – недовольно возразишь ты. А за тем, чтобы ты не был ни в чем ограничен. Сам ведь знаешь, что проекты бывают разные. Гдето удобней применить махину .NET, а где проще обойтись старым добрым WinAPI. Вернемся к нашей задачке. Для реализации детектора движений нам придется воспользоваться классом MotionDetector из вышеупомянутого фреймворка. Класс отлично оперирует объектами типа Bitmap и позволяет быстренько вычислить процент расхождения между двумя изображениями. В виде кода это будет выглядеть примерно так так:
Сэр, посторонних движений не обнаружено!
MotionDetector detector = new MotionDetector( new TwoFramesDifferenceDetector( ), new MotionAreaHighlighting( ) ); //Обработка очередного кадра if ( detector != null ) { float motionLevel = detector.ProcessFrame( image );
Ахтунг!!!!!!! Обнаружено проникновение на территорию!
vronline | сентябрь 2010
17
Кодинг Вышеприведенный код (не считая инициализацию класса MotionDetector) у меня выполняется при получении очередного кадра с webкамеры. Получив кадр, я выполняю банальное сравнение (метод ProcessFrame): если значение переменной motionlevel больше motionLevelAlarm (0.015f), то значит надо бить тревогу! Движение обнаружено. На одном из скришотов хорошо видна работа демонстрация детектора движений. В момент, когда кадры начинают различаться.
Готовность №4
Помнишь, в начале статьи я говорил, что Web камеру можно запросто приспособить для распознавания лиц и создания продвинутого способа логона в систему? Если, переварив весь этот материал, думаешь, что это сложно, то ты ошибаешься! В конце марта на сайте http://codeplex.com (хостинг для OpenSource проектов от MS) появился пример (а затем и ссылка на статью), демонстрирующий реализацию программы для распознавания лиц с использованием WEBкамеры. Сам пример базируется на использовании новых возможностей .NET и SilverLight. Разобрать этот пример в рамках журнальной статьи нереально, т.к. автор исходника действительно постарался и все сделал максимально шикарно. Тут тебе и алгоритмы для работы с изображениями (фильтр размытия, уменьшения шума, попиксельное сравнение, растяжка и т.д.) и демонстрация новинок SilverLight и много чего еще. Одним словом must use! Ссылку на проект и статью ищи во врезке.
Дополнительные ссылки:
http://video.aol.com/videodetail/webcammouse control/2225590454 Видео, демонстрирующее управление компом при помощи WEBкамеры.
http://www.youtube.com/watch?v=L476V10Ozi0&feature =related – Управляем компом при помощи ручки фонарика и WEBкамеры. Очень интересная идея, автор которого демонстрирует несколько способов применения WEBкамеры в качестве инструмента управления компьютером. http://blogs.msdn.com/rucoding4fun/archive/2010/04/02/f acelightsilverlight4.aspx Русская версия статьи "Silverlight 4 realtime Face Detection" (Распознавание лиц в реальном времени при помощи SilverLight).
http://facelight.codeplex.com/ здесь хостится проект "Facelight", позволяющий распознавать лица в реальном времени. Если ты собрался закодить серьезную софтину для определения лиц или логона в систему, то посмотреть на этот проект просто обязан. http://www.aforgenet.com/framework/ тут ты найдешь AForge .NET отличный и простой в использовании фреймворк для работы с видео, изображениями и т.д.
http://vronline.ru – все исходники примеров, а также кучу дополнительной информации ты можешь слить с сайта проекта VROnline.
Конец фильма
Приведенные в статье примеры послужат тебе хорошей отправной точкой. На их основе легко сварганить как профессиональную утилиту для работы с webкамерой, поднимая на ее продаже несколько сотен баксов или написать хитрого и злобного троянашпиона.
Вспомни статью про бэкап Skypeбесед. В ней я говорил, что времена клавиатурных шпионов уже прошли. Сейчас особенно актуальны аудио и видеоданные. Эту статью можно рассматривать как своеобразное предложение. Как перехватить аудио ты уже должен знать, а теперь еще узнал, как работать с webкамерой. Если учесть, что сегодня webкамера обязательный атрибут любого ноутбука, то нетрудно представить, сколько "интересного" видео ты сможешь заснять, подсунув жертве «полезную программку» Учти, я тебе этого не говорил :) Удачи в программировании, будут вопросы пиши.
vronline | сентябрь 2010
Автор: Дмитрий Мгали aka alfenius http://vronline.ru/users/alfenius
18
Кодинг
C# Бинарные деревья поиска
В программировании, деревом называется динамическая структура данных, где каждый элемент имеет несколько ссылок или на один элемент ссылается несколько других. В этой структуре данных есть «корень», «узлы» и «листья». Вот как работать с такими деревьями мы поговорим в этой статье.
Немного теории
Примеры бинарных деревьев
На рисунке приведены примеры бинарных деревьев поиска. Как видно из рисунка, деревья могут отличаться, хотя и содержат одинаковые элементы. На это влияет разная последовательность ввода ключей.
Довольно широкое применение получила данная структура данных. Например, в файловой системе ReiserFS операционной системы linux используется концепция бинарных деревьев. Давай, попробуем описать подобную структуру при помощи языка C#:
Основные элементы бинарного дерева
У любого элемента дерева может быть только один непосредственный предок. В бинарном дереве, каждый узел хранит указатели на двух потомков, которых называют левым и правым. Свойством бинарного дерева является то, что имея в качестве корня произвольный элемент, мы можем обращаться к искомому элементу за Log(N) (поверьте, это очень быстро).
Важное свойство дерева в левом поддереве содержатся ключи, меньше ключа корня, а в правом ключи больше корневого. В бинарном дереве поиска нет двух элементов с одинаковыми ключами, если требуется выполнение этого условия, то можно вести подсчет одинаковых ключей. Ключами в бинарном дереве могут быть любые элементы, я рассмотрю случай с целыми числами
public Elem( int val ) { Key = val; //ключ добавляемого узла Left = null; //левое поддерево Right = null; //правое поддерево }
Если ты знаком с линейными списками, то с пониманием структуру не возникнет проблем, а если нет, то крайне рекомендую почитать соответствующую литературу. Ок, предположим, что с пониманием линейных списков у тебя все хорошо, а раз так, то перейдем к рассмотрению функции добавления нового узла: void _AddElement( Elem R, int val ) { // ключи не должны повторятся, поэтому ставим проверку if ( val == R.Key ) return;
vronline | сентябрь 2010
19
Кодинг //если добавляемый ключ больше корня, добавляем в правое поддерево //как мы обсуждали выше в левом поддереве содержатся маленькие //ключи, а в правом большие и все это по отношению к корню if ( val > R.Key ) { //если правое поддерево не содержит листьев, создаем //узел, иначе правое поддерево не нулевое, используем //рекурсию и отыскиваем последний узел для добавления if ( R.Right == null ) R.Right = new Elem( val ); else _AddElement( R.Right, val ); } //ключ меньше корня, добавляем в левое поддерево //тут все аналогично! else { if ( R.Left == null ) R.Left = new Elem( val ); else _AddElement( R.Left, val ); } }
Удаление узла с двумя дочерними элементами
Этот случай является самым сложным, потому что мы не можем заставить родителя удаленного узла указывать на оба дочерних элемента удаляемого узла. Дерево должно остаться двоичным деревом, и поисковые свойства должны остаться неповрежденными. Есть несколько способов выполнить такое удаление. Метод, которым мы воспользуемся, не удаляет узел, а заменяет его информацию, информацией из другого узла дерева так, чтобы поисковые свойства были сохранены. После этого мы удаляем необходимый узел. Давайте посмотрим, как это происходит. Удаляем узел, изменяя одну из ссылок его родителя (смотри рисунок 5). Мы можем замещать удаляемый узел либо с левого поддерева самым правым узлом (т.е. самым большим ключом), либо с правого поддерева самым левым узлом (т.е. самым маленьким ключом).
Обрати внимание на функцию поиска, она самая простая. Мы будем возвращать указатель на элемент, содержащий искомый ключ или null, если искомого ключа нет в дереве: void _FindElement( Elem R, int val ) { if (R == null) return null; //дерево пустое if (R.key == val) return R; //искомый ключ найден //ищем в левом поддереве, потому что искомый ключ меньше корня if (R.key > val) return _FindElement(R.left, val); //ищем в правом поддереве, потому что искомый ключ больше корня if (R.key < val) return _FindElement(R.right, val); }
Все, самое простое позади. Теперь посмотрим, как делается удаление. Операция удаления наиболее сложная из операций бинарного дерева поиска. Не трудно найти удаляемый элемент, сложнее всего перекинуть ссылки после удаления элемента.
Удаление узла имеющего 2 поддерева
Дерево выросло, дерево срубили
Бинарные деревья поиска – очень интересная тема. Любой уважающий себя программист должен представлять себе что это такое и как этим пользоваться. Возможно, тебе не приходилось сталкиваться с деревьями ранее, но это не говорит, что тема должна пройти мимо тебя. Обязательно потрать немного времени и разберись с данным предметом основательно. Удачи!
Удаление узла
vronline | сентябрь 2010
Автор: Поротников Андрей aka wwwnet
20
Кодинг
C#
Tips & Tricks
Элегантное сохранение параметров приложения
Много статей посвящено удобству пользовательского интерфейса. И расположение компонентов, и цвета – оказывается, все имеет значение. Также зачастую возникает необходимость сохранить какиенибудь параметры приложения, например, расположение формы и ее размеры. Для этого уже в мире .Net реализована специальная возможность и в данной статье я ее рассмотрю. Думаю, это будет полезно для тех, кто изобретает свои велосипеды там, где они не требуются (например, сохранение параметров в реестре).
Без комментариев. Получаем следующее:
Для начала требуется зайти в настройки проекта (Проект > Свойства). На вкладке «Параметры» есть таблица, в полях которой и можно настроить параметры, которые необходимо сохранять. Поле таблицы «Имя» предназначено для задания идентификатора параметра (удивительно, правда?). С полем «Тип» тоже все понятно. Причем для параметров можно задавать самые различные типы как простой byte, так и такие специфические типы, как Exception.
Теперь немного кода. Для начала нужно подключить пространство имен с параметрами приложения. В моем случае данная строка выглядит так:
.NET всегда к нашим услугам
Для нашего примера требуется четыре параметра типа int. Поле «Область» указывает на то, где будет располагаться файл с сохраненными параметрами. Если в качестве значения стоит «Пользователь», то файл сохраняется в профиле пользователя. В моем случае полный путь к нему следующий:
C:\Users\user\AppData\Local\Example\SaveParamsE xample.vshost._Url_hkimbsrx4btk1hbbv0r23trl354c idvh\1.0.0.0\user.config.
Данный файл используется для хранения пользовательских настроек. Если же в качестве значения установить «Приложение», то параметры будут сохраняться в файле ApplicationName.exe.config в папке приложения. Причем следует учесть тот факт, что пользователь не может менять данные параметры. Исходя из этого, в примере этому полю для всех строк ставим значение «Пользователь». Последнее поле – «Значение».
using SaveParamsExample.Properties;
Затем, в обработчике загрузки формы напишем следующий код: private void Form1_Load(object sender, EventArgs e) { this.Top = Settings.Default.Top; this.Left = Settings.Default.Left; this.Height = Settings.Default.Height; this.Width = Settings.Default.Width; }
Из данного кода следует, что для доступа к созданному нами параметру используется строка вида Settings.Default.<ИмяПараметра>. Для сохранения новых параметров создаем обработчик события FormClosed и набираем в нем: private void Form1_FormClosed(object sender, FormClosedEventArgs e) { Settings.Default.Top = this.Top; Settings.Default.Left = this.Left; Settings.Default.Height = this.Height; Settings.Default.Width = this.Width;
vronline | сентябрь 2010
21
Кодинг Settings.Default.Save(); }
Эпилог
Вот таким простым образом и осуществляется сохранение параметров приложения. Полученный в результате сохранения конфигурационный файл представляет собой обычный XML файл. Пример содержимого такого файла ниже: <?xml version="1.0" encoding="utf-8"?> <configuration> <userSettings> <SaveParamsExample.Properties.Settings> <setting name="Top" serializeAs="String"> <value>237</value> </setting> <setting name="Left" serializeAs="String"> <value>373</value> </setting> <setting name="Height" serializeAs="String"> <value>300</value> </setting> <setting name="Width" serializeAs="String"> <value>400</value> </setting> </SaveParamsExample.Properties.Settings> </userSettings> </configuration>
vronline | сентябрь 2010
Автор: Антон Козлов aka Jimmy Jonezz Email: jimmyjonezz@bk.ru
22
Кодинг
Processing
«Записки начинающего художника» Часть 1.
Программирование – это искусство, и любой разработчик в какойто мере творец и создатель. Для художника, творца и созидателя необходимо иметь полотно и инструмент для реализации своих идей, фантазий и прочих замыслов. Processing, как наиболее подходящий для этого инструмент, на мой взгляд, заслуживает более пристального внимания.
В предыдущей статье, мы начали знакомство с Processing, и сегодня я хотел бы продолжить свой небольшой экскурс. Как и в предыдущем вступлении, я не стану забегать далеко вперед и шпиговать тебя большим количеством строк кода. Данный урок служит неким повторением предыдущего, но некоторые новые моменты я
все, же затронул, и, что это будет, читай ниже.
Создаем скетч
Сегодня создадим скетч, который послужит нам неким подобием графического редактора с минимум возможностей. Подобные «картины» (образец я привел выше) мы будем создавать с помощью манипулятора мышь. При разработке программы необходимо учесть следующее: 1. Чем меньше скорость движения мыши, тем меньше круги и наоборот; толщина линий будет иметь такую же зависимость.
2. Основной цвет закраски красный, но будет меняться лишь его интенсивность насыщения, от светлых тонов до темных. 3. При нажатии на левую кнопку мыши, будем прорисовывать линию, но кроме этого от кончика курсора будут прорисовываться две линии (это сделано для дополнительного эффекта). Оставим лишние разглагольствования и приступим к делу. Функция setup(), будет
содержать лишь основные инструкции: размеры окна, цвет фона и функцию, определяющую сглаживание объектов. /* переменная, которая будет содержать значение скорости движения мыши */ float Mspeed; void setup() { //размеры окна size(800, 200); //закрашиваем фон полотна белым цветом background(255); //сглаживание линий включено smooth(); }
Идем дальше. Системные переменные «pmouseX» и «pmouseY» содержат данные о горизонтальном и вертикальном положении мыши, в предыдущем кадре до текущего кадра. Данные переменные, внутри функции draw() обновляются лишь один раз, но внутри события мыши, они обновляются каждый раз, когда срабатывает событие.
Используй переменные «pmouseX» и «pmouseY» внутри функции draw(), если хочешь получать значения по отношению к предыдущему кадру. Применение «pmouseX» и «pmouseY» внутри функции мыши позволит получить непрерывное реагирование, всякий раз, при использовании манипулятора мышь. Это необходимо учитывать, т.к. мы высчитывать скорость движения мыши. Умышленно, не стану подробно приводить разъяснения кода, приведенного в Листинге 1, т.к. надеюсь, тебе будет интересно покопаться в нем самостоятельно (кодокопание – лучший способ научиться программировать – прим. редактора). Единственное, я привел подробные комментарии и поэтому сложностей в понимании кода возникнуть не должно. Листинг 1.
void draw() { //вычисляем абсолютное значение Mspeed=abs(mouseX-pmouseX); //выводим информацию о значении скорости
vronline | сентябрь 2010
23
Кодинг мыши в debug-окно println(Mspeed); //цвет линий отключен noStroke(); //дублируем значение «Mspeed» в переменную «taille_ellipse» float taille_ellipse = Mspeed; //определяем цвет для эллипса и заносим в переменную «ellipse_color» color ellipse_color = color(150+random(0,100), random(0,21), random(0,21)); //задаем цвет окрашивания fill(ellipse_color); //рисуем эллипс (круг) ellipse(mouseX+random(-20,20),mouseY+random(20,20), taille_ellipse, taille_ellipse); //кнопка мыши нажата? if (mousePressed == true) { //толщина линий или обводки фигур strokeWeight(0.1+Mspeed/20); //задаем цвет для линий или обводки фигур stroke(0, 50); strokeWeight(0.1+Mspeed/20); //рисуем линию line(mouseX, mouseY, width, mouseX); //рисуем линию line(mouseX, mouseY, 0, mouseX); stroke(0); //толщина линии (зависимость от скорости) strokeWeight(0.5+Mspeed/20); //рисуем линию line(pmouseX, pmouseY, mouseX, mouseY); } }
Наверняка у тебя появится желание запечатлеть, результаты работы своего скетча. Для того чтобы сохранить содержимое полотна на жесткий диск, как изображение, существует несколько способов. Я подробно опишу те, что мне известны, а ты в свою очередь сможешь выбрать, какой лучше подходит для тебя. Сохранение производится посредством функции saveFrame(). Без указания параметров она сохранит изображение, с названием «screen ####.TIF». Чтобы сохранить изображение по какомулибо событию (нажатие клавиши, щелчок мышки и т.д.) необходимо отловить данное событие. Например, внутри функции draw(), напишем следующую конструкцию, которая сработает, по факту нажатия любой клавиши: if (keyPressed == true) { saveFrame(); }
возможность существует. Взгляни на конструкцию ниже: void keyPressed(){ //это клавиша «s» была нажата? if (key == 's') { //выводим дополнительную информацию println("Сохранение..."); //задаем название сохраняемого изображения saveFrame("Изображение-####.png"); println("Сохранено."); //закрашиваем фон } if (key == 'c') { background(255); } }
В данном случае, я определяю символ (одинарные кавычки назначают тип «char», двойные «string» – прим. автора) нажатой клавиши. Функция «println()» выведет сообщение в Debugокно (каретка спускается на следующую строку – прим. автора), а вот для функции «saveFrame()» требуется указать параметры, а именно: название сохраняемого изображения, где наличие символа «#» укажет количество цифр; и не забудь про расширение. Далее, снова выводим сообщение, что файл сохранен, и, наконец закрашиваем экран белым цветом. Для последней функции background(), я назначил отдельную клавишу. В данном случае это будет работать как очистка экрана. Вот и все
На данный момент это все, что я хотел рассказать. В следующем номере журнала, я продолжу знакомить тебя с Processing. Как обычно, в конце статьи я приготовил ряд «вкусных» ссылок, на интересные работы «художников», использующих Processing. Свои предложения и пожелания, а также вопросы, направляй мне, или же на форум нашего сайта. Дополнительные ссылки:
Официальный сайт: http://www.processing.org/ Гуру Processing’a – www.flight404.com
Коллекции программ – www.screamyguy.net
Я считаю, этот способ не целесообразным к применению, но его использование, в ряде случаев будет полезно. Если ты хочешь «отлавливать» определенные клавиши или комбинацию клавиш, то тут я бы посоветовал лучше воспользоваться другим способом.
Предлагаю применить событие, которое определяет нажатие клавиши, а уж потом разбираться какая клавиша была нажата. Благодаря наличию функции keyPressed(), такая vronline | сентябрь 2010
Автор: Антонов Игорь aka Spider_NET Email: antonov.igor.khv@gmail.com
24
Кодинг
Delphi
Delphi и DNS.
С легкостью получаем DNSзаписи
На работе у меня периодически возникает необходимость в получении различных DNS записей. Например, при поднятии корпоративного почтовика мне пришлось вдоволь пообщаться и познакомиться с нюансами DNS. После редактирования/создания DNSзаписей нужно проверять, обновились ли записи на dnsсервере или нет. Это совершенно несложная операция и в составе операционных систем имеются соответствующие консольные тулзы, но поскольку пользоваться ими приходится не часто, я стал забывать параметры, которые нужно им передавать. Я понимаю, что в таких ситуациях недолго и браузер с гуглом дернуть, но мне захотелось написать простенькую тулзу с user friendly интерфейсом. Об этом подвиге и пойдет речь дальше.
Немного предыстории
Я уже сказал, что получить содержание определенных dnsзаписей вполне реально при помощи имеющихся в операционной системе консольных утилит. Если ты пользуешься Windows, то для получения MX записи (или любой другой) определенного домена достаточно воспользоваться консольной утилитой nslookup: nslookup –type=mx vr-online.ru
параметр type:
nslookup –type=A vr-online.ru
Остальные dnsзаписи получают аналогичным образом. Если ты предпочитаешь пользоваться unixlike системами, то, конечно же, никакого nslookup'а там нет. Зато в их составе есть утилита host. Пользоваться ей ничуть не сложнее, чем nslookup'ом в Windows: host –t mx vr-online.ru Почему эти инструменты мне не нравятся?
Я уже говорил, но повторюсь. В первую очередь меня не устраивает, что при необходимости получения dnsзаписи требуется запускать терминал/командный интерпретатор и вводить команду. Не знаю почему, но, я постоянно забываю дописывать к nslookup параметр type. Каждый раз приходиться лезть в хелп или в инет. Чтобы избавиться от этих рутинных действий я потратил пять минут времени и написал на Delphi небольшую утилиту. С тех пор, для получения информации о DNSзаписях я пользуюсь сугубо ей.
Пять минут – это реально пять минут
Моя фраза, что для создания программы потребуется не больше пяти минут – ничуть не преувеличена. В составе Delphi идет прекрасная библиотека компонентов Indy. Она содержит кучу компонент для работы с различными сетевыми службами: gopher, ftp, irc, dns и т.д. В рамках сегодняшней статьи нам предстоит воспользоваться компонентом для взаимодействия с dns серверами.
Дизайним форму – 2 минуты Рисунок 1. Результат выполнения nslookup
Результат выполнения команды я привел на рисунке 1. Как видно из содержания рисунка, почта vronline доставляется через сервера Google. Для того чтобы получить другой тип записи (например, A) достаточно изменить
Начнем делать наш простенький проект с создания главной формы окна. Я не стал делать чегото сверх красивого, а обошелся самым простым вариантом (см. рисунок 2). На форму я бросил два компонента TEdit. В первый будем вбивать домен, записи которого требуется получить. Во второй, адрес DNS
vronline | сентябрь 2010
25
Кодинг
нужно доставить почту (mail destination). В настоящее время MD записи не применяются. Используй MX;
qtMF – отправитель почты. В настоящее время опять же не используется. Применяется MX; qtName – каноническая запись имени (псевдоним); qtSOA – начальная запись зоны. Она указывает сервер, на котором храниться эталонная информация о домене; сервера, к которому должна подключаться наша программа и отправлять запросы на получения определенных записей. Рисунок 2. Форма будущей программы
Поскольку DNSзаписи бывают разными, нам требуется предоставить пользователю право выбора. Хочет он получить MX запись – пусть себе получает. Так называемое право выбора я реализовал путем добавления компонента TComboBox. В его свойство Items я сразу же занес типы DNSзаписей. Для своего примера я указал: MX, A, SOA и NS. Ты можешь расширить этот список (предварительно посмотри типы записей, с которыми умеет работать соответствующий компонент из библиотеки Indy), но мне достаточно и этих.
Результаты выполнения запроса я буду выводить в RichBox. Ты можешь поступить точно также или же воспользоваться тем компонентом, который тебе больше нравится. Ну и теперь самое главное – компонент, при помощи которого мы и будем получать DNS записи. В библиотеке Indy за работу с DNS серверами отвечает компонент TIdDNS Resolver.
Немного про TIdDNSResolver
Перед тем как начать писать код, немного познакомимся с компонентом TIdDNSResolver. Всетаки он будет выполнять главную роль. Итак, для начала рассмотрим свойства компонента, а потом перейдем к методам.
Свойства
AllowRecursiveQueries:boolean; свойство определяет, должен ли сервер продолжать обрабатывать запросы клиента, которые требуют получения записей с другого dnsсервера. По умолчанию значение установлено в true. QueryRecords:TqueryType; в этом свойстве определяется список записей, информацию по которым необходимо получить. В качестве записей могут быть:
qtA – адрес хоста;
qtMD – конечные адрес, по которому
qtNS – авторитетный name сервер;
qtMB – почтовый ящик доменного имени; qtMG – член почтовой группы;
qtMR – запись указывает почтовый ящик, соответствующий другому почтовому ящику.
qtWKS – запись Wellknown Service содержит перечень распространенных служб TCP/IP, поддерживаемых определенным протоколом (TCP/UDP) на конкретном IP адресе.
qtPTR – указатель на доменное имя; qtHINFO – информация о хосте;
qtMINFO – определяет почтовый ящик стороны, ответственный за почтовый ящик или список рассылки;
qtMX – запись указывает почтовый сервер, принимающий почту для текущей зоны. qtTXT – дополнительная информация о зоне;
qtSTAR – все типы записей;
QueryResult:TQueryResult; в данном свойстве содержится коллекция с результатами выполнения запроса к dnsсерверу.
Host:string; адрес dnsсервера с которым будет устанавливаться соединение;
Методы
procedure Resolve (ADomain:string); метод выполняет запрос на получение данных о выбранных dnsзаписях с dnsсервера для домена, переданного в качестве параметра.
Собственно говоря, это единственный метод, который нас интересует. На этом считаю, что знакомство с компонентом TIdDNSResolve окончено. Переходим к коду.
Пишем код – 2 минуты
С основным компонентом мы познакомились, теперь пришло время для написания кода. Создай обработчик события OnClick для кнопки, по нажатию которой будет выполняться соединение с DNSсервером и отправка запроса для получения определенных записей и напиши в нем код из листинга 1. vronline | сентябрь 2010
26
Кодинг Листинг 1. Основной код
var i:integer; begin DNSResolver.Host := DnsServerEdit.Text; case RecordTypeComboBox.ItemIndex of 0: DNSResolver.QueryType := [qtMx]; 1: DNSResolver.QueryType := [qtA]; 2: DNSResolver.QueryType := [qtSOA]; 3: DNSResolver.QueryType := [qtNS]; end; DNSResolver.Resolve(DomainEdit.Text); with DNSResolver.QueryResult do for i:=0 to Count-1 do if (Items[i] is TARecord) then RichEdit1.Lines.Add((Items[i] as TARecord).IPAddress) else if (Items[i] is TMXRecord) then RichEdit1.Lines.Add((Items[i] as TMXRecord).ExchangeServer) else if (Items[i] is TNSRecord) then RichEdit1.Lines.Add((Items[i] as TNSRecord).HostName) else if (Items[i] is TSOARecord) then RichEdit1.Lines.Add((Items[i] as TSoaRecord).Primary) end;
В самом начале листинга я присваиваю свойству host компонента DNSResolver адрес DNS сервера, который введен в поле ввода с именем DNSServerEdit. Затем, я определяю, какие dns записи меня интересуют. Поскольку все возможные DNSзаписи у меня определены в ComBox, я просто сравниваю индекс выбранного в настоящее время элемента. Если он равен нулю, то значит, меня интересует тип записи MX. С определением остальных записей ситуация аналогичная.
1. Заглянуть в документацию на официальном сайте; 2.
Посмотреть исходники компонента;
Мне проще воспользоваться вторым способом.
Рисунок 3. Программа в действии
Заключение
На этом сегодняшний урок подошел к концу. Надеюсь, он оказался тебе полезным. Если появятся вопросы, не стесняйся, пиши мне на email. Удачи в кодинге, увидимся!
Определив типы записей, информацию по которым нам требуется получить, я вызываю метод Resolve(). В качестве параметра я передаю текст, введенный в поле DomainEdit. По хорошему, в нем должно быть введено имя домена, информацию о котором хотим получить. После вызова метода, я начинаю перебирать коллекцию с результатами и выводить их в RichEdit. На первый взгляд вывод результатов выглядит хитро, но это только на первый. На самом деле все просто. Поскольку результаты попадают в коллекцию, то сразу напрашивается вывод – чтобы перебрать всю коллекцию элементов необходимо воспользоваться циклами. Запускаем цикл и в нем выполняем проверку. Если текущий элемент является классом TMXRecord (как пример), то значит, нам надо считать значение свойства ExchangeServer. Остальные проверки работают по такому же принципу. Стоп, а как узнать свойство, которое нужно считывать у класса, соответствующего определенной dnsзаписи? Тут есть несколько выходов:
vronline | сентябрь 2010
Автор: Антонов Игорь aka Spider_NET Email: antonov.igor.khv@gmail.com
27
Кодинг
Delphi
trojan.winlock. Осваиваем вирусмейкерство
Твою мать! Я опять хватанул эту заразу! Fuck, shit! Примерно так каждый из нас ругается в очередной раз, подхватив популярную малварь типа Winlocker. Сегодня вирусы такого типа как чума в средневековье. Хватануть их легко, а лечить проблематично. Что говорить, даже самые матерые маги клана «антивирус» не всегда способны дать оперативный отпор мерзопакостной заразе. А ведь 99% этих творений написаны школьниками, которые едва едва научились кодить. В этой статье я постараюсь доходчиво разжевать все тонкости разработки ужасных винлокеров.
Как происходит заражение
Не будем сразу лезть в кодерские дебри, а разберемся, с теорией. Самым первым делом рассмотрим типичные варианты заражения. Способов заразиться – чрезвычайно много. Наибольшей популярностью пользуются:
1. Баги браузеров. Не для какого не секрет, что одна из целей современного вирусописателя браузер пользователя. Полезных webсервисов пруд пруди и пользователи, конечно же, ими пользуются. Браузер для многих самая часто используемая программа, которая очень редко закрывается (прим. автора – у меня вообще не закрывается).
Не надо ходить к гадалке и спрашивать ответ на вопрос: «Через какую дверь лучше всего прорваться в систему пользователя?». Тут и так ясно – нужно заюзать уязвимости в самых популярных браузерах. Чтобы провернуть этот способ на практике – не нужно обладать особым интеллектом. Достаточно пробежаться по securityсайтам, найти соответствующий exploit и красиво оформить его под свои нужды. Быстро, просто и бесплатно. 2. Здравствуй бажный Flash. В последние месяцы, компания Adobe лажает максимально круто. Не успеют выпустить новую версию flash плеера, как хакеры умудряются обнаружить в ней критическую уязвимость. Находят, тыкают разработчиков носом, а те не спешат их (или не могут?) исправлять. Глупо полагать, что
вирусописатели будут сидеть на месте и ждать, когда же залатают багу. Они не дремлют и пытаются эксплуатировать уязвимость в коростных целях. Вот так и выходит, что после просмотра забавного ролика, твоя система начинает вести себя странно.
3. Пользовательская наивность. Когда я начинал готовить эту статью, то ради эксперимента загрузил ОС в виртуальной машине и попробовал побродить по «сомнительным» сайтам. Не поверишь, но я умудрился три раза подхватить Winlocker, согласившись на установку «последней версии» flash плеера и «специальных» кодеков. Честно говоря, я был немного в шоке, т.к. думал, что подобные способы уже не канают, а нет…
На чем будем кодить
Я долго думал, на каком языке, писать примеры к данной статье, и решили вспомнить хорошо проверенный временем Delphi. «Так у тебя же exe'шник получится под мегабайт!» возразишь ты. Отчасти твоя, правда, но эту проблему мы решим еще на стадии зарождения. Весь код будет приведен на чистом API. Соответственно, скомпилированный проект будет весить меньше 100 килобайт. А если по нему пройтись архиватором байт кода, то удастся скинуть еще пару десятков кило.
Основа любого Winlocker'а
Главный кирпич любого Winlocker – форма, растянутая почти на весь экран. Причем это не, просто большая форма, а окно, которое перекрывает все остальные и совершенно не слушается никаких команд. Ни свернуть, не изменить размер, ни уж тем более завершить процесс программы.
На первый взгляд может показаться, что вирусописатели изобрели какоето ноухау, но в реале все намного проще. По факту, это самое обычное окно, для которого установлен стиль отображения поверх всех окон. Чтобы окно вело себя как партизан и не реагировало на просьбы юзера, разработчики слегка модифицируют vronline | сентябрь 2010
28
Кодинг
процедуру обработки сообщений из внешнего мира.
Модификация сводится к банальной обработке сообщения WM_SYSCOMMAND. Если быть еще точнее, то в процедуре (см. листинг 1) обработки полученных сообщений, нужно всего, лишь объявить проверку на сообщение WM_SYSCOMMAND. Самое смешное, что в обработке этого сообщения можно вообще не писать код. Твоя форма и так перестанет реагировать на события внешней среды.
Автостарт
Вирус должен загружаться вместе с операционной системой. Чем раньше будет запущен вирус, тем больше шанцев, что установленные антивирусы пойдут лесом. Существует несколько способов обеспечить своей программе автозагрузку. Условно их можно разделить на две группы: простые и продвинутые. На рассмотрение продвинутых не хватит места в статье, поэтому поглядим лишь на простые, основанные на использовании реестра. Итак, в реестре есть несколько уголков автостарта:
1. HKLM\Software\Microsoft\Windows\CurrentVersion \Run – отсюда стартуют программы, запускаемые при входе в систему любого юзера. 2. HKCU\Software\Microsoft\Windows\Current\Versio n\Run – место аналогично предыдущему, за исключением того, что отсюда стартует программы для текущего пользователя. 3. HKLM\Software\Microsoft\Windows\CurrentVersion \RunServices – список программ запускаемых до входа пользователей в систему. 4. HKLM\Software\Microsoft\Windows\CurrentVersion \policies\Explorer\Run – этот раздел реестра отвечает за старт программ, добавленных в автозагрузку через групповые политики. 5. HKLM\Software\Microsoft\Windows NT\CurrentVersion\Windows – еще одно место, содержащее список программ, загружаемых вместе с Windows. 6. KHLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon – в этой ветке указывается ссылка на винлогон, но ничего не мешает указать и путь до своей программы. 7. Папка автозагрузки. Пожалуй, самый примитивный способ, но тем немее, многие вирусописатели им пользуются.
Какое из предложенных мест автозагрузки выбрать для своего творения? Точного ответа нет, но крайне рекомендуется не ставить все на какойто один их предложенных вариантов. Куда лучше использовать комбинацию, т.е. прописываться сразу в несколько мест. Пример записи в автозагрузку на WinAPI приведен в листинге 2. Листинг 1. Незакрываемое окно на Windows API:
wc.cbSize:=sizeof(wc); wc.style:=cs_hredraw or cs_vredraw; wc.lpfnWndProc:=@WindowProc; wc.cbClsExtra:=0; wc.cbWndExtra:=0; wc.hInstance:=HInstance; wc.hIcon:=LoadIcon(0,idi_application); wc.hCursor:=LoadCursor(0,idc_arrow); wc.hbrBackground:=COLOR_BTNFACE+1; wc.lpszMenuName:=nil; wc.lpszClassName:='win_main'; RegisterClassEx(wc); leftPos:=20; topPos:=0; Галерея финлокеров
windowWidth:=Screen.Width; WindowHeight:=Screen.Height; MainWnd:=CreateWindowEx( 0,
vronline | сентябрь 2010
29
Кодинг 'win_main', 'test', ws_overlappedwindow, leftPos, topPos, windowWidth, windowHeight, 0, 0, Hinstance, nil );
умудришься разузнать, какие именно ключи реестра модифицируются, то без проблем сможешь изменять их прямо из своей программы. Как это сделать? Минимум существует два варианта: применить метод научного тыка или воспользоваться утилитой ProcessMonitor от Марка Руссиновича. Второй способе явно круче, поэтому советуем скачать утилиту и приступить к исследованиям.
SetWindowLong(MainWnd, GWL_HWNDPARENT, GetDesktopWindow);
Великий ProcessMonitor
SetWindowPos(MainWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE); ShowWindow(MainWnd, CmdShow); While GetMessage(Mesg,0,0,0) do begin TranslateMessage(Mesg); DispatchMessage(Mesg); end; Листинг 2. Win API для работы с реестром:
var Key: HKey; begin //Сюда можешь подставить один из путей автозагрузки. RegOpenKey(HKEY_LOCAL_MACHINE, PChar('путь в реестре'), Key);
RegSetValueEx(Key,PChar(paramstr(0)), 0, REG_SZ, pchar(paramstr(0)), lstrlen(pchar(paramstr(0)))+1); RegCloseKey(Key); end;
И тебя заблокируем
Переходим к самой интересной части – блокировки системы пользователя. Честно говоря, чегото сверхнового я тебе врядли расскажу. Если ты хоть раз пользовался каким нибудь твикером, то наверняка уже знаком с большинством из рассмотренных далее примеров. Все блокировки производятся путем внесение изменений в реестр.Перед тем как рассмотреть конкретные примеры объектов блокировки, я хочу поделиться с тобой одним советом. На основе него, очень легко придумывать новые «пакости». Идея проста до безобразия. В профессиональных редакциях Windows (те, что Pro и выше) имеется редактор групповых политик (gpedit). С его ты имеешь возможность создавать правила входа в систему и т.д. Например, ты запросто можешь назначить программу, которая будет запускаться после загрузки системы, заблокировать старт определенного приложения и т.д. Практически все операции, которые выполняются через эту оснастку, на самом деле изменяют определенные ключи реестра. Если ты
Редактор групповых политик
Редакт ор реестра
Большинство пользователей привыкли редактировать реестр с помощью встроенного в Windows редактора реестра (regedit). Поскольку наш вирус будет вносить изменения в реестр, нам кровь из носа нужно не допустить, ковыряние в реестре со стороны нерадивого пользователя. Нечего ему совать свой любопытный нос, куда не надо. Решить это задачу лучше путем блокировки запуска редактора реестра. Чтобы выполнить блокировку, достаточно создать ключ DisableRegistryTools со значением 1 в ветке HKEY_CURRENT_USER\Software\Microsoft\Wind ows\CurrentVersion\Policies\System.
Диспетчер задач
Все винлокеры, которые я видел, без исключения блокировали запуск диспетчера задач. Что ж не будем от них отставать. Реализуется эта фича путем создания ключа
Результат блокировки
DisableTaskMgr (тип dword) со значением 1 в той же самой ветке, где и vronline | сентябрь 2010
30
Кодинг
DisableRegistryTools.
Установка и удаление программ
Особо мозговитые юзеры, путем аплета установка и удаление программ, в случае заражения системы пытаются инсталлировать антивирусы. Это легко присечь на корню, если создать ключ NoAddRemovePrograms со значением 1 (тип dword) все в том же разделе, где и DisableRegistryTools.
отредактируй значение ключа start. Например, чтобы установить службе «Тип запуска» в значение «вручную», ключу start необходимо присвоить 3. Если желаешь, чтобы твой вирус протянул во вражеской системе дольше, то советую вести в своем творении базу служб антивирусов. Т.е. тебе необходимо четко опознавать сервисы антивирусов и менять им тип запуска.
Блокируем доступ к дискам
Чтобы полностью испортить пользователю настроение можно вообще заблокировать доступ к присутствующим дискам в системе. Пусть юзер даже не пытается запустить антивирус со своей флешки! Выполняем эту трик путем создания ключа NoViewOnDrive (тип dword) в разделе HKEY_LOCAL_MACHINE\Software\Microsoft\Wind ows\CurrentVersion\Policies\Explorer. В качестве значения для ключа указываем битовою маску блокируемого диска. Например, для диска C эту будет 4. В случае если требуется заблокировать несколько дисков, то их маски придется сложить. Например, значение 12 будет соответствовать блокировке диска C (4) и D (8).
Ограничиваем запуск приложений
С помощью реестра реально определить список одобренных для запуска программ. Если этот список заполнен, то все приложение, которые в него не попали, пользователь запустить не сможет. Список одобренных к запуску приложений создается здесь: HKEY_CURRENT_USER\Microsoft\Windows\Curre ntVersion\Policies\Explorer\RistrictRun. Создав в этом разделе ключи (тип REG_SZ) для каждой разрешенной программе, тебе нужно будет подняться на один уровень выше и добавить параметр RestrictRun типа dword со значением 1.
Управление компьютером
Много нехороших дел сможет натворить пользователь, если у него имеется доступ к запуску оснастки «Управление компьютером». Полностью отключить оснастку с помощью реестра нельзя, но удалить ссылку на ее запуск из контекстного меню ярлыка «Мой компьютер» проще пареной репы. Всего лишь требуется создать параметр NoManageMyComputerVerb типа dword со значением 1 в разделе HKCU\Software\Microsoft\Windows\CurrentVersion\ Policies\Explorer.
Вырубаем службы
Используя возможности реестра, ты без проблем сможешь отключить ненужные (например, антивирусы) пользователю службы. Полный список установленных в системе служб находится в ветке HKEY_LOCAL_MACHINE\System\CurrentControlS et\Services. Для деактивации службы
В msdn можно найти ответ на любой вопрос
А что еще нам надо?
Типичные функции любого Winlocker'а мы рассмотрели, теперь самое время подумать о том, как улучшить наше детище. Честно говоря, я не понимаю, почему профессиональные вирусописатели не встраивают в подобные вирусы дополнительные полезные функции. Ведь нет никакой гарантии, что юзер дотянется до мобилы и отправит заветную смс'ку на короткий номер, тем самым обогатив автора вируса. Зато, всегда есть шанс увести с тачки пользователя полезную информацию: пароли на различные сервисы, документы, записанные skype переговоры и т.д. Мы не будем вводить какихто ограничений, а проапгрейдим наш вирус по полной программе. Итак, ниже я описал шесть фишек, которые было бы полезно реализовать в подобном «проекте».
Фишка №1 : В любом месте веселее вместе
Заразил компьютер бедного пользователя? Не забудь позаботиться о его друзьях! Помни, чем больше распространится вирус, тем больше шансов получить деньги. Обосновавшись на вражеской тачке, нужно не терять времени зря, а пытаться найти новый плацдарм. Как это сделать? Один из простых и самых действенных способов – мониторинг и заражение флэшек. Поскольку пользователи постоянно пользуются флешками, нашему вирусу будет легко мигрировать из одной системы в другую. Определить факт подключения флешки – легко. vronline | сентябрь 2010
31
Кодинг
Достаточно написать код, обрабатывающий событие WM_DEVICECHANGE. Пример кода смотри в листинге №3. Листинг 3. Мониторим флэшки
var disk:DWORD; begin case Msg.WParam of DBT_DEVICEARRIVAL: //Если подключили флэшку if (PDEV_BROADCAST_HDR(Msg.LParam)^ .dbch_devicetype = DBT_DEVTYP_VOLUME) then begin //Пытаемся определить букву диска disk := PDEV_BROADCAST_VOLUME(Msg.LParam)^ .dbcv_unitmask; //Выполняем свой зловредный код end; DBT_DEVICEREMOVECOMPLETE: //Если флэшку извлекли if (PDEV_BROADCAST_HDR(Msg.LParam)^ .dbch_devicetype = DBT_DEVTYP_VOLUME) then begin //Флешку отмантировали end;
В третьем листинге я использовал константы и структуры, описания которых нет в модулях, поставляемых вместе с Delphi. Их придется описывать самостоятельно.
Фишка №2: Ваши пассы будут наши!
Какими webсервисами пользуется современный юзер? Не нужно иметь семь пядей во лбу, чтобы угадать хотя бы несколько из них: почта, одноклассники, в контакте, facebook, twitter, etc. Список можно продолжать до бесконечности. К чему это я клоню? А к тому, что находясь на вражеской территории, было бы неплохо собрать все пароли. Авось в будущем пригодятся. К тому же, имея на руках такие козыри, становится реальным простимулировать жертву. Например, получив пароли от всевозможных аккаунтов, автор вируса может воспользоваться ими для смены контактных персональных данных и изменения паролей на свои. В результате, реальный пользователь попадет в очень нехорошую ситуацию. Попросту говоря, он лишиться своего аккаунта. Это уже куда серьезней заблокированного рабочего стола, а раз так, то шансы оплаты «твоих услуг» возрастают. Сразу возникает вопрос, а каким образом это проще всего сделать? Обычно юзеры хранят свои пароли прямо в браузере, поэтому сразу напрашивается вариант угнать файлик хранилища паролей. Пример такого угона был продемонстрирован в статье «Злобный комп». Сейчас повторяться не буду, а лучше покажу тебе альтернативный способ.
Идея заключается в банальном модифицировании hosts. В этом файле прописываются соответствия типа: «символьный адрес сайта:ip». Наша программа должна уметь модифицировать этот файл и добавлять соответствия для популярных webсервисов. «А куда будем переадресовывать пользователя?». Можешь для этого замутить свой evil сайт, на котором и будут располагаться скамы популярных сервисов. Этот способ прост в реализации, но при массовом заражении пользователей, такие сайты наверняка будут умирать быстрей, чем самые дохлые бактерии. В связи с этим, откажемся от предложенного способа, а пойдем не совсем стандартным путем – встроим в вирус мини webсервер. При таком раскладе пунктом назначения переадресации у нас будет localhost. Например:
127.0.0.1 www.odnoclassniki.ru
Рассматривать правка файла host не будем, лучше сразу взглянем на то, как с помощью Delphi поднять WEBсервер. Если ты постоянный читатель нашего журнала, то ты уже должен хорошо ориентироваться в Winsock API. Гдето года два назад, в рубрике кодинг публиковали мои статьи про написание всевозможных клиентов (FTP клиент, PROXY сервер, IRC и т.д.) используя лишь api функции. Рекомендую тебе поднять подшивку и хорошенько ознакомиться с сабжевой темой. Как разберешься, возвращайся и кури третий листинг. Листинг 4. Самопальный WEBсервер
var _buff: array [0..1024] of char; _request:string; _temp: string; _path: string; _FileStream : TFileStream; begin Recv(_client, _buff, 1024, 0); _request:=string(_buff); _path := GetFilePath (Copy (_request, 1, pos(#13, _request))); _path := ReplaceSlash(_path); if ((_path = '') or (_path = '\')) Then _path := DocumentRoot +'\' + DirectoryIndex; { else if ((_path[length(_path)] ='\')) Then _path := DocumentRoot + '\' + DirectoryIndex; } if (FileExists(_Path)) Then begin _FileStream := TFileStream.Create(_Path, fmOpenRead); SendStr(_Client, 'HTTP/1.0 200 OK'); SendStr(_Client, 'Server: xSrV'); SendStr(_Client, 'Content-Length:' +
vronline | сентябрь 2010
32
Кодинг IntToStr(_FileStream.Size)); SendStr(_Client, 'Content-Type: ' + GetTypeContent(_Path)); SendStr(_Client, 'Connection: close'); SendStr(_Client, ''); SendFile(_Client, _FileStream); _FileStream.Free; End //Вырезано
Теперь вбив одноклассники.ру, жертва попадет не на реальные одноклассники, а прямо в лапы нашего evil сервера. Само собой, webсервер должен быть вежливым и отобразить реальную страницу одноклассников (читай – скам сайта, который нужно заранее подготовить). Ну а дальше все просто и банально – юзер вбивает свои данные для входа, после чего наш web сервер их сохраняет. Чтобы не было откровенного палева, желательно сделать страницу, на которой описать, что одноклассники сейчас недоступны или чтото в подобном роде. Или как вариант, сразу отправлять введенные данные на реальные одноклассники.
Фишка №3: Экстази для пользователя
Все winlocker просят у честного юзера денег за излечение компа (которое, кстати так и не делают), но как и следует ожидать, платить желают далеко не все (я бы никогда не заплатил :)). К чему этого я все говорю? А к тому, что неплохо было както простимулировать пользователя. Дать ему допинг, от которого наверняка захочется распрощаться с парой кровных баксов. Как это сделать? Один из действенных вариантов будет совершение марш броска по директориям пользователя и шифрование найденных файлов. На какие файлы обращать внимание? Лучше всего на те, от которых может завесить работа/учеба жертвы, например: документы (doc, xls, mdb, ppt, txt), изображения (jpeg, png, bmp), исходные тексты (php, pas, c, h, cpp, dpr, py и т.д.). Если жертва писала дипломную работу или какойнибудь сверважный отчет, который завтра сдавать, то у тебя есть все шансы получить денежное вознаграждение. Как тебе идейка?
Теперь поговорим о технической реализации это фичи. Поиск файлов осущетвляется с функциями FindFirst() и FindNext() из модуля Sysutils. Работать с ними легко, но простота фаст фуда отрицательно отразиться на фигуре нашего приложения. Поскольку, набирать лишний вес нам не к чему, мы воспользуемся более диетическими продуктами: FindFirstFile() и FindNextFile(). Работать с ними чуточку сложнее (см. пример поиска файлов на диске), но красота требует жертв. Шифрование файлов, средствами Delphi также осуществляется достаточно просто. Все зависит
от выбранного способа шифрования. Один из самых простых воспользоваться готовыми модулями, которых на torry.net и на других сайтах пруд пруди. Например, мне попался неплохой вариант от одного из разработчиков Delphi. В этом модуле реализованы следующие функции: //Шифрование файла function FileEncrypt(InFile, OutFile: String; Key: TWordTriple): boolean; //Расшифровка файла function FileDecrypt(InFile, OutFile: String; Key: TWordTriple): boolean; //Шифрование текста function TextEncrypt(const s: string; Key: TWordTriple): string; //Расшифровка текста function TextDecrypt(const s: string; Key: TWordTriple): string; //Шифрование «памяти» function MemoryEncrypt(Src: Pointer; SrcSize: Cardinal; Target: Pointer; TargetSize: Cardinal; Key: TWordTriple): boolean; //Расшифровка «памяти» function MemoryDecrypt(Src: Pointer; SrcSize: Cardinal; Target: Pointer; TargetSize: Cardinal; Key: TWordTriple): boolean;
Полный текст этих функций, а также примеры их использованиия ты найдешь на нашем диске.
Фишка №4: Размножайся!
Попав в чужую систему нужно потрудиться и постараться удержаться в ней как можно дольше. Стопроцентно сказать, как это лучше всего это сделать, я не могу. Первое (и самое простое в реализации), что мне пришло в голову, встроить в winlocker мини джойнер. Алгоритм будет таким. При активации в системе жертвы основная программа будет заражать наиболее часто используемые программы. Причем, сам вирус прицепляться не должен. В качестве паразита будет выступать маленькая «безобидная» программка. Ее основной функцией будет выполнение проверки на наличие процесса вируса. Если его нет, то необходимо инициировать загрузку «вируса» из интернета и дальнейший его запуск.
С точки зрения программирования, создать joiner совсем не сложно. К тому же, пару лет назад (см. статью «Вместе веселее» в #104 номере) мы поднимали эту тему на страницах нашего журнала.
Фишка №5: Играй в прятки по максимуму
Как показала практика, авторы Winlocker'ов не сильно забоятся о безопасности своих детищ. Защита большинства представителей этой группы вирусов, попавшихся мне на глаза, сводилась к банальному присвоению vronline | сентябрь 2010
33
Кодинг
неприметного имени файла. Например: system.exe, user32.exe, csrss.exe, eplorer.exe и т.д. Я не думал, что подобные способы еще прокатывают, но как выяснилось, я заблуждался. Я рекомендую тебе не пренебрегать безопасностью, а предусмотреть несколько разных алгоритмов:
1. Давай файлу вируса неприметное имя. Хоть это и примитивное правило, но соблюдать его крайне желательно.
2. Удали вирус из списка процессов. Этого можно добиться, разобравшись с перехватом API функций. Мы уже много раз писали про перехват API. Обязательно перечитай эти статьи! 3. Используй несколько способов автозагрузки.
Фишка №6: Убить на старте
Не поленись и напиши процедуру принудительного завершения процессов. Она обязательно поможет тебе уберечь свое детище от злобных антивирусов, которые пользователь будет пытаться запустить. В идеале вообще организовать перехват функций, использующихся для запуска программ и не допускать, чтобы они нормально отрабатывали.
Epidemic complete
Написать WinLocker и срубить на нем несколько сотен баксов – более чем реально. Пользователи попрежнему не думают о безопасности и при возникновении щепетильной ситуации готовы отправить заветную смс'ку, нежели напрячь свои извилины. Сегодня я показал скелет типичного Winlocker'a. В принципе, довести его до боевого состояния дело нескольких часов. Только нужно ли это делать? Выбор за тобой! Главное не забывай о том, что написание и распространение вирусов уголовнонаказуемое деяние, за которое можно схлопотать реальный срок. P.S. Само собой, исходник полноценного вируса я не дам. Нет, не потому что я жадный. Эти вирусы и так всех достали, поэтому я чертовски не хочу, чтобы после этой статьи их стало еще больше. Вдобавок, мне не хочется читать новости как правоохранительными органами были задержаны очередные создатели ужасных вирусов ;).
vronline | сентябрь 2010
Автор: Toly WWW: http://tolyblog.ru
34
Кодинг
Python Раскручиваем сайт злобоскриптом на Python
По работе получил задание: раскрутить портал. Неправильная верстка, не транслитная ссылочная структура, конечно, будут весомыми факторами отсутствия сайта в топе. Не менее весомым обстоятельством, влияющим на позиции портала, оказалось полное отсутствие ссылок с внешних ресурсов (я уже не говорю о близких по тематике). Решение этой задачи было решено автоматизировать.
Что предложил я
Я предложил следующий вариант алгоритма своего злобоскрипта:
1. Пройтись по карте сайта, преобразовать ее в массив урлов (т.е. все доступные для индексации страницы сайта); 2. Из каждой страницы взять метаданные (теги description и keywords);
3. Осуществить по содержанию метатегов поиск (автоматический поиск легко реализовать в яндексе) что бы найти близкие по тематике страницы; 4. Для каждой из найденных страниц узнать PageRank сайта и есть ли в ней поля ввода (textarea), 5. Сохранить все в логфайл.
6. Согласно логфайла необходимо разместить ссылки (уже руками, а то до автоматизируетесь тут мне) по выданным адресам.
Идею оценили, и я принялся за дело. В этой статье дабы не раскрывать коммерческой тайны (какие сайты мною раскручиваются) для наглядности (а заодно и для личной выгоды) пример рассмотрю применительно к раскрутке своего блога.
Кодим скрипт
Чтобы не валить все в одну кучу, разделим нашу задачу на несколько подзадач, а именно: 1. Получение ссылок из карты сайта;
2. Парсинг страницы на предмет метатегов
(применительно к блогу будем обрабатывать заголовки); 3. Парсинг выдачи поисковика по заданному запросу;
4. Определение авторитетности страницы (или ресурса); 5. Определение наличия полей ввода.
Оформим каждый из этих пунктов в виде функции и поместим их в отдельный модуль (я обозвал его seo.py): import import import import
re string urllib urllib2
# проверка ссылки на поле ввода def checkinp(url): if url[:7] != 'http://': url = 'http://' + url try: page = urllib.urlopen(url).read() except: return False else: pass return '<textarea' in page # главный домен страницы def host(url): if url[:7] == 'http://': url = url[7:] url = string.split(url, '/')[0] return 'http://'+url # поиск в яндексе # page - номер страницы поиска # numdoc - количество ссылок на странице (20, 50) def ypages(text, page=0, numdoc=10, results=[]): host = "http://yandex.ru/yandsearch" headers = { 'User-Agent' : 'Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.2.15 Version/10.00', 'Host' : 'ya.ru', 'Accept' : 'text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/xxbitmap, */*;q=0.1', 'Accept-Language' : 'ruRU,ru;q=0.9,en;q=0.8', 'Accept-Charset' : 'Accept-Charset: iso-
vronline | сентябрь 2010
35
Кодинг 8859-1, utf-8, utf-16, *;q=0.1', 'Referer' : 'http://www2.amit.ru/forum/index.php', 'Connection' : 'Keep-Alive, TE', 'TE' : 'TE: deflate, gzip, chunked, identity, trailers' } if page != 0: url = urllib.urlencode({"p": str(page), "text": text, "lr":"77", "numdoc":str(numdoc)}) else: url = urllib.urlencode({"text": text, "lr":"77", "numdoc":str(numdoc)}) request = host+"?"+url data = urllib2.urlopen(request) txt)
txt = data.read() links = re.findall(r'href="http://([^"]+)',
for link in links: if 'yandex' not in link and link not in results: results.append(link) return results
# убираем частоповторяющиеся выражения (в заголовках) def del_strs(title): not_words = ['-рецепты.', 'Модуль quotes.', 'Цитадель Зла', '.'] for word in not_words: if word in title: title = string.replace(title, word, '') return title # получаем заголовок на странице def get_title(url): page = urllib.urlopen(url).read() titles = re.findall(r'<h2 class="title">([^<]+)', page) return del_strs(titles[0]) # ссылки из карты сайта def sitemap_links(url): sitemap = urllib.urlopen(url).read() urls = re.findall(r'<loc>([^<]+)<', sitemap) return urls # эта и последующие функции - для вычисления pagerank def get_pagerank(url): hsh = check_hash(hash_url(url)) gurl = 'http://www.google.com/search?client=navclientauto&features=Rank:&q=info:%s&ch=%s' % (urllib.quote(url), hsh) try: f = urllib.urlopen(gurl) rank = f.read().strip()[9:] except Exception: rank = 'N/A' if rank == '': rank = '0' return rank def
int_str(string, integer, factor): for i in range(len(string)) : integer *= factor integer &= 0xFFFFFFFF integer += ord(string[i]) return integer
def hash_url(string): c1 = int_str(string, 0x1505, 0x21) c2 = int_str(string, 0, 0x1003F) c1 >>= 2
c1 = ((c1 >> 4) & 0x3FFFFC0) | (c1 & 0x3F) c1 = ((c1 >> 4) & 0x3FFC00) | (c1 & 0x3FF) c1 = ((c1 >> 4) & 0x3C000) | (c1 & 0x3FFF) t1 = (c1 & 0x3C0) << 4 t1 |= c1 & 0x3C t1 = (t1 << 2) | (c2 & 0xF0F) t2 = (c1 & 0xFFFFC000) << 4 t2 |= c1 & 0x3C00 t2 = (t2 << 0xA) | (c2 & 0xF0F0000) return (t1 | t2) def check_hash(hash_int): hash_str = '%u' % (hash_int) flag = 0 check_byte = 0 i = len(hash_str) - 1 while i >= 0: byte = int(hash_str[i]) if 1 == (flag % 2): byte *= 2; byte = byte / 10 + byte % 10 check_byte += byte flag += 1 i -= 1 check_byte %= 10 if 0 != check_byte: check_byte = 10 - check_byte if 1 == flag % 2: if 1 == check_byte % 2: check_byte += 9 check_byte >>= 1 return '7' + str(check_byte) + hash_str
А вот и основной скрипт: import seo import urllib # имя файла-отчета (лог) fname = 'result.csv' # адрес карты сайта sitemap = 'http://toly-blog.ru/sitemap.xml' # функция занесения строки в лог-файл def log(st): global fname f = open(fname, 'a+') f.write(st+'\n') f.close() # пишем в лог шапку таблицы log('pr_host;pr_page;url;link\n') # считываем ссылки сайта из карты сайта urls = seo.sitemap_links(sitemap) # для каждой страницы сайта for url in urls: print url # определяем заголовок страницы title = seo.get_title(url) if title == 'Рубрики': continue print title # ищем заголовок в яндексе links = seo.ypages(title) # для каждой найденной страницы for link in links: # если есть поля ввода if seo.checkinp(link): # определяем ee pagerank pr_page = str(seo.get_pagerank(link)) # и pagerank ее хоста pr_host = str(seo.get_pagerank(seo.host(link)))
vronline | сентябрь 2010
36
Кодинг # оформляем и пишем в лог st = pr_host+';'+pr_page+';'+url+';'+link log(st)
Запускаю скрипт и иду пить кофе…
Попив кофе, приходится наливать вторую кружку: изза отсутствия многопоточности все очень долго работает. Делать нечего, жду.
По окончании работы скрипта получаем аккуратный csvфайл, из которого понятно, куда какую ссылку можно оставить в комментариях: На этом все, жду вопросов и комментариев. Так же хотелось бы услышать предложения по улучшению алгоритма скрипта.
P.S. В коде намеренно допущена ошибка (а может и несколько ошибок – не помню), которые не позволяют использовать скрипт на полную катушку.
vronline | сентябрь 2010
Автор: Toly WWW: http://tolyblog.ru
37
Кодинг
Python Иди ты на фиг, twitterfeed!
В который раз убеждаюсь – полагаться нужно только на себя и свои силы (возможности, ресурсы и далее по списку). Не жизнь, а череда законов Мерфи. Но, обо всем по порядку.
несколько раз пришлось хранить id’ки твитнутых постов в текстовом файле. В ссылке id передается GETпараметром rid.
Предыстория
Раскручивая ресурс, задался целью наследить в твитере. На ресурсе часто появляются новые записи в блогах и для лучшей индексации и повышения количества внешних ссылок кросс постинг в твитер не помешает. На сайте уже имелся rssгенератор и я уже собирался было клепать свой парсерrssиавтотвитт, как наткнулся на twitterfeed.com . Там мне было обещано принимать на вход rss’ку и репостить ссылки с описаниями в твитер. Регистрируюсь, добавляю свою rss, рассекречиваю логин с паролем от twitter’а и устанавливаю самую высокую частоту обновления rss’ки – 30 минут. Через полчаса первые пять укороченных ссылок (http://bit.ly) с описаниями затвитились. Спустя 2,5 часа затвитились еще две ссылки, хотя должно было быть намного больше. Это меня совсем не устраивало. Мне нужна стабильность – если в течение получаса в rss’ке появилась ссылка, значит, она стабильно появляется и в твитере.
Питон – всему голова
О том, что pythonботы легко находят общий язык с популярным сервисом микроблоггинга я узнал еще полгода назад из журнала “Хакер”, а вот сокращалку ссылок нужно было приручить самостоятельно. Сначала мой выбор пал на Кликер – готовый API (да еще и первый пример на питоне) позволил накатать скрипт за 3 минуты. Но при проверке оказалось, что все укороченные ссылки ведут на одну страницу (хотя когда укорачивал не скриптом, а руками – все работало; мистика!). Тогда я решил использовать http://b23.ru. Правда там пользоваться API разрешают только зарегистрированным пользователям и не более 30 укорачиваний за час, но эти ограничения меня не отпугнули Для того чтобы не твитить один и тот же пост
А вот и исходник скрипта: # -*- coding: utf-8 import pycurl import StringIO import urllib import urllib2 import re import string # сокращалка ссылок user = '11111' # логин key = 'pass' # ключ из настроек host = 'http://b23.ru/api/shorten/' # сокращалка ссылок def shorter(url): passman = urllib2.HTTPPasswordMgrWithDefaultRealm() passman.add_password(None, 'http://b23.ru', user, key) opener = urllib2.build_opener(urllib2.HTTPBasicAuthHand ler(passman)) urllib2.install_opener(opener) result = urllib2.urlopen(host+url) return result.read() # из items выделяем ссылку, номер, заголовок def get_fields(item): title = re.findall(r'<title>(.+?)</title>', item)[0] # если rss'ка в виндовой кодировке обращаем в utf-8 title =
vronline | сентябрь 2010
38
Кодинг title.decode('cp1251').encode('utf-8') link = re.findall(r'<link>(.+?)</link>', item)[0] link = string.replace(link, "&amp;", "&") rid = re.findall(r'rid=([^&]*)', link)[0] rid = int(rid) desc = re.findall(r'<description>(.*?)</description>', item, re.DOTALL)[0] # если rss'ка в виндовой кодировке обращаем в utf-8 desc = desc.decode('cp1251').encode('utf-8') return title, link, rid, desc
легким движением руки мы сварганили свой минитвиттер фид. Удачи!
# твитим def tweet(txt): txt = txt[:139] data = StringIO.StringIO() curl = pycurl.Curl()
curl.setopt(pycurl.URL,'http://twitter.com/stat uses/update.xml') curl.setopt(pycurl.WRITEFUNCTION, data.write) curl.setopt(pycurl.USERPWD,'логин:пароль')
curl.setopt(pycurl.POSTFIELDS,'status='+txt) curl.setopt(pycurl.POST,1) curl.perform() curl.close() # ==========================================собст венно сама прога # формируем массив твитанутых id-шников try: fposted = 'posted_tweets.txt' f = open(fposted, "r") posted = f.readlines() f.close() for i in xrange(len(posted)): posted[i] = int(posted[i]) except: posted = [] # получаем rss rss = urllib.urlopen('адрес rss`ки').read() # делим на items items = re.findall(r'<item>(.+?)</item>', rss, re.DOTALL) # пробегаемся по всем элементам rss'ки for item in items: # из items выделяем ссылку, номер, заголовок title, link, rid, desc = get_fields(item) print str(rid)+"\n" # проверяем rid на твитнутость if rid not in posted: # сокращаем ссылку short = shorter(link) # и твитим короткую ссылку, заголовок и описание tweet(short+' '+title+' '+desc) # запоминаем что затвитили f = open(fposted, "a+") f.write(str(rid)+"\n") f.close()
Вместо заключения
Ставим скрипт в cron на каждые полчаса и смотрим, как все делается за нас. Вот таким
vronline | сентябрь 2010
VRCrew
39
Я прусь!
Я прусь! Делимся впечатлениями
JimmyJonezz: Начальства нет на работе (отпуск) и я прусь по этому поводу, т.к. нет нагоняя, постоянного контроля и надсмотра над моими действиями. Не сказать, что я плюю в потолок и "курю бамбук", но все равно работается легче и лучше. Жду с трепетом приезда своего начальства, т.к. знаю, что получу кучу указаний и направлений. То, что не успеваю сделать дома, с лихвой выполняется на работе, да и благодаря отсутствию начальства, я написал большую часть статей и шаблонов. Почитываю литературу и пропадаю в Интернете в поисках "вкусной" информации. Меня прет такая ситуация. Забыл упомянуть, что каждый вечер, я делаю легкую пробежку и на турник, качать мускулатуру. Нет ничего лучше этого. Завидуйте, все те, кто страдает от лени. =)
zahod5277: На днях братишке подарили гитару, и пока брательник в школе я постигаю искусство извлечения звука из инструмента. Искренне восхищаюсь людьми, которые умеют играть на гитаре. Это же такой труд! Да, понимаю что сложно только по началу, но все же! Лично я, пока научился переставлять пальцы с одного аккорда на другой, чуть головой не повредился! Заставить сгибатся пальцы так, как надо, первые разы очень сложно. Так же, так как не имею ни тюнера, ни камертона, заколебался ее уже настраивать. Нашел
софтинку, которая заменяет реальный тюнер. Интересная программулина, выручила.
Kastor: Я очень рад, что у меня есть возможность хоть и редко, но достаточно своеобразно проводить свое свободное время. Да еще и как! Недавно был на пожарной вышке. Высота четвертого этажа. Пристегиваю страховку, пропускаю веревку через «восьмерку» и карабин, свешиваюсь из окна. Страховка готова? Готова! Вперед! Для тех, кто хоть пару раз так спускался, это не кажется чем то сложным. Поэтому тренер усложнил задачу. Свешиваешься из окна, словно сидишь на подоконнике, свесив ноги на улицу. Держишь веревку и, отталкиваясь, разворачиваешься в воздухе лицом обратно к стене. Тут главное преодолеть страх и поверить, что ты останешься висеть на веревке, а не бахнешься об землю. Далее, спускаясь, пролетаешь среднее окно и влетаешь в самое первое (второй этаж). Быстро отстегиваешь страховку (будет мешать), становишься лицом к окну и, отталкиваясь ногой от подоконника, выпрыгиваешь из окна как можно дальше. Задача спуститься на землю, не коснувшись стенки. Признаюсь, этот момент достаточно стремный. Опять же, прыгая в окно надо поверить, что свободному падению будет препятствовать веревка, которую ты держишь в руках и можешь резко поставить на
тормоз через «восьмерку». А еще на этих выходных был в лесничестве, на соревнованиях по туризму. Три дня без цивилизации. Днем преодолевали навесные трассы, искали контрольные пункты и вязали узлы. Ночами травили анекдоты и грелись у костра чаем. Еще бы. Холодина такая. В палатке спал, думал спина к земле примерзнет. Набегался за три дня до крепатуры в ногах, но оно того стоило. Теперь, надеюсь, представится возможность еще раз побывать в тире или даже на полигоне. Кажется, почти год не стрелял из оружия.
ZeroXor: От осени. Да, я действительно прусь от того, что закончилась эта кошмарная жара (хотя многие уверяют, что лето в Сибири в этом году было холодным – лично я холодов особо не заметил, а вот от жары пришлось помаяться), что помог родителям убрать урожай с огородов и делянки в поле. В концеконцов от того, что вечерами теперь не слышно пьяных компаний под окнами. Плохо разве? Ничуть! А еще так классно в прохладный вечер завернуться в теплое одеяло, налить кружку горячего сладкого чая и включить какойнибудь хороший фильм или подкаст. Spider_NET: В этом месяце я с женой и с друзьями сходили на концерт группы «Кипелов». Мы вдоволь накричались и получили кучу позитивных эмоций. Давно я так уже не
vronline | сентябрь 2010
40
Я прусь!
отдыхал. Вроде всего лишь два часа драйва, а душе реально хорошо. После концерта аж захотелось снова творить. Концерт был не единственным подарком судьбы. 24 сентября стартовал 6й сезон Supernatural (Сверхъестественное) — одного из самых моих любимых сериалов. Признаюсь честно, я уже месяца два с нетерпением ждал этого события и вот таки дождался. Теперь знаю, на что я буду тратить 40 минут каждого субботнего вечера ;) lord_of_fear: Как же я рад, что пришли те времена, когда на работе при покупке железа, мониторов и прочего можно не смотреть на самыесамые дешёвые модели. Например, отличный 20дюймовый монитор BenQ можно купить за 5999 рубликов. Доступный ценник. Нормальная видюха для офисного компа стоит всего 1500р. Не нужно через силу пользоваться этим го*ном, интегрированным в материнку, если оно выдаёт мутное изображение. Винт на 250Гиг всего за 1400. Сегодня вот только собрал под заказ отличный игровой системник за 27300. Даёшь компьютер в каждый дом! :) Хехе.
vronline | сентябрь 2010
Автор: Роман Костенко aka Lord_of_fear Email: kostenko.r.khv@gmail.com
41
Обзоры от VR
“Linux глазами Хакера” Пару месяцев назад, гуляя по магазину ozon.ru и подыскивая, что же почитать, мне на глаза попалось третье издание книги Миши Флёнова aka Horrific “Linux глазами Хакера”. Цена оказалась очень даже привлекательной, поэтому я сразу кликнул по пимпе “в корзину”. Заинтересовал так же факт наличия CD в комплекте.
Про стиль изложения материала Horrific’ом, думаю, нет смысла рассказывать. Если “Библия Delphi” была твоей первой книгой, то ты поймёшь, о чем я. Миша всегда умел преподнести материал так, что даже новичок поймёт. И эта книга не явилась исключением из правил. Всё четко, просто и доступно. Автор общается с читателем на протяжении всей книги, иногда рассказывая случаи из своей профессиональной практики, местами давая полезные советы “как надо делать” и как “не надо делать”.
Книга имеет достаточно броское название. Понимаю, что название выбирает не автор, а редактор издательства, но, считаю, что этой книге оно совсем не подходит. Ибо “хакер” в нашем понимании – профессионал. Т.е. эта книга должна быть написана профессионалом для профессионалов. Лично у меня выстраивается такая логическая цепочка. Книга же написана профессионалом для новичков и немного продвинутых пользователей. Даны базовые знания. Всего понемногу. Информация преподнесена очень понятно и доступно. Но! Это – не тот материал, который я хотел бы прочитать в книге с таким названием.
После окончания прочтения книги я сразу же распаковал диск и вставил в привод. Его содержимое меня, мягко говоря, удивило. Полный объем данных – 280Мб. Из них 245 метров – обои. Причем даже не обои, а просто фотки зданий, животных, растений и прочего. Зачем это здесь? Остальной же материал – 3 сорца на Java и десятка полтора старых Мишиных статей. Часть из них даже не имеет никакого отношения к миру Linux. ИМХО, этот ненужный диск в комплекте только увеличивает стоимость книги.
Считаю, что всётаки книга заслуживает твёрдой четверки. Я ничуть не пожалел, что прочитал её. Нашлось и для меня коечто новенькое и интересное :) ИТОГИ:
Полезность: 4/5
Стиль изложения: 5/5 Качество печати: 5/5
Оправданность цены: 100%
Стоимость книги – 358 руб. в магазине Ozon.RU Ссылка на книгу в магазине: http://www.ozon.ru/context/detail/id/5217643/
Так же мне совсем непонятна любовь Horrific’а к Mandriva Linux. Пишет, что это – его любимый дистрибутив. Если спросить любого продвинутого линуксоида “что ты думаешь о Mandriva”, то он ответит в стиле “Отстой. Ни за что себе не поставлю. И тебе не рекомендую”. И я с этим согласен. Отстойный глючный дистрибутив. Вкатывает только новичкам, впервые увидевшим Linux после винды. Ну ладно, о вкусах не спорят. :)
vronline | сентябрь 2010
Автор: Овчинников Михаил aka Night_Storm WWW: http://Nstorm.3nd.ru
42
Обзоры от VR
Обзор Mp3 flash плеера Samsung YPR1
Честно сказать, Samsung всегда вызывал у меня некие подозрения и сомнения, связанные с впечатлением, прежде всего от их телефонной продукции. Но взглянув на соотношение функционала устройств и их цены, я понял, что компания не стоит на месте и не удержался от покупки.
гарантийный талон. Инструкцию пришлось скачивать с сайта (необходимость в ней минимальная, но, тем не менее, там можно узнать несколько интересных и неочевидных моментов). Зарядку и шнур для подключения к телевизору (дада он умеет и это!) покупать отдельно.
Внешность и комплектация
Наушники на меня сильного впечатления не произвели, я бы включил в комплект обычные «вкладыши» неискушенные слушатели сэкономили бы пару сотен рублей, а искушенные тут же их выкинут, подключат свои любимые «сенхайсер» и будут правы.
Итак, сейчас в моих руках находится плеер (на самом деле это нечто большее) YPR1. Если кому интересно, то это уменьшенный вариант их же плеера P3. Начну обзор с внешнего вида и комплектации, а затем мы плавно перейду к самому вкусному – мультимедийным возможностям. Прости за качество фоток не обладаю пока качественной, аппаратурой чтобы делать подобные обзоры надеюсь в будущем все наладится.
Плеер сделан из алюминия, оснащен сенсорным экраном, покрытым закаленным стеклом. Кроме пластиковых кнопок включения/выключения (она же и блокировка) и регулирования громкости физических элементов управления он не имеет. Признаться, передо мной тут же возник вопрос – насколько удобно и оправдано сенсорное управление на таком маленьком экране (диагональ 6,5 см), но оно превзошло все, даже самые смелые ожидания. Плеер шустро и удивительно точно откликается на все прикосновения, ошибки, конечно, случаются, но я даже на более крупном экране Nokia 5530 ошибался гораздо чаще – приятно удивлен. Комплект поставки разочаровал – вакуумные наушники, насадки к ним, usbкабель и
Заявленное время работы от встроенного аккумулятора – 25 часов в режиме воспроизведения музыки и 5 часов, в режиме видео. Параметры слабенькие, но даже при активном использовании на рабочий день зарядки вполне хватает – что приемлемо для среднестатистического городского жителя, главное не забыть зарядить его перед началом нового дня – на это требуется 3 часа.
Подключение к компьютеру произошло быстро и легко – плеер определился как флешка, и помимо прочего там обнаружилась любопытная программка EmoDio – самсунговский аналог iTunes (позже напишу её полноценный обзор), но особенной нужды в ней я не ощутил. Теперь настала пора всетаки включить плеер и поближе познакомиться с функциями: Передо мной открывается интерфейс, который мне чемто напомнил Vista с её виджетами. Интерфейс разбит на несколько экранов,
vronline | сентябрь 2010
43
Обзоры от VR
прокрутка между которыми осуществляется легким движением пальца. По умолчанию на одном экране находятся иконки мультимедиа – видео, музыка, радио, и тп, на втором дополнительные функции – настройки, блютус, игры и тп. На третьем экране расположены различные виджеты. Конечно же, интерфейс можно настроить так, как вам больше нравится – расположение виджетов, иконкок и фоновая картинка настраиваются легко и быстро.
загружать в плеер), присутствует визуализация. Плеер умеет читать следующие форматы: MPEG1/2/2.5 Layer 3 (8 320 Кбит/с, 8 48 кГц), WMA(12320Кбит/с,1648кГц), Ogg(32 400Кбит/с,Q0Q10,848кГц), AACLC (8 320 Кбит/с, 8 48 кГц), AAC+(8320Кбит/с,848кГц), EnhancedAACPlus (8 320 Кбит/с, 8 48 кГц), FLAC(уровни08,1648кГц), RA (20 96 Кбит/с, 8 кГц, 11,025 кГц, 44,1 кГц), WAV (стандарт wav, 8 48 кГц).
Видео
Хорошее разрешение позволяет довольно комфортно смотреть видео – и маленький экран совершенно не помеха! Для эксперимента я загрузил в плеер несколько клипов в разных форматах и один 700мб dvdrip. Из десятка загруженных клипов играть отказались лишь 2 (но эта проблема легко решается с помощью программы EmoDio – при копировании через нее она сама переконвертирует видео в нужный формат).
Музыка
Я не буду сильно разглагольствовать насчет удобства интерфейса – каждому свое, я читал множество негативных отзывов, но сам так и не заметил никаких неудобств, главное держать свою медиаколлекцию в порядке – с прописанными тегами и обложками, тогда действительно будет и красиво и удобно, особенно радует режим выбора альбома как на iPod.
Фильм быстро загрузился и без проблем начал играть, так же легко перематывался на нужное место – в целом я очень доволен, не все плееры так шустро работают с видео. Плеер умеет запоминать место, на котором воспроизведение было остановлено. Так же интересной возможностью является способность к разбиению любого видеофайла на несколько глав – как в меню у двддисков!
Просмотр изображений Качество звука хорошее, самсунг здесь главным козырем позиционирует технологию улучшения звучания DNSe (есть как большое количество пресетов, так и возможность настроить все самому). Признаться, сильного впечатления она на меня не произвела, и для таких как я есть обычный эквалайзер, без наворотов. Есть возможность составлять плейлисты (их можно также составлять через EmoDio и
vronline | сентябрь 2010
44
Обзоры от VR
Плеер понимает изображения форматов JPEG (Baseline, Progressive), BMP (макс. 32 бита), PNG, Gif (89a/87a). Легко, практически без подторомаживаний работает с изображениями высокого разрешения, позволяет переворачивать их, масштабировать, а так же поставить в качестве заставки на рабочий стол (еще есть виджет – рамка с фотографиями, куда тоже можно поставить свое фото).
Flash-player
Несмотря на заявленную в плеере поддержку формата SWF (Flash Player 8.0 или более ранние версии, ActionScript 2.0 или более ранние версии), флешки любых версий он играет без звука, а содержащие упомянутый ActionScript и вовсе играть отказывается. Я надеюсь, эту недоработку разработчики устранят в ближайших прошивках, пока же флешплеер бесполезен.
Радио
Радио работает хорошо, имеется режим, как и ручной настройки, так и автоматического поиска. Принимает сообщения RDS (правда у нас в Рязани оказалась только одна радиостанция, которая их транслирует). Надо заметить, что с первого раза плеер нашел не все радиостанции – затрудняюсь предположить почему. Имеется возможность записи эфира.
Радио не поставишь на паузу, но есть моменты, когда просто нужно выключить звук – для этого есть кнопочка mute, признаться в других плеерах мне этого очень не хватало – еще раз приходится снимать шляпу.
Функция чтения текста
Если все предыдущие возможности были вполне ожидаемыми в плане интерфейса, и особенным ничем не отличались, то здесь меня Samsung удивил. Несмотря на то, что плеер понимает только формат *.txt, реализовано все ну очень красиво: твои файлы – это книжки на книжной полке, а на корешке подписаны названия. Просто, но выглядит очень здорово! Нажав на
книжку, открывается твой текстовый файл, причем можно самостоятельно выбрать ему фон и размер шрифта, а
листать его можно, как простым движением пальца, так и настроить автоматическу ю прокрутку. Закладки есть, и работа с ними осуществляется так же непринужденно.
BeatDJ
Мы плавно переходим к второстепенным функциям. BeatDJ – это игрушка позволяющая попробовать вам ремикшировать какуюнить из композиций на вашем плеере, путем добавления различных скретчей, сэмплов и эффектов. Звучит заманчиво, на деле же быстро надоедает.
Игры
Помимо 4 встроенных игр, можно скачать еще несколько с сайта производителя. Из всех 4 игр мне понравилась только «судоку», да и то играть в нее не очень удобно, но убить время помогает, остальные же не представили большого интереса, хотя я так думаю, что довольно качественная графика и звук приведут в восторг более младшее поколение.
Запись голоса
Я привык к свистящим и шипящим диктофонам на плеерах и мобильных телефонах, и каково же было мое удивление, когда я услышал довольно приемлемое качество в этом устройстве. Хотя, конечно надо признать, что бассы сильно искажаются, но всетаки он предназначен для записи голоса, а не для инструментальных записей, поэтому, к сожалению, репетицию на него вряд ли удастся записать.
Файловый менеджер
Ничего особенного – папки и файлы. Из всех возможностей только удаление и добавление в плейлист – бедновато както хотелось бы хотя бы базовых возможностей – переместить, скопировать, создать папку.
Я малость разочарован, признаться, может в следующих прошивках, добавят еще чтонибудь, я на это очень надеюсь. vronline | сентябрь 2010
45
Обзоры от VR
Datacasts
При подключении плеера к компьютеру, EmoDio может обновить RSS ленты новостей через интернет и загрузить в плеер, для последующего просмотра их там. Я пока, что не стал сильно разбираться с этой функцией, но взять на заметку её определенно стоит.
Bluetooth
Напоследок самое вкусное – возможность использования плеера в качестве гарнитуры для телефона, или наоборот, возможность использования стереогарнитуры для прослушивания плеера. И опять хочется пожать руку разработчикам – насколько все красиво реализовано.
Мой Sony Ericsson без проблем «подружился» с YPR1, и теперь, не вынимая телефон из кармана, я могу принимать звонки и звонить сам – качество связи лучше, чем на самом телефоне – хотя наверно я преувеличиваю на фоне общих впечатлений. Для контактов имеется телефонная книга, и скопировать их туда можно, передав с телефона через тот же блютус (хотя не со всех моделей телефонов они распознаются корректно). Также с помощью блютуса можно обмениваться файлами с другими плеерами и телефонами.
Виджеты
Они в основном декоративные и я бы даже сказал «женские». Тем не менее, имеется парочка полезных в хозяйстве: Заметки – с рукописным вводом.
поддерживается русский язык и ввод знаков препинания. Что помешало сделать разработчикам полноценный блокнот – не знаю.
Ввод работает довольно хорошо (хотя тем, у кого пальцы толще моих наверно будет уже неудобно), но минус – не
Мировое время – с красивым глобусом, который можно вращать. Разряд батарейки – мне кажется, он работает немного некорректно, но время покажет. Часы – есть несколько видов.
Календарь – довольно удобный, тем более, что поддерживает импорт событий из Outlook.
На декоративных виджетах я останавливаться не буду, лучше приведу выдержку из инструкции со всеми виджетами:
Подключение к телевизору
Плеер позволяет просматривать видео и фотографии на экране телевизора. В комплекте с ним никаких шнуров не идет, и в инструкции также очень мало написано. Методом дедукции было вычислено, что нужен шнур для подключения видеокамеры к телевизору – с одной стороны 4х пиновый «миниджек», с другой 3 тюльпана. Но, конечно же, все оказалось не так просто, и показывать плеер кроме шумов ничего не стал. Почитав форумы, я понял, что я не один такой, и пришлось крепко задуматься – решение было найдено, и я опишу его в отдельной статье. Надо признать, что качество картинки на телевизоре очень даже хорошее, только не забудьте зарядить батарею, чтобы не омрачить себе просмотр на середине фильма.
Заключение
Итак, как ты уже убедился перед нами самый натуральный медиакомбаин. Samsung нанес хороший удар по конкурентам, но неоднозначный. И самый главный вопрос на повестке дня – почему в таком мощном устройстве такая слабая батарея? Итак, давай еще раз взвесим все минусы и плюсы:
Плюсы:
• Хорошее качество воспроизведения музыки. • Отличная работа с видео.
• Хорошее разрешение экрана, и удобный, адекватный сенсор.
• Большое количество удобных виджетов (я так vronline | сентябрь 2010
46
Обзоры от VR
думаю в следующих прошивках они будут расширяться).
• Возможность настроить интерфейс по своему усмотрению. • ТВвыход. • Блютус.
• Благодаря таким возможностям хорошее соотношение цена/качество.
Минусы:
• Малая емкость батареи.
• Скудный комплект поставки.
• Сложности подключения ТВвыхода (в силу предыдущего пункта).
• Небольшой экран (я понимаю, что есть более старшая модель с большим экраном, но я рассматриваю именно этот плеер ). • Некорректная поддержка flash (надеюсь устраниться прошивкой в самое ближайшее время). • Не самые удобные наушники.
• При таком функционале не хватает только wifi и браузера – получился бы убийца iPod touch.
Итак, какой вердикт? Если ты городской житель и тебе нужен маленький многофункциональный помощник, чтобы скрасить скуку в течение рабочего дня, а так же выгодно щегольнуть перед знакомыми – то must have однозначно. Если же ты турист, которому нужен надежный спутник в дороге, то тут я рекомендую присмотреться к iRiver P7. Выхода на телевизор нет, зато в 2 раза больше памяти, в 2 раза больше дисплей, и в два раза больше время работы от аккумулятора, но и в карман его не положишь. Я своей покупкой доволен, стоит ли следовать моему примеру – решать тебе.
vronline | сентябрь 2010
Перевод: Роман Костенко aka lord_of_fear email: kostenko.r.khv@gmail.com
47
Без рамки
10 лучших дистрибутивов Linux в 2010 году Я считаю, что на данный момент нет ни одного действительно стабильного дистрибутива Linux с графическим сервером на борту. Иксы сводят всю стабильность линукса на нет. Такова ситуация на данный момент…. Я с нетерпением жду того времени, когда я смогу поставить X сервер и буду уверен в 100процентной стабильности. Надеюсь, этот момент настанет… А пока мой выбор Debian без графической среды.
Лучший дистриб для новичков: Ubuntu 1 0.04
Мало кто не слышал об Ubuntu. Именно это слово для большинства пользователей ассоциируется с миром Linux. Ubuntu – антидот в мире неопределённости. В большинстве случаев он работает сразу из коробки. Тебе не нужно беспокоиться о ненайденных драйверах на железо, проблемах установки и конфигурирования софта. Просто вставь диск в привод, ответь на несколько простых вопросов, и ты увидишь красивый интерфейс Ubuntu 10.04, носящий кодовое имя Lucid Linx. В отличие от других разработчиков, девелоперы Ubuntu знают как сделать рабочий стол привлекательным. Нежные оттенки фиолетового, оранжевого и черного теперь смотрятся значительно лучше утомительных тускло коричневых цветов предыдущих версий. Вот только весьма непривычно теперь смотрятся
кнопки управления окнами, располагающиеся в левом верхнем углу. Однако пользователи, имеющие дело с OS X, не найдут для себя этот факт столь непривычными.
Ubuntu обладает отличным репозиторием и менеджером пакетов. Программы устанавливать проще простого. Нужно лишь обладать подключением к интернету. Убунту линукс – победитель в нашем рейтинге.
Лучший дистрибутив для профи: Fedora 1 3.
Fedora Linux включает в себя большинство достоинств Ubuntu, таких как: отличная поддержка оборудования, удобный интерфейс и большой выбор пакетов. Однако есть нюанс: этот дистрибутив не подойдёт, если ты ищешь проприетарное и закрытое ПО. Кодеки MP3, Adobe Flash, драйвера Nvidia и пр. не установить какойто парой кликов мыши как в Ubuntu. Надо заметить, что процесс установки подобного софта только усложняется от версии к версии. Приходится придерживаться альтернатив с исходным кодом, предоставляемых Fedora. Но это и не так уж плохо. Последний релиз включает в себя отличный Nouveau Nvidia driver. Новый менеджер фотографий Shotwell является отличным приложением для работы с изображениями.
vronline | сентябрь 2010
48
Без рамки
Лучший дистрибутив для миграции с Windows: PCLinuxOS
Это – первый из рассматриваемых нами дистрибутивов, использующий графическую среду KDE по умолчанию. Ты, конечно же, можешь подобрать версию и с другой графической средой. Но KDE, на мой взгляд, больше всего подходит для windows пользователей.
PCLinuxOS станет отличным выбором для тех, кто хочет стабильности и windowslike интерфейса. В дистрибутив включены последние версии K3b BlueRay, CD и DVD Burner, Digikam photo management tool, Choqok social networking tool и плеера Amarok. Графическая среда особенно не оставит равнодушными тех, кто последние пару лет юзал виндовый файловый менеджер, редактор реестра и эффекты Aero в Windows Vista и Windows 7.
Puppy Linux – это дистрибутив, образ которого занимает всего 128Мб. Просто запиши образ на диск, загрузись с него и работай. ОС будет работать из RAM. А все произведённые изменения будут записаны на свободное пространство этого же CD/DVD.
А самым классным является тот факт, что 5я версия Puppy может работать с репозиториями Ubuntu. Это даёт возможность установить любой и тысячи доступных пакетов для Ubuntu Linux.
Лучший дистрибутив для твоего десктопа: Linux Mint 9.0
Linux Mint, по моему мнению, по праву занимает место в нашем рейтинге как лучший дистрибутив для десктопа. Может Linux Mint и основан на Ubuntu, но зато он, как настоящий десктопный дистрибутив, с легкостью решает все сложные задания пользователей благодаря множеству встроенных утилит и уникальной графической среды. По дефолту в качестве графической среды используется Gnome c изменёнными панелями. Привычного topbar’а тут нет, а нижняя панель выполнена в стиле Windows. Менеджер пакетов удобнее и продуманней, чем в Ubuntu. Имеется возможность активировать эффекты рабочего стола, Compiz и другие красивости с помощью удобной панели на рабочем столе.
Лучший дистрибутив для старенького железа: Puppy Linux 5.0
Сила Linux в его гибкости. Он работает везде: начиная сотовыми телефонами, заканчивая бортовыми компьютерами космических кораблей.
Лучший дистрибутив для нетбуков: Ubuntu UNR 1 0.04
Отличная совместимость с железом, изысканный GUI и удобное меню запуска приложений делает UNR выбором номером один для нетбуков. Загрузка Ubuntu UNR идёт всего порядка 20 секунд. Поддерживается абсолютно всё железо нетбуков из заявленного разработчиками списка моделей. UNR позволяет продлить время работы от батареи благодаря продвинутым алгоритмам энергосбережения.
vronline | сентябрь 2010
49
Без рамки
Canonical на славу потрудились над графическим интерфейсом. Благодаря ему пользователь имеет удобную возможность переключаться между приложениями, которые работают на максимальном разрешении. Удобства при работе так же добавляют системные сообщения, выдаваемые ОС, например, при низком уровне заряда батареи, новых твитах в твитленте или полученном e mail’е.
Лучший дистрибутив для сисадминов: Debian 5
Debian – один из самых популярных дистрибутивов Linux, оказывающий значительное влияние на развитие этого типа ОС в целом. Всем известный Ubuntu основан как раз на нём. Debian имеет наибольшее среди всех дистрибутивов хранилище пакетов, и если даже не по их числу, то по числу поддерживаемых архитектур: начиная с ARM, используемой во встраиваемых устройствах, наиболее популярных x86 и PowerPC, новых 64разрядных AMD, и заканчивая IBM S/390, используемой в мейнфреймах. Именно поэтому этот дистрибутив – лучший выбор для сисадмина. Стабильные версии операционной системы Debian называются именами персонажей мультфильма «История игрушек». Последняя, нестабильная версия дистрибутива Debian постоянно носит кодовое имя «Сид», по имени отрицательного персонажа из мультфильма, который постоянно ломал игрушки.
Лучший дистрибутив для офиса: OpenSUSE 11 .3
Это – второй из рассматриваемых дистрибутивов, использующий графическую среду KDE по умолчанию. Так же как и PCLinuxOS, который я порекомендовал для миграции с Windows, OpenSuse выбран по той же причине: дружелюбный интерфейс для использования в офисе. Однако, если PCLinuxOS – маленький проект с небольшой поддержкой, то OpenSuse – последняя огромная надежда компании Novell. Поэтому он не только качественно поддерживается на уровне десктопов, но и на уровне серверов. На основе openSUSE также собираются дистрибутивы для корпоративных клиентов Novell Linux Desktop (NLD), Suse Linux Enterprise Desktop (SLED) и Suse Linux Enterprise Server (SLES). Novell активно сотрудничает с Microsoft, которая в результате соглашения о патентах поддерживает и распространяет дистрибутивы SuSE, в которых немаловажную роль играет Mono — реализация запатентованной Microsoft платформы .NET , что вызвало недовольство части сообщества пользователей и разработчиков свободного ПО.
Лучший дистр для серверов: CentOS 5.5
CentOS (англ. Community ENTerprise Operating System) — дистрибутив Linux, основанный на коммерческом Red Hat Enterprise Linux компании Red Hat, и совместимый с ним. По сути CentOS Linux это RedHat Enterprise Linux, из которого удалены только коммерческие закрытые программы. Срок поддержки каждой версии CentOS составляет 7 лет (с помощью выпуска обновлений безопасности). Новая версия CentOS выходит раз в 2 года и каждая версия регулярно обновляется (каждые 6 месяцев) для поддержки новых аппаратных средств. В результате это приводит к безопасной, легко
vronline | сентябрь 2010
50
Без рамки
обслуживаемой, надежной, предсказуемой и
systems/10bestlinuxdistrosfor2010 704584?artc_pg=1
масштабируемой Linux среде.
Лучший дистрибутив для мультимедии: Ubuntu Studio
Первый официальный релиз — Ubuntu Studio 7.04, вопреки нумерации дистрибутивов Ubuntu (Год.месяц), выпущен не в апреле, а в мае 2007 года.
Является разработкой группы MOTU (Masters of the Universe). Цель проекта — быстрое развёртывание готовой к использованию фото, видео, аудио студии с минимальными затратами средств и максимальным комфортом. В отличие от других дистрибутивов Ubuntu, установка Ubuntu Studio основана не на LiveCD инсталляторах, а использует консольную программу. Кроме того, дистрибутив оказался слишком большим, чтобы поместиться на семисотмегабайтный компактдиск, поэтому
обычно устанавливается с DVD.
Оригинал материала:
http://www.techradar.com/news/software/operating vronline | сентябрь 2010
Автор: ZeroXor WWW: zeroxor.ru
51
Без рамки
Как я ставил Linux на нетбук Практические советы из личного опыта
Сбылась мечта идиота! У меня появился небольшой, но весьма шустрый (по моим меркам) нетбук. Точные параметры я сейчас выдать не могу, но могу сказать точно эта крошка мощнее моей десктопной машины. Скорость процессора, правда, практически такая же, но если учесть вдвое больший объем оперативной памяти (причем DDR2 против DDR1 десктопной машины), более скоростной винт и небольшой дисплей, станет понятно, откуда появилась производительность.
Только Linux и ничего больше
Естественно, от Windows 7 Starter мы с супругой (кстати, этот нетбук – подарок мне от нее, уж не знаю, за какие такие заслуги) отказались сразу. Продавец, грустно вздохнув, заблокировал винду и с вселенской грустью в голосе спросил: “ИксПишку ставить будете?”. “Нет, Linux” ответил я. Тот, задумчиво почесав макушку, пожелал удачи.
носители. Ну да ладно, настало время перейти к самому интересному и нужному (особенно если ты нашел этот материал, пытаясь и сам установить Linux на нетбук).
Сорвав с шеи mp3плеер (а он у меня как раз на 256 МБ), я воткнул его в десктоп (да, для создания инсталляционного флешдиска понадобится уже настроенный компьютер) и первым делом определил, каким же устройством он оказался. Создаем загрузочный flashдиск Debian GNU/Linux.
Определяется это до смешного просто (впрочем, в Linux все делается довольно просто): #dmesg
И вот нетбук успешно доставлен домой, распакован и слегка (всетаки я не спал уже больше суток, боялся просто отключиться) обмыт. Сразу стало ясно, что CD/DVDпривода нет (на то он и нетбук, в конце концов), потому устанавливать систему придется неким хитроумным и на тот момент неизвестным мне способом.
Замечу также, что от специальных “нетбучных” сборок я решил отказаться, спасибо френдам из тви, подтвердившим мою мысль, и поставить обычный десктопный Debian Lenny, который затем и допилить до состояния, удобного лично мне.
Любая работа начинается с гугления.
Немного погуглив, я обнаружил, что создать установочную (инсталляционную, говоря умно) флешку не так уж и сложно. Главное, чтобы ее объем был не менее 256 МБ. Конечно, на сегодняшний день это не ограничение, но свой флешпарк я не обновлял достаточно давно, в результате чего имеются и 128мегабайтные
Рисунок 1. Монтируем флешку
Итак, плеер определился как /dev/sda. Теперь нужно было добывать файло, которое, собственно, и будет устанавливаться. Решив не заморачиваться, я вытянул файл загрузочного образа и isoобраз дистрибутива для архитектуры i386.
Если у тебя, уважаемый читатель, есть интерес качать образы для другого типа машин, то нужно поправить адреса ссылок, либо сноватаки vronline | сентябрь 2010
52
Без рамки
погуглить на тему, где их можно добыть. Лично мне хватило этого, потому и не стал искать ничего дальше.
Теперь, не монтируя флешку, открываем (если не сделали этого при определении флешки) терминал, получаем права рута и... и, кстати, не забудь скопировать всю важную информацию с флешки – после выполнения команды она будет уничтожена целиком и полностью (информация, конечно же, а не флешка). # zcat boot.img.gz > /dev/sda
Вместо boot.img.gz поставь полный путь к скаченному файлу загрузочного образа, если ты находишься не в этом каталоге. Ну и, естественно, sda замени на то устройство, которым флешка распозналась на твоей тачке.
Шаг следующий физический. Вынимаем флешку и вставляем ее обратно. Требуется это для того, чтобы наша свежесозданная файловая система распозналась системой. На всякий позорный проверим, что же получилось: # mount /dev/sda /mnt/ # ls /mnt
Таким образом, мы примонтируем флешку и посмотрим ее корневой каталог, если кто не знает. Вместо того, что было (а я предупреждал, что вся информация будет уничтожена, между прочим), можно увидеть не так уж много файлов, в основном, конфигурационнотекстовых, хотя и setup.exe тоже встречается. Если и ты это увидел, значит, все прошло в лучшем виде и можно спокойно заливать туда же образ дистрибутива, простым копированием.
программа aptitude никак не хотела работать с образами дисков. Выполнив ручное монтирование диска, я запустил программу aptitude, которая размонтировала /cdrom/ и упрямо не могла подключить нужный мне репозиторий. Видимо, не понимая подвоха, система пыталась разыскать реальный CD, воткнутый в реальный привод, которого у меня, понятное дело, не имелось.
А теперь о том, почему, собственно, эта трабла оказалась для меня неожиданной. Дело в том, что сетевая карта (уж, по крайней мере, интерфейс eth0) распознавалась всегда на лету во время установки. Моему удивлению практически не было предела, когда во время установки Debian выплюнул мне сообщение "не найдена сетевая карта" и предложил выбрать ее из списка доступных. Неудивительно, что в этом списке ее не оказалось, ведь иначе система и сама смогла бы ее инициализировать.
Локальный репозиторий из isoобразов дисков дистрибутива
Оказалось, что я мыслил в верном направлении, просто не знал еще одной тонкости. Монтирование было делом правильным, просто нужно было не обманывать систему, а прописать в настройках репозитория не диск, а файл с iso образом. Например, я создал в корне каталог repos, а в нем каталог disks, в который и складывал диски, а также каталоги cd1, cd2 и cd3, куда, собственно, и монтировал образы. Затем я отредактировал /etc/apt/sources.list:
deb file:///repos/cd1/ stable contrib main deb file:///repos/cd2/ stable contrib main deb file:///repos/cd3/ stable contrib main
И смонтировал диски: # mount -t iso9660 /repos/disks/debian-505i386-CD-1.iso /repos/cd1 -o loop # mount -t iso9660 /repos/disks/debian-505i386-CD-2.iso /repos/cd2 -o loop # mount -t iso9660 /repos/disks/debian-505i386-CD-3.iso /repos/cd3 -o loop
Вняв мудрому совету, я решил оформить монтирование дисков в виде скрипта, чтобы не мучиться с набором команд каждый раз, когда это понадобится. Попутно сразу создал точки монтирования и скопировал isoобразы дисков на винт. Вот что у меня получилось:
Рисунок 2. Проверяем содержимое флешки
Маленькие разочарования
Дальнейшая установка не сулила никаких проблем, но они нежданнонегаданно появились. После установки сетевой версии Debian Linux
#! /bin/sh mount -t iso9660 /repos/disks/debian-505-i386CD-1.iso /repos/cd1 -o loop mount -t iso9660 /repos/disks/debian-505-i386CD-2.iso /repos/cd2 -o loop mount -t iso9660 /repos/disks/debian-505-i386CD-3.iso /repos/cd3 -o loop
vronline | сентябрь 2010
53
Без рамки
Таким образом, я вытянул первые три CD дистрибутива. Можно было, конечно, продолжить качать, раскладывать, монтировать и устанавливать софт таким же образом, но когда рядом виднеется штекер сетевого кабеля, подключенного к безлимитному тарифу, желание ставиться с диска уменьшается практически до нуля. Потому и было принято решение подружить нетбук с Инетом.
систему на свой вкус и цвет. Ну а поскольку на эти самые вкус и цвет товарищей нет, я и заканчиваю эту статью, оставляя выбор ПО и внешнего вида твоего нетбука исключительно на твое усмотрение.
Настройка сетевого интерфейса в Debian на нетбуке
Судя по тому, что удалось разузнать о сетевой карте, входящей в комплект нетбука это ее модель, JMC26X. Поискав в этом направлении, увидел, что сие чудо железносетевой техники действительно не поддерживается "из коробки". Мало того, найти этот драйвер я не смог бы, даже выкачав полный дистрибутив (а это чуть более 30 CDдисков). Благо, довольно скоро нашлись нужные сырцы, собрать и установить которые, а затем включить интерфейс, было делом трех минут. Делалось это так: Распаковал архив и вошел в свежесозданный каталог с сырцами: # tar xjvf jme-1.0.5.tbz2 # cd jme-1.0.5
Установил драйвер (после выполнения этого действия проверь наличие файла /lib/modules/KERNEL_VERSION/kernel/drivers/net/j me.ko, если он создан, значит, все в порядке): # make # make install
И подключил его: # modprobe jme
После этих действий команда ifconfig показала успешно установленный и даже настроенный eth0. Не очень веря, что решение оказалось настолько простым, я воткнул сетевой кабель в нетбук. Роутер зажег цифру "3" означающая, что интерфейс успешно им обнаружен и запущен в эксплуатацию. Все еще не веря в свое счастье, я открыл Iceweasel, резво вбив в адресную строку доменное имя моего блога. И через парутройку секунд лицезрел загруженную страницу.
Тут и сказке конец
Собственно, на этом все проблемы по установке Linux на нетбук я посчитал законченными. Прописав адреса сетевых репозиториев, я получил доступ ко всем доступным пакетам Debian, всем программам, всем обновлениями, вообще ко всему. Остается лишь настроить vronline | сентябрь 2010
Автор: Овчинников Михаил aka Night Storm WWW: http://nstorm.3dn.ru
54
Без рамки
VKMusic Скачаем все!
Программа, о которой я хочу рассказать сегодня, конечно же, не новость, но в тоже время многие люди о ней даже и не подозревают. О чем я? Бывали в ситуации, когда очень хотелось сохранить песенку, услышанную в контакте? А видео с ютьюба? А быть может тебе часто приходится пробиваться сквозь бесконечные капчи и ожидания на депозите? Для рядовых бездельников это занятие ежедневное и ежечасное, но и даже серьезным и занятым людям приходится иногда заниматься этими «мелкими делишками».
Красивое решение проблемы
Далее я заинтересовался интересной кнопочкой в углу, и вот что я увидел:
Я слишком ценю свое время и нервы (интернет соединение у меня не очень надежное ) чтобы пользоваться онлайнсервисами, да и не очень они удобны и стабильны. Искав альтернативу я совершенно случайно наткнулся на замечательную программу VKMusic.
Очень удобная возможность! Я нашел у своих друзей немало интересной музыки (надо сказать раньше я не обращал внимания на их музыкальные пристрастия). Но и без этого любые исполнители и песни находятся без проблем: Программа при первом запуске попросила ввести почту и пароль от вконтакта. Я не знаю, в какой мере она честна насчет конфиденциальности – я не особо дорожу своей учетной записью в знаменитой социалке (за несколько месяцев использования не было замечено грехов, но на всякий пожарный недолго зарегать и второй аккаунт). Нажав на кнопочку поиска, я обнаружил неплохой список сервисов (во всяком случае, все, что нужно мне присутствует).
vronline | сентябрь 2010
55
Без рамки
Это все хорошо и забавно, но в описании была обещана закачка с deposit files, и rapidshare, но соответствующих пунктов я не наблюдаю. Захожу в настройки. А вот и соответствующие плагины!
Рекомендую к ознакомлению всем любителям слушать хорошую музыку, но не обладающим быстрым и постоянным соединением с глобальной паутиной. Дополнительные ссылки:
http://vikim.ru/ официальный сайт программы.
Все оказалось довольно просто: нужно скопировать адрес файла на любом из поддерживаемых файлхостов в буфер обмена, и программа сама предложит его закачать. Скачка начинается без всяких капч и ожиданий, но если на том, же депозите прервать закачку, то в следующий раз возобновить её можно будет только после таймаута в 40 минут, но все равно приятно, что хотя бы не нужно смотреть ненавистную рекламу.
И на закуску я оставил самую интересную возможность. Нажимаем на неприметную кнопочку с буквой “I”. Перед нами откроется окно, в котором можно ввести исполнителя. Вводим. И нажимаем «Поиск в Яндекс». Вот, что предстало перед моими глазами:
Я, признаться думал, что просто откроется страничка с яндексом и все. Но тут и дискография, и история, и песни, и (внимание!) похожие группы! Отличный помощник начинающим меломанам на мой взгляд.
Просто и быстро
Я не очень интересовался, есть ли еще подобные программы, но конкретным экземпляром я очень доволен, во всяком случае, у меня на винчестере она останется надолго.
vronline | сентябрь 2010
Автор: Kastor Email: KastorDriver@gmail.com
56
Без рамки
Ноутбук + GPS = картографирование
В начале этого лета я купил себе супер девайс, который называется Samsung i900 WiTu. Этот коммуникатор содержит в себе все, что мне необходимо. А в частности я говорю про WiFi и GPS модули. Все это в совокупности с ОС Windows Mobile 6.1 и замечательной программой Sniffi дает мне возможность заниматься картографированием беспроводных сетей, просто гоняя на скутере по улицам города с КПК, который лежит в кармане. Модуль WiFi ловит близлежащие сети и в месте с данными GPS все это заносится в лог файл формата KML. Казалось бы вот оно – счастье вардрайвера. Но это не совсем так. В своей апрельской статье «Вардрайвинг повзрослому» я уже отметил, что модули WiFi мобильных девайсов не такие чувствительные и мощные, как те, что установлены в ноутбуках. Да и программы, которые можно установить на ноут, более функциональны, чем те, что написаны под Windows Mobile. Вывод из вышесказанного такой – сегодня мы подружим наш ноутбук с GPS приемником, который установлен в коммуникаторе.
Часть 1 – Подготовка
Для работы нам понадобятся собственно ноутбук, КПК, набор коекаких программ, терпение и молоток с наковальней (ну на самый крайний случай). Вероятнее всего твой мобильный девайс, при подключении к ноутбуку, будет определяться как мобильное устройство со своим IP адресом, а не как COM порт. Придется помочь ему в этом при помощи программы HW Virtual Serial Port. Она будет устанавливать виртуальный последовательный порт. Качаем ее и устанавливаем в режиме «Stardartalone Application».
Далее переходим к ее настройке (вкладка Settings), которая сводится к установке галочки «TCP Server Mode» и снятию их с «EVT Enabled» и «Connect to Device even if Virtual COM is closed».
Теперь возвращаемся на вкладку «Virtual Serial Port» и устанавливаем свободный COM порт, через который другие программы будут получать данные с GPS приемника. Я выбрал 11й. Так же меняем порт, на который сервис ждет команд, с 23 на 31873. Это вовсе не магическое число. Просто программа, которая будет отсылать данные с GPS приемника коммуникатора, использует именно этот порт. Приготовления готовы, жмем кнопку «Create COM» и созерцаем в разделе «LAN» статус «Listen». Не будем огорчать программу и предоставим ей данные, которые она так ждет. Для этого необходимо подключить свой девайс к ноутбуку через USB кабель и настроить соединение. Возможно, на разных мобильных устройствах это делается поразному, но на моем коммуникаторе под управлением WM 6.1 (вероятно и на всех остальных тоже) это делается через Microsoft Active Sync.
Теперь скачиваем программу GPS2Blue и устанавливаем на коммуникатор. Ее можно найти по ссылке http://users.skynet.be/hofinger/GPS2Blue.html. Там же можно ознакомиться с большим количеством ее возможностей, из которых сегодня нам
vronline | сентябрь 2010
57
Без рамки
понадобится только парочка. Перед тем как браться за программу поищи в своем КПК настройки GPS. У меня программным портом GPS является COM3, а скорость стоит 4800 бит/сек.
Запускаем GPS2Blue и выставляем соответствующие настройки, плюс ставим галочку в поле «TCP/IP». Жмем кнопку «On» и на коммуникаторе наблюдаем кучу сообщений об открытии GPS порта и передаче данных, а на ноуте в HW Virtual Serial Port – статус «Connected».
Поздравляю! Данные с GPS приемника льются к нам на ноутбук и пора бы их использовать в наших коварных целях. В принципе, ты можешь начинать пользоваться различными программами навигации (или им подобными), указывая в настройках для приема данных порт COM11. Но у нас задача другая, поэтому качаем последний Network Stumbler и заходим в настройки, прямо на вкладку «GPS».
Протокол оставляем NMEA 0183 как и скорость в 4800 бит/сек. А порт выбираем такой, какой мы создавали в HW VSP, то есть 11й. Минут через пять GPS приемник КПК найдет необходимое количество спутников и в статусной строке NetStumblera появятся твои координаты.
Врубай на ноуте WiFi модуль и газуй по улицам города в поисках беспроводных сетей. Вместе с кучей полезной информации, которую может определить NetStumbler, так же будут записаны координаты, где была найдена очередная WLAN, а еще вероятное расстояние до нее. Хоть этот
параметр и относительный, но согласись, достаточно интересный.
Наш враг – провод
Что ты говоришь? Мешает провод идущий от КПК к ноутбуку? Сейчас мы избавимся от него. ITшники мы или нет? Используя Bluetooth это сделать проще простого. Необходимо создать соединение между КПК и ноутбуком. На ноуте я использовал внешний USBшный Bluetooth донгл и программу BlueSoleil. На коммуникаторе я добавил свой компьютер в список устройств. Выбрал для соединения последовательный порт и создал исходящий порт COM2 (выбрал из списка доступных).
Теперь запускаем на КПК GPS2Blue и убираем галочку с «TCP/IP». Ставим ее в «BT» и выбираем порт COM2 для передачи данных через Bluetooth. Жмем «On» и наблюдаем радостные сообщения об открытии GPS и
Bluetooth портов, а так же о передаче данных.
BlueSoleil выдал сообщение о подключении моего КПК к COM6 компьютера. Значит теперь именно его надо указывать в настройках NetStumbler’a. Тут уже обошлось без всяких виртуальных портов, об этом позаботился BlueSoleil.
Часть 2 – Картографирование
Координаты определяются, сети ловятся на ура,
vronline | сентябрь 2010
58
Без рамки
данные фонтаном льются в наши лог файлы Network Stumbler’a. Теперь возникает вполне логичный вопрос: что делать с этими *.ns1 файлами? Не просматривать же их каждый раз в самом Стамблере? Нет, конечно! Сейчас мы нанесем найденные сети на карту. Здесь я могу посоветовать тебе два способа. Первый заключается в программе KNSGEM. Устанавливаем ее в корень диска «С:». В образовавшуюся папку «Knsgem» кидаем наши файлы с расширением *.ns1 и запускаем программу.
Если у тебя все прошло нормально, то поздравляю. У меня же, на данном этапе, постоянно вылетала непонятная ошибка. Приходилось жать «Ignore», но ожидаемые *.kml файлы все же создавались. После конвертации они помещаются в папку «KML». Теперь можно открывать полученные файлы в Google Earch и наблюдать найденные сети и различную информацию о них. А информация достойная внимания, ведь помимо данных о самой сети есть возможность просмотра вероятного радиуса действия сети и покрытия ею пространства. Узнать более детальную информацию о программе и скачать ее можно по следующей ссылке http://www.rjpi.com/knsgem.htm.
результате обхода парочки своих кварталов.
При конвертации во втором выпадающем списке был выбран режим «Display as tracks AND waypoints», в результате чего на карту попали не только точки, где была найдена сеть, но и еще какието треки. Вероятно это те места, где ловилась сеть или… блин! Я пока еще сам толком не разобрался, но смотрится красиво =)
Search complete
На этом хочу откланяться и пожелать тебе удачи в дальнейших экспериментах. Помни, что ничего не возможного не существует. Главное приложить немного усилий и поверить в успешный исход дела. Удачи!
Способ номер два заключается в использовании сервиса «gpsvisualizer» по ссылке http://www.gpsvisualizer.com/map_input?form=wifi. Он так же конвертирует лог файлы NetStumbler’a в выбираемый нами формат, среди которых есть
KML.
Сперва выбираем наши лог файлы, далее указываем желаемый формат (KML, думаю, самое оно) и жмем кнопку «Draw the map». В новом окне нам будет предоставлена ссылка для скачивания нашего KML файла. Вот приведу пример своей карты, которая получилась в
vronline | сентябрь 2010
Автор: Антонов Игорь aka Spider_NET Email: antonov.igor.khv@gmail.com
59
Без рамки
Глобальная синхронизация
Забыл флешку на работе? Или закрутился и не скинул на нее важный документ? А может флешка с важными данными и вовсе умерла? Со всеми перечисленными вопросами я столкнулся на своей шкуре и к счастью нашел элегантные варианты их решения. Возможно, они понравятся и тебе. В этой небольшой статье поведаю тебе о том, как я синхронизирую важные файлы между своими тремя компьютерами.
Предыстория
Я был чертовски счастлив до того момента как устроился на работу. Под счастьем подразумевается отсутствие необходимости синхронизировать файлы между разными компьютерами. У меня был один ноутбук, который я мог таскать за собой и флешка. Нужно чтото показать на своем ПК — не проблема! Взял ноут с собой и устроил презентацию. Любимый софт, файлы — все под рукой. С переносом документов аналогичная ситуация — сделал копию на флешку и порядок. Самое главное не забыть обновить файл с документом на буке после того как поработал с ним с флешке. К счастью это проблема решалась также быстро и не принужденно. Требовалось только заюзать соответствующую софтину. Так собственно я и поступал.
В 2006 году я устроился на первую работу с полным рабочем днем. Одновременно со счастьем (тогда мне очень нужна была работа) я лицом к лицу встретился с проблемой синхронизации файлов. В моем владении появился еще один компьютер (рабочий) на котором я выполнял (помимо рабочих задач) свои личные дела (в перерывах писал статьи для VROnline и Хакера). Сначала, все подобные вещи я тупо создавал на флешке, но после внезапной гибели одной из них я завязал с этой затеей. Как сейчас помню, что на той несчастной флешке были исходники и текст статьи в журнал Хакер. Еще спустя полгода я приобрел себе домой еще один компьютер. Тогда я только начал жить
вместе со своей будущей женой и одного компа нам стало категорически не хватать. Мне постоянно требовался ПК для работы, а ей для учебы. Увеличение числа компьютеров также сказалось на проблеме синхронизации. Периодически возникала ситуация, когда мне приходилось работать за разными компьютерами дома, т. е. количество ПК между которыми требуется синхронизировать файлы, возросло до 3 (два домашних и один рабочий). Вот тут я понял, что без нормальной системы синхронизации мне не прожить.
Выход есть: Флешка + Десктопная тулза
Первое решение, которое пришло мне в голову заключалось в поиске мощной программки, которую я мог бы установить на все своих компьютерах, указать ей директорию и источник синхронизации, а она уже следила бы за изменяемыми файлами. Подобного рода программ достаточно много, но одним из главных условий для меня было поддержка работы с флешками. Софтина должна сама определять подсоединение флешки и если флешка являлась синхронизируемой (список флешек, содержимое которых, должно синхронизироваться — второе важное условие), то выполнялась бы синхронизация. Несмотря на мои поиски, найти такую программу мне так и не удалось. Везде попадались тулзы для синхронизации по инету (а с инетом у меня тогда vronline | сентябрь 2010
60
Без рамки
были проблемы). Для моих условий программу найти так и не удалось.
Такое печальное положение дел не оставляло мне выбора как взять и написать простенькое приложение для синхронизации. Благо, сделать это было не сложно. По сути, требовалось только научиться работать с флешками (определение момента подключения, проверка флешки на синхронизируемость и т. д.). Вся эта информация имеется в MSDN, поэтому поколдовав несколько вечеров я смог сварганить вполне рабочую тулзу. В ней была реализована поддержка списка синхронизируемых флешек (сравнение происходило по серийному номеру флешки), а также небольшая система приоритетов и правил (какие файлы заменяем, а для каких создаем копию с номером версии). Потратив некоторое количество времени на разработку, я полностью решил на какоето время свои проблемы. Жаль, что мои трудности с синхронизацией были лишь вершиной айсберга. Внезапно передо мной всплыла проблема с именем «забывчивость». Периодически я забывал флешку дома, а значит, вся стратегия синхронизации проваливалась в тартарары.
Gmail + Google Docs + Google Reader
В 2007 году я решил окончательно распрощаться с почтой от mail.ru. Объем спама, попадающего в мой ящик, просто достал. Его было на порядок больше, чем полезных писем, а постоянно тратить время на удалении лишней корреспонденции мне изрядно надоело. С миграцией на новую почту проблем не возникло. Альтернативу я нашел практически сразу и пользуюсь ей до сих пор. Если кто не догадался, то я говорю о Gmail (mail.google.com). На то время (да и сейчас тоже) почтовик Google выгодно отличался от всех остальных: Куча места
Мощный спамфильтр
Функциональный webинтерфейс
Отсутствие рекламных баннеров
С первых дней я влюбился в Gmail (а после и в другие сервисы WEBгиганта) и юзаю его по сей день. Кстати именно после миграции на gmail я отказался от своего любимого десктопного почтовика — «The bat!». Когдато это была замечательная программа, но сегодня я не вижу в ней смысла, да и какихлибо нужных преимуществ перед gmail тоже. К чему это я все рассказываю? Большое количество выделяемого под почту места, а также удобный RSS Reader не могли остаться мной не замеченными. Посмотрев на все эти
бенифиты, я решил, а почему бы не заюзать сервисы гугл для выполнения синхронизации? Тем более на то время у меня уже дома имелся сносный доступ к сети интернет, а на работе у всех была корпоративная почта (на нее трафик был не лимитированный). Мне ничего не мешало слать письма с важной информацией прямо себе на почту.
Чтобы както разделить список всех писем я юзал систему меток. Вся корреспонденция, которая была из моей рабочей почты, группировалось по определенным меткам. К ним всегда можно было получить доступ, а самое главное среди писем было легко найти нужное. Всетаки система поиска в почте у Google действительно мощная и качественная. Вот так я нашел для себя еще один способ синхронизации. Конечно, он был немного неудобен, но на, то время меня устраивал. Немного позже я открыл для себя google docs и все документы, (статьи, тексты) я стал сразу писать в них (пишу до сих пор).
Ну и как ты, наверное, уже понял, проблема синхронизации RSS фидов решилась путем использования Google Reader. Собственно тут даже ничего не приходилось синхронизировать. Перетащил все фиды из старой программы в Reader и забыл. Захотел почитать — открыл браузер и почитал. Записи доступны в любое время и в любом месте. Лучше не придумаешь.
DropBox — всему голова
Шли дни, летели месяцы. Возможностей моей схемы синхронизации стало катастрофически не хватать. А как же их хватит, если у меня появился дома безлимитный интернет, а вместе с ним возросли аппетиты? Мне хотелось обмениваться с домашним компом целыми файлами (метров эдак так по 50100). Само собой возможности webпочты стало не хватать. Если еще файл размеров 1520 мегабайт можно было позволить себе закачать на почту, то о более серьезных размерах можно было и не мечтать. Да и к тому же меня стало напрягать, что по приходу домой нужно сначала выкачать файлы из почты, а потом уже их юзать. Никакого удобства!
Делать нечего — запряг гугл и начал активные поиски. Долго ли коротко ли, но результаты не заставили себя ждать. Одна из ссылок привела меня на сайт проекта dropbox (dropbox.com). Почитав about, и посмотрев demo ролики я понял — это то, что я искал! Уж эта тулза решит все мои проблемы!
Как работает DropBox
Принцип функционирования DropBox крайне прост. Для начала тебе требуется vronline | сентябрь 2010
61
Без рамки
зарегистрироваться на официальном сайте проекта (http://dropbox.com) и слить клиентскую часть программы. Программаклиент позволит тебе определить папку, содержимое которой будет участвовать в синхронизации, а также начнет вести наблюдение за изменением находящихся в ней файлов и папок. Стоит тебе только поместить в папку, определенную dropbox’ом, файл или директорию, как программа клиент сразу же начнет загрузку файлов на сервер. По окончанию загрузки (твоих файлов на сервер), все переданные файлы начнут расходиться по остальным твоим компьютерам (определенные, как участники синхронизации).
Возможности DropBox
Чтобы влюбиться в DropBox много времени не потребуется. Достаточно ознакомиться со списком функциональных возможностей, как стрелы амура вонзятся в твое сердце. Про наиболее важные из них я поведаю ниже:
1. Тарифные планы на любой вкус. Очень приятно, что создатели DropBox постарались удовлетворить интересы всех категорий пользователей. Тем, кому не требуется синхронизировать очень большие файлы (в пределах 2х гигабайт) незачем платить. Достаточно воспользоваться бесплатной подпиской. Она ничем не отличается от платных за исключением объема синхронизируемых файлов. Как я уже сказал, на бесплатном тарифе он составляет 2 гигабайта. А если быть точнее, то эти два гигабайта можно запросто превратить в 8. Само собой, не платя ни копейки. «Как?» спросишь ты? Достаточно отправить приглашения своим друзьям (через сайт dropbox) и если ктото из них согласится на установку DropBox, ты получишь дополнительное халявное место. Если быть точным, то за каждого приведенного человека ты будешь получать 250 мегабайт места. Неплохо? Я, например, прокачал свой аккаунт до 3х гигабайт. Знаю, что до предельной планки мне еще далеко, но если честно, места и так хватает. Во всяком случае, пока. Кстати, тем, кому 8гигов мало — не расстраивайтесь. Ценник у тарифных планов
весьма дружелюбный и в принципе многие могут позволить себе перейти на платный тариф. Например, тариф с 50ю гигабайтами обойдется всего лишь в 9, 99$/месяц. Для такого объема весьма не дорого. Существует также тариф со ста гигабайтами на борту. За него просят 19,99$. Я пользуюсь сервисов чуть меньше двух лет и пока еще не успел израсходовать и половины места (у меня, правда, доступно 3гигабайта). Так, что я уверен, что для большинства за глаза хватит и бесплатной подписки.
2. Доступ к файлам через web. Ко всем файлам, участвующим в синхронизации есть возможность получить доступ через web. Это очень удобно, когда файлы нужны на чужом компьютере. Открыл браузер, зашел на нужный ресурс и качнул/закачал необходимое файлов. Я эту фичу использую довольнотаки часто. Особенно когда нахожусь в командировке/отпуске. 3. Умная система синхронизации. DropBox достаточно умен и проворен. Если ты используешь его в домашней сети (например, на двух домашних ПК, объединенных в сеть), то DropBox будет делать синхронизацию между ними не по инету, а по локальной сети. Вроде мелочь, но на самом деле фича очень полезная. Расскажу на примере случая, который однажды случился со мной. Мне потребовалось перенести с работы один весомый дистрибутивчик (гдето 600 метров). Как на зло флешки под рукой не было, и решил просто кинуть iso'шник в DropBox. Пока закончится рабочий день, и я доберусь до дома, файлы будут на месте. Закинул файло и забыл. Приехав домой, я сразу же проверил DropBox на домашнем компе.
Решил заинсталить дистрибутив, как вдруг мой стационарный комп подрезала любимая. Ей нужно было срочно чтото сделать по учебе. Ну что ж, думаю, сейчас заведу нетбук и все сделаю на нем, жаль только, что придется расходовать трафик (дело даже не в трафике, а во времени) на синхронизацию такого большего файла. Удалять из синхронизируемой папки его не хотелось, т. к. он мог пригодиться. Включил бук и сразу обратил внимание на поведение DropBox. Он моментально начал синхронизироваться, и скорость закачки большего файла была просто офигенной! «Либо у моего прова слетели ограничения, либо файлы синхронизируются по локальной сети» подумал я. Ответом оказался второй вариант. 4.
Восстановление удаленных файлов
Все файлы, которые были когдато синхронизированы, а потом удалены, подлежат восстановлению в течение определенного времени. Точный временной промежуток сказать vronline | сентябрь 2010
62
Без рамки
не могу, но однажды мне пришлось восстанавливать файл, который я случайно удалил час назад. Сказать по правде в тот момент я даже не знал об этой возможности. Наткнулся случайно на нее в админке (web кабинете). Теперь я спокоен за свои неосторожные действия.
5. Поддержка различных платформ. Разработчики dropbox понимают, что Windows — не единственная ОС, поэтому они не стремаются делать клиентов DB и для других платформ. Будь ты гламурный маковод или суровый линуксойд — не беда. Клиент Dropbox доступен для Windows, Linux, Mac, а также некоторых мобильных ОС: iOS, BlackBerry (на момент написания статьи клиент находился в стадии разработки), Android, Windows Mobile (пока не официальная версия). Только представь, что все твои фотки или заметки, сделанные на коммуникаторе, будут сразу же передаваться на большой комп. Ну, разве не здорово? 6. Свобода для творчества. API DropBox официально открыт, а это значит, что твоя фантазия практически ничем не ограничена. Используй возможности DropBox для интеграции со своими проектами, не изобретай очередной велосипед (ссылки на sdk для различных языков находятся в конце статьи).
На что еще сгодиться DropBox
Не забывай, что применив капельку фантазии, ты сможешь использовать DropBox не только для синхронизации своих документов, но и для поддержания актуальных версий баз данных какихлибо приложений. Например, есть у меня одна программка, которая позволяет хранить заметки в удобном виде. Все хорошо, но в программе не реализована синхронизация. Не можешь — научим! Это досадное ограничение я обошел путем помещения БД программы в папку для синхронизации. В программе для хранения заметок, я прописал путь к новому местоположению БД (как на домашнем компе, так и на рабочем) и со спокойной душой начал юзать ее как в старые добрые времена. Только теперь при изменении или добавлении новой записи в программку хранения заметок Dropbox сразу начинает выполнять синхронизацию, а значит на всех моих компьютерах будет свежая база заметок. Помимо вышеперечисленного нестандартного применения DropBox его запросто можно использовать для создания бэкапов. Пропиши в своих скриптах (в которых выполняется резервное копирование) в качестве пути папку, определенную dropbox для синхронизации. В результате каждый созданный бэкап будет заливаться на сервера dropbox, что положительно скажется на надежности хранения твоих резервных копий. Понятное дело, что для постоянных бэкапов тебе потребуется солидное
количество места, но подумай, не обязательно, же заливать все версии бэкапов в DropBox? Идея примерно такая:
1. Прокачиваем свой аккаунт по максимуму (т. е. достигаем планки в 8 гигабайт).
2. Определяем правила хранения резервных копий, которые будут загружаться на сервера DropBox. Тут все зависит от конкретной ситуации, но в большинстве случаев достаточно заливать на сервера дветри копии в неделю (созданные в начале, середине и конце недели). По достижению срока хранения копии в месяц — удаляем самую первую копию и т. д. Само собой, помимо DropBox все копии должны храниться гденибудь еще. Как говориться: «Резервных копий много не бывает!». 3.
Наслаждаемся халявным сервисом!
DropBox — хорош, но не всесилен
Казалось бы, что еще нужно? DropBox вроде и так все делает отлично! Да, свою работу он выполняет хорошо, но иногда нужна несколько другая синхронизация. Например, мне очень часто хочется сохранить какуюнибудь webстраницу к себе на комп для последующего чтения. Чаще всего такая потребность у меня возникает на работе. Увидел интересную ссылочку, а для чтения нет времени. Вот если бы имелось средство, позволяющее делать текстовые заметки, которые могли бы синхронизироваться со всеми имеющимися у меня компьютерами. Не вопрос, можно забить на опрятность и те же webстраницы кидать в отдельную папку DropBox. Все будет замечательно пока не потребуется скажем поиск. Не думаю, что у тебя когданибудь возникнет желание перебрать пару десятков webстраниц, чтобы найти чтото нужное.
Решений как всегда несколько
Ситуация аналогична с файлами. Проще всего использовать для хранения всевозможных заметок Google Docs. Места там более, чем достаточно; они доступны в любой точке мира; с поиском так вообще проблем нет. Красота! Жаль только, что копировать именно webстраницы в них несколько неудобно. Я не раз сталкивался с ситуацией, когда вместе с копируемым текстом я получал кучу какойто срани. Благо Google Docs — не единственный выход. Уже достаточно давно развивается программа Evernote (http://www.evernote.com). Я им начал пользоваться не так давно, но чувствую, что наша дружба затянется надолго.
Что такое Evernote?
Evernote — сервис для синхронизации текстовых заметок, изображений, аудиофайлов и видео vronline | сентябрь 2010
63
Без рамки
роликов. В отличие от универсального DropBox, Evernote заточен для работы с текстом и изображениями, а значит тут есть все необходимые фишки для комфортной работы с этими типами данных: поиск, система тегов, группировка информации и т. д.
Как и в случае с DropBox, для того чтобы начать пользоваться Evernote тебе необходимо загрузить клиентское приложение и создать аккаунт. Собственно говоря, в нем ты будешь работать со всеми своими заметками. Клиентское приложение доступно для нескольких платформ (Windows, Mac, iPhone, iPod, iPad, Android, BlackBerry, Palm Pre, Windows Mobile). К сожалению, версии для Symbian и Linux (для linux есть неофициальный клиент, ссылку на него ищи в конце статьи) пока нет. В распоряжении этих пользователей пока имеется лишь WEBинтерфейс, который, надо отдать должное, сделан качественно. По внешнему виду, клиент Evernote чемто напоминает интерфейс MS Outlook (см. соответствующий рисунок): слева расположены группы заметок, а остальную часть занимает список заметок и область для их чтения.
предоставляют дисковую квоту в размере 500 Мб/мес, т. е. каждый месяц твое хранилище может разрастаться на 500 мб. При использования бесплатного тарифа тебе придется довольствоваться лишь 40 мб/мес. По своему опыту могу сказать, что эти сорок мегабайт более, чем достаточно. Во всяком случае, мне хватает. 3. Типы файлов. На платной подписке нет ограничений на тип загружаемых файлов. Бесплатный тариф подразумевает хранение лишь изображений, рукописных заметок, документов в формате pdf, а также аудио файлы.
4. Доступ к предыдущим версиям заметок. Пока я не пользуюсь платной подпиской и не могу высказать свое личное мнение касательно этой фичи, но уверен она понравится тем, кто любит набивать и постоянно редактировать свои заметки (создаваемые в evernote). Поправил текст, а через недельку вспомнил, что всетаки первая версия была не такой уж и плохой. Не вопрос — пару щелчков мыши и первый вариант предстанет перед тобой во всей красе. 5. Максимальный размер одной заметки. Для бесплатных тарифов это 25 мегабайт, а для платных в два раза больше. 6. Повышенная безопасность. Для платных тарифов реализована поддержка SSL шифрования.
Сколько стоит расширенная версия Evernote
Все создаваемые заметки можно группировать по дневникам (дневник = группа). Я лично сразу потратил несколько минут времени и создал необходимые группы. Чего советую сделать и тебе, иначе ты рискуешь быстро сотворить информационный бардак.
Досадные ограничения
Evernote — хороший и полезный сервис, предоставляющий кучу ресурсов, но все хорошее нужно платить. Сразу после регистрации ты автоматически подписываешься на бесплатный тарифный план. От платного он отличается:
1. Невозможность убрать рекламный баннер в интерфейсе программы, 2. Ограничения на количество создаваемых заметок в месяц. На платном тебе
Несмотря на большие отличия от бесплатного тарифного (взять хотя бы объем места) платная подписка на Evernote стоит всего лишь 5$ в месяц. Дорого это или нет — решать тебе. Про себя скажу, что пока я не решился на покупку, т. к. мне за глаза хватает и бесплатной. Если начну испытывать нехватку, то скорей всего разорюсь на платный тариф.
Особые синхронизации
Про софт для синхронизации файлов я рассказал более, чем подробно, но помимо простых файлов иногда требуется синхронизировать настройки какихлибо приложений. Да, в самых простых случаях мы можем использовать для этого DropBox и драйвер prymie_ruki.sys — настраиваем в приложении, параметры которого хотим синхронизировать новые пути к конфигурационным файлам (если программа поддерживает такую функцию). Под новым путем подразумевается папка DropBox через которую и будет выполняться синхронизация. Все просто и красиво.
Увы, такой трюк не удастся провернуть для большинства программ. Мне в принципе это и не vronline | сентябрь 2010
64
Без рамки
нужно. Я юзаю не так много программ, которые требуется както по особенному твикать. Единственное, что мне хотелось бы, чтобы домашний браузер синхронизировал установленные плагины со своим коллегой, которым я пользуюсь на работе. Ведь как оно бывает, сидишь на работе читаешь чьюнибудь заметку про интересный плагин, затем ставишь его и радуешься расширенным возможностям. Возвращаешься домой, открываешь привычное окно бродилки, а в нем чегото не хватает — свежеустановленного плагина. Знакомая ситуация?
В этом вопросе очень сильно повезло пользователям Google Chrome. Начиная с 6й версии (если не ошибаюсь) возможность синхронизации плагинов (а также других параметров браузера) появилась как встроенная фича. Честь и хвала тому, кто придумал и реализовал эту опцию! К сожалению, полностью перейти на Chrome я пока не могу. Глюки браузера убиты еще не до конца, а закрыть на них глаза я не могу. Вот и приходится ездить на лисе и ломать голову над решением выше озвученной задачи.
Как обычно борются с отсутствием определенной функции в FF? Правильно, путем поиска соответствующего плагина. Данная ситуация не исключение, поэтому я сразу отправился на https://addons.mozilla.org и принялся за поиски подходящего плагина. К моему удивлению, долго искать не пришлось. Мне на глаза попался плагин с именем FEBE. Он позволяет создавать резервную копию плагинов, установленных в браузере. Кроме того он может включать в резервную копию: истории, закладок и т. д. Все созданные бэкапы он помещает в выбранную тобой директорию. Сам по себе плагин не умеет передавать файлы с созданными резервными копиями. Об этом придется позаботиться самому. Если ты уже установил себе DropBox, то много думать не придется. Просто указываешь в качестве папки выгрузки плагинов отдельную, участвующую в синхронизации, директорию в DropBox и все.
Применять данный плагин я начал совсем недавно, но пока его функциональностью более, чем доволен. Попробуй его в действии и ты. У меня сразу будет к тебя одна просьба, если ты найдешь более функциональный плагин для решения вопроса с синхронизацией плагинов, то pls сообщи и мне ;)
Синхронизация успешно завершена
Организовать синхронизацию данных между разными компьютерами не так уж и сложно. Достаточно выбрать соответствующий инструмент, потратить немного времени на его настройку и наслаждаться результатами. Сейчас
я уже не могу представить свой комп без DropBox и Evernote. Все необходимые файлы находятся в них, и я чертовски рад, что фраза «ой я зыбыл флешку с важными данными на работе/дома» больше ко мне не относится. На этом все, удачной синхронизации, дружище! Дополнительные ссылки:
Забыл флешку на работе? Или закрутился и не скинул на нее важный документ? А может http://dropbox.com – официальный сайт DropBox. флешка с важными данными и вовсе умерла? Со http://nevernote.sourceforge.net/ здесь можно всеми перечисленными вопросами я столкнулся загрузить неофициальный клиент EverNote на своей шкуре и к счастью нашел элегантные (NeverNote)их для использования операционной варианты решения. Возможно,вони системе Linux. понравятся и тебе. В этой небольшой статье поведаю тебе о том, как я синхронизирую плагин https://addons.mozilla.org/ru/firefox/addon/2109/ важные файлы между своими тремя FEBE для FireFox, позволяющий выполнять компьютерами. синхронизацию плагинов.
Предыстория http://www.evernote.com/
официальный сайт EverNote. Я был чертовски счастлив до того момента как
устроился на работу. Под счастьем подразумевается отсутствие необходимости синхронизировать файлы между разными компьютерами. У меня был один ноутбук, который я мог таскать за собой и флешка. Нужно чтото показать на своем ПК — не проблема! Взял ноут с собой и устроил презентацию. Любимый софт, файлы — все под рукой. С переносом документов аналогичная ситуация — сделал копию на флешку и порядок. Самое главное не забыть обновить файл с документом на буке после того как поработал с ним с флешке. К счастью это проблема решалась также быстро и не принужденно. Требовалось только заюзать соответствующую софтину. Так собственно я и поступал. В 2006 году я устроился на первую работу с полным рабочем днем. Одновременно со счастьем (тогда мне очень нужна была работа) я лицом к лицу встретился с проблемой синхронизации файлов. В моем владении появился еще один компьютер (рабочий) на котором я выполнял (помимо рабочих задач) свои личные дела (в перерывах писал статьи для VROnline и Хакера). Сначала, все подобные вещи я тупо создавал на флешке, но после внезапной гибели одной из них я завязал с этой затеей. Как сейчас помню, что на той несчастной флешке были исходники и текст статьи в журнал Хакер. Еще спустя полгода я приобрел себе домой еще один компьютер. Тогда я только начал жить вместе со своей будущей женой и одного компа нам стало категорически не хватать. Мне постоянно требовался ПК для работы, а ей для учебы. Увеличение числа компьютеров также сказалось на проблеме синхронизации. Периодически возникала ситуация, когда мне приходилось работать за разными компьютерами дома, т. е. количество ПК между
vronline | сентябрь 2010
VRCrew
65
Меня тошнит!
Меня тошнит!
JimmyJonezz: Женщина за рулем это мартышка с гранатой, за этот месяц я такое видывал, что не каждый юморист опишет эти забавные и смешные ситуации. Меня удивляет, и я постоянно задаюсь вопросом: чем интересно руководствуется женская логика, при выполнении того или иного действия, будь то разворот машины на перекрестке, езда задним ходом и т.д. Как они вообще ездят!? Кто позволил им взять в свои руки, руль автомобиля!? Они как инопланетяне с другой планеты вышли из космического корабля и сели за транспорт, да не просто сели, а принялись управлять им. "Долой женщин с автомобилей, даешь женщину на кухню". ZeroXor: Наверное, не меня одного просто наизнанку выворачивает от наглости некоторых старушек, называемых на лурке метробабками. В метро я не езжу, но вот маршрутками и иногда автобусами – приходится. Такие зачастую встречаются персонажи, уверенные, что все и каждый им чтото должен. Особенно неприятно было выслушивать всякие гадости, сидя с почти 39 градусной температурой. Kastor: Уже минут 15 стараюсь вспомнить, что ни будь неприятное, что случилось со мной за этот месяц. Но в голову приходит только одно событие, связанное с моим
университетом. Вернее, даже с моим факультетом. Но я об этом даже рассказывать не хочу, на столько все тупо и смешно. Скажу только, что стремление продолжать учиться в нем падает все ниже.
zahod5277: Все. Сил моих больше нет. У кого еще зуб на компанию "Миелофон"? Едем в Москву и сожгем их главный офис нахрен!!! Рассказываю в чем дело. Значится. Так как в городе, в который я недавно переехал, уже присутствует 3G покрытие, решил первое время обойтись своим 3Gмомедом. Первые две недели прошли очень замечательно скорость загрузки 100170 кб/с (это, поверьте, для меня ОЧЕНЬ много), странички открываются махом, счастье! Вдруг приходит месседж "Через 50 мб вводится ограничение на скорость". Не успел я дочитать СМС как скорость потухла. Оставшиеся две недели сидел с максимальными 812 кб/с!!! На такие извращения даже dialup не способен. Решил пожаловатся в компанию пришел туда, обьяснил ситуацию. Девушка, похлопав глазками и посмотрев в монитор, заявила, что, мол, у меня тариф дурацкий, если подключу другой все будет тип топ. Толи сыграла обаятельность девушки, толи я такой доверчивый, поверил в общем. Дождался конца месяца, заправил снова один деревянный килорубль и опять начал радоватся счастью (100 170 кб/с все таки!) Что вы
думаете? Прошло опять так ровно две недели. Хлоп! Все. Хеллоу 8 кб/с! Как я по вам скучал. В конце месяца (сентября) скорость вообще бьет все возможные рекорды. Я гугл открываю только с пятой попытки! Вот думаю можно ли их засудить или нет? Отмажутся же полюбому. Zanuda25: Меня уже тошнит от всех реформ правительства Грузии, особенно в сфере образования и науки. Вот до чего мы все докатились. Проводят эксперимент по внедрению системы обучения английкому языка с первого класса. Последствия они себе не представляют. Или еще одно новшество в сфере образования, которое больно ударило по психике пожилых педагогов. Представьте себе, старше 60 лет педагоги будут проходить курсы обучения работе с компьютером, иначе они будут считаться вроде ретроградами или, хуже того, второсортными людьми. Вот меня уже как 2 недели мутит от этих новшеств... Spider_NET: Обычно в этой рубрике я выражаю недовольство к нашим чиновникам, но в этот раз я решил изменить традициям. Не поверишь, но в сентябре меня затошнило от того, что моих возможностей не хватает на реализацию всех задуманных идей. Вот реально, планы есть, новых идей предостаточно, а воплотить все это в жизнь не получается. Банально не
vronline | сентябрь 2010
66
Меня тошнит!
хватает времени. Вроде пытаешься все спланировать и рассчитать, но на 100% все продумать не выходит. Обязательно случиться непредвиденная ситуация, которая спустит весь план в унитаз. Надоееееееееелллллло! Бесссссссситтт! Как же хочется немного стабильности и чуточку свободного времени. Ну почему в сутках всего лишь 24 часа?! lord_of_fear: Поднакопилось у меня за этот месяц... Тошнило иногда по несколько раз за неделю. :) Взять хотя бы процесс сборки нового кухонного гарнитура. Ох, уж я намучился. Непрерывная тошнота длинной в 3 дня :) По ходу сборки оказалось, что производители ламеры. Посему пришлось вносить свои изменения в конструкцию изделия. :) Но в результате всё вышло отлично. Решил ещё себе шкафкупе установить. Узнал сколько стоит и первой фразой, которая у меня у меня вырвалась, стала "Охренели чтоли? Он из золота что ли?". 55000 за какойто шкаф! Совсем ошалели. В результате, как оно обычно бывает у нас в стране, знакомства сделали своё дело. Я поставил себе шкаф за 20000. Существенная разница, да? И то, 20k его максимальная цена! :)
vronline | сентябрь 2010
Автор: Jimmy Jonezz Email: jimmyjonezz@bk.ru
67
Креатиff
Векторная графика Inkscape: Создаем постер
Очередной серфинг по сети, в поисках «вкусностей», привел меня на сайт deviantart.com, на котором я тут же начал обживаться. Создал аккаунт, получив возможность просматривать закрытые работы художников, а также загружать свои. После некоторого ознакомления с персональным кабинетом, я, наконец, принялся просматривать альбомы, по интересующим меня тематикам. В процессе беглого осмотра, я наткнулся на альбом с коллекцией постеров, от разных художников. Понравившиеся мне, тут же пошли в папку «Избранное», и вдохновленный работами, я принялся создавать свой постер, но для начала решил глянуть урок от Simona Pfreundner, который мы и рассмотрим ниже. Как и в предыдущих уроках, инструмент, которым мы будем пользоваться остается неизменным – векторный редактор Inkscape. Если кто еще не знает, что это за редактор, то советую не полениться и полистать предыдущие журналы «vronline» за 2010 год, или обратиться к поисковику. Надеюсь, вы также как и я, полюбите этот инструмент. Хочу сделать, некоторое отступление по поводу того, что мое описание всех производимых действий будет несколько сжато, т.к. опять же повторюсь, в предыдущих уроках мы затрагивали основные «моменты» редактора, поэтому чтобы не зацикливаться на одном, я не буду особо расписывать свои действия. Новичкам, советую читать подборку журналов, вышедших ранее августа 2010 года.
Чуть выше, я привел часть образца (для того, чтобы заинтриговать читателя – прим. автора), нашего будущего постера, который еще предстоит создать.
Начнем с дерева. Инструмент «перо» используем для обрисовки дерева. Конечно, сложно сразу, да и при помощи мышки нарисовать красивое дерево, поэтому я бы посоветовал сначала нарисовать образец на листе бумаги, и уже потом использовать отсканирование изображение или найти пример дерева в Интернете. Мой пример дерева, ниже. Я уже сделал несколько, копий и расставил так, как мне нужно.
Окраску дерева и его обводку, оставляю на ваше усмотрение. Это, думаю не должно вызвать какиелибо затруднения. Теперь, нужно нарисовать несколько листьев, желательно разных размеров. Используем все тоже «перо». Хочу отметить, что контур, который будете рисовать должен быть замкнутым, иначе вы не сможете произвести заливку. Ниже, пример того, как это сделал я. Цвет листьев badc2fff, а обводка 789314ff. После создания пяти листьев, располагаем их вместе и объединяем в единый объект.
Совсем забыл напомнить, что для дальнейших
vronline | сентябрь 2010
68
Креатиff
действий, нам понадобиться инструмент «Spray» это необходимо для создания кроны дерева, т.к. дублирование объектов не всегда даст нужную нам форму, поэтому обновляйте Inkscape до последней версии и приступайте к созданию кроны. Чтобы опрыскиватель распылял листья, выделите объект листьев и применяйте распылитель, но не делайте ее слишком плотно. Чтобы придать естественность, несколько деревьев переместите на некоторое количество слоев вперед, а также вручную расположите листья, чтобы придать более эстетический вид кроне дерева.
Далее приступим к созданию травы, создай три травинки (за основу окрашивания травы, возьмите цвет листьев), продублируй и к продублированн ому объекту примени зеркальное отображение (клавиша «H»). Расположи, их ближе друг к другу и объедини в один объект. Результат моей работы ниже.
Теперь создай прямоугольник, высотой в ~23 см, на всю ширину страницы, заполните его цветом травы и по верхнему и нижнему краю, данного прямоугольника пройдитесь распылителем, взяв за объект распыления куст травы, приготовленный нами ранее.
Теперь необходимо позаботиться о фоне, для этого, я бы посоветовал создать новый слой. На всю страницу помести прямоугольник и примени градиентную заливку: от черного цвета к красному.
Позади деревьев создадим эффект «взрыва» солнечных лучей. Создадим некий луч, в виде удлиненного треугольника, и с помощью двойного щелчка по объекту переместим центр вращения объекта на конец треугольника. Далее с помощью команды «Клоны» «Создать узор из клонов…»,
вызываем диалоговое окно, в котором устанавливаем следующие параметры: 1.
Симметрия: Простое смещение.
3.
Строк должно быть 25, а столбцов 1.
2. Смещение: Смещение по Y, на строку: «– 100%». 4.
Поворот: На строку: 19 градусов.
Конечно, у тебя будут свои значения, в зависимости от размера клонируемого объекта. Я советую присмотреться к этому диалоговому окну, т.к. при помощи клонирования можно делать достаточно интересные абстрактные фигуры. Теперь мы просто объединяем все получившиеся «лучи» и помещаем этот объект позади деревьев. Я применил градиентную заливку: от черного цвета до прозрачного (можно темно зеленый). Деревья сливаются с фоном, поэтому я немного осветлил стволы, также можно применить более светлую обводку. Продублируем один из стволов, и применим к нему трансформацию (Shift+Ctrl+M): вертикально отразим продублированный ствол, и используем вращение на угол 45 градусов (deg), при этом, увеличив масштаб на 150%. Убираем обводку и применяем градиентную заливку – от черного цвета к прозрачному. Далее дублируем еще один ствол и также отображаем его вертикально, увеличив масштаб на 170%.
Добавляем слой, на котором будет располагаться текст, т.к. основную информацию постер несет через текст. Нам понадобиться экзотический шрифт «Astro867» (ссылка на скачивание в конце статьи – прим. автора). Пример выполнения ниже:
vronline | сентябрь 2010
69
Креатиff
На этом, пожалуй, и все. Некоторые моменты остались за кадром, но в конце этой статьи лежит ссылка на оригинал данного вольного перевода, где вы сможете более подробно рассмотреть все, то, что я намеренно не стал приводить здесь. Свои предложения и пожелания, а также вопросы, направляй мне, или же на форум нашего сайта – мы обязательно тебе поможем. Автор: Simona Pfreundner Дополнительные ссылки:
Оригинальная статья: http://vector.tutsplus.com/tutorials/designing/howto makeanecofriendlyvectorposter/ Шрифт «Astro867»: http://www.dafont.com/astro867.font Inkscape: http://www.inkscape.org/
vronline | сентябрь 2010
Автор: Редькин Дмитрий aka zahod5277 zahod5277@vronline.ru
70
Креатиff
Photoshop. Расскрашиваем фото
Все никак не вяжется вступление, поэтому скажу лишь что данный прием очень интересен и может использоватся в переделке существующих фото и при создании коллажей. Итак, поехали. Открываем фотошоп с заготовленной ранее картинкой.
Для начала нам надо устранить шум на лице, сделать кожу более гладкой. Это нужно сделать для того, чтобы наша “краска” легла максимально ровно и гладко. Делается это легко и просто. Дублируем слой. Выбираем верхний слой, именно его будем редактировать. В меню фильтров выбираем “Шум”“Медиана”. Радиус выбираем на глаз, но так, чтобы не сильно исказилось исходное изображение. Далее используем размытие по Гауссу, и так же как и с шумом, радиус делаем небольшим (2 пикселя и то много). Далее накладываем слоймаску (о работе с масками можно прочесть в одном из моих уроков). Теперь черной мягкой кистью делаем более четкими глаза, губы, волосы, уши, нос. Все выполняем предельно аккуратно, экспериментируя с прозрачностью и нажимом кисти. В итоге у вас должна получится такая мадам. Не очень и
отличается от оригинала, но поверьте, разница существенна. Теперь объединяем эти слои и переходим к следующему этапу нашей работы. Дублируем нашу мадам, и на время забываем о ее существовании. Создаем новый слой, выбираем кисть с мягкими краями, цвет приблизительно d1bfa5, и аккуратненько закрашиваем лицо и шею. После закрашивания мягким ластиком стираем области глаз, губ, бровей.
Теперь фокус. В окне режима наложения слоя выбираем “Цветность”. Вуаля!
Таким же образом закрашиваем губы и глаза, не забываем для каждой новой части лица создавать новый слой. Далее придадим глазам выразительности. Создадим новый слой. Белым
vronline | сентябрь 2010
71
Креатиff
цветом закрасим глазные яблоки.
«затемнение» и «осветление» и поиграться на цветном слое. Этим самым мы смогли бы добиться объемности без дополнительного слоя и без изменений параметров наложения. Однако, приведенный мной прием более быстр и больше подходит для новичков.
Далее применим небольшое размытие и сотрем участки, выходящую из области глаз. Затем нарисуем ей ресницы. Берем тонкую черную мягкую кисть и аккуратненько обведем места, где елееле видны ресницы. Теперь опятьтаки немного размоем и убавим непрозрачность слоя до 5060%. Тем самым мы добавили “теней”, чуть видимых, но неплохо подчеркивающих глаза. Тем же образом раскрасим брови. Волосы заслуживают отдельного внимания. Да, конечно, их можно так же покрасить, но мы их просто затемним. Берем лассо, обводим волосы нашей мадам, копируем и на новом слое вставляем. Меняем режим наложения на “Умножение” и опятьтаки немного размываем. Далее можно добавить бликов, создав новый слой над слоем с кожей, немножко повозюкать там белым цветом, размыть и обрезать мягким ластиком, так же можно осветлить блузку. Сейчас наступает коренной перелом. Помните, после “гламуризации” кожи мы дублировали нашу мадам? Так вот, сейчас мы осветляем при помощи кривых верхний слой, и ставим режим наложения “Линейный свет”.
Поразительно! Наша мадам оживилась, хотя всего десятьпятнадцать минут назад она была всего лишь карандашным рисунком!
Для придания еще большей реалистичности можно было бы воспользоватся инструментами vronline | сентябрь 2010
Перевод документации: italija (http://www.demiart.ru/forum/index.php?showuser=1575)
72
Креатиff
Incendia. В первый раз в первый класс.
Incendia – простая, но в то же время удобная программа для создания трехмерных фракталов. Сегодня нам предстоит в этом убедиться на практике. Загружай программу с официального сайта (www.incendia.net), устанавливай и возвращайся к тексту статьи. Хотя, статьей ее назвать нельзя, т.к. по сути это перевод официальной документации.
по которому будут распределяться выбранные тобой формы и фигуры. С помощью ползунка или стрелки выполняется перемещение по списку фракталов. После выбора фрактала, в окне просмотра появляется изображение со случайным набором различных параметров, этот процесс непредсказуем (рисунок 3).
Немного о документации
Документация INCENDIA условно можно разделить на различные группы. Например: The Fractal and Main Control Panel
Эта панель дает краткую, но крайне важную информацию о выбранном фрактале: имя фрактала;
количество преобразований (трансформаций) используются; количество базовых форм используется;
выбранная резолюция для рендеринга (а точнее размер изображения);
2xAA (Antialiasing) вариант (отображается только в случае его действия); Рисунок 1. The Fractal and Main Control Panel
Элементами являются (рисунок 2):
Рисунок 4. Кнопки загрузки и сохранения параметров
Рисунок 2. Элементы
Здесь ты можешь выбрать сам фрактал, нажав на фрактальное имя, а точнее тот тип фрактала,
Кнопки служат для сохранения в текстовый файл, в котором определены все параметры программы и загрузки уже ранее сохраненных параметров. Расширение файла используется ". par". Содержание буфера этими кнопками не сохраняется. Рисунок 5. Загрузка и сохранение буфера
vronline | сентябрь 2010
73
Креатиff
Эти две кнопки для сохранения всех параметров программы в буфер на данный момент и выгрузки их из буфера. Расширение файла используется ". Zb3" и содержимое файла является бинарным.
Рисунок 6. Сохранять и загружать сценарии: (рис.6)
Эти две кнопки служат для сохранения и загрузки Incendia сценариев. Кнопка «Сохранить скрипт» видна только в некоторых фрактальных типах, что позволяет пользователю экспортировать выбранные для фрактала сценарии. Incendia запрашивает файл и сценарий сохраняется с расширением ". PRG". Сценарий может быть изменен в любой текстовой программе, такой как notepad.exe. Кнопка загрузки сценария видна только при выборе фрактала Incendia Script. С помощью ее вы ты можешь загрузить любой Incendia Script. Для более подробной информации о сценариях и их форматов, смотрите раздел Incendia Script документация.
В чем принципиальное отличие загрузки параметров от скриптов: параметры это уже готовая скомпонованная сцена с изображением, скрипт же это набор определенных последовательных действий, которые можно накладывать на различные формы и сцены и получать всегда разные интересные результаты.
Рисунок 7. Создание нового фрактала
После того как ты выбрал тип фрактала, можно выбрать случайные фрактальные параметры этой кнопкой. Это приведет к появлению новых
фрактальных вариантов каждый раз. Поскольку параметры являются случайными (хотя и существуют некоторые правила, которое управляют формой фрактала), то предыдущий фрактал будет полностью стерт.
Рисунок 8. Кнопки Preview и Draw
Эти две кнопки используются в основном, для просмотра фрактальных итераций в двух режимах: Draw (белые точки) и быстрый предварительный просмотр фракталов Preview (заштрихованы и с текстурой). Кроме того, они могут быть использованы для блокирования и разблокирования трекбола управления камерой и ползунка масштабирования. Используй кнопку «Предварительный просмотр», чтобы увидеть, как фрактал развивается.
В окне просмотра, при выборе режима Draw, ты можешь контролировать фрактал с помощью мыши. Левая кнопка мыши управляет трекболом вращения. Можешь ограничить вращение по различным осям, выбрав конкретное направление в трекболе Rot: ТВll в любом направлении; Xr вверх, вниз; Yr вправо, влево; Zr по часовой стрелке, против часовой. Правая кнопка мыши управляет перемещением фрактала. Оно также может быть ограничено конкретными направлениями в трекболе: Trans: XYt в любом направлении; Xt по горизонтали; Yr по вертикали.
Колесо мыши контролирует коэффициент масштабирования (если на твоей мышке отсутствует колесико, то юзай вместо него ползунок Zoom).
Примечание: кнопки просмотра изображения работают только в условии, когда отключены параметры Baseshapes и Transformations на вкладке Editors, так что если тебе не удается посмотреть на свое творение, первым делом проверяйте и выключайте именно эти данные.
Рисунок 9. Кнопки Render и Continue
Кнопки предназначены для запуска отрисовки фрактала, перед его сохранением. Render начинает процесс рендеринга, сводя все vronline | сентябрь 2010
74
Креатиff
содержание буфера в первую очередь (если у вас установлен предыдущий фрактал в буфере). Если буфер пустой, то сразу рендерится отображаемое изображение. Если вы остановили процесс рендеринга и снова нажмите кнопку Render, она покажет предупреждение, что предыдущее содержимое буфера будет стерто.
изображения и выбирать наилучший результат. Если уж ничего не устраивает, то продолжать рендерить до потери сознания.
Рисунок 10. Диалоговое окно
Ответ "да" если ты хочешь удалить все и начать рендеринг заново. Отвечай "Нет", если ты не хочешь потерять предыдущее содержимое буфера. После нажатия этой кнопки она исчезнет, и появляется кнопка Stop . Эта кнопка просто останавливает процесс. Ты можешь использовать ее, чтобы прервать все потоки программы, которые действуют на фрактал. При нажатии на Stop, кнопки Render и Continue вновь станут видимыми. Кнопка Continue работает точно так же, как и Render, но с той лишь разницей, что она не стирает содержимое буфера. Это полезно, если ты остановишь фрактальный процесс рендеринга (для сохранения, например, изображения), а затем захочешь, продолжить. Небольшое предупреждение: Поскольку кнопка "Продолжить" не стирает содержимое буфера, если ты прервешь процесс и сделаешь поворот, Zoom, Pan или изменишь, любой параметр фрактала, то будет отображено как новое, так и старое содержимое (другими словами ты получишь двойное изображение).
Важное примечание: На момент нажатия Render или кнопки "Продолжить", панель предварительного просмотра станет черной. Используй кнопку предварительного просмотра, чтобы увидеть фрактал. Рисунок 11. Колесо для запуска рендеринга,
Это колесико появляется после запуска процесса рендеринга (нажав «Пуск» или кнопку «Продолжить»). Оно начинает вращаться, а фрактал вычисляется. Оно исчезает, если нажать кнопку «Стоп». Процесс рендеринга в этой программе очень длительный и ответ на вопрос: "а колесико вообще когданибудь заканчивает свое вращение?" так и не был получен. В связи с этим, есть смысл периодически останавливать вычисления, сохранять изображении, а затем запускать вычисление снова (кнопка Continue). Уже потом сравнивать сохраненные
Рисунок 12. The Render Panel
Save Bitmap кнопка сохранения фрактала в Bitmap (*. BMPфайл). Ее нажатие приводит к остановке рендинга и сохранения файла. Сохранение скорости определяется различными факторами, такими, как разрешение и качество передискретизации. Процентиндикатор в нижнем правом углу панели показывает ход процесса сохранения. После сохранения файла, ты можешь продолжать процесс отрисовки, нажав на кнопку Continue или начать новую, кликнув на кнопку Render. Рисунок 13. Кнопки Save Material и Load Material
Кнопки предназначены для сохранения и загрузки конфигурации фактических материалов, в том числе текстуры, присвоенной данному материалу (под названием ссылка, а не фактические данные текстуры). Clear Fog очищает буфер тумана. Используй его, если вы хочешь перезапустить расчеты объема. Clear Shadows очищает теневой буфер. Очистив буфер с помощью этой кнопки, ты можешь получить Shadowless сцену. После внесения изменений процесс продолжается, расчет тени также начинается с заполнения буфера.
Приведенная на рисунке выше панель имеет три закладки: Материалы и текстуры Tab, для определения материалов параметрами; Tab окружающей среды, изменения и определения различных параметров
vronline | сентябрь 2010
75
Креатиff
окружающей среды;
Шейдеры Tab, для создания различных эффектов шейдеров, финальное изображение;
объектов.
Градиент можно подгрузить с компа (если конечно он у тебя есть): кнопка Grad используется для загрузки карт цвета файла. После ее нажатия, программа запросит файл карты Fractint. Если он будет загружен, то градиент появится в окошке Ambient. При нажатии на кнопку Color, появиться панель выбора цвета:
Показанные выше два изображения показывают выбранную текстуру, как для окружающей среды, так и для диффузных элементов. Верхний из них является элементом окружающей среды, а нижний элементом для текущего слота материала. Характеристики этих материальных элементов расположены в Группе материальных параметров. Цифровой дисплей, как здесь, так и в других местах показывает порядковый номер материала (в данном случае) слота, где применяются текстура. Также ты можешь посмотреть количество используемых текстур. Максимальное их количество может быть 10. Во всех неиспользуемых слотах стоит параметр "0". The Ambient and Diffuse Texture Buttons При нажатии одной из этих кнопок, появляется панель текстуры. В ней можно выбрать текстуру, которая будет применяться на выбранном объекте (Ambient или диффузный) для текущего слота материала.
Панель состоит из окна предварительного просмотра текстур, двух стрелок навигации и пяти кнопок (Цвет, Град, Ext. Фактура, Отменить и ОК). Если выбрать текстуру, она подсветится зеленым освещением. Используя стрелки для перемещения по библиотеке, нажми на нужную текстуру для её выбора. Как только это будет сделано, нажимай "ОК", чтобы применить её к выбранному слотом материалу. Если не хочешь применять текстуры – клацни на кнопку "Отмена". Вполне вероятно, что тебе может потребоваться текстура, которой нет в редакторе. В этом случае жми на "Ext. Фактура ". Перед тобой появится окно с содержимым жесткого диска на котором ты можешь выбрать свою текстуру. Помни, что Incendia используют текстуры в формате BMP (*. BMP). В конце списка материалов находятся градиенты, которые также можно выбрать для раскраски
Важно отметить, что параметры материала являются исключительными для каждой текстуры определенного слота, в отличие от предыдущих версий Incendia , где они применялись ко всем слотам.
Параметр Ambient определяет, насколько яркой или темной ,будет текстура. Например, если вы установите ее в 0,5, яркость текстуры будет в половину фактических значений текстуры. Если вы установите ее на 2.0, яркость будет в два раза ярче исходной текстуры. Этот параметр не зависит от источника света, его определяет цвет поверхности фрактала. Параметр Diffuse работает аналогичным образом, но этот параметр зависит от источника света. Дальше идут параметры контроля зеркальных элементов/зеркального отражения. Они подразделяются на: Specular (отражение). Определяет, насколько сконцентрировано зеркальное отражение. Если установить его на более низкие значения, зеркальное отражение будет рассеянным на освещенной поверхности фрактала; Specular Int (зеркальная интенсивность). Параметр контролирует яркость зеркального элемента;
fresnel Ext/Int параметры уравнения Френеля (Френеля Ext. Френеля Int); Эти параметры определяют коэффициенты Френеля (внешнего и внутреннего отражения преломления) для фрактальной поверхности.
vronline | сентябрь 2010
76
Креатиff
Цвета преломленный и отраженный свет взяты из Skylight уравнений или растровый фон.
(рисунок 15).
Параметр Shadow Depth определяет темноту теней. Если вы установить его на 1.0 тень исчезает. Reset кнопка восстанавливает значения по умолчанию на панели параметров материала для текущего слота.
Рисунок 15
Панель Options определяет различные параметры затенения INCENDIA. Предлагаются следующие варианты:
Enable Fog. Включение или отключение использования Тумана в визуализации. Активировав его, противотуманное управление цветом становится видимым. Этот туман не зависит от параметров освещенности фрактала. White Shader. Стиль "уголь", из серых случайных точек. Никаких цветов в визуализации.
Fresnel Eq. Позволяет Формуле Френеля на поверхности фрактала создавать эффект cristalized изображения. Цвета взяты из фона (свет или растр), они будут добавлены в значение текущего материала (текстуры, градиент или цвета). Drawing. Выбирает специальный режим рисования, которые состоят в трех видах чертежа. Когда вы выбираете его, контроль станет видимым.
The Standard Drawing. Опция пытается имитировать рисование на бумаге (рисунок 16)
Black and White. Похож на древесный уголь, но вместо серых оттенков, используется только черный пиксель на белом фоне. Volumetric Fog. Активация расчета объемного тумана (не путать со стандартными противотуманными фарами)
Background. Включение использования фона, либо с помощью уравнений или простого растрового файла. Если выбрана эта опция, появляется дополнительная панель с настройками:
The Skylight Background. Задает позиции света вокруг фрактала и создает реалистичные восходы и закаты солнца. Расчет света и цвета, основаны на "практических аналитических моделях для "дневного света" (рисунок 14).
Рисунок 16
Radial Gradient. Параметр настраивает градиент. Ты можешь изменить значения градиента серого к конкретным градиентам, загружая его в окружающую часть материала (рисунок 17).
Рисунок 14
The Bitmap Background. Опция позволяет использовать простое изображение для фона. Используй кнопку для загрузки изображения
Рисунок 17
Angular Gradien. Параметр определяет цвет градиента, в соответствии с углом наклона на
vronline | сентябрь 2010
77
Креатиff
фрактальной поверхности (рисунок 18).
Рисунок 18
Fog Color. Данный элемент появляется, только если туман включен, и состоит из трех (красный, зеленый, синий) движков, позволяющих определить фактический цвет тумана;
Рисунок 20. Dark Volumetric Fog
Ккнопка Reset восстановит значения по умолчанию параметров окружающей среды.
На панели Enviroment Controls можно настроить многие эффекты окружающей среды. Например: Fog Parameters (“Fog P. A” and “Fog P. B” ). Опция определяет, густоту и распространение тумана; Fog P. A. Плотность тумана. Чем меньше значение, тем выше концентрация тумана;
Fog P. B. Исходное положение тумана, и на какое расстояние он распространяется. При более высоких значениях, туман распространится шире. Цвет тумана определяется в контроле цвета тумана.
Рисунок 21
Блок Ligth Distribution control определяет, как свет диффузии будет отображаться на поверхности фрактала. Возможные варианты:
Sun Turbidity (Sun T.). Параметр определяет количество пыли в воздухе в атмосферных расчетах. Эффект покраснения атмосферы при более высоких значениях.
Volumetric Fog color components. Эти три параметра контроля (красный, зеленый и синий) объемного тумана. Если значения положительны, цвет тумана добавляется к изображению. Наоборот, если они отрицательные, туман будет вычитаться из образа.
Рисунок 22. Стандарт
Стандарт. Распределение рассеянного света определяется стандартным образом. Рисунок 23. Синус Stripes
Рисунок 19. Light Volumetric Fog
Синус Stripes. Распределение рассеянного
vronline | сентябрь 2010
78
Креатиff
света возмущается синусоидой.
Soft Light. Свет должен быть равномерно распределен по поверхности фрактала. Рисунок 24. Косинус Stripes
Косинус Stripes. Распределение рассеянного света возмущается косинусом волны.
Блок Surface Average Filter. Эти фильтры предназначены для сглаживания шума на фрактальной поверхности.
Блок Ambient Occlusion включает или отключает две вариации шейдеров: Per Pixel. Расчет окружающих окклюзий для каждого пикселя. Если выбрана эта опция становятся видны следующие параметры:
Samples. Количество образцов для каждого пикселя. Чем больше число, медленнее расчеты, но более точные расчеты.
Рисунок 25. Exponential
Экспоненциальная. Интенсивность света рассчитывается по экспоненте
Radius. Максимальное расстояние (в пикселях) от выбранного пикселя. Расчет Pixel окружающей окклюзии происходит медленно, особенно на больших фрактальных сценах, но это увеличивает 3D представление о фрактальной поверхности. Averaged. Расчет окружающей окклюзии рендеринга сцены. Если выбрана эта опция, параметры управления окружающей окклюзии становятся видны.
Samples. Количество образцов для каждого пикселя. Чем больше число, медленнее расчеты, но более точное. Radius. Максимальное расстояние (в пикселях) от выбранного пикселя. Рисунок 26. Random
Random. Интенсивность света небольшой случайной величины.
Блок Resolution определяет разрешение в
Рисунок 27. Вмешательство
Вмешательство. Распределение рассеянного света рассчитывается по интерференционной картине. Рисунок 28. Soft Light
vronline | сентябрь 2010
79
Креатиff
пикселях. Ты можешь выбрать разрешение и применить его, нажав кнопку «Изменить». 2xAA опция используется для сглаживания. Когда эта опция активна, внутренне Incendia удваивает текущее разрешение и масштаб (во время сохранения изображения). Блок Projection. Данный переключатель используется для определения типа проекции, которую виртуальная камера будет использовать.
При этом прогноз выбора точки зрения, контроля апертуры становится видимым. С его помощью можно определить отверстие виртуальной камеры (камеры не должны иметь негативные отверстия). Блок Shadow. Переключатель включает или выключает тени для текущего изображения.
Поскольку расчет тени замедляет генерацию изображений, ты можешь отключить тени и включить их только при начале рендеринга (используй кнопку ПРОДОЛЖИТЬ вместо RENDER, иначеисчезнет дисплей).
Блок Cycles. Переключатель используется для определения количества циклов итерации (в тысячах) рассчитываемых в каждой петле. Возможность используется для определения, количества тактов процессора, которое Incendia будет использовать. Например, если установить его в 32, то Incendia не займет слишком много тактов процессора, а следовательно не окажет слишком большого влияния на общую работу компьютера. Установив параметр в значение 256, компьютер сосредоточит все циклы процессора в процесс визуализации. Используй это значение, когда хочешь оставить машину только для рендеринга фракталов. Кнопки типа Reset используются для сброса позиции, вращения и масштабирования.
The Reset Position button. Центр фрактала на окне просмотра.
The Reset Rotation button. Отменяет любое вращение, которое было применено к фракталу.
Divine 1 Деление плоскости с золотой середины на квадратные панели. Вновь в центре самая важная часть вашей композиции. Divine 2 Так же, как предыдущий вариант, но на этот раз стороны состава соответствуют золотой середине.
Вкладка Editor состоит из двух основных разделов: Baseshape и Transformations. Кнопка Edit открывает и закрывает редактор Baseshape. Именно эту кнопку следует выключать, чтобы сделать предварительный просмотр фрактала. Кнопка Open открывает все элементы редактора. Кнопка New добавляет новую форму или предмет в фрактал, открывая доступ к текущим параметрам. Кнопка Delete удаляет текущую форму из фрактала. Стрелочки позволяют перемещаться между имеющимися во фрактале формами и предметами. Цифра в боксе Baseshape показывает на порядковый номер текущей формы.
Depth. Параметр определяет количество фрактальных итераций, или по другому: сколько раз будет повторяться данная форма по фракталу. Radius. Параметр определяет фактический размер baseshape.
P1..P13. Эти и следующие параметры для каждой формы индивидуальны и отличаются в зависимости от объекта (например, в торе, P1, определяет размер внутреннего круга тора).
The Random Button. Случайными параметрами текущей формы (работает не во всех baseshapes).
Show Baseshape. Опция позволяет показать или скрыть основную форму в центре фрактала. Это пригодиться во фракталах, как множества Жюлиа кватернионов, потому что первоначальное baseshape может быть больше, чем повторные, фактически скрывая их.
The Rescale button. Прерывает любое расширение примененное к фракталу.
Scale. Элемент управления позволяет изменять масштаб baseshape в X, Y и Z направлении (Не путать с радиусом параметров, что дает равномерное масштабирование).
None Нет сетки.
Rotation. Элемент управления используется с небольшим трекболом, чтобы определить вращение baseshape.
Grid Этот элемент управления позволяет выбрать между четырьмя типами сетей в окне предварительного просмотра (ВНИМАНИЕ: эти сетки только гиды и не влияют на изображение). Cross Зеленый крест, который разделяет панель на четыре области и знаменует центр. Thirds Он разделяет панель на трети. Если вы хотите создать несколько художественных фракталов, в центре наиболее важная часть композиции.
Shear. Элемент управления позволяет сдвигать baseshape по многим направлениям.
Theres a little selector. На левой стороне пульта, можно использовать для ограничения поворота. Возможные варианты: T, Полный трекбол ротации;
X, вращения ограничена по оси X; vronline | сентябрь 2010
80
Креатиff
Y, вращения ограничена по оси Y; Z, вращения ограничен в Z оси; 0, Сброс вращения baseshape;
Panel. Селектор переключает изображение между векторным представлением элементов сцены и фактически самой камерой. Window. Переключатель позволяет просматривать в четырех типах видов:
Камера. Фактический угол наклона камеры, вы можете вращать и панорамирование камеры (с помощью кнопки мыши). Baseshape и видовом движении ограничены (X, Z) плоскости. Фронт. В окне вида спереди (+ Z). Здесь можешь использовать правую кнопку мыши, чтобы изменить положение в baseshape (X, Y) плоскости. Левой кнопкой мыши перемещаемся на плоскости, а ползунком масштабирования можно увеличивать изображение.
Слева. (X), ты можешь контролировать движение baseshape в (Y, Z) плоскости с правой кнопкой мыши. Левой кнопкой мыши перемещаемся на плоскости, а ползунком масштабирования можно увеличивать изображение в нем.
Top. (+ Y), ты можешь контролировать движение baseshape в (X, Z) плоскости с правой кнопкой мыши. Левой кнопкой мыши перемещаемся на плоскости, а ползунок масштабирования можно увеличивать изображение в нем. Control. Переключатель используется в основном для управления левой кнопкой мыши, работает в окне вида из камеры. Возможные варианты:
1. левая кнопка мыши будет вращать камеру. 2. левая кнопка мыши используется для перемещения по сцене.
Material. Переключатель присваивает материалу слот для текущего baseshape. Используй его, если вы хочешь сделать несколько baseshapes с различными материалами. Выбранный предмет (или форма) Baseshape, который в данный момент подвергается изменениям, имеет красный цвет.
Невыбранная Baseshapes (т.е. форма) имеет зеленый цвет. Преобразования (или трансформации) не используются в этом редакторе, но выступают здесь пунктирными окружностями с центрами на осях преобразования. Эти элементы имеют синий цвет. Когда происходит работа с изменением трансформаций на соответствующей вкладке, то выбранная для работы трансформация окрашивается в желтый цвет.
Сцена Center. Элемент указывает на центр сцены (камера вращения происходит вокруг этой точки), в виде зеленого кубика. Iterations Points. Реальные точки итерации всех фрактальных компонентов (baseshapes и преобразования). Они белого цвета и служат в качестве руководства для редактирования элементов. Displacement Mapping Baseshapes. Карты смещения Baseshapes (dmaps), являются частным случаем baseshapes, который использует растровые файлы, для применения карты. Эти формы окрашены в золото, а не в зеленый цвет. Их шесть, и когда один какойнибудь из них предмет выбран, то кнопка "Загрузить DMap" становится видимой.
Она позволяет загружать изображения с расширением .bmp. Растровое изображение преобразуется (выбрав максимальное значение для каждой точки RGB), и отображаться на поверхности baseshape. Если значение пикселя черный (0,0,0 в RGB), пиксель считается прозрачным, и это отображается как отверстие. Перемещение плоскости (DPlane)
Это самая простая карта смещения baseshape, состоит в основном из небольшого плоского квадрата с dmap экструзией в одну сторону (другие остаются прежними). Двойное перемещение плоскости (DDPlane)
Вторая карта смещения baseshape, работает в той же форме, как первая, но в отличие от первого, dmap экструзия идет в обе стороны. Перемещение колонки (DColumn)
Это колонна dmap. В этом случае, dmap повторяется четыре раза в направлении х над колонной поверхности. Перемещение цилиндр (DCylinder)
Данный dmap похож на предыдущий, но отображение происходит в радиусе цилиндра, вытягивание как внутренней так и внешней стороны от центра цилиндра. Перемещение диска (DDisc)
На этом перемещении baseshape, dmap переходит в поверхность диска, вытягиваясь вверх и вниз.
Перемещение цилиндра SQ (DCylinderSQ)
Работает по тому же пути, что DCylinder baseshape, но вместо определения кругового цилиндра, это в квадрате. vronline | сентябрь 2010
81
Креатиff
Вкладка Transformation Кнопки:
Edit открывает и закрывает редактор Tranformation. Также она изменяет вид окна от стандартной точки, в векторное представление фрактальных элементов;
New создает новую трансформацию, добавляя её к имеющимся (если таковые есть); Delete удаляет текущую выделенную трансформацию;
Стрелки позволяют переходить от одной трансформации к другой, последовательно их выделяя. Цифра в боксе Transformation указывает на порядковый номер текущей трансформации. Кнопки Save и Load сохраняют и соответственно загружают трансформации. Блок Variations. Полезен, когда ты выбрал тип трансформации фрактала.
Ты можешь использовать селекторы (расположенные в левой части панели), чтобы активировать изменения. Также, в случае необходимости воспользуйся расположенными справа ползунками, с целью изменения вариации веса (отрицательные значения будут разрешены, и они дают интересные результаты). На данный момент только 10 вариаций поддерживаются. В следующих версиях, это число будет увеличено. Блок Scale. Позволяет изменять размер (масштабировать) в X, Y и Z направлениях. Равномерно позволяет масштабировать по трем осям.
Блок Shear. Позволяет сдвигать трансформацию во многих направлениях. Блок Rotation. Управляет вращением. Возможные варианты: T, Полный трекбол ротации;
X, вращения ограничена по оси X; Y, вращения ограничена по оси Y; Z, вращения ограничен в Z оси;
0, Сброс вращения преобразования;
vronline | сентябрь 2010
Перевод: Максим Богданов aka Limonell
82
Школа
Счетчик уникальных посещений сайта на PHP В этой небольшой статья я хочу рассказать тебе, как написать простейший счетчик уникальных посещений на PHP. Мы будем подсчитывать число уникальных обращений к сайту, и хранить данные в базе. Усаживайся поудобнее, сейчас мы немного по программируем.
Сначала конфеты, потом постель
Мы с тобой не какието ганстерыпрограммисты, поэтому начнем, как и подобает – с теории, а уже потом поглядим и покопаемся в коде. Первым делом мы создадим базу данных и вставим кусок кода в верхнюю часть каждой страницы. Данный код будет отлавливать IP юзеров и записывать их в базу данных. Помимо IP мы также будем записывать дату посещения.
Во время записи очередного адреса посетителя нам придется просматривать IPадреса клиентов, посетивших сайт в этот день. Если IP уже есть в базе, то новая запись создаваться не будет. Например, если IP 124.456 посетил наш сайт 02/04/00, то запись в базе данных будет создана, если этот же IP посетил наш сайт, к примеру, 04/04/00. Если же он дважды зайдёт 02/04/00, то добавлять новую запись не будем.
Делаем базу, пишем код
Настало время создать базу данных. Выполни этот SQLскрипт: CREATE TABLE `uniquehits` ( `ip` varchar(255) NOT NULL, `date` date NOT NULL default ’00-00-0000’ );
Как закончишь с созданием БД, вставь этот код в верхнюю часть каждой страницы, на которой ты хочешь учитывать посещаемость. В данном руководстве не рассматривается посещаемость отдельных страниц (т.е. сколько посмотрели конкретную страницу, ты не узнаешь), каждую страницу будем считать в целом. Таким образом, если посетитель просмотрел 2 страницы, то мы будем записывать IP единожды. Код, реализующий данный алгоритм приведен ниже:
<?php $connection = mysql_connect ('localhost', 'USERNAME', 'PASSWORD') or die ('Unable to connect!'); mysql_select_db('admin1_counter') or die (mysql_error()); $_SERVER['REMOTE_ADDR']; $ip = $_SERVER['REMOTE_ADDR']; $fetch = mysql_query("SELECT * FROM uniquehits WHERE ip ='".$ip."' AND date=NOW()") or die(mysql_error()); if ( mysql_num_rows($fetch) == 0 ) { mysql_query("INSERT INTO uniquehits(ip, date) VALUES('$ip', NOW())") or die(mysql_error()); } mysql_close($connection); ?>
Теперь подумаем об отображении количества посещений. Я посоветую реализовать два варианта: в первом будут отображаться посещения за день; а во втором можно отобразить общее количество уникальных посещений, исключая посещения с одного IP, но в разные дни. Иными словами, в этом варианте ты увидишь все уникальные IP, с которых просматривали твою страницу. Итак, выведем ежедневную посещаемость: <?php $connection = mysql_connect ('localhost', 'USERNAME', 'PASSWORD') or die ('Unable to connect!'); mysql_select_db('admin1_counter') or die (mysql_error()); $counttotal = mysql_query("SELECT DISTINCT ip FROM uniquehits") or die(mysql_error()); $uniquetotal = mysql_num_rows($counttotal); echo $uniquetotal; mysql_close($connection); ?>
Если ты знаешь MySQL, то попробуй поиграть с исходником. Измени условия, вид отображения и т.д. Надеюсь, ты освоил этот урок, который чрезвычайно прост, но очень эффективен. Оригинал counter/
статьи:
http://designkai.com/uniquehits vronline | сентябрь 2010
Автор: Токарчук Александр aka Kewa2008 Email: Kewa2008@yandex.ru
83
Школа
Создание БД в IBConsole и приложения в Delphi. Часть 1.
Привет. Сегодня я тебе расскажу о создании базы данных в IBConsole. Создание же самого приложения ожидает тебя во второй части статьи. Итак, прочь разговоры. Перейдём к делу.
ВАЖЕН!!!).
1. Для начала научимся запускать локальный сервер и создавать БД.
Для запуска локального сервера на компьютере используется утилита IBConsole. После запуска программы (по умолчанию: Пуск > Все программы > InterBase > IBConsole) появится окно (Рис. 1).
Рис. 2
После заполнения необходимых полей для регистрации сервера, жмем “ОК”. Окно IBConsole после регистрации локального сервера показано на Рис. 3.
Рис. 1
Чтобы запустить локальный сервер выберите в главном меню “Server > Register…” после чего появится диалоговое окно “Register Server and Connect” (Рис. 2).
В поле “Server Information” вводится информация о сервере. Local Server/Remote Server – тип сервера (локальный или удаленный). При выборе “Remote Server” поля “Server Name” (Имя сервера или его IP в сети), “Network Protocol” (используемый протокол TCP/IP) и “Alias Name” (псевдоним БД) будут активными, если выбрать “Local Server” – неактивными. В поле Description вводится описание базы данных. В поле “Login Information” вводится информация о пользователе сервера. В данном примере используются значения администратора, созданного при установке СУБД (“User Name” – SYSDBA, “Password” – masterkey. Регистр
Рис. 3
Создание базы данных.
Прежде чем приступать к созданию БД, создадим рабочую папку для БД на диске – С:\Temp\MyBD. Теперь необходимо создать базу данных на сервере. Для этого в главном меню выбираем “Database > Create Database…” после выполнения команды появится диалоговое окно “Create Database” (Рис. 4). Рис. 4
vronline | сентябрь 2010
84
Школа
В одной из строк “Filename(s)” вводим путь к базе данных и название файла базы данных. Из выпадающего списка “Page Size” выбираем размер страницы, в выпадающем списке “Default Character Set” выбираем кодировку (кодировка поддерживающая русский язык – WIN1251), в поле “SQL Dialect” вводится номер диалекта SQL (от 1 до 3). Номер диалекта определяется только для InterBase версии 6.х. Для создания файла базы данных жмем кнопку “OK”. Окно IBConsole после создания базы данных показано на Рис. 5.
После заполнения необходимых полей для регистрации базы данных на сервере, необходимо нажать на кнопку “OK”, и зарегистрированная база данных отобразится в дереве.
При работе с многопользовательскими базами данных возникает проблема – обеспечение достоверности данных при одновременной работе нескольких пользователей с одной базой данных. Для обеспечения пользователей удобной работой в многопользовательском режиме, используют транзакции, принцип действия следующий: Начинаем транзакцию; Вносим изменения;
Пытаемся завершить транзакцию;
При удачном завершении все изменения сохраняются;
При не удачном завершении все изменения отменяются; Рис. 5
Созданная база данных автоматически регистрируется на сервере и с ней устанавливается сеанс связи для работы.
В дереве отображается информация о зарегистрированных на сервере базах данных (метаданные). Метаданные – надстройка над базой данных (Домены, Таблицы, Индексы и т.п.). Другими словами метаданные – это данные о данных. После копирования файла базы данных (*.gdb) на другой компьютер (сервер) его необходимо зарегистрировать на сервере. Для этого в главном меню IBConsole выберите “Database > Register…” появится диалоговое окно “Register Database and Connect” (Рис. 6).
В поле “Database” указывается путь к базе данных. Его можно ввести либо в ручную, либо с помощью кнопки, расположенной рядом с полем ввода. В поле “Login Information” вводится информация о пользователе и дополнительные параметры. В поля “User Name” и “Password” вводится имя пользователя и пароль. Из выпадающего списка “Default Character Set” выбирается название используемой кодировки. Рис. 6
Если передумали вносить изменения, то пропускаем третий пункт и сразу отменяем транзакцию.
2. Работа таблицами
Теперь мы рассмотрим процесс создания таблиц. Схема связи таблиц изображена на Рис. 7. Таблица SOTRUDNIK является главной таблицей по отношению к таблице DOLZNOST. Поле SOTRID – внешний ключ, поле SOTKOD – вторичный ключ. Связь между таблицами используется 1 : М (одинкомногим).
Рис. 7
После создания и регистрации базы данных на сервере переходим к созданию таблиц в базе данных. Для этого в дереве окна IBConsole выбираем пункт Tables. После чего выберите в главном меню “Tools > Interactive SQL…”, появится окно ‘Interactive SQL’, предназначенное для работы с базой данных Рис. 8. Рис. 8
В окне Interactiv e SQL vronline | сентябрь 2010
85
Школа
можно выполнять любой запрос: создание таблиц, модификация данных в них, извлечение данных и т.п. Для изучения синтаксиса команд SQL выполните команду “Help > SQL Reference”. В верхней части вводится запрос на выполнение (на Рис. 8 запрос на создание таблицы SOTRUDNIK). Разберемся в запросе:
каждого автоинкрементного атрибута можно создать свой генератор, или использовать один генератор для нескольких атрибутов. Генератор создается в окне Interactive SQL (“Tools > Interactive SQL…”). Код запроса на создания генератора на Рис. 10.
CREATE TABLE "SOTRUDNIK" – команда создания таблицы с именем указанным в кавычках. После указания имени в круглых скобках указываются параметры таблицы, после закрытия скобки обязательно ставится точка с запятой.
"SOTRID" INTEGER NOT NULL, – описание поля таблицы. В кавычках указывают имя поля. После закрытия кавычки описывают ограничения поля (тип, размер и т.п.). NOT NULL – указывает на то, что при добавлении записи в таблицу поле не может быть пустым. Атрибут "SOTRID" имеет целочисленный тип и обозначается как INTEGER. Остальные атрибуты ("FAM", "IMA", "OTCH") имеют текстовое значение и обозначаются VARCHAR, после чего в круглых скобках указывается максимальное допустимое количество символов. Так же указывается используемая кодировка для символов (кодировка, поддерживающая русские буквы – WIN1251).
Рис. 10
Для выполнения запроса выполните команду “Query > Execute”, если запрос на создание генератора написан без ошибок, то окно Interactive SQL очистится. Для проверки на наличие генератора в дереве IBConsole выберите пункт Generators.
После создания генератора необходимо указать начальное значение генератора, данный запрос показан на Рис. 11.
После ввода запроса для его выполнения необходимо выполнить команду в главном меню “Query > Execute” (или нажать сочетание клавиш Ctrl + E). Если запрос введен правильно, то в окне IBConsole появится только что созданная таблица (если выбран пункт Tables) и окно запроса очистится. Окно IBConsole после создания таблицы показано на Рис. 9.
Рис. 11
Теперь необходимо привязать генератор к конкретному атрибуту таблицы. Для этого используется триггер.
Рис. 9
В InterBase нет такого типа, как счетчик (autoincrement). Функция счетчика реализуется созданием генератора. Генератор – хранящаяся в базе данных программ (скрипт), выдающая уникальное значение при каждом обращении к ней. Для
Триггер – хранимая процедура, вызываемая автоматически SQLсервером при модификации данных в базе данных. Триггер нельзя вызвать непосредственно из приложения клиента. Триггеру нельзя передать входные параметры и получить от него значения выходных параметров. Триггеры всегда реализуют действие. По выполнению события, триггеры разделяют на: Триггер добавления; Триггер изменения;
vronline | сентябрь 2010
86
Школа
Триггер удаления. По времени вызова, триггеры делятся на: До:
После. Т.е. есть шесть видов триггеров – до и после выполнения каждого действия (добавление, изменение и удаление).
SQL запрос на создание триггера, связывающего таблицу “SOTRUDNIK” с генератором “GEN_SOTR” показан на Рис. 12. Конструкция SET TERM задает новый разделитель операторов. Если ее не использовать, то получится, что после NEW.SOTRID=GEN_ID(GEN_SOTR,1); стоит точка с запятой, и после END тоже должна ставиться точка с запятой, а это InterBase воспримит как ошибку. CREATE TRIGGER "BEF_INS_SOTR" FOR "SOTRUDNIK" – в данной строке создается триггер (CREATE TRIGGER) с именем BEF_INS_SOTR (без кавычек) для (FOR) таблицы SOTRUDNIK.
присвоение в новой записи (слово NEW) атрибута SOTRID значение, полученное от встроенной функции GEN_ID. В скобках указывается два параметра: Имя генератора;
Шаг генератора (т.е. на какое число должно увеличиться значение генератора при следующем обращении к нему).
Для создания триггера необходимо выполнить запрос (“Query > Execute”). Созданный триггер можно посмотреть, выбрав в дереве окна IBConsole пункт Tables и щелкнув два раза левой кнопкой мыши на имени таблицы. Появится окно, отображающее свойства таблицы (Рис. 13). В окне Dependencies указан созданный триггер. Для просмотра полей таблицы и их ограничений необходимо перейти в окно Properties. В окне Metadata отображается текст SQLзапроса, который полностью описывает структуру таблицы. Записи, содержащиеся в таблице показаны в окне Data. В окне Permissions указаны пользователи, допущенные до управления данными и их права. С помощью выпадающего списка, который расположен сверху, можно перемещаться между таблицами.
Рис. 13
На этом создание главной таблицы закончено.
Рис. 12
Строка ACTIVE BEFORE INSERT указывает на то, что триггер будет выполняться (ACTIVE) до (BEFORE) добавления (INSERT) новой записи в таблицу. Если необходимо выполнить триггер после добавления, то вместо BEFORE используется оператор AFTER (т.е. ACTIVE AFTER INSERT). И соответственно, если триггер используется во время удаления или изменения, то вместо INSERT указывается DELETE или UPDATE (например: ACTIVE BEFORE DELETE). AS – зарезервированное слово, открывает тело триггера. Тело триггера всегда помещают в операторные скобки – BEGIN / END. NEW.SOTRID=GEN_ID(GEN_SOTR,1); –
По аналогии с созданием главной таблицы, создадим дочернюю таблицу – DOLZNOST. Т.к. создание таблицы аналогично, подробного описания не будет. В первую очередь необходимо создать саму таблицу DOLZNOST. Для этого откроем окно Interactive SQL и введем туда запрос на создание таблицы: CREATE TABLE ( "DOLID" "NAIMDOL" WIN1251, "SOTKOD"
"DOLZNOST" INTEGER NOT NULL, VARCHAR(20) CHARACTER SET INTEGER NOT NULL,
PRIMARY KEY ("DOLID"), FOREIGN KEY ("SOTKOD") REFERENCES "SOTRUDNIK" ("SOTRID") );
vronline | сентябрь 2010
87
Школа
Стоит отметить строку FOREIGN KEY ("SOTKOD") REFERENCES "SOTRUDNIK" ("SOTRID"). В данной строке описывается создание вторичного ключа (FOREIGN KEY), который необходим для связи таблиц. После создания таблицы, необходимо создать генератор. Код создания представлен ниже: CREATE GENERATOR "GEN_DOLZ"
Когда генератор создан, ему назначается начальное значение: SET GENERATOR "GEN_DOLZ" TO 0
Теперь привязываем генератор GEN_DOLZ к атрибуту DOLID таблицы DOLZNOST: SET TERM !!; CREATE TRIGGER "BEF_INS_DOLZ" FOR "DOLZNOST" ACTIVE BEFORE INSERT AS BEGIN NEW.DOLID=GEN_ID(GEN_DOLZ,1); END!! SET TERM; !!
При добавлении нового сотрудника значение атрибута SOTRID будет присвоен автоматически, но при добавлении новой должности сотруднику значение атрибута SOTKOD будет присвоен не автоматически, а будет взято значение из атрибута SOTRID:
появившемся меню выбрать команду “Backup / Restore > Backup …” Рис. 14. Рис. 14
После чего на экране появится окно “Database Backup” (Рис. 15). В поле Alias будет выбрана наша база данных MyBasa. В группе элементов “BackupFile(s)” в поле Alias необходимо ввести MyBasa (имя базы данных в резервной копии). В первой строке списка Filename(s) указываем путь и имя файла архивной копии базы данных (C:\Temp\MyBD\MyBasaBackup.bac). Расширение для файла архивной копии базы данных можно задать любое. При нажатии на “OK” начнется процесс резервного копирования. После завершения копирования появится информационное окно, в котором сообщается, что резервное копирование завершено.
Попов В.Н. работает на должности директор;
Сидоров Н.В. работает на двух должностях – программист и тестер; Иванов А.Г. работает менеджером.
Создание вторичного ключа необходимо для корректного отображения представлений.
Представление – виртуальная таблица, сама по себе не хранит информацию, а является результатом выполнения некоторого запроса.
Рис.14
Для закрытия информационного окна нажмите “OK”. После чего закрываем окно “Database Backup”, в котором отображается информация по резервному копированию Рис. 15.
Для просмотра созданного файла необходимо перейти в папку, которую указали при заполнении поля “Filename(s)” (C:\Temp\MyBD).
3. Теперь пора научиться копировать и восстанавливать базу данных. Восстановление резервной копии. Для резервного копирования необходимо в дереве окна IBConsole выбрать ту базу данных, для которой будем создавать резервную копию. Щелкнуть на названии БД (в нашем случае БД называется MyBasa) правой кнопки мыши и в
Для восстановления резервной копии необходимо сначала отключить соединение с базой данных. Для этого в дереве окна IBConsole щелкаем правой кнопкой на имени БД (MyBasa) и выбираем пункт “Disconnect” (Рис. 16). На vronline | сентябрь 2010
88
Школа
будет выбрана база данных – MyBasa (если она не выбрана автоматически, то выберите ее из выпадающего списка). Если в выпадающем списке нет названия базы данных, тогда выберите пункт “File…” и в появившемся диалоговом окне укажите самостоятельно путь и название базы данных (если диалоговое окно не видит файл БД, то в выпадающем списке “Тип файлов” выберите “All files (*.*)”). После указания базы данных в этой же группе элементов в строке Filename(s) будет указан путь и имя файла к резервной копии базы данных. Рисунок 15.
экране появится окно, в котором будет спрашиваться, уверены ли мы в том, что хотим отключить соединение с выбранной базой данных. Подтверждаем наш выбор (кнопка Yes). После чего соединение с базой данных будет прервано. Далее выбираем команду главного меню окна IBConsole “Database > Maintenance > Backup / Restore > Restore…”.
В группе элементов Database будут указаны параметры по умолчанию. Если необходимо поменять название базы данных, тогда в поле Alias введите новое название. По умолчанию файл базы данных будет восстановлен в папку, содержащую резервную копию файла БД. Путь, куда будет восстановлен файл базы данных отображается в строке “Filename(s)”. После указания параметров восстановления базы данных необходимо в группе элементов “Options:” в поле “Overwrite” установить значение “True”. Это означает, что база данных будет переписываться из резервной копии. После указания всех параметров для восстановления необходимо нажать на кнопку “OK” для запуска процесса восстановления базы данных из резервной копии Рис. 18.
Когда восстановление закончится в окне “Database Restore” будет указано “Service ended”, означающую, что операция прошла успешно и база данных восстановлена успешно.
Рис. 16
На экране появится диалоговое окно Database Restore, в котором указываются параметры восстановления базы данных из резервной копии Рис. 17. В поле Alias группы элементов Backup File(s)
Рис. 18
Всю информацию о ходе восстановления можно сохранить в отдельный файл, для этого в главном меню окна “Database Restore” выберите команду “File > Save…”. После восстановления файла базы данных закройте окно “Database Restore”, и в окне IBConsole подключите восстановленную базу данных. Для этого щелкните правой кнопкой мыши на имени базы данных (MyBasa) и в выпадающем списке выберите команду “Connect”. Рис. 17
vronline | сентябрь 2010
Автор: Антонов Игорь aka Spider_NET Email: antonov.igor.khv@gmail.com
89
Школа
1С:Предприятие 8.x Часть 3. Типы данных
В прошлом году я написал две статьи, в которых начал знакомить тебя с разработкой под платформу «1С: Предприятие 8.х». К сожалению, на тех двух статьях все и закончилось. Сначала не было времени, потом пропало желание. Прошел год, и мне снова захотелось продолжить начатое дело. Надеюсь, в этот раз мне удастся написать больше хороших статей. Что ж, приступим!
О чем пойдет речь
Первая статья была вводной. В ней я рассказал, как создать новую базу данных, а также добавить в конфигурацию первый объект – справочник. Во второй статье я немного отбился от плана и сразу перешел к рассмотрению языка запросов. Это не совсем правильно, особенно учитывая, что я совершенно не рассказал про встроенный язык. В сегодняшней статье я попытаюсь исправить это упущение. Мы поговорим о типах данных, а также о всяких языковых нюансах.
Типы данных в мире 1 С: Предприятие 8.x
Перед тем как погрузится в языковые конструкции встроенного языка, мы должны познакомиться с основными типами данных. К счастью, их не так уж и много:
Число. Под числами в 1С подразумеваются как целые, так и значения с плавающей запятой. Максимальная разрядность значения типа «число» может быть 32 знака, включая десятичную точку. Стоит также учитывать, что ограничение в 32 знака действует на числа, которые будут записываться в базу данных. Если вы объявили переменную и присвоили в нее значение больше 32 знаков, то все будет ok. Для числовых значений, которые хранятся в памяти, данное ограничение не действует. После объявления переменой типа «Число» ее значением будет 0. Строка. Строка она и в Африке строка. Как в любом другом языке программирования, в 1С реализованы все необходимые функции для манипулирования строками. Значения данного
типа представлены в юникоде (Unicode). Длина переменных типа строка – не ограничена.
Дата. Опять же, типичный для многих языков тип «Дата». Помимо самой даты значения данного типа содержат и время. Под временем подразумевается часы, минуты и секунды. Сразу после инициализации переменной типа «Дата» ей будет присвоено значение (дата) «01 января 0001 года 00 часов 00 минут 00 секунд». Запомни это, т.к. это в будущем оно обязательно пригодится. Булево. Как и следует ожидать, переменные данного типа могут принимать лишь два значения: Истина, Ложь.
Неопределено. Значения типа «неопределено» применяются в случаях, когда требуется указать пустое значение, не относящееся ни к какому другому типу данных. Например, тебе нужно объявить переменную, которая потом будет где нибудь использоваться. Ты конечно можешь присвоить ей значение вроде 0 или «» (т.е. пустая строка), но тем самым ты сразу установишь для нее соответствующий тип (число или строка). А что если установка одного из этих типов тебе в последствие может помешать? Вот в таких случаях можно использовать значение типа «неопределено». Стоит также заметить, что многие функции встроенного языка, в случае не успешного выполнения, в качестве результата возвращают значение данного типа. Очень рекомендую, при описании своих функции, руководствоваться тем же правилом. Null. Общий смысл у Null почти такой же, как и у «неопределено». Значения данного типа применяются для обозначения отсутствующего значения в базе данных. Чаще всего, получить значения данного типа ты можешь при использовании языка запросов. Например, ты написал запрос, в котором используешь объединение таблиц. Звезды сложились не очень удачно, и в одной из таблиц отсутствует значение, удовлетворяющее твоему условию. В таком случае, на месте отсутствующего значения будет значение типа Null.
vronline | сентябрь 2010
90
Школа
Со значением типа Null возможно столкнуться не только при работе с запросами. Например, значение типа Null принимают реквизиты, которые не используются объектом. Честно говоря, на практике с этим сталкиваешься крайне редко. Из примеров могу только вспомнить, вариант, описанный в одной из статей с диска «ИТС». Представим, что у нас есть иерархический справочник с реквизитом «количество». При создании данного реквизита, ему установили свойство «Использование» в значение «Для элемента». Если попробовать обратится к данному реквизиту для элемента справочника типа «группа», то его значением как раз будет Null. Тип. Данный тип применяется для определения имеющихся типов. Немного запутано звучит? Ok, попробую объяснить на примере. Представь, что перед тобой встала задача сравнить типы двух переменных. В коде это будет выглядеть примерно так: Переменная1 = 123; //Поскольку мы присвоили число, значит тип переменной будет «число». Переменная2 = «строка»; //Здесь мы присвоили строку, значит тип переменной будет строка.
Теперь тебе нужно на 100% убедиться, что переменная1 является числовой. Вот тут нам и пригодится тип «Тип» (забавно звучит), а также парочка вспомогательных функций. Пока не будет лезть в подробности. Просто взгляни и попробуй понять нижеприведенный пример: Если (ТипЗнч(Переменная1) = Тип(«Число»)) Тогда Сообщить(«Переменная1 является числовой!»); Иначе Сообщить(«Переменная1 НЕ является числовой :(»); КонецЕсли;
В этом небольшом кусочке кода, я сначала получаю тип переменной при помощи функции «ТипЗнч()». Данная функция в качестве параметра принимает значение, тип которого требуется получить. В нашем случае это «Переменная1». Затем мне требуется получить значение типа «Тип», характеризующее тип «Число». Для этого во встроенном языке предусмотрена функция «Тип()». Она принимает всего лишь один аргумент – строковое представление имени типа. Раз нам требуется сравнить с типом «Число», то параметром для функции будет «Число». После завершения сравнения выводим сообщение.
Коллекции значений
Помимо примитивных типов, в платформе 1С: Предприятие 8.х, реализованы так называемые типыколлекции. В переменных таких типов ты можешь хранить целые коллекции (наборы)
значений. Наиболее часто используемые:
1. СписокЗначений. Представляет собой таблицу, состоящую из четырех колонок: a.
Значение.
c.
Пометка
b. d.
Представление. Картинка.
Разумеется, для каждого элемента тебе доступны все эти 4 поля. В первом ты можешь хранить непосредственно значение; во втором текстовое представление значения; в третьем значение тип Булево; и в четвертом – картинку, характеризующую данный элемент. Никто от тебя не требует заполнения всех четырех полей. Можешь заполнять лишь поле значение. Все будет прекрасно работать, правда, для таких ситуаций проще всего применять другу коллекцию – массив.
2. Массив. Как и в любом другом языке программирования, в 1С реализована поддержка массивов. Ты можешь использовать как одномерные, так и многомерные массивы. Массивы в 1С могут быть фиксированной длины, а также динамические. В последнем варианте указание размера массива не требуется. 3. ТаблицаЗначений. Один из самых часто применяемых типовколлекций. Таблица значений очень похожа на массив и список значений. Здесь ты также можешь хранить коллекцию значений, но в отличие от массивов или списков значений, тебе доступны, следующие вкусняшки:
a. Колонки. Ты без проблем можешь создать сколько угодно колонок и использовать их в своих целях. Каждая колонка может быть как определенного типа, так и произвольного. b. Итоги. Для числовых колонок имеется возможность подсчета итогов. c.
d.
Сортировка значений. Поиск строк.
e. Группировка по значению (Свертывание). Допустим, у тебя есть куча строк, в которых содержится номенклатура (товар, услуга) и сумма. Номенклатура периодически повторяется. Тут тебе приспичило посчитать общую сумму по какомуто одному товару/услуге. Для решения подобных задач лучше всего использовать свертывание. Все решение сведется к вызову одного лишь метода.
Прикладные типы
Помимо примитивных типов существуют еще так называемые «прикладные». Главное их отличие от примитивных типов в том, что они зависят от конфигурации, т.е. изначально сама платформа
vronline | сентябрь 2010
91
Школа
о них ничего не знает. Звучит немного запутанно, попробую объяснить на примере.
Тип «Ссылка»
СправочникСсылка.Номенклатура
Для чего нужны ссылки? В первую очередь для идентификации объекта данных. Например, каждый элемент справочника имеет свою уникальную ссылку. Если ты удалишь элемент, а затем создашь точно такой же (заполнив все реквизитами теми же данными, что и были у удаленного элемента), то он не будет тождественен удаленному элементу, т.к. у него будет совсем другой идентификатор.
Представим, что нам потребовалось создать справочник (назовем его номенклатура) для хранения номенклатуры нашей организации. После того как ты добавишь в дерево конфигурации новый элемент типа справочник, тебе сразу станут доступными несколько новых типов: СправочникОбъект.Номенклатура
СправочникВыборка.Номенклатура
СправочникМенеджер.Номенклатура СправочникСписок.Номенклатура
При создании других объектов конфигурации будет происходить та же история. Например, если мы добавим к нашей конфигурации новый документ (например, ПриходнаяНакладная), то у нас опять же появятся несколько новых типов: ДокументСсылка.ПриходнаяНакладная ДокументОбъект.ПриходнаяНакладная и т.д.
Сразу хочу обратить твое внимание на похожесть прикладных типов. Возьмем, к примеру, тип «СправочникВыборка.<ИмяСправочника>». Этот тип представляет собой результат выборки элементов из справочника по заданным условиям. У объектов такого типа в обязательном порядке имеются: метод Следующий(), позволяющий перейти на очередной элемент выборки; свойства, посредством которым идет обращение к реквизитам справочника (имена свойств = именам реквизитов).
Так вот, если ты научился работать с объектами типа «СправочникВыборка.<ИмяСправочника>», то считай, что ты сразу познал мастерство работы с объектами типа: «ДокументВыборка.<ИмяДокумента>». У объектов такого типа тоже имеется метод «Следующий()» и точно также ты можешь получить доступ к реквизитам документа посредством одноименных свойств. Точно такое же правило (похожести) актуально и для других типов объектов. Когда мы начнем рассматривать практические примеры ты в этом убедишься. Думаю, смысл прикладных типов понятен, а раз так, то рассмотрим некоторые из них чуть подробней. Начнем, пожалуй, с типа «ссылка». Хотя лучше было начинать не с этого типа, но как показывает практика, именно со значениями типа «ссылка» встречаешься раньше, чем с другими.
Тип «Ссылка» один из тех типов с которыми тебе придется частенько работать при разработке/доработке решений на базе платформы 1С:Предприятие. Данный тип создается для всех объектов конфигурации, которые хранят данные объектного типа. Примерами таких объектов являются: справочники, документы и т.д.
Под идентификатором подразумевается guid (уникальный 128битный идентификатор). Если говорить еще точнее, то каждая ссылка выглядит примерно так: ad6f4d4bad7911dfa55d cc98d6e732d7. У тебя может возникнуть логичный вопрос: «А можно ли создать элемент справочника и присвоить ему определенный guid?». Да, это действительно можно сделать. В следующих уроках мы рассмотрим этот процесс на практике.
Тип «Объект»
Подобно типу «Ссылка» тип «Объект» создается лишь для тех объектов конфигурации, которые хранят в себе данные объектного типа (справочники, документы и т.д.). Изменяя данные типа «Объект» ты вносишь изменения непосредственно в БД. Если сравнивать тип «Объект» с типом «Ссылка», то главное их отличие будет в том, что посредством первого можно модифицировать данные, а с помощью второго выполнять лишь чтение. Объект любого элемента можно получить по ссылке.
Практика
Все что я рассказал выше – это конечно же хорошо и тебе крайне желательно (на данном этапе) хотя бы в общих чертах ориентироваться в типах данных платформы 1С:Предприятие 8.х. Чтобы лучше запомнить материал и хоть немного попрактиковаться, я предлагаю тебе рассмотреть нижеприведенные примеры. Крайне желательно, чтобы ты, самостоятельно набирал и смотрел все приведенные мной примеры. Это принесет намного больше пользы, чем просто чтение.
Как практиковаться
Для воспроизведения рассмотренных примеров лучше всего создать новую обработку и весь код писать в ней. Это делается следующим образом: vronline | сентябрь 2010
92
Школа
1. Запусти 1С:Предприятие в режим конфигуратор (для этого предварительно придется создать чистую базу).
2. В главном меню конфигуратора зайди в «Файл» > «Новый».
3. В появившемся окне (см. рисунок 1) выбери «Внешняя обработка» и нажми на кнопку
нажми «Добавить».
6. В окне создания новой формы (см. рисунок 3) тебе предложат установить следующие опции:
Тип формы. Доступно два варианта: «форма обработки» и «произвольная форма». Поскольку мы собираемся делать именно форму обработки, то соответственно выбираем первый вариант. Обрати внимание на флажок «Назначить форму основной». После его установки наша форма будет сразу же отображаться при открытии обработки.
Имя. Имя для твоей формы. В своем примере я все оставил по умолчанию. Командная панель формы сверху. Стоит ли создавать вверху формы панель инструментов. Я оставил как есть. Командная панель формы снизу. Настройка аналогична предыдущей. Только на этот раз речь идет о нижней панели инструментов. Флажок оставляем.
«Ok”. Рисунок 1. Окна выбора вида документа
4. Выполнив эти три простых шага, ты создашь новую обработку (см. рисунок 2). Заполни поле «Имя». Напиши сюда все что хочешь, но помни, что в имени не допускаются пробелы и оно должно начинаться на букву или цифру. Свою обработку я назвал «ОбработкаДляТестов».
Прошвырнувшись по всем настройкам, сразу нажимаем кнопку «Готово». Результатом нажатия, станет создание новой формы с двумя
панелями инструментов (верхней и нижней), а также двумя кнопками с именами: «Выполнить» и «Отмена». Рисунок 2. Новая обработка
5. Теперь нас отделяет всего лишь один шаг до написания первых строчек кода. Давай создадим в нашей обработке новую форму и бросим на нее один компоненткнопку. Создать новую форму можно как минимум двумя способами:
Рисунок 3. Добавляем новую форму
a. Нажми на кнопку «Действия». В появившемся контекстном меню выбери пункт «Добавить» > «Форму». b. В табличной части окна настроек обработки кликни правой кнопкой мыши по пункту «Формы» и в появившемся диалоге
vronline | сентябрь 2010
93
Школа Рисунок 4. Конструктор новой формы
мне письме и я отвечу тебе в индивидуальном порядке.
Объявление переменных
Во встроенном языке 1С нет никой определенной области для объявления переменных (в отличие от Delphi). Потребовалась переменная – взял и объявил. Комуто такой подход кажется удобным, а кому то нет. Когда я переходил с Delphi на 1С:Предприятие, то поначалу меня это бесило, а потом привык. Все переменные можно условно разделить на три вида:
Рисунок 5. Созданная форма
Ну, вот и все. Осталось лишь бросить на форму компонент «Кнопка» или просто создать обработчик события «ПриНажатии» для уже созданной кнопки «Выполнить». Воспользуемся вторым вариантом. Щелкни два раза левой клавишей мыши по кнопке «Выполнить». Справа должна появиться панель со свойствами и событиями выбранного элемента управления. Рисунок 6. Свойства кнопки
Данная панель представляет собой аналог объектного инспектора в Delphi. В нем ты также можешь редактировать любые свойства объекта, а также определять реакцию на различные события.
Для нашего примера, нам необходимо лишь определить действие, которое будет происходить при нажатии на кнопку. Ищи на панели свойств и событий пункт «Действие» и кликай по рядом расположенной кнопке с изображением лупы.
Если ты все сделал правильно, то перед тобой должно открыться окно «Редактор кода» с сгенерированной процедурой «КнопкаВыполнитьНажатие()». Собственно в ней, нам и предстоит набивать код примеров. Пока мы не начали писать первый код, хочу сразу предупредить: «Не волнуйся, если с пониманием примеров у тебя возникли сложности!». Все придет со временем и с практикой. Если даже чтото не понятно, то просто воспроизводи код примера у себя и смотри что и как работает, а еще лучше напиши
Локальные. Эти переменные доступны лишь в пределах одной функции/процедуры и после ее выполнения будут благополучно уничтожены.
Глобальные. Такие переменные объявляются в самом начале модуля и доступны в любой из процедур данного модуля.
Экспортные. Данные переменные представляют собой модифицированную версию глобальных перемен. Они объявляются также как и глобальные (в самом начале модуля), а затем к ним дописывается ключевое слово «Экспорт». Если ты объявил переменную как экспортную, то ты можешь обратиться к ней из других модулей (не относящихся к данному объекту).
Тренируемся 1.
Объявление локальных переменных
Начнем с самого простого – объявление локальных переменных. Перейди в код сгенерированной процедуры и доведи его до следующего вида:
Процедура КнопкаВыполнитьНажатие(Кнопка) ЧисловаяПеременная = 0; СтроковаяПеременная = ""; ПеременнаяТипаДата = Дата("00010101"); ПеременнаяБулево = Истина; КонецПроцедуры
Обрати внимание, что я нигде не указываю тип переменной. 1С:Предприятие устанавливает его самостоятельно на основе содержимого. 2.
Объявление глобальных переменных
Теперь попробуем объявить глобальную переменную. Для этого поднимись в самое начало нашего модуля формы и напиши в нем ключевое слово «Перем» (разумеется, без кавычек), а после него имя нашей переменной. В качестве имени я выбрал «ГлобальнаяПеременная». Обязательно после имени переменной поставь точку с запятой. Проделав эту операцию, твой код должен стать примерно таким: Перем ГлобальнаяПеременная;
vronline | сентябрь 2010
94
Школа Процедура КнопкаВыполнитьНажатие(Кнопка) ЧисловаяПеременная = 0; СтроковаяПеременная = ""; ПеременнаяТипаДата = Дата("00010101"); ПеременнаяБулево = Истина; КонецПроцедуры
Такс, теперь можно попробовать заюзать объявленную глобальную переменную. Для этого добавь в код процедуры две строчки: ГлобальнаяПеременная = «Это строковая глобальная переменная»; Сообщить(ГлобальнаяПеременная);
Первая строка не должна вызвать затруднений. Во второй же, я вызываю встроенную метод «Сообщить()». С ее помощью можно выводить любые сообщения в окно «Служебные сообщения» (Режим 1С:Предприятие). Каждому выводимому сообщению можно присвоить определенную иконку. Тем самым, пользователь сможет различать тип сообщения: операция выполнена успешно, возникла ошибка и т.д. Чтобы добавить к выводимому сообщению иконку тебе необходимо передать процедуре второй параметр типа «СтатусСообщения». Он может принимать одно из следующих значений: БезСтатуса – никакая иконка добавляться к сообщению не будет.
Важное – перед твоим сообщением будет два восклицательных знака. Внимание – в качестве иконки будет один восклицательный знак.
Информация – при этом типе выводится иконка в виде английской буквы i.
Мы уже написали код, результат выполнения которого можно увидеть на экране (помнишь вывод в окно служебных сообщений содержимого переменной ГлобальнаяПеременная?) и теперь самое время сделать это.
Как ты уже знаешь, в режиме «Конфигуратор» мы разрабатываем программное решение, а работаем с ним непосредственно из режима «Предприятие». Значит, чтобы испробовать код, мы должны запустить 1С в режиме «Предприятие», а затем открыть нашу обработку и клацнуть на одну единственную кнопку – «Выполнить». Что ж, так и поступим. Проще всего режим «Предприятие» запустить прямо из конфигуратора. В таком случае, тебе сразу будет доступна отладка кода (см. соответствующую статью в этом номере) конфигурации. Выполнить запуск ты можешь путем выбора в меню «Отладка» пункта «Начать отладку» или просто нажав на клавишу F5. Попробуй проделать эту нехитрую операцию. После запуска 1С в режиме «Предприятие», заходи в меню «Файл» и выбирай в нем пункт «Открыть». В появившемся диалоговом окне открой свою сохраненную обработку (файл с расширением epf). Если не запутаешься в этой простейшей операции, то увидишь форму обработки.
Обычное значение по умолчанию. Если ты вызываешь процедуру «Сообщить()» и не указываешь второй параметр, то на самом деле считается, что ты указал СтатусСообщения.Обычное. ОченьВажное – тоже, что и «Важное», только вместо двух выводится три восклицательных знака. Рассмотрим пример использования метода Сообщить() со вторым параметром: Сообщить(«Какой-то текст», СтатусСообщения.Информация); Сообщить(«Какой-то важный текст», СтатусСообщения.Важное); Сообщить(«Какой-то очень важный текст», СтатусСообщения.ОченьВажное); Рисунок 7. Демонстрация метода Сообщить();
Первое испытание нашей обработки
Рисунок 8. Наша обработка в режиме «Предприятие»
Нажимай на кнопку «Выполнить». Если ошибок в коде допущено не было, то ты увидишь примерно такую картинку:
Продолжаем знакомиться
С локальными и глобальными переменными мы познакомились, теперь настал черед экспортных. В принципе, сложного ничего нет. vronline | сентябрь 2010
95
Школа
в модуле формы, а затем обращаться к ним скажем из другой формы или вовсе другой обработки. Когда мы будем делать свою конфигурацию, я покажу, как это делается на практике.
Операции со значениями разных типов Итак, начнем с типа «Число». Здесь все стандартно. Ты можешь производить со значениями типа «Число» любые математические операции: Рисунок 9.
Вся разница заключается в использовании ключевого слова «Экспорт», которое влияет на видимость переменной.
Не будем многословить, а просто объявим экспортную переменную в модуле объекта нашей обработки. Перейти в модуль обработки можно из окна настроек. Помнишь, мы в нем задавали имя нашей обработке и создавали форму? Если подзабыл, то взгляни на рисунок №2 и освежи свою память.
Так вот, в этом окне нужно нажать на кнопку «Действия» и в появившемся контекстном меню выбрать «Открыть модуль объекта». Откроется еще одно окно редактора кода. Это и есть модуль объекта. Пока не будем вдаваться в нюансы модулей (об этом поговорим в отдельной статье), а просто объявим в этом месте переменную: Перем ЭтоСуперПеременная Экспорт;
Сохраняй изменения и закрывай окно редактора кода с модулем объекта. Возвращайся в модуль своей формы и в обработчике события «ПриНажатии» кнопки «Выполнить» напиши: «Это» (без кавычек) и нажми ctrl+space (пробел). Перед тобой должно появится окно дополнения кода:
сложение (+)
вычитание ()
умножение (*) деление (/)
остаток от деления (%)
Ну и само собой ты можешь применять к значениям типа «Число» различные знаки сравнения: < меньше > больше
<> неравно
>= больше либо равно
<= меньше либо равно
Рассмотрим несколько примеров: a = 1; // a = 1 b = 2; // b = 2
c = a + b; // с = 3 c = c 1; //с = 2
a = c * c; // a = 4 c = a / 2; // c = 2
z = a < c; // z = ложь, т.к. 4 > 2
x = c <= a; //x = истина, т.к. 2, меньше, чем 4 и т.д. Ok, с операциями над числовыми значениями разобрались, теперь возьмемся за строки. Со строковыми значениями ты также можешь производить ряд операций. Например:
сложение (конкатенация). Прибавление одной строки к другой; Рисунок 10. Окно дополнения кода
В нем уже будет выделено имя переменной, к которой мы собирались обратиться. В нашем случае это ранее объявленная экспортная переменная. Попробуй ради интереса присвоить ей какоенибудь значение.
Экспортные переменные ты можешь объявлять и
логические операции. При работе со строками ты можешь использовать различные знаки сравнения. Результатом такого кода будет значение типа «Булево» (Истина или Ложь); Как обычно, проверим все на примерах: //Конкатенация строка ПерваяСтрока = ”Этот мир”; ВтораяСтрока = “придуман не нами”;
vronline | сентябрь 2010
96
Школа ТретьяСтрока = ПерваяСтрока + ” ” + ВтораяСтрока; //ТретьяСтрока = “Это мир придуман не нами” //Логически операции ПерваяСтрока = ”VR-Online”; ВтораяСтрока = ”is cool”; Результат = ПерваяСтрока < ВтораяСтрока; //Результат = Ложь, т.к. ПерваяСтрока длиннее второй. Результат = ВтораяСтрока <= ПерваяСтрока; //Результат = Истина, т.к. ВтораяСтрока короче ПерваяСтрока
В принципе, про строки мне сказать больше нечего. Хотя нет, стоп! Я совсем забыл рассказать о том, что в 1С:Предприятие все строки хранятся в UNICODE. Имей это ввиду.
Преобразование значений
Преобразовывать значения можно явно и неявно. Под явным преобразованием подразумевается, что нам требуется самостоятельно указать тип, к которому мы хотим преобразовать значение. Не будет далеко ходить, и сразу рассмотрим пример: Переменная1 = 25; Сообщить(Строка(Переменная1));
В первой строке я объявляю числовую переменную, а во второй, вывожу ее значение, предварительно указав, что значение должно преобразоваться к строке. Это действие я выполняю при помощи функции «строка()».
Неявное преобразование заключается в том, что для выполнения конвертирования значения к новому типу не требуется использовать дополнительные функции. Платформа все сделает за нас. Взгляни на примеры: //Пример 1 Переменная1 = 25; Сообщить(Переменная1); //Значение переменной автоматически преобразуется к типу «строка». //Пример 2 Переменная1 = 243; Если Переменная1 Тогда //Условие сработает, т.к. после преобразования значения //к типу «Булево» мы получим «Истина» Сообщить(«Истина»); КонецЕсли; //Пример 3 Переменная1 = 0 Если Переменная1 Тогда //А вот здесь условие не сработает, т.к. после преобразования //получим «Ложь» Сообщить(«Истина»); КонецЕсли;
Для явного преобразования ты можешь использовать функции: Число(), Строка(), Дата(), Булево(). Попробуй познакомиться с этими функциями на практике. Напиши несколько примеров и посмотри, как они работают. Работа с коллекциями значений
Коллекции значений – наиболее часто
используемые типы значений при разработке решений под платформу 1С:Предприятие. Самой простой коллекцией является Массив – тип данных, для хранения наборов значений одинакового типа. Если ты ни разу не сталкивался с этим словом, то представь, что тебе требуется объявить переменные со значениями от 1 до 100: Переменная1 = 1; Переменная2 = 2; Переменная3 = 3; …
Решение полностью рабочее, но ты только представь, что придется объявить 100 переменных. Вот это уже совсем некрасиво и неудобно. Куда лучше объявить массив из 100 элементов. Посмотрим на пример: Массив = Новый Массив(99); Массив[0] = 1; Массив[1] = 2; Массив.Добавить(3); …
Помимо того, что вместо 100 имен переменных у тебя будет всего одно, при использовании массивов ты получаешь такую полезную возможность как перебор его элементов. Со ста разными именами переменных ты это не сделаешь при всем желании. Посмотрим пример: Для сч = 0 По Массив.Количество() – 1 Цикл Сообщить(Массив[сч]); //Выведет «1» КонецЦикла;
Обрати внимание на пример, в котором я объявлял новый массив. При инициализации переменной типа массив я указал в конструкторе (Новый Массив) значение 99. Этим действием я указал верхнюю границу количества элементов. Стоп! Я же хотел создать массив для хранения 100 элементов, почему тогда пришлось указать 99? Все просто. Счет элементов массива начинается с 0, а не единицы. Поэтому и получается, что указывая 99, мы на самом деле подразумеваем 100. Массивы можно разделить на два вида: динамические и статические. В приведенном выше примере я описал статический массив. Он отличается от динамического тем, что имеет фиксированное количество элементов. Во время создания массива я сразу указал верхнюю границу элементов. Изменить это значение в процессе работы с массивом уже будет нельзя. С динамическими массивами все наоборот. Во
vronline | сентябрь 2010
97
Школа
время их создания не нужно указывать максимальное количество элементов. Просто инициализируем переменную типа массив и сразу можем добавлять в нее любое количество значений. Посмотрим пример: Массив = Новый Массив(); Массив.Добавить(1); Массив.Добавить(2); Массив.Добавить(3); …
Чтобы перебрать элементы динамического массива можно воспользоваться уже знакомой нам конструкцией: Для сч = 0 по Массив.Количество() – 1 Цикл Сообщить(Массив[сч]); КонецЦикла;
Помимо разделения массивов на динамические и статические их также можно поделить на одномерные и многомерные. Вышеприведенные примеры демонстрировали одномерные массивы, т.е. массивы с одним измерением. Как и многие другие языки программирования, 1С поддерживает многомерные массивы. Что такое многомерный массив? Это такой же массив, только в нем каждый элемент является ссылкой на другой одномерный массив. Опять же, взглянем на пример: МногомерныйМассив = Новый Массив (2, 4, 10);
В этом примере я объявил массив из двух элементов, каждый из которых является массивом из 4 элементов, каждый из которых является массивом из 10 элементов. Попытайся это переварить.
Списки значений
Списки значений представляют собой более продвинутую версию массива. Этот тип данных также позволяет хранить наборы значений, но в отличие от массива имеет, ни одну колонку, лишь для хранения значения, а целых четыре: Значение. Сюда записывается значение произвольного типа;
Представление. Строковое представление значения;
Пометка. Значение типа булево, определяющее установку пометки для значения; Картинка. В данную колонку можно записать значение типа «картинка»;
Для чего можно использовать список значений? Да много для чего! Если хочешь, чтобы юзер видел не сырое значение из списка, то заполняй колонку «представление» и в нее пиши нужный текст. Рассмотрим небольшой пример. Представь, что нам требуется перебрать все имеющиеся в конфигурации документы и
вывести пользователю их имена. Причем не те имена, что указаны в поле «Имя» во время создания нового документа, а тот текст, который содержится в поле «Синоним» (как правило, в нем пишется полное название документа). Причем стоит учитывать, что реальное имя документа (из поля «Имя») нам также может пригодиться, поэтому его также необходимо сохранять. Код решения озвученной задачи смотри ниже. //Создаем переменную типа СписокЗначений СписокЗначений = Новый СписокЗначений; //На всякий случай сразу ее очищаем СписокЗначений.Очистить(); //Начинаем перебирать все имеющиеся документы Для Каждого Документ Из Метаданные.Документы Цикл //Добавляем информацию об очередном документе в нашу переменную СписокЗначений.Добавить(Документ.Имя, Документ.Синоним); КонецЦикла; //Теперь выводим все содержимое нашего списка значений Для сч = 0 по СписокЗначений.Количество() - 1 Цикл Сообщить("Представление: " + СписокЗначений[сч].Представление + "; Значение: " + СписокЗначений[сч].Значение); КонецЦикла;
Не будем вдаваться в подробности получения списка документов, т.к. это не относится к теме данной статьи, а посмотрим лишь, как происходит работа со списком значений. Итак, для того чтобы добавить новый элемент в список значений требуется воспользоваться методом «Добавить()». Он принимает несколько параметров: Значение (Произвольный тип) – в данный параметр записываются значения произвольного типа. Этот параметр является обязательным для заполнения. Представление (Тип данных – строка) – параметр не обязателен для заполнения. В него ты можешь записывать строковое представление для значения. Пометка (Тип данных – булево) – опять же, параметр не обязателен к заполнению, но при необходимости в него можно записывать значения типа булево, т.е. ИСТИНА/ЛОЖЬ. Картинка (Тип данных – картинка) – картинка, она и в Африке картинка. В вышеприведенном примере я заполняю лишь vronline | сентябрь 2010
98
Школа
первый и второй параметр, т.е. «Значение» (имя документа) и «Представление» (синоним документа). Остальные параметры просто игнорирую, т.к. в их использовании нет необходимости. После завершения цикла с пробежкой по всем документам, я запускаю новый цикл для вывода информации из списка значений. Обращение к каждому элементу происходит путем указания его индекса. Например, чтобы получить представление, для пятого элемента списка значений необходимо написать: Переменная = СписокЗначений[4].Представление; Получение значения/пометки/картинки делается аналогичным образом.
Таблица значений
По своей сущности тип данных ТаблицаЗначений похож на СписокЗначений. В качестве главного отличия можно выделить возможность создания произвольных колонок. Если в списке значений к твоим услугам лишь предопределенные колонки, то в таблице значений нет никаких ограничений. Требуется определенный набор колонок – взял и создал. Кроме колонок, доступны также фишки вроде группировки по значению, подсчета итогов по колонке и т.д.
Поскольку принцип работы с таблицами значений почти такой же, как и со списками значений, то я не буду расписывать подробности, а просто приведу несколько примеров. Все подробности мы рассмотрим, когда будем разрабатывать собственную конфигурацию //Создаем таблицу значений ТаблицаЗначений = Новый ТаблицаЗначений; //Определяем колонки //Каждой колонке можно задать определенный тип данных. //Рассмотрим этот вариант в следующий раз ТаблицаЗначений.Колонки.Добавить("Товар"); ТаблицаЗначений.Колонки.Добавить("Количество"); ТаблицаЗначений.Колонки.Добавить("Сумма"); //Заполняем таблицу значений данными НоваяСтрока = ТаблицаЗначений.Добавить(); //Записываем данные в кажду колонку НоваяСтрока.Товар = "Огурец"; НоваяСтрока.Количество = 5; НоваяСтрока.Сумма = 25; НоваяСтрока = ТаблицаЗначений.Добавить(); НоваяСтрока.Товар = "Морковь"; НоваяСтрока.Количество = 10; НоваяСтрока.Сумма = 15.5; НоваяСтрока = ТаблицаЗначений.Добавить(); НоваяСтрока.Товар = "Огурец"; НоваяСтрока.Количество = 9; НоваяСтрока.Сумма = 45;
//Перебираем строки таблицы значений и выводим содержимое в окно служебных сообщений Для Каждого СтрокаТЗ Из ТаблицаЗначений Цикл Сообщить("Строка таблицы значений: "); Сообщить(""); Сообщить("Товар: " + СтрокаТЗ.Товар); Сообщить("Количество: " + СтрокаТЗ.Количество); Сообщить("Сумма: " + СтрокаТЗ.Сумма); Сообщить("-------------------"); КонецЦикла; //Посчитаем итоговую сумму по всем строкам Сообщить("Всего товаров на сумму: " + ТаблицаЗначений.Итог("Сумма")); Сообщить("Общее количество: " + ТаблицаЗначений.Итог("Количество")); //Теперь посчитаем количество и суму за огорцы ТаблицаЗначений.Свернуть("Товар", "Количество, Сумма"); Сообщить("--------------"); //После вывода, строка с огурцами будет одна, а не две Для Каждого СтрокаТЗ Из ТаблицаЗначений Цикл Сообщить("Строка таблицы значений: "); Сообщить(""); Сообщить("Товар: " + СтрокаТЗ.Товар); Сообщить("Количество: " + СтрокаТЗ.Количество); Сообщить("Сумма: " + СтрокаТЗ.Сумма); Сообщить("-------------------");
КонецЦикла;
Результатом выполнения данного кода будет: Строка таблицы значений: Товар: Огурец Количество: 5 Сумма: 25
Строка таблицы значений: Товар: Морковь Количество: 10 Сумма: 15,5
Строка таблицы значений: Товар: Огурец Количество: 9 Сумма: 45
Всего товаров на сумму: 85,5 Общее количество: 24
Строка таблицы значений: Товар: Огурец
vronline | сентябрь 2010
99
Школа
Количество: 14 Сумма: 70
Строка таблицы значений: Товар: Морковь Количество: 10 Сумма: 15,5
Вот и все
На этом я хочу закончить свое и без того затянувшееся повествование. Статья получилась достаточно большой, но я надеюсь, ты осилишь ее до следующего номера, т.к. в октябрьского выпуске будет опубликовано продолжение. Удачи!
vronline | сентябрь 2010
Автор: Антонов Игорь aka Spider_NET Email: antonov.igor.khv@gmail.com
100
Школа
1С:Предприятие 8.x Часть 4. Отладка
В прошлой части статьи (ух, и большая же она получилась) я рассказал тебе о существующих типах данных в системе «1С:Предприятие 8». Практическая часть той статьи была небольшой, но все же, я показал тебе, как объявлять переменные различных типов, а также сравнивать их значения или определять их тип. В четвертой части статьи я хочу немного отойти от поставленного плана (да простите меня грешного) и сразу рассмотреть такой важный процесс как отладку. Если не научиться оперировать отладчиком (благо это не сложно), то есть большие шансы превратить процесс разработки в сущий кошмар. Может это и звучит смешно, но мне часто присылают вопросы (связанные с программированием на Delphi) в которых просят посмотреть исходник и найти ошибку. Если мне позволяет время, то я с удовольствием берусь за это дело и в 99 случаях из 100 ошибки одни и те же: обращение к несуществующему индексу в массиве, взаимодействие с объектами, которые уже были уничтожены и т.д. Все эти проблемы очень легко обнаружить и пофиксить при помощи отладчика. Странно, но почемуто начинающие программисты пренебрегают этим. Хотя, отчасти я могу объяснить. Когда я читал книги по Delphi, то замечал, что во многих из них отсутствуют главы с описанием и примерами отладки приложения. А ведь зря! На мой взгляд, нужно сразу начинать учить работать с дебаггером (отладчиком), чтобы новичок понял, что без этого дальше никуда.
Что такое отладчик
Если у тебя уже имеется опыт программирования на какомлибо языке программирования, то ты наверняка знаешь, для чего нужны отладчики, а значит, можешь сразу переходить к следующему разделу статьи. Здесь же я рассмотрю само определение. Итак, отладчик – это отдельное приложение, либо компонент среды разработки (IDE) предназначенный для поиска ошибок в программе. Отладчик позволяет тебе выполнять
код программы пошагово (трассировка), просматривать значения переменных, изменять их значения (прямо во время выполнения программы) и т.д.
Я уже сказал, что отладчики бывают как встроенные в IDE, так и выполненные в виде отдельных приложений. С первыми все понятно, а для чего нужны вторые? Все просто – для отладки любых приложений. Например, был в свое время такой замечательный продукт (ныне не развивается) как SoftICE. Для крэкеров 90 х/середины 2000х, SI был инструментов №1. Он позволял отлаживать абсолютно любые программы/драйвера для Windows. Крэкеры использовали его для анализа программ с целью снятия системы защиты, а разработчики для отладки своих приложений.
Отладка в 1 С:Предприятие 8.х
Поскольку «1С:Предприятие» это все же платформа, включающая в себя полноценную среду разработки присутствие в ней отладчика вполне обосновано. Запусти «1С:Предприятие» в режиме конфигуратор и открой в нем созданную в прошлом уроке информационную базу. Затем, создай новую внешнюю обработку.
Для внешней обработки нам потребуется создать форму. Как это делается, ты можешь прочитать в первой части статьи. Делать какие либо настройки для формы, а также добавлять компоненты нам не потребуется. Для сегодняшнего урока, созданных по умолчанию кнопок «Выполнить» и «Закрыть» будет вполне достаточно.
Рисунок 1. Пустая форма новой обработки
vronline | сентябрь 2010
101
Школа
Так, с обработкой разобрались, теперь определим действие для кнопки «Выполнить». Для этого щелкни один раз левой клавишей мыши по кнопке «Выполнить», а затем в панели свойств (рисунок 2) кликни напротив свойства «Действие» по пимпе с изображением лупы. После этого перед тобой откроется редактор кода с созданной заготовкой для процедуры КнопкаВыполнитьНажатие(Кнопка).
В теле процедуры напишем небольшой кусочек кода. Я понимаю, что еще не объяснял тебе про циклы, условия и т.д. (на примере «1С:Предприятие»), но не стоит волноваться. Пока просто перепиши мой код (если ты уже имеешь опыт программирования, то с его пониманием не должно возникнуть проблем), а в следующей статье я уже подробно расскажу про различные языковые конструкции применяемые в «1С:Предприятие». Листинг 1. Код для отладки
Переменная1 = 24; Переменная2 = 31; Массив = Новый Массив; //Ошибок не возникнет РезультатСложения = Переменная1 + Переменная2; //Ошибок не возникнет РезультатВычитания = Переменная2 (Переменная1 + 7); //А вот здесь произойдет ошибка //на 0 делить нельзя РезультатДеления = Переменная1 / РезультатВычитания; //запускаем цикл от 0 до 1 млн //заполняем массив Для сч = 0 по 1000000 Цикл Массив.Добавить(сч + сч); КонецЦикла;
Приведенный код прост, но сегодня нам такой и нужен. Обрати внимание, в нем нет выводов сообщений с результатами вычислений, их нам предстоит смотреть в отладчике.
Рисунок 2. Окно свойств кнопки
Возможности отладчика
Наш код готов, самое время приступить к его отладке. Все функции встроенного отладчика в «1С:Предприятие» ты можешь найти в пункте главного меню «Отладка». Рассмотрим его содержимое подробней: 1. Продолжить отладку – Кнопка предназначена для двух действий: запуск режима «Предприятия» для начала отладки; продолжение отладки после остановки программы на точке останова.
2. Перезапустить – Перезапуск режима «Предприятие» во время отладки. Функция обычно применяется когда ты внес изменения в код, но забыв перезапустить 1С:Предприятие (для того чтобы внесенные тобой изменения начали действовать) запустил отладку. В этом случае ты также попадешь в окно отладки, но недавно внесенные изменения в код не будут задействованы. Чтобы прервать процесс отладки (в зависимости от Рисунок 3. Возможности отлаживаемой части отладчика он может занимать достаточно продолжительное время) и перезапустить создаваемое решение, и предназначена эта кнопочка.
3. Завершить – завершение процесса отладки. 1С'ка, запущенная в режиме «Предприятие»? будет закрыта (именно та копия, которая связана с отладчиком). Этот пункт применяется для принудительной остановки отладки. Например, ты выполняешь отладку и код зациклился. Тут ничего не остается делать, как выполнить прекращение отладки.
4. Остановка по ошибке – выполнение остановки программы при возникновении ошибки. Функция позволяет начинать отладку сразу после возникновения ошибки. Обычно эта опция применяется при тестировании (особенно при первом тесте разрабатываемого решения), т.к. мы еще не можем знать проблемных участков в коде (следовательно, не можем определить нужную точку останова), поэтому чтобы приступить к отладке в момент возникновения ошибки. Чуть позже я рассмотрю пример ее практического использования.
5. Подключение – подключение отладчика к уже открытой конфигурации в режиме «Предприятие». Возможность полезна для отладки решений запущенных от имени другого пользователя или выполняющихся на удаленном компьютере. Очень часто сталкиваешься с ситуацией, когда на твоей тачке все работает отлично, а на компьютере конечного пользователя происходят какието странности. В таких ситуациях, проще всего подключиться отладчиком к его 1С'ске, и посмотреть что к чему.
vronline | сентябрь 2010
102
Школа
6. Шагнуть в – трассировка кода с заходом в процедуру. Сразу представим пример. Тебе требуется отладить некий код (например, тот, который мы написали в обработчике события для нашей единственной кнопке), а в коде есть вызов функции, объявленной, в общем, в модуле. Когда ты доберешься до кода вызова функции, у тебя будет выбор – перейти к отладке тела функции или продолжить отладку обработчика события. Для перехода к отладке кода вызываемых процедур/функции и предназначена эта кнопка. 7. Шагнуть через – полная противоположность предыдущем пункту. Если ты дошел в коде до вызова функции и нажал «Шагнуть через», то перехода к отладке тела функции не будет. 8. Шагнуть из – выход из тела функции/процедуры. Если ты вдруг перешел к отладке тела функции и передумал пошагово выполнять ее код, то нажимаешь «Шагнуть из» и моментально вернешься к месту, в котором выполнил погружение. 9. Идти до курсора – отладка будет выполняться до места в котором установлен курсор. Затем пошаговая отладка будет завершена и приложение продолжит работу в штатном режиме.
10. Текущая строка – перемещение курсора на текущую строку отладки.
11. Точка останова – установка точки останова (брякпоинта; бряка; – сленговые выражения). В месте установки точки останова начнется отладка приложения. Например, тебе надо начать отладку с пятой строчки своего кода. Ставишь на ней точку останова и запускаешь программу на выполнение. Как только дойдет очередь до точки останова, сразу же произойдет переключение в режим пошагового выполнения программы. 12. Точка останова с условием – у этой функции точно такая же роль, что и у предыдущей, но за одним исключением. Переключение в режим отладки произойдет лишь в случае выполнения заданного условия. Подобные точки бывают очень полезны во время нахождения нерегулярно повторяющихся ошибок. Допустим, ты знаешь, что ошибка возникает при 100м разе выполнения цикла. Как быть? Каждый раз пошагово просматривать 100 раз выполнения цикла? Можно, но не нужно. Лучше поставить точку останова с условием и начинать отладку сразу на 100й итерации. 13. Отключение точки останова – временное отключение точки останова. Выполнив эту функцию, ты больше не будешь попадать в режим отладки в месте установки точки останова. Она будет отключена (но не удалена).
14. Убрать все точки останова – удаление всех ранее расставленных точек останова в тексте программы.
15. Отключить все точки останова – то же самое, что и отключение точки останова, только для всех расставленных точек.
16. Точки останова – просмотр всех установленных точек останова в диалоговом окне. В нем ты можешь отключать/включать точки останова, устанавливать для них условия, удалять и т.д.
17. Вычислить выражение – функция позволяет вычислить/посмотреть выражение, записанное на встроенном языке. Это, пожалуй, наиболее часто используемая функция во время отладки. С ее помощью выполняется просмотр значений переменных; просмотр результата выполнения выражения на встроенном языке; перенос переменны в специальное табло (для постоянного наблюдения за содержимым переменной во время пошаговой отладки).
18. Табло – отображение панели, на которую можно перетаскивать переменные, значение которых будут отображаться во время пошаговой отладки. Именно в эту панель попадают переменные после нажатия кнопки «Включить в табло» в окне «Выражения», вызываемом через функцию «Вычислить выражение». 19. Стек вызовов – в стеке вызовов выводится последовательность функций/процедур, которые привели к строке, отлаживающейся в настоящий момент.
20. Замер производительности – инструмент выполняет замеры производительности конфигурации или определенной ее части. Если для разрабатываемого решения особое значение имеет скорость выполнения, то этот инструмент поможет тебе выявить участки кода, которые выполняются особенно медленно. Отладка на практике
Функции, предоставляемые платформой «1С:Предприятие» для отладки мы рассмотрели и теперь самое время проверить некоторые из них на практике. Начнем с самого простого – установки точки останова. Перейди в редактор кода (если ты еще не в нем), установи курсор на первой строчке и нажми клавишу F9 (или воспользуйся пунктом «Точка останова» в меню «Отладка»). Затем, нажми клавишу F5 (начни отладку). Выполнив это действие, ты запустишь «1С» в режиме «Предприятие». В нем открывай созданную обработку и жми на кнопку «Выполнить». Не успеешь моргнуть и глазом, как перед тобой снова распахнет свои объятия «Конфигуратор», только теперь напротив строчки, где мы установили точку останова, появится желтая стрелочка. Это означает, что сейчас будет выполнена данная строка. Чтобы vronline | сентябрь 2010
103
Школа
это произошло, тебе нужно воспользоваться клавишами «навигации»: F11 (шагнуть в), F10 (шагнуть через), Shift+F11 (шагнуть из) и Shift + F10 (идти до курсора).
Нажми клавишу F10. Желтая стрелка переместится на следующую строку и в переменную с именем «Переменная1» будет записано числовое значение 24. Чтобы в этом убедиться, выдели имя переменной («Переменная1») и нажми сочетание клавиш Shift + F9 (нажатие равносильно выбору пункта “Вычислить выражение» в меню «Отладка»). Если ты не промахнулся с выделением имени переменной, то увидишь примерно такую же картинку как на рисунке 4.
помощью окна вычисления выражений. Особое внимание обрати на строчку, в которой происходит деление. В ней я намеренно совершил ошибку. Значение переменной «РезультатВыражения» равно 0, а на ноль делить нельзя. Следовательно, на этом шаге возникнет ошибка, и отладка будет прекращена. Пока не будем ее исправлять, а познакомимся с другими функциями отладчика. Начнем с «Остановка по ошибке». Зайди в соответствующий пункт меню «Отладка». В появившемся окне (рисунок 6) установи флажок «Останавливаться по ошибке».
Рисунок 6. Окно «Остановка по ошибке»
Рисунок 4. Смотрим значение переменной
В этом окне мы можем узнать тип переменной, ее значение, а также, в случае необходимости, вычислить произвольное выражение на встроенном языке. Например, попробуй ввести в строке «выражение» следующий текст: ТипЗнч(Переменная1) = Тип("Число")
Затем нажми кнопку «Рассчитать» и в окне результатов ты должен увидеть примерно следующее:
Этим действием мы укажем отладчику, что переходить в режим пошаговой отладки нужно всякий раз как платформа будет генерировать какуюнибудь ошибку. В этом окне также есть табличная поле, в котором ты можешь определить текст сообщений, при возникновении которых стоит переходить в режим отладки. Для нашего примера мы не будем определять список конкретных сообщений. Нам главное увидеть работу этой функции в действии. Итак, установи флажок и нажми кнопку Ok. Вернись в режим «Предприятие» и вновь в обработке нажми кнопку «Выполнить». Поскольку мы устанавливали точку останова, то значит, ты сразу попадешь в режим отладки. Для демонстрации примера нам это не нужно, поэтому после того как выполнение программы остановится (сработает точка останова) нажми F5, тем самым продолжив выполнение.
Рисунок 5. Вычисляем значение выражения
Что означает данное выражение? Все просто, в нем я выполняю сравнение типа значения переменной «Переменная1» с типом «Число». Если «переменная1» является числом, то результат будет «Истина». В нашем случае так оно и есть.
Надеюсь, с этим все ясно, двигаемся дальше. Пока закрой окно вычисления результатов и попробуй пошагово пройтись по всему коду. Периодически проверяй значение переменных с
Буквально сразу после нажатия F5 ты вновь попадешь в отладчик, а также увидишь сообщение как на рисунке 7.
Рисунок 7. Сработала система «Остановка по ошибке»
В этом сообщение тебе сразу приводится номер строки, в которой произойдет ошибка, а также
vronline | сентябрь 2010
104
Школа
текст ошибки. Нажав кнопку Ok, ты сможешь продолжить отладку приложения.
простейшей операции, в целом нет. Числа можно и так перемножить. Я ее описал лишь для того, чтобы опробовать на практике варианты шагов отладки. Ок, идея понятна. Давай, гденибудь в основной процедуре произведем вызов только что описанной функции. В своем примере я это сделал сразу после строки с операцией сложение:
Точки останова с условием
РезультатУмножения = Умножить(Переменная1, Переменная2);
Я уже говорил, что этот инструмент весьма полезен при начальной отладке приложения. Установил реакцию на ошибки и начинаешь спокойно тестировать приложение. Возникла ошибка – перешел в отладчик и начал просматривать содержимое всех переменных, участвующих в выполнении операции. Точки останова могут быть двух видов – обычные и с условием. С первыми мы уже познакомились, теперь настала очередь вторых. Чтобы установить точку останова с условием, необходимо установить курсор в строке, для которой требуется создать точку останова, а после этого пройти в меню «Отладка» и выбрать пункт «Точка останова с условием». Перед тобой должно появиться небольшой окно (рисунок 8), в котором требуется ввести текст условия, при выполнении которого будет запускаться трассировка программы.
Установи для этой строки точку останова и вновь запусти отладку (не забудь, что тебе требуется закрыть в режиме предприятия открытую обработку и заново ее открыть, иначе твой новый код обработан не будет). После того как управление будет передано отладчику нажми клавишу F11 и ты сразу перепрыгнешь в тело функции Умножить(). Попав в функцию Умножить(), можешь начать трейсить ее код (выполнять пошагово) или сразу из нее вернуться на то же место откуда и пришел. Для возврата воспользуйся функцией Шагнуть из (Shift + F11).
Рисунок 8. Установка точки останова с условием
Напиши в этом окне: «РезультатВычитания = 0» (без кавычек) и нажми Ok. Сразу после этого, слева от строки, на которой находится курсор, появится значок в виде знака вопроса ( ).
Считай, что установка точки останова с условием нам удалась. Попробуй опять нажать на кнопку «Выполнить» нашей обработки (в режиме «Предприятие») и посмотреть поведение отладчика. Если ты все сделал правильно, то практически сразу попадешь в отладку, т.к. сработает условная точка останова, которая сравнивает значение переменной «РезультатВычитания» с 0. Такой тип точек останова очень удобно применять в коде с большим количеством вычислений и расчетов. Вспомни сразу пример, который я приводил при описании меню «Отладка».
Шагаем «в» и «из»
Немного разнообразим наш пример. Добавь в код обработки следующую функцию: Функция Умножить(Число1, Число2) Возврат Число1 * Число2; КонецФункции
Данная функция выполняет умножение числа переданного ей в качестве первого параметра на число, переданное в качество второго параметра. Смысла заводить функцию для этой
Рисунок 9. Стек вызовов после захода в функцию Умножить()
Замеряем производительность
Последняя функция отладки, с которой я тебя хочу познакомить – замер производительности. Это очень важная фича и ее приходится применять в каждом проекте. Весь создаваемый код должен быть не только рабочим, но и быстрым. Если код выполняет какуюто крутую функцию, но делает это очень медленно, то возможно и нет смысла пользоваться этим кодом (бывают, конечно, и исключения). Лучше сразу его либо переписать, либо оптимизировать. Первый подход чересчур глобальный и требует четкого понимания и уверенности, что новый алгоритм действительно в nое число раз быстрее старого. Если такой уверенности нет, то лучше не тратить свое драгоценное время на бессмысленное кодирование. Куда эффективней попробовать оптимизировать существующее и рабочее решение, нежели выдумать новый велосипед. Инструмент «Замер производительности» создан для того, чтобы ты мог замерить время выполнения своего кода и на основании полученных данных принять соответствующие меры. Несмотря на большую пользу этой возможности, пользоваться ей совсем не сложно. И сейчас ты в этом убедишься. Но сначала, давай внесем в
vronline | сентябрь 2010
105
Школа
наш тестовый код небольшое изменение. Найди строку, в которой происходит деление на 0 и закомментируй ее (установи курсор на строку и нажми сочетание клавиш ctrl + / или просто перед строчкой поставь два слеша (//)). Это пришлось сделать для того, чтобы наша обработка не выдавала ошибку на этой строке, а добралась до кода с длинным циклом. Выбери пункт «Замер производительности» в меню «Отладка». Не пугайся, если перед тобой не появится какихлибо окон. Так все и должно быть. Пока ты просто активировал замер производительности и теперь нужно начать тестировать нашу обработку. Перейди в режим «предприятие» и нажми на кнопку «Выполнить». Как только обработка завершит свою работу, тебе надо вернуться в конфигуратор и опять зайти в меню «Отладка» > «Замер производительность». На этот раз перед тобой должно появиться окошко как на рисунке 10. В нем ты можешь увидеть время, затраченное на выполнения определенных участков кода твоей обработке. Применительно к нашему примеру, самым медленным участком будет бесконечный цикл.
Рисунок 10. Замеряем производительность
Заключение
Отладка – неотъемлемая часть разработки приложения. Чтобы не говорили, а без отладчика многие проблемы выявить нереально. К сожалению, не все начинающие программисты горят желанием разбираться с нюансами отладки. Свое объяснение этому факту я уже приводил. Это в корне неверный подход. Рано или поздно тебе все же придется столкнуться с «кошмаром» с именем «Отладка». Так почему не обуздать отладчик уже сегодня?
vronline | сентябрь 2010
Автор: Поротников Андрей aka wwwnet
106
Школа
C#
Tips & Tricks Напиши мне, напиши!
Не редко случается ситуация, когда программе требуется отправить какоелибо сообщение на определенный адрес. Например, у вас есть программа мониторинга, которая должна отправить сообщение при аварийной ситуации. Средствами C# это сделать не просто легко, а очень легко. В данной статье я приведу пример отправки письма, рассказав об основных моментах.
Для примера я создал форму, содержащую три поля ввода (Кому, Тема и тело письма) и кнопку Отправить:
}
message.Subject = txtSubject.Text; message.SubjectEncoding = Encoding.UTF8; try { client.Send(message); } catch(Exception ex) { MessageBox.Show(ex.Message); } message.Dispose();
Вначале проверяется, заполнено ли поле txtTo (Кому). Если нет, то показываем сообщение и завершаем выполнение процедуры.
Затем создается экземпляр объекта SmtpClient, который и позволяет приложениям отправлять письма по протоколу smtp. SmtpClient client = new SmtpClient("ServerName");
Сразу в конструкторе указываем имя почтового сервера. Это может быть MyExchange в локальной сети или mail.ru в интернете. Затем задаем настройки аутентификации: Собственно, код при нажатии на кнопку Send следующий:
private void button1_Click(object sender, EventArgs e) { if (txtTo.Text == string.Empty) { MessageBox.Show("Please specify the address"); return; } SmtpClient client = new SmtpClient("ServerName"); client.Credentials = new NetworkCredential("UserName", "Password", "DomainName"); MailAddress from = new MailAddress("UserEMail", "FromWho", Encoding.UTF8); MailAddress to = new MailAddress(txtTo.Text); MailMessage message = new MailMessage(from, to); message.Body = txtMessage.Text; message.BodyEncoding = Encoding.UTF8;
client.Credentials = new NetworkCredential("UserName", "Password", "DomainName");
В данном случае задается три параметра: имя пользователя, его пароль и домен.
Следующее действие – это создание двух экземпляров объекта MailAddress, который представляет электронный адрес. Первый – это адрес отправителя, второй – адрес получателя.
Наконец, создаем сообщение как экземпляр класса MailMessage и заполняем его параметры. В примере показан минимум, который нужен для письма, в реальном приложении его можно расширить за счет прочих полей (например, кому отсылать копии – параметр CC и т.д.). Последнее действие – это отправка письма в блоке trycatch и очистка занимаемых экземпляром MailMessage ресурсов вызовом метода Dispose().
vronline | сентябрь 2010
VRCrew
107
Мнение VR
Мнение VR Национальная ОС. Нужна ли она нам?
JimmyJonezz: Национальная операционная система нужна гос. учреждениям и структурам относящимся непосредственно к образованию. Для простого обывателя достаточного того, что уже есть.
Kastor: Блин, как же это смешно звучит =) Национальная операционная система. Это что именно под этим подразумевается? Что там будут только русские шрифты что ли? Если бы тот, кто придумал этот термин, хоть немного шевелил мозгами, то он знал бы, что Россия многонациональная страна. Ну и к какой тогда нации будет относиться эта ОС? Да и зачем она нужна? Как много вопросов возникает сразу, ответы на которые наверняка будут смешными и нелепыми. Некоторые могут возразить, мол, чтобы не закупать тот же Windows будем юзать свою ОС. Хм, юзайте Linux. Зачем деньги тратить на разработку того, что уже есть? Кстати, когдато в одном подкасте слушал обсуждение российского дистрибутива ASP Linux. Так вот один из разработчиков сказал, что название произошло от Александра Сергеевича Пушкина. Бери и юзай! Куда уже национальнее то =)
национальная операционная система лишь средство наворовать побольше бабла. Да и нафига нам ОС, основанная на Linux? Те же яйца, только в профиль. Глупо все както. ZeroXor: Когда заходит разговор о новых нац.проектах в сфере IT, мне сразу вспоминается размышление М. Н. Задорнова и его фраза “Наш Президент, похоже, в детстве не доиграл. Только вот почему все мы теперь должны играть вместе с ним?” Вообще, создается ощущение, что у Президента все, что содержит в названии “IT”, “модернизация”, “инновация”, вызывает какоето непреодолимое желание все это претворить в жизнь. А некоторые этим пользуются, пересылая выделенные деньги не по адресу. Так уже было не раз и не два. Потому лично мне както не слишком верится, что “Национальную ОС” постигнет более удачливая судьба.
А лично мне вполне хватает свободнобесплатного Debian'а в качестве операционной системы, ничего другого и не нужно.
Lord_of_Fear: Ох, уж эти национальные проекты... zahod5277: Чтото слишком задолбали. По ящику вечно много в последнее время предлагается национальных IT рассказывают в новостях про дефицит бюджета, но у нас проектов. Кажется начинает то и дело возникают попахивать национализацией, хотя, может паранойя? В любом разговоры о миллионах инвестиций в какието случае, я считаю что бесполезные национальный
фиговины. Задолбали! Не нужно это никому. Не будут этим пользоваться. Если мне понадобится бесплатная ось, то я себе Debian поставлю. Все же остальные просто качнут кряк на винду и не будут заморачиваться. Spider_NET: «Ты ж мэня спидманула, ты ж мэня пэдвила..» я сразу вспоминаю эту веселую народную песенку, когда заходит речь о национальных IT проектах. Ну не верю я в успех и качество национальных поделок. Нет, я верю в наших программистов, и на сто процентов уверен, что они ничуть не хуже западных. Но у меня нет веры в тех, кто занимается реализацией нац. IT проектов. Как показывает практика, вся работа над проектами сводится к получению больших деньжищ, которые тратятся, не пойми на что. В итоге, каждая поделка рождается мертвым. А если так, то зачем они нужны? Zanuda25: Мое мнение таково: никакой оценки не даю этому проекту. Разложу все по полочкам. Сначала перечислим плюсы. 1. Свою ОС иметь – это неплохо, так как ты сам знаешь, где баги можно прикрыть и ни от кого не зависишь...
2. Вон грузины сделали ОС Windows грузиноязычным... А вот минусы. 1.
Ухлопают прорву денег.
vronline | сентябрь 2010
108
Мнение VR
И снова ничего не сделают.
2. А вот, если сделают свою ОС, то она может не прижиться. К примеру, грузинская версия Windows полностью не прижилась.
vronline | сентябрь 2010