Отправляет email-рассылки с помощью сервиса Sendsay

Хakep_daily

  Все выпуски  

Рука для виртуальной реальности *


PDA   подписка    wiki   bugtrack   статьи    видео   блог   форум   поиск    друзья   






Yahoo и WinZip взломаны через уязвимость Shellshock
2014-10-07 12:10 Denis Mirkov

Президент и старший исследователь консалтинговой компании Future South Technologies Джонатан Холл (Jonathan Hall) опубликовал подробный рассказ, как ему с коллегами удалось найти румынский ботнет, который взломал серверы нескольких крупных компаний, используя уязвимость Shellshock. Среди жертв оказались серверы Yahoo, WinZip и другие.

Джонатан Холл рассказал об общении с представителями взломанных компаний. В частности, Yahoo обнаружила следы ботнета на двух серверах Yahoo Games. Компания подтвердила факт взлома.

Future South Technologies нашла ботнет, исследуя источники запросов на уязвимые CGI-скрипты к одному из своих серверов. Такие запросы должны были использовать известную уязвимость в Bash и передать команды на сервер. Теоретически, метод позволяет злоумышленнику получить контроль над сервером. Проследив источник запросов, Джонатан Холл вышел на сервер WinZip и нашёл скрипт под названием ha.pl.

Изучение содержимого скрипта показало, что это IRC-бот, похожий на те, которые получают команды для проведения DDoS-атак. Но этот конкретный экземпляр был предназначен не для DDoS, а для поиска серверов с уязвимой версией Bash. Управление ботнетом осуществлялось с IRC-канала, названного очень креативно #bash, а комментарии к коду скрипта написаны по-румынски.

Холл говорит, что подключился к IRC-каналу и видел там трафик со многих известных серверов, в том числе lycos.com и yahoo.com.

В принципе, каждый может найти уязвимые сайты через Google, если поищет скрипты .pl в директории cgi-bin или в /tmp, или в /var/tmp.



Эстония предлагает «электронное гражданство»
2014-10-07 13:30 Denis Mirkov

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

Такая карта не является официальным паспортом или идентификатором личности, но даёт доступ к порталу госуслуг и различным сервисам. От этого нет особенной пользы, зато иностранцы могут изучить, как организована система электронного правительства, поискать уязвимости на портале.

Как известно, в Эстонии действует продвинутая система цифровых сервисов. Граждане могут голосовать по любому вопросу через интернет, начиная от голосования за установку домофона в подъезде и заканчивая выборами президента. Идентификация осуществляется с помощью криптографически защищённых смарт-карт и специальных ридеров, которые подключаются к компьютеру по USB (продаются отдельно). Подобный механизм исключает подтасовку результата голосования и позволяет каждому гражданину проверить, что его голос учтён правильно.

Эстонский гражданин после голосования

Эстонский гражданин после голосования

Более подробно процедура описана в листовке и брошюре. В листовке указано, что для получения ID-карты придётся посетить отделение пограничной службы Эстонии (Police and Border Guard) и сдать биометрическую информацию.

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

Эстонские граждане проверяют курс акций (с сайта e-estonia.com)

Эстонские граждане проверяют курс акций (с сайта e-estonia.com)



Уязвимость в Bugzilla выдаёт 0day-уязвимости
2014-10-07 14:50 Denis Mirkov

Компания Check Point Software Technologies использовала найденный баг в языке программирования Perl, чтобы взломать популярный баг-трекер Bugzilla и добавить туда четырёх новых администраторов. С полными правами в системе, они смогли увидеть список уязвимостей, которые ещё не опубликованы в открытом доступе.

Вчера хакеры рассказали о новом классе уязвимостей в Perl (по крайней мере, авторы считают его новым). Сайт Bugzilla они взяли для демонстрации. Такие же проблемы существуют на других ресурсах. Более того, программное обеспечение Bugzilla используется более чем в 150 баг-трекерах различных крупных проектов: это OpenOffice, Red Hat, ядро Linux и многие другие.

Уязвимый код

my $otheruser = Bugzilla::User->create({
    login_name => $login_name, 
    realname   => $cgi->param('realname'), 
    cryptpassword => $password});


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

Запрос

index.cgi?realname=JRandomUser&realname=login_name&realname=admin@mozilla.com

Mozilla уже выпустила обновление 4.0.14, которое исправляет баг. То же самое должны использовать все веб-разработчики, которые пишут на Perl.



