10.1.5. Работа с двоичными файлами
Когда-то давно программисты на языке С включали в строку указания режима символ "b" для открытия файла как двоичного. (Вопреки распространенному заблуждению, это относилось и к ранним версиям UNIX.) Как правило, эту возможность все еще поддерживают ради совместимости, но сегодня с двоичными файлами работать не так сложно, как раньше. Строка в Ruby может содержать двоичные данные, а для чтения двоичного файла не нужно никаких специальных действий.
Исключение составляет семейство операционных систем Windows, в которых различие все еще имеет место. Основное отличие двоичных файлов от текстовых на этой платформе состоит в том, что в двоичном режиме конец строки не преобразуется в один символ перевода строки, а представляется в виде пары «возврат каретки — перевод строки». Еще одно важное отличие — интерпретация символа control-Z как конца файла в текстовом режиме:
# Создать файл (в двоичном режиме).
File.open("myfile","wb") {|f| f.syswrite("12345\0326789\r") }
#Обратите внимание на восьмеричное 032 (^Z).
# Читать как двоичный файл.
str = nil
File.open("myfile","rb") {|f| str = f.sysread(15) )
puts str.size # 11
# Читать как текстовый файл.
str = nil
File.open("myfile","r") {|f| str = f.sysread(15) }
puts str.size # 5
В следующем фрагменте показано, что на платформе Windows символ возврата каретки не преобразуется в двоичном режиме:
# Входной файл содержит всего одну строку: Строка 1.
file = File.open("data")
line = file.readline # "Строка 1.\n"
puts "#{line.size} символов." # 10 символов,
file.close
file = File.open("data","rb")
line = file.readline # "Строка 1.\r\n"
puts "#{line.size} символов." # 11 символов.
file.close
Отметим, что упомянутый в коде метод binmode переключает поток в двоичный режим. После переключения вернуться в текстовый режим невозможно.
file = File.open("data")
file.binmode
line = file.readline # "Строка 1.\r\n"
puts {line.size} символов." # 11 символов.
file.close
При необходимости выполнить низкоуровневый ввод/вывод можете воспользоваться методами sysread и syswrite. Первый принимает в качестве параметра число подлежащих чтению байтов, второй принимает строку и возвращает число записанных байтов. (Если вы начали читать из потока методом sysread, то никакие другие методы использовать не следует. Результаты могут быть непредсказуемы.)
input = File.new("infile")
output = File.new("outfile")
instr = input.sysread(10);
bytes = output.syswrite("Это тест.")
Отметим, что метод sysread возбуждает исключение EOFError при попытке вызвать его, когда достигнут конец файла (но не в том случае, когда конец файла встретился в ходе успешной операции чтения). Оба метода возбуждают исключение SystemCallError при возникновении ошибки ввода/вывода.
При работе с двоичными данными могут оказаться полезны метод pack из класса Array и метод unpack из класса String.
- Программирование на языке Ruby. Идеология языка, теория и практика применения Предисловие Предисловие ко второму изданию
- Предисловие к первому изданию
- Благодарности Благодарности за второе издание
- Благодарности за первое издание
- Об авторе
- Введение
- О втором издании
- Глава 12, «Графические интерфейсы для Ruby», была переработана целиком (в особенности разделы, посвященные gtk и Fox). Раздел по QtRuby — новый от начала до конца.
- Как организована эта книга
- Об исходных текстах, приведенных в книге
- «Путь Ruby»
- Глава 1. Обзор Ruby
- 1.1. Введение в объектно-ориентированное программирование
- 1.1.1. Что такое объект
- 1.1.2. Наследование
- 1.1.3. Полиморфизм
- 1.1.4. Еще немного терминов
- 1.2. Базовый синтаксис и семантика Ruby
- 1.2.1. Ключевые слова и идентификаторы
- 1.2.2. Комментарии и встроенная документация
- 1.2.3. Константы, переменные и типы
- 1.2.4. Операторы и приоритеты
- 1.2.5. Пример программы
- 1.2.6. Циклы и ветвление
- 1.2.7. Исключения
- 1.3. Ооп в Ruby
- 1.3.1. Объекты
- 1.3.2. Встроенные классы
- 1.3.3. Модули и классы-примеси
- 1.3.4. Создание классов
- 1.3.5. Методы и атрибуты
- 1.4. Динамические аспекты Ruby
- 1.4.1. Кодирование во время выполнения
- 1.4.2. Отражение
- 1.4.3. Отсутствующие методы
- 1.4.4 Сборка мусора
- 1.5. Потренируйте свою интуицию: что следует запомнить
- 1.5.1. Синтаксис
- 1.5.2. Перспективы программирования
- 1.5.3. Предложение case в Ruby
- 1.5.4. Рубизмы и идиомы
- 1.5.5. Ориентация на выражения и прочие вопросы
- 1.6. Жаргон Ruby
- 1.7. Заключение
- Глава 2. Строки
- 2.1. Представление обычных строк
- 2.2. Альтернативная нотация для представления строк
- 2.3. Встроенные документы
- 2.4. Получение длины строки
- 2.5. Построчная обработка
- 2.6. Побайтовая обработка
- 2.7. Специализированное сравнение строк
- Листинг 2.1. Специализированное сравнение строк
- 2.8. Разбиение строки на лексемы
- 2.9. Форматирование строк
- 2.10. Строки в качестве объектов ввода/вывода
- 2.11. Управление регистром
- 2.12. Вычленение и замена подстрок
- 2.13. Подстановка в строках
- 2.14. Поиск в строке
- 2.15. Преобразование символов в коды ascii и обратно
- 2.16. Явные и неявные преобразования
- 2.17. Дописывание в конец строки
- 2.18. Удаление хвостовых символов новой строки и прочих
- 2.19. Удаление лишних пропусков
- 2.20. Повтор строк
- 2.21. Включение выражений в строку
- 2.22. Отложенная интерполяция
- 2.23. Разбор данных, разделенных запятыми
- 2.24. Преобразование строки в число (десятичное или иное)
- 2.25. Кодирование и декодирование строк в кодировке rot13
- 2.26. Шифрование строк
- 2.27. Сжатие строк
- 2.28. Подсчет числа символов в строке
- 2.29. Обращение строки
- 2.30. Удаление дубликатов
- 2.31. Удаление заданных символов
- 2.32. Печать специальных символов
- 2.33. Генерирование последовательности строк
- 2.34. Вычисление 32-разрядного crc
- 2.35. Вычисление мd5-свертки строки
- 2.36. Вычисление расстояния Левенштейна между двумя строками
- Листинг 2.2. Расстояние Левенштейна
- 2.37. Base64-кодирование и декодирование
- 2.38. Кодирование и декодирование строк (uuencode/uudecode)
- 2.39. Замена символов табуляции пробелами и сворачивание пробелов в табуляторы
- 2.40. Цитирование текста
- 2.41. Заключение
- Глава 3. Регулярные выражения
- 3.1. Синтаксис регулярных выражений
- 3.2. Компиляция регулярных выражений
- 3.3. Экранирование специальных символов
- 3.4. Якоря
- 3.5. Кванторы
- 3.6. Позитивное и негативное заглядывание вперед
- 3.7. Обратные ссылки
- 3.8. Классы символов
- 3.9. Обобщенные регулярные выражения
- 3.10. Сопоставление точки символу конца строки
- 3.11. Внутренние модификаторы
- 3.12. Внутренние подвыражения
- 3.13. Ruby и Oniguruma
- 3.13.1. Проверка наличия Oniguruma
- 3.13.2. Сборка Oniguruma
- 3.13.3. Некоторые новые возможности Oniguruma
- 3.13.4 Позитивное и негативное оглядывание назад
- 3.13.5. Еще о кванторах
- 3.13.6. Именованные соответствия
- 3.13.7. Рекурсия в регулярных выражениях
- 3.14. Примеры регулярных выражений
- 3.14.1. Сопоставление с ip-адресом
- 3.14.2. Сопоставление с парой «ключ-значение»
- 3.14.3. Сопоставление с числами, записанными римскими цифрами
- 3.14.4 Сопоставление с числовыми константами
- 3.14.5 Сопоставление с датой и временем
- 3.14.6. Обнаружение повторяющихся слов в тексте
- 3.14.7. Поиск слов, целиком набранных прописными буквами
- 3.14.8. Сопоставление с номером версии
- 3.14.9. Еще несколько образцов
- 3.15. Заключение
- Глава 4. Интернационализация в Ruby
- 4.1. Исторические сведения и терминология
- 4.2. Кодировки в пост-ascii мире
- 4.2.2. Возвращаясь к строкам и регулярным выражениям
- 4.2.3. Распознавание кодировки
- 4.2.4. Нормализация Unicode-строк
- 4.2.5. Упорядочение строк
- Листинг 4.1. Упорядочение строк в испанском языке
- 4.2.6. Преобразование из одной кодировки в другую
- Листинг 4.2. Перекодирование Web-страницы в кодировку utf-8
- 4.3. Справочники сообщений
- 4.3.1 Исторические сведения и терминология
- 4.3.2. Приступаем к работе со справочниками сообщений
- 4.3.3. Локализация простого приложения
- Листинг 4.3. Файл myapp.Ро после редактирования
- 4.3.4. Прочие замечания
- 4.4. Заключение
- Глава 5. Численные методы
- 5.1. Представление чисел в языке Ruby
- 5.2. Основные операции над числами
- 5.3. Округление чисел с плавающей точкой
- 5.4. Сравнение чисел с плавающей точкой
- 5.5. Форматирование чисел для вывода
- 5.6. Вставка разделителей при форматировании чисел
- 5.7. Работа с очень большими числами
- 5.8. Использование класса BigDecimal
- 5.9. Работа с рациональными числами
- 5.10. Перемножение матриц
- 5.11. Комплексные числа
- 5.12. Библиотека mathn
- 5.13. Разложение на простые множители, вычисление нод и нок
- 5.14. Простые числа
- 5.15. Явные и неявные преобразования чисел
- 5.16. Приведение числовых значений
- 5.17. Поразрядные операции над числами
- 5.18. Преобразование системы счисления
- 5.19. Извлечение кубических корней, корней четвертой степени и т.Д.
- 5.20. Определение порядка байтов
- 5.21. Численное вычисление определенного интеграла
- 5.22. Тригонометрия в градусах, радианах и градах
- 5.23. Неэлементарная тригонометрия
- 5.24. Вычисление логарифмов по произвольному основанию
- 5.25. Вычисление среднего, медианы и моды набора данных
- 5.26. Дисперсия и стандартное отклонение
- 5.27. Вычисление коэффициента корреляции
- 5.28. Генерирование случайных чисел
- 5.29. Кэширование функций с помощью метода memoize
- 5.30. Заключение
- Глава 6. Символы и диапазоны
- 6.1. Символы
- 6.1.1. Символы как перечисления
- 6.1.2. Символы как метазначения
- 6.1.3. Символы, переменные и методы
- 6.1.4. Преобразование строки в символ и обратно
- 6.2. Диапазоны
- 6.2.1. Открытые и замкнутые диапазоны
- 6.2.2. Нахождение границ диапазона
- 6.2.3. Обход диапазона
- 6.2.4. Проверка принадлежности диапазону
- 6.2.5. Преобразование в массив
- 6.2.6. Обратные диапазоны
- 6.2.7. Оператор переключения
- Листинг 6.1. Класс Transition
- 6.2.8. Нестандартные диапазоны
- Листинг 6.2. Класс для работы с римскими числами
- 6.3. Заключение
- Глава 7. Дата и время
- 7.1. Определение текущего момента времени
- 7.2. Работа с конкретными датами (после точки отсчета)
- 7.3. Определение дня недели
- 7.4. Определение даты Пасхи
- 7.5. Вычисление n-ого дня недели в месяце
- Листинг 7.1. Вычисление n-ого дня недели в месяце
- 7.6. Преобразование из секунд в более крупные единицы
- 7.7. Вычисление промежутка времени, прошедшего от точки отсчета
- 7.8. Високосные секунды
- 7.9. Определение порядкового номера дня в году
- 7.10. Контроль даты и времени
- 7.11. Определение недели в году
- 7.12. Проверка года на високосность
- 7.13. Определение часового пояса
- 7.14. Манипулирование временем без даты
- 7.15 Сравнение моментов времени
- 7.16 Прибавление интервала к моменту времени
- 7.17. Вычисление разности между двумя моментами времени
- 7.18. Работа с конкретными датами (до точки отсчета)
- 7.19. Взаимные преобразования объектов Date, Time и DateTime
- Листинг 7.2. Преобразования между классами, представляющими даты и время
- 7.20. Извлечение даты и времени из строки
- 7.21. Форматирование и печать даты и времени
- 7.22. Преобразование часовых поясов
- 7.23. Определение числа дней в месяце
- 7.24. Разбиение месяца на недели
- 7.25. Заключение
- Глава 8. Массивы, хэши и другие перечисляемые структуры
- 8.1. Массивы
- 8.1.1. Создание и инициализация массива
- 8.1.2. Доступ к элементам массива и присваивание им значений
- 8.1.3. Определение размера массива
- 8.1.4. Сравнение массивов
- 8.1.5. Сортировка массива
- 8.1.6. Выборка из массива по заданному критерию
- 8.1.7. Специализированные функции индексирования
- 8.1.8. Реализация разреженной матрицы
- 8.1.9. Массивы как математические множества
- 8.1.10. Рандомизация массива
- 8.1.11. Многомерные массивы
- 8.1.12. Нахождение элементов, принадлежащих одному массиву и не принадлежащих другому
- 8.1.13. Преобразование или отображение массивов
- 8.1.14. Удаление из массива элементов равных nil
- 8.1.15. Удаление заданных элементов из массива
- 8.1.16. Конкатенирование массивов и добавление в конец массива
- 8.1.17. Использование массива в качестве стека или очереди
- 8.1.18. Обход массива
- 8.1.19. Преобразование массива в строку с разделителями
- 8.1.20. Обращение массива
- 8.1.21. Удаление дубликатов из массива
- 8.1.22. Чередование массивов
- 8.1.23. Вычисление частоты различных значений в массиве
- 8.1.24. Инвертирование массива для получения хэша
- 8.1.25. Синхронная сортировка нескольких массивов
- 8.1.26. Указание значения по умолчанию для новых элементов массива
- 8.2. Хэши
- 8.2.1. Создание нового хэша
- 8.2.2. Указание значения по умолчанию для хэша
- 8.2.3. Доступ к парам ключ-значение и добавление новых пар
- 8.2.4. Удаление пар ключ-значение
- 8.2.5. Обход хэша
- 8.2.6. Инвертирование хэша
- 8.2.7. Поиск ключей и значений в хэше
- 8.2.8. Копирование хэша в массив
- 8.2.9. Выборка пар ключ-значение по заданному критерию
- 8.2.10. Сортировка хэша
- 8.2.11. Объединение двух хэшей
- 8.2.12. Создание хэша из массива
- 8.2.13. Вычисление разности и пересечения хэшей
- 8.2.14. Хэш как разреженная матрица
- 8.2.15. Реализация хэша с повторяющимися ключами
- Листинг 8.1. Хэш с повторяющимися ключами
- 8.3. Перечисляемые структуры в общем
- 8.3.1. Метод inject
- 8.3.2. Кванторы
- 8.3.3. Метод partition
- 8.3.4. Обход с группировкой
- 8.3.5. Преобразование в массив или множество
- 8.3.6. Энумераторы
- 8.3.7. Объекты-генераторы
- 8.4. Заключение
- Глава 9. Более сложные структуры данных
- 9.1. Множества
- 9.1.1. Простые операции над множествами
- 9.1.2. Более сложные операции над множествами
- 9.2. Стеки и очереди
- 9.2.1. Более строгая реализация стека
- 9.2.2. Обнаружение несбалансированных скобок
- 9.2.3. Стек и рекурсия
- 9.2.4. Более строгая реализация очереди
- 9.3. Деревья
- 9.3.1. Реализация двоичного дерева
- Листинг 9.1. Вставка и обход дерева в ширину
- 9.3.2. Сортировка с помощью двоичного дерева
- Листинг 9.2. Сортировка с помощью двоичного дерева
- 9.3.3. Использование двоичного дерева как справочной таблицы
- 9.3.4. Преобразование дерева в строку или массив
- 9.4. Графы
- 9.4.1. Реализация графа в виде матрицы смежности
- Листинг 9.3. Матрица смежности
- 9.4.2. Является ли граф связным?
- Листинг 9.4. Выяснение того, является ли граф связным
- 9.4.3. Есть ли в графе эйлеров цикл?
- 9.4.4. Есть ли в графе эйлеров путь?
- 9.4.5. Инструменты для работы с графами в Ruby
- 9.5. Заключение
- Глава 10. Ввод/вывод и хранение данных
- 10.1. Файлы и каталоги
- 10.1.1. Открытие и закрытие файлов
- 10.1.2. Обновление файла
- 10.1.3. Дописывание в конец файла
- 10.1.4. Прямой доступ к файлу
- 10.1.5. Работа с двоичными файлами
- 10.1.6. Блокировка файлов
- 10.1.7. Простой ввод/вывод
- 10.1.8. Буферизованный и небуферизованный ввод/вывод
- 10.1.9. Манипулирование правами владения и разрешениями на доступ к файлу
- 10.1.10. Получение и установка временных штампов
- 10.1.11. Проверка существования и получение размера файла
- 10.1.12. Опрос специальных свойств файла
- 10.1.13. Каналы
- 10.1.14. Специальные операции ввода/вывода
- 10.1.15. Неблокирующий ввод/вывод
- 10.1.16. Применение метода readpartial
- 10.1.17. Манипулирование путевыми именами
- 10.1.18. Класс Pathname
- 10.1.19. Манипулирование файлами на уровне команд
- 10.1.20. Ввод символов с клавиатуры
- 10.1.21. Чтение всего файла в память
- 10.1.22. Построчное чтение из файла
- 10.1.23. Побайтное чтение из файла
- 10.1.24. Работа со строкой как с файлом
- 10.1.25. Чтение данных, встроенных в текст программы
- 10.1.26. Чтение исходного текста программы
- 10.1.27. Работа с временными файлами
- 10.1.28. Получение и изменение текущего каталога
- 10.2. Доступ к данным более высокого уровня
- 10.2.1. Простой маршалинг
- 10.2.2. Более сложный маршалинг
- 10.2.3. Ограниченное «глубокое копирование» в ходе маршалинга
- 10.2.4. Обеспечение устойчивости объектов с помощью библиотеки pStore
- 10.2.5. Работа с данными в формате csv
- 10.2.6. Маршалинг в формате yaml
- 10.2.7. Преобладающие объекты и библиотека Madeleine
- 10.2.8. Библиотека dbm
- 10.3. Библиотека KirbyBase
- 10.4. Подключение к внешним базам данных
- 10.4.1. Интерфейс с sqLite
- 10.4.2. Интерфейс с MySql
- 10.4.3. Интерфейс с PostgreSql
- 10.4.4. Интерфейс с ldap
- 10.4.5. Интерфейс с Oracle
- 10.4.6. Обертка вокруг dbi
- 10.4.7. Объектно-реляционные отображения (orm)
- 10.5. Заключение
- Глава 11. Ооп и динамические механизмы в Ruby
- 11.1. Рутинные объектно-ориентированные задачи
- 11.1.1. Применение нескольких конструкторов
- Листинг 11.1. Несколько конструкторов
- 11.1.2. Создание атрибутов экземпляра
- 11.1.3. Более сложные конструкторы
- Листинг 11.2. «Хитрый» конструктор
- 11.1.4. Создание атрибутов и методов уровня класса
- Листинг 11.3. Переменные и методы класса
- Листинг 11.4. Данные класса и экземпляра
- 11.1.5. Наследование суперклассу
- 11.1.6. Опрос класса объекта
- 11.1.7. Проверка объектов на равенство
- 11.1.8. Управление доступом к методам
- Листинг 11.5. Закрытые методы
- 11.1.9. Копирование объектов
- 11.1.10. Метод initialize_copy
- 11.1.11. Метод allocate
- 11.1.12. Модули
- Листинг 11.6. Включение модуля с переопределенным методом append_features
- Листинг 11.7. Методы экземпляра модуля становятся методами класса
- 11.1.13. Трансформация или преобразование объектов
- 11.1.14. Классы, содержащие только данные (Struct)
- 11.1.15. Замораживание объектов
- Листинг 11.8. Замораживание объекта
- 11.2. Более сложные механизмы
- 11.2.1. Отправка объекту явного сообщения
- Листинг 11.9. Сортировка по любому ключу
- 11.2.2. Специализация отдельного объекта
- Листинг 11.10. Метод уровня класса accessor_string
- Листинг 11.11. Использование метода extend
- 11.2.3. Вложенные классы и модули
- 11.2.4. Создание параметрических классов
- Листинг 11.12. Параметрические классы: неправильное решение
- Листинг 11.13. Параметрические классы: улучшенное решение
- Листинг 11.14. Параметрические классы: самое лучшее решение
- 11.2.5. Использование продолжений для реализации генератора
- Листинг 11.15. Генератор чисел Фибоначчи
- 11.2.6. Хранение кода в виде объекта
- 11.2.7. Как работает включение модулей?
- 11.2.8. Опознание параметров, заданных по умолчанию
- 11.2.9. Делегирование или перенаправление
- 11.2.10. Автоматическое определение методов чтения и установки на уровне класса
- 11.2.11. Поддержка различных стилей программирования
- 11.3. Динамические механизмы
- 11.3.1. Динамическая интерпретация кода
- 11.3.2. Метод const_get
- 11.3.3. Динамическое создание экземпляра класса, заданного своим именем
- 11.3.4. Получение и установка переменных экземпляра
- 11.3.5. Метод define_method
- 11.3.6. Метод const_missing
- 11.3.7. Удаление определений
- Листинг 11.16. Методы remove_method и undef_method
- 11.3.8. Получение списка определенных сущностей
- Листинг 11.17. Отражение и переменные экземпляра
- 11.3.9. Просмотр стека вызовов
- 11.3.10. Мониторинг выполнения программы
- 11.3.11. Обход пространства объектов
- 11.3.12. Обработка вызовов несуществующих методов
- 11.3.13. Отслеживание изменений в определении класса или объекта
- Листинг 11.18. Трассирующий модуль
- 11.3.14. Определение чистильщиков для объектов
- 11.4. Заключение
- Глава 12. Графические интерфейсы для Ruby
- 12.1. Ruby/Tk
- 12.1.1. Обзор
- 12.1.2. Простое оконное приложение
- 12.1.3. Кнопки
- Листинг 12.1. Имитация термостата
- 12.1.4. Текстовые поля
- Листинг 12.2. Имитация telnet-клиента
- 12.1.5. Прочие виджеты
- Листинг 12.3. Флажки в Tk
- Листинг 12.4. Переключатели в Tk
- 12.1.6. Дополнительные замечания
- 12.2. Ruby/gtk2
- 12.2.1. Обзор
- 12.2.2. Простое оконное приложение
- 12.2.3. Кнопки
- Листинг 12.5. Кнопки в gtk
- 12.2.4. Текстовые поля
- Листинг 12.6. Текстовый редактор в gtk
- 12.2.5. Прочие виджеты
- Листинг 12.7. Заказ билета на самолет
- Листинг 12.8. Пример меню в gtk
- 12.2.6. Дополнительные замечания
- 12.3. FxRuby (fox)
- 12.3.1. Обзор
- 12.3.2. Простое оконное приложение
- 12.3.3. Кнопки
- Листинг 12.9. Обновление состояния интерфейса в fox
- 12.3.4. Текстовые поля
- 12.3.5. Прочие виджеты
- Листинг 12.10. Переключатели в fox
- Листинг 12.11. Переключатели в fox и получатели данных
- Листинг 12.12. Виджет fxList
- Листинг 12.13. Модальные и немодальные диалоги
- 12.3.6. Дополнительные замечания
- 12.4. QtRuby
- 12.4.1. Обзор
- 12.4.2. Простое оконное приложение
- 12.4.3. Кнопки
- Листинг 12.14. Кнопки в QtRuby
- 12.4.4. Текстовые поля
- Листинг 12.15. Простой редактор в Qt
- 12.4.5. Прочие виджеты
- Листинг 12.16. Прочие виджеты в Qt
- Листинг 12.17. Нестандартный виджет TimerClock
- 12.4.6. Дополнительные замечания
- 12.5. Другие библиотеки для создания графических интерфейсов
- 12.5.1. Ruby и X
- 12.5.2. Ruby и wxWidgets
- 12.5.3. Apollo (Ruby и Delphi)
- 12.5.4. Ruby и Windows api
- 12.6. Заключение
- Глава 13. Потоки в Ruby
- 13.1. Создание потоков и манипулирование ими
- 13.1.1. Создание потоков
- 13.1.2. Доступ к локальным переменным потока
- 13.1.3. Опрос и изменение состояния потока
- 13.1.4. Назначение рандеву (и получение возвращенного значения)
- 13.1.5. Обработка исключений
- 13.1.6. Группы потоков
- 13.2. Синхронизация потоков
- 13.2.1. Синхронизация с помощью критических секций
- 13.2.2. Синхронизация доступа к ресурсам (mutex.Rb)
- Листинг 13.1. Программа индексирования с ошибками (гонка)
- Листинг 13.2. Программа индексирования с мьютексом
- 13.2.3. Предопределенные классы синхронизированных очередей
- Листинг 13.3. Задача о производителе и потребителе
- 13.2.4. Условные переменные
- Листинг 13.4. Три скрипача
- 13.2.5. Другие способы синхронизации
- Листинг 13.5. Реализация класса Queue с помощью монитора
- 13.2.6. Тайм-аут при выполнении операций
- Листинг 13.6. Пример тайм-аута
- 13.2.7. Ожидание события
- 13.2.8. Продолжение обработки во время ввода/вывода
- 13.2.9. Реализация параллельных итераторов
- Листинг 13.7. Параллельные итераторы
- 13.2.10. Параллельное рекурсивное удаление
- 13.3. Заключение
- Глава 14. Сценарии и системное администрирование
- 14.1. Запуск внешних программ
- 14.1.1. Методы system и exec
- 14.1.2. Перехват вывода программы
- 14.1.3. Манипулирование процессами
- 14.1.4. Стандартный ввод и вывод
- 14.2. Флаги и аргументы в командной строке
- 14.2.1. Разбор флагов в командной строке
- Листинг 14.1. Получение флагов из командной строки
- 14.2.2. Константа argf
- 14.2.3. Константа argv
- 14.3. Библиотека Shell
- 14.3.1. Использование библиотеки Shell для перенаправления ввода/вывода
- 14.3.2. Дополнительные замечания по поводу библиотеки shell.Rb
- 14.4. Переменные окружения
- 14.4.1. Чтение и установка переменных окружения
- 14.4.2. Хранение переменных окружения в виде массива или хэша
- 14.4.3. Импорт переменных окружения как глобальных переменных
- 14.5. Сценарии на платформе Microsoft Windows
- 14.5.1. Расширение Win32api
- 14.5.2. Расширение Win32ole
- Листинг 14.2. Открытие диалога для ввода текста в браузере
- Листинг 14.3. Для вывода в окно браузера требуется win32ole
- 14.5.3. Использование ActiveScriptRuby
- Листинг 14.4. Код на Ruby, встроенный в html-страницу
- 14.6. Моментальный инсталлятор для Windows
- 14.7. Библиотеки, о которых полезно знать
- 14.8. Работа с файлами, каталогами и деревьями
- 14.8.1. Несколько слов о текстовых фильтрах
- 14.8.2. Копирование дерева каталогов (с символическими ссылками)
- Листинг 14.5. Копирование дерева каталогов
- 14.8.3. Удаление файлов по времени модификации и другим критериям
- 14.8.4. Вычисление свободного места на диске
- 14.9. Различные сценарии
- 14.9.1. Ruby в виде одного файла
- 14.9.2. Подача входных данных Ruby по конвейеру
- Листинг 14.6. Bash-сценарий, вызывающий Ruby
- 14.9.3. Получение и установка кодов завершения
- 14.9.4. Работает ли Ruby в интерактивном режиме?
- 14.9.5. Определение текущей платформы или операционной системы
- 14.9.6. Модуль Etc
- 14.10. Заключение
- Глава 15. Ruby и форматы данных
- 15.1. Разбор xml и rexml
- Листинг 15.1. Файл books.Xml
- 15.1.1. Древовидное представление
- Листинг 15.2. Разбор документа с применением dom
- 15.1.2. Потоковый разбор
- Листинг 15.3. Sax-разбор
- Листинг 15.4. Результат работы программы потокового разбора
- 15.1.3. XPath и другие интерфейсы
- 15.2. Rss и Atom
- 15.2.1. Стандартная библиотека rss
- Листинг 15.5. Создание rss-канала
- 15.2.2. Библиотека feedtools
- 15.3. Обработка изображений при помощи rMagick
- 15.3.1. Типичные графические задачи
- Листинг 15.6. Получение информации об изображении
- Листинг 15.7. Четыре способа масштабирования изображения
- 15.3.2. Специальные эффекты и трансформации
- Листинг 15.8. Двенадцать специальных эффектов и трансформаций
- 15.3.3. Api рисования
- Листинг 15.9. Простая программа рисования
- 15.4. Создание документов в формате pdf с помощью библиотеки pdf::Writer
- 15.4.1. Основные концепции и приемы
- Листинг 15.10. Метод quadrant
- 15.4.2. Пример документа
- Листинг 15.11. Создание демонстрационного документа
- 15.5. Заключение
- Глава 16. Тестирование и отладка
- 16.1. Библиотека Test::Unit
- Листинг 16.1. Подготовка и разрушение среды исполнения
- 16.2. Комплект инструментов ZenTest
- Листинг 16.2. Класс, подлежащий тестированию
- Листинг 16.3. Результат работы ZenTest
- 16.3. Работа с отладчиком Ruby
- Листинг 16.4. Простая программа для демонстрации работы отладчика
- Листинг 16.5. Сеанс отладки простой программы
- 16.4. Использование irb в качестве отладчика
- 16.5. Измерение покрытия кода
- 16.6. Измерение производительности
- Листинг 16.6. Поиск анаграмм в словаре
- 16.7. Объекты печати
- 16.8. Заключение
- Глава 17. Создание пакетов и распространение программ
- 17.1. Программа rDoc
- Листинг 17.1. Простой исходный файл
- 17.1.1. Простая разметка
- Листинг 17.2. Пример разметки для rDoc
- 17.1.2. Более сложное форматирование
- 17.2. Установка и подготовка пакета
- 17.2.1. Библиотека setup.Rb
- 17.2.2. Система RubyGems
- 17.3. RubyForge и raa
- 17.4. Заключение
- Глава 18. Сетевое программирование
- 18.1. Сетевые серверы
- 18.1.1. Простой сервер: время дня
- 18.1.2. Реализация многопоточного сервера
- 18.1.3. Пример: сервер для игры в шахматы по сети
- Листинг 18.1. Шахматный сервер
- Листинг 18.2. Шахматный клиент
- Листинг 18.3. Протокол сеанса шахматной игры
- 18.2. Сетевые клиенты
- 18.2.1. Получение истинно случайных чисел из Web
- Листинг 18.4. Случайное бросание костей
- Листинг 18.5. Генератор случайных чисел с буферизацией
- 18.2.2. Запрос к официальному серверу времени
- 18.2.3. Взаимодействие с рор-сервером
- 18.2.4. Отправка почты по протоколу smtp
- 18.2.5. Взаимодействие с imap-сервером
- 18.2.6. Кодирование и декодирование вложений
- 18.2.7. Пример: шлюз между почтой и конференциями
- Листинг 18.6. Перенаправление почты в конференцию
- Листинг 18.7. Перенаправление конференции в почту
- 18.2.8. Получение Web-страницы с известным url
- 18.2.9. Библиотека Open-uri
- 18.3. Заключение
- Глава 19. Ruby и Web-приложения
- 19.1. Программирование cgi на Ruby
- 19.1.1. Введение в библиотеку cgi.Rb
- 19.1.2. Вывод и обработка форм
- 19.1.3. Куки
- 19.1.4. Сеансы пользователей
- 19.2. FastCgi
- Листинг 19.1. Пример FastCgi
- 19.3. Ruby on Rails
- 19.3.1. Принципы и техника
- 19.3.2. Тестирование и отладка приложений Rails
- 19.3.3. Базовые расширения
- 19.3.4. Дополнительные инструменты и библиотеки
- 19.4. Разработка Web-приложений с помощью Nitro
- 19.4.1. Создание простого приложения Nitro
- 19.4.2. Nitro и паттерн mvc
- 19.4.3. Nitro и Og
- 19.4.4. Решение типичных для Web-приложений задач в Nitro
- 19.4.5. Прочие детали
- 19.5. Введение в Wee
- 19.5.1. Простой пример
- 19.5.2. Ассоциирование состояния с url
- 19.6. Разработка Web-приложений с помощью iowa
- 19.6.1. Основные идеи iowa
- 19.6.2. Шаблоны в iowa
- 19.6.3. Передача управления компоненту
- 19.7. Ruby и Web-сервер
- 19.7.1. Модуль mod_ruby
- 19.7.2. Использование erb
- 19.7.3. Сервер weBrick
- 19.7.4. Сервер Mongrel
- 19.8. Заключение
- Глава 20. Распределенный Ruby
- 20.1. Обзор: библиотека drb
- 20.2. Пример: эмуляция биржевой ленты
- Листинг 20.1. Модуль DrbObservable
- Листинг 20.2. Канал биржевых котировок (drb-сервер)
- Листинг 20.3. Наблюдатель биржевых котировок (drb-клиент)
- 20.3. Rinda: пространство кортежей в Ruby
- Листинг 20.4. Уведомление в системе Rinda
- Листинг 20.5. Задача о производителе и потребителе
- 20.4. Обнаружение сервисов в распределенном Ruby
- 20.5. Заключение
- Глава 21. Инструменты разработки для Ruby
- 21.1. Система RubyGems
- 21.2. Программа Rake
- 21.3. Оболочка irb
- 21.4. Утилита ri
- 21.5. Поддержка со стороны редакторов
- 21.6. Интегрированные среды разработки
- 21.7. Заключение
- Глава 22. Сообщество пользователей Ruby
- 22.1. Ресурсы в Web
- 22.2. Новостные группы и списки рассылки
- 22.3. Блоги и онлайновые журналы
- 22.4. Запросы на изменение Ruby
- 22.5. Каналы irc
- 22.6. Конференции по Ruby
- 22.7. Локальные группы пользователей Ruby
- 22.8. Заключение