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".
Контрольные вопросы:
-
Привести определения "Хранилища" ("репозитария") и "рабочей копии".
-
Описать модели взаимодействия пользователей с хранилищем.
-
Привести архитектуру "SVN".
-
Прокомментировать назначения утилит "svn.exe", "svnadmin.exe" и "svnserve.exe".
-
Пояснить назначение и прокомментировать параметры конфигурационного файла "svnserve.conf".
-
Прокомментировать способы доступа к репозитарию.
-
Кратко описать команды для работы с хранилищем и рабочими копиями.
-
Описать назначение модификаторов (флагов) "-u" и "-v" для соответствующей команды из задания 2.9 (примечание: для этой цели следует использовать команду "svn help").
-
Пояснить специфику загрузки файлов из хранилища при работе с IDE "NetBeans".
Литература
-
Что такое Subversion? [Электронный ресурс]. – Режим доступа: \www/ URL: http://svnbook.red-bean.com/nightly/ru/svn.intro.whatis.html. – Загл. с экрана.
-
Subversion в действии [Электронный ресурс]. – Режим доступа: \www/ URL: http://tortoisesvn.net/docs/release/TortoiseSVN_ru/tsvn-basics-svn.html. – Загл. с экрана.
-
Subversion Edge Download [Электронный ресурс]. – Режим доступа: \www/ URL: http://www.collab.net/downloads/subversion. – Загл. с экрана.
-
Уэзерелл, Ч. Этюды для программистов [Текст] / Ч. Уэзерелл. – М.: Мир, 1982. – 288 с.
© Шкарупило В.В., Ильяшенко М.Б.