Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
IPZ / IPZ_lab2_Subversion.doc
Скачиваний:
8
Добавлен:
07.02.2016
Размер:
249.86 Кб
Скачать

2. Выполнение работы.

Часть 1. Работа с командной строкой.

Задание 1 (общее). Выполните последовательность нижеприведенных действий.

1.1. Создать в собственной директории:

- папку "input", содержащую фай "input.txt" с произвольным контентом;

- папку "repo_copy", которая впоследствии будет ассоциироваться с рабочей копией;

- репозитарий "repo_<<PC_No>>", где "<<PC_No>>" – номер Вашего ПК:

svnadmin create E:\%PATH%\repo_<<PC_No>>

Проанализировать содержимое конфигурационного файла "svnserve.conf" (расположен в соответствующей папке "repo_<<PC_No>>").

1.2. Импортировать содержимое папки "input" в созданное хранилище:

svn import F:\Users\%USER%\input file://E:/%PATH%/repo_<<PC_No>> \

-m "1st import"

В случае успеха будет выведено сообщение следующего вида:

Adding (bin) input.txt

Committed revision 1.

1.3. Выполнить просмотр содержимого репозитария нижеприведенными способами и поясните различия:

svn list file:///E:/%PATH%/repo_<<PC_No>>

svnlook tree E:\%PATH%\repo_<<PC_No>>

1.4. Запустить сервер "svnserve" (открыть доступ пользователей к локальному репозитарию) и создать рабочую копию:

svnserve –d –r E:\%PATH%\repo_<<PC_No>>

// соответствующую консоль оставьте активной и в новой

// консоли выполните:

cd /d F:\\Users\%USER%\repo_copy

svn checkout svn://localhost

1.5. Находясь в директории рабочей копии, создайте новый текстовый файл "input_2.txt" и добавьте этот файл в рабочую копию:

svn add input_2.txt

// в результате успеха получите листинг вида:

A input_2.txt

1.6. Внесите изменения в файл "input.txt" и просмотрите состояние (статус) рабочей копии. Листинг должен иметь следующий вид:

M input.txt

A input_2.txt

1.7. Находясь в директории "repo_copy", внесите изменения из рабочей копии в хранилище. В случае успеха листинг будет иметь следующий вид:

Sending input.txt

Adding input_2.txt

Transmitting file data ..

Committed revision 2.

// обратите внимание, что No ревизии, как следствие,

// был инкрементирован

Если попытка внести изменения в репозиторий выдала ошибку сообщающую что пользователь не авторизирован, перепроверьте, что в раздел [general] конфигурации репозитория были внесены настройки доступа указзаные в листинге 1 этой лабораторной работы.

1.8. Еще раз создайте рабочую копию хранилища. Как следствие, листинг должен иметь вид:

A input.txt

A input_2.txt

Checked out revision 2.

1.9. Просмотрите статус новой (второй) рабочей копии с использованием следующей команды, находясь в родительской папке по отношению к папке локальной копии репозитория:

svn status –u –v repo_copy

// в случае, если предыдущие шаги были выполнены верно,

// листинг будет иметь вид:

2 2 user repo_copy\input.txt

1 1 user repo_copy\input_2.txt

1 1 user repo_copy

Status against revision: 2

// прокомментируйте этот листинг

Часть 2. Работа с ide "NetBeans 7.2.1".

Рассмотрим задачу "Крисс-кросс" как упрощенный аналог задачи решения кроссвордов: семантическую нагрузку слов не учитываем. "Крисс-кросс" всегда имеет единственное решение, в котором используются все слова из списка.

Суть задачи можно раскрыть следующим образом [4]:

- задан (в отдельном текстовом файле) список слов (слова отсортированы в алфавитном порядке, а также в порядке увеличения их длин);

- необходимо получить структуру-пересечение этих строк (в местах пересечений строки имеют "общий" символ).

Специфика примера – структуру получаем в графическом виде.

Суть рассматриваемого примера изложена на рис. 2.

Рисунок 2 – Задача "Крисс-кросс"

Задание 2 (общее). Выполните последовательность нижеприведенных действий.

