Лабораторные работы (Объектно-ориентированное программирование (ООП)) / lab8
Лабораторная работа №8: Модифицированный веб-сканер
Сканер в прошлой лабораторной работе был не особенно эффективным. В
данной лабораторной работе вы расширите сканер для использования поточной обработки Java так, чтобы несколько веб-страниц можно было сканировать параллельно. Это приведет к значительному повышению производительности,
так как время, которое каждый поток сканера тратит на ожидание завершения сетевых операций, может прерываться другими операциями обработки в других потоках.
Подробное введения в многопоточное программирование на Java вы можете прочитать в данном учебном руководстве. Самое главное прочитать этот подраздел.
Расширение веб-сканера
В данной лабораторной работе вы расширите и измените разработанную ранее программу:
1. Реализуйте класс с именем URLPool, который будет хранить список всех URL-адресов для поиска, а также относительный “уровень” каждого из этих URL-адресов (также известный как “глубина поиска”). Первый URL-адрес,
который нужно будет найти, будет иметь глубину поиска равную 0, URL-
адреса, найденные на этой странице, будут иметь глубину поиска равную 1 и
т.д. Необходимо сохранить URL-адреса и их глубину поиска вместе, как экземпляры класса с именем URLDepthPair, как это было сделано в прошлой лабораторной работе. LinkedList рекомендуется использовать для хранения элементов, так как это поможет эффективно выполнить необходимые операции.
У пользователя класса URLPool должен быть способ получения пары
URL-глубина из пула и удаления этой пары из списка одновременно. Должен также быть способ добавления пары URL-глубина к пулу. Обе эти операции должны быть поточно-ориентированы, так как несколько потоков будут взаимодействовать с URLPool одновременно.
У пула URL не должно быть максимального размера. Для этого нужен список необработанных URL-адресов, список уже отсканированных URL-
адресов и еще одно поле, о котором будет написано ниже.
2. Чтобы выполнить веб-сканирование в нескольких потоках, необходимо создать класс CrawlerTask, который реализует интерфейс Runnable. Каждый экземпляр CrawlerTask должна иметь ссылку на один экземпляр класса
URLPool, который был описан выше. (Обратите внимание на то, что все экземпляры класса CrawlerTask используют единственный пул!) Принцип работы веб-сканера заключается в следующем:
1). Получение пары URL-Depth из пула, ожидая в случае, если пара не будет сразу доступна.
2). Получение веб-страницы по URL-адресу.
3). Поиск на странице других URL-адресов. Для каждого найденного
URL-адреса, необходимо добавить новую пару URL-Depth к пулу URL-адресов.
Новая пара должна иметь глубину на единицу больше, чем глубина текущего
URL-адреса, по которому происходит сканирование. 4). Переход к шагу 1.
Данный цикл должен продолжаться до тех пор, пока в пуле не останется пар URL-Depth.
3. Так как веб-сканер будет порождать некоторое количество потоков,
измените программу так, чтобы она принимала третий параметр через командную строку, который будет определять количество порождаемых потоков веб-сканера. Функция main должна выполнять следующие задачи:
1). Обработать аргументы командной строки. Сообщить пользователю о любых ошибках ввода.
2). Создать экземпляр пула URL-адресов и поместить указанный пользователем URL-адрес в пул с глубиной 0.
3). Создать указанное пользователем количество задач (и потоков для их выполнения) для веб-сканера. Каждой задаче поискового робота нужно дать ссылку на созданный пул URL-адресов.
4). Ожидать завершения веб-сканирования.
5) Вывести получившийся список URL-адресов, которые были найдены. 4.Синхронизируйте объект пула URL-адресов во всех критических
точках, так как теперь код должен быть ориентирован на многопоточность.
5. Веб-сканер не должен постоянно опрашивать пул URL-адресов в случае, если он пуст. Вместо этого пусть они ожидают в случае, когда нет доступных URL-адресов. Реализуйте это, используя метод wait() внутри «get URL» в случае, если ни один URL-адрес в настоящее время недоступен. Соответственно, метод “add URL” пула URL-адресов должен использовать функцию notify() в случае, когда новый URL-адрес добавлен к пулу.
Обратите внимание на то, что потоки веб-сканера не сами будут выполнять какие-либо из этих операций синхронизации/ожидания/уведомления. По той же причине, что и пул URL-
адресов скрывает детали того, как URL-адреса хранятся и извлекаются: инкапсуляция! Точно так же, как и в вашей реализации пользователи пула
URL-адресов не должны знать о деталях реализации, также они не должны знать о деталях организации потоков.
Советы по проектированию
Вот некоторые советы для успешного выполнения лабораторной работы
№8:
Вы можете использовать часть кода из лабораторной работы №7 с небольшим изменением. Класс URLDepthPair изменять не нужно. Основные отличия в том, что код загрузки URL-адреса и сканирование страницы находится теперь в классе, который реализует Runnable и код будет получать и добавлять URL-адреса в экземпляре URLPool.
Вы должны синхронизировать доступ к внутренним полям
URLPool, поскольку к ним будут обращаться сразу несколько потоков. Самый простой подход заключается в использовании методов синхронизации. Не нужно синхронизировать конструктор URLPool! Подумайте о том, какие методы должны быть синхронизированы.
Напишите методы URLPool для использования методов wait() и
notify() так, чтобы потоки сканера могли ожидать появления новых URL-
адресов.
Пусть URLPool определяет, какие URL-адреса попадают в список необработанных URL-адресов, исходя из глубины каждого URL-адреса,
добавляемого в пул. Если глубина URL-адреса меньше максимальной, добавьте пару в очередь ожидания. Иначе добавьте URL-адрес в список обработанных,
не сканируя страницу.
Самая сложная часть данной лабораторной работы заключается в поиске момента для выхода из программы, когда больше нет URL-адресов для сканирования. В таком случае все потоки будут в режиме ожидания нового
URL-адреса в URLPool. Для этого рекомендуется, чтобы URLPool отслеживал,
сколько потоков ожидает новый URL-адрес. Поэтому необходимо добавить поле типа int, которое будет увеличиваться непосредственно перед вызовом wait() и уменьшаться сразу после выхода из режима ожидания. Создав счетчик,
нужно реализовать метод, который возвращает количество ожидающих потоков. Отслеживать количество потоков вы можете в функции main() и в случае, если общее количество потоков равно количеству потоков, которое вернул соответствующий метод, необходимо вызвать System.exit() для завершения работы. Проверку можно выполнять по таймеру (с интервалом 1
сек), что приведет к более эффективной работе программы.
Дополнительное задание
Обновите пару URL-Depth для использования класса java.net.URL и
произведите соответствующие изменения в веб-сканере для того, чтобы он соответствовал и относительным URL-адресам, и абсолютным.
Выход из программы с использованием вызова System.exit() –
грубая операция. Найдите способ более корректного выхода из программы.
Реализуйте список URL-адресов, которые были просмотрены, и
избегайте возврата к ним. Используйте один из классов коллекций java. Какой-
то набор, который поддерживает постоянное время поиска и вставку, будет наиболее подходящим.
Добавьте другой дополнительный параметр командной строки для того, чтобы определить, сколько времени поток веб-сканера должен ждать сервера для возврата требуемой веб-страницы.
Достоинства сканеров серии Scan600/650i
В этом разделе:
- Достоинства сканеров Scan650i
- Почему Заказчики выбирают Scan650i?
Автоматическое распознавание ширины оригинала “на лету”
Эта функция весьма важна для повышения производительности сканирования. Дело в том, что сканер сам определяет ширину документа с высокой точностью и при этом ему не требуется протягивать оригинал “туда и обратно”. Кроме того, даже в случае, если передняя кромка оригинала повреждена, это не помешает сканеру корректно распознать его ширину и считать данные по максимальной ширине документа.
Динамическая сшивка
В сканерах Scan 650i применена технология динамической сшивки, которая позволяет получать отличные результаты сканирования в местах сшивки датчиков, даже если оригинал волнистый, очень тонкий или был предварительно сфальцован.
Двойной источник подсветки
Сканер использует технологию сканирования контактными датчиками, модифицированную по отношению к традиционной CIS технологии. Дело в том, что оригинал подсвечивается двумя LED-источниками света.Благодаря использованию двойного источника подсветки существенно повышается качество сканирования оригиналов со складками в зоне тени от изгибов.
Динамическое улучшение качества сложных оригиналов
Технологии постобработки позволяют в процессе сканирования улучшитькачество изображения при помощи подавления фона и прорисовки тонких линий. В результате на выходе получается изображение отличного качества готовое к помещению в электронный архив. Кроме того, в сканере используется технология сканирования очень сложных прозрачных и отсвечивающих оригиналов, плохо видимых даже глазом.
Система улучшения документа
При необходимости внести изменения в отсканированный документ можно воспользоваться программными возможностями Системы Улучшения документа. При этом не требуется сканировать оригинал заново. Риск повреждения оригиналов снижается, также как и время до получения финального скана.
Удобство использования и эргономичность
Программирование часто используемых режимов сканирования (копирования) на кнопки 1 .. 6 панели управления сканера. Запуск сканирования (копирования) нажатием кнопки Старт на панели сканера
Простая, доступная пользователю замена стекла экспонирования
Сканер Scan 650i-44” привлекателен для Заказчиков по следующим причинам:
- Сканирует с высоким качеством цветопередачи
- Позволяет добиваться очень высокой производительности сканирования
- Одинаково хорошо сканирует широкий круг материалов от тонкой кальки до толстых планшетов
- Оснащен высокоинтеллектуальным программным обеспечением
- Очень удобен в эксплуатации
Почему сканер обеспечивает высокую производительность?
- После включения не требуется ждать пока сканер выйдет в готовность.
- Аппаратное и программное обеспечение поддерживает скорость сканирования в цвете – 9,75 м/мин (400 dpi Turbo). Эту скорость можно увеличить до рекордных на рынке 15 м/мин и даже 20,5 м/мин путем введения кода лицензии (для моделей Scan 650i-60/ Scan 650i-80).
- Сканер аппаратно оснащается интерфейсом USB3, который поддерживает скорость передачи данных до 5 Гб/с.
- Функция автоматического определения распознает ширину оригинала “на лету”, не протягивая документ “туда и обратно”. Время на это не тратится.
- Сканер передает на ПК полные данные, поэтому при необходимости скорректировать цветовые параметры изображения (контраст, яркость, гамму и др.) не требуется повторно сканировать документ. Новые настройки будут применены к ранее считанным данным. Повторное сканирование – это трата времени и риск повредить оригинал.
- При сканировании ветхих оригиналов и кальки не требуется помещать документы в пакет, сканер может протягивать такие документы напрямую.
Укладка документов в пакет очень существенно снижает производительность сканирования.
Что удобно пользователю?
- Сканер автоматически определяет ширину и длину документа, даже если этот документ нестандартного размера. Не требуется задавать размеры вручную или потом обрезать белые поля в программе редактирования.
- Документ не обязательно точно позиционировать на столе подачи: можно подавать с точностью +/- 5 см – сканер в любом случае правильно определит размеры документа.
- Замену стекла экспонирования можно произвести самостоятельно даже без использования отвертки и других инструментов.
- Можно подобрать опции удобные для работы – подставка, репростенд, держатель монитора и ПК.
- Полная калибровка сканера производится за один проход. Подается универсальный калибровочный лист и при его сканировании корректируется цветопередача, сшивка датчиков и прочие параметры.
- Режим сканирования или копирования можно выбрать с панели сканера, а процесс сканирования запустить кнопкой “Старт”, не нажимая кнопок в компьютере.
- При сканировании ветхих, тонких и сфальцованных документов не нужно помещать оригиналы в пакет, поскольку сканер может протягивать их без заминов и повреждений и при этом получать качественное изображение (без разрывов линий в местах сшивки датчиков).
для сканирования больших документов
Обычный потребительский сканер хорошо подходит для сканирования обычных печатных или рукописных документов, обычно любых документов размером до Letter или A4. Для чего-то большего размера, скажем, формата Legal или Tabloid, можно попытаться отсканировать документ сегментами, но губа сканера, которая отлично подходит для выравнивания небольших документов, становится серьезной помехой, и обычно прибегают к сканированию документа с помощью копировальный аппарат, если есть к нему доступ. Это нормально, пока у вас не будет документа, который слишком велик для копировальной машины, например. то, что я хотел отсканировать — старые карты. Они слишком велики, чтобы поместиться в сканер или копировальный аппарат, даже если вы попытаетесь вместить их по частям; кроме того, не стоит этого пробовать, так как они старые и незаменимые. Их можно сфотографировать, но нужна сканирующая задняя камера, чтобы получить хоть какое-то сопоставимое разрешение, а это очень дорого. Вот тут-то и появляется эта модификация — модификация недорогого стандартного потребительского сканера для сканирования произвольно больших документов в сегментах, которые затем собираются с помощью программного обеспечения.
Начнем со сканера Canon LiDE 90, хотя подойдет любой сканер серии Canon LiDE, поскольку все они похожи.
Во-первых, нам нужно снять крышку, что можно сделать без особых усилий, нажав на центр куска пластика, соединяющего крышку с шарниром на сканере. Затем необходимо удалить край вокруг стекла сканера. Он крепится с помощью небольших пластиковых язычков, а также клея рядом с кнопками управления. Так как нам это больше не понадобится, проще всего просто оторвать это. Сняв крышку и лицевую панель, обратите внимание, где пластик все еще выступает над стеклом сканера; затем осторожно снимите стекло сканера и положите его в безопасное место. Затем, используя любые режущие инструменты, которые кажутся подходящими, отрежьте остальную часть пластика, выступающего над стеклом, стараясь не порезаться и не отрезать пластик, на котором держится стекло сканера. Для этого я использовал небольшой отрезной круг и лезвие бритвы. Теперь замените стекло сканера, убедившись, что на нем нет грязи и отпечатков пальцев. При разборке надо было заметить, что тыльная сторона ободка, приклеенная к стеклу, была белой; это для калибровки, и его необходимо заменить, отрезав полоску фотобумаги того же размера. Поместите полоску фотобумаги над исходным положением сканирующего элемента размером для печати вниз. Наконец, прикрепите эту полоску и оба конца стекла к сканеру с помощью полосок упаковочной ленты.
Остался один со сканером, который может лежать на столе стеклом вниз.
Для сканирования больших документов с помощью модифицированного сканера положите документ лицевой стороной вверх на ровную поверхность. Затем поместите сканер стеклом вниз поверх документа и сканируйте его сегментами, обеспечивая достаточное перекрытие между сканами.
Наконец, сшейте отсканированные сегменты вместе. Рекомендуемые методы включают в себя следование руководству с использованием Hugin или использование сценария, который я написал, чтобы попытаться автоматизировать процесс.
Вот результат процесса — карта района Хомвуд в Балтиморе 1915 года. Карта была отсканирована в виде 20 сегментов с разрешением 600 dpi, в результате чего окончательное разрешение изображения составило чуть менее 500 мегапикселей.
Спасибо Полу Эспиносе из библиотеки Джорджа Пибоди за предоставленную мне возможность отсканировать карту из их коллекции.
Эта запись была размещена в рубрике Взлом и помечена как большие документы, карты, сканирование больших документов, сканирование карт, сканер, модификация сканера. Добавьте постоянную ссылку в закладки.
блог кролика
В хорошо сделанной электронике заключена глубокая красота.
Каким-то образом законы физики совпали с эволюцией человеческого сознания, так что звуковые инженерные решения стали еще и эстетически привлекательными: от идеальной кромки припоя до аккуратного геометрического расположения компонентов на печатной плате и вздымающихся облаков стандартных ячеек эстетика, заложенная новейшими инструментами IC для размещения и маршрутизации, вдохновляет и исходит из создания практичной электроники для повседневного использования.
Последняя книга Эрика Шлепфера (@TubeTimeUS) и Винделла Оская (соучредителя Evil Mad Scientist) « Open Circuits » — это торжество электронной эстетики, в котором буквально открываются схемы с механическими поперечными сечениями, сопровождаемые содержательные пояснения и иллюстрации. Их мастерски выполненный процесс поперечного сечения и дотошная фотография стирают грань между инженерией и искусством, напоминая нам, что любая инженерная задача, выполненная с душой и заботой, приводит к чему-то, что может вызвать чувства благоговения («вау!») и размышления («ха. »):
Страницы Open Circuits содержат достаточно вдохновения как для новичков, так и для опытных ветеранов. Занимаясь электроникой уже четыре десятилетия, я иногда беспокоюсь, что становлюсь оцепенелым и циничным, наблюдая, как мировые свалки переполнены дешевой электроникой, изготовленной без заботы и приобретаемой (и утилизируемой) с еще меньшим раздумьем. Однако, когда я листаю страницы Open Circuits , ко мне возвращается то волнение, то благоговение, которое я испытывал в юности, когда водил пальцами по контурам резисторов и конденсаторов моего первого компьютера. Шлепфер и Оскай воспроизводят даже самые обыденные артефакты, такие как керамический дисковый конденсатор, с великолепной детализацией — и способами, которые я никогда раньше не видел. До сих пор у меня не было интуитивного представления о размерах диэлектрического материала реального конденсатора. Я также не знал, что на каждом толстопленочном резисторе есть метки лазеров, которые подгоняют его до конечного значения. Или просто увидев поперечное сечение коаксиального кабеля, соединенного с помощью разъема, — внезапно телеграфные уравнения и графики рефлектометрии во временной области приобретают для меня новый и очень ощутимый смысл. Ах , я думаю, так это шишка на графике TDR на интерфейсе коннектора!
Также захватывает дух огромный спектр компонентов, которыми занимаются Schlaepfer и Oskay. Нет ничего слишком ретро, ничего слишком современного, ничего слишком деликатного: если вы когда-нибудь хотели увидеть вакуумную трубку, разрезанную пополам, им каким-то образом удалось разрезать ее насквозь, не разбив тонкую стеклянную оболочку; Точно так же, если вы когда-нибудь задавались вопросом, как может выглядеть материнская плата вашего смартфона, они также прошли через это.
Один из моих любимых трюков авторов — это когда они разрезают оптоэлектронные устройства: каким-то образом им удается прорезать несколько светодиодов и оставлять их в рабочем состоянии, что приводит к потрясающим изображениям, таким как 7-сегментный светодиод, все еще отображающий число. «5» еще не раскрыта в поперечном сечении. Я действительно ценю усилия, приложенные для установки этой детали на красиво изготовленную и отполированную (возможно, покрытую лаком?) покрытую медью печатную плату, так что вы не только получите удовольствие от зрелища все еще работающего поперечного сечения устройства, но и получите отражение устройства, струящегося по красиво матовой медной поверхности. Как я уже сказал: любая инженерия, выполненная с душой и заботой, — это тоже искусство.
Настоящим классным номером Шлепфер и Оскай завершают книгу заметкой «После», в которой они делятся секретами своих поперечных сечений и методов фотографирования. Придерживаясь принципа открытости, эта мета-глава разрушает четвертую стену и дает вам возможность заглянуть в их мастерскую , показывая вам инструменты и методы, используемые для создания изображений в книге. Такой обмен с трудом заработанными знаниями является отличительной чертой настоящих мастеров; в то время как меньшие авторы будут хранить такие коммерческие секреты, опасаясь, что другие могут подняться, чтобы составить им конкуренцию, Шлепфер и Оскай завоевывают еще большее уважение своих поклонников, раскрывая усилия и мастерство, которые были вложены в создание книги. Совместное использование также сеет семена для более широкого сообщества открывателей цепей, сохраняя знания и методы для новых поколений поклонников электроники.
Даже если вы не разбираетесь в аппаратном обеспечении или даже если вы «не разбираетесь в технологиях», изображения в