Смекни!
smekni.com

Розробка автоматизованого робочого місця науково-технічної бібліотеки університету (стр. 8 из 15)

Розгортання - найбільш неприємна процедура розробки крупних розподілених систем. Будь-який розробник Windows-программ може сказати, що, зіткнувшись з масою різноманітних двійкових файлів, проблемами реєстру Windows, компонентами СОМ, установкою бібліотек підтримки таких продуктів, як Open Database Connectivity (ODBC) і Data Access Objects (DAO), ви міцно задумаєтеся, а чи правильно ви вибрали рід занять. Слава богу, розгортання - це та частина .NET, над якою проектувальники добре потрудилися.

Ключ до розгортання .NET-приложений - концепція складок (assemblies). Збіркою називають пакет з семантично близьких об'єктів, що складається з одного або декількох файлів. Особливості розгортання залежать від того, що ви розробляєте: Web-серверное застосування або персональне застосування для Windows. Проте з введенням збірки як повністю інкапсульованого набору функціональних можливостей розгортання зводиться до простого копіювання потрібних складок в місце призначення.

Маса проблем, що мучили програмістів до появи .NET Framework, тепер усунено. Тепер, наприклад, не треба реєструвати компоненти (як це вимагають СОМ і елементи управління ACTIVEX), оскільки завдяки метаданим і віддзеркаленню всі компоненти містять в собі власний опис. Під час виконання .NET відстежує також роботу з файлами і версії файлів, пов'язаних з додатком. Тому будь-яке встановлюване застосування, автоматично зв'язується з файлами, що є частиною його збірки. Якщо програма установки спробує перезаписати файл, необхідний іншому застосуванню .NET поступить достатньо розумно, дозволивши встановити потрібні файли, не видаливши при цьому попередні версії файлу, оскільки вони ще потрібні іншому застосуванню.

Для роботи .NET - застосування на комп'ютері має бути встановлене середовище .NET Framework.

Мінімальні характеристики комп'ютера необхідного для комфортної роботи програми в операційній системі Windows XP:

­ процесор Intel Pentium/amd Athlon 2000 Гц;

­ ОЗУ 512 Мб;

­ Вінчестер 100 Гб.

Але оскільки нам потрібна нормальна робота Інтернет-сервера і Microsoft SQL Server на нашому комп'ютері, то конфігурація має бути значно посилена:

­ процесор не менше 3000 Гц;

­ ОЗУ не менше 1 Гб;

­ вінчестер не менше 200 Гб.

1.4 Рішення з математичного забезпечення

1.4.1 Пошук у тексті

У нашому проекті для повноцінного пошуку використовуються засоби текстового пошуку. В даний час такі засоби посилено розвиваються. До складу Microsoft SQL Server 2005 навіть включений новий для СУБД спеціальний компонент Full-text Search (повнотекстовий пошук).

Одним з наймогутніших інструментів пошуку в текстах є регулярні вирази.

Регулярні вирази підтримуються багатьма програмами (редакторами, системними утилітами, ядрами баз даних і так далі), але їх можливості повною мірою виявляються в мовах програмування, зокрема Java, Jscript, Visual Basic, Vbscript, Javascript, C, C++, C#, elisp, Perl, Python, Ruby, PHP, awk і тому подібне Регулярні вирази займають центральне місце в багатьох програмах, написаних на цих мовах.

Підтримка регулярних виразів в таких різнорідних застосуваннях пояснюється тим, що регулярні вирази володіють виключно багатими можливостями. На низькому рівні регулярний вираз описує якийсь фрагмент тексту. Їм можна скористатися для перевірки даних, введених користувачем, або, наприклад, для фільтрації великих об'ємів даних. На більш високому рівні регулярні вирази дозволяють управляти даними.

За допомогою регулярних виразів ви можете проводити пошук, заміну підрядків, використовуючи шаблони. Вони складаються із звичайних символів і так званих метасимволів (metacharacters) - символів, що управляють. Список метасимволів достатньо обширний. Нижче приведені найбільш часто використовувані символи:

­ * - сооветствуєт виразу, що знаходиться до знаку "*", узятому нуль або більше разів. Наприклад, шаблон "[0-9]*" визначає рядок, що містить нуль або більш за цифри;

­ - призначений для визначення символу, що є метасимволом. Наприклад, шаблон "." відповідає будь-якому символу, а шаблон "\." відповідатиме крапці;

­ ^ - визначає початок вхідного рядка;

­ $ - визначає кінець вхідного рядка;

­ + - відповідає виразу, що знаходиться до знаку "+", узятому один або більше разів. Наприклад, шаблон "[0-9]+" визначає рядок, що містить одну або більш за цифри;

­ . - визначає будь-який символ окрім символу перекладу рядка;

­ | - розділяє два вирази. Наприклад, шаблону "a|b" відповідатимуть рядки "a" і "b";

­ [a-z] - визначає діапазон символів. Наприклад, шаблон "[0-9]" визначає цифру;

­ [^.] - визначає будь-який символ, не відповідний заданому набору. Наприклад, шаблон "[^0-9]" визначає будь-який символ, окрім цифри;

­ w - слово. Те ж, що і [a-za-z_0-9];

­ W - все, окрім слів. Те ж, що і [^a-zA-Z_0-9];

­ s - будь-яке порожнє місце. Те ж, що і [ \f\n\r\t\v];

­ |S - будь-яке непорожнє місце. Те ж, що і [^ \f\n\r\t\v];

­ d - десяткова цифра. Те ж, що і [0-9];

­ D - не цифра. Те ж, що і [^0-9].

Ось простий приклад регулярного виразу - шаблон номера телефону.

^(\(\d+\)){0,1}d{3}-\d{2}-\d{2}$