2.1. Создайте новый "Java"-проект (Ctrl+Shift+N), который назовите "СС".

2.2. Импортируйте исходные файлы, а также входной файл с заданным списком слов с удаленного репозитария. Древовидная структура контента соответствующего репозитария приведена на листинге 2.

Листинг 2 – Импортируемые файлы

/

input/

input.txt // список считываемых слов

src/

Displacement.java // ориентация слова в структуре \

// (вертикаль / горизонталь);

Cell.java // прорисовка символа строки \

// внутри прямоугольной ячейки;

Word.java // совокупность методов работы \

// со строками;

WordArr.java // задание характеристик массива \

// строк (координат,...);

WordArea.java // класс с набором методов, \

// решающих поставленную задачу;

CrossFrame.java // запускной файл

Для этого необходимо выполнить такую последовательность действий:

- во вкладке "Группа" IDE "NetBeans 7.2.1" выбрать опцию "Получить…";

- в соответствующем диалоговом окне необходимо указать "URL"-адрес репозитария:

svn://10.0.32.40/E:/repo

- в следующем диалоговом окне ("Папки для выгрузки") в опции "Папки репозитария:" необходимо указать папку "src", а в опции "Локальная папка:" – путь к папке исходных "Java"-файлов ("src") созданного проекта "СС":

F:\Users\user\Documents\NetBeansProjects\CC\src

- аналогичным образом в корневую папку проекта необходимо импортировать файл со списком входных слов ("words.txt"), для чего следует выполнить действия, аналогичные таковым для предыдущего шага, однако указать папку "input", а в качестве опции "Локальная папка:" – указать путь к корневому каталогу проекта:

F:\Users\user\Documents\NetBeansProjects\CC

Содержимое загружаемых из хранилища файлов приведено в листингах 3 – 9.

Листинг 3 – Содержимое входного текстового файла "input.txt"

abc

cdefg

fzlsprt

Листинг 4 – Класс задания характера расположения слова как компонента структуры

package src;

public class Displacement {

public static final Boolean H = false; // horizontal

public static final Boolean V = true; // vertical

}

Листинг 5 – Класс прорисовки символа строки-компонента структуры

package src;

import java.awt.*;

import java.awt.geom.*;

import java.awt.font.*;

public class Cell {

private char val;

private int crd; // value & coordinates

public static final int C_SIZE=40; // размер ячейки

public Cell(char val, int crd) {

this.val=val; this.crd=crd;

}

public Cell() {

this.val=' '; this.crd=0;

}

public Cell(Cell cell) {

this.val = cell.getVal();

this.crd = cell.getCrd();

}

public void showCell(Graphics2D graph, Font font, FontRenderContext handle,

Boolean displacement, int crd) {

int x_crd, y_crd;

if(displacement == Displacement.V) {

x_crd = crd * C_SIZE;

y_crd = this.crd * C_SIZE;

}

else {

x_crd = this.crd * C_SIZE;

y_crd = crd * C_SIZE;

}

// прорисовка прямоугольной ячейки вместе с соответствующим

// символом-компонентом считанной из файла "input.txt" строки:

// 1 строка есть 1 слово

String str = String.valueOf(val);

Rectangle2D bounds = font.getStringBounds(str, handle);

LineMetrics metrics = font.getLineMetrics(str, handle);

float descent = metrics.getDescent();

float leading = metrics.getLeading();

Rectangle2D.Float rect = new Rectangle2D.Float(x_crd, \ y_crd, C_SIZE, C_SIZE);

double x = rect.getX() + 1 + (rect.getWidth() - bounds.getWidth())/2;

double y = rect.getY() + rect.getHeight() - descent - \ leading;

graph.draw(rect);

graph.drawString(str, (int)x, (int)y);

}

public char getVal() {return this.val;}

public int getCrd() {return this.crd;}

public void setCrd(int crd) {this.crd=crd;}

Листинг 6 – Класс для задания координат строк и их длин

package src;

import java.awt.*;

import java.awt.font.*;

public class Word {

private Cell[] cells_arr;

private Boolean displacement;

private int word_crd, length;

public Word(String word, Boolean displacement, int word_crd, \ int init_crd) {

this.displacement=displacement;

this.word_crd=word_crd;

this.length=word.length();

cells_arr = new Cell[length];

for(int i=0; i<length; i++) {

cells_arr[i] = new Cell(word.charAt(i), init_crd+i);

}

}

public Word(Word word) {

this.displacement = word.getDisplacement();

this.word_crd = word.getWordCrd();

this.length = word.getLength();

cells_arr = new Cell[length];

for(int i=0; i<length; i++) {

cells_arr[i] = new Cell(word.get(i));

}

}

public void showWord(Graphics2D g2, Font font, \ FontRenderContext context) {

for(int i=0; i<length; i++) {

cells_arr[i].showCell(g2, font, context, displacement, word_crd);

}

}

public void incCrd(int min_x, int min_y) {

if(this.displacement == Displacement.H) {

word_crd -=min_y;

for(int i=0; i<length; i++) {

cells_arr[i].setCrd(cells_arr[i].getCrd() - min_x);

}

}

else {

word_crd -= min_x;

for(int i=0; i<length; i++) {

cells_arr[i].setCrd(cells_arr[i].getCrd() - min_y);

}

}

}

public Cell get ( int i ) {

if ( i>=0 && i < length ) return cells_arr[i];

else return new Cell();

}

public Boolean getDisplacement() {return this.displacement;}

public int getWordCrd() {return this.word_crd;}

public int getLength() {return this.length;}

public int getFirst() {return cells_arr[0].getCrd();}

public int getLast() {

return cells_arr[this.length-1].getCrd();

}

}}