Обзор полезного софта для управления виртуализацией
2014-10-07 15:15 Джон Сноу

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

Vagrant

Виртуальная машина VirtualBox заслуженно пользуется популярностью среди админов и разработчиков, позволяя быстро создавать нужные окружения при помощи графического интерфейса либо интерфейса командной строки. Если количество VM не превышает трех, никаких трудностей в развертывании и управлении не возникает, но современные проекты имеют свойство обрастать конфигурациями, и в итоге получается весьма сложная инфраструктура, справиться с которой становится непросто. Вот эту проблему и призван решить менеджер виртуальных окружений Vagrant, позволяющий создавать копии виртуальных машин с заранее определенной конфигурацией и динамически перераспределять ресурсы VM (Provisioning) по мере необходимости. В базовой поставке Vagrant работает с VirtualBox, но система плагинов позволяет подключить другую систему виртуализации. На сегодня открыт код плагинов для AWS и Rackspace Cloud, по коммерческой подписке доступен плагин для поддержки VMware Fusion/Workstation.

Vagrant — удобная надстройка над VirtualBox

Vagrant — удобная надстройка над VirtualBox

Vagrant не создает виртуальную машину с нуля. Для удобства проект предлагает несколько базовых образов (boxes), которые импортируются и впоследствии используются для быстрого развертывания системы, уже на основе boxes собирается гостевая ОС с нужной конфигурацией.

Для упрощения развертывания приложений в boxes предустанавливаются Chef и Puppet. Кроме того, нужные установки можно задавать при помощи shell. В состав окружений включается полный комплект для запуска и разработки приложений на Ruby. Для доступа к VM используется SSH, возможен обмен файлами через расшаренную директорию.

Написан Vagrant с использованием Ruby, установить его можно на любую платформу, для которой есть компоненты VirtualBox и Ruby. На странице загрузки доступны пакеты для Windows, Linux (deb и rpm) и OS X.

Процесс установки и использования в Ubuntu прост. Скачиваем пакеты VirtualBox и Vagrant и ставим:

$ sudo dpkg -i virtualbox-4.2.10_amd64.deb
$ sudo dpkg -i vagrant_1.2.2_x86_64.deb

На момент написания статьи с последней актуальной версией VirtualBox 4.2.14 были проблемы при запуске Vagrant, поэтому пока лучше использовать 4.2.12 или тестовую 4.2.15. Как вариант, можно выполнить:

$ cd ~/.vagrant.d/boxes/BoxName/virtualbox
$ openssl sha1 *.vmdk *.ovf > box.mf

Приведу альтернативный вариант установки Vagrant — с использованием Ruby:

$ sudo apt-get install ruby1.8 ruby1.8-dev rubygems1.8
$ sudo gem install vagrant

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

$ mkdir project
$ cd project
$ vagrant init

Теперь можно заглянуть в созданный файл настроек и заполнить: установки VM (config.vm.), опции подключения по SSH (config.ssh.), параметры самого Vagrant (config.vagrant). Все они хорошо документированы, значение некоторых понятно и без пояснений.

На самом деле при запуске используется несколько таких файлов, каждый последующий переопределяет предыдущий: встроенный в Vagrant (его изменить нельзя), поставляемый с boxes (упаковывается при помощи ключа ‘–vagrantfile’), расположенный в ~/.vagrant.d и файл проекта. Такой подход позволяет использовать установки по умолчанию, переопределяя в конкретном проекте только то, что необходимо.

Настройка проекта в Vagrant производится при помощи специального файла

Настройка проекта в Vagrant производится при помощи специального файла

Все установки производятся при помощи команды vagrant, список доступных ключей можно просмотреть при помощи ‘-h’. После установки мы не имеем ни одного образа, запуск vagrant box list выведет пустой список. Готовый box может находиться в локальной ФС или на удаленном сервере, в качестве параметра задается его имя, по которому будем обращаться в проектах. Например, используем официальный Box Ubuntu 12.04 LTS, предлагаемый разработчиками Vagrant.

$ vagrant box add precise64 http://files.vagrantup.com/precise64.box

Теперь к нему можно обращаться из Vagrantfile:

config.vm.box = "precise64"

Хотя проще сразу его указать при инициализации проекта:

$ vagrant init precise64

