prepod

Путь к Файлу: /РОССИЙСКИЙ НОВЫЙ УНИВЕРСИТЕТ / Smalltalk / Web Log Stats Lesson 4.doc

Ознакомиться или скачать весь учебный материал данного пользователя
Скачиваний:   2
Пользователь:   prepod
Добавлен:   04.05.2015
Размер:   242.5 КБ
СКАЧАТЬ

Web Log Stats Lesson 4

Web Log Stats Lesson 4

Web Log Stats Lesson 4 Reading External Files and Parsing Strings

Web Log Stats Lesson 4

| Table of Contents | Lesson 3 | Lesson 5 |

Web Log Stats Lesson 4

The previous workshop verified that you could successfully locate a web server log file on your machine and that you were able to view it in the VisualWorks File Editor. This brought the file in "all at once", but in order to count the "hits", we need to be able to read in the file line by line.

Web Log Stats Lesson 4

В этом уроке, мы научимся создавать циклы, то есть процессы, где повторяется определенная часть, пока не выяснится, что пора кончить. В частности, мы будем повторять прочтение файла строку за строкой и скажем ему что пора кончать, когда конец файла будет достигнут. По ходу дела мы для каждой строки выделим IP адрес.

Web Log Stats Lesson 4

1. В рабочем поле Workspace, изменим текст, выделив его полностью <Operate-Click>, а затем выбрав Do it.

| myFile myStream | myFile := 'ws000101.log' asFilename. myStream := myFile readStream. myStream inspect. myStream close.

A Появится новое окно инспектора Inspector. В окне можно прочитать an ExternalReadStream с self одиннадцатью других свойств, появившихся на левой панели. Важная часть системы VisualWorks работает с последовательными файлами, как со stream (потоком) знаков. См. Рисунок 4-1.

Web Log Stats Lesson 4 Рисунок 4-1. Регистрационный файл как Stream (поток) в окне Inspector

Web Log Stats Lesson 4

Напоминание. Может быть, мы применяли "путь по умолчанию " для размещения этого файла, если не поместили его в "директории по умолчанию" системы VisualWorks. Вспомним, что когда нам задавался вопрос, как ссылаться на этот или любой другой файл, примерный ответ был прост – " не известно" ("non-qualified"). Это было воспринято как название файла. It will be up to you to make sure you are correctly referencing this file. Надо помнить, что преимущество размещения этого файла ( и всех других регистрационных файлов) в "директории по умолчанию" состоит в том, что мы имеем возможность копировать и вводить участки кода из этого урока в Workspace.

Web Log Stats Lesson 4

2. В левой панели окна инспектора, щелкнем (выделим) по слову lineEndCharacter.

Заметим, что в правой панели отображено значение lineEndCharacter,  равное Core.Character cr.В Unix/Linux оно отоброазится как Core.Character lf. Это нужно помнить, так как мы воспользуемся этой информцией позже в ходе этого урока.

3. Закроем окно Inspector.

Web Log Stats Lesson 4

Многое здесь происходит, поэтому рассмотрим это шаг за шагом.

| myFile myStream |

На этом первом шаге мы объявляем две временных переменных. Это сделано помещением вертикальной черточки сначала, списка названий переменных, разделенных пробелом, и знаком вертикальной черточки, замыкающим список.

myStream := myFile readStream.

Это место, откуда начинаются интересные вещи. По выражениям назначения (они содержат символ :=), Smalltalk выполняет сначала правую часть, а затем назначает результат левой частиe. Так объекту myFile послано сообщение readStream. Это означает, что мы хотим обращаться с регистрационным файлом (log file), как с потоком ("stream") знаков (ведь этот файл получает компьютер) и присвоить этот поток временной переменной myStream.

myStream inspect.

Мы даем указание Smalltalk'у инспектировать поток (то есть это похоже на опцию Inspect It в меню <Operate>, но вызывается программным путем) (Cool !!).

myStream close.

Пока мы разглядывали окно Inspector, Smalltalk продвинулся вперед и выполнил последнюю строку, которая и закрыла файл (это хорошая мысль – закрывать файл, когда он окончен).

Преимущества использования потока (stream) состоит в определении lineEndCharacter, мы можем прочитявать файл строка за строкой. So let's try to read in just the first line of the file.

Web Log Stats Lesson 4

4. Изменим текст, выделим его, нажмем <Operate-Click> и выберем Do It.

Пользователи UNIX/Linux должны изменить cr  на lf .