Цей вираз може показатися складним, хоча насправді все досить просто:

­ ^ - цей символ указує, що тут починається шуканий рядок;

­ (- код міста розташовується усередині дужок;

­ ( - відкриваюча дужка;

­ d+ - після дужки повинні розташовуватися код міста - одна або декілька цифр;

­ ) - Закриваюча дужка;

­ ) - Закриваюча дужка - метасимвол, вказуючий, що тут закінчується групований вираз (в даному випадку, код міста);

­ 0,1} - Цей метасимвол указує, що вираз в дужках (код міста) може повторюватися від нуля до одного разу, тобто код міста можна не указувати;

­ d{3}-\d{2}-\d{2} - Три групи цифр - одна група по три і дві по дві цифри. Цифри розділені дефісами;

­ $ - Цей знак показує, що тут закінчується підрядок.

Найчастіше регулярні вирази використовуються для пошуку і порівняння рядків. Оскільки таке завдання при обробці даних зустрічається дуже часто, бажано, щоб пошук рядків виконувався швидко.

Розглянемо деякі алгоритми пошуку заданого слова (підрядки) в рядку.

Відмітимо, що дане завдання не зводиться тільки до обробки текстів. Це, наприклад, і пошук даного ланцюжка нуклеотідов в молекулі ДНК, і пошук заданої послідовності дій в реалізації алгоритму. У загальному випадку, кажучи формально, завдання пошуку підрядків (string-matching problem) полягає в наступному [12].

Хай дані «текст» - масив T[1..n] довжини n і «зразок» - масив P[1..m] довжини m. Ми вважаємо, що елементи масивів P і T - символи деякого кінцевого алфавіту Ќ (наприклад Ќ = {0,1} або Ќ = {а, b ., z}). Масиви, що складаються з символів алфавіту Ќ, часто називають рядками символів, або словами в цьому алфавіті.

Говоритимемо, що зразок P входить із зрушенням s, або, еквівалентно, входить з позиції s + 1 в текст T, якщо 0 <= s <= n - m і T[s + 1..s + m]= P[1..m] (іншими словами, якщо T[s + j]= P[j] при 1 <= j <= m). Якщо P входить із зрушенням s в текст T, то говорять, що s - допустиме зрушення, інакше s - неприпустиме зрушення. Завдання пошуку підрядків полягає в знаходженні всіх допустимих зрушень для даних тексту T і зразка P.

1.4.2 Обозначення та терміни

Через Ќ* позначається множина всіх кінцевих рядків над алфавітом Ќ, включаючи порожню рядок, що має нульову довжину і е, що позначається. Довжина рядка x позначається |x| . З'єднання, або конкатенація рядків x і у виходить, якщо виписати рядок x, а за нею - рядок у. Конкатенація рядків x і у позначається xy; очевидно |xy| = |x|+|y|.

Говоритимемо, що рядок w - префікс, або початок рядка x, якщо x = wy для деякого у € Ќ*. Говоритимемо, що рядок w - суфікс, або кінець рядка x, якщо x = yw для деякого у € Ќ*. Писатимемо w [ x, якщо w - префікс x, і w ] x, якщо w - суфікс x. Наприклад, ab [ abcca і cca ] abcca.

Порожній рядок є префіксом і суфіксом будь-якого рядка; якщо w - префікс або суфікс x, то |w| <= |x|. Для будь-яких рядків x і у і для будь-якого символу а співвідношення x ] у і ха ] уа рівносильні; стосунки ] і [ транзитивні.

Хай x, у і z - рядки, для яких x ] z і x [ z. Тоді x ] у, якщо |x| <= |y|; у ] x, якщо |x| >= |y|, і x = у, якщо |x| = |y|.

Якщо S[1..r] - рядок довжини r, то його префікс довжини до <= r позначатиметься Sk = S[1..k] (зокрема, S0 = е і Sr = S). У цих позначеннях завдання про знаходження зразка P довжини m в тексті T довжини n полягає в знаходженні всіх таких s з проміжку 0 <= s <= n - m, що P ] Ts+m.

1.4.3 Аналіз алгоритму текстового пошуку

Найпростіший алгоритм пошуку зразка P в тексті T послідовно перевіряє рівність P[1..m]= T[s + 1..s + m] для всіх n - m + 1 можливих значень s:

for s = 0 to n - m

if P[1..m]= T[s+1..s+m]

then print «рядок входить із зрушенням» s

Можна сказати, що ми рухаємо зразок уздовж тексту і перевіряємо всі його положення. Відзначимо, що перевірка рівності рядків (P[1..m]= T[s+1..s+m]) є ще одним внутрішнім циклом.

Час роботи приведеної процедури пошуку у гіршому разі є І((n - m + 1)m). Насправді, хай T = an (буква а, повторена n разів), а P = am. Тоді для кожної з n - m + 1 перевірок буде виконано m порівнянь символів, всього (n - m + 1)m, що є І(n2) (при m = n / 2).

Простий алгоритм - не кращий. Неефективність пов'язана з тим, що інформація про текст T, що отримується при перевірці даного зрушення s, ніяк не використовується при перевірці подальших зрушень. Тим часом, така інформація може дуже допомогти. Хай, наприклад, P = aaab і ми з'ясували, що зрушення s = 0 допустимий. Тоді зрушення 1, 2 і 3 свідомо недопустимі, оскільки T[4]= b.

1.4.4 Швидкий алгоритм текстового пошуку

Цей алгоритм, запропонований Кнутом, Морісом і Праттом, працює за час І(n + m). Таке прискорення досягається за рахунок того, що при подальшому пошуку заздалегідь обчислюється спеціальна «префікс-функція» на основі вже відомої інформації.