Самый простой способ, не требующий изучения Chef и Puppet, — это использовать для конфигурирования VM стандартные команды оболочки, которые можно прописать прямо в Vagrantfile или, что еще лучше, объединить в скрипт, который подключается так:

Vagrant.configure("2") do |config|
    config.vm.provision :shell, :inline => "script.sh"
end

Теперь все команды, указанные в script.sh, будут выполнены при запуске VM. При старте проекта создается ovf-файл, его установки можно просмотреть при помощи графического интерфейса VirtualBox или команды VBoxManage:

$ VBoxManage import /home/user/.vagrant.d/boxes/precise64/virtualbox/box.ovf
Virtual system 0:
 0: Suggested OS type: "Ubuntu_64"
 (change with "--vsys 0 --ostype <type>"; use "list ostypes" to list all possible values)
 1: Suggested VM name "precise64"
 (change with "--vsys 0 --vmname <name>")
 2: Number of CPUs: 2
 (change with "--vsys 0 --cpus <n>")
 3: Guest memory: 384 MB
 (change with "--vsys 0 --memory <MB>")

Не всегда они удовлетворяют заданным условиям, но, используя настройки провайдера, можно легко изменить установки конкретной VM (см. подсказки «change with …»):

config.vm.provider :virtualbox do |vb|
    vb.customize ["modifyvm", :id, "--memory", "1024"]
end

Запускаем и подключаемся к системе по SSH:

$ vagrant up
$ vagrant ssh

Чтобы остановить VM, используется параметр halt или destroy (второй — с очисткой всех файлов, в следующий раз все операции будут выполнены с начала), если нужно отправить ее в спячку — vagrant suspend, вернуть — vagrant resume. Для примера работы с Chef можно использовать готовый рецепт, при помощи которого настроить APT и Apache2:

config.vm.provision :chef_solo do |chef|
    chef.recipe_url = "http://files.vagrantup.com/getting_started/cookbooks.tar.gz"
    chef.add_recipe("vagrant_main")
end

Чтобы обращаться к VM «извне», потребуется настроить проброс портов. По умолчанию производится проброс 22 -> 2222, позволяющий подключаться по SSH. Добавляем в Vagrantfile:

Vagrant::Config.run do |config|
    config.vm.forward_port 80, 1111
end

Теперь к веб-серверу можно обратиться, перейдя по адресу http://127.0.0.1:1111/. Чтобы не настраивать окружение каждый раз, лучше собрать на его основе готовый пакет.

$ vagrant package --vagrantfile Vagrantfile --output project.box

Теперь файл project.box можно распространить среди остальных администраторов, разработчиков или простых пользователей, которые подключат его при помощи командыvagrant box add project.box.

 

ConVirt

Системы виртуализации Xen/KVM, выпускаемые под свободными лицензиями, не имеют удобного интерфейса, что часто трактуется не в их пользу. Однако этот недостаток легко восполнить. ConVirt позволяет развертывать виртуальные машины на нескольких серверах Xen и KVM буквально одной кнопкой, при помощи простого в использовании интерфейса. Доступны все необходимые операции с виртуальными машинами: запуск, останов, создание снимков, контроль и перераспределение ресурсов, подключение к VM по VNC, автоматизация задач администрирования. Технология Ajax делает интерфейс интерактивным и похожим на настольное приложение. Например, VM с одного сервера на другой можно просто перетащить. Интерфейс нелокализован, но управление интуитивно понятное.

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

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

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

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

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

Поддерживаются все технологии: балансировка нагрузки, горячая миграция, виртуальные диски с растущей емкостью, позволяющие задействовать ресурсы по мере необходимости, и многие другие возможности, реализованные в Xen и KVM. Чтобы перераспределить ресурсы, остановка VM не требуется.

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

Разработку ConVirt ведет компания Convirture, при этом используется концепция open core (открытая основа), когда вместе с исходными текстами свободно распространяется только базовый набор функций, остальное доступно в коммерческой версии. В open source варианте отсутствует поддержка High Availability, интеграция с VLAN, резервирование и восстановление, возможность управления из командной строки, уведомления и официальная поддержка.

При разработке использовались фреймворк TurboGears2, библиотеки ExtJs и FLOT, для хранения информации — MySQL, в качестве DHCP- и DNS-сервера задействован dnsmasq. Нужный пакет можно найти в репозиториях популярных дистрибутивов Linux.

 