Листинг 7 – Класс для задания характеристик массива строк

package src;

import java.util.*;

public class WordArr<A> extends ArrayList<A> {

private int min_x, min_y, height, width, cross_count;

public WordArr() {super();}

public WordArr(int initial) {super (initial);}

public WordArr(WordArr<Word> arr) {

this.min_x = arr.getMinX();

this.min_y = arr.getMinY();

this.height = arr.getHeight();

this.width = arr.getWidth();

this.cross_count = arr.getCrossCount();

}

public void setMinX(int x) {if(x < min_x) min_x=x;}

public void setMinY(int y) {if(y < min_y) min_y=y;}

public void setHeight(int h) {height = h;}

public void setWidth(int w) {width = w;}

public void setCrossCount(int count) {cross_count = count;}

public int getMinX() {return min_x;}

public int getMinY() {return min_y;}

public int getHeight() {return height;}

public int getWidth() {return width;}

public int getCrossCount() {return cross_count;}

public void setXYToZero() {min_x=0; min_y=0;}

}

Листинг 8 – Методы, возвращающие значения ширины и высоты фрейма

...

public class WordArea extends JComponent {

...

public int width(){ return width; }

public int height(){ return height; }

}

Листинг 9 – Запускной файл

package src;

import javax.swing.*;

import java.awt.*;

public class CrossFrame extends JFrame {

private WordArea area = new WordArea();

public CrossFrame() {

setTitle ( "Cross" );

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

add( area );

setMinimumSize( new Dimension( area.width(), area.height() ) );

setSize( new Dimension( area.width(), area.height() ) );

}

public static void main( String[] args ) {

new CrossFrame().setVisible( true );

}

}

Задание 3 (общее). Заменить ячейки прямоугольной формы ячейками эллиптической формы, чтобы результат запуска проекта соответствовал рис. 3.

Рисунок 3 – Результат выполнения общего задания

С этой целью можно воспользоваться методом "Ellipse2D":

Ellipse2D.Float(float x, float y, float width, float height);

Вариант 1. Дополнить фрейм, выводимый на рис. 3, строкой формата "<<ФИО_пользователя>>_<<группа>>", выводимой внизу структуры по центру (цвет символов строки задать отличным от черного).

Рекомендации:

- импортировать следующие классы:

java.awt.Color;

java.awt.Font;

java.awt.Graphics;

javax.swing.JFrame;

javax.swing.JPanel;

- создать новый класс, расширяющий класс "JPanel";

