четверг, 30 сентября 2010 г.

Opera / Дмитрий Макарский

Достоинства:

• достаточно удобный интерфейс браузера (http://opera.com/) (рис. 1.4), не перегруженный элементами управления и в то же время оснащенный всем необходимым;

Рис. 1.4. Браузер Opera


• как и в Mozilla Firefox, в Opera блокируются нежелательные всплывающие окна, а также есть поддержка многостраничного режима и строка поиска;

• возможность масштабирования веб-страниц;

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

Недостатки:

• отсутствие встроенной справки – справочная информация загружается с сайта программы;

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

• отсутствие поддержки ActiveX – технологии, позволяющей приложениям взаимодействовать между собой; этот недостаток одновременно является и достоинством, так как использование именно этой технологии в Internet Explorer сделало его достаточно уязвимым для злоумышленников.

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

Кроме вышеперечисленных популярных программ для просмотра веб-страниц есть и другие, менее распространенные:

• Netscape Navigator – основан на коде Mozilla Firefox;

• Maxthon – по сути, программная оболочка для Internet Explorer;

• Safari – основан на коде Konqueror;

• Konqueror – средство управления файлами в операционных системах семейства Linux, выполняющий также роль браузера;

• Galeon – еще один браузер для Linux, характеризующийся простотой и взявший в качестве девиза слова: the web, only the web – веб и только веб;

• Epiphany – проект, в свое время отделившийся от Galeon и поэтому имеющий с ним много общего;

• Kazehakase – японская разработка для Linux;

• Charon – браузер для экзотической операционной системы Inferno;

• Arachne – полноэкранный графический браузер для операционных систем, совместимых с MC-DOS;

• K-Meleon – браузер для операционной системы Windows, пытающийся составлять конкуренцию трем популярным браузерам.


вторник, 21 сентября 2010 г.

Лирическое отступление 2: пойманный звук / Владимир Сергеевич Пташинский

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

Итак, песня:

У нашей Мэри был баран —
Собаки он верней.
Куда бы Мэри ни пошла —
Баран идет за ней!

Детская песенка, исполненная дрожащим резким баритоном, вылетела из жестяного рога странноватого механизма и на секунду повисла в полной тишине. Потом послышались бурные аплодисменты и восторженные крики публики, состоявшей из молодых сотрудников лаборатории. Так в 1877 году в городке Менло-Парк неподалеку от Нью-Йорка прошло испытание первой в истории человечества машины для записи звука. Сотрудники лаборатории ожидали услышать несколько хрипов, зафиксированных на восковом валике острием иглы, а услышали четкие слова и узнаваемый голос своего шефа с той странноватой резкой интонацией, с какой обычно говорят плохо слышащие люди. Родителем изобретения и исполнителем незамысловатой песенки был Томас Алва Эдисон – тот самый, изобретатель мимеографа. Машина называлась фонограф. Это было любимое детище автора множества полезных изобретений, с чьей легкой руки в мир пришли электролампа, эффективные телеграф и телефон и еще десятки полезных и необходимых сегодня вещей. Эдисон мечтал, что и фонограф будет использоваться прежде всего в деловом и научном мире для записи лекций и докладов. В этом гениальный изобретатель ошибся: фонограф, а вернее, его производные – патефон, граммофон, магнитофон и проигрыватель компакт-дисков – превратился в локомотив музыкальной индустрии. В деловом мире его тоже оценили – спустя 100 лет.


Двусторонняя очередь (Deque) / Алексей Суханов

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

template ‹class T, template ‹class U› class Allocator = allocator›

class deque {

public:


 // typedefs:

 typedef iterator;

 typedef const_iterator;

 typedef Allocator‹T›::pointer pointer;

 typedef Allocator‹T›::reference reference;

 typedef Allocator‹T›::const_reference const_reference;

 typedef size_type;

 typedef difference_type;

 typedef Т value_type;

 typedef reverse_iterator;

 typedef const_revcrse_iterator;


 // размещение/удаление:

 deque();

 deque(size_type n, const T& value = T());

 deque(const deque‹T, Allocator›& x);

 template ‹class InputIterator›

 deque(InputIterator first, InputIterator last);

 ~deque();

 deque‹T, Allocator›& operator=(const deque‹T,Allocator›& x);

 void swap(deque‹T, Allocator›& x);


 // средства доступа:

 iterator begin();

 const_iterator begin() const;

 iterator end();

 const_iterator end() const;

 reverse_iterator rbegin();

 const_reverse_iterator rbegin();

 reverse_iterator rend();

 const_reverse_iterator rend();

 size_type size() const;

 size_type max_size() const;

 bool empty() const;

 reference operator[](size_type n);

 const_reference operator[](size_type n) const;

 reference front();

 const_reference front() const;

 reference back();

 const_reference back() const;


 // вставка/стирание:

 void push_front(const T& x);

 void push_back(const T& x);

 iterator insert(iterator position, const T& x = T());

 void insert(iterator position, size_type n, const T& x);

 template

 void insert(iterator position, InputIterator first, InputIterator last);

 void pop_front();

 void pop_back();

 void erase(iterator position);

 void erase(iterator first, iterator last);

};


template ‹class T, class Allocator›

bool operator==(const deque‹T, Allocator›& x, const deque‹T, Allocator›& y);


template ‹class T, class Allocator›

bool operator‹(const deque‹T, Allocator›& x, const deque‹T, Allocator›& y);

iterator - итератор произвольного доступа, ссылающийся на T. Точный тип зависит от исполнения и определяется в Allocator.

const_iterator - постоянный итератор произвольного доступа, ссылающийся на const T. Точный тип зависит от исполнения и определяется в Allocator. Гарантируется, что имеется конструктор для const_iterator из iterator.

size_type - беззнаковый целочисленный тип. Точный тип зависит от исполнения и определяется в Allocator.

difference_type - знаковый целочисленный тип. Точный зависит от исполнения и определяется в Allocator.

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

erase (стирание) в середине двусторонней очереди делает недействительными все итераторы и ссылки двусторонней очереди. erase и pop (извлечение) с обоих концов двусторонней очереди делают недействительными только итераторы и ссылки на стёртый элемент. Число вызовов деструктора равно числу стёртых элементов, а число вызовов оператора присваивания равно минимуму из числа элементов перед стёртыми элементами и числа элементов после стёртых элементов.


Запуск PVM-программ c помощью XPVM / H. M. Ручко

Кроме PVM-консоли, можно использовать графический интерфейс XPVM для X Windows. На рис. 6.2 показано диалоговое окно сеанса работы с XPVM-интерфейсом.

Библиотека PVM не требует, чтобы С++-программа придерживалась какой ибо конкретной структуры. Первая PVM-функци я, вызываема я программой, «поме щ ает» ее в PVM-среду. Дл я каждой программы, которая я вл я ется частью PVM-среды, следует всегда вызывать функцию pvm_exit (). Если этого не сделать, система зависнет.

Практика показывает, что функции pvm_mytid() и pvm_parent () необходи м о вызывать в начале обработки задачи. Наиболее популярные категории функций PVM перечислены в табл. 6.1.

Рис. 6.2. Диалоговое окно графического интерфейса XPVM

Таблица 6.1. Семь категорий фу н кций библио т еки PVM

Категории PVM-функций

Описание

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

Упаковка сообщений и их отправка

Распаковка сообщений и их прием

Обмен задач сигналами Управление буфером сообщений

Функции обработки информации и служебные процедуры

Групповые операции

Используются для управления PVM-процесса м и

Применяются для упаковки сооб щ ений в пересылочном буфере и отправки их от одного PVM-процесса другому

Используются для получения сооб щ ений и распаковки данных из активного буфера

Применяются для си г нализации и уведомления PVM-процессов о возникновении события

Используются для инициализации, очистки и размещения буферов, предназначенных для приема и отправки сообщений, которыми обмениваются PVM-процессы

Применяются для получения информации о PVM-процессах и выполнения дру г их важных задач

Используются для объединения процессов в группы и выполнения других групповых операций