Karesansui

Karesansui — простое в использовании веб-приложение для управления системами виртуализации KVM и Xen. Учитывая, что поддержка виртуализации базируется на libvirt, особых трудов добавить OpenVZ, QEMU, VirtualBox не составит. Управление осуществляется при помощи веб-браузера, интерфейс реализован в стиле Web 2.0 с элементами Ajax, использование фреймворка jQuery позволило придать интерфейсу интерактивность, подобную работе за локальной консолью в дата-центре. Интерфейс не локализован, но каких-либо трудностей в его освоении не возникает. Для доступа к экранам виртуальных машин используется TightVNC Java Viewer.

Реализованы все возможности для управления виртуальными окружениями: установка ОС, создание конфигураций дисковой подсистемы и виртуальных сетевых карт, управление квотами, репликация, заморозка VM, создание снапшотов, просмотр подробной статистики и данных журналов, мониторинг загрузки. С одной консоли можно управлять несколькими физическими серверами и размещенными на них виртуальными машинами. Возможна многопользовательская работа с разделением прав. В итоге разработчикам удалось в браузере реализовать виртуальное окружение, позволяющее полноценно управлять системами.

Написан Karesansui на языке Python, в качестве СУБД для одноузловой системы используется SQLite. Если планируется управлять установками Karesansui, размещенными на нескольких физических серверах, следует использовать MySQL или PostgreSQL.

Развернуть Karesansui можно в любом Linux. Сами разработчики отдают предпочтение CentOS (для которого на сайте есть подробная инструкция), хотя Karesansui неплохо себя чувствует и на Debian и Ubuntu. Перед установкой необходимо выполнить все зависимости, указанные в документации. Далее запускается установочный скрипт и инициализируется БД. Если используется многосерверная конфигурация, то нужно просто указать внешнюю БД.

Последующая работа полностью компенсирует неудобства установки. Все настройки разделены по семи вкладкам, назначение которых понятно из названия: Guest, Settings, Job, Network, Storage, Report и Log. В зависимости от роли пользователя ему будут доступны не все из них.

Создать новую VM можно из локального ISO-файла или указав HTTP/FTP-ресурс с установочными образами. Также потребуется задать остальные атрибуты: имя системы, которое будет отображаться в списке, сетевое имя (hostname), технология виртуализации (Xen или KVM), размер ОЗУ и жесткого диска (Memory Size и Disk Size) — и выбрать картинку, которая будет соответствовать виртуальной ОС, упрощая ее быстрый визуальный выбор в консоли.

INFO


Исходные коды Vagrant и Karesansui распространяются под лицензией MIT.

Для создания боксов Vagrant удобно использовать инструмент VeeWee.

WebVirtMgr

Возможности описанных решений зачастую избыточны, а их установка не всегда понятна администратору с небольшим опытом. Но и здесь есть выход. Сервис централизованного управления виртуальными машинами WebVirtMgr создавался как простая замена virt-manager, которая обеспечит комфортную работу с VM при помощи браузера с установленным Java-плагином. Поддерживается управление настройками KVM: создание, установка, настройка, запуск VM, снапшоты и резервное копирование виртуальных машин. Обеспечивается управление сетевым пулом и пулом хранилища, работа с ISO, клонирование образов, просмотр загрузки ЦПУ и ОЗУ. Доступ к виртуальной машине осуществляется через VNC. Все операции фиксируются в журналах. При помощи одной установки WebVirtMgr можно управлять несколькими серверами KVM. Для подключения к ним используется RPC libvirt (TCP/16509) или SSH.

Установка WebVirtMgr несложна

Установка WebVirtMgr несложна

Интерфейс написан на Python/Django. Для установки понадобится сервер под управлением Linux. Распространяется в исходных текстах и RPM-пакетах для CentOS, RHEL, Fedora и Oracle Linux 6. Сам процесс развертывания несложен и хорошо описан в документации проекта (на русском), необходимо лишь настроить libvirt и установить webvirtmgr. Весь процесс занимает пять минут. После подключения к Dashboard выбираем Add Connection и указываем параметры узла, далее можем настраивать VM.

Создание новой VM в WebVirtMgr

Создание новой VM в WebVirtMgr

Скриптуем создание VM

Простейший скрипт для создания и запуска виртуальной машины средствами VirtualBox:

