Skip to content

Commit 56825e0

Browse files
committed
Prepare to Matrix implementation
1 parent b89204e commit 56825e0

File tree

8 files changed

+470
-77
lines changed

8 files changed

+470
-77
lines changed

.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
.idea
2+
out
3+
target
4+
*.iml
5+
log

README.md

Lines changed: 199 additions & 77 deletions
Large diffs are not rendered by default.

ReleaseNotes.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# MasterJava Release Notes
2+
3+
### Masterjava 2
4+
- Добавил в проект
5+
- [Миграция базы через liquiBase](http://www.liquibase.org/quickstart.html)
6+
- Реализация модели/DAO/JUnit
7+
- Миграция DB
8+
- Maven плагины copy-rename-maven-plugin, maven-antrun-plugin, liquibase-maven-plugin
9+
- Авторизация в контейнере Tomcat
10+
- Concurrent and distributed applications toolkit AKKA (отсылка почты через AKKA Actors)
11+
- Асинхронные сервлеты 3.0
12+
- [Выбор языка программирования](https://drive.google.com/file/d/0B9Ye2auQ_NsFZUVNakNxeUtGeFE)
13+
14+
- Pефакторинг
15+
- Реализация модуля export: Thymeleaf и Upload
16+
- Закэшировал `TemplateEngine`
17+
- Загрузка файлов через API Servlet 3.0
18+
- Сохранение в базу в batch-моде с обработкой конфликтов
19+
- При обновлении пользователей теперь используем `INSERT ON CONFLICT`
20+
- Работа со StAX (новый метод `startElement`)

pom.xml

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
3+
<modelVersion>4.0.0</modelVersion>
4+
5+
<groupId>ru.javaops</groupId>
6+
<artifactId>masterjava</artifactId>
7+
<packaging>jar</packaging>
8+
9+
<version>1.0-SNAPSHOT</version>
10+
11+
<name>Master Java</name>
12+
<url>https://github.com/JavaOPs/masterjava</url>
13+
14+
<properties>
15+
<java.version>1.8</java.version>
16+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
17+
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
18+
</properties>
19+
20+
<build>
21+
<finalName>masterjava</finalName>
22+
<defaultGoal>install</defaultGoal>
23+
<plugins>
24+
<plugin>
25+
<groupId>org.apache.maven.plugins</groupId>
26+
<artifactId>maven-compiler-plugin</artifactId>
27+
<version>3.1</version>
28+
<configuration>
29+
<source>${java.version}</source>
30+
<target>${java.version}</target>
31+
</configuration>
32+
</plugin>
33+
</plugins>
34+
</build>
35+
36+
<dependencies>
37+
</dependencies>
38+
39+
<profiles>
40+
</profiles>
41+
42+
<dependencyManagement>
43+
</dependencyManagement>
44+
</project>
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package ru.javaops.masterjava;
2+
3+
/**
4+
* User: gkislin
5+
* Date: 05.08.2015
6+
*
7+
* @link http://caloriesmng.herokuapp.com/
8+
* @link https://github.com/JavaOPs/topjava
9+
*/
10+
public class Main {
11+
public static void main(String[] args) {
12+
System.out.format("Hello MasterJava!");
13+
}
14+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package ru.javaops.masterjava.matrix;
2+
3+
import java.util.concurrent.ExecutionException;
4+
import java.util.concurrent.ExecutorService;
5+
import java.util.concurrent.Executors;
6+
7+
/**
8+
* gkislin
9+
* 03.07.2016
10+
*/
11+
public class MainMatrix {
12+
private static final int MATRIX_SIZE = 1000;
13+
private static final int THREAD_NUMBER = 10;
14+
15+
private final static ExecutorService executor = Executors.newFixedThreadPool(MainMatrix.THREAD_NUMBER);
16+
17+
public static void main(String[] args) throws ExecutionException, InterruptedException {
18+
final int[][] matrixA = MatrixUtil.create(MATRIX_SIZE);
19+
final int[][] matrixB = MatrixUtil.create(MATRIX_SIZE);
20+
21+
double singleThreadSum = 0.;
22+
double concurrentThreadSum = 0.;
23+
int count = 1;
24+
while (count < 6) {
25+
System.out.println("Pass " + count);
26+
long start = System.currentTimeMillis();
27+
final int[][] matrixC = MatrixUtil.singleThreadMultiply(matrixA, matrixB);
28+
double duration = (System.currentTimeMillis() - start) / 1000.;
29+
out("Single thread time, sec: %.3f", duration);
30+
singleThreadSum += duration;
31+
32+
start = System.currentTimeMillis();
33+
final int[][] concurrentMatrixC = MatrixUtil.concurrentMultiply(matrixA, matrixB, executor);
34+
duration = (System.currentTimeMillis() - start) / 1000.;
35+
out("Concurrent thread time, sec: %.3f", duration);
36+
concurrentThreadSum += duration;
37+
38+
if (!MatrixUtil.compare(matrixC, concurrentMatrixC)) {
39+
System.err.println("Comparison failed");
40+
break;
41+
}
42+
count++;
43+
}
44+
executor.shutdown();
45+
out("\nAverage single thread time, sec: %.3f", singleThreadSum / 5.);
46+
out("Average concurrent thread time, sec: %.3f", concurrentThreadSum / 5.);
47+
}
48+
49+
private static void out(String format, double ms) {
50+
System.out.println(String.format(format, ms));
51+
}
52+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package ru.javaops.masterjava.matrix;
2+
3+
import java.util.Random;
4+
import java.util.concurrent.ExecutionException;
5+
import java.util.concurrent.ExecutorService;
6+
7+
/**
8+
* gkislin
9+
* 03.07.2016
10+
*/
11+
public class MatrixUtil {
12+
13+
// TODO implement parallel multiplication matrixA*matrixB
14+
public static int[][] concurrentMultiply(int[][] matrixA, int[][] matrixB, ExecutorService executor) throws InterruptedException, ExecutionException {
15+
final int matrixSize = matrixA.length;
16+
final int[][] matrixC = new int[matrixSize][matrixSize];
17+
18+
return matrixC;
19+
}
20+
21+
// TODO optimize by https://habrahabr.ru/post/114797/
22+
public static int[][] singleThreadMultiply(int[][] matrixA, int[][] matrixB) {
23+
final int matrixSize = matrixA.length;
24+
final int[][] matrixC = new int[matrixSize][matrixSize];
25+
26+
for (int i = 0; i < matrixSize; i++) {
27+
for (int j = 0; j < matrixSize; j++) {
28+
int sum = 0;
29+
for (int k = 0; k < matrixSize; k++) {
30+
sum += matrixA[i][k] * matrixB[k][j];
31+
}
32+
matrixC[i][j] = sum;
33+
}
34+
}
35+
return matrixC;
36+
}
37+
38+
public static int[][] create(int size) {
39+
int[][] matrix = new int[size][size];
40+
Random rn = new Random();
41+
42+
for (int i = 0; i < size; i++) {
43+
for (int j = 0; j < size; j++) {
44+
matrix[i][j] = rn.nextInt(10);
45+
}
46+
}
47+
return matrix;
48+
}
49+
50+
public static boolean compare(int[][] matrixA, int[][] matrixB) {
51+
final int matrixSize = matrixA.length;
52+
for (int i = 0; i < matrixSize; i++) {
53+
for (int j = 0; j < matrixSize; j++) {
54+
if (matrixA[i][j] != matrixB[i][j]) {
55+
return false;
56+
}
57+
}
58+
}
59+
return true;
60+
}
61+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package ru.javaops.masterjava.service;
2+
3+
import java.util.Collections;
4+
import java.util.List;
5+
import java.util.Set;
6+
7+
public class MailService {
8+
private static final String OK = "OK";
9+
10+
private static final String INTERRUPTED_BY_FAULTS_NUMBER = "+++ Interrupted by faults number";
11+
private static final String INTERRUPTED_BY_TIMEOUT = "+++ Interrupted by timeout";
12+
private static final String INTERRUPTED_EXCEPTION = "+++ InterruptedException";
13+
14+
public GroupResult sendToList(final String template, final Set<String> emails) throws Exception {
15+
return new GroupResult(0, Collections.emptyList(), null);
16+
}
17+
18+
19+
// dummy realization
20+
public MailResult sendToUser(String template, String email) throws Exception {
21+
try {
22+
Thread.sleep(500); //delay
23+
} catch (InterruptedException e) {
24+
// log cancel;
25+
return null;
26+
}
27+
return Math.random() < 0.7 ? MailResult.ok(email) : MailResult.error(email, "Error");
28+
}
29+
30+
public static class MailResult {
31+
private final String email;
32+
private final String result;
33+
34+
private static MailResult ok(String email) {
35+
return new MailResult(email, OK);
36+
}
37+
38+
private static MailResult error(String email, String error) {
39+
return new MailResult(email, error);
40+
}
41+
42+
public boolean isOk() {
43+
return OK.equals(result);
44+
}
45+
46+
private MailResult(String email, String cause) {
47+
this.email = email;
48+
this.result = cause;
49+
}
50+
51+
@Override
52+
public String toString() {
53+
return '(' + email + ',' + result + ')';
54+
}
55+
}
56+
57+
public static class GroupResult {
58+
private final int success; // number of successfully sent email
59+
private final List<MailResult> failed; // failed emails with causes
60+
private final String failedCause; // global fail cause
61+
62+
public GroupResult(int success, List<MailResult> failed, String failedCause) {
63+
this.success = success;
64+
this.failed = failed;
65+
this.failedCause = failedCause;
66+
}
67+
68+
@Override
69+
public String toString() {
70+
return "Success: " + success + '\n' +
71+
"Failed: " + failed.toString() + '\n' +
72+
(failedCause == null ? "" : "Failed cause" + failedCause);
73+
}
74+
}
75+
}

0 commit comments

Comments
 (0)