Skip to content

Commit

Permalink
Merged common files from master
Browse files Browse the repository at this point in the history
  • Loading branch information
kormushin committed Oct 14, 2014
1 parent f0f55f4 commit a9155f5
Show file tree
Hide file tree
Showing 13 changed files with 487 additions and 6 deletions.
5 changes: 3 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,9 @@
.mtj.tmp/

# Package Files #
*.jar
*.war
*.ear

# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*

.idea
Expand All @@ -19,3 +17,6 @@ jars

.classpath
.project

.settings
.checkstyle
4 changes: 4 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
language: java
jdk:
- oraclejdk8
script: ant checkstyle
11 changes: 10 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,26 @@
## Семинары
В папке [tasks](tasks) находятся описания заданий на
семинары. Для написания программ необходимо руководствоваться [соглашениями
по оформлению кода](http://www.oracle.com/technetwork/java/codeconv-138413.html)
по оформлению кода](http://www.oracle.com/technetwork/java/codeconvtoc-136057.html)
от Oracle (Code Conventions).

В документе [github-workflow](github-workflow.md) описаны
общие правила по ведению задач на github, а также упрощение жизни с помощью утилиты
[checkstyle](http://checkstyle.sourceforge.net/), которая проверяет код на соответствие
Code Conventions.

## Лекции
1. [Java, JVM, примитивные типы](https://yadi.sk/d/_ZgbGf9NbXraZ)
2. [Object, String, исключения](https://yadi.sk/d/MCu6krbtbXrgZ)
3. [IO Stream, инициализация объектов, enum](https://yadi.sk/d/MinWJhG0bteEr)
4. [Лямбды, аннотации, обобщения, коллекции](https://yadi.sk/d/hxkoP81rbteTp)

## Список литературы
* Брюс Эккель — Философия Java (Thinking in Java)
* Brian Goetz — Java Concurrency in Practive (продвинутая книжка
по многопоточности в Java)
* [Спецификации по JVM и JLS](http://docs.oracle.com/javase/specs/index.html)
* [Code Conventions](http://www.oracle.com/technetwork/java/codeconv-138413.html)

## Успеваемость
[Таблица на Google Docs](https://docs.google.com/spreadsheet/ccc?key=0Ag7dwrMmZBKedGk1Q1RfSXh1RzZyeEJhaE94dW1CaGc&usp=sharing)
5 changes: 3 additions & 2 deletions build.xml
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,14 @@
</target>

<target name="run.checkstyle" description="Checkstyle utility (code conventions)">
<taskdef resource="checkstyletask.properties" classpath="bin/checkstyle-5.6-all.jar"/>
<taskdef resource="checkstyletask.properties" classpath="lib/checkstyle-5.6-all.jar"/>

<checkstyle
config="bin/checkstyle-rules.xml"
config="lib/checkstyle-rules.xml"
failureProperty="run.checkstyle.failure"
failOnViolation="false"
>
<formatter type="plain"/>
<formatter type="xml" tofile="${out}/checkstyle-report.xml"/>
<classpath>
<path refid="fizteh.classpath"/>
Expand Down
2 changes: 1 addition & 1 deletion github-workflow.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,4 @@

Чтобы сократить количество итераций на проверку задания, полезно самостоятельно удостовериться, что Code Conventions
соблюдены. Для этого нужно запустить сборку проекта с помощью ```ant checkstyle```. Вместо этого можно поставить
соответствующий плагин в IDE и настроить этот плагин на конфигурационный файл ```bin/checkstyle-rules.xml```.
соответствующий плагин в IDE и настроить этот плагин на конфигурационный файл ```lib/checkstyle-rules.xml```.
75 changes: 75 additions & 0 deletions src/ru/fizteh/fivt/storage/strings/Table.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package ru.fizteh.fivt.storage.strings;

import java.util.List;

/**
* @author Fedor Lavrentyev
* @author Dmitriy Komanov
*/
public interface Table {

/**
* Возвращает название базы данных.
*/
String getName();

/**
* Получает значение по указанному ключу.
*
* @param key Ключ.
* @return Значение. Если не найдено, возвращает null.
*
* @throws IllegalArgumentException Если значение параметра key является null.
*/
String get(String key);

/**
* Устанавливает значение по указанному ключу.
*
* @param key Ключ.
* @param value Значение.
* @return Значение, которое было записано по этому ключу ранее. Если ранее значения не было записано,
* возвращает null.
*
* @throws IllegalArgumentException Если значение параметров key или value является null.
*/
String put(String key, String value);

/**
* Удаляет значение по указанному ключу.
*
* @param key Ключ.
* @return Значение. Если не найдено, возвращает null.
*
* @throws IllegalArgumentException Если значение параметра key является null.
*/
String remove(String key);

/**
* Возвращает количество ключей в таблице.
*
* @return Количество ключей в таблице.
*/
int size();

/**
* Выполняет фиксацию изменений.
*
* @return Количество сохранённых ключей.
*/
int commit();

/**
* Выполняет откат изменений с момента последней фиксации.
*
* @return Количество отменённых ключей.
*/
int rollback();

/**
* Выводит список ключей таблицы
*
* @return Список ключей.
*/
List<String> list();
}
35 changes: 35 additions & 0 deletions src/ru/fizteh/fivt/storage/strings/TableProvider.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package ru.fizteh.fivt.storage.strings;

/**
* @author Fedor Lavrentyev
* @author Dmitriy Komanov
*/
public interface TableProvider {

/**
* Возвращает таблицу с указанным названием.
*
* @param name Название таблицы.
* @return Объект, представляющий таблицу. Если таблицы с указанным именем не существует, возвращает null.
* @throws IllegalArgumentException Если название таблицы null или имеет недопустимое значение.
*/
Table getTable(String name);

/**
* Создаёт таблицу с указанным названием.
*
* @param name Название таблицы.
* @return Объект, представляющий таблицу. Если таблица уже существует, возвращает null.
* @throws IllegalArgumentException Если название таблицы null или имеет недопустимое значение.
*/
Table createTable(String name);

/**
* Удаляет таблицу с указанным названием.
*
* @param name Название таблицы.
* @throws IllegalArgumentException Если название таблицы null или имеет недопустимое значение.
* @throws IllegalStateException Если таблицы с указанным названием не существует.
*/
void removeTable(String name);
}
20 changes: 20 additions & 0 deletions src/ru/fizteh/fivt/storage/strings/TableProviderFactory.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package ru.fizteh.fivt.storage.strings;

/**
* Представляет интерфейс для создание экземпляров {@link TableProvider}. Предполагается, что реализация интерфейса
* фабрики будет иметь публичный конструктор без параметров.
*
* @author Fedor Lavrentyev
* @author Dmitriy Komanov
*/
public interface TableProviderFactory {

/**
* Возвращает объект для работы с базой данных.
*
* @param dir Директория с файлами базы данных.
* @return Объект для работы с базой данных.
* @throws IllegalArgumentException Если значение директории null или имеет недопустимое значение.
*/
TableProvider create(String dir);
}
21 changes: 21 additions & 0 deletions tasks/01-Calculator.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
## Калькулятор
Задание - альтернатива Shell. Не нужно делать оба. Только для группы 394.

Консольное приложение, на вход принимает выражение как параметр :
```bash
java Calculator "-(3 + 5.5) * 2 - 20/(15 - 5)"
```

Результат работы приложения -- результат выражения:
```
-19
```

Поддерживаемые операции: ```+ - * /```. Приоритет операций -- математический
(скобки, потом унарное отрицание, потом умножение/деление, потом сложение/вычитание).

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

Ограничения: не использовать встроенные скриптовые движки и кодо- или байткод генерацию.
Одним словом, парсить вручную.
28 changes: 28 additions & 0 deletions tasks/02-ExternalListRank.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
## Внешняя сортировка связанного списка
Задание - альтернатива FileMap. Не нужно делать оба. Только для группы 394.

Консольное приложение, на вход принимает имя входного и выходного файлов:
```bash
java ExternalListRank <in_filename> <out_filename>
```

На входе файл с заданным односвязным списком. Все вершины пронумерованы от 1 до n. Каждая строчка имеет формат: вершина<пробел>следующая вершина. Последняя вершина имеет вид <номер вершины><пробел>0.
Например:
```
1 5
2 3
5 0
4 1
3 4
```

На выходе должен быть файл, в котором вершины идут в порядке следования в списке:
```
2 3
3 4
4 1
1 5
5 0
```

Ограничения: программа должна работать с памятью -Xmx64M и уметь сортировать файлы до 1Гб. Должна делать O(nlogn) операций ввода/вывода во внешнюю память.
120 changes: 120 additions & 0 deletions tasks/02-FileMap.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
## FileMap

Консольное приложение, которое работает с файлом-БД. Путь к файлу задаётся системным свойством ```System.getProperty("db.file")```. Из командной строки надо запускать приложение так: ```java -Ddb.file=/home/student/db.dat ru.fizteh.fivt.students.test.DbMain```.

Приложение должно работать как в интерактивном режиме, так и в пакетном (см. задание Shell).

Приложение должно поддерживать следующие команды с фиксированным выводом:

### put
```
put key value
```

Если значение новое, то вывод:
```
new
```

Если значение затирает существующее:
```
overwrite
old value
```

### get
```
get key
```

Если значение есть:
```
found
value
```

Если значения нет:
```
not found
```

### remove
```
remove key
```

Если значение удалено:
```
removed
```

Если значения нет:
```
not found
```

### list
```
list
```

Выводит список всех ключей или пустую строку, если ничего нет:
```
key1, key2, kеy3
```

### exit
```
exit
```

### Вариант 1
Данные лежат в бинарном файле следующего формата:
```
Длина ключа 1, ключ 1, длина значения 1, значение 1,
Длина ключа 2, ключ 2, длина значения 2, значение 2,
...
```

Форматы длин - целые числа в машинном представлении, 4 байта.
Формат ключа и значения - байты, полученные из строки в кодировке UTF-8.

#### Пример
```
add key value
add ключ значение
```

В файле должно оказаться (в бинарном виде):
```
00000008 d0bad0bb d18ed187 00000010
d0b7d0bd d0b0d187 d0b5d0bd d0b8d0b5
00000003 6b657900 00000576 616c7565
```

### Вариант 2
Данные лежат в бинарном файле следующего формата:
```
Ключ 1, \0, смещение значения 1,
Ключ 2, \0, смещение значения 2,
...
Ключ N, \0, смещение значения N,
значение 1, значение 2, ...
```

Форматы смещений - целые числа в машинном представлении, 4 байта.
Формат ключа - байты, полученные из строки в кодировке UTF-8. Оканчивается ключ нулевым символом (\0).
Между списком смещений и первым значением нет разрыва.

#### Пример
```
add key value
add ключ значение
```

В файле должно оказаться (в бинарном виде):
```
d0bad0bb d18ed187 00000000 156b6579
00000000 25d0b7d0 bdd0b0d1 87d0b5d0
bdd0b8d0 b576616c 7565
```
Loading

0 comments on commit a9155f5

Please sign in to comment.