#!/bin/bash
vmname="debian01"
VBoxManage createvm --name ${vmname} --ostype "Debian" --register
VBoxManage modifyvm ${vmname} --memory 512 --acpi on --boot1 dvd
VBoxManage createhd --filename "${vmname}.vdi" --size 10000 --variant Fixed
VBoxManage storagectl ${vmname} --name "IDE Controller" --add ide --controller PIIX4
VBoxManage storageattach ${vmname} --storagectl "IDE Controller" --port 0 --device 0 --type hdd --medium "${vmname}.vdi"
VBoxManage storageattach ${vmname} --storagectl "IDE Controller" --port 0 --device 1 --type dvddrive --medium /iso/debian-7.1.0-i386-netinst.iso
VBoxManage modifyvm ${vmname} --nic1 bridged --bridgeadapter1 eth0 --cableconnected1 on
VBoxManage modifyvm ${vmname} --vrde on
screen VBoxHeadless --startvm ${vmname}

Proxmox VE

Предыдущие решения хороши для тех ситуаций, когда уже есть некоторая инфраструктура. Но если ее предстоит только разворачивать, стоит задуматься о специализированных платформах, позволяющих быстро получить нужный результат. Примером здесь может служить Proxmox Virtual Environment, представляющий собой дистрибутив Linux (на базе Debian 7.0 Wheezy), который позволяет быстро построить инфраструктуру виртуальных серверов с использованием OpenVZ и KVM и практически не уступает таким продуктам, как VMware vSphere, MS Hyper-V и Citrix XenServer.

Консоль Proxmox VE локализована и проста в использовании

Консоль Proxmox VE локализована и проста в использовании

По сути, систему следует только установить (пара простых шагов), все остальное уже работает из коробки. Затем при помощи веб-интерфейса можно создавать VM. Для этой цели проще всего использовать шаблоны и контейнеры OpenVZ, которые загружаются с внешних ресурсов прямо из интерфейса одним щелчком (если вручную, то копируем в каталог /var/lib/vz/template). Но шаблоны можно создавать в том числе и путем клонирования уже созданных систем в режиме связывания. Этот вариант позволяет экономить дисковое пространство, так как все связанные окружения используют только одну общую копию данных эталонного шаблона без дублирования информации. Интерфейс локализован и понятен, особых неудобств при работе с ним не испытываешь.

Имеется поддержка кластеров, инструменты для резервного копирования виртуальных окружений, возможна миграция VM между узлами без остановки работы. Управление доступом к имеющимся объектам (VM, хранилище, узлы) реализовано на основе ролей, поддерживаются различные механизмы аутентификации (AD, LDAP, Linux PAM, встроенная Proxmox VE). Веб-интерфейс предоставляет возможность доступа к VM при помощи VNC- и SSH-консолей, можно просматривать статус заданий, журналы, данные мониторинга и многое другое. Правда, некоторые операции, специфические для HA-систем, придется все же выполнять по старинке в консоли, например создавать авторизованное iSCSI-подключение, настраивать кластер, создавать multipath и некоторые другие операции.

Системные требования невелики: CPU x64 (желательно с Intel VT/AMD-V), 1+ Гб ОЗУ. Проект предлагает готовый ISO-образ и репозиторий для Debian.

WWW

Сайт проекта Vagrant: vagrantup.com

Книга Vagrant Up and Running: bit.ly/177wzfR

Сайт Karesansui: karesansui-project.info

Проект ConVirt: convirture.com

Сайт WebVirtMgr: webvirtmgr.net

Страница Proxmox VE: proxmox.com/proxmox-ve

Заключение

Все описанные решения по-своему хороши и отлично справляются с поставленными задачами. Нужно только выбрать наиболее подходящее к конкретной ситуации.



Overstock продаёт акции в биткоин-подобной сети
2014-10-07 16:10 Denis Mirkov

Компания Overstock.com создаёт программное обеспечение на основе Bitcoin, чтобы продавать свои акции через интернет в обход традиционных фондовых бирж, таких как NASDAQ и NYSE.

Для разработки ПО наняли двух программистов из компании CounterParty, которая занимается разработкой различных финансовых сервисов на базе Bitcoin. Криптографическая P2P-система Bitcoin предоставляет богатое поле для инноваций. Факт генерации транзакций, защищённых от дублирования и гарантированно аутентичных (без услуг нотариуса) — идеальный инструмент для финансовых сервисов, и не только для них. Неудивительно, что многие пытаются использовать цепочку Bitcoin в своих целях, эксплуатируя огромную сеть майнеров.

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

