tag:blogger.com,1999:blog-59572188276595697472024-03-23T06:08:48.695-07:00Эксперименты с АБИС "АС-Библиотека-3"Unknownnoreply@blogger.comBlogger25125tag:blogger.com,1999:blog-5957218827659569747.post-72904526860547635952020-08-19T11:01:00.002-07:002020-11-24T06:06:45.953-08:00Что происходит на сайте?<p>Сразу вопрос, на каком? Разумеется на сайте каталога. Предположим, мы организовали внешний доступ к каталогу. Но как посмотреть, что на нём происходит? Ведь посещения сайта официально идут в зачёт библиотеке, наряду с посещением самой библиотеки. Что ищут на нём посетители и находят ли? Это достаточно ценная информация. На её основе можно формировать заявки на закупку, отслеживать тренды в интересах пользователей. Это гораздо точнее формального анкетного опроса. При этом всё уже есть. Не надо прилагать дополнительных усилий. Надо только достать эту информацию. К сожалению, в «АС-Библиотека-3» этот вопрос пока не решён. Есть файл «EWWW.log», но он, по какой-то причине заблокирован для записи рабочему процессу «IIS» «w3wp.exe». Однако даже после разрешения записи «для всех», в нём не появляется ничего интересного. Только старт и стоп сервиса. Где же искать. На помощь приходит лог «IIS». Если помнишь, в статье «Настройки IIS» я рекомендовал настроить элемент "Ведение журнала HTTP". Он то и соберёт необходимую информацию. Нам останется только прочитать её. Конечно, «вручную» лог не разобрать. Поэтому я набросал простой парсер, который ты можешь <a href="https://yadi.sk/d/eCj7MujtRRFgpg" target="_blank">СКАЧАТЬ ПО ЭТОЙ ССЫЛКЕ</a> (он также доступен на панели справа). Это очень простое приложение, не требующее установки. А удаляется обычным удалением. Просто распакуй архив и запусти WebGateParser.exe.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-1AQW3UpxORs/Xz1jOqcHE1I/AAAAAAAAAkU/BN_SL9D-71wUDt0m7g2f8N2TBU88-RqFgCLcBGAsYHQ/s619/1.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="458" data-original-width="619" src="https://1.bp.blogspot.com/-1AQW3UpxORs/Xz1jOqcHE1I/AAAAAAAAAkU/BN_SL9D-71wUDt0m7g2f8N2TBU88-RqFgCLcBGAsYHQ/s0/1.jpg" /></a></div><p>Нажимаем на кнопку с тремя точками в верхнем правом углу. Выбираем каталог с лог файлами. Нажимаем кнопку «Старт» и смотрим результат. Его можно сохранить в текстовый файл. Обрати внимание, пробелы заменены на знак плюс (+). Читатели часто ставят их ведущими, при этом ничего не находят. И это хорошо заметно на выводе.</p><p>Можно настроить «Префикс». Он зависит от расположения виртуального каталога «Lib» в «Диспетчере служб IIS»</p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-giBc0nkZtmI/Xz1jdIqHj5I/AAAAAAAAAkY/VYuumrFW_4weU6I4-a56HX6bru_M0WgrwCLcBGAsYHQ/s803/2.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="498" data-original-width="803" src="https://1.bp.blogspot.com/-giBc0nkZtmI/Xz1jdIqHj5I/AAAAAAAAAkY/VYuumrFW_4weU6I4-a56HX6bru_M0WgrwCLcBGAsYHQ/s640/2.jpg" width="640" /></a></div><p>Это расположение по умолчанию. Если у тебя так же, ничего менять не надо. Если установка была в другое место, то подсмотреть «Префикс» можно в самом лог файле.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-GITSDLidar4/Xz1jr3bHuYI/AAAAAAAAAkg/t2vPbkcxn5M2665E0npApvke8eluaCQYQCLcBGAsYHQ/s603/3.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="309" data-original-width="603" src="https://1.bp.blogspot.com/-GITSDLidar4/Xz1jr3bHuYI/AAAAAAAAAkg/t2vPbkcxn5M2665E0npApvke8eluaCQYQCLcBGAsYHQ/s0/3.jpg" /></a></div><p>Это то, что перед «EWww.dll» вместе со слешами (/). Первый и последний слеш можно не ставить. </p><p>Несколько слов о настройке журнала IIS.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-P0VW2NxK-uk/Xz1jxvBrsnI/AAAAAAAAAko/D46PSTzF69gROaXOZsiX-_spLLeKuFkcACLcBGAsYHQ/s772/4.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="498" data-original-width="772" src="https://1.bp.blogspot.com/-P0VW2NxK-uk/Xz1jxvBrsnI/AAAAAAAAAko/D46PSTzF69gROaXOZsiX-_spLLeKuFkcACLcBGAsYHQ/s640/4.jpg" width="640" /></a></div><p>«Формат» журнала (он же лог) «W3C» обязателен. Другие парсер не читает. Он же по умолчанию. «Каталог» можно менять или просто посмотреть, где он находится. Кодировку менять нет смысла. «Выбрать поля…» можно оставить как есть.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-crlLw-xABqc/Xz1j7wlmLRI/AAAAAAAAAkw/dZqVnxCJh_wEEwoBZjDicec2bRfv3PYGwCLcBGAsYHQ/s767/5.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="767" data-original-width="585" height="640" src="https://1.bp.blogspot.com/-crlLw-xABqc/Xz1j7wlmLRI/AAAAAAAAAkw/dZqVnxCJh_wEEwoBZjDicec2bRfv3PYGwCLcBGAsYHQ/s640/5.jpg" /></a></div><p>Далее, «Назначение для событий журнала» выбрать «Только файл журнала». Далее, «Переход на новый файл журнала», я считаю, «Расписание -> Ежемесячно» будет оптимально. «Использовать местное время в имени файла» не стоит.</p><p>В XP работать не будет. Однако журналы легко скопировать на другой компьютер. Они хорошо сжимаются и их неплохо хранить для дальнейшей обработки.</p><p>Пока не анализируются запросы с вкладки «Расширенный поиск».</p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-YPo2H17mxek/Xz1kGTdyZtI/AAAAAAAAAk4/pwwmEryPPvg5F7FCkl0SrJCGuSqmqC0_wCLcBGAsYHQ/s827/6.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="668" data-original-width="827" src="https://1.bp.blogspot.com/-YPo2H17mxek/Xz1kGTdyZtI/AAAAAAAAAk4/pwwmEryPPvg5F7FCkl0SrJCGuSqmqC0_wCLcBGAsYHQ/s640/6.jpg" width="640" /></a></div><p>Им мало кто пользуется, а разбор гораздо сложнее, по сравнению с «Простой поиск». Добавлю в следующих версиях.</p><p>Серьёзные парсеры достают много информации, считают сессии (они же посещения), определяют время, проведённое на сайте, строят графики и т.д. Так что есть куда развиваться. Однако всё зависит от твоей активности. Не поленись сообщить об использовании (можно анонимно), тем более об ошибке.</p><p>И в конце. Очевидно, что поначалу посещений будет немного. Материалов по раскрутке сайтов достаточно. Я лишь коснусь специфики.</p><p>Первое. Наглядная агитация. Небольшой плакат на видном месте с краткой информацией и последовательностью поиска на сайте.</p><p>Если есть возможность, выделить компьютер для самостоятельного поиска в самой библиотеке. Желательно с консультантом. Или возложить эти обязанности на сотрудника с рабочим местом.</p><p>Не жалей времени на консультации по поиску. Сайт не так прост для обывателя. Каждый освоивший научит и «приведёт» ещё нескольких.</p><p>Если в твоей библиотеке до сих пор ведётся только каталог, давно пора переходить к полноценному обслуживанию. С выдачей учётных данных для регистрации на сайте. Тогда появляется возможность не только искать, но и заказывать издания (возможно с платной доставкой, в случае «второй волны»). Я посвятил этой теме две статьи «Кто книгу заказал?» и «В очередь с... дети!». И последнее. Просто удивительно как разработчик умудрился "испортить" одну из последних версий v3.3.64 в части обслуживания читателей, вплоть до непригодности. В детали вдаваться не буду. Скажу лишь, что v3.3.58 давно и с успехом эксплуатируется во многих библиотеках. Так что есть смысл подумать об откате. При наличии дистрибутива сделать это несложно так как базы практически идентичны.</p><p><a href="https://yadi.sk/d/eCj7MujtRRFgpg" target="_blank">СКАЧАТЬ ПАРСЕР</a><br /></p><p>Пиши комментарии (регистрация не требуется) или на почту acbib3@yandex.ru</p><div><br /></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5957218827659569747.post-29988333521725413532020-08-07T08:36:00.000-07:002020-08-07T08:36:51.765-07:00 Разберёмся с «полнотекстом»<p>Какое-то время назад, было повальное увлечение полнотекстовыми базами данных. В терминах АС-Библиотека-3 это не что иное как «Присоединённые документы». Попробуем разобраться с этим «зверем», а заодно решить несколько возможных проблем.</p><p></p><div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-kScCwnExZHE/Xy1iCzOD3wI/AAAAAAAAAc8/Yme-OJsLEPszFaRkXcWizBSgjbN6vLa6QCLcBGAsYHQ/s811/1.jpg" imageanchor="1" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="617" data-original-width="811" src="https://1.bp.blogspot.com/-kScCwnExZHE/Xy1iCzOD3wI/AAAAAAAAAc8/Yme-OJsLEPszFaRkXcWizBSgjbN6vLa6QCLcBGAsYHQ/s640/1.jpg" width="640" /></a></div><p></p><p>У меня демо база, поэтому ничто не присоединено. Присоединить можно любой файл, распознаваемый операционной системой. Но где он хранится? Есть два подхода – в базе или в файловой системе (при этом в базе хранится ссылка на файл). В базе их нет. Значит, ищем на диске. В папке EServer есть подозрительная папка BLOB.</p><p></p><div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-EW4nSnxX75M/Xy1jrqVFIpI/AAAAAAAAAgM/D3SE8jZI-SIWwmcG_k1JZsvq_RmYMxWlgCLcBGAsYHQ/s628/2.jpg" imageanchor="1" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="418" data-original-width="628" src="https://1.bp.blogspot.com/-EW4nSnxX75M/Xy1jrqVFIpI/AAAAAAAAAgM/D3SE8jZI-SIWwmcG_k1JZsvq_RmYMxWlgCLcBGAsYHQ/s0/2.jpg" /></a></div><p></p><p>Это аббревиатура, означающая большие бинарные объекты. Попробуем присоединить любой документ и посмотрим, что произойдёт. </p><p></p><div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-eQ2KR3aqB9A/Xy1kAnyoHWI/AAAAAAAAAgU/JLNq-CPUhK0JkNYJr5uTLduizA2LK_toQCLcBGAsYHQ/s793/3.jpg" imageanchor="1" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="517" data-original-width="793" src="https://1.bp.blogspot.com/-eQ2KR3aqB9A/Xy1kAnyoHWI/AAAAAAAAAgU/JLNq-CPUhK0JkNYJr5uTLduizA2LK_toQCLcBGAsYHQ/s640/3.jpg" width="640" /></a></div><p></p><p>Хорошо. Теперь удалим его в проводнике, перечитаем в каталогизаторе и посмотрим. Он исчез!</p><p></p><div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-SjfRORglYyw/Xy1kKSHQxdI/AAAAAAAAAgY/wDJVIP2V8noI1cCp0C77Ij_u0RD-9AFCQCLcBGAsYHQ/s764/4.jpg" imageanchor="1" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="507" data-original-width="764" src="https://1.bp.blogspot.com/-SjfRORglYyw/Xy1kKSHQxdI/AAAAAAAAAgY/wDJVIP2V8noI1cCp0C77Ij_u0RD-9AFCQCLcBGAsYHQ/s640/4.jpg" width="640" /></a></div><div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-lYOYUzQNhnI/Xy1k1-VQsmI/AAAAAAAAAgo/jOZe_f-QUgIsSNXmg9lOmEgb0vg0XUQIQCLcBGAsYHQ/s790/5.jpg" imageanchor="1" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="505" data-original-width="790" src="https://1.bp.blogspot.com/-lYOYUzQNhnI/Xy1k1-VQsmI/AAAAAAAAAgo/jOZe_f-QUgIsSNXmg9lOmEgb0vg0XUQIQCLcBGAsYHQ/s640/5.jpg" width="640" /></a></div><p></p><p>Посмотрим ошибки </p><p></p><div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-kCUmoIsby1c/Xy1k8ufvxwI/AAAAAAAAAgs/EUQrIxcRVP8ZRkUv25QDUbiOhHWmLpPsACLcBGAsYHQ/s694/6.jpg" imageanchor="1" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="546" data-original-width="694" src="https://1.bp.blogspot.com/-kCUmoIsby1c/Xy1k8ufvxwI/AAAAAAAAAgs/EUQrIxcRVP8ZRkUv25QDUbiOhHWmLpPsACLcBGAsYHQ/s640/6.jpg" width="640" /></a></div><p></p><p>Ошибок нет. А что означает имя папки «00000007»? Не что иное как номер записи в базе! </p><p></p><div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-hw4oKn-f5g8/Xy1lEb17ksI/AAAAAAAAAgw/Yfrf7qF2L1IEMrHSXCNOTyB_is7Ja5rfwCLcBGAsYHQ/s790/7.jpg" imageanchor="1" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="505" data-original-width="790" src="https://1.bp.blogspot.com/-hw4oKn-f5g8/Xy1lEb17ksI/AAAAAAAAAgw/Yfrf7qF2L1IEMrHSXCNOTyB_is7Ja5rfwCLcBGAsYHQ/s640/7.jpg" width="640" /></a></div><p></p><p>Попробуем в проводнике подложить картинку (для отличия) и перечитаем в каталогизаторе.</p><p></p><div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-py5K7ESuiB4/Xy1lLMCZqAI/AAAAAAAAAg4/2yN3OsITpxMXK-GsetkkEu3xHTITFYdJQCLcBGAsYHQ/s764/8.jpg" imageanchor="1" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="507" data-original-width="764" src="https://1.bp.blogspot.com/-py5K7ESuiB4/Xy1lLMCZqAI/AAAAAAAAAg4/2yN3OsITpxMXK-GsetkkEu3xHTITFYdJQCLcBGAsYHQ/s640/8.jpg" width="640" /></a></div><p></p><p> </p><p></p><div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-Bv0ILpH7IS8/Xy1lR71PKJI/AAAAAAAAAhA/5jLnpiN3UgsE9LRFNm9rMmyUQyKdDfj1QCLcBGAsYHQ/s790/9.jpg" imageanchor="1" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="505" data-original-width="790" src="https://1.bp.blogspot.com/-Bv0ILpH7IS8/Xy1lR71PKJI/AAAAAAAAAhA/5jLnpiN3UgsE9LRFNm9rMmyUQyKdDfj1QCLcBGAsYHQ/s640/9.jpg" width="640" /></a></div><p></p><p>Проверим ошибки </p><p></p><div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-Eq8AnWljz9U/Xy1lYSwTM7I/AAAAAAAAAhI/uKNJltV4oMsvDxjY18D4W46mIYXVWgbmgCLcBGAsYHQ/s694/10.jpg" imageanchor="1" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="546" data-original-width="694" src="https://1.bp.blogspot.com/-Eq8AnWljz9U/Xy1lYSwTM7I/AAAAAAAAAhI/uKNJltV4oMsvDxjY18D4W46mIYXVWgbmgCLcBGAsYHQ/s640/10.jpg" width="640" /></a></div><p></p><p>Ошибок нет. Похоже, что в базе даже ссылки нет как таковой. Связь происходит по имени базы и номеру записи. Как это можно использовать? Разумеется, создавать и удалять присоединённые документы удобней штатным способом. А вот поискать по размеру и откорректировать вполне. </p><p></p><div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-gUBBj8gLjWo/Xy1lfGfFBhI/AAAAAAAAAhM/gV9Jp6e8XksFN7Sk8EBON1SY-ojUFv6EACLcBGAsYHQ/s763/11.jpg" imageanchor="1" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="508" data-original-width="763" src="https://1.bp.blogspot.com/-gUBBj8gLjWo/Xy1lfGfFBhI/AAAAAAAAAhM/gV9Jp6e8XksFN7Sk8EBON1SY-ojUFv6EACLcBGAsYHQ/s640/11.jpg" width="640" /></a></div><p></p><p>Думаю, ты знаешь, на что способен «неопытный» пользователь сканера в союзе с BMP форматом! Да и уровни сжатия JPEG бывают разные. Назначение папки «00000000», по-видимому, просто создать дополнительные диапазоны для более быстрого доступа. Но для нас это не важно.</p><div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-e7SxbQ7KJdA/Xy1l7xSf01I/AAAAAAAAAhg/5jXY0xFiiCACuNITZr_ejr58u1zoOTeNwCLcBGAsYHQ/s764/12.jpg" imageanchor="1" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="507" data-original-width="764" src="https://1.bp.blogspot.com/-e7SxbQ7KJdA/Xy1l7xSf01I/AAAAAAAAAhg/5jXY0xFiiCACuNITZr_ejr58u1zoOTeNwCLcBGAsYHQ/s640/12.jpg" width="640" /></a></div><p>Хорошо. А что делать, если всё сжато, а на диске заканчивается место. Тем более что это, как правило, диск С:. Там и операционная система. Нужно добавить диск и перенести BLOB на него. Как добавить диск разберёшься сам. Это не моя тема. А вот с переносом давай посмотрим. При создании логической базы АС-Библиотека-3 требует ряд параметров. </p><p></p><div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-8t5Ta4xwA5M/Xy1mDRpCWPI/AAAAAAAAAhk/yWkKCCciMOELxFVW6Nd_UZt3cIfM_MJTQCLcBGAsYHQ/s500/13.jpg" imageanchor="1" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="500" data-original-width="470" src="https://1.bp.blogspot.com/-8t5Ta4xwA5M/Xy1mDRpCWPI/AAAAAAAAAhk/yWkKCCciMOELxFVW6Nd_UZt3cIfM_MJTQCLcBGAsYHQ/s0/13.jpg" /></a></div><p></p><p>В том числе «Путь к присоединённым документам». На рисунке в шаблоне предлагается «.\BLOB\Book». Точка, очевидно, означает текущий каталог, относительно сервера «EServer». Эти данные, должны быть, где то сохранены. Так и есть. Вот таблица «Demo__Options». </p><p></p><div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-n-ozIiFBpzg/Xy1mNqkHfKI/AAAAAAAAAhs/x8krwFIdd-QWdnYxcpG6m5ncdzmjiMVdACLcBGAsYHQ/s760/14.jpg" imageanchor="1" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="760" data-original-width="599" height="640" src="https://1.bp.blogspot.com/-n-ozIiFBpzg/Xy1mNqkHfKI/AAAAAAAAAhs/x8krwFIdd-QWdnYxcpG6m5ncdzmjiMVdACLcBGAsYHQ/s640/14.jpg" /></a></div><p></p><p>Запись BlobPath указывает путь. Что произойдёт, если мы его изменим. Давай посмотрим. На то это и «эксперименты». Я создал на другом диске (E:) соответствующую структуру папок, при этом, «BLOB» заменил на «АС-3 Присоединённые документы» и положил другой файл. Другой файл я положил намерено. Это покажет, куда смотрит система. Остальные изменения спорны, просто посмотреть на реакцию. Главное не вносить излишнюю путаницу.</p><p></p><div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-NIbAv2vX6cE/Xy1mdeHO6OI/AAAAAAAAAh4/L66LyWLjEFgoq-vQvcU3V8L9FvO5t-enwCLcBGAsYHQ/s649/15.jpg" imageanchor="1" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="432" data-original-width="649" src="https://1.bp.blogspot.com/-NIbAv2vX6cE/Xy1mdeHO6OI/AAAAAAAAAh4/L66LyWLjEFgoq-vQvcU3V8L9FvO5t-enwCLcBGAsYHQ/s640/15.jpg" width="640" /></a></div> <p></p><p>Изменим путь в таблице «Demo__Options». </p><p></p><div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-J75m_VWzRCs/Xy1mwKDDdsI/AAAAAAAAAiA/XzN6GOc2J_gISDSSQEuOPPvopWeDg5eAQCLcBGAsYHQ/s760/16.jpg" imageanchor="1" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="760" data-original-width="599" height="640" src="https://1.bp.blogspot.com/-J75m_VWzRCs/Xy1mwKDDdsI/AAAAAAAAAiA/XzN6GOc2J_gISDSSQEuOPPvopWeDg5eAQCLcBGAsYHQ/s640/16.jpg" /></a></div><p></p><p>Перечитаем записи в «Каталогизаторе» </p><p></p><div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-4CCjGKqtdII/Xy1m21u9TsI/AAAAAAAAAiE/MU2NMR4m_4cnvZKh_5yCqzdTwJK0Kr17QCLcBGAsYHQ/s670/17.jpg" imageanchor="1" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="507" data-original-width="670" src="https://1.bp.blogspot.com/-4CCjGKqtdII/Xy1m21u9TsI/AAAAAAAAAiE/MU2NMR4m_4cnvZKh_5yCqzdTwJK0Kr17QCLcBGAsYHQ/s640/17.jpg" width="640" /></a></div><p></p><p>Даже сервер перезапускать не пришлось! Теперь попробуем создать в каталогизаторе. </p><p></p><div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-zXQGg5snZ_U/Xy1nEV7LlyI/AAAAAAAAAiM/m5KdGmMO9MEHjdC3epR9huIoNljVmBdCQCLcBGAsYHQ/s673/18.jpg" imageanchor="1" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="498" data-original-width="673" src="https://1.bp.blogspot.com/-zXQGg5snZ_U/Xy1nEV7LlyI/AAAAAAAAAiM/m5KdGmMO9MEHjdC3epR9huIoNljVmBdCQCLcBGAsYHQ/s640/18.jpg" width="640" /></a></div><p></p><p>Здесь я выбрал вариант «Обложка» </p><p></p><div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-DowmEfJfiN0/Xy1nK2E6DII/AAAAAAAAAiU/NqsqcSYG_M0tE4P2gEvyhGCy1fpFDwU0gCLcBGAsYHQ/s649/19.jpg" imageanchor="1" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="432" data-original-width="649" src="https://1.bp.blogspot.com/-DowmEfJfiN0/Xy1nK2E6DII/AAAAAAAAAiU/NqsqcSYG_M0tE4P2gEvyhGCy1fpFDwU0gCLcBGAsYHQ/s640/19.jpg" width="640" /></a></div><p></p><p>Однако посмотрим ошибки.</p><div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-tnP8-2U4Ov8/Xy1naR3QKEI/AAAAAAAAAic/VdFJPQyVxXYLtPOQxKKUVxy9IWlXdAh_ACLcBGAsYHQ/s665/20.jpg" imageanchor="1" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="464" data-original-width="665" src="https://1.bp.blogspot.com/-tnP8-2U4Ov8/Xy1naR3QKEI/AAAAAAAAAic/VdFJPQyVxXYLtPOQxKKUVxy9IWlXdAh_ACLcBGAsYHQ/s640/20.jpg" width="640" /></a></div><p>Ошибок нет.</p><p>Есть ещё парочка способов перенести «BLOB» на другой диск без вмешательства в базу. Кто «гулял» по файловой системе linux, тот знает, что в ней существуют мягкие и жёсткие ссылки. Что-то подобное завелось и в Windows. Но это до сих пор мало кто знает. Для начала, вернём в базе, как было. </p><p></p><div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-ZbPufzoVg40/Xy1nj3Vs66I/AAAAAAAAAik/_10segV28UIwZIqu4e1Qp7lHr1PpQ2z7wCLcBGAsYHQ/s760/21.jpg" imageanchor="1" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="760" data-original-width="599" height="640" src="https://1.bp.blogspot.com/-ZbPufzoVg40/Xy1nj3Vs66I/AAAAAAAAAik/_10segV28UIwZIqu4e1Qp7lHr1PpQ2z7wCLcBGAsYHQ/s640/21.jpg" /></a></div><p></p><p>Удалим каталог «E:\АС-3 Присоединённые документы» с дополнительного диска и скопируем туда весь каталог «BLOB». </p><p></p><div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-M4qSTOm5CT8/Xy1ntlpOt5I/AAAAAAAAAis/MFZMXKyRUeQf8sAk-NYefEm1sD5lylXjgCLcBGAsYHQ/s649/22.jpg" imageanchor="1" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="424" data-original-width="649" src="https://1.bp.blogspot.com/-M4qSTOm5CT8/Xy1ntlpOt5I/AAAAAAAAAis/MFZMXKyRUeQf8sAk-NYefEm1sD5lylXjgCLcBGAsYHQ/s640/22.jpg" width="640" /></a></div><p></p><p>Удаляем основной каталог «C:\Program Files (x86)\АС-Библиотека-3\EServer\BLOB». Запускаем cmd от Администратора. Переходим в каталог «C:\Program Files (x86)\АС-Библиотека-3\EServer» выполняем команду «mklink /D /J BLOB E:\BLOB» (Vista+, в XP: см. ниже). Смотрим результат. Что-то появилось.</p><p></p><div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-jBf0dCjpo-k/Xy1n44QIEaI/AAAAAAAAAi0/8ahff1dz-9oWJvqNL0QW80sz4v-Dyx_RwCLcBGAsYHQ/s649/23.jpg" imageanchor="1" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="424" data-original-width="649" src="https://1.bp.blogspot.com/-jBf0dCjpo-k/Xy1n44QIEaI/AAAAAAAAAi0/8ahff1dz-9oWJvqNL0QW80sz4v-Dyx_RwCLcBGAsYHQ/s640/23.jpg" width="640" /></a></div><p></p><p>Посмотрим, как работает. В «Каталогизаторе» </p><p></p><div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-XLkIfXyleWg/Xy1oE0YcWEI/AAAAAAAAAi8/gfV5-aF0aYAI0GDC19p8vweUnjLnaiv6gCLcBGAsYHQ/s708/24.jpg" imageanchor="1" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="505" data-original-width="708" src="https://1.bp.blogspot.com/-XLkIfXyleWg/Xy1oE0YcWEI/AAAAAAAAAi8/gfV5-aF0aYAI0GDC19p8vweUnjLnaiv6gCLcBGAsYHQ/s640/24.jpg" width="640" /></a></div><p></p><p>Создадим «Обложку» </p><p></p><div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-mhSxO0V7oFg/Xy1oMxGNDmI/AAAAAAAAAjA/Ci6vKDqyfnQGSi4nMFvR7C7qoWeWNGwfACLcBGAsYHQ/s708/25.jpg" imageanchor="1" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="505" data-original-width="708" src="https://1.bp.blogspot.com/-mhSxO0V7oFg/Xy1oMxGNDmI/AAAAAAAAAjA/Ci6vKDqyfnQGSi4nMFvR7C7qoWeWNGwfACLcBGAsYHQ/s640/25.jpg" width="640" /></a></div><p></p><p>Обложка на месте. </p><p></p><div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-fY4a0noiMIQ/Xy1oXLhvFQI/AAAAAAAAAjI/Eiv-3VfKrjUL9aVJwyEKCDgH4H6rckZ9wCLcBGAsYHQ/s649/26.jpg" imageanchor="1" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="424" data-original-width="649" src="https://1.bp.blogspot.com/-fY4a0noiMIQ/Xy1oXLhvFQI/AAAAAAAAAjI/Eiv-3VfKrjUL9aVJwyEKCDgH4H6rckZ9wCLcBGAsYHQ/s640/26.jpg" width="640" /></a></div><p></p><p>Замечу, что вместе со всем «BLOB» переехала и база фотографий пользователей «User». Проверим и её. </p><p></p><div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-XSADgyYffxE/Xy1olyG7h2I/AAAAAAAAAjQ/64ez5HPsDXM1ay5t3uRgFbXxp2eWYTLZwCLcBGAsYHQ/s786/27.jpg" imageanchor="1" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="563" data-original-width="786" src="https://1.bp.blogspot.com/-XSADgyYffxE/Xy1olyG7h2I/AAAAAAAAAjQ/64ez5HPsDXM1ay5t3uRgFbXxp2eWYTLZwCLcBGAsYHQ/s640/27.jpg" width="640" /></a></div><p></p><p>Всё на месте. И конечная цель, это доставка документов пользователю. </p><p></p><div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-1HHU1eUvhUY/Xy1otigBW2I/AAAAAAAAAjY/U-kmpDoY3IMxBXo9ffOaFZToKS5fiNkswCLcBGAsYHQ/s1111/28.jpg" imageanchor="1" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="668" data-original-width="1111" src="https://1.bp.blogspot.com/-1HHU1eUvhUY/Xy1otigBW2I/AAAAAAAAAjY/U-kmpDoY3IMxBXo9ffOaFZToKS5fiNkswCLcBGAsYHQ/s640/28.jpg" width="640" /></a></div><p></p><p>Для XP такой команды нет (мне не известно). А поскольку пользователей XP ещё достаточно, сделаем всё из консоли. Здесь можно «закрепить» за папкой только диск целиком. После всех инициализаций, копируем содержимое папки BLOB на новый диск. Обрати внимание, именно содержимое! В моём случае (демо) это будет папка User.User. После чего удаляем её содержимое. Открываем консоль «Управление компьютером» и выбираем «Управление дисками». В контекстном меню нового диска выбираем пункт «Изменить букву диска или путь к диску…». </p><p></p><div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-DDT7VNG0YRs/Xy1o84s98iI/AAAAAAAAAjg/MObAViyV2cw2vuZ1GWxYpLQZxyD_f7vJwCLcBGAsYHQ/s1024/29.jpg" imageanchor="1" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="768" data-original-width="1024" src="https://1.bp.blogspot.com/-DDT7VNG0YRs/Xy1o84s98iI/AAAAAAAAAjg/MObAViyV2cw2vuZ1GWxYpLQZxyD_f7vJwCLcBGAsYHQ/s640/29.jpg" width="640" /></a></div><p></p><p>Добавляем путь к папке BLOB. </p><p></p><div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-t16FVeUgviM/Xy1pLqNKw5I/AAAAAAAAAjo/D0i6NUkb5XkicHQD7nS8A5cJHcblS_5CwCLcBGAsYHQ/s1024/30.jpg" imageanchor="1" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="768" data-original-width="1024" src="https://1.bp.blogspot.com/-t16FVeUgviM/Xy1pLqNKw5I/AAAAAAAAAjo/D0i6NUkb5XkicHQD7nS8A5cJHcblS_5CwCLcBGAsYHQ/s640/30.jpg" width="640" /></a></div><p></p><p>Далее открываем «Каталогизатор» и присоединяем документ. </p><p></p><div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-uhumb-H2zA4/Xy1pZa4m2YI/AAAAAAAAAjw/LP1IEfoS3bEGh4iI59TNkegLwGsj7lY9ACLcBGAsYHQ/s1024/31.jpg" imageanchor="1" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="768" data-original-width="1024" src="https://1.bp.blogspot.com/-uhumb-H2zA4/Xy1pZa4m2YI/AAAAAAAAAjw/LP1IEfoS3bEGh4iI59TNkegLwGsj7lY9ACLcBGAsYHQ/s640/31.jpg" width="640" /></a></div><p></p><p>Смотрим результат. </p><p></p><div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-oxAYNU0eIwA/Xy1pjl6MYwI/AAAAAAAAAj0/oR-Be5Xl3lEsOqWXoq5ao7WZ8gJwYa0JgCLcBGAsYHQ/s1024/32.jpg" imageanchor="1" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="768" data-original-width="1024" src="https://1.bp.blogspot.com/-oxAYNU0eIwA/Xy1pjl6MYwI/AAAAAAAAAj0/oR-Be5Xl3lEsOqWXoq5ao7WZ8gJwYa0JgCLcBGAsYHQ/s640/32.jpg" width="640" /></a></div><p></p><p>Таким же способом всё можно сделать и в старших версиях. Но в случае команды всё удаётся собрать в одной папке BLOB. Кроме того командой можно «перебросить» отдельную базу, а в консольном варианте всё скопом. Впрочем, это вопрос эстетики. Как поступить выбирай сам.</p><p>Здесь всё построено на технологии «повторной обработки». При этом очевидно возникают дополнительные издержки. Однако при реальной интенсивности обращений к присоединённым документам ими можно пренебречь. Поэтому я бы не советовал использовать этот трюк для переброски основной базы (Lib.mdb). Тем более что путь к ней легко изменить в настройках подключения.</p><p>И, напоследок, укажу на ещё один способ переноса. С некоторых пор в Windows появился такой вот «зверь». </p><p></p><div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-NWuC2pYwIq0/Xy1prwVAzNI/AAAAAAAAAj8/yB0gCkiiFXAnBhOI9SpccyLNGuhlGhunwCLcBGAsYHQ/s684/33.jpg" imageanchor="1" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="504" data-original-width="684" src="https://1.bp.blogspot.com/-NWuC2pYwIq0/Xy1prwVAzNI/AAAAAAAAAj8/yB0gCkiiFXAnBhOI9SpccyLNGuhlGhunwCLcBGAsYHQ/s640/33.jpg" width="640" /></a></div><p></p><p>Если коротко, то он позволяет поместить диск в сети. Причём даже SQL сервер «соглашается» разместить на нём свою базу (сам проверял). Штука, безусловно, мощная, но ответная часть есть только на серверной версии ОС. Впрочем, есть и линукс варианты. Например FreeNAS весьма мощная штуковина с кучей дополнительных технологий. Но с этим будешь разбираться сам. Это не моя тема.</p><p>В базе Lib.mdb есть таблица All_BLOB, которая играет роль лога. И её надо периодически чистить.</p><div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-E7lzVGOkyy8/Xy1p9iXsLFI/AAAAAAAAAkI/lYJAM9ra7lwbOp8PhwYBIcKO-q1UPaT9gCLcBGAsYHQ/s767/34.jpg" imageanchor="1" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="655" data-original-width="767" src="https://1.bp.blogspot.com/-E7lzVGOkyy8/Xy1p9iXsLFI/AAAAAAAAAkI/lYJAM9ra7lwbOp8PhwYBIcKO-q1UPaT9gCLcBGAsYHQ/s640/34.jpg" width="640" /></a></div><p>И в конце небольшой совет. Эта технология прекрасно подходит для упорядоченного хранения сканов обложек для презентаций. Кто готовил мероприятия знает, что одни и теже обложки сканируют по многу раз. Потом они валяются по всем компьютерам, но ничего не найдёшь.</p><p>На этом всё. Пиши комментарии (регистрация не требуется) или на почту acbib3@yandex.ru</p><div><br /></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5957218827659569747.post-24963279731494873902019-04-17T04:39:00.000-07:002019-04-17T04:39:03.593-07:00Рубим хвост<div dir="ltr" style="text-align: left;" trbidi="on">
Не секрет, что каждая информационная система с накоплением данных, без их должного обслуживания стремится к краху. Во первых, в связи с нехваткой ресурса хранения. Во вторых, система может стать неповоротливой, из за необходимости обрабатывать всё большие объёмы данных, плюс резервное копирование и т.д.. АС-Библиотека-3 не исключение. Одно из мест, где происходит накопление данных, таблица "выдачи" All__Delivery.<br />
<br />
Проверить наличие проблемы можно простым SQL запросом в "Администратор" на вкладке "SQL":<br />
<br />
select count(*) from All__Delivery<br />
<br />
Вот результат запроса на одной из реальных баз<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-Cwnbm4qDYOc/XLcPu7Cb5xI/AAAAAAAAAZ8/-8iLKAuX9HQeNw5jZ8PRZ8UqaWk4ORCYQCLcBGAs/s1600/1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="448" data-original-width="662" height="270" src="https://4.bp.blogspot.com/-Cwnbm4qDYOc/XLcPu7Cb5xI/AAAAAAAAAZ8/-8iLKAuX9HQeNw5jZ8PRZ8UqaWk4ORCYQCLcBGAs/s400/1.jpg" width="400" /></a></div>
<br />
<br />
1 315 866 строк в таблице All__Delivery говорит о том, что проблема давно ждёт своего решения. По личному опыту "неприятности" начинаются после 500 000. Конкретную цифру указать сложно, это зависит от многих факторов, в том числе и от традиций, заведённых в конкретной библиотеке.<br />
Что делать? Ответ очевиден. Надо "рубить хвост". Но не торопись браться за топор. Всё можно сделать тонко и аккуратно. То есть, и базу облегчить и данные сохранить. Зачем сохранять данные? Это "золотая" руда, только нужно уметь её правильно "готовить". Можно сказать это твои "большие" данные, причём сразу хорошо структурированные.<br />
<br />
Статья, пока, не закончена. Если будут обращения по этой теме, допишу.<br />
<br />
Пиши комментарии (регистрация не требуется) или на почту acbib3@yandex.ru</div>
Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-5957218827659569747.post-11055134114805608212018-07-14T05:16:00.001-07:002018-07-14T05:19:11.233-07:00"В очередь с... дети!"<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<div class="MsoPlainText">
<span style="font-family: "courier new";">Мало кто знает, а
кто пользуется, мне вообще неизвестно, возможностью организовывать очередь на
издание в АС-Библиотека-3. Это свойство нигде не описано, нет одной
"кнопки", по которой можно было бы догадаться. Это свойство просто
присутствует в распределённом виде, и грех им не пользоваться, если оно уже
есть. Организация очереди, наиболее перспективно в периодике (по причине
устаревания информации), если создать каталог с, хотя бы примитивным описанием
и сократить время "на руках". Заодно получаем электронный учёт с
автоматизированной статистикой! Давай посмотрим, как это работает. Я показываю
на версии 3.3.58. Здесь это уже вполне работает. В 3.3.43 чего-то не хватало.</span></div>
<div class="MsoPlainText">
<span style="font-family: "courier new";">Итак, база
"Демо". Таблица All__Delivery пуста (для простоты). Выдаём
произвольный экземпляр Иванову. Обрати внимание: квадратик слева
"белый". Это означает, что экземпляр свободен.<o:p></o:p></span></div>
<div class="MsoPlainText">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-queuLB8kWHM/W0nnv_z7sFI/AAAAAAAAAXY/jLOPTvoq55oe850MHnMNGjEftu4_wlP_wCLcBGAs/s1600/1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="548" data-original-width="805" height="271" src="https://4.bp.blogspot.com/-queuLB8kWHM/W0nnv_z7sFI/AAAAAAAAAXY/jLOPTvoq55oe850MHnMNGjEftu4_wlP_wCLcBGAs/s400/1.jpg" width="400" /></a></div>
<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<span style="font-family: "courier new";">На
"Контроле"<o:p></o:p></span></div>
<div class="MsoPlainText">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-rZSQooFMVGc/W0nn1swYI2I/AAAAAAAAAXc/VAHyQjUmdnEFy53O3_yuDJeYrDhSgiEhACLcBGAs/s1600/2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="548" data-original-width="805" height="271" src="https://1.bp.blogspot.com/-rZSQooFMVGc/W0nn1swYI2I/AAAAAAAAAXc/VAHyQjUmdnEFy53O3_yuDJeYrDhSgiEhACLcBGAs/s400/2.jpg" width="400" /></a></div>
<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<span style="font-family: "courier new";">В таблице
All__Delivery появляется строка<o:p></o:p></span></div>
<div class="MsoPlainText">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-1rV3Xdr5x08/W0nn8mPY_aI/AAAAAAAAAXg/uNwditvkFpE7mZMOPQyE_7qcxbMTPx3gACLcBGAs/s1600/3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="502" data-original-width="633" height="316" src="https://4.bp.blogspot.com/-1rV3Xdr5x08/W0nn8mPY_aI/AAAAAAAAAXg/uNwditvkFpE7mZMOPQyE_7qcxbMTPx3gACLcBGAs/s400/3.jpg" width="400" /></a></div>
<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<span style="font-family: "courier new";">Всё как обычно.
Теперь пришёл Петров и просит туже книгу. Теперь квадратик "затемнён"
и состояние "Выдано".<o:p></o:p></span></div>
<div class="MsoPlainText">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-VNZexIG7-rI/W0noD0UEhYI/AAAAAAAAAXo/hH6qEaloRvUECBFGxY5uM6vVhSRmXOugwCLcBGAs/s1600/4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="643" data-original-width="805" height="318" src="https://2.bp.blogspot.com/-VNZexIG7-rI/W0noD0UEhYI/AAAAAAAAAXo/hH6qEaloRvUECBFGxY5uM6vVhSRmXOugwCLcBGAs/s400/4.jpg" width="400" /></a></div>
<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<span style="font-family: "courier new";">Если провести тоже
операции, что при выдаче мы, на самом деле, поставим "товарища" в
очередь. В таблице All__Delivery новая строка<o:p></o:p></span></div>
<div class="MsoPlainText">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-7WZVDYglo-o/W0noIWJ2qQI/AAAAAAAAAXw/m18Wc2ZBXwIpsNQnbky8-UgOY-H1ZxEIACLcBGAs/s1600/5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="502" data-original-width="633" height="316" src="https://3.bp.blogspot.com/-7WZVDYglo-o/W0noIWJ2qQI/AAAAAAAAAXw/m18Wc2ZBXwIpsNQnbky8-UgOY-H1ZxEIACLcBGAs/s400/5.jpg" width="400" /></a></div>
<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<span style="font-family: "courier new";">На вкладке
"Контроль" "Зарезервированные издания" "Все
читатели" "Текущий отдел"<o:p></o:p></span></div>
<div class="MsoPlainText">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-Q3aE9mvVDCo/W0noMwfEMPI/AAAAAAAAAX4/PebRKorOmMoOmbCgorl2el5_OrjDxpmmACLcBGAs/s1600/6.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="709" data-original-width="779" height="363" src="https://1.bp.blogspot.com/-Q3aE9mvVDCo/W0noMwfEMPI/AAAAAAAAAX4/PebRKorOmMoOmbCgorl2el5_OrjDxpmmACLcBGAs/s400/6.jpg" width="400" /></a></div>
<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<span style="font-family: "courier new";">Допустим, Сидоров
зашёл в каталог через интернет и заказал эту же книгу.<o:p></o:p></span></div>
<div class="MsoPlainText">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-47oT4YOLsBY/W0noRXDClYI/AAAAAAAAAX8/fRKO4iEMJsYK5kyLZrpimY6bEde9DUr2QCLcBGAs/s1600/7.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="689" data-original-width="783" height="351" src="https://2.bp.blogspot.com/-47oT4YOLsBY/W0noRXDClYI/AAAAAAAAAX8/fRKO4iEMJsYK5kyLZrpimY6bEde9DUr2QCLcBGAs/s400/7.jpg" width="400" /></a></div>
<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<span style="font-family: "courier new";">Обрати внимание -
"Издание поставлено в очередь".<o:p></o:p></span></div>
<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<span style="font-family: "courier new";">В</span><span style="font-family: "courier new"; mso-ansi-language: EN-US;"> </span><span style="font-family: "courier new";">таблице</span><span lang="EN-US" style="font-family: "courier new"; mso-ansi-language: EN-US;"> All__Delivery<o:p></o:p></span></div>
<div class="MsoPlainText">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-Kebzheom0cg/W0noXeMlK8I/AAAAAAAAAYA/O0rGguI-jIopCNKQB-b78RmE6RetpbzcgCLcBGAs/s1600/8.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="483" data-original-width="647" height="297" src="https://4.bp.blogspot.com/-Kebzheom0cg/W0noXeMlK8I/AAAAAAAAAYA/O0rGguI-jIopCNKQB-b78RmE6RetpbzcgCLcBGAs/s400/8.jpg" width="400" /></a></div>
<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<span style="font-family: "courier new";">В
"Абонементе" на вкладке "Контроль"<o:p></o:p></span></div>
<div class="MsoPlainText">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-DdJrXPc_es4/W0nocBl6eqI/AAAAAAAAAYI/rGdm-xbiRFc4IpB8NkbgpFtVOn2a9HyJwCLcBGAs/s1600/9.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="709" data-original-width="779" height="363" src="https://3.bp.blogspot.com/-DdJrXPc_es4/W0nocBl6eqI/AAAAAAAAAYI/rGdm-xbiRFc4IpB8NkbgpFtVOn2a9HyJwCLcBGAs/s400/9.jpg" width="400" /></a></div>
<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<span style="font-family: "courier new";">Теперь посмотрим,
что будет происходить при возврате. Допустим, Иванов вернул книгу. Смотрим
All__Delivery<o:p></o:p></span></div>
<div class="MsoPlainText">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-fOpoMLYqtMs/W0nognckexI/AAAAAAAAAYQ/KrbNc13g1YIQcz7IHnW7BgMjZOCA_dwjgCLcBGAs/s1600/10.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="483" data-original-width="647" height="297" src="https://2.bp.blogspot.com/-fOpoMLYqtMs/W0nognckexI/AAAAAAAAAYQ/KrbNc13g1YIQcz7IHnW7BgMjZOCA_dwjgCLcBGAs/s400/10.jpg" width="400" /></a></div>
<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<span style="font-family: "courier new";">Строки
изменились. Сравни с предыдущим.<o:p></o:p></span></div>
<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<span style="font-family: "courier new";">Смотрим
"Контроль"<o:p></o:p></span></div>
<div class="MsoPlainText">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-Quug3yS03VI/W0no1AwkdwI/AAAAAAAAAYo/nmHl8S6O-HAVTrxPuUX3RQnzcfh7BUMxQCLcBGAs/s1600/11.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="709" data-original-width="779" height="363" src="https://2.bp.blogspot.com/-Quug3yS03VI/W0no1AwkdwI/AAAAAAAAAYo/nmHl8S6O-HAVTrxPuUX3RQnzcfh7BUMxQCLcBGAs/s400/11.jpg" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<span style="font-family: "courier new";">У Петрова стало
"Зарезервировано", у Сидорова по прежнему "Заказано".
Обрати внимание "Зарезервировано" может быть только одним читателем,
а "Заказано" многими. Если выберем в "Абонементе" Петрова,
то на вкладке "Выдача", без всякого поиска, его уже ожидает издание.<o:p></o:p></span></div>
<div class="MsoPlainText">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-I6qQH0JH0tM/W0nom5PY0JI/AAAAAAAAAYs/n1yeCzoiuQMNtb6P2W7CgttLQNU-9gkcACEwYBhgL/s1600/12.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="709" data-original-width="779" height="363" src="https://1.bp.blogspot.com/-I6qQH0JH0tM/W0nom5PY0JI/AAAAAAAAAYs/n1yeCzoiuQMNtb6P2W7CgttLQNU-9gkcACEwYBhgL/s400/12.jpg" width="400" /></a></div>
<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<span style="font-family: "courier new";">Остаётся только
сообщить ему об этом. Допустим, для разнообразия, что он отказался. Нажимаем
кнопку "Отменить заказ" и всё. Смотрим All__Delivery<o:p></o:p></span></div>
<div class="MsoPlainText">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-rOuYN_9ZACc/W0no9k_G65I/AAAAAAAAAYw/JgrZ4-BSGKMWdYuWbAcq58lEno_f8EJ2ACLcBGAs/s1600/13.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="483" data-original-width="647" height="297" src="https://4.bp.blogspot.com/-rOuYN_9ZACc/W0no9k_G65I/AAAAAAAAAYw/JgrZ4-BSGKMWdYuWbAcq58lEno_f8EJ2ACLcBGAs/s400/13.jpg" width="400" /></a></div>
<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<span style="font-family: "courier new";">Смотрим
"Контроль"<o:p></o:p></span></div>
<div class="MsoPlainText">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-zvkiHGRN_qA/W0npC0jiTpI/AAAAAAAAAY0/XGAJU8CW-DALYksOI_tRpgbxLEUDvFxSACLcBGAs/s1600/14.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="709" data-original-width="779" height="363" src="https://1.bp.blogspot.com/-zvkiHGRN_qA/W0npC0jiTpI/AAAAAAAAAY0/XGAJU8CW-DALYksOI_tRpgbxLEUDvFxSACLcBGAs/s400/14.jpg" width="400" /></a></div>
<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<span style="font-family: "courier new";">Смотрим Сидорова
на вкладке "Выдача"<o:p></o:p></span></div>
<div class="MsoPlainText">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/--Yglcwk_IY8/W0npIJvbKMI/AAAAAAAAAY4/WSYYWlMJzH0q5xvF51cTfZhCylM3dlcgACLcBGAs/s1600/15.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="709" data-original-width="779" height="363" src="https://2.bp.blogspot.com/--Yglcwk_IY8/W0npIJvbKMI/AAAAAAAAAY4/WSYYWlMJzH0q5xvF51cTfZhCylM3dlcgACLcBGAs/s400/15.jpg" width="400" /></a></div>
<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<span style="font-family: "courier new";">Но Сидоров
пользуется Интернетом<o:p></o:p></span></div>
<div class="MsoPlainText">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-mXIXzYk1TAQ/W0npMbQliXI/AAAAAAAAAY8/aUsWA_Uj39gzar5tOlFgYEqe-bF7C67EgCLcBGAs/s1600/16.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="689" data-original-width="783" height="351" src="https://3.bp.blogspot.com/-mXIXzYk1TAQ/W0npMbQliXI/AAAAAAAAAY8/aUsWA_Uj39gzar5tOlFgYEqe-bF7C67EgCLcBGAs/s400/16.jpg" width="400" /></a></div>
<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<span style="font-family: "courier new";">Теперь в колонке
"Статус" - "Зарезервировано". Значит, он может смело прийти
за изданием в библиотеку. Эта вкладка пока явно "недопилена". Кроме
"Статуса" и "Отдела выдачи" ничего не выводится. Зато есть
возможность отменить заказ.<o:p></o:p></span></div>
<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<span style="font-family: "courier new";">Как видишь ничего
сложного. Есть ещё множество полезных кнопок типа "Посмотреть очередь
заявок на издание", "Статистика заказов издания", фильтры на
вкладке "Контроль". Но это уже сам.<o:p></o:p></span><br />
<span style="font-family: "courier new";"><span style="font-family: "Times New Roman";">Есть вопросы - пиши в комментарий или на acbib3@yandex.ru.</span></span></div>
<br /></div>
Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-5957218827659569747.post-31846157658892476562018-01-12T05:56:00.000-08:002018-01-12T05:56:37.200-08:00Настройка IIS<div dir="ltr" style="text-align: left;" trbidi="on">
Сейчас стало популярным выставлять свой каталог в Интернет. А некоторые даже<br />
<br />
осуществляют обслуживание: принимают заказы, ведут очереди и т.д. С другой стороны<br />
<br />
установка и настройка веб-шлюза в АС-Библиотека-3 оставляет множество вопросов.<br />
<br />
Особенно в части настройки IIS под веб-шлюз. Не будем полагаться на установщик АС-3,<br />
<br />
а сделаем всё вручную. Причём упор будет сделан на минимальный набор модулей IIS,<br />
<br />
необходимых для функционирования веб-шлюза. В этом и будет заключаться "эксперимент".<br />
<br />
В чём смысл минимальности? Очень просто - сокращение "поверхности атаки". Чем больше<br />
<br />
механизмов (большей частью не нужных) находится в "активном" состоянии тем больше<br />
<br />
вероятности, что в каком-то найдётся "брешь". Кроме того это приводит к<br />
<br />
дополнительной нагрузке на систему. Я буду показывать на 2016-м сервере, хотя все<br />
<br />
необходимые модули, с теми же наименованиями, доступны в прежних версиях. В<br />
<br />
клиентских ОС (например "семёрке") они доступны через "Программы и компоненты"-<br />
<br />
>"Включение или отключение компонентов Windows". Кроме того, для 64-разрядных систем<br />
<br />
отметим дополнительное действие, для разрешения запуска 32-разрядных процессов (АС-3<br />
<br />
вся 32-разрядная).<br />
<br />
Итак, предположим, что установщик АС-Библиотека-3 уже создал папку "EWWW" и настроил<br />
<br />
веб-шлюз на локальный Z-сервер АС3 (они не обязательно должны быть на одном<br />
<br />
физическом компьютере). Запускаем "Мастер добавления ролей и компонентов" и отмечаем<br />
<br />
IIS.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-Dd9d-ZbAJMw/Wli6xa160TI/AAAAAAAAAVo/p6S3MfdpYcc3GT6HU8wuVzfAuEXkghXbgCLcBGAs/s1600/1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="560" data-original-width="786" height="452" src="https://4.bp.blogspot.com/-Dd9d-ZbAJMw/Wli6xa160TI/AAAAAAAAAVo/p6S3MfdpYcc3GT6HU8wuVzfAuEXkghXbgCLcBGAs/s640/1.jpg" width="640" /></a></div>
<br />
Жмём далее, соглашаемся с добавлением "консоли управления" и, далее, до "Выбора служб<br />
<br />
ролей".<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-OiucZK9Gjq0/Wli68cuUg5I/AAAAAAAAAVs/PNHHWkuH398AVuMrbeWIFL62Iy3K16ZSwCLcBGAs/s1600/2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="560" data-original-width="786" height="454" src="https://2.bp.blogspot.com/-OiucZK9Gjq0/Wli68cuUg5I/AAAAAAAAAVs/PNHHWkuH398AVuMrbeWIFL62Iy3K16ZSwCLcBGAs/s640/2.jpg" width="640" /></a></div>
<br />
<br />
В подразделе "Безопасность" нам понадобится элемент "Фильтрация запросов".<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-FFWjn5ZJEmo/Wli7Eh1BpwI/AAAAAAAAAVw/gOmNt5lc36sf_gegWXiu4CkmM0-Bz3HgACLcBGAs/s1600/3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="560" data-original-width="786" height="454" src="https://3.bp.blogspot.com/-FFWjn5ZJEmo/Wli7Eh1BpwI/AAAAAAAAAVw/gOmNt5lc36sf_gegWXiu4CkmM0-Bz3HgACLcBGAs/s640/3.jpg" width="640" /></a></div>
<br />
<br />
В общем то шлюз будет работать и без него, но если прочтёшь его описание (см.<br />
<br />
картинку выше), сразу станет ясно чем "прикрыть" вывод нежелательных файлов (см.<br />
<br />
статью "Шлюз"). Но об этом позже.<br />
В подразделе "Исправность и диагностика" потребуется необязательный элемент "Ведение<br />
<br />
журнала HTTP".<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-kQaWFEGCIm4/Wli7LIKxJDI/AAAAAAAAAV0/UUSg0OdtjukmVt3J13pNT-It13A6qpr8gCLcBGAs/s1600/4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="560" data-original-width="786" height="454" src="https://4.bp.blogspot.com/-kQaWFEGCIm4/Wli7LIKxJDI/AAAAAAAAAV0/UUSg0OdtjukmVt3J13pNT-It13A6qpr8gCLcBGAs/s640/4.jpg" width="640" /></a></div>
<br />
<br />
Это лог сервера IIS. В нём сохраняется вся активность пользователя - посещения сайта,<br />
<br />
что искали, что заказали и т.д. Вещь весьма полезная для статистики. Кроме того,<br />
<br />
можно вести учёт обращений. Одна проблема - нет парсера для обработки, а вручную<br />
<br />
разбирать не серьёзно. Но начать накапливать статистику можно уже сейчас. Будем<br />
<br />
считать этот элемент полезным.<br />
Далее "Общие функции HTTP".<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-U4qwnUT8kfw/Wli7RUOv2eI/AAAAAAAAAV8/ou7imPIox28KuQfl4EfiD30_yz3uYQq8QCLcBGAs/s1600/5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="560" data-original-width="786" height="454" src="https://4.bp.blogspot.com/-U4qwnUT8kfw/Wli7RUOv2eI/AAAAAAAAAV8/ou7imPIox28KuQfl4EfiD30_yz3uYQq8QCLcBGAs/s640/5.jpg" width="640" /></a></div>
<br />
"Документ по умолчанию" абсолютно не обязателен, если указать ссылку на сайт в виде<br />
<br />
http://xxxxxxxx.ru/Lib/Ewww.dll. Он просто добавит Ewww.dll для ссылки вида<br />
<br />
http://xxxxxxxx.ru/Lib. Ставить или нет, решай сам. Я выбрал, для демонстрации<br />
<br />
дальнейшей настройки.<br />
"Статическое содержимое" абсолютно необходим. Через него пойдут все картинки и<br />
<br />
вспомогательные файлы типа .css.<br />
<br />
"Производительность" можно полностью отключить. Картинки, как правило, уже сжаты<br />
<br />
JPEG, а текста мало.<br />
"Разработка приложений" - странное название. Разрабатывать ничего не придется, а вот<br />
<br />
выбрать "Расширения ISAPI" абсолютно необходимо, поскольку Ewww.dll - это и есть<br />
<br />
расширение ISAPI.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-gdQ119R7fkY/Wli7ZQ8je8I/AAAAAAAAAWA/ZZrznkLOKPs12G-xnrIK6EWT9-qVSArcACLcBGAs/s1600/6.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="560" data-original-width="786" height="454" src="https://3.bp.blogspot.com/-gdQ119R7fkY/Wli7ZQ8je8I/AAAAAAAAAWA/ZZrznkLOKPs12G-xnrIK6EWT9-qVSArcACLcBGAs/s640/6.jpg" width="640" /></a></div>
<br />
<br />
"FTP сервер" пропускаем. Из "Средства администрирования" выбираем "Консоль управления<br />
<br />
службами IIS".<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-bOfrrwr5-SM/Wli7fItjnZI/AAAAAAAAAWE/KURy7x3M1y0qnwaKg8CQq5nDW4xLP12bQCLcBGAs/s1600/7.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="560" data-original-width="786" height="454" src="https://3.bp.blogspot.com/-bOfrrwr5-SM/Wli7fItjnZI/AAAAAAAAAWE/KURy7x3M1y0qnwaKg8CQq5nDW4xLP12bQCLcBGAs/s640/7.jpg" width="640" /></a></div>
<br />
<br />
Остальные отметки можно снять. Далее жмём установить, и наблюдаем за процессом.<br />
<br />
Возможно, потребуется перезагрузка.<br />
Запускаем "Диспетчер служб IIS" из "Администрирование". Нужна небольшая настройка.<br />
Выделяем F16(F16\Администратор). F16 - это имя сервера, у тебя будет другое. Здесь<br />
<br />
настройки для всего сервера. Настроим необходимые, потом добавим "Виртуальный<br />
<br />
каталог" с АС-3 и завершим настройки.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-RQBw8hBSI18/Wli7lcyZVbI/AAAAAAAAAWI/7MSOjjMBfHwaApNFhAxLFZnidhbteglSgCLcBGAs/s1600/8.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="570" data-original-width="776" height="470" src="https://2.bp.blogspot.com/-RQBw8hBSI18/Wli7lcyZVbI/AAAAAAAAAWI/7MSOjjMBfHwaApNFhAxLFZnidhbteglSgCLcBGAs/s640/8.jpg" width="640" /></a></div>
<br />
<br />
Компонент "Ведение журнала". Здесь можно "подсмотреть" где IIS будет сохранять<br />
<br />
журналы. Можно оставить как есть. Важен выбор формата "W3C".<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-_B_VFzIUW2o/Wli7rTVWcAI/AAAAAAAAAWM/BhIFEc4d53MzvRf_AyZRFFexCMyyj1wiwCLcBGAs/s1600/9.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="570" data-original-width="776" height="470" src="https://3.bp.blogspot.com/-_B_VFzIUW2o/Wli7rTVWcAI/AAAAAAAAAWM/BhIFEc4d53MzvRf_AyZRFFexCMyyj1wiwCLcBGAs/s640/9.jpg" width="640" /></a></div>
<br />
<br />
И, возможно, я бы изменил "Переход на новый файл журнала->Расписание" на<br />
<br />
"Ежемесячно". Таким образом, за год будет 12 файлов, которые хорошо сожмутся любым<br />
<br />
архиватором.<br />
<br />
Далее "Ограничения ISAPI и CGI". Добавляем путь к EWww.dll и разрешаем выполнение<br />
<br />
пути расширения.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-aSnZSQr3NdM/Wli7xqh6wAI/AAAAAAAAAWU/4m7AfkAOmZcKaoO1-4Z7WfBxAp-eEaIMwCLcBGAs/s1600/10.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="240" data-original-width="415" height="231" src="https://1.bp.blogspot.com/-aSnZSQr3NdM/Wli7xqh6wAI/AAAAAAAAAWU/4m7AfkAOmZcKaoO1-4Z7WfBxAp-eEaIMwCLcBGAs/s400/10.jpg" width="400" /></a></div>
<br />
<br />
Результат на следующей картинке<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-Dq_RPoxCDUg/Wli77DkhsuI/AAAAAAAAAWY/jfLdQ8BPdIYaAJ6B-DfDwPbbBWSfTW_iQCLcBGAs/s1600/11.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="490" data-original-width="797" height="392" src="https://4.bp.blogspot.com/-Dq_RPoxCDUg/Wli77DkhsuI/AAAAAAAAAWY/jfLdQ8BPdIYaAJ6B-DfDwPbbBWSfTW_iQCLcBGAs/s640/11.jpg" width="640" /></a></div>
<br />
<br />
Теперь, действие, необходимое для 64 разрядных ОС (а серверные ОС теперь все 64-<br />
<br />
разрядные). Выделяем "Пулы приложений". Правой кнопкой по "DefaultAppPool" (в нём по<br />
<br />
умолчанию будет работать EWww.dll) вызываем контекстное меню и "Дополнительные<br />
<br />
параметры...". Разрешаем 32-разрядные приложения.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-KOMvOy_TBmY/Wli8CT7LlaI/AAAAAAAAAWc/575U5Id1lboXYvu0yT_ZiQFayaHpn_v5QCLcBGAs/s1600/12.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="543" data-original-width="436" height="400" src="https://4.bp.blogspot.com/-KOMvOy_TBmY/Wli8CT7LlaI/AAAAAAAAAWc/575U5Id1lboXYvu0yT_ZiQFayaHpn_v5QCLcBGAs/s400/12.jpg" width="320" /></a></div>
<br />
<br />
Настало время собственно "пристроить" наш сайт. Надо отметить, что вариантов здесь<br />
<br />
немало. Чтобы не вносить путаницу я сделаю так, как это, раньше, делал установщик.<br />
<br />
Поэтому просто добавим виртуальный каталог к сайту по умолчанию "Default Web Site".<br />
<br />
Щёлкаем по нему правой кнопкой и выбираем "Добавить виртуальный каталог...". В<br />
<br />
"Псевдониме" пишем "Lib" и указываем путь к папке "EWWW".<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-JpfGdMwpGOw/Wli8I20FRwI/AAAAAAAAAWg/qjkpyYWpLPcsGppq9l7yxqNEK4FsP8d9QCLcBGAs/s1600/13.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="362" data-original-width="440" height="327" src="https://2.bp.blogspot.com/-JpfGdMwpGOw/Wli8I20FRwI/AAAAAAAAAWg/qjkpyYWpLPcsGppq9l7yxqNEK4FsP8d9QCLcBGAs/s400/13.jpg" width="400" /></a></div>
<br />
<br />
Выделяем только что добавленный "Lib" и сделаем настройки, относящиеся только к нему.<br />
"Документ по умолчанию". Удаляем всё что есть (index.html, ...) и добавляем<br />
<br />
"EWww.dll".<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-ZyH150M5kHU/Wli8WUISToI/AAAAAAAAAWo/8-xwhFZwJ70Aaw0Smhpi37zKk6tNz2tgwCLcBGAs/s1600/14.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="497" data-original-width="677" height="468" src="https://3.bp.blogspot.com/-ZyH150M5kHU/Wli8WUISToI/AAAAAAAAAWo/8-xwhFZwJ70Aaw0Smhpi37zKk6tNz2tgwCLcBGAs/s640/14.jpg" width="640" /></a></div>
<br />
<br />
Далее "Сопоставление обработчиков". Щёлкаем правой кнопкой на "ISAPI-dll" и выбираем<br />
<br />
в контекстном меню строку "Изменение разрешений функции ...". Ставим галочку на<br />
<br />
"Выполнение".<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-7IOQ3R6OduE/Wli8dMo7xVI/AAAAAAAAAWs/PEtzxc4k9OAHuKnPTR2IVxBl5mkRulLogCLcBGAs/s1600/15.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="205" data-original-width="317" src="https://2.bp.blogspot.com/-7IOQ3R6OduE/Wli8dMo7xVI/AAAAAAAAAWs/PEtzxc4k9OAHuKnPTR2IVxBl5mkRulLogCLcBGAs/s1600/15.jpg" /></a></div>
<br />
<br />
Следующий компонент "Фильтрация запросов". Здесь можно ограничить доступ к некоторым<br />
<br />
элементам сайта, а именно к настройкам. Почему это важно смотри в архиве статью<br />
<br />
"Шлюз". Поскольку сам IIS прячет свои настройки в "Скрытые сегменты" я поступлю так<br />
<br />
же. Просто добавим "EWww.xml".<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-TlYStzOyaBM/Wli8oAf05UI/AAAAAAAAAWw/X2k_pbqS40UsFlDKueJtenhI9FayjayzQCLcBGAs/s1600/16.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="497" data-original-width="677" height="468" src="https://4.bp.blogspot.com/-TlYStzOyaBM/Wli8oAf05UI/AAAAAAAAAWw/X2k_pbqS40UsFlDKueJtenhI9FayjayzQCLcBGAs/s640/16.jpg" width="640" /></a></div>
<br />
<br />
Всё. Это тот минимум настроек IIS, необходимый для работы каталога в сети. Запускаем<br />
<br />
браузер. Набираем "http://localhost/Lib".<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-rjTB7Snc-1s/Wli81C9QkgI/AAAAAAAAAW4/7-H_40MLEpoB2JWCckm6kHbWFlTBbGuzgCLcBGAs/s1600/17.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="578" data-original-width="716" height="516" src="https://3.bp.blogspot.com/-rjTB7Snc-1s/Wli81C9QkgI/AAAAAAAAAW4/7-H_40MLEpoB2JWCckm6kHbWFlTBbGuzgCLcBGAs/s640/17.jpg" width="640" /></a></div>
<br />
<br />
Порядок настройки необязателен, но некоторые пункты зависят от предыдущих.<br />
Напоследок один полезный совет. Чтобы сервер надёжно "перечитал" настройки, иногда,<br />
<br />
бывает полезно завершить процесс "w3wp.exe" в диспетчере задач.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-so9fDGufaV4/Wli89BnnQ3I/AAAAAAAAAW8/S001oWQLShwKkZh31c5Q8UF_zQlpOpztACLcBGAs/s1600/18.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="304" data-original-width="533" height="363" src="https://4.bp.blogspot.com/-so9fDGufaV4/Wli89BnnQ3I/AAAAAAAAAW8/S001oWQLShwKkZh31c5Q8UF_zQlpOpztACLcBGAs/s640/18.jpg" width="640" /></a></div>
<br />
<br />
Это особенно актуально после изменения настроек самого шлюза в "EWww.exe".<br />
Что делать, если у тебя уже установлены лишние модули IIS, решай сам. Однако<br />
отключение указанных модулей или изменение их настроек приведёт к неработоспособности<br />
каталога.<br />
Есть вопросы - пиши в комментарий или на acbib3@yandex.ru.<br />
<br /></div>
Unknownnoreply@blogger.com3tag:blogger.com,1999:blog-5957218827659569747.post-78219682502474350142015-09-12T06:22:00.000-07:002018-01-09T06:14:50.594-08:00Время<div dir="ltr" style="text-align: left;" trbidi="on">
В посте "Статистика без "Статистика"" я упоминал об одном "пеньке" и обещал отдельную тему. Для начала настоятельно рекомендую прочитать статью "Григорианский календарь" на Википедии или другом ресурсе. Проблема (в том числе и 2000) не в самом времени, а в его учёте, обозначении и многочисленных форматах хранения. В АС-Библиотека-3 внутренний формат хранения даты "Офисный". Иными словами это число с плавающей точкой. Целая часть - кол-во дней с 01.01.1900. А дробная - часть дня.<br />
В строках Марк записей даты представлены различными форматами времени в виде обычных символьных строк и здесь мы их не рассматриваем.<br />
Сразу после перехода на MS SQL обнаружилась одна проблема - при SQL запросе происходит сдвиг ровно на двое суток. Конкретно - преобразование числа, представляющего дату, в дату получаем дату на двое суток больше, чем должно представлять число. При этом никаких проблем в работе модулей не возникало. Всё работало корректно.<br />
Вот пример.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-bX_nUi9lOPM/WlTNLzo8RuI/AAAAAAAAAVI/L8qvVypPSLkx0FafW1N0tLSITwn9S-2BACLcBGAs/s1600/1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="373" data-original-width="427" height="347" src="https://3.bp.blogspot.com/-bX_nUi9lOPM/WlTNLzo8RuI/AAAAAAAAAVI/L8qvVypPSLkx0FafW1N0tLSITwn9S-2BACLcBGAs/s400/1.jpg" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
Здесь ячейка слева в формате даты, а справа - в формате числа. Правая ячейка равна левой. Преобразуем это число в дату SQL запросом в Access (воспользуемся "Администратором").<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-eYGTr68pXEc/WlTNeagqSOI/AAAAAAAAAVM/HXQlZSUZnfY8GIaEviG9Me7-gBoeLHVyQCLcBGAs/s1600/2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="395" data-original-width="563" height="280" src="https://1.bp.blogspot.com/-eYGTr68pXEc/WlTNeagqSOI/AAAAAAAAAVM/HXQlZSUZnfY8GIaEviG9Me7-gBoeLHVyQCLcBGAs/s400/2.jpg" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
Дата совпадает - 28 августа. Теперь в MS SQL.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-P1043S_k1aQ/WlTNupqdn_I/AAAAAAAAAVU/C2PokTwV3EYWFC6AaQx6ghm48r-gsoy8QCLcBGAs/s1600/3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="464" data-original-width="595" height="311" src="https://2.bp.blogspot.com/-P1043S_k1aQ/WlTNupqdn_I/AAAAAAAAAVU/C2PokTwV3EYWFC6AaQx6ghm48r-gsoy8QCLcBGAs/s400/3.jpg" width="400" /></a></div>
<br />
<br />
Теперь число 42244 - это 30 августа! Почему? Ведь обе системы ведут отсчёт от 01.01.1900. Сразу оговорюсь, что совпадать они не обязаны, поскольку MS SQL не "Офис". Одни сутки находим сразу из документации. Оказывается, что Access ведёт отсчёт, начиная от 1, а MS SQL от 0. А где ещё одни сутки? Похоже проблема с учётом "супервисокосных" лет. Так и есть.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-CS12a_G4Hq8/VfQlIqy9YRI/AAAAAAAAAUM/s9Y7gngJAZA/s1600/4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://4.bp.blogspot.com/-CS12a_G4Hq8/VfQlIqy9YRI/AAAAAAAAAUM/s9Y7gngJAZA/s400/4.jpg" width="353" /></a></div>
<br />
Смотри строку три, дата 29.02.1900. Но такой даты в истории нет! В этом можно убедиться, если "отмотать" системный календарь.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-rgn3zKXEMgo/VfQlRvMQBPI/AAAAAAAAAUU/zmh8dCCMC3A/s1600/5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="330" src="https://1.bp.blogspot.com/-rgn3zKXEMgo/VfQlRvMQBPI/AAAAAAAAAUU/zmh8dCCMC3A/s400/5.jpg" width="400" /></a></div>
<br />
Таким образом, разница в представлении времени (в пределах, используемых в АС-Библиотека-3) в виде числа, между Access и MS SQL составляет ровно двое суток.<br />
Теперь главный вопрос - где эта особенность может проявиться? В обычной работе модулей АС-3 после многолетней эксплуатации под MS SQL "косяков" замечено не было. Похоже, что модули используют встроенные функции преобразования и используют движок базы исключительно как хранилище. Проблемы могут возникнуть, если писать собственные модули для "Статистики". При серьёзном администрировании базы обычно приходится делать SQL запросы. Если база MS SQL, то эту особенность также придётся учитывать.<br />
Ну и напоследок ещё несколько известных мне фактов, связанных со временем.<br />
При всех (насколько мне известно) операциях (выдача, создание записи и т.д.) производимых модулями АС-3 в базе фиксируется время клиента, а не сервера. Так что не забывай вовремя менять батарейки на системной плате. Иначе в базе появится "каша". Неплохо будет настроить сервер времени.<br />
<br />
В логической базе пользователей User, для хранения времени, вместо типа вещественное число, почему то используется тип строка, которая является числом. Может потребоваться дополнительное преобразование. В скриптах статистики используется следующая конструкция<br />
<br />
IF GetOptionValue( "Provider" ) = "1" THEN<br />
'Access<br />
Val = " VAL( "<br />
ELSE<br />
Val = " Convert( INT, "<br />
ENDIF<br />
<br />
Следующий 2016 год, как известно високосный. И ровно 29 февраля, при попытке вывести статистику "Распределение читателей" или "Регистрация читателей", появится следующая ошибка<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-JFDuOXAT2e8/VfQlcI0I7rI/AAAAAAAAAUc/0Nnti7a0ESw/s1600/6.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="417" src="https://2.bp.blogspot.com/-JFDuOXAT2e8/VfQlcI0I7rI/AAAAAAAAAUc/0Nnti7a0ESw/s640/6.jpg" width="640" /></a></div>
<br />
Я просто изменил системную дату для демонстрации. Ошибка происходит во встроенной функции AgeToBirthDate(). У меня есть сомнения насчёт её корректности. Но это ты можешь проверить сам. Выход - вывести статистику на следующий день.<br />
<br />
На этом всё. Пиши комментарии (регистрация не требуется) или на почту acbib3@yandex.ru<br />
<div>
<br /></div>
</div>
Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-5957218827659569747.post-52239843684542115562015-06-06T08:02:00.001-07:002015-06-06T08:02:11.780-07:00Штрих-код<div dir="ltr" style="text-align: left;" trbidi="on">
В модулях АС-Библиотека-3 периодически встречаются "намёки" на поддержку штрих-кода. Например, при выводе читательского билета, в модуле "Читатель", одно из полей должно представлять штрих-код.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-ildko0-jhZE/VXMIT3KciPI/AAAAAAAAASg/8PRetm3vjrM/s1600/1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="http://1.bp.blogspot.com/-ildko0-jhZE/VXMIT3KciPI/AAAAAAAAASg/8PRetm3vjrM/s640/1.jpg" width="532" /></a></div>
<br />
Но, вместо штрих-кода - обычные символы. В чём же дело? Если в Ворде активировать меню "Разработчик" и открыть свойства поля, то увидим следующую картину.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-jWtlMwxchDc/VXMIatL_gmI/AAAAAAAAASo/q8d3hnpvpuU/s1600/2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="http://2.bp.blogspot.com/-jWtlMwxchDc/VXMIatL_gmI/AAAAAAAAASo/q8d3hnpvpuU/s640/2.jpg" width="270" /></a></div>
<br />
Имя элемента F_010a является производным от Марк36 поля "010а", обозначающего штрих-код. А шрифт имеет весьма замысловатое название и явно не системный. Откроем папку "C:\Windows\Fonts" - такого шрифта здесь нет. Очевидно, система предложила замену. Но на самом деле он есть! Если прочитать тот же каталог в консоли, то увидим файл (в консоли отображаются имена файлов шрифтов, а не имена самих шрифтов).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-TXqpWvHeHdE/VXMIgoiHDDI/AAAAAAAAASw/NS8Nup8hlvE/s1600/3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="322" src="http://4.bp.blogspot.com/-TXqpWvHeHdE/VXMIgoiHDDI/AAAAAAAAASw/NS8Nup8hlvE/s640/3.jpg" width="640" /></a></div>
<br />
Здесь команда dir дополнена строкой *39*, которая ограничивает вывод файлами, содержащими в имени 39. Получили список из одного файла, который нам и нужен. Здесь же набираем его имя и жмём ENTER. Открывается окно просмотра шрифта.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-yNfLmllNW3Q/VXMIoURTtkI/AAAAAAAAAS4/uMc0fK0uNtI/s1600/4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="450" src="http://4.bp.blogspot.com/-yNfLmllNW3Q/VXMIoURTtkI/AAAAAAAAAS4/uMc0fK0uNtI/s640/4.jpg" width="640" /></a></div>
<br />
Нажимаем кнопку "Установить". Теперь повторно выводим читательский билет.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-FHEgVHBStq0/VXMIwvCzl7I/AAAAAAAAATA/SIxM4qsLO3M/s1600/5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="http://2.bp.blogspot.com/-FHEgVHBStq0/VXMIwvCzl7I/AAAAAAAAATA/SIxM4qsLO3M/s640/5.jpg" width="482" /></a></div>
<br />
Всё в порядке. Штрих-код на месте. Очевидно, установочная программа копирует файл шрифта в нужный каталог, а установку пропускает. Но, как видишь, это легко исправить вручную. Если дизайн билета тебе покажется "разлапистым", то вот такой вариант можно "наширять" за пару часов.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-TLb3wU7QKBc/VXMI1ox4UwI/AAAAAAAAATI/voz4SdOkhQ0/s1600/6.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="http://2.bp.blogspot.com/-TLb3wU7QKBc/VXMI1ox4UwI/AAAAAAAAATI/voz4SdOkhQ0/s640/6.jpg" width="620" /></a></div>
<br />
Что же это за загадочное число 39? Это просто часть обозначения стандарта кодирования "Code 39". Если наберёшь его в Википедии - получишь всю информацию. Я лишь отмечу свойство, позволяющее реализовать его в виде шрифта. Что это нам даёт? Ну, например вот:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-gnzHxBdwan4/VXMI8B_ShLI/AAAAAAAAATQ/-mkOb7ouBUs/s1600/7.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="358" src="http://1.bp.blogspot.com/-gnzHxBdwan4/VXMI8B_ShLI/AAAAAAAAATQ/-mkOb7ouBUs/s640/7.jpg" width="640" /></a></div>
<br />
Или вот<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-kg8JqcNbztY/VXMJKYlSdWI/AAAAAAAAATY/PXMaUVdz7eo/s1600/8.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="http://2.bp.blogspot.com/-kg8JqcNbztY/VXMJKYlSdWI/AAAAAAAAATY/PXMaUVdz7eo/s640/8.jpg" width="524" /></a></div>
<br />
Как я это сделал? Просто выбрал нужный шрифт (который мы только что установили:). А как тебе вот это?<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-d31pINBe3Y0/VXMJPRW-URI/AAAAAAAAATg/rTAz-wl8wBk/s1600/9.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="452" src="http://2.bp.blogspot.com/-d31pINBe3Y0/VXMJPRW-URI/AAAAAAAAATg/rTAz-wl8wBk/s640/9.jpg" width="640" /></a></div>
<br />
Здесь немного сложнее. Нужно соорудить небольшой скрипт, например такой:<br />
<br />
DIM i<br />
SetCardSize(60, 120)<br />
SetBlock( 1, 0, 0)<br />
FOR i = 1 TO FieldsGetCount(899)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>Print(GetFieldEx( 899, i, "p", 1 ), 0, 0 )<br />
NEXT<br />
NextPage()<br />
<br />
Этот скрипт выводит на карточку символы штрих-кодов экземпляров. Его необходимо сохранить в файл с любым именем (например "Штрихкод") и расширением ".crd", и поместить его в папку "ECatalog". После чего задать для карточки нужный шрифт. Заметь, что звёздочки здесь хранятся в базе. При большом размере шрифта, досадным образом, проявляется начальный перенос строки. Он присутствует на всех карточках. Его можно "убить" с клавиатуры и это, пока, единственный известный мне способ.<br />
Возможно печать единичного штрих-кода в "Каталогизаторе" имеет спортивный или вспомогательный интерес. Вообще, есть два подхода - сначала печатаем, потом присваиваем или сначала присваиваем, потом печатаем. Возможна и комбинация этих методов. Здесь важно соблюсти уникальность, там, где это необходимо. Поле штрих-кода, как и инвентарный номер, в АС-3 с настройками по умолчанию, на уникальность не проверяется.<br />
Вообще, для применения штрих-кода, в АС-3 можно найти немало мест. Это и есть то, что называется громким словом АВТОМАТИЗАЦИЯ.<br />
И ещё несколько моментов относительно Code 39. Звёздочки в начале и в конце последовательности обязательны, но, в зависимости от настроек, сканер может выдавать их, а может пропускать. Кроме того, последний символ последовательности может быть контрольным и также выдаваться или пропускаться. Это так же зависит от настроек. Контрольный символ повышает надёжность считывания, но добавляет изрядных хлопот. Настройка сканера, как правило, заключается в считывании последовательности специальных настроечных штрих кодов, которые предварительно распечатываются из руководства и сложности не представляет. Однако менять настройки по ходу работы, очевидно, не получится. В базе, также можно хранить штрих-коды со звёздочками и контрольным символом, а можно без них. И генерировать скриптом при печати. Поэтому всю схему лучше продумать заранее.<br />
В <a href="https://yadi.sk/d/VTLtAsAuh7YfN">АРХИВЕ</a> найдёшь файл под названием "FUNCTION_BarCode39.txt". Он содержит функцию, написанную на внутреннем скриптовом языке АС-3. Эта функция проверяет входную строку на допустимость в Code 39 и "заворачивает" строку звездочками. Если второй параметр = 1, то вычисляет контрольную сумму и добавляет в конец строки, согласно спецификации Code 39. Можешь использовать и модифицировать по своему усмотрению. Для применения нужно добавить её в конец (например) рабочего скрипта и вызвать в нужном месте. Если возникнут какие либо проблемы - сообщи.<br />
Несколько слов о сканерах. Мне пришлось эксплуатировать сканеры, подключаемые в разрыв клавиатуры PS/2. В таком случае ни компьютер, ни ПО не различает, откуда пришли символы с клавиатуры или со сканера. В таком режиме эксплуатации каких-то настроек в АС-3 вообще не требуется. Сейчас USB сканеры, также могут эмулировать клавиатуру. На данный момент встречаются модели от 2 до 5 т.р. и, как правило, читают Code 39.<br />
Чем и на чём печатать? Вопрос не тривиальный. Начиная от дорогих, специализированных, термопереносных принтеров штрих кода, до того, что есть под рукой. Для экспериментов достаточно последнего. Важны следующие параметры цена, стойкость и чёткость отпечатка, "размер уверенного считывания", удобство. "Самоклейка" здесь не помешает.<br />
С другой стороны, почти половина продукции идёт с уже готовым штрих-кодом. Диски, журналы... Это, как правило, разновидности "EAN 13" (также ищи в Википедии). ISBN и ISSN являются его особыми случаями. Ничто не мешает использовать их вперемежку с другими типами кодирования. Единственное что хотелось бы отметить - не все сканеры читают (или настроены на чтение) дополнительных полей ISSN, идентифицирующих журнал с точностью до номера (EAN 2 и EAN 5). Это важный момент.<br />
И, в конце, несколько слов о таком прогрессивном конкуренте, как RFID. Конечно, сказочная технология. Но, увы, пока только для "демонстративно дорогих" проектов. Без хорошего интегратора, с "ходовыми" испытаниями не менее полугода, здесь не обойтись. При этом нужно тщательно "следить за руками", иначе какая-то "мелочь" уронит все прелести. Я с подобными "мелочами" уже сталкивался. По крайней мере, пока расходники (метки) не станут торговаться с "открытыми" ценниками (нужно обращаться к менеджеру) - об этой технологии лучше забыть.<br />
Пиши комментарии (регистрация не требуется) или на почту acbib3@yandex.ru<br />
<br /></div>
Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-5957218827659569747.post-12978764268478110142015-05-16T06:42:00.004-07:002015-05-16T06:42:50.420-07:00Делаем статистику без "Статистики"<div dir="ltr" style="text-align: left;" trbidi="on">
В этом посте я хочу показать, как можно расширить "статистические" возможности АС-Библиотека-3 нештатными способами. Сразу оговорюсь, это лишь обзор с простыми примерами.<br />
<br />
Начнём с простого. Вопрос - какая книга самая выдаваемая? Если отбросить все тонкости, можно свести к вопросу какая запись самая выдаваемая? Открываем "Администратор", переходим на вкладку "SQL". Пишем SQL запрос (Да, да, к сожалению, без SQL никак не обойтись. В крайнем случае, можно просто скопировать. И не забудь первое правило админа - сделать резервную копию:):<br />
<br />
select top 10 SubDB, DocID, COUNT(DocID) as [Выдач] from All__Delivery<br />
where BookState = 'Завершено'<br />
group by SubDB, DocID<br />
order by COUNT(DocID) desc<br />
<br />
жмём "SQL Select" получаем результат.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-HZy_IjMg2zM/VVdC7uQZnXI/AAAAAAAAAQw/94jjVEpF45Q/s1600/1.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="465" src="http://4.bp.blogspot.com/-HZy_IjMg2zM/VVdC7uQZnXI/AAAAAAAAAQw/94jjVEpF45Q/s640/1.jpg" width="640" /></a></div>
<br />
<br />
<br />
Это первые 10 записей, с максимальной выдачей. Теперь достаточно открыть "Каталогизатор" и по имени логической базы (SubDB) и номеру записи (DocID) найти нужную запись.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-R0XLGqIaweY/VVdDQIvJ0FI/AAAAAAAAAQ4/1uMH2MLpHN0/s1600/2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="433" src="http://1.bp.blogspot.com/-R0XLGqIaweY/VVdDQIvJ0FI/AAAAAAAAAQ4/1uMH2MLpHN0/s640/2.jpg" width="640" /></a></div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-21oYhAYZdtw/VVdDXcmUxOI/AAAAAAAAARA/Tdm8PewyFPI/s1600/3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="434" src="http://4.bp.blogspot.com/-21oYhAYZdtw/VVdDXcmUxOI/AAAAAAAAARA/Tdm8PewyFPI/s640/3.jpg" width="640" /></a></div>
<br />
<br />
Понятно, что этот запрос "разовый" - результат не изменится ни завтра, ни послезавтра. Поэтому в данном случае нет смысла что-то усложнять, хватит и "Администратора".<br />
<br />
Однако таблицы скучны до безобразия. Добавим наглядной графики. Вспоминаем что база АС-3 - это база Access (если ты не перешёл на MS SQL). Иными словами это просто mdb файл. А значит, его можно открывать и обрабатывать "Офисными" средствами. Например, Excel. Но сначала подготовим запрос:<br />
<br />
select Weekday(DeliveryDate, 2) as [День недели], count(*) as [Посещений]<br />
from All__Delivery<br />
where BookState = 'Посещение'<br />
group by Weekday(DeliveryDate, 2)<br />
<br />
Здесь происходит подсчёт количества посещений, приходящихся на каждый день недели. В этом нам помогает функция Weekday(), она преобразует дату в день недели. Не ищи её в справочнике SQL, это функция VB (можно посмотреть в справке к Access). По этой причине для базы на MS SQL запрос будет такой:<br />
<br />
SET DATEFIRST 1;<br />
select DATEPART(weekday, cast((DeliveryDate-2) as datetime)) as [День недели], count(*) as [Посещений]<br />
from All__Delivery<br />
where BookState = 'Посещение'<br />
group by DATEPART(weekday, cast((DeliveryDate-2) as datetime))<br />
order by [День недели]<br />
<br />
Здесь всё из справочника, за исключением (DeliveryDate-2). Зачем минус два? Этот "пенёк" заслуживает отдельной статьи.<br />
<br />
Открываем Excel. Вкладка "Данные"->"Получить внешние данные"->"Из Access".<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-Pi7cTFTGWIo/VVdDnaPL74I/AAAAAAAAARI/11puRCtNsFM/s1600/4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="448" src="http://3.bp.blogspot.com/-Pi7cTFTGWIo/VVdDnaPL74I/AAAAAAAAARI/11puRCtNsFM/s640/4.jpg" width="640" /></a></div>
<br />
<br />
<br />
Появится диалог похожий на открытие файла. Выбираем файл базы.<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-Pn_6rbqcoqs/VVdDuJeKdGI/AAAAAAAAARQ/n0TW2WuXbtw/s1600/5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="478" src="http://3.bp.blogspot.com/-Pn_6rbqcoqs/VVdDuJeKdGI/AAAAAAAAARQ/n0TW2WuXbtw/s640/5.jpg" width="640" /></a></div>
<br />
<br />
Следующий диалог выбора таблицы - просто жмём Ок.<br />
Появится окошко "Импорт данных"<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-OkT469rcO2Y/VVdD0e_ciSI/AAAAAAAAARY/tquxlx-isiM/s1600/6.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="306" src="http://2.bp.blogspot.com/-OkT469rcO2Y/VVdD0e_ciSI/AAAAAAAAARY/tquxlx-isiM/s400/6.jpg" width="400" /></a></div>
<br />
<br />
Здесь оставляем всё как есть и нажимаем "Свойства". В свойствах подключения нас интересует вкладка "Определение"<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-LSGHGwy15bM/VVdD7s6k0_I/AAAAAAAAARg/VYM-ovvNPQc/s1600/7.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="http://3.bp.blogspot.com/-LSGHGwy15bM/VVdD7s6k0_I/AAAAAAAAARg/VYM-ovvNPQc/s640/7.jpg" width="563" /></a></div>
<br />
<br />
Здесь указываем "Тип команды": SQL, а в поле "Текст команды" копируем подготовленный скрипт.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-qSwtcThqPwo/VVdE1ZV7OZI/AAAAAAAAARo/HV4DWoHrxEw/s1600/8.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="http://3.bp.blogspot.com/-qSwtcThqPwo/VVdE1ZV7OZI/AAAAAAAAARo/HV4DWoHrxEw/s640/8.jpg" width="563" /></a></div>
<br />
<br />
Дальше всё зависит от того, работаешь ли ты с собственной копией базы (что я всячески рекомендую, кроме того офисный пакет на сервере это нонсенс) или с рабочей, параллельно с EServer. Если с копией, то ничего делать не надо. А если с рабочей, то в поле "Строка подключения" надо изменить параметры "Mode=Share Deny Write" на "Mode=Share Deny None" и "Jet OLEDB:Database Locking Mode=0" на "Jet OLEDB:Database Locking Mode=1", иначе ЗАБЛОКИРУЕШЬ РАБОТУ ОСТАЛЬНЫХ ПОЛЬЗОВАТЕЛЕЙ! Если в этот момент никто не работает с базой - тоже ничего страшного. Вообще тема режимов и блокировок для отдельной статьи. Здесь этого достаточно. Что касается MS SQL, то у него таких параметров просто нет.<br />
Жмём Ок и получаем табличку с данными нашего запроса.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-I4fvJaieJZ4/VVdFBYlF3mI/AAAAAAAAARw/13LEa79kmNs/s1600/9.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="448" src="http://1.bp.blogspot.com/-I4fvJaieJZ4/VVdFBYlF3mI/AAAAAAAAARw/13LEa79kmNs/s640/9.jpg" width="640" /></a></div>
<br />
<br />
Осталось вставить диаграмму. Вкладка "Вставка"->"Диаграммы"->"Гистограмма".<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-k_5Wj7aqipA/VVdFNTe2I7I/AAAAAAAAAR4/uN27tDpo4NE/s1600/10.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="448" src="http://4.bp.blogspot.com/-k_5Wj7aqipA/VVdFNTe2I7I/AAAAAAAAAR4/uN27tDpo4NE/s640/10.jpg" width="640" /></a></div>
<br />
Выбираем "Гистограмма с группировкой". Получаем диаграмму<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-OJ8UV1v-veg/VVdFqliXQ3I/AAAAAAAAASI/teXsBCUxFbM/s1600/11.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="596" src="http://2.bp.blogspot.com/-OJ8UV1v-veg/VVdFqliXQ3I/AAAAAAAAASI/teXsBCUxFbM/s640/11.jpg" width="640" /></a></div>
<br />
В принципе всё готово. Надо только немного окультурить. Щёлкаем правой кнопкой по диаграмме, выбираем пункт меню "Выбрать данные..."<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-6xE1yVLyju8/VVdFagAwAcI/AAAAAAAAASE/N-NYPthtBts/s1600/12.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="364" src="http://4.bp.blogspot.com/-6xE1yVLyju8/VVdFagAwAcI/AAAAAAAAASE/N-NYPthtBts/s640/12.jpg" width="640" /></a></div>
<br />
<br />
Здесь удаляем "День недели" - он уже идёт по горизонтали. Жмём Ок и выбираем "Экспресс стиль" по вкусу.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-7zAHoCzSO3Y/VVdGBPUKaNI/AAAAAAAAASQ/oUedV91IBzw/s1600/13.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="596" src="http://4.bp.blogspot.com/-7zAHoCzSO3Y/VVdGBPUKaNI/AAAAAAAAASQ/oUedV91IBzw/s640/13.jpg" width="640" /></a></div>
<br />
<br />
Это всё. Выглядит довольно громоздко, но на самом деле, при готовом запросе, занимает 5 минут. Можешь убедиться в этом, посмотрев небольшую видеодемонстрацию <a href="https://yadi.sk/i/I-yo8J2PgffTC">ЗДЕСЬ</a>. Только её надо скачать, иначе при перекодировке всё теряется.<br />
Так же можно работать и с MS SQL. Надо выбрать соответствующий источник данных. А настроить подключение не сложнее чем для EServer.<br />
Понятно, что вид и стиль диаграммы можно выбирать и менять на свой вкус. Но это ты найдёшь в букваре по Офису, а их написано не мало. Что-то наверняка завалялось и в твоей библиотеке.<br />
Ты спросишь, а как же Access. В нём возможностей даже больше чем в Excel. Это полноценная программируемая оболочка с графическими средствами и движком SQL.<br />
<br />
Статистические данные можно получать с помощью "hta скрипта". Эта технология была разработана для автоматизации задач администрирования. "Hta скрипт" представляет собой HTML страницу с JavaScript. Файл имеет расширение .hta и запускается в браузере. Если табличных данных недостаточно, можно "сваять" простенькую гистограмму DIV-ами. А можно подключить какую нибудь библиотеку визуализации графиков. Получится универсальное средство, для обработки статистических данных. Я использовал эту технологию в "Скрипте проверки БД".<br />
На этом пока всё. Пиши комментарии (регистрация не требуется) или на почту acbib3@yandex.ru<br />
<br />
P.S.<br />
В практике админа есть немало вещей, способных повергнуть в уныние. Но SQL в этом списке занимает особое место. Однако есть хорошая новость - если ты его осилишь, то это навсегда. Не многие технологии могут похвастаться такой фундаментальностью и долгожительством.<br />
<div>
<br /></div>
</div>
Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-5957218827659569747.post-53063133280482645202014-06-28T08:36:00.000-07:002015-05-30T07:16:05.199-07:00Опять потеряли обновление<div dir="ltr" style="text-align: left;" trbidi="on">
Проблема "потерянных обновлений" уже затрагивалась (см. архив "О вреде работы под Администратор 123"). Вот ещё один интересный пример. Предположим, обработчик начал модификацию некоторой записи.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-Et2zs8MHvNU/U67c5o_Vr-I/AAAAAAAAAOg/61nITk4T760/s1600/1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="288" src="http://2.bp.blogspot.com/-Et2zs8MHvNU/U67c5o_Vr-I/AAAAAAAAAOg/61nITk4T760/s1600/1.jpg" width="400" /></a></div>
<br />
<br />
Запись блокируется для изменения другим "Каталогизатором" (особенности см. в выше упомянутом посте).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-6LJXPkv7h98/U67c-QK7EII/AAAAAAAAAOo/LaA8zfUu6VQ/s1600/2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="288" src="http://4.bp.blogspot.com/-6LJXPkv7h98/U67c-QK7EII/AAAAAAAAAOo/LaA8zfUu6VQ/s1600/2.jpg" width="400" /></a></div>
<br />
<br />
Но изменение может совершить "Абонемент". Он меняет состояние записи при выдаче, возврате, заказе и т.д..<br />
Выдаём экземпляр произвольному пользователю.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-WveM6ict6yc/U67dDhX2qpI/AAAAAAAAAOw/1bDDdy-WsJM/s1600/3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="305" src="http://2.bp.blogspot.com/-WveM6ict6yc/U67dDhX2qpI/AAAAAAAAAOw/1bDDdy-WsJM/s1600/3.jpg" width="400" /></a></div>
<br />
Теперь, чтобы прочитать состояние экземпляра откроем ещё один "Каталогизатор".<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-j-LR83BWiCU/U67dHwUDZ2I/AAAAAAAAAO4/6BdDm6CIATk/s1600/4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="267" src="http://1.bp.blogspot.com/-j-LR83BWiCU/U67dHwUDZ2I/AAAAAAAAAO4/6BdDm6CIATk/s1600/4.jpg" width="400" /></a></div>
<br />
<br />
Видим, что экземпляр выдан. Теперь сохраним запись в первом "Каталогизаторе" и обновим во втором.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-cVNbZgH6ikM/U67dMSxT1iI/AAAAAAAAAPA/pnAdfoOFeRA/s1600/5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="266" src="http://1.bp.blogspot.com/-cVNbZgH6ikM/U67dMSxT1iI/AAAAAAAAAPA/pnAdfoOFeRA/s1600/5.jpg" width="400" /></a></div>
<br />
<br />
Свершилось чудо! Выданный экземпляр стал свободным! Попробуем выдать его ещё кому либо. И у нас это получается<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-Lyfr_MikL-0/U67dQuPcxSI/AAAAAAAAAPI/hOH1yVMIbhw/s1600/6.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="377" src="http://2.bp.blogspot.com/-Lyfr_MikL-0/U67dQuPcxSI/AAAAAAAAAPI/hOH1yVMIbhw/s1600/6.jpg" width="400" /></a></div>
<br />
<br />
Это происходит по той причине, что "Абонемент" не проверяет блокировку. А "Каталогизатор", впоследствии, просто "кладёт" модифицированную запись поверх записи, модифицированной "Абонементом" ("потеря обновления").<br />
Конечно, вероятность такого стечения обстоятельств невелико. Но она растёт на востребованных и свежих изданиях. Кроме того если что-то может случиться, оно обязательно ...<br />
К сожалению, эту "нескладуху" "скрипт проверки БД" (см. справа) отлавливает (пока) не полностью. Если экземпляр ошибочно выдан второй раз он этого не покажет. Но до этого всё в порядке.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-tjbx9CzSSmc/U67dVRl7k0I/AAAAAAAAAPQ/XDPaMxC8PoM/s1600/7.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="283" src="http://4.bp.blogspot.com/-tjbx9CzSSmc/U67dVRl7k0I/AAAAAAAAAPQ/XDPaMxC8PoM/s1600/7.jpg" width="400" /></a></div>
<br />
<br />
<a href="https://yadi.sk/i/Ev6JuJi6gxjzg">Видео по теме</a> (лучше скачать 8.5 Мб)<br />
Пиши комментарии (регистрация не требуется) или на почту acbib3@yandex.ru</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5957218827659569747.post-32801593451054158562014-05-24T05:09:00.002-07:002014-05-24T05:09:15.318-07:00Кто книгу заказал?<div dir="ltr" style="text-align: left;" trbidi="on">
Недавно обнаружилась одна особенность в поведении АС-Библиотека-3, при попытке заказа издания. Если пользователь не регистрируется в браузере, то заказ оформляется не на него, а на учетную запись, с которой WWW-Шлюз обращается к базе.<br />
Не критично, но довольно неприятно. Издание блокируется и приходится периодически отменять заказы. В базе появляются мусорные записи, которые непригодны даже для статистики (нет информации о заказчике). Кроме того, если заказчик добросовестный, то процедура выдачи значительно усложняется. Дело в том, что правильно заказанное издание сразу появляется на вкладке "Выдача", модуля "Абонемент". И остаётся лишь нажать кнопку "Выдать издание читателю". В противном случае необходимо вначале отменить заказ с учётной записи доступа к базе, а потом пройти всю процедуру, начиная с поиска. Поэтому этот случай действительно "противный".<br />
Справиться с этой проблемой довольно просто. Нужно создать фиктивную учётную запись пользователя, с которой WWW-Шлюз будет "доступаться" к базе. Причём держать её в "неперерегистрированном" (ужас) состоянии.<br />
Смотрим конкретно. Открываем браузер, находим произвольное издание и заказываем его без регистрации.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-4WJ0m5tPmuM/U4CJIVONDjI/AAAAAAAAANI/mxVADNsfFWI/s1600/1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-4WJ0m5tPmuM/U4CJIVONDjI/AAAAAAAAANI/mxVADNsfFWI/s1600/1.jpg" height="282" width="400" /></a></div>
<br />
<br />
Видим, что издание успешно заказано. Чтобы определить на кого, откроем в "Администратор" таблицу All__Delivery.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-PypBH4zs8L8/U4CJQOdECtI/AAAAAAAAANQ/3FZ9Kk-dFiM/s1600/2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-PypBH4zs8L8/U4CJQOdECtI/AAAAAAAAANQ/3FZ9Kk-dFiM/s1600/2.jpg" height="452" width="640" /></a></div>
<br />
<br />
Поле ReaderID соответствует Администратору. Открываем "Абонемент", ищем Администратора и на вкладке "Выдача" находим заказанное издание.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-bBNmOCcWfec/U4CJWI5C6UI/AAAAAAAAANY/F--MwYlPyRA/s1600/3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-bBNmOCcWfec/U4CJWI5C6UI/AAAAAAAAANY/F--MwYlPyRA/s1600/3.jpg" height="454" width="640" /></a></div>
<br />
<br />
Настройка шлюза (по умолчанию).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-6O_wzDXo75M/U4CJa1PSn7I/AAAAAAAAANg/04QLts2AnQ8/s1600/4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-6O_wzDXo75M/U4CJa1PSn7I/AAAAAAAAANg/04QLts2AnQ8/s1600/4.jpg" /></a></div>
<br />
<br />
(Для тех, кто интересуется безопасностью напомню, что настройки шлюза хранятся в файле EWww.xml, доступном из Интернет по умолчанию. См. пост "Шлюз" в архиве.)<br />
Теперь, как исправить. Отменим предыдущий заказ. Создадим фиктивного читателя.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-J_P9tfLh4pk/U4CJfCeESzI/AAAAAAAAANo/ohMpqswRwD0/s1600/5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-J_P9tfLh4pk/U4CJfCeESzI/AAAAAAAAANo/ohMpqswRwD0/s1600/5.jpg" height="488" width="640" /></a></div>
<br />
<br />
Учётные данные произвольны, только даты общей регистрации как можно раньше, чтобы пользователь не попал в статистику. Далее, логин и пароль заносим в настройки WWW-Шлюза.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-hRUkn3XaKnQ/U4CJjvzoxlI/AAAAAAAAANw/417rejiGaqI/s1600/6.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-hRUkn3XaKnQ/U4CJjvzoxlI/AAAAAAAAANw/417rejiGaqI/s1600/6.jpg" height="568" width="640" /></a></div>
<br />
<br />
Пробуем заказать (если прошло немного времени, надо перезапустить веб-сервер, чтобы шлюз перечитал настройки). Получаем ошибку.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-FeLWlnFD_Dk/U4CJntfTKwI/AAAAAAAAAN4/8KHMHh0tIlc/s1600/7.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-FeLWlnFD_Dk/U4CJntfTKwI/AAAAAAAAAN4/8KHMHh0tIlc/s1600/7.jpg" height="436" width="640" /></a></div>
<br />
<br />
Теперь регистрируемся. Всё в порядке.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-D7MRDlSTHRo/U4CJsn3EV9I/AAAAAAAAAOA/UCI7SyeXMRY/s1600/8.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-D7MRDlSTHRo/U4CJsn3EV9I/AAAAAAAAAOA/UCI7SyeXMRY/s1600/8.jpg" height="436" width="640" /></a></div>
<br />
<br />
Смотрим заказ в модуле "Абонемент".<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-FAJUxPLolcs/U4CJz25tVoI/AAAAAAAAAOI/EiA8cXeF2aU/s1600/9.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-FAJUxPLolcs/U4CJz25tVoI/AAAAAAAAAOI/EiA8cXeF2aU/s1600/9.jpg" height="476" width="640" /></a></div>
<br />
<br />
Криво. Но это всё, что можно сделать своими руками.<br />
<br />
И, раз уж мы здесь, хочу отметить один момент. В версии 3.3.43 была такая неприятность - если заказан конкретный экземпляр, то выдать можно только его. То есть с полки надо было взять именно этот экземпляр (инвентарный номер, штрих код ...). Или переоформлять как смотри выше. Из-за этого, вся система заказа была принята в штыки (в таком состоянии, увы, находится и сейчас). В версии 3.3.58 появился выбор "Зарезервированные" или "Все доступные".<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-tBVuc2YdNl4/U4CJ4nFQ21I/AAAAAAAAAOQ/sTT7VwHGYsA/s1600/10.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-tBVuc2YdNl4/U4CJ4nFQ21I/AAAAAAAAAOQ/sTT7VwHGYsA/s1600/10.jpg" height="476" width="640" /></a></div>
<br />
<br />
Теперь можно выдать любой свободный экземпляр.<br />
Система заказа мощный инструмент, но, к сожалению, им мало кто пользуется. Согласись, переться через весь город, зная, что книга есть, и экземпляр забронирован тобой, гораздо приятней.<br />
Добавил видео в посты "Транзакции" и "UAC нам в помощь" (см. архив)<br />
Пиши комментарии (регистрация не требуется) или на почту acbib3@yandex.ru<br />
<div>
<br /></div>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5957218827659569747.post-32562989192346777702014-05-17T05:27:00.001-07:002014-05-17T05:37:03.611-07:00А что у нас с индексами?<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<div class="MsoPlainText">
<span style="font-family: 'Courier New';">Работать с БД и
не затронуть тему индексов невозможно. Однако она настолько обширна, что одним
постом её не покрыть. Здесь лишь определимся с терминологией и рассмотрим общее
положение дел.</span></div>
<div class="MsoPlainText">
<span style="font-family: "Courier New";">Что мы знаем про
индексы? Они ускоряют поиск данных и занимают дополнительное пространство в
базе. Если первое видно сразу, то со вторым несколько сложнее.<o:p></o:p></span></div>
<div class="MsoPlainText">
<span style="font-family: "Courier New";">В "АС-Библиотека-3", некоторые
обычные таблицы (например, Demo_01003 Demo_01003X) также выполняют роль
индексов. Будем называть их программными индексами, а обычные - системными.
Поскольку программные индексы это обычные таблицы, они, в свою очередь,
проиндексированы системными. Так называемые "док" индексы (в
терминологии АС-Библиотека-3) содержат данные 090 полей, поэтому это не совсем индексы.<o:p></o:p></span></div>
<div class="MsoPlainText">
<span style="font-family: "Courier New";">Какова ситуация с
индексами в "АС-Библиотека-3"? В случае с SQL, процедура с
незатейливым названием sp_spaceused отвечает на этот вопрос:<o:p></o:p></span></div>
<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">EXEC sp_spaceused @updateusage = N'TRUE';<o:p></o:p></span></div>
<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<span style="font-family: "Courier New";">Вот скриншот с
рабочей базы<o:p></o:p></span></div>
<div class="MsoPlainText">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-sc5uLSN7MLg/U3dVGwBRVLI/AAAAAAAAAM4/VFSWMXEhL5M/s1600/1_Common.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-sc5uLSN7MLg/U3dVGwBRVLI/AAAAAAAAAM4/VFSWMXEhL5M/s1600/1_Common.jpg" height="448" width="640" /></a></div>
<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<span style="font-family: "Courier New";">Если перевести в
проценты, то 33% занимают данные, 66% - индексы и чуть больше 1% свободно. То
есть, на каждый байт информации приходится два байта информации о её
размещении! Естественно sp_spaceused "замеряет" только системные
индексы, так как программные, для неё, это обычные таблицы. Если база небольшая
то проблемы нет, а если за гигабайт, то с этим надо что-то делать.<o:p></o:p></span></div>
<div class="MsoPlainText">
<span style="font-family: "Courier New";">В случае с базой
"Access" подобный запрос мне неизвестен. Однако можно поступить
следующим образом. Сжать базу. Сделать копию. И, тупо, поудалять все индексы из
копии. Сжать её и сравнить размер с исходным. У меня получилось сокращение на
57%. Результат близкий, хотя не все системные индексы были удалены, а только
наиболее "ёмкие". А также удалены все программные (так было проще - с
каждым программным индексом удаляется как минимум два системных). Кроме того,
очевидно, что в Access и SQL системные индексы организованы по-разному. Если
надумаешь поэкспериментировать самостоятельно, вместо Access рекомендую
пользоваться менеджером БД вроде DATABASE.NET
(http://fishcodelib.com/Database.htm). Кстати он и сжимать умеет.<o:p></o:p></span></div>
<div class="MsoPlainText">
<span style="font-family: "Courier New";">Почему всё так?
Дело в том, что изначально, в АС-3, на всякий случай, проиндексировано ВСЁ! И
возиться с индексами ("затачивать") придётся тебе (если ты админ).
Так обстоят дела в любой относительно сложной системе на основе СУБД. К
сожалению одной "волшебной кнопки" здесь нет. Слишком сильно всё
завязано на условия эксплуатации. Хорошая новость в том, что работа с
программными индексами в АС-Библиотека-3 организована весьма неплохо. А про
системные и говорить нечего. Главное помнить, что индексы это не информация.
Это информация о размещении информации. Поэтому они возобновимы после удаления.
Создавая и удаляя индексы, мы можем ускорить работу и увеличить размер базы при
этом, и наоборот. <span style="background-color: #cccccc;"><i><b>Главный вопрос состоит в том, какие индексы использует АС-3 в
работе, а какие являются балластом. </b></i></span><o:p></o:p></span></div>
<div class="MsoPlainText">
<span style="font-family: "Courier New";">В SQL базах,
система индексирования гораздо более развитая по сравнению с Access и
возможностей по анализу и настройке больше.<o:p></o:p></span></div>
<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<span style="font-family: "Courier New";">И в конце. У меня
нет никакой информации о том, чтобы кто-то использовал скрипт проверки БД (см.
пост выше). Поэтому он не развивается. Всё зависит от твоей активности.<o:p></o:p></span></div>
<div class="MsoPlainText">
<span style="font-family: "Courier New";"><br /></span></div>
<div class="MsoPlainText">
<span style="font-family: "Courier New";">Пиши комментарии
(регистрация не требуется) или на почту acbib3@yandex.ru<o:p></o:p></span></div>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5957218827659569747.post-52353399340228065142014-01-23T06:05:00.000-08:002014-05-17T06:22:05.593-07:00UAC нам в помощь<div dir="ltr" style="text-align: left;" trbidi="on">
Начало года. Поэтому, для разгона, что-то простое.<br />
Время идёт. "Хрюша стареет" и постепенно становится историей. Новые "оси" каким-то образом проникают в хозяйство. Всё бы ничего, но этот UAC ... А мы его хрясь и отключим! Но не торопись. "Кто нам мешает, тот нам поможет". И вот в чём.<br />
Не является редкой ситуация, когда за одним компьютером закреплено несколько пользователей. При этом их требования к настройке модулей может быть различной. Разная острота зрения требует разного размера шрифта. Разные пароли необходимо каждый раз вводить вручную (ищи пост в архиве "О вреде работы под Администратор 123"), вместо того, чтобы "запомнить". По-разному настроенные колонки, шаблоны. Да мало ли что ещё?<br />
К сожалению АС-Библиотека-3 такой возможности не предоставляет, и настройки распространяются на всех пользователей сразу. Проблема заключается в том, что АС-3 хранит их в XML и INI файлах, лежащих в тех же каталогах что и сами модули, а не в профилях или ветках реестра, относящихся к текущему пользователю. С другой стороны UAC, любой модифицированный файл (из защищённой области) автоматически виртуализирует в профиле пользователя и будет прозрачно "подкладывать" вместо исходного. Понял в чём ФИШКА?<br />
Тогда давай посмотрим, как всё это работает. Для начала создадим две учётки в ОС с "Обычным доступом" то есть с правами обычного пользователя "биб1" и "биб2".<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-Ve_c-0L63lQ/UuEcP1saRoI/AAAAAAAAALs/N4zdB5PNiBg/s1600/1_account.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-Ve_c-0L63lQ/UuEcP1saRoI/AAAAAAAAALs/N4zdB5PNiBg/s1600/1_account.jpg" height="476" width="640" /></a></div>
<br />
<br />
Теперь создадим две учётки в АС-3 с правами "Библиотекарь", для простоты, с такими же логинами<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-Q-l_XLLXdmI/UuEcbeHhM-I/AAAAAAAAAL0/Vtkx3qL3F3I/s1600/2_account.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-Q-l_XLLXdmI/UuEcbeHhM-I/AAAAAAAAAL0/Vtkx3qL3F3I/s1600/2_account.jpg" height="476" width="640" /></a></div>
<br />
<br />
На данном этапе можно внести основные настройки в модулях, актуальные для всех пользователей, потому, что дальше они разойдутся (как правило, это сетевые настройки). То есть файлы будут скопированы и начнут самостоятельную "жизнь". Я пропущу это действие.<br />
Выполним вход в "биб1" и сделаем несколько настроек. В демонстрации я ограничился "Каталогизатор» - ом, для остальных модулей всё то - же самое. Просто "запомним" пароли для "биб1" для каждой базы и словаря<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-L_FLzcTS_-g/UuEclx_ofnI/AAAAAAAAAL8/K6EG9w-joEM/s1600/3_password.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-L_FLzcTS_-g/UuEclx_ofnI/AAAAAAAAAL8/K6EG9w-joEM/s1600/3_password.jpg" height="478" width="640" /></a></div>
<br />
<br />
и посмотрим, что произойдёт с файлами.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-7XmpugeT-Jw/UuEcxFK2J6I/AAAAAAAAAME/vRxDvgKxHt0/s1600/4_virtual_store.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-7XmpugeT-Jw/UuEcxFK2J6I/AAAAAAAAAME/vRxDvgKxHt0/s1600/4_virtual_store.jpg" height="482" width="640" /></a></div>
<br />
<br />
Появилась кнопка "Файлы совместимости". Жмём. Смотрим куда попали. У меня получилось<br />
<br />
"C:\Users\биб1\AppData\Local\VirtualStore\Program Files (x86)\АС-Библиотека-3\ECatalog"<br />
(в 32 разрядной ОС (x86) не будет; папка AppData скрытая)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-RWocEHa78zc/UuEdBg4JC0I/AAAAAAAAAMM/SMbHxATIArU/s1600/5_virtual_store.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-RWocEHa78zc/UuEdBg4JC0I/AAAAAAAAAMM/SMbHxATIArU/s1600/5_virtual_store.jpg" height="478" width="640" /></a></div>
<br />
<br />
Эти файлы ОС подсунет "Каталогизатору", когда его запустит пользователь "биб1".<br />
<br />
Далее входим как "биб2". "Запомним" пароли для "биб2". Увеличим размер шрифта. Поменяем местами "Заглавие" и "Автор". И, просто сократим вывод на вкладке "Инвентарные номера".<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-w66_XesKlNQ/UuEdVUA7mcI/AAAAAAAAAMU/1laZvq4klxU/s1600/6_catalog_bib2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-w66_XesKlNQ/UuEdVUA7mcI/AAAAAAAAAMU/1laZvq4klxU/s1600/6_catalog_bib2.jpg" height="478" width="640" /></a></div>
<br />
<br />
Попробуем открыть в проводнике профиль "биб1". Доступа нет, что неплохо в плане безопасности.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-IGjaSn45L2Q/UuEddR0Jl-I/AAAAAAAAAMc/j3qe7cCTYTU/s1600/7_access_denyed.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-IGjaSn45L2Q/UuEddR0Jl-I/AAAAAAAAAMc/j3qe7cCTYTU/s1600/7_access_denyed.jpg" height="478" width="640" /></a></div>
<br />
<br />
Теперь опять войдём в ОС под "биб1" и увидим, что все его настройки сохранились!<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-tiCCZld86z0/UuEdosPufWI/AAAAAAAAAMk/qL0zXkNQ2M8/s1600/8_conf_saved.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-tiCCZld86z0/UuEdosPufWI/AAAAAAAAAMk/qL0zXkNQ2M8/s1600/8_conf_saved.jpg" height="480" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br />
<a href="http://yadi.sk/d/-UoHSJRmMK37L" target="_blank">Видео по теме</a>. (<span style="font-family: 'Courier New'; font-size: 15px; line-height: 17px; text-align: justify;">Для просмотра лучше скачать)</span><br />
<br />
Как всегда пиши комментарии (регистрация не требуется) или на почту acbib3@yandex.ru.<br />
<br />
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5957218827659569747.post-72258594602025024982013-07-17T00:58:00.000-07:002013-07-17T00:59:51.901-07:00Ещё один повод отключить Лог.<div dir="ltr" style="text-align: left;" trbidi="on">
В одном из предыдущих постов ("Кто такой Auto?") я рекомендовал отключить Лог сервера, в случае не использования. И вот нашёлся ещё один повод. Наблюдая за сообщениями "Process Monitor" (где найти и как настроить см. пост "Lib.ldb") я заметил странную последовательность. Её легко воспроизвести следующим образом. Запускаем "Process Monitor", настраиваем его на PID Z-сервера. Запускаем "Администратор", подключаемся к любой базе, переходим на вкладку "SQL" набираем абракадабру<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-lmn9RJO7Vn0/UeZOD9IYVGI/AAAAAAAAALM/K_QK8JwAMu0/s1600/1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="275" src="http://1.bp.blogspot.com/-lmn9RJO7Vn0/UeZOD9IYVGI/AAAAAAAAALM/K_QK8JwAMu0/s400/1.jpg" width="400" /></a></div>
<br />
<br />
и выполняем запрос. Ты уже понял, что нам нужно просто сгенерить ошибку. Смотрим "Process Monitor".<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-ygb7u_DPat8/UeZOK_lLcPI/AAAAAAAAALU/JA39ePJ_Oy4/s1600/2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="468" src="http://3.bp.blogspot.com/-ygb7u_DPat8/UeZOK_lLcPI/AAAAAAAAALU/JA39ePJ_Oy4/s640/2.jpg" width="640" /></a></div>
<br />
<br />
Находим длинннннную последовательность обращений к файлу "EServer.log" - "Быстрые" операции запроса информации о файле и такая же "Быстрая" операция записи. То, что обращения происходят "Быстрым" ("Fast") методом это хорошо. Но почему записи идут ПО ОДНОМУ БАЙТУ? Инкремент смещения так же соответствует одному байту (см. выделение). Не иначе как запись сообщения об ошибке идёт по одному байту! А куда спешить? Не надо ошибаться.<br />
Можно взглянуть на стек (на его кусочек; у меня x64, в x32 будет по-другому)<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-jkrQUegvdd4/UeZOSNJHLMI/AAAAAAAAALc/va8u-hg_Upc/s1600/3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="498" src="http://1.bp.blogspot.com/-jkrQUegvdd4/UeZOSNJHLMI/AAAAAAAAALc/va8u-hg_Upc/s640/3.jpg" width="640" /></a></div>
<br />
<br />
Строки обозначенные "U" - пользовательский режим, "K" - режим ядра. Значить при выводе каждого символа происходит пересечение границы ядра ОС. Но главный вопрос - выполняется ли физический сброс данных на диск при каждой операции ввода-вывода, пока остаётся открытым. Простой инструмент для проверки этого мне не известен, а лезть отладчиком в ядро - занятие не для слабонервных. Да и "игра не стоит свеч". В любом случае пересечение границы ядра ОС при выводе каждого байта "бесценной" информации об ошибке достаточный повод для того, чтобы его просто отключить.<br />
И ещё один главный вопрос - кто виноват? В стеке фигурирует стандартная "Студийная" библиотека времени выполнения msvcrt.dll. По-видимому, это её работа. А если учесть, что в системе может быть установлена произвольная версия этой библиотеки...<br />
Но это уже тема для отдельного поста. Как всегда пиши комментарии (регистрация не требуется) или на почту acbib3@yandex.ru.<br />
<div>
<br /></div>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5957218827659569747.post-77199098047345713262013-06-06T04:54:00.000-07:002013-06-06T04:54:36.989-07:00Время жизни<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
Сколько приходилось сталкиваться с веб-мастерами, у всех одна болезнь - не настраивают время жизни документа. То ли руки не доходят, то ли не знают такую возможность. В результате браузер повторно забирает с сервера статические данные (изображения, стили ...) вместо того, чтобы взять их из локального кэша. Конечно, с распространением скоростных технологий с безлимитным тарифом, актуальность данной настройки снижается. Но так обстоят дела далеко не у всех (у веб-мастеров похоже, что так).<br />
Попробуй объяснить пользователю с мобильником и GPRS, что тебе лень было сделать пару кликов мышью - его дохлое соединение постоянно прокачивает маленькую пиктограмму "/Lib/images/history.gif" размером в полтора килобайта.<br />
Возможно, в результате массового игнорирования данной настройки, браузеры "научились" угадывать валидность по определённым алгоритмам, основанным на косвенной информации. Они ведь должны быть "турбо". Между тем, проблема решается парой кликов в IIS и двумя строчками в Apache. Лучше дать браузеру реальную информацию. Как ты уже понял, эту лёгкую задачу придётся решить и тебе, если ты эксплуатируешь АС-Библиотека-3 с WWW-шлюзом.<br />
Итак, открываем оснастку "Диспетчер служб IIS", проходим по веткам и выделяем папку "Имя компьютера\сайты\Default Web Site\Lib" (виртуальный каталог или приложение WWW-шлюза, если установка не стандартная нужно изменить)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-PA--1GTVtRE/UbB2tmly0TI/AAAAAAAAAKM/a8AsPF71rVM/s1600/1_1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://1.bp.blogspot.com/-PA--1GTVtRE/UbB2tmly0TI/AAAAAAAAAKM/a8AsPF71rVM/s400/1_1.jpg" width="400" /></a></div>
<br />
<br />
Выбираем элемент "Заголовки ответов" и жмём "Настроить стандартные заголовки ответов..."<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-cuVYX8UkD60/UbB2zXTbCbI/AAAAAAAAAKU/R2FcU7fR_6g/s1600/2_2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="512" src="http://4.bp.blogspot.com/-cuVYX8UkD60/UbB2zXTbCbI/AAAAAAAAAKU/R2FcU7fR_6g/s640/2_2.jpg" width="640" /></a></div>
<br />
<br />
,настраиваем параметры<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-aJDb5jIxzGs/UbB26Y1YWdI/AAAAAAAAAKc/RuylTiFIFs4/s1600/3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="394" src="http://2.bp.blogspot.com/-aJDb5jIxzGs/UbB26Y1YWdI/AAAAAAAAAKc/RuylTiFIFs4/s640/3.jpg" width="640" /></a></div>
<br />
Думаю, здесь всё понятно - через полгода (для примера, реальный срок выбери на основе своих соображений) браузер клиента обновит статические элементы. А они, скорее всего, будут теми же. Хотя кое-что надо бы изменить сразу - поменять логотип ИАНСа на свой, своей библиотеки (ещё ни разу не видел, чтобы кто-то сделал это!!!). Иначе клиенты начинают тупить по поводу - в чей каталог они попали? Просто отредактируй или создай новый файл Help_head.jpg с теми же размерами. После этого, ты вряд ли что-то будешь здесь менять. Конечно, скорее всего браузер выбросит эти файлы из кэша раньше, когда его размер достигнет предела и наши файлы окажутся самыми "старыми".<br />
Настройка повлияет на содержимое заголовков HTTP только для статических файлов. Динамический контент, тот, что генерируется ISAPI расширением Ewww.dll, останется тем же. Проверим это с помощью Fiddler. Вот трассировка загрузки<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-SfX7nv7Xb6U/UbB3CiHsi3I/AAAAAAAAAKk/YBWIdHyz7cE/s1600/4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="482" src="http://1.bp.blogspot.com/-SfX7nv7Xb6U/UbB3CiHsi3I/AAAAAAAAAKk/YBWIdHyz7cE/s640/4.jpg" width="640" /></a></div>
<br />
динамический<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-qjg1SdgJlYc/UbB3IwmA0jI/AAAAAAAAAKs/wz2TtLoO5H4/s1600/5_1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="482" src="http://2.bp.blogspot.com/-qjg1SdgJlYc/UbB3IwmA0jI/AAAAAAAAAKs/wz2TtLoO5H4/s640/5_1.jpg" width="640" /></a></div>
<br />
статический - таблица стилей (здесь max-age в секундах),<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-9X0ALb2PIrI/UbB3Q392J3I/AAAAAAAAAK0/8s6plACtbrc/s1600/6_1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="482" src="http://3.bp.blogspot.com/-9X0ALb2PIrI/UbB3Q392J3I/AAAAAAAAAK0/8s6plACtbrc/s640/6_1.jpg" width="640" /></a></div>
<br />
статический - изображение JPEG.<br />
<br />
И напоследок одна забавная плюшка. Если в качестве браузера использовать IE любой версии и в настройках "Сервис\Свойства обозревателя\История просмотра\Параметры" указать "Проверять наличие обновления сохранённых страниц: никогда" (чем иногда пользуются некоторые умники вроде меня, для сокращения объёма трафика)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-VeWpWvSp3BQ/UbB3W46F7gI/AAAAAAAAAK8/r02mylCyESk/s1600/10.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="http://3.bp.blogspot.com/-VeWpWvSp3BQ/UbB3W46F7gI/AAAAAAAAAK8/r02mylCyESk/s640/10.jpg" width="518" /></a></div>
<br />
то никогда ничего не будет найдено, даже если оно есть! Проверь сам. Секрет в том, что сайт построен на фреймах и фрейм результата не обновляется. Если его обновить принудительно (только через контекстное меню на пустом поле таблицы результатов поиска), то всё "найдётся". Теоретически это можно исправить - надо перехватить инициативу на сервере и вставить обработчик события, принудительно обновляющий фрейм. Но выглядеть это будет весьма коряво, да и процент пользователей попадающих под данный баг невелик. Думаю, лучше дождаться официального исправления. На этом всё. Как всегда комментируй, или пиши на acbib3@yandex.ru<br />
<div>
<br /></div>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5957218827659569747.post-67118132834618943912013-04-10T07:17:00.000-07:002013-04-10T07:17:34.587-07:00Кто такой Auto?<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
Недавно ко мне обратились с просьбой разобраться с одной непонятной ситуацией. Весьма известному лицу приписывалось авторство, по несвойственной ему теме. Если учесть, что каталог представлен в Интернет, проблема была довольно щекотливой. Поиск в "лог-таблицах" показал, что последним, кто модифицировал эту запись, был некто "Auto". В результате анализа было выявлено интересное свойство "АС-Библиотека-3" при работе со словарём.<br />
Посмотрим, как это работает в "Демо". Создадим три "почти пустых" записи.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-OxRj5oBHBjE/UWVvafdGrFI/AAAAAAAAAIY/_9hmIaW44pc/s1600/Cat.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="310" src="http://4.bp.blogspot.com/-OxRj5oBHBjE/UWVvafdGrFI/AAAAAAAAAIY/_9hmIaW44pc/s400/Cat.jpg" width="400" /></a></div>
<br />
Причём первая и третья отличаются, только заглавием. В первой записи свяжем поле 700 (Имя лица - первичная интеллектуальная ответственность) с записью в словаре "ААААА", которую предварительно создадим<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-q3mN5EimVlk/UWVvod2XF3I/AAAAAAAAAIg/0ZzcCEvbit8/s1600/CatVoc.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="http://2.bp.blogspot.com/-q3mN5EimVlk/UWVvod2XF3I/AAAAAAAAAIg/0ZzcCEvbit8/s640/CatVoc.jpg" width="590" /></a></div>
<br />
<br />
(здесь каталогизатор в режиме словаря).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-uUs8bV31Ofo/UWVv1ocB5fI/AAAAAAAAAIo/LKysSkop1Uw/s1600/Cat_1_1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="http://3.bp.blogspot.com/-uUs8bV31Ofo/UWVv1ocB5fI/AAAAAAAAAIo/LKysSkop1Uw/s640/Cat_1_1.jpg" width="635" /></a></div>
<br />
Во второй записи с тем же значением из словаря свяжем поле 600 (Имя лица как предмет).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-DPtUm3UOVpI/UWVv9s8EZ7I/AAAAAAAAAIw/BCciWQ4rh9s/s1600/Cat_1_2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="http://2.bp.blogspot.com/-DPtUm3UOVpI/UWVv9s8EZ7I/AAAAAAAAAIw/BCciWQ4rh9s/s640/Cat_1_2.jpg" width="636" /></a></div>
<br />
<br />
Третья запись аналогична первой.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-CegI57sGPR8/UWVwOFI6fdI/AAAAAAAAAI4/vajOvvbOMIw/s1600/Cat_1_3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="http://2.bp.blogspot.com/-CegI57sGPR8/UWVwOFI6fdI/AAAAAAAAAI4/vajOvvbOMIw/s640/Cat_1_3.jpg" width="636" /></a></div>
<br />
<br />
Теперь очистим лог-таблицу Demo__Log командой<br />
delete from Demo__Log<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-w-KCJDoeLfo/UWVwUhWqCvI/AAAAAAAAAJA/IuchpRzkc1o/s1600/Admin1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="456" src="http://2.bp.blogspot.com/-w-KCJDoeLfo/UWVwUhWqCvI/AAAAAAAAAJA/IuchpRzkc1o/s640/Admin1.jpg" width="640" /></a></div>
<br />
<br />
и изменим значение поля 700 первой записи с "ААААА" на "БББББ"<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-2jDxc_gCBcE/UWVwdHDTj1I/AAAAAAAAAJI/Bw2UCZpsmuk/s1600/PersName.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="486" src="http://2.bp.blogspot.com/-2jDxc_gCBcE/UWVwdHDTj1I/AAAAAAAAAJI/Bw2UCZpsmuk/s640/PersName.jpg" width="640" /></a></div>
<br />
<br />
перечитаем, используя для поиска поле "Заглавие"="Заглавие" с усечением справа и посмотрим на результат. С первой всё понятно<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-chukW8KRYK8/UWVwj8ArguI/AAAAAAAAAJQ/ZLBbhbtW63w/s1600/Cat_2_1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="http://2.bp.blogspot.com/-chukW8KRYK8/UWVwj8ArguI/AAAAAAAAAJQ/ZLBbhbtW63w/s640/Cat_2_1.jpg" width="602" /></a></div>
<br />
<br />
Во второй записи поле 600а автоматически изменено на "БББББ"<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-qnlMQ6gFo7U/UWVwrHI42TI/AAAAAAAAAJY/DPmPZQIrht0/s1600/Cat_2_2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="http://1.bp.blogspot.com/-qnlMQ6gFo7U/UWVwrHI42TI/AAAAAAAAAJY/DPmPZQIrht0/s640/Cat_2_2.jpg" width="602" /></a></div>
<br />
<br />
В третьей ещё интересней - 700а изменилось на "БББББ", а 200f осталось "ААААА"<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-Pigm8JMxkMY/UWVwxjT62VI/AAAAAAAAAJg/7j4uT-_Jzl4/s1600/Cat_2_3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="http://4.bp.blogspot.com/-Pigm8JMxkMY/UWVwxjT62VI/AAAAAAAAAJg/7j4uT-_Jzl4/s640/Cat_2_3.jpg" width="602" /></a></div>
<br />
<br />
Прочитаем таблицу Demo__Log<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-yyrrEcvDXxI/UWVw3hM1pKI/AAAAAAAAAJo/DJF_c727oJA/s1600/Admin2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="474" src="http://1.bp.blogspot.com/-yyrrEcvDXxI/UWVw3hM1pKI/AAAAAAAAAJo/DJF_c727oJA/s640/Admin2.jpg" width="640" /></a></div>
<br />
<br />
вот, тот Auto, который "зловредно" изменяет записи. Кроме того, по крайней мере, в версии 3.3.58 на "Log уровне" "app" (по умолчанию)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-sI8ceDSLQuw/UWVw_RfPf8I/AAAAAAAAAJw/VrIDD9B7GjA/s1600/Prop.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="http://1.bp.blogspot.com/-sI8ceDSLQuw/UWVw_RfPf8I/AAAAAAAAAJw/VrIDD9B7GjA/s400/Prop.jpg" width="390" /></a></div>
<br />
<br />
, замечена одна особенность - сразу после закрытия окна модификации "Имя лица" и до нажатия кнопки "Сохранить запись" (основную), Z-сервер заваливает лог-файл сообщениями о невозможности модификации записи с DocID=82 (первая запись) так как она блокирована пользователем, то есть мной.<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-QRP0PHAgtMA/UWVxJ_cDn-I/AAAAAAAAAJ4/1ag3P0K4am0/s1600/Lock.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="601" src="http://4.bp.blogspot.com/-QRP0PHAgtMA/UWVxJ_cDn-I/AAAAAAAAAJ4/1ag3P0K4am0/s640/Lock.jpg" width="640" /></a></div>
<br />
<br />
Судя по тексту сообщения - жалуется отдельный индексирующий поток. Он анонимный, поэтому подписывается как Auto.<br />
Есть ли предел и сколько сообщений будет выдано - не знаю, но очень много. Вроде бы в версии 3.3.64 это исправлено, однако это надо проверять.<br />
<br />
Теперь соберём всё в кучу:<br />
1. Свойство автоматического обновления сразу всех записей, связанных со словарной записью "Имя лица" весьма полезно при последовательном изменении в связи с появлением или изменением доступной информации о лице. Однако не помешало бы уведомление со стороны программы об изменении не только текущей записи.<br />
2. Следи за "Новичками". Они часто не различают понятия "создать новую запись" и "модифицировать существующую".<br />
3. Если система работает стабильно и ошибок нет - экономь ресурс диска, отключи вывод лога. Поставь в "Параметры сервера" "Log уровень" в "none"<br />
<br />
Как всегда - комментируй (регистрация не требуется) или пиши на адрес acbib3@yandex.ru<br />
<div>
<br /></div>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5957218827659569747.post-33695797165862315712013-01-16T00:51:00.000-08:002013-01-16T00:51:24.435-08:00Жмём базу!<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
Начнём с Access, а закончим MS SQL Express.<br />
Одной из первых серьёзных проблем, с которой пришлось столкнуться - отсутствие 2/3 записей базы. Произошло это сразу после перегона базы из формата АС-2 в АС-3. Поиск по номеру записи показывал присутствие всех, но поиск по автору и другим полям был катастрофическим.<br />
В общем, странность прояснилась сразу после сжатия базы. Оказалось, что процесс индексации (в терминах АС-3) страшным образом потребляет ресурсы базы, она распухает на глазах, и по достижении порога в 2Гб тихо останавливается без всякой ругани. Если ты не знал об этом - возьми на заметку. Знаю, что многие напоролись на этот феномен, и если бы эта инфа была в паблике на тот момент - мне удалось бы сэкономить несколько недель на более полезные дела. Поэтому в скобках приведу несколько фраз исключительно для поисковика (нет половины базы, АС-Библиотека-3 не находит записи, пропали записи в АС-Библиотека-3).<br />
Итак, чем жмём? Естественно Access-ом, скажешь ты. А если для базы выделен отдельный компьютер. Держать на нём офис исключительно для сжатия? А если это выделенный сервер, то даже устанавливать на него офис - есть нонсенс. Существует крайне простая, маленькая и бесплатная утилита под названием JetComp (условия использования на странице продукта и в архиве). Просто вбей название в поисковой строке на сайте Microsoft. Использовать её крайне просто.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-4obDbPGb0cM/UPZnefgyt4I/AAAAAAAAAHM/PBlb_3LRv0U/s1600/1_JK.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="262" src="http://3.bp.blogspot.com/-4obDbPGb0cM/UPZnefgyt4I/AAAAAAAAAHM/PBlb_3LRv0U/s400/1_JK.jpg" width="400" /></a></div>
<br />
В верхней строке указываем базу, а в нижней - имя файла, в котором окажется сжатая база. Я просто копировал путь и добавлял единичку к имени файла. Остальные параметры как есть. После исходный файл удалял, а новый переименовывал. По сравнению со сжатием в Access, здесь есть дополнительный манёвр, на случай нехватки места на разделе диска, можно сжать в файл на другом разделе. Я успешно эксплуатировал эту утилиту в течение двух лет, до перехода на MS SQL.<br />
Если этого мало вот ещё один вариант. Оснастка "Источники данных ODBC" (Панель управления ->Система и безопасность->Администрирование).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-EF5u8NZRGYg/UPZnysdvGbI/AAAAAAAAAHU/rnmFXHl1vcI/s1600/1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="318" src="http://2.bp.blogspot.com/-EF5u8NZRGYg/UPZnysdvGbI/AAAAAAAAAHU/rnmFXHl1vcI/s400/1.jpg" width="400" /></a></div>
<br />
Но такая возможность есть не во всех версиях ОС. Например, в моей текущей семёрке нет. Точнее драйвер Jet есть, а доступа через ODBC нет. С другой стороны в предварительном релизе Srv2012 есть<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-SZlX2FG5tvY/UPZoG5ttFSI/AAAAAAAAAHk/VASxWMltJRE/s1600/ODBC_2012.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="333" src="http://4.bp.blogspot.com/-SZlX2FG5tvY/UPZoG5ttFSI/AAAAAAAAAHk/VASxWMltJRE/s400/ODBC_2012.jpg" width="400" /></a></div>
<br />
Не будем долго с этим париться. Если есть - грех не воспользоваться. Итак, на вкладке "Пользовательский DSN" жмём кнопку "Добавить...". В появившемся окне выбираем "Microsoft Access Driver (*.mdb)" и жмём "Готово".<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-y9qaiQ7ldfQ/UPZoVEsRj9I/AAAAAAAAAHs/11UxHdZS0hY/s1600/2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="375" src="http://1.bp.blogspot.com/-y9qaiQ7ldfQ/UPZoVEsRj9I/AAAAAAAAAHs/11UxHdZS0hY/s400/2.jpg" width="400" /></a></div>
<br />
В следующем окне появляется заветная кнопка "Сжать...".<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-oAfw8bMn7Y8/UPZn633tW8I/AAAAAAAAAHc/9-xh1841ETM/s1600/3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="365" src="http://1.bp.blogspot.com/-oAfw8bMn7Y8/UPZn633tW8I/AAAAAAAAAHc/9-xh1841ETM/s400/3.jpg" width="400" /></a></div>
<br />
Нажимаем и, в диалоге, указываем базу для сжатия.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-PLLXyCx1lBY/UPZojKUPx6I/AAAAAAAAAH0/Z7YTG5PtLJU/s1600/4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="361" src="http://3.bp.blogspot.com/-PLLXyCx1lBY/UPZojKUPx6I/AAAAAAAAAH0/Z7YTG5PtLJU/s400/4.jpg" width="400" /></a></div>
<br />
Нажимаем ОК. В следующем окне указываем имя файла, в который будет сжиматься база. Все, как и в JetComp, но не забудь установить "Формат" в "Версия 4.x".<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-omgML8bzpx0/UPZoqWZV7yI/AAAAAAAAAH8/eDuKbO1KcfA/s1600/5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="365" src="http://4.bp.blogspot.com/-omgML8bzpx0/UPZoqWZV7yI/AAAAAAAAAH8/eDuKbO1KcfA/s400/5.jpg" width="400" /></a></div>
<br />
Жмём ОК и ждём результат.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-rD0FAIKqEFo/UPZowfVBZtI/AAAAAAAAAIE/k4U6hVcvMm0/s1600/6.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="363" src="http://3.bp.blogspot.com/-rD0FAIKqEFo/UPZowfVBZtI/AAAAAAAAAIE/k4U6hVcvMm0/s400/6.jpg" width="400" /></a></div>
<br />
<br />
Далее отменяем всё до кнопки "Сжать..." и жмём следующую базу. После этого закрываем все окна, удаляем старые базы и переименовываем новые. Как видишь, мы ничего не создаём, хотя, исключительно для удобства, можно создать "Пользовательский DSN" и использовать его в качестве ссылки.<br />
Возникает вопрос. Какой метод лучше? С точки зрения собственно сжатия не имеет значения. Раскрою маленький секрет. Функция сжатия реализована в самом движке Jet. И Access и JetComp и ODBC драйвер всего лишь запускают одну и ту же функцию интерфейса IJetCompact, реализованную в движке. Поэтому при выборе средства для сжатия можно ограничиться соображениями удобства.<br />
<br />
Теперь SQL. Я коснусь бесплатной версии Express. Его возможностей стало хватать ещё больше после того как в версии 2008 R2 была поднята планка размера б.д. до 10Гб. Платные версии редкий зверь для библиотеки, хотя если задействовать его мощь по полной ...<br />
Собственно функцию сжатия можно запустить в оболочке "SQL Server Management Studio" - это не секрет. Тонкость заключается в предварительной дефрагментации индексов. Следующий скрипт ищет в базе все индексы, с фрагментацией более 10% и обрабатывает. Это не самопал. Скрипт взят из документации Microsoft к SQL Server. При желании найдёшь его там (плюс дополнительная инфа!). Если желания нет - просто скопируй его в студию, установи контекст базы для обработки (см. первый комментарий) и запусти.<br />
<br />
<i style="background-color: #cccccc;">-- Ensure a USE <databasename> statement has been executed first.</i><br />
<i style="background-color: #cccccc;">SET NOCOUNT ON;</i><br />
<i style="background-color: #cccccc;">DECLARE @objectid int;</i><br />
<i style="background-color: #cccccc;">DECLARE @indexid int;</i><br />
<i style="background-color: #cccccc;">DECLARE @partitioncount bigint;</i><br />
<i style="background-color: #cccccc;">DECLARE @schemaname nvarchar(130); </i><br />
<i style="background-color: #cccccc;">DECLARE @objectname nvarchar(130); </i><br />
<i style="background-color: #cccccc;">DECLARE @indexname nvarchar(130); </i><br />
<i style="background-color: #cccccc;">DECLARE @partitionnum bigint;</i><br />
<i style="background-color: #cccccc;">DECLARE @partitions bigint;</i><br />
<i style="background-color: #cccccc;">DECLARE @frag float;</i><br />
<i style="background-color: #cccccc;">DECLARE @command nvarchar(4000); </i><br />
<i style="background-color: #cccccc;">-- Conditionally select tables and indexes from the sys.dm_db_index_physical_stats function </i><br />
<i style="background-color: #cccccc;">-- and convert object and index IDs to names.</i><br />
<i style="background-color: #cccccc;">SELECT</i><br />
<i style="background-color: #cccccc;"> object_id AS objectid,</i><br />
<i style="background-color: #cccccc;"> index_id AS indexid,</i><br />
<i style="background-color: #cccccc;"> partition_number AS partitionnum,</i><br />
<i style="background-color: #cccccc;"> avg_fragmentation_in_percent AS frag</i><br />
<i style="background-color: #cccccc;">INTO #work_to_do</i><br />
<i style="background-color: #cccccc;">FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, 'LIMITED')</i><br />
<i style="background-color: #cccccc;">WHERE avg_fragmentation_in_percent > 10.0 AND index_id > 0;</i><br />
<i style="background-color: #cccccc;"><br /></i>
<i style="background-color: #cccccc;">-- Declare the cursor for the list of partitions to be processed.</i><br />
<i style="background-color: #cccccc;">DECLARE partitions CURSOR FOR SELECT * FROM #work_to_do;</i><br />
<i style="background-color: #cccccc;"><br /></i>
<i style="background-color: #cccccc;">-- Open the cursor.</i><br />
<i style="background-color: #cccccc;">OPEN partitions;</i><br />
<i style="background-color: #cccccc;"><br /></i>
<i style="background-color: #cccccc;">-- Loop through the partitions.</i><br />
<i style="background-color: #cccccc;">WHILE (1=1)</i><br />
<i style="background-color: #cccccc;"> BEGIN;</i><br />
<i style="background-color: #cccccc;"> FETCH NEXT</i><br />
<i style="background-color: #cccccc;"> FROM partitions</i><br />
<i style="background-color: #cccccc;"> INTO @objectid, @indexid, @partitionnum, @frag;</i><br />
<i style="background-color: #cccccc;"> IF @@FETCH_STATUS < 0 BREAK;</i><br />
<i style="background-color: #cccccc;"> SELECT @objectname = QUOTENAME(o.name), @schemaname = QUOTENAME(s.name)</i><br />
<i style="background-color: #cccccc;"> FROM sys.objects AS o</i><br />
<i style="background-color: #cccccc;"> JOIN sys.schemas as s ON s.schema_id = o.schema_id</i><br />
<i style="background-color: #cccccc;"> WHERE o.object_id = @objectid;</i><br />
<i style="background-color: #cccccc;"> SELECT @indexname = QUOTENAME(name)</i><br />
<i style="background-color: #cccccc;"> FROM sys.indexes</i><br />
<i style="background-color: #cccccc;"> WHERE object_id = @objectid AND index_id = @indexid;</i><br />
<i style="background-color: #cccccc;"> SELECT @partitioncount = count (*)</i><br />
<i style="background-color: #cccccc;"> FROM sys.partitions</i><br />
<i style="background-color: #cccccc;"> WHERE object_id = @objectid AND index_id = @indexid;</i><br />
<i style="background-color: #cccccc;"><br /></i>
<i style="background-color: #cccccc;">-- 30 is an arbitrary decision point at which to switch between reorganizing and rebuilding.</i><br />
<i style="background-color: #cccccc;"> IF @frag < 30.0</i><br />
<i style="background-color: #cccccc;"> SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REORGANIZE';</i><br />
<i style="background-color: #cccccc;"> IF @frag >= 30.0</i><br />
<i style="background-color: #cccccc;"> SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REBUILD';</i><br />
<i style="background-color: #cccccc;"> IF @partitioncount > 1</i><br />
<i style="background-color: #cccccc;"> SET @command = @command + N' PARTITION=' + CAST(@partitionnum AS nvarchar(10));</i><br />
<i style="background-color: #cccccc;"> EXEC (@command);</i><br />
<i style="background-color: #cccccc;"> PRINT N'Executed: ' + @command;</i><br />
<i style="background-color: #cccccc;"> END;</i><br />
<i style="background-color: #cccccc;"><br /></i>
<i style="background-color: #cccccc;">-- Close and deallocate the cursor.</i><br />
<i style="background-color: #cccccc;">CLOSE partitions;</i><br />
<i style="background-color: #cccccc;">DEALLOCATE partitions;</i><br />
<i style="background-color: #cccccc;"><br /></i>
<i style="background-color: #cccccc;">-- Drop the temporary table.</i><br />
<i style="background-color: #cccccc;">DROP TABLE #work_to_do;</i><br />
<i style="background-color: #cccccc;">GO</i><br />
<br />
После чего запусти сжатие.<br />
Интересно, что дефрагментация и сжатие "противоречивые" процедуры - сразу после сжатия база окажется фрагментированной, а после дефрагментации появится свободное пространство для сжатия. В документации рекомендуется последней операцией оставлять дефрагментацию.<br />
<br />
Темпы роста базы очевидно, связаны с беспощадной эксплуатацией со стороны АС-3. С другой стороны, как ты, наверное, уже заметил, в базе проиндексировано абсолютно всё. По принципу, чем больше - тем лучше. В результате место, занимаемое индексами в базе значительно превышает размер самих данных. Так что, тут как видишь, непочатый край работы для админа. Но тюнинг индексов уже выходит за рамки текущей темы.<br />
<br />
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5957218827659569747.post-83643303047734914762012-11-21T04:58:00.003-08:002013-09-30T06:06:03.030-07:00Скрипт проверки БД АС-Библиотека-3<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
За время администрирования АС-Библиотека-3 у меня накопилось несколько SQL запросов, которыми легко обнаруживались проблемы в базе. Подход оказался весьма продуктивным, поэтому я добавил некоторое количество новых и оформил всё это в виде hta скрипта. Скрипт выполняет всего две задачи запустить SQL запрос и отобразить результат, поэтому интерфейс весьма примитивен.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-UWq99Gfnw6A/UKzPg3pz4lI/AAAAAAAAAG0/0juH8XAleVY/s1600/1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="285" src="http://1.bp.blogspot.com/-UWq99Gfnw6A/UKzPg3pz4lI/AAAAAAAAAG0/0juH8XAleVY/s400/1.jpg" width="400" /></a></div>
<br />
Лучше всего тестировать копию базы. С одной стороны не нагружается основная, с другой стороны исключается возможность получения промежуточных результатов. То есть тестовый запрос вклинивается в последовательность корректных, но ещё не завершённых операций и этот промежуточный результат воспринимается как ошибка. Если у вас АС-3 работает под SQL Server копию сделать не так просто. В этом случае необходимо либо отключить всех пользователей, либо повторить тест. Шансов опять получить ту же ошибку, нет.<br />
<br />
Количество ошибок в базе напрямую зависит от режима эксплуатации - наличие ИБП, качество сети, уровень подготовки операторов и т.п. Отдельно можно скачать Демо базу, в которую ошибки внесены в демонстрационных целях.<br />
<br />
Каждый тест сопровождается пошаговой инструкцией по устранению проблемы. Однако это не избавляет вас от необходимости понимать, что вы делаете. В большинстве случаев, перед тем как начать исправления лучше сделать резервную копию. Однако если исправления осуществляются штатными средствами (например, в "Каталогизаторе" изменяется состояние экземпляра) то параноить не стоит. Вы же не делаете резервную копию, перед тем как внести в базу новую запись. Из всех инструментов, используемых для правки, предпочтение отдано средствам, входящим в состав АС-3. Но, если вы хорошо владеете Access - нет проблем, хотя держать на сервере офисный пакет выглядит странно.<br />
<br />
Некоторые тесты имеют сервисные функции. Например "Количество строк в лог-таблицах" или "Находит повторяющиеся инвентарные номера". Является ли дублирование инвентарных номеров ошибкой, зависит от принятых у вас правил учёта, а количество строк в лог-таблицах - от того, как вы используете эту информацию. Если никак, то это просто балласт, нагружающий систему.<br />
<br />
Все тесты, кроме сервисных, построены на базе реальных ошибок, которые встречаются в природе. По мере обнаружения новых будут добавлены и новые тесты, так что следи за версиями. Кроме того, если у тебя есть подобный опыт и тебе не жалко поделиться им с обществом, сообщи об этом.<br />
<br />
Скрипт и демонстрационная база доступны для свободного скачивания на панели справа. Файлы лежат на Яндекс.Диске, поэтому насчёт вирусов можешь не переживать. На данный момент поддерживаются последние версии - 3.3.58 и <span style="background-color: #eeeeee; font-family: Arial, sans-serif; font-size: 15px; line-height: 21px;">3.3.64</span>. У меня нет информации о версиях, которые сейчас имеют хождение. Сообщи, если твоя не поддерживается. Скрипт выдаст инструкции как это сделать.<br />
Пиши комментарии (регистрация не требуется) или на почту acbib3@yandex.ru<br />
<div>
<br /></div>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5957218827659569747.post-49774388369894687562012-10-03T06:18:00.000-07:002012-11-14T04:43:20.574-08:00Формат <> "Users"<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
С переходом на АС-Библиотека-3 версии 3.3.58 (в 3.3.64 также присутствует) в модуле "Читатель" стала появляться ошибка с надписью "Формат <> 'Users'"<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-CWOuBO4fV54/UGw3UsOV5eI/AAAAAAAAAF4/uW-UTlE_3p0/s1600/1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-CWOuBO4fV54/UGw3UsOV5eI/AAAAAAAAAF4/uW-UTlE_3p0/s1600/1.jpg" /></a></div>
<br />
, убить которую можно было только перезапуском модуля. Один из сотрудников выявил закономерность появления ошибки, и оказалось, что если придерживаться определённого поведения, то ущерб можно свести к нулю.<br />
Давай посмотрим, что происходит. Итак, запускаем модуль. В поисковых полях вводим условие, заведомо приводящее к успешному результату. В Демо я просто ввожу "Чит. билет = 1", жму поиск, результат 1.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-mL7jtJ4Puq8/UGw3ciew-tI/AAAAAAAAAGA/CqNY9JrziNU/s1600/2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="305" src="http://4.bp.blogspot.com/-mL7jtJ4Puq8/UGw3ciew-tI/AAAAAAAAAGA/CqNY9JrziNU/s400/2.jpg" width="400" /></a></div>
<br />
Переходим на вкладку "Результат" - всё в порядке.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-fKLm9CECQus/UGw3kxT18jI/AAAAAAAAAGI/bmGA9GaUWt0/s1600/3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="305" src="http://1.bp.blogspot.com/-fKLm9CECQus/UGw3kxT18jI/AAAAAAAAAGI/bmGA9GaUWt0/s400/3.jpg" width="400" /></a></div>
<br />
Теперь вернёмся в "Поиск" и определим условие, которое заведомо приведёт к нулевому результату - "Чит. билет = а".<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-DwItm6PNy8c/UGw3r8We7iI/AAAAAAAAAGQ/dKltbQo42mo/s1600/4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="305" src="http://2.bp.blogspot.com/-DwItm6PNy8c/UGw3r8We7iI/AAAAAAAAAGQ/dKltbQo42mo/s400/4.jpg" width="400" /></a></div>
<br />
Ищем и переходим в "Результат".<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-FGmLhKMz7xk/UGw3zKr2l4I/AAAAAAAAAGY/YOJI--kMM4Y/s1600/5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="306" src="http://4.bp.blogspot.com/-FGmLhKMz7xk/UGw3zKr2l4I/AAAAAAAAAGY/YOJI--kMM4Y/s400/5.jpg" width="400" /></a></div>
<br />
Поймал мысль? Ошибка появляется, когда сначала кто-то найден, а потом не найден. Ситуация вполне типичная для процесса регистрации нового пользователя. Предположим, что кто-то найден или зарегистрирован. Его данные висят на вкладке "Результат". Приходит новый пользователь и просит его зарегистрировать. Вначале осуществляется поиск пользователя, на предмет его присутствия в базе и задолженности. Если всё в порядке и пользователь не найден, переходим на вкладку "Результат", с целью регистрации. И сразу получаем ошибку.<br />
Интересно, что поведение ошибки в разных системах различно. Самое жёсткое поведение в XP. Стоит провести курсором мыши по полю "в отделах"<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-pE9XjPe__gA/UGw36INcrII/AAAAAAAAAGg/zmwaO6i1FyQ/s1600/6.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="285" src="http://1.bp.blogspot.com/-pE9XjPe__gA/UGw36INcrII/AAAAAAAAAGg/zmwaO6i1FyQ/s400/6.jpg" width="400" /></a></div>
<br />
как появляется ошибка, в количестве равном количеству отделов. Причём окошко ошибки, как правило, расположено в середине поля "в отделах" и, после закрытия последовательности, малейшее движение мыши вызывает очередную. Отсюда вытекает метод борьбы. Нужно вывести курсор за пределы поля "в отделах", закрыть окошки уведомления об ошибке с клавиатуры (кл. Enter) и создать новую запись. Больше ошибка не появится. Главное при создании записи не зацепить курсором поле "в отделах". Такое же поведение наблюдается и в Висте без SP. В семёрке, что-то изменилось, и реакции на проводку курсора нет.<br />
<div>
<br /></div>
</div>
Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-5957218827659569747.post-26374394130382812342012-09-27T06:44:00.000-07:002012-09-27T06:44:51.708-07:00О вреде работы под Администратор 123<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
О вреде работы под админом в винде все знают, но всё равно работают. А вот в чём проблема работы под Администратор 123 в "АС-Библиотека-3"? Ситуация, согласись, не редкая. Вообще в библиотеках с паролями большая проблема. Начальство требует списки паролей сотрудников в сейф, последние их забывают, а если записали, то обязательно потеряют и т.д. Поэтому, частенько, все работают под Администратором. Конечно, если коллектив небольшой и все доверяют друг другу, кроме того доступ к компьютерам только у сотрудников и сеть изолирована от Интернета - к чему эти игры в конспирацию. Однако проблема проявляется в совершенно неожиданном месте. Сам не поверил бы, если бы не увидел своими глазами. Дело, в общем то не в Администраторе, а в работе под одной учётной записью несколькими сотрудниками.<br />
Итак, во всех многопользовательских системах обработки данных существует и успешно решается проблема "потерянных обновлений". Проще всего её показать на пальцах. Запустим два "Каталогизатора" и один "Администратор". Во всех модулях залогинимся под Администратором. В обоих "Каталогизаторах" выполним запрос одной и тоже записи (неважно какой), а в "Администраторе" сделаем выборку таблицы <i style="background-color: #cccccc;">Demo__Lock</i> (или другая <span style="background-color: #cccccc;"><i>*__Lock</i></span>, если логическая база другая).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-b4_Lt8nNI9s/UGRNPo0RmeI/AAAAAAAAAEU/LUsCXdUnZsI/s1600/1_1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="352" src="http://4.bp.blogspot.com/-b4_Lt8nNI9s/UGRNPo0RmeI/AAAAAAAAAEU/LUsCXdUnZsI/s640/1_1.jpg" width="640" /></a></div>
<br />
В левом "Каталогизаторе" изменим пару строк и повременим с сохранением изменений в базе. Перечитаем <i style="background-color: #cccccc;">Demo__Lock</i> - появилась блокировка.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-3eeqLMM_qMU/UGRNi8Hu9-I/AAAAAAAAAEc/dDUfGsQc4Yg/s1600/2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="464" src="http://1.bp.blogspot.com/-3eeqLMM_qMU/UGRNi8Hu9-I/AAAAAAAAAEc/dDUfGsQc4Yg/s640/2.jpg" width="640" /></a></div>
<br />
Теперь изменим другое поле (например, дату) в правом "Каталогизаторе" и тоже не сохраняем.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-6g9p93VZkp0/UGRNtgrZ5qI/AAAAAAAAAEk/-KuxBTGFHGw/s1600/3_1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="350" src="http://3.bp.blogspot.com/-6g9p93VZkp0/UGRNtgrZ5qI/AAAAAAAAAEk/-KuxBTGFHGw/s640/3_1.jpg" width="640" /></a></div>
<br />
Перечитаем Demo__Lock – та же запись, только время изменилось.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-YdBVPDm0xV8/UGRN3xf1DuI/AAAAAAAAAEs/A2Cp_xCBuPw/s1600/4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="464" src="http://2.bp.blogspot.com/-YdBVPDm0xV8/UGRN3xf1DuI/AAAAAAAAAEs/A2Cp_xCBuPw/s640/4.jpg" width="640" /></a></div>
<br />
Жмём кнопку "Сохранить" в левом "Каталогизаторе".<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-qQPWDkJs7SM/UGROA3zCvEI/AAAAAAAAAE0/83QKAwGG-h4/s1600/5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="354" src="http://3.bp.blogspot.com/-qQPWDkJs7SM/UGROA3zCvEI/AAAAAAAAAE0/83QKAwGG-h4/s640/5.jpg" width="640" /></a></div>
<br />
Перечитываем <i style="background-color: #cccccc;">Demo__Lock</i> - таблица пустая, блокировки нет.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-MbXlrR20py8/UGROUVuMQUI/AAAAAAAAAE8/9Yl-MZabl5U/s1600/6.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="464" src="http://2.bp.blogspot.com/-MbXlrR20py8/UGROUVuMQUI/AAAAAAAAAE8/9Yl-MZabl5U/s640/6.jpg" width="640" /></a></div>
<br />
Жмём кнопку "Сохранить" в правом "Каталогизаторе".<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-Co0Dsd4oL2s/UGROd-E8g-I/AAAAAAAAAFE/0ZjQ7s-eq5Q/s1600/7.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="352" src="http://4.bp.blogspot.com/-Co0Dsd4oL2s/UGROd-E8g-I/AAAAAAAAAFE/0ZjQ7s-eq5Q/s640/7.jpg" width="640" /></a></div>
<br />
Попробуй угадать, что в базе? Естественно результат второго сохранения. Перечитаем запись в обоих.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-Smw6ssxuDUc/UGROocqclhI/AAAAAAAAAFM/UTf9eiWLCSA/s1600/8.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="350" src="http://4.bp.blogspot.com/-Smw6ssxuDUc/UGROocqclhI/AAAAAAAAAFM/UTf9eiWLCSA/s640/8.jpg" width="640" /></a></div>
<br />
Правый "Каталогизатор" закэшировал данные и перекрыл все модификации, выполненные в левом.<br />
Но гипотетический сотрудник, работающий за левым "Каталогизатором" уверен, что он выполнил свою работу. И впоследствии будет крайне удивлён, увидев старые данные. Это и есть один из вариантов проблемы "потерянного обновления".<br />
А что произойдёт, если учётки разные? Перелогинимся в правом "Каталогизаторе" под "Библиотекарь" и попробуем всё повторить.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-Fr6zaq1ekZI/UGROv9NM8dI/AAAAAAAAAFU/1QruuRmhLbA/s1600/9.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="352" src="http://3.bp.blogspot.com/-Fr6zaq1ekZI/UGROv9NM8dI/AAAAAAAAAFU/1QruuRmhLbA/s640/9.jpg" width="640" /></a></div>
<br />
Начнём модификацию в левом. Перечитаем <i style="background-color: #cccccc;">Demo__Lock</i> - появилась блокировка.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-sc1EU-HOutQ/UGRO5s1LyYI/AAAAAAAAAFc/wxgmrBpgMB8/s1600/10.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="464" src="http://2.bp.blogspot.com/-sc1EU-HOutQ/UGRO5s1LyYI/AAAAAAAAAFc/wxgmrBpgMB8/s640/10.jpg" width="640" /></a></div>
<br />
Теперь попробуем модифицировать запись в правом.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-a-A-K4HsHy0/UGRPE5jaCEI/AAAAAAAAAFk/uOIJiz58LMA/s1600/11.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="352" src="http://4.bp.blogspot.com/-a-A-K4HsHy0/UGRPE5jaCEI/AAAAAAAAAFk/uOIJiz58LMA/s640/11.jpg" width="640" /></a></div>
<br />
Срабатывает защита.<br />
Конечно, решение проблемы "потерянных обновлений" в "АС-Библиотека-3" немного странное, но оно работает именно так. Неважно, какими правами обладают учётки, важно, чтобы они были разными.<br />
Аналогичная ситуация с модулями "Читатель" и "Абонемент", работающими с БД User. Попробуй сам. И не ленись писать комментарии.<br />
<div>
<br /></div>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5957218827659569747.post-89899939217601653162012-09-13T05:45:00.000-07:002014-05-17T06:21:17.275-07:00Транзакции<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="MsoPlainText" style="margin: 0cm 0cm 0pt; text-align: justify;">
<span style="font-family: 'Courier New';">Этот эксперимент не касается напрямую "АС-Библиотека-3". Однако, поскольку она не может работать без поддержки СУБД он вполне уместен. К тому же производительность системы в целом существенно зависит от данного звена.<o:p></o:p></span></div>
<div class="MsoPlainText" style="margin: 0cm 0cm 0pt; text-align: justify;">
<br /></div>
<div class="MsoPlainText" style="margin: 0cm 0cm 0pt; text-align: justify;">
<span style="font-family: 'Courier New';">Итак, после перехода на MS SQL, решил повозиться с транзакциями, точнее различием их поведения в MS Access и MS SQL. Набросал маленький hta скриптик (в конце статьи ссылки и рекомендации для тех, кто решит повозиться сам). Смысл его в параллельном запуске двух различных SQL запросов, с различным уровнем изоляции транзакций. То есть мы, просто искусственно сталкиваем транзакции и смотрим результат. База состоит из одной таблицы Table_1, в которой два поля - fld1 и fld2. Данные появляются и изменяются в процессе работы. Вначале подключаемся к Access базе Test1.mdb и запускаем два экземпляра скрипта. По умолчанию выбрано adXactCursorStability (adXactReadCommitted) и это единственный уровень изоляции, поддерживаемый базой Access, остальные либо игнорируются, либо приводят к ошибке. В "левом" скрипте выбираем команду обновления<o:p></o:p></span></div>
<div class="MsoPlainText" style="margin: 0cm 0cm 0pt; text-align: justify;">
<span style="font-family: 'Courier New';"><span style="mso-spacerun: yes;"> </span><em><span style="background-color: #eeeeee;">update Table_1 set fld2 = :Param1 where fld1 = :Param2<o:p></o:p></span></em></span></div>
<div class="MsoPlainText" style="margin: 0cm 0cm 0pt; text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<em><span style="background-color: #eeeeee;"></span></em></div>
<div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;">
<span style="font-family: 'Courier New';">и изменяем строку с fld1 = 3, присваиваем fld2 значение 7. Жмём Старт и видим окошко с предложением зафиксировать транзакцию. Пока не нажато ОК, транзакция находится в активном состоянии. В это время в "правом" скрипте запустим операцию чтения той же строки с fld1 = 3. Чтение происходит успешно.<o:p></o:p></span></div>
</div>
<div class="MsoPlainText" style="margin: 0cm 0cm 0pt; text-align: justify;">
</div>
<div class="MsoPlainText" style="margin: 0cm 0cm 0pt; text-align: justify;">
<br /></div>
<div class="MsoPlainText" style="margin: 0cm 0cm 0pt; text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-fS__EYs43R4/UFHTR3bWocI/AAAAAAAAAD0/YxacJhuzI-Y/s1600/acess1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-fS__EYs43R4/UFHTR3bWocI/AAAAAAAAAD0/YxacJhuzI-Y/s640/acess1.jpg" hea="true" height="510" width="640" /></a></div>
<div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;">
<span style="font-family: 'Courier New';">Жмём ОК в "правом" скрипте, а затем в "левом", и смотрим результат. Всё в соответствии с описанием уровня изоляции adXactReadCommitted. "Правый" скрипт без препятствий вычитал старое значение fld2 = 3, поскольку новое fld2 = 7 ещё не было зафиксировано.<o:p></o:p></span></div>
</div>
<div class="MsoPlainText" style="margin: 0cm 0cm 0pt; text-align: justify;">
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-6JhL_zSpso0/UFHTxABgWPI/AAAAAAAAAD8/SyUa_UZeqro/s1600/acess2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-6JhL_zSpso0/UFHTxABgWPI/AAAAAAAAAD8/SyUa_UZeqro/s640/acess2.jpg" hea="true" height="508" width="640" /></a></div>
<br /></div>
<div class="MsoPlainText" style="margin: 0cm 0cm 0pt; text-align: justify;">
<span style="font-family: 'Courier New';">Теперь изменим параметры подключения на SQL Server, и повторим предыдущие шаги. Видим, что SQL Server встрял по полной! Как видно на скриншоте</span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-6PtIlen4Mg8/UFHUONXfqTI/AAAAAAAAAEE/4YlqLgmfF9w/s1600/sql_1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-6PtIlen4Mg8/UFHUONXfqTI/AAAAAAAAAEE/4YlqLgmfF9w/s640/sql_1.jpg" hea="true" height="526" width="640" /></a></div>
<br />
<br />
<span style="font-family: 'Courier New';">"правый" скрипт даже PrintScreen не берёт. Более того - он встрянет даже при чтении соседней строки. Как это отражается на производительности "АС-Библиотека-3" понятно - пока кто-то проводит интенсивные изменения в базе, остальные ждут, вне зависимости от количества ядер в твоём сервере. Но главная проблема - полное несоответствие описанию поведения уровня изоляции adXactReadCommitted. Глюк</span><span lang="EN-US" style="font-family: 'Courier New'; mso-ansi-language: EN-US;">? "</span><span style="font-family: 'Courier New';">Курим</span><span lang="EN-US" style="font-family: 'Courier New'; mso-ansi-language: EN-US;">" </span><span style="font-family: 'Courier New';">мануалы</span><span lang="EN-US" style="font-family: 'Courier New'; mso-ansi-language: EN-US;"> ...<o:p></o:p></span></div>
<div class="MsoPlainText" style="margin: 0cm 0cm 0pt; text-align: justify;">
<span style="font-family: 'Courier New';">Находим интересную команду (надо сказать, что такому поведению </span><span lang="EN-US" style="font-family: 'Courier New'; mso-ansi-language: EN-US;">SQL</span><span lang="EN-US" style="font-family: 'Courier New';"> </span><span style="font-family: 'Courier New';">Сервера в документации посвящена целая глава и, по хорошему – сначала читаем, потом делаем, но … <span style="mso-spacerun: yes;"> </span>):<o:p></o:p></span></div>
<div class="MsoPlainText" style="margin: 0cm 0cm 0pt; text-align: justify;">
<span style="font-family: 'Courier New';"><span style="mso-spacerun: yes;"> </span></span><span lang="EN-US" style="font-family: 'Courier New'; mso-ansi-language: EN-US;"><span style="background-color: #eeeeee;"><em>alter database Test1 set read_committed_snapshot on<o:p></o:p></em></span></span></div>
<div class="MsoPlainText" style="margin: 0cm 0cm 0pt; text-align: justify;">
<span style="font-family: 'Courier New';">переводящую базу в режим контроля версий строк (off - отключить; применять в контексте базы master; работает почти мгновенно, если долго ковыряется, значит что-то блокирует базу). Применяем её и всё становится на свои места. То есть поведение блокировок ничем не отличается от Access. Посмотреть</span><span style="font-family: 'Courier New'; mso-ansi-language: EN-US;"> </span><span style="font-family: 'Courier New';">текущий</span><span style="font-family: 'Courier New'; mso-ansi-language: EN-US;"> </span><span style="font-family: 'Courier New';">режим</span><span style="font-family: 'Courier New'; mso-ansi-language: EN-US;"> </span><span style="font-family: 'Courier New';">работы</span><span style="font-family: 'Courier New'; mso-ansi-language: EN-US;"> </span><span style="font-family: 'Courier New';">баз</span><span style="font-family: 'Courier New'; mso-ansi-language: EN-US;"> </span><span style="font-family: 'Courier New';">можно</span><span style="font-family: 'Courier New'; mso-ansi-language: EN-US;"> </span><span style="font-family: 'Courier New';">запросом</span><span lang="EN-US" style="font-family: 'Courier New'; mso-ansi-language: EN-US;">:<o:p></o:p></span></div>
<div class="MsoPlainText" style="margin: 0cm 0cm 0pt; text-align: justify;">
<span lang="EN-US" style="font-family: 'Courier New'; mso-ansi-language: EN-US;"><span style="mso-spacerun: yes;"> </span><em><span style="background-color: #eeeeee;">select name, is_read_committed_snapshot_on<span style="mso-spacerun: yes;"> </span>from sys.databases<o:p></o:p></span></em></span></div>
<div class="MsoPlainText" style="margin: 0cm 0cm 0pt; text-align: justify;">
<span style="font-family: 'Courier New';">К сожалению, протестировать этот режим в "боевых" условия при интенсивной нагрузке в настоящий момент не имею возможности - нет "полигона". Проверка в однопользовательском режиме на Демо-версии проблем не показывает, но этого мало. Если заинтересуешься и сделаешь это - сообщи в комментарии. Потребуется поддержка, готов помочь.<o:p></o:p></span></div>
<div class="MsoPlainText" style="margin: 0cm 0cm 0pt; text-align: justify;">
<span style="font-family: 'Courier New';">В конце несколько слов о содержимом архива.<o:p></o:p></span></div>
<div class="MsoPlainText" style="margin: 0cm 0cm 0pt; text-align: justify;">
<span style="font-family: 'Courier New';">Скачать архив здесь - <a href="http://yadi.sk/d/FBrnmdzAQVVqo" target="_blank">TransactTest.zip</a><o:p></o:p></span></div>
<div class="MsoPlainText" style="margin: 0cm 0cm 0pt; text-align: justify;">
<span style="font-family: 'Courier New';">1. Transact.hta - запускаемый скрипт. Для редактирования строк подключения открыть в "Блокноте".<o:p></o:p></span></div>
<div class="MsoPlainText" style="margin: 0cm 0cm 0pt; text-align: justify;">
<span style="font-family: 'Courier New';">2. Test1.mdb - база Access. Для подключения в Transact.hta снять комментарий (//) и закомментировать стоку SQL Server, при необходимости откорректировать путь к базе.<o:p></o:p></span></div>
<div class="MsoPlainText" style="margin: 0cm 0cm 0pt; text-align: justify;">
<span style="font-family: 'Courier New';">3. Test1.mdf, Test1_log.ldf - база данных и журнал транзакций SQL Server. Скопируй их в стандартный каталог баз (где лежит master.mdf) или придётся возиться с настройками доступа. В Transact.hta сними комментарий со строки подключения, замени XXXX на реальный пароль sa<span style="mso-spacerun: yes;"> </span>и закомментируй строку подключения Access. Если подключиться не удаётся – смотри в мануалах конструирование строки подключения (эта задача не тривиальна), но если ты воткнул </span><span lang="EN-US" style="font-family: 'Courier New'; mso-ansi-language: EN-US;">Z</span><span style="font-family: 'Courier New';">-Сервер, то воткнёшь и скрипт.<o:p></o:p></span></div>
<div class="MsoPlainText" style="margin: 0cm 0cm 0pt; text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: 'Courier New'; font-size: 11pt; line-height: 115%; mso-ansi-language: RU; mso-bidi-language: AR-SA; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin;">На этом всё. Если есть вопросы – пиши комментарий.</span><br />
<span style="font-family: 'Courier New'; font-size: 11pt; line-height: 115%; mso-ansi-language: RU; mso-bidi-language: AR-SA; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin;"><br /></span>
<span style="font-family: 'Courier New'; font-size: 11pt; line-height: 115%; mso-ansi-language: RU; mso-bidi-language: AR-SA; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin;">Добавил <a href="http://yadi.sk/d/l9KRI53uMK374" target="_blank">видео</a> по теме. Для просмотра лучше скачать.</span></div>
</div>
Unknownnoreply@blogger.com4tag:blogger.com,1999:blog-5957218827659569747.post-25282546290667766482012-07-24T12:04:00.000-07:002012-07-24T12:06:37.198-07:00Шлюз<div dir="ltr" style="text-align: left;" trbidi="on">
Сделаем простой эксперимент с WWW-шлюзом.<br />
Откроем в браузере страницу поиска<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-ZTbl9wiCxog/UA7uupqISdI/AAAAAAAAADQ/WbUlWKNBl34/s1600/0.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="290" sda="true" src="http://3.bp.blogspot.com/-ZTbl9wiCxog/UA7uupqISdI/AAAAAAAAADQ/WbUlWKNBl34/s400/0.png" width="400" /></a></div>
и добавим к <em><span style="background-color: #eeeeee;">http://localhost/lib/</span></em> в строке запроса <em><span style="background-color: #eeeeee;">EWww.xml</span></em>.<br />
В результате получим строку запроса следующего вида <em><span style="background-color: #eeeeee;">http://localhost/lib/EWww.xml</span></em>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-C0B7PhaTpsE/UA7u-u-2rnI/AAAAAAAAADY/j4U2GrTcT_8/s1600/1_1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="291" sda="true" src="http://1.bp.blogspot.com/-C0B7PhaTpsE/UA7u-u-2rnI/AAAAAAAAADY/j4U2GrTcT_8/s400/1_1.png" width="400" /></a></div>
Жмём Enter и видим ошибку XML парсинга.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-hgyIE1kWMTo/UA7vR_JmhOI/AAAAAAAAADg/qGdJ00PlM6o/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="291" sda="true" src="http://4.bp.blogspot.com/-hgyIE1kWMTo/UA7vR_JmhOI/AAAAAAAAADg/qGdJ00PlM6o/s400/2.png" width="400" /></a></div>
Значит, документ получен! Ошибка нас не интересует. Просто откроем исходный текст (Меню -> Страница -> Просмотр HTML-кода). Вот он, вместе со всем своим богатством (у меня Демо)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-wUAHOYNaRAc/UA7wAVl-4EI/AAAAAAAAADo/y-T9bBUmGOk/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="373" sda="true" src="http://3.bp.blogspot.com/-wUAHOYNaRAc/UA7wAVl-4EI/AAAAAAAAADo/y-T9bBUmGOk/s400/3.png" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
Адрес Z-сервера (а чаще всего это основной физический сервер в библиотеке), имена баз, логины и пароли! И всё это лёгким движением руки!<br />
Так что, если тебя беспокоит безопасность, не забудь прикрыть этот ценный файл в настройках IIS.</div>Unknownnoreply@blogger.com4tag:blogger.com,1999:blog-5957218827659569747.post-77958293036057176862012-05-23T07:40:00.001-07:002012-07-09T11:57:20.341-07:0032 браузера<div dir="ltr" style="text-align: left;" trbidi="on">
Когда организовывал доступ к базе из Интернет, решил тупо проверить, а сколько коннектов удержит моя система? Есть ли предел? Насколько мне было известно - количество подключений через WWW-шлюз не лимитируется даже на "Демо". В результате нашёл много интересного. Ты можешь повторить сам - это абсолютно безопасно даже на рабочей системе. Просто в этот момент никто не должен выполнять реальную работу, иначе получишь по полной.<br />
Итак, запускаем браузеры. Но перед этим остановим Z-сервер и удалим EServer.log (именно .log, а не .exe!!!) - будет легче искать записи об ошибках. Стартуем Z-сервер и запускаем браузеры, сколько сможем. Проще всего это сделать из командной строки.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-OCoxeWYTBKo/T7z05t1BWyI/AAAAAAAAACk/5ZF0PNEYSsQ/s1600/cmd.jpg" imageanchor="1" style="clear: left; cssfloat: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" qba="true" src="http://1.bp.blogspot.com/-OCoxeWYTBKo/T7z05t1BWyI/AAAAAAAAACk/5ZF0PNEYSsQ/s400/cmd.jpg" width="400" /></a></div>
<br />
<br />
Стрелка вверх повторит предыдущую команду. По ходу можно закрывать уже открытые браузеры - они своё дело уже сделали. Периодически смотрим в EManager количество подключений. На "Демо" установке каждый новый браузер даёт два подключения, с другими настройками всё может быть по-другому, но смысл не изменит. Последний нормальный запуск происходит с достижением кол-ва подключений 62.<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-9Lq3O-fsXeY/T7z1GD9g3eI/AAAAAAAAACs/z_rppH_tEcY/s1600/%D0%90%D0%B4%D0%BC%D0%B8%D0%BD%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%BE%D1%80_%D0%B4%D0%BE_1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="484" qba="true" src="http://2.bp.blogspot.com/-9Lq3O-fsXeY/T7z1GD9g3eI/AAAAAAAAACs/z_rppH_tEcY/s640/%D0%90%D0%B4%D0%BC%D0%B8%D0%BD%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%BE%D1%80_%D0%B4%D0%BE_1.jpg" width="640" /></a></div>
<br />
А дальше...<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-C_IuW9TC_98/T7z1ReYxK5I/AAAAAAAAAC0/6UxAOD_BKqs/s1600/%D0%90%D0%B4%D0%BC%D0%B8%D0%BD%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%BE%D1%80_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5_1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="484" qba="true" src="http://2.bp.blogspot.com/-C_IuW9TC_98/T7z1ReYxK5I/AAAAAAAAAC0/6UxAOD_BKqs/s640/%D0%90%D0%B4%D0%BC%D0%B8%D0%BD%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%BE%D1%80_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5_1.jpg" width="640" /></a></div>
<br />
Подключение остаётся одно и появляется следующая ошибка:<br />
<span style="background-color: #eeeeee;"><em>18:42:28-15/05: [fatal][debug][warn][log][app][all] DB: User Connection: TSqlConnection.Open( Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\DB\Lib.mdb;Persist Security Info=False ): Неопознанная ошибка []</em></span><br />
<span style="background-color: #eeeeee;"><em>18:42:28-15/05: [fatal][debug][warn][log][app][all] Restart server []</em></span><br />
А что произошло бы с обычными клиентами ("Абонемент", "Каталогизатор", ...)? Ты уже догадался - естественно они будут "сброшены". Если сомневаешься - проверь. У меня была очередь с жалобами на то, что система всё время требует ввести пароль, и я грешил на ошибки с таймаутом. А на самом деле всё оказалось проще. Что, при этом, происходит с базой - приходится только догадываться. <br />
Хотя, судя по тексту ошибки, это не похоже на проблему с Z-сервером. Возможно это беда "Access" движка "Jet"? Как это проверить? Да запросто. Следующий скрипт просто создаёт подключения в кол-ве указанном в переменной count, выбрасывает исключение при ошибке и выводит кол-во успешных: <br />
<em><span style="background-color: #eeeeee;"><HTML></span></em><br />
<em><span style="background-color: #eeeeee;"><HEAD></span></em><br />
<em><span style="background-color: #eeeeee;"> <TITLE>ConnectCount</TITLE></span></em><br />
<em><span style="background-color: #eeeeee;"> <HTA:APPLICATION ID="oHTA"</span></em><br />
<em><span style="background-color: #eeeeee;"> APPLICATIONNAME="myApp"</span></em><br />
<em><span style="background-color: #eeeeee;"> BORDER = "thick"</span></em><br />
<em><span style="background-color: #eeeeee;"> BORDERSTYLE="normal"</span></em><br />
<em><span style="background-color: #eeeeee;"> CAPTION="yes"</span></em><br />
<em><span style="background-color: #eeeeee;"> ICON=""</span></em><br />
<em><span style="background-color: #eeeeee;"> MAXIMIZEBUTTON="yes"</span></em><br />
<em><span style="background-color: #eeeeee;"> MINIMIZEBUTTON="yes"</span></em><br />
<em><span style="background-color: #eeeeee;"> SCROLL = "yes"</span></em><br />
<em><span style="background-color: #eeeeee;"> SHOWINTASKBAR="yes"</span></em><br />
<em><span style="background-color: #eeeeee;"> SINGLEINSTANCE="no"</span></em><br />
<em><span style="background-color: #eeeeee;"> SYSMENU="yes"</span></em><br />
<em><span style="background-color: #eeeeee;"> VERSION="1.0"</span></em><br />
<em><span style="background-color: #eeeeee;"> WINDOWSTATE="maximize"/></span></em><br />
<em><span style="background-color: #eeeeee;"> <SCRIPT></span></em><br />
<em><span style="background-color: #eeeeee;">function getPath()</span></em><br />
<em><span style="background-color: #eeeeee;">{</span></em><br />
<em><span style="background-color: #eeeeee;"> var pathl = document.URL;</span></em><br />
<em><span style="background-color: #eeeeee;"> var i = pathl.length;</span></em><br />
<em><span style="background-color: #eeeeee;"> var j;</span></em><br />
<em><span style="background-color: #eeeeee;"> while(pathl.charAt(--i) != '\\');</span></em><br />
<em><span style="background-color: #eeeeee;"> j = i;</span></em><br />
<em><span style="background-color: #eeeeee;"> while(pathl.charAt(--j) != '/');</span></em><br />
<em><span style="background-color: #eeeeee;"> return pathl.substring(j+1, i+1);</span></em><br />
<em><span style="background-color: #eeeeee;">}</span></em><br />
<em><span style="background-color: #eeeeee;">var i = 0;</span></em><br />
<em><span style="background-color: #eeeeee;">conns = [];</span></em><br />
<em><span style="background-color: #eeeeee;">count = 100;</span></em><br />
<em><span style="background-color: #eeeeee;">while(i < count)</span></em><br />
<em><span style="background-color: #eeeeee;">{</span></em><br />
<em><span style="background-color: #eeeeee;"> conns[i] = new ActiveXObject("ADODB.Connection");</span></em><br />
<em><span style="background-color: #eeeeee;"> conns[i].ConnectionString = "Provider='Microsoft.Jet.OLEDB.4.0';Data Source='" + getPath() + "adb.mdb'";</span></em><br />
<em><span style="background-color: #eeeeee;"> try</span></em><br />
<em><span style="background-color: #eeeeee;"> {</span></em><br />
<em><span style="background-color: #eeeeee;"> conns[i].Open();</span></em><br />
<em><span style="background-color: #eeeeee;"> i++;</span></em><br />
<em><span style="background-color: #eeeeee;"> }</span></em><br />
<em><span style="background-color: #eeeeee;"> catch(e)</span></em><br />
<em><span style="background-color: #eeeeee;"> {</span></em><br />
<em><span style="background-color: #eeeeee;"> alert(e.message);</span></em><br />
<em><span style="background-color: #eeeeee;"> break;</span></em><br />
<em><span style="background-color: #eeeeee;"> }</span></em><br />
<em><span style="background-color: #eeeeee;">}</span></em><br />
<em><br /><span style="background-color: #eeeeee;"></span></em><br />
<em><span style="background-color: #eeeeee;">function window.onload()</span></em><br />
<em><span style="background-color: #eeeeee;">{</span></em><br />
<em><span style="background-color: #eeeeee;">oPre.innerText = i;</span></em><br />
<em><span style="background-color: #eeeeee;">}</span></em><br />
<em><span style="background-color: #eeeeee;"></SCRIPT></span></em><br />
<em><span style="background-color: #eeeeee;"></HEAD></span></em><br />
<em><span style="background-color: #eeeeee;"><BODY></span></em><br />
<em><span style="background-color: #eeeeee;"> <PRE ID=oPre> </PRE></span></em><br />
<em><span style="background-color: #eeeeee;"></BODY></span></em><br />
<em><span style="background-color: #eeeeee;"></HTML></span></em><br />
Для начала сделаем count=100. Если захочешь повторить просто скопируй его в "Блокнот" и сохрани с любым именем и расширением .hta (например, ConnectionCount.hta). База adb.mdb любая (я сделал "Access"-ом пустую). Можешь скопировать Explain.mdb в тоже место, где находится скрипт и переименовать в adb.mdb. Запускаем и получаем:<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-17LzxnLlmfY/T7z1hSGPFbI/AAAAAAAAAC8/Jb0z0kWAMJQ/s1600/UnknownError.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" qba="true" src="http://3.bp.blogspot.com/-17LzxnLlmfY/T7z1hSGPFbI/AAAAAAAAAC8/Jb0z0kWAMJQ/s1600/UnknownError.jpg" /></a></div>
<br />
та же ошибка, а количество подключений:<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-SDqOhFIzUiY/T7z1oJh_WTI/AAAAAAAAADE/MNMIp_KlBmo/s1600/ConnCount.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="380" qba="true" src="http://3.bp.blogspot.com/-SDqOhFIzUiY/T7z1oJh_WTI/AAAAAAAAADE/MNMIp_KlBmo/s640/ConnCount.jpg" width="640" /></a></div>
<br />
Сделаем count=64 - ошибки нет. Более того, её не будет, если тут же запустить второй экземпляр скрипта! В сумме окажется 128 подключений! Судя по всему это ограничение на процесс и новому процессу даётся новая "квота". Известно, что Z-сервер (EServer) "АС-Библиотека-3" работает одним многопоточным процессом и, по всей видимости, упирается в это ограничение. Поиски в Интернете и настройках "Jet" как обойти, или изменить порог в 64 ничего не дали (если у тебя есть какая либо информация на эту тему сообщи в комменте).<br />
Какой выход? Я нашёл только один - переход на SQL Server. Но не торопись делать то же самое. Если у тебя несколько клиентов (не фиксируется вышеприведённая ошибка), небольшая база (меньше 1Гб в сжатом виде) и нет внешнего доступа, то издержки эксплуатации SQL Server перекроют все прелести неограниченой подключаемости. К тому же на небольшой базе Access обставит SQL и по скорости и по компактности.</div>Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-5957218827659569747.post-6321280533193363372012-05-03T07:23:00.000-07:002012-05-03T07:23:07.393-07:00Администратор 123<div dir="ltr" style="text-align: left;" trbidi="on">
Недавно подвернулась интересная утилита для анализа сетевой активности "oSpy". Она ловит даже "петлю". И вот результат.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-U1IiWxhr73g/T6KT_7N-UGI/AAAAAAAAACQ/at8k8viONPo/s1600/oSpy_1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="416" mea="true" src="http://4.bp.blogspot.com/-U1IiWxhr73g/T6KT_7N-UGI/AAAAAAAAACQ/at8k8viONPo/s640/oSpy_1.jpg" width="640" /></a></div>
<br />
Какой-то подозрительный "123", а где "Администратор"? Сохраним пакет в "сыром" виде и откроем любым текстовым редактором.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-sLvW0RSK5aA/T6KUCfUVx0I/AAAAAAAAACY/PyrghRccWsI/s1600/Notepad_1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="291" mea="true" src="http://4.bp.blogspot.com/-sLvW0RSK5aA/T6KUCfUVx0I/AAAAAAAAACY/PyrghRccWsI/s640/Notepad_1.jpg" width="640" /></a></div>
<br />
А вот они и вместе. Похоже, что логин и пароль в "АС-Библиотека-3" передаются открытым текстом. Хорошо это или плохо? Не то и не другое. Существует множество не "секюрных" протоколов (HTTP, FTP, telnet, ....). Всё зависит от использования. Если в локальной сети - то это не проблема (если за локалкой следить конечно), а если хочешь затеять корпоративку или просто внешний доступ - учти этот момент. Есть масса технологий для "прикрытия" (VPN, IPSec, ....).</div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5957218827659569747.post-55718193587870828992012-04-26T07:49:00.001-07:002012-04-26T07:50:03.989-07:00Переход<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none; text-align: justify;">
Года три назад решили перейти на новую версию "АС-Библиотека-3" 3.3.58. Технологий перехода много, но для начала выбрали самую простую - через выгрузку записей из старой версии и загрузку в новую (выдачи, естественно, просто скопировали с помощью "Access"). Однако первая же проверка показала, что записи легли криво. Например, запрос:<br />
<em><span style="background-color: #f3f3f3;">select count(*) from All__Delivery D<br /> where not exists (select B.BookID from All__Book B where B.BookID = D.BookID)</span></em>дал кучу записей о выдачах экземпляров, которых нет в БД! И наоборот.<br />
В результате, комбинируя "перезаливку" с реструктуризацией, базу удалось конвертировать. Но вопрос надолго завис в воздухе.<br />
Недавно сделал простой эксперимент, который прояснил ситуацию. Ты можешь повторить его сам, если интересно. Лучше на "Demo" - не придется отматывать назад.</div>
<div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none; text-align: justify;">
Итак, запускаем "Каталогизатор" и делаем выборку всех записей (в демо их немного). Находим простую (однотомник, при этом должен быть экземпляр, проще говоря, инвентарный номер, поэтому общая часть не подойдёт и экземпляр должен быть один для простоты, общности это не нарушает) и запомним её номер</div>
<div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-pHaOxT-p_Rw/T5lbVxe2MeI/AAAAAAAAABU/_BVW1ACS6k8/s1600/SelRecord.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="195" oda="true" src="http://1.bp.blogspot.com/-pHaOxT-p_Rw/T5lbVxe2MeI/AAAAAAAAABU/_BVW1ACS6k8/s400/SelRecord.jpg" width="400" /></a></div>
<div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;">
выгружаем её в файл с сохранением локальных полей.</div>
<div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;">
<br /></div>
<div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-ifIv49OGJII/T5lbtfotyRI/AAAAAAAAABc/zxbTXRa8XcU/s1600/Download.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="262" oda="true" src="http://4.bp.blogspot.com/-ifIv49OGJII/T5lbtfotyRI/AAAAAAAAABc/zxbTXRa8XcU/s400/Download.jpg" width="400" /></a></div>
<div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;">
Далее загружаем "Администратор", подключаемся к базе и делаем два запроса на вкладке "SQL":</div>
<div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;">
select max(DocID) from Demo__Doc</div>
<div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;">
<br /></div>
<div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-wW0LSoniZJE/T5lcG9OCEII/AAAAAAAAABk/mT_NxHEPGPQ/s1600/SelMax1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="271" oda="true" src="http://2.bp.blogspot.com/-wW0LSoniZJE/T5lcG9OCEII/AAAAAAAAABk/mT_NxHEPGPQ/s400/SelMax1.jpg" width="400" /></a></div>
<div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;">
и<br />
select max(BookID) from All__Book</div>
<div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;">
<br /></div>
<div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-8vDxCb5OsMo/T5lcRx2XcNI/AAAAAAAAABs/uyCymLoUAzE/s1600/SelMax2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="270" oda="true" src="http://3.bp.blogspot.com/-8vDxCb5OsMo/T5lcRx2XcNI/AAAAAAAAABs/uyCymLoUAzE/s400/SelMax2.jpg" width="400" /></a></div>
<div style="text-align: justify;">
Первый даёт DocID записи с максимальным значением в таблице Demo__Doc, вторая максимальный BookID экземпляра. У меня 81 и 121 соответственно. Запомним их. Теперь откроем "Каталогизатор» -Ом сохранённую в файл запись и откорректируем Mark поля 001, <em><span style="background-color: #f3f3f3;">8993 и 200a так:</span></em></div>
<em><span style="background-color: #f3f3f3;">001 = z3950://127.0.0.1/Demo/7 - до<br />001 = z3950://127.0.0.1/Demo/91 - после</span></em><br />
<em><span style="background-color: #f3f3f3;">8993 = 7 - до<br />8993 = 131 - после</span></em><br />
<em><span style="background-color: #f3f3f3;">200a = Почему погиб социализм - до<br />200a = Почему погиб социализм 1 - после</span></em><br />
<div style="text-align: justify;">
то есть просто добавим по 10 сверх максимальных (10 не принципиально можно любое). Кроме того добавим к заглавию любой символ (для отличия, иначе получим дублет). Сохраним запись в тот же файл. Сначала жмём на галочку "сохранить", а потом на значке "сохранить в файл все записи" (у нас одна).<br />
Теперь импортируем запись в БД (Demo), не забыв поставить галочку "Сохранять номера записей".</div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-Z91ezRvw1CM/T5lcgGjawnI/AAAAAAAAAB0/5-XML3b8w_k/s1600/Import.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="305" oda="true" src="http://3.bp.blogspot.com/-Z91ezRvw1CM/T5lcgGjawnI/AAAAAAAAAB0/5-XML3b8w_k/s400/Import.jpg" width="400" /></a></div>
И что стало с номерами?<br />
<em><span style="background-color: #f3f3f3; color: black;">001 = z3950://127.0.0.1/Demo/91<br />200a = Почему погиб социализм 1<br />8993 = 122 вместо 131</span></em><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-jhOp3j3ugCY/T5lc8YWasBI/AAAAAAAAAB8/c3wkOva26v4/s1600/Res1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="297" oda="true" src="http://3.bp.blogspot.com/-jhOp3j3ugCY/T5lc8YWasBI/AAAAAAAAAB8/c3wkOva26v4/s400/Res1.jpg" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-G3jZPEFpqrE/T5lc-Uz8GtI/AAAAAAAAACE/1efzD6A_-60/s1600/Res2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="297" oda="true" src="http://4.bp.blogspot.com/-G3jZPEFpqrE/T5lc-Uz8GtI/AAAAAAAAACE/1efzD6A_-60/s400/Res2.jpg" width="400" /></a></div>
<div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;">
то есть, номер записи сохранился, а номер экземпляра стал на единицу больше максимального. А поскольку в "выдачи пишутся" номера экземпляров, а не записей и возникла "каша".</div>
</div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5957218827659569747.post-64033486896182864152012-03-28T11:03:00.000-07:002012-04-26T07:11:40.717-07:00Lib.ldb<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<div style="text-align: justify;">
Наверное, для начала, что-то общее для всех. Описываемые далее действия производились в разное время и в конце привели к некоторому пониманию назначения файла *.ldb, который всё время болтается возле больших и серьёзных файлов (не забудь вместо * подставить имя открытой базы, например Lib.ldb). Сам появляется, сам исчезает...</div>
Кстати, все средства выгрузки записей в МАРК формате, модулей АС-Библиотека-3, по умолчанию так-же предлагают расширение *.ldb (очевидно от local db). Но это другая тема.<br />
Из руководств по "Access" известно, что это файл блокировок. Ну и что это даёт? Зачем он нужен? Можно ли его грохнуть? И когда?<br />
Попробуем препарировать его с помощью "Процесс монитор" (Найдёш его и ещё много интересного по ссылке <a href="http://technet.microsoft.com/ru-ru/sysinternals/bb896645" target="_blank">http://technet.microsoft.com/ru-ru/sysinternals/bb896645</a>)<br />
Сразу замечу, если задумаеш повторить, не забудь поставить фильтрацию событий только процесса "EServer". Иначе ты утонеш в потоке. Кроме того, по умолчанию, он сохраняет события в виртуальной памяти, а значит в файл подкачки. И если он невелик - ты быстро исчерпаеш ресурсы. Направь поток в какой нибудь файл, если намерен сделать "большой захват". В нашем случае можно оставить по умолчанию.<br />
Итак, открываем "Диспетчер задач", находим для "EServer.exe" PID = 3924.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-ub6-qdDCW2M/TxdGImKwuGI/AAAAAAAAAAc/s9wE-m_TleU/s1600/PID.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="443" nfa="true" src="http://3.bp.blogspot.com/-ub6-qdDCW2M/TxdGImKwuGI/AAAAAAAAAAc/s9wE-m_TleU/s640/PID.png" width="640" /></a></div>
<br />
Запускаем "Процесс монитор" и сразу останавливаем захват, очищаем экран и ставим фильтр, исключающий все события, не отнносящиеся к PID = 3924.<br />
(с лева на право)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-G_I7IEcBcOo/TxdIhoFFlHI/AAAAAAAAAAk/2HtO5vYnMcA/s1600/Start.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="468" nfa="true" src="http://1.bp.blogspot.com/-G_I7IEcBcOo/TxdIhoFFlHI/AAAAAAAAAAk/2HtO5vYnMcA/s640/Start.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-e2dK35RD3LU/TxdI2GkU1NI/AAAAAAAAAAs/PKaJcpRniYc/s1600/Filter.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="399" nfa="true" src="http://3.bp.blogspot.com/-e2dK35RD3LU/TxdI2GkU1NI/AAAAAAAAAAs/PKaJcpRniYc/s640/Filter.png" width="640" /></a></div>
<br />
Стартуем захват и даём нагрузку. Я просто подключаю "Администратор" и делаю небольшую выборку из произвольной таблицы. После чего захват можно остановить.<br />
Первое, что бросилось в глаза - создание временного файла "C:\Windows\Temp\JET3B7.tmp".<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-jpQQWGRHWAE/TxdJYdHl9oI/AAAAAAAAAA0/nIyx7TUe5bY/s1600/JetTemp1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="305" nfa="true" src="http://4.bp.blogspot.com/-jpQQWGRHWAE/TxdJYdHl9oI/AAAAAAAAAA0/nIyx7TUe5bY/s640/JetTemp1.png" width="640" /></a></div>
<br />
Я сразу проверил папку "C:\Windows\Temp" и обнаружил там несколько сотен, небольших по размеру, файлов с началом "JET*.tmp". Понятно, что если на компьютере и по сети не открыта ни одна база "Access", то их быть не должно. Поэтому рекомендую тебе периодически заглядывать в эту папку и наводить там порядок.<br />
Прокрутив ниже, легко обнаружить место, где создаётся файл "Lib.ldb" и небольшая запись в него, с использованием стандартного "IRP".<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-wIaZ_nqaF0U/TxdFEQbhJGI/AAAAAAAAAAU/CkS6gwlC4tI/s1600/CreateLdb1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="275" nfa="true" src="http://4.bp.blogspot.com/-wIaZ_nqaF0U/TxdFEQbhJGI/AAAAAAAAAAU/CkS6gwlC4tI/s640/CreateLdb1.png" width="640" /></a></div>
<br />
А дальше начинается самое интересное. Обрати внимание - блокировки кладутся на "Lib.ldb", а читается "Lib.mdb" и всё это методом "FASTIO_*". Кроме того, смещения, по которым блокируется "Lib.ldb", какие то запредельные: "Offset 268435457". Файл то ведь маленький!<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-h55EA-Osa_M/TxdL0kftzPI/AAAAAAAAAA8/Wh7pi8McnQs/s1600/SizeOfLdb1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" nfa="true" src="http://1.bp.blogspot.com/-h55EA-Osa_M/TxdL0kftzPI/AAAAAAAAAA8/Wh7pi8McnQs/s640/SizeOfLdb1.png" width="468" /></a></div>
<br />
Я знал, что "Lib.ldb" это файл блокировок. Но что в таком буквальном смысле, скажу честно, не ожидал. Не так давно я читал книгу "Внутреннее устройство Windows" М.Руссиновича и Д.Соломона (кстати "Процесс монитор" это творение Руссиновича, а книгу всячески рекомендую) и мне, похоже, удалось найти объяснение. Точнее это только версия, но весьма правдоподобная. Всё дело в многочисленных ограничениях, накладываемых системой на возможность выполнения операций "Быстрого" (FASTIO_) ввода-вывода. Их названия говорят за себя - обмен происходит напрямую с системным кэшем, минуя большое количество системных слоёв (драйверы ФС и т.д.). Одной из причин отклонения "FASTIO_*" является наложенная блокировка, поэтому их и вынесли в отдельный файл *.ldb. Есть системные счетчики, отвечающие за "FASTIO_*": "Кэш:Синхронных чтений/сек" и "Кэш:Не осуществлённых чтений/сек" (названия могут отличаться, для разных систем). Однако их показания меня не впечатлили. Если при подключении "Администратор" их зашкаливает (на графике красным цветом),<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-xKUU24EjnE4/TxdMDQQPb1I/AAAAAAAAABE/3LDYvQFbkZ0/s1600/Counter2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="463" nfa="true" src="http://2.bp.blogspot.com/-xKUU24EjnE4/TxdMDQQPb1I/AAAAAAAAABE/3LDYvQFbkZ0/s640/Counter2.JPG" width="640" /></a></div>
<br />
то на выборке небольшой таблицы их показания совсем не велики (а может, просто, этого достаточно?).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-yjg1YBpntfI/TxdMQJJNmHI/AAAAAAAAABM/fBv_xMUmExo/s1600/Counter1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="463" nfa="true" src="http://3.bp.blogspot.com/-yjg1YBpntfI/TxdMQJJNmHI/AAAAAAAAABM/fBv_xMUmExo/s640/Counter1.JPG" width="640" /></a></div>
<div style="text-align: justify;">
<br />
На больших выборках они вовсе никак себя не проявляют. Однако "Access", всё же настольная база.<br />
Теперь несколько слов об удалении. Так удалять или нет? Когда то давно я читал рекомендации "Microsoft" по обслуживанию баз "Access" (сейчас, хоть убей, не могу найти). Там было чётко указано, что перед операцией "Сжать/Восстановить" необходимо удалить соответствующий файл блокировки. В данной ситуации лучше прислушаться к производителю. В остальном, в свете выше сказанного, вопрос сводится к следующему - могут ли в *.ldb "застрять" активные блокировки? При катастрофических сбоях наверное да. Но это автоматически приводит к операции "Сжать/Восстановить" и к удалению. А если ты просто принудительно "положил" "EServer" с подключенным клиентом, то вряд ли. Система зачистит ресурсы. Другое дело, если база открыта по сети, из "расшареной" папки. Но это уже не наш случай.</div>
</div>Unknownnoreply@blogger.com0