| myFile myStream myLine | myFile := 'ws000101.log' asFilename. myStream := myFile readStream. myLine := myStream upTo: Character cr. myLine inspect. myStream close.

Заметим, что новое окно (Inspector) will appear with the caption of the window being a MSCP1252String (MSCP1252 is a Windows character set designation). Displayed in the Inspector window is the first line of our file. See Figure 4-2.

Web Log Stats Lesson 4 Рисунок 4-2. Первая строка регистрационного файла

Web Log Stats Lesson 4

Если приведенный код не выдается "построчно" (то есть возвращает все содержание файла одной строкой), то применяемой операционной системе может понадобиться немного помощи в истолковании знака "конец строки".

Так как мы знаем, что этот файл имеет этот знак в конце каждой строки, то можем указать системе VisualWorks, чтобы она ожидала этого знака, когда открывается файл. Способ проделать это состоит в следующем:

myStream := myFile readStream lineEndCRLF.

Мы немного забегаем вперед (ведь это выражение не принадлежит к известному нам синтаксису метода объекта), но это будет кратко впоследствии. Сейчас достаточно сказать, что в приведенной строке объединены две строки кода. Выражения Smalltalk'a выполняются слева направо, поэтому myFile readStream выполняется сначала и возвращает экземпляр класса Stream, а этот объект затем посылает сообщение lineEndCRLF. В результате VisualWorks теперь знает, что когда ему встречаются знаки возврата строки, то это будет происходить в конце строки в файле.

Web Log Stats Lesson 4

5. В окне Inspector щелкнем по закладке Basic.

На левой панели self сопровождается последовательностью чисел со значениями от 1 до 122. Это говорит о том, что первая строка содержит 122 знака (одно число для каждого знака).

Web Log Stats Lesson 4 Figure 4-3. The first line of the log file contains 122 characters

Web Log Stats Lesson 4

Нужно объяснить 4-ю строку приведенного кода. Это большая работа. 

myLine := myStream upTo: Character cr.

В третьей строке, когда мы выдали сообщение readStream объекту myFile, Smalltalk преобразовал объект Filename в объект Stream. Полное содержание файла имеет форму потока знаков. Будем считать, что этот поток знаков хранится во временной переменной myStream.

Теперь до четвертой строки, где мы выдаем сообщение upTo: объекту Stream, которому принадлежит myStream. Заметим, что за этим сообщением следует двоеточие, которое означает, что за двоеточием следует параметр. С английского эту строку можно перевести так: "взять все знаки потока myStream до знака Character cr и присвоить их объекту myLine. Это чем-то похоже на копирования выражения. Сообщение upTo: только хочет знать "где мне остановиться?". Знак cr обозначает возврат каретки (Carriage Return сокращено до cr) и для большинства построчных файлов, подобных данному, Carriage Return отмечает конец одной строки и возвращение к следующей.

Заметим,что четвертая строка несколько более сложна, чем 4 squared или 3 + 4. Не только потому, что это выражение, содержащее параметр, но и потому, что оно включает объект (myStream), класс (Character) и 2 сообщения (upTo: и cr). Чтобы разобраться, как Smalltalk интерпретирует эту строку (то есть какой метод выполняется первым), следует обратиться к начальному описанию синтаксиса, которое содержит также информацию об общепринятом в Smalltalk'е правиле названия объектов.

Мы прочли первую строку файла. Теперь нужно выделить из этой строки IP адрес. Так как это "разделенный запятыми" файл, все поля в этом файле разделены запятыми. Так как IP адрес всегда является первым полем в каждой строке, нужно просто прочесть все знаки в строке "вплоть до" первой запятой, и это будет IP адрес. Сделаем это.

Web Log Stats Lesson 4

Обратимся к начальному синтаксису.

Букварь : синтаксис Smalltalk'а (Часть 1)

 

Web Log Stats Lesson 4

В Smalltalk'е имеется три типа сообщений. Разница между этими типами важна потому, что они подчиняются правилам, например, как разделить сложное сообщение в Object - Method – основном строительном блоке языка.

Web Log Stats Lesson 4

В Smalltalk'е широко распространено правило присвоения названий (оно не является строгим стандартом, но может им стать), которое выглядит следующим образом.

Web Log Stats Lesson 4

Части кода в этом разделе могут быть запущены в Workspace.

Web Log Stats Lesson 4

Итак, в Smalltalk'е есть три типа сообщений:

·  Унарные

·  Бинарные и

·  Ключевые слова

Унарные сообщения

4 squared 'pots' reverse 10 factorial 'chocolate' asUppercase 6.4 rounded

Представленные выражения образуют строительный блок языка Smalltalk. Как в русском языке существуют простейшие предложения, где есть подлежащее и сказуемое ("Он идет."), так и выражение Smalltalk'а имеет объект и сообщение и называется Унарным сообщением.

Бинарные сообщения

3 + 4 6 * 5 'Visual' , 'Works'

Выше даны примеры бинарных сообщений. Здесь выражение имеют два объекта в одном сообщении. Большинство бинарных сообщений являются математиыескими выражениями, но вовсе не обязаны быть таковыми. Третий пример ('Visual' , 'Works') имеет два экземпляра класса String с запятой в качестве сообщения. Метод "запятой" используется при конкатенации. В данном случае метод используется, чтобы добавить строку 'Works' к объекту 'Visual', в результате в классе String образуется объект 'VisualWorks'.

Сообщения ключевые слова

Dialog warn: 'Hello World' Transcript show: 'Hello World' ('Got Milk?') copy replaceFrom: 5 to: 8 with: 'I am lost' startingAt: 6

Каждое приведенное сообщение является примером сообщения ключевое слово. Признаками этих сообщений является двоеточие (:). Так в одном из наших примеров мы использовали класс Dialog и послали ему сообщение warn. Двоеточие, которое следует за сообщением warn, означает, что что-то (параметр) связывается с сообщением warn. В этом случае это строка знаков, заключенная в одинарные кавычки. 

Обратим внимание на то, что в последнем примере насчитывается четыре сообщения, так там четыре слова с двоеточием. Но на самом деле там один метод.  Метод  называется  replaceFrom:to:with:startingAt:. Это звучит немного странно, но вполне понятно, чтобы разделить этот метод на части. Это одиночный метод с четырьмя параметрами. Сообщения сами описывают параметры, которые ожидает этот метод.

Web Log Stats Lesson 4

Выполнение выражений в Smalltalk'е

Теперь о правилах. Мы помним, что не имеет значения, насколько сложно выражение. Оно должно быть разделено на части 

Объект сообщение

1. Слева направо

2. части выражений внутри скобок должны выполняться раньше

3. Унарные сообщения

4. Бинарные сообщения

5. Сообщения ключевые слова

Кроме того, сообщение производит объект в качестве возвращаемого объекта. Этот объект может быть использован как получатель или в качестве параметра следующего сообщения в выражении.

Web Log Stats Lesson 4 Рисунок S-1. Типичное "сложное" выражение.

Так как нигде нет скобок, работаем слева направо, выполняем сначала унарные сообщения, затем бинарные сообщения затем ключевые слова. Итак, сначала выполняем

Date today weekday

Затем нужно выполнить

December 25, 2000 weekday

Конечно, дата "December 25, 2000" появилась бы, если бы мы выполняли это упражнение в эту дату. С другой стороны она должна вернуть дату того дня, когда ведется выполнение. Поэтому "Date today" возвращает объект Date. Объекту Date затем посылается сообщение weekday, в результате которого возвращается день недели на эту дату.

Web Log Stats Lesson 4 Figure S-2. Как Smalltalk выполняет "сложное" выражение.

Web Log Stats Lesson 4

Правило названий

·  Название класса всегда начинается с заглавной буквы

·  Название метода всегда начинается со строчной буквы

·  Название метода, состоящее из нескольких слов, никогда не сокращается

·  Название метода, состоящее из нескольких слов, должно использовать заглавные буквы для каждого слова, следующего за первым 

·  Пробелы в названиях методов не допускаются

·  Правила, применимые к названиям метода, действительны и для названий переменных экземпляра

Теперь, когда эти правила введены, будет легче работать со "сложными" выражениями и различать разные типы методов.  

я

Типы методов

Существует два основных типа сообщений:

·  Методы класса

·  Методы экземпляра

Рассмотрим каждый тип подробнее.

Dialog warn: 'Hello World'

Так как слово Dialog начинается с заглавной буквы, то Dialog является классом. Так как Dialog является классом, warn: является методом класса. Он возвращает отдельный экземпляр класса Dialog (послание со строкой 'Hello World' в нем и кнопку OK).

4 factorial

Число 4 является экземпляром класса SmallInteger class. Следовательно, , factorial это метод экземпляра. Он возвращает отдельный экземпляр класса SmallInteger (24).