Программа под кодовым названием Medici станет народной альтернативой Уолл-Стриту, ненавидимому многими за свою закрытость и присвоение значительной части финансовых ресурсов, которые отнимаются у простых инвесторов.

Если подобная система получит распространение, то это станет серьёзным ударом по всей банковской системе: не только по биржам, но и по крупным банкам, ведь они активно занимаются инвестиционной деятельностью, торгуя на биржах. Наибольший удар придётся по США и Великобритании — это главные хабы мировой финансовой системы.

С точки зрения геополитики, все страны, которые стремятся противодействовать США, должны активно поддерживать Bitcoin и всячески продвигать эту криптовалюту.

Интересно, что инициатива создания такого программного обеспечения принадлежит исполнительному директору Overstock Патрику Бирну (Patrick Byrne) — бывшему боксёру-любителю, имеющему диплом в области философии. Это уже не первая его идея реформировать Уолл-Стрит. Пока что получается не очень хорошо. Эксперты считают, что причина заключается в инерции большинства крупных инвесторов.



Часы под Windows 95
2014-10-07 17:30 Denis Mirkov

В наши дни только самые дремучие люди используют операционную систему Windows 95 на настольном компьютере, но запустить её на наручных часах — совсем другое дело. Это даже круто.

Именно такой трюк провернул Корбин Дэвенпорт (Corbin Davenport), который смог установить Windows 95 на свои часы Samsung Gear Live через виртуальную машину aDosBox.

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

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

А ведь кто-то говорил, что 640k хватит для всех.



Блоки кода в Objective-C
2014-10-07 18:20 Джон Сноу

Когда на Mac OS Х и iOS появились блоки кода, программисты сказали: «о, круто», но продолжили писать код привычным способом. Может быть, они просто не поняли, насколько это круто?

Что такое «блоки кода»? Блоки кода — это типичные объекты Objective-C. Исторически официально они появились в Mac OS X 10.6 и одновременно в iOS 4, но неофициально были доступны немногим ранее. Это не функции, не методы, это просто несколько операторов, которые объединены, как нам подсказывает Капитан Очевидность, в блок. Блоки кода очень похожи на анонимные функции или лямбда-выражения. Вместе с тем они имеют некоторое сходство с указателями на функции, при этом, когда используешь первые, код получается более элегантным. Они очень удобны при создании анимации или любой другой асинхронной работе. Между тем первоначальное их предназначение — сократить объем необходимого для написания кода, совместив логически связанные куски, например код регистрации оповещения и реализации обрабатывающего метода. Давай посмотрим на несколько программистских трюков, которые покажут все прелести блоков кода.

Как и когда?

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

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

Объявление блока кода

Запусти на своем маке Xcode, создай проект командной строки — Command Line для OS X.

Создаем консольный проект

Создаем консольный проект

Так как мы будем кодить на Objective-C, на следующей странице мастера выбери тип проекта Foundation. Это название повелось от используемой базовой библиотеки.

При объявлении блока кода вместо имени ставится «знак вставки» — ^. Подобно обычным функциям, блоки кода могут получать параметры и возвращать аргумент. К примеру, вот как может выглядеть блок кода, получающий три параметра:

^(double slag1, double slag2, double power) {
  double res = (slag1 + slag2) * power;
  return res;
}

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

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

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

double (^expression) (double, double, double);

Здесь на первом месте указан возвращаемый тип, затем символ «домик» предваряет имя объявляемой переменной, дальше в скобках указаны параметры, принимаемые блоком кода. Обрати внимание, объявление блочной переменной соответствует привязываемому к ней блоку кода по параметрам и аргументам.

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

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

expression = ^double(double slag1, double slag2, double power) {
  double res = (slag1 + slag2) * power;
  return res;
};

Чтобы воспользоваться вычислениями, хранящимися в блочной переменной, достаточно написать:

NSLog(@ "%f",expression(2.0,1.0,2.0));

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

Блоки кода и куча

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

expression = [expression copy];

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

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

Внешние переменные

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

int a = 10;
int b = 5;
int (^abc) ();
abc = ^(int n) {
int c = a + b;
      NSLog(@"%d", c);
      return c;
};
abc();

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

Блоки работают даже в классическом C

Блоки работают даже в классическом C

Функции обратного вызова

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

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

void callbackFunc( void (*func)() ) {
    func();
}

void WeWillCallYou() {
    printf("Classic callback\n");
}

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

Потом мы создаем функцию, которую мы и будем вызывать, — WeWillCallYou. А вот сам вызов будет выглядеть так:

callbackFunc(WeWillCallYou);

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

void WeWillCallYou(int* param) {
    printf("Classic callback %d\n", *param);
}

Теперь вызов этой функции может выглядеть так:

void callbackFunc( void (*func)(int *), int* param) {
    func(param);
}

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

Теперь мы можем вызвать функцию и передать ей значение:

int param = 10;
callbackFunc(WeWillCallYou, &param);

Теперь все выглядит еще страшнее, и ситуация будет ухудшаться, если придется передавать больше параметров. А теперь посмотрим, как та же задача решается с помощью блоков. Первое, что нужно сделать, — описать функцию:

void callbackBlockFunc( void (^func)(void) ) {
    func();
}

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

Все. Больше ничего делать не нужно. Теперь можно использовать наше описание следующим образом:

int variable = 1;

callbackBlockFunc( ^{
  printf("Block %d\n", variable);
});

Я сразу же усложнил пример и добавил переменную, которая должна быть доступна внутри функции. И она доступна, хотя мы ее не передавали, потому что блок кода будет выполняться в том же контексте. Чудо? Именно так!

Многозадачность и блоки кода

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

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

NSOperationQueue *queue = [[NSOperationQueue alloc] init];
for (int i = 0; i < 10; i++ ) {
  [queue addOperationWithBlock:^{
    NSLog(@"test %d\n", i);
   }];
}

NSLog(@"test");
[queue waitUntilAllOperationsAreFinished];

Здесь мы сначала инициализируем объект NSOperationQueue, который как раз умеет создавать отдельные операции. У этого объекта есть метод addOperationWithBlock, принимающий блок кода, который должен выполняться отдельно от основного потока. В этом примере я ограничился созданием только одного блока, но их может быть несколько.

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

В результате выполнения данного кода в консоли может оказаться что-то типа

2013-12-09 18:14:37.191 Test[1068:1a07] test 0
2013-12-09 18:14:37.191 Test[1068:303] test
2013-12-09 18:14:37.191 Test[1068:2d0f] test 2
2013-12-09 18:14:37.191 Test[1068:350b] test 1
2013-12-09 18:14:37.191 Test[1068:1003] test 3
2013-12-09 18:14:37.195 Test[1068:2d0f] test 5
2013-12-09 18:14:37.195 Test[1068:1a07] test 4
2013-12-09 18:14:37.195 Test[1068:350b] test 6
2013-12-09 18:14:37.196 Test[1068:1003] test 7
2013-12-09 18:14:37.196 Test[1068:2d0f] test 8
2013-12-09 18:14:37.196 Test[1068:1a07] test 9

Выполнив код еще раз, в консоли можно будет увидеть, что код выполнялся в другой последовательности, — решения планировщика неисповедимы (хотя и вполне естественны).

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

Итого

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

 



Рука для виртуальной реальности
2014-10-07 18:50 Denis Mirkov

Виртуальная реальность — это не только визуальные образы, но и воздействие на другие органы чувств, в том числе тактильные ощущения. Правда, здесь разработчики пока отстают и не могут представить настолько же реалистичную симуляцию, как в шлеме Oculus Rift.

Dexmo — носимый механический экзоскелет, который пользуется двусторонней связью: он одновременно и передаёт твои движения виртуальному объекту, и обеспечивает тактильные ощущения от прикосновения к объектам в виртуальном мире.

Модель Dexmo Classic обрабатывает 11 степеней свободы движения руки и пальцев. Это три степени свободы для большого пальца и по две степени свободы для всех остальных пальцев. Другими словами, большой палец может двигаться в виртуальном мире совершенно свободно во всех направлениях, а остальные пальцы — только по двум осям (скорее всего, вверх-вниз и вправо-влево). Но для большинства задач этого достаточно.

Dexmo F2 — более продвинутая модель, в которой добавлен фидбек от объектов виртуальной реальности. Для этого пришлось установить на экзоскелет дополнительное оборудование, так что он выглядит тяжелее.




© Copyright Gameland

В избранное