- в классе "CrossFrame" определить метод, возвращающий объект типа "WordArea" (это позволит, как следствие, вызывать в новом классе методы и "width()" и "height()" класса "WordArea" для получения значений ширины и высоты фрейма соответственно);

- в новом классе создать метод, которому в качестве аргумента передать объект типа "Graphics";

- для задания шрифта, цвета символов, а также начальных координат прорисовки строки применительно к объекту типа "Graphics" можно использовать следующие методы:

// метод задания параметров шрифта:

public abstract void setFont(Font f);

// "f" можно получить следующим образом:

// Font f = new Font(String name, int style, int size);

// допустимые значения параметров конструктора

// приведены в табл. 4.

Таблица 4 – Задание параметров шрифта

name

style

size

"serif"

Font.PLAIN

"sansserif"

Font.BOLD

"monospaced"

Font.ITALIC

"TimesRoman"

Font.BOLD+Font.ITALIC

...

// метод задания цвета шрифта:

public abstract void setColor(Color c);

// в качестве аргумента задать следующие значения:

// Color.RED, Color.BLACK и т.п.

// метод прорисовки строки:

public abstract void drawString(String str, int x, int y);

Полученный результат должен соответствовать шаблону, приведенному на рис. 4.

Рисунок 4 – Шаблон результата для варианта 1

Вариант 2. Дополнить фрейм, выводимый на рис. 3, треугольником, руководствуясь замечаниями для 1-го варианта (треугольник должен отображаться в правой верхней части фрейма).

Рекомендации:

- выполнить также следующие "import"-директивы:

import java.awt.geom.Line2D;

import java.awt.*;

- преобразовать объект "Graphics" в объект "Graphics2D":

Graphics2D g2d = (Graphics2D) g;

- задать цвет линии:

public abstract void setPaint(Color c);

- для прорисовки сторон треугольника использовать следующие методы:

public Line2D.Double(double X1, double Y1, double X2, double Y2);

// результат вызова указанного метода передать в

// качестве аргумента нижеприведенного метода:

public abstract void draw(Shape s);

Полученный результат должен соответствовать шаблону, приведенному на рис. 5.

Рисунок 5 – Шаблон результата для варианта 2

Задание 4 (Общее). Импортировать "Java"-файлы модифицированных проекта в ранее созданное хранилище "repo_<<PC_No>>".

Примечание: содержимое репозитария продемонстрировать с использованием утилиты "svnlook".

Контрольные вопросы:

  1. Привести определения "Хранилища" ("репозитария") и "рабочей копии".

  2. Описать модели взаимодействия пользователей с хранилищем.

  3. Привести архитектуру "SVN".

  4. Прокомментировать назначения утилит "svn.exe", "svnadmin.exe" и "svnserve.exe".

  5. Пояснить назначение и прокомментировать параметры конфигурационного файла "svnserve.conf".

  6. Прокомментировать способы доступа к репозитарию.

  7. Кратко описать команды для работы с хранилищем и рабочими копиями.

  8. Описать назначение модификаторов (флагов) "-u" и "-v" для соответствующей команды из задания 2.9 (примечание: для этой цели следует использовать команду "svn help").

  9. Пояснить специфику загрузки файлов из хранилища при работе с IDE "NetBeans".

Литература

  1. Что такое Subversion? [Электронный ресурс]. – Режим доступа: \www/ URL: http://svnbook.red-bean.com/nightly/ru/svn.intro.whatis.html. – Загл. с экрана.

  2. Subversion в действии [Электронный ресурс]. – Режим доступа: \www/ URL: http://tortoisesvn.net/docs/release/TortoiseSVN_ru/tsvn-basics-svn.html. – Загл. с экрана.

  3. Subversion Edge Download [Электронный ресурс]. – Режим доступа: \www/ URL: http://www.collab.net/downloads/subversion. – Загл. с экрана.

  4. Уэзерелл, Ч. Этюды для программистов [Текст] / Ч. Уэзерелл. – М.: Мир, 1982. – 288 с.

© Шкарупило В.В., Ильяшенко М.Б. 13

Соседние файлы в папке IPZ