Date today weekday

Так как Date начинается с заглавной буквы, Date является классом. Так как Date это класс, today является методом класса. Он возвращает отдельный экземпляр класса Date (независимо от даты дня). Если двигаться слева направо, следующим будет термин weekday. Так как он следует за экземпляром класса Date, то weekday является методом экземпляра. Он возвращает символ (символ в языке Smalltalk это отдельный тип объекта, который действует как константа, но здесь это неважно). Что важно сейчас, так это как результирующий объект от "Date today" использован в качестве получателя следующего сообщения "weekday".

Transcript show: Date today weekday

Двигаясь слева направо, заметим, что имеем сообщение ключевое слова (так как show:), но ключевые слова являются по порядку последними. Мы должны сначала рассмотреть унарные или бинарное сообщение. Выражение "Date today weekday" выполняется первым и получает в результате "Monday", который затем используется как параметр в ключевом слове show: объекта Transcript. Происходит нечто подобное слудующему:

Transcript show: Date today weekday

Transcript show: (December 25, 2000) weekday

Transcript show: Monday

 

Web Log Stats Lesson 4

Резюме

Многое должно быть рассмотрено в синтаксисе Smalltalk'а, но первые шаги в этом направлении позволяют немного легче разбираться в коде Smalltalk'а.

Web Log Stats Lesson 4

6. Изменим код, выделим его выполним щелчок правой кнопкой и затем выберем Do it.

| myFile myStream myLine addrIP | myFile := 'ws000101.log' asFilename. myStream := myFile readStream. myLine := myStream upTo: Character cr. addrIP := myLine copyUpTo: $,. addrIP inspect. myStream close.

Заметим, что появится новое окно (Inspector) с заголовком MSCP1252String. Здесь мы увидим значение MSCP1252String, которое представляет собой IP адрес, а именно 209.67.247.201. Щелкнув по закладке Basic, увидим числа от 1 до 14, показывающие, что IP адрес содержит 14 знаков (одно число на каждый знак).

Web Log Stats Lesson 4 Рисунок 4-4 Пример IP адреса

7. Закрываем окно Inspector.

Web Log Stats Lesson 4

Объясним пятую строку приведенного кода.

addrIP := myLine copyUpTo: $,.

Теперь, когда временная переменная myLine содержит первую строку знаков, необходимо взять все знаки до запятой и сохранить их во временной переменной addrIP. Так мы даем объекту String значение myLine (напомним, это экземпляр класса ByteString) и сообщаем copyUpTo:, а затем передаем ему параметр $,. Так как особое внимание уделено нами знаку "запятая", мы применяем знак доллара перед запятой, чтобы Smalltalk'у, что нам нужен знак запятой. В языке Smalltalk запятая имеет особое значение (это, как ни удивительно, сообщение), поэтому, применяя знак доллара, мы сообщаем, что запятую следует просто как знак, а не как сообщение.

Заметим, что мы имеем два разных сообщения, которые в основе представляют собой одно и то же. Сообщение upTo: копирует слово "до" некоторого параметра. Сообщение copyUpTo: копирует слово "до" некоторого параметра. Причина, почему нами применено два разных сообщения, состоит в том, что имеется два разных объекта. Сообщение upTo: используется объектами Stream, тогда как сообщение copyUpTo: используется объектами String.

Теперь мы можем сказать себе: "Как бы было хорошо, если бы мы имели одно сообщение, которое 'copied stuff up to some parameter' независимо от того, какой класс применяется". Ответ да, и к этот подход носит название полиморфизм, фундаментальный принцип объектно-ориентированного программирования. Сейчас же важно запомнить, что сообщение upTo: применяется к объектам Stream, а сообщение copyUpTo: к объектам String.

Web Log Stats Lesson 4

Proceed to the polymorphism primer.

OK. We have an IP address. But each line contains an IP address. We need a way to loop through the file line by line and collect the IP address as we go. Would you believe that just one additional line of code will do that?

Web Log Stats Lesson 4

8. Изменим код  выделим его, нажмем <Operate-Click> и затем выберем Do it.

| myFile myStream myLine addrIP | myFile := 'ws000101.log' asFilename. myStream := myFile readStream. [ myStream atEnd ] whileFalse: [ myLine := myStream upTo: Character cr. addrIP := myLine copyUpTo: $,.

Transcript show: addrIP.]. myStream close.

Заметим, что весь текст (числа) появился в главном окне VisualWorks. Мы помним, что эта область отображения носит название System Transcript и это один из четырех способов отображения (Lesson 2).

Web Log Stats Lesson 4 Рисунок 4-5. Все IP адреса, отобразившиеся в Transcript

Web Log Stats Lesson 4

Другая строка кода, которая действует совсем немного.

Это по существу тот же код, что и предыдущий. Так как мы располагаем кодом для построчного прочтения и выделения IP адреса, то нужен способ повторения этого процесса с начала файла до конца. Помимо выражения в окне Transcript, в нем отображается IP адрес, который вместе для повторения этого цикла занимает одну строку кода!

[ myStream atEnd ] whileFalse: [

Так как одна строка кода делает для нас так много, требуется совсем немного объяснения. Чтобы не вырывать из текста, рассмотрим материал о циклах.

Web Log Stats Lesson 4

Proceed to the loops primer.

Web Log Stats Lesson 4

Резюме

Большинство комментариев к теме и концепций, касающихся языка Smalltalk, в этом упражнении было отмечено. Остался еще один шаг до того окончания – это подсчет количества запросов к данному сайту в каждый отдельный день.  В этом мы разберемся в дальнейшем. Теперь посмотрим, как мы пришли к данной точке.

Сначала мы должны узнать, как открывать файл. Затем, как прочитывать его строку за строкой. Затем, как выделять данные из этой строки.  Вместо того, чтобы делать все это одновременно (запись в System Transcript пути для отображения всех IP адресов в регистрационном файле web сервера),  мы делаем это в стиле " проверим данный участок кода – он работает – продолжаем". В другом языке программирования, вы не можете этого делать. Потребуется писать весь код в каком-нибудь текстовом редакторе, компилировать его и затем запускать. В первое время, при запуске этого кода вы не знаете, будет ли он работать. Что он заработает, шансов мало, поэтому двигаемся назад и сохранить проблему (в своем редакторе),  компилировать его и запустить снова. Вы должны повторять весь процесс снова и снова, пока не получите работающую программу. Это и есть подход «все или ничего».   

В Smalltalk’е, он идет по возрастающей. Вы тестируете отрывок и имеете дело с небольшими участками кода, получаете их работающими и затем соединяете их в единый участок кода. Именно это то, что делает разработку кода на языке Smalltalk намного более продуктивной. Раз мы получаем эти маленькие отрезки кода работающими, то нам не нужно возвращаться и снова их тестировать.

В следующем примере, поскольку мы уже знаем, как выделять все IP адреса из файла, то получим возможность их собирать, сортировать и считать. 

Теперь мы знаем, как:

Web Log Stats Lesson 4  Читать файл строку за строкой

Web Log Stats Lesson 4  Выделять данные из строки знаков

Web Log Stats Lesson 4  выполнять цикл

Web Log Stats Lesson 4  Кодировать блоковые выражения

Web Log Stats Lesson 4  Пользоваться отдельными свойствами определенных знаков (запятая)

Web Log Stats Lesson 4  Использовать класс Stream доступа к файлу

Web Log Stats Lesson 4  Распознавать булевы выражения Boolean

 

 

Наверх страницы

Внимание! Не забудьте ознакомиться с остальными документами данного пользователя!

Соседние файлы в текущем каталоге:

На сайте уже 21970 файлов общим размером 9.9 ГБ.

Наш сайт представляет собой Сервис, где студенты самых различных специальностей могут делиться своей учебой. Для удобства организован онлайн просмотр содержимого самых разных форматов файлов с возможностью их скачивания. У нас можно найти курсовые и лабораторные работы, дипломные работы и диссертации, лекции и шпаргалки, учебники, чертежи, инструкции, пособия и методички - можно найти любые учебные материалы. Наш полезный сервис предназначен прежде всего для помощи студентам в учёбе, ведь разобраться с любым предметом всегда быстрее когда можно посмотреть примеры, ознакомится более углубленно по той или иной теме. Все материалы на сайте представлены для ознакомления и загружены самими пользователями. Учитесь с нами, учитесь на пятерки и становитесь самыми грамотными специалистами своей профессии.

Не нашли нужный документ? Воспользуйтесь поиском по содержимому всех файлов сайта:



Каждый день, проснувшись по утру, заходи на obmendoc.ru

Товарищ, не ленись - делись файлами и новому учись!

Яндекс.Метрика