-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Refreshed project for the JF-2017-TUT course
- Loading branch information
Bram Inniger
committed
Mar 16, 2017
1 parent
c67cc93
commit ae5ed02
Showing
20 changed files
with
580 additions
and
193 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,7 @@ | ||
# Maven | ||
target | ||
/target | ||
/dependency-reduced-pom.xml | ||
|
||
# IntelliJ | ||
.idea | ||
*.iml | ||
/.idea | ||
/*.iml |
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.3.9/apache-maven-3.3.9-bin.zip |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -31,60 +31,19 @@ Requirements | |
4. A consumer's job is to keep taking in random inputs, checking if they produce a hash collision, and if so, record which input triggered the collision | ||
5. Do not manually manage your threads, recall Executors from previous lectures | ||
6. Keep the concurrent collections, and the synchronisers in mind discussed this lecture, and use them appropriately | ||
7. Absolutely do not use the following: any form of _Lock_, _synchronized_, _volatile_ | ||
8. Unless really needed, try to avoid using the _Atomic\*_ classes | ||
9. Implement a clean shutdown mechanism. The Consumer and Producer are already supplied with a _shutdown()_ method, you **may** use this, or any other thread-safe, clean, shutdown mechanism | ||
10. Use the _Salt_ and _Hash_ classes to find the data you need to break | ||
11. Return a list of passwords, in the same order, so they correspond to the data in _Salt_ and _Hash_ | ||
12. Do not add any new libraries, the ones in _pom.xml_ will certainly suffice to solve this | ||
7. Absolutely do not use the following: any form of `Lock`, `synchronized`, `volatile` or any other form of creative low-level locking (e.g. using `Semaphore(1)`) | ||
8. Unless really needed, try to avoid using the `Atomic\*` classes | ||
9. Implement a clean shutdown mechanism, after all 10 passwords are cracked, *cleanly* signal all consumers and producers to end their jobs, then *cleanly* wait for the executor(s) to properly shut down | ||
10. Use the `Salt` and `Hash` classes to find the data you need to break | ||
11. Return a list of passwords, in the same order, so they correspond to the data in `Salt` and `Hash` | ||
12. Do not add any new libraries, the ones in `pom.xml` will certainly suffice to solve this | ||
13. Be **absolutely completely positively** Thread Safe in **all** your operations (and look up the definition in doubt) | ||
14. Only store the very first valid password guess: if another consumer finds another valid hash, discard it | ||
15. Make an efficient program, at least make sure your implementation is faster than a single-threaded implementation | ||
16. Read up yourself on how to properly do consumer-producer design, and handle clean shutdowns, if needed. You are all University students, and do not need handholding for every single detail. "It was not covered in the lecture" is **not** a valid excuse. | ||
16. Read up yourself on how to properly do consumer-producer design, and handle clean shutdowns, if needed. You are all University students, and do not need handholding for every single detail. "It was not covered in the lecture" is **not** a valid excuse | ||
|
||
Submitting your assignment | ||
-------------------------- | ||
|
||
For your convenience, we have set up the Maven project to ZIP up all files in your project folder so it is easy for you to attach it to an e-mail and send it our way. All you need to do is to execute the following command in your project folder: | ||
|
||
``` | ||
mvn clean deploy | ||
``` | ||
|
||
It will ask you for your full name, Student Book Number (also known as *matrikli number*), homework number and a comment (optional). | ||
|
||
Example: | ||
|
||
```bash | ||
mvn clean deploy | ||
|
||
#...skipping building, testing and packaging output from Maven... | ||
|
||
[INFO] --- maven-antrun-plugin:1.7:run (package homework ZIP) @ jf2016-hwX --- | ||
[INFO] Executing tasks | ||
|
||
main: | ||
Your full name (e.g. John Smith): | ||
Jane Smith | ||
Your Student Book Number (matrikli number, e.g. B12345): | ||
B12345 | ||
Homework number: | ||
1 | ||
Comment: | ||
Java IO | ||
[zip] Building zip: /Users/jane/Workspaces/JF/jf-skeleton/target/jf-howework-B12345-1.zip | ||
[delete] Deleting: /Users/jane/Workspaces/JF/jf-skeleton/homework.properties | ||
[INFO] Executed tasks | ||
[INFO] ------------------------------------------------------------------------ | ||
[INFO] BUILD SUCCESS | ||
[INFO] ------------------------------------------------------------------------ | ||
[INFO] Total time: 45.028s | ||
[INFO] Finished at: Thu Aug 28 15:36:19 EEST 2014 | ||
[INFO] Final Memory: 17M/99M | ||
[INFO] ------------------------------------------------------------------------ | ||
``` | ||
|
||
After Maven has finished, you can find the generated ZIP file in *target* folder with name such as | ||
*jf-homework-B12345-1.zip* (it contains your Student Book Number/matrikli number and homework number). | ||
|
||
Attach the ZIP to an e-mail and **send it our way**, to *[email protected]*. | ||
1. Run `./mvnw clean deploy` | ||
2. Send your solution to *[email protected]* |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,236 @@ | ||
#!/bin/sh | ||
# ---------------------------------------------------------------------------- | ||
# Licensed to the Apache Software Foundation (ASF) under one | ||
# or more contributor license agreements. See the NOTICE file | ||
# distributed with this work for additional information | ||
# regarding copyright ownership. The ASF licenses this file | ||
# to you under the Apache License, Version 2.0 (the | ||
# "License"); you may not use this file except in compliance | ||
# with the License. You may obtain a copy of the License at | ||
# | ||
# http://www.apache.org/licenses/LICENSE-2.0 | ||
# | ||
# Unless required by applicable law or agreed to in writing, | ||
# software distributed under the License is distributed on an | ||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
# KIND, either express or implied. See the License for the | ||
# specific language governing permissions and limitations | ||
# under the License. | ||
# ---------------------------------------------------------------------------- | ||
|
||
# ---------------------------------------------------------------------------- | ||
# Maven2 Start Up Batch script | ||
# | ||
# Required ENV vars: | ||
# ------------------ | ||
# JAVA_HOME - location of a JDK home dir | ||
# | ||
# Optional ENV vars | ||
# ----------------- | ||
# M2_HOME - location of maven2's installed home dir | ||
# MAVEN_OPTS - parameters passed to the Java VM when running Maven | ||
# e.g. to debug Maven itself, use | ||
# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 | ||
# MAVEN_SKIP_RC - flag to disable loading of mavenrc files | ||
# ---------------------------------------------------------------------------- | ||
|
||
if [ -z "$MAVEN_SKIP_RC" ] ; then | ||
|
||
if [ -f /etc/mavenrc ] ; then | ||
. /etc/mavenrc | ||
fi | ||
|
||
if [ -f "$HOME/.mavenrc" ] ; then | ||
. "$HOME/.mavenrc" | ||
fi | ||
|
||
fi | ||
|
||
# OS specific support. $var _must_ be set to either true or false. | ||
cygwin=false; | ||
darwin=false; | ||
mingw=false | ||
case "`uname`" in | ||
CYGWIN*) cygwin=true ;; | ||
MINGW*) mingw=true;; | ||
Darwin*) darwin=true | ||
# | ||
# Look for the Apple JDKs first to preserve the existing behaviour, and then look | ||
# for the new JDKs provided by Oracle. | ||
# | ||
if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK ] ; then | ||
# | ||
# Apple JDKs | ||
# | ||
export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home | ||
fi | ||
|
||
if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Java/JavaVirtualMachines/CurrentJDK ] ; then | ||
# | ||
# Apple JDKs | ||
# | ||
export JAVA_HOME=/System/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home | ||
fi | ||
|
||
if [ -z "$JAVA_HOME" ] && [ -L "/Library/Java/JavaVirtualMachines/CurrentJDK" ] ; then | ||
# | ||
# Oracle JDKs | ||
# | ||
export JAVA_HOME=/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home | ||
fi | ||
|
||
if [ -z "$JAVA_HOME" ] && [ -x "/usr/libexec/java_home" ]; then | ||
# | ||
# Apple JDKs | ||
# | ||
export JAVA_HOME=`/usr/libexec/java_home` | ||
fi | ||
;; | ||
esac | ||
|
||
if [ -z "$JAVA_HOME" ] ; then | ||
if [ -r /etc/gentoo-release ] ; then | ||
JAVA_HOME=`java-config --jre-home` | ||
fi | ||
fi | ||
|
||
if [ -z "$M2_HOME" ] ; then | ||
## resolve links - $0 may be a link to maven's home | ||
PRG="$0" | ||
|
||
# need this for relative symlinks | ||
while [ -h "$PRG" ] ; do | ||
ls=`ls -ld "$PRG"` | ||
link=`expr "$ls" : '.*-> \(.*\)$'` | ||
if expr "$link" : '/.*' > /dev/null; then | ||
PRG="$link" | ||
else | ||
PRG="`dirname "$PRG"`/$link" | ||
fi | ||
done | ||
|
||
saveddir=`pwd` | ||
|
||
M2_HOME=`dirname "$PRG"`/.. | ||
|
||
# make it fully qualified | ||
M2_HOME=`cd "$M2_HOME" && pwd` | ||
|
||
cd "$saveddir" | ||
# echo Using m2 at $M2_HOME | ||
fi | ||
|
||
# For Cygwin, ensure paths are in UNIX format before anything is touched | ||
if $cygwin ; then | ||
[ -n "$M2_HOME" ] && | ||
M2_HOME=`cygpath --unix "$M2_HOME"` | ||
[ -n "$JAVA_HOME" ] && | ||
JAVA_HOME=`cygpath --unix "$JAVA_HOME"` | ||
[ -n "$CLASSPATH" ] && | ||
CLASSPATH=`cygpath --path --unix "$CLASSPATH"` | ||
fi | ||
|
||
# For Migwn, ensure paths are in UNIX format before anything is touched | ||
if $mingw ; then | ||
[ -n "$M2_HOME" ] && | ||
M2_HOME="`(cd "$M2_HOME"; pwd)`" | ||
[ -n "$JAVA_HOME" ] && | ||
JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" | ||
# TODO classpath? | ||
fi | ||
|
||
if [ -z "$JAVA_HOME" ]; then | ||
javaExecutable="`which javac`" | ||
if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then | ||
# readlink(1) is not available as standard on Solaris 10. | ||
readLink=`which readlink` | ||
if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then | ||
if $darwin ; then | ||
javaHome="`dirname \"$javaExecutable\"`" | ||
javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" | ||
else | ||
javaExecutable="`readlink -f \"$javaExecutable\"`" | ||
fi | ||
javaHome="`dirname \"$javaExecutable\"`" | ||
javaHome=`expr "$javaHome" : '\(.*\)/bin'` | ||
JAVA_HOME="$javaHome" | ||
export JAVA_HOME | ||
fi | ||
fi | ||
fi | ||
|
||
if [ -z "$JAVACMD" ] ; then | ||
if [ -n "$JAVA_HOME" ] ; then | ||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then | ||
# IBM's JDK on AIX uses strange locations for the executables | ||
JAVACMD="$JAVA_HOME/jre/sh/java" | ||
else | ||
JAVACMD="$JAVA_HOME/bin/java" | ||
fi | ||
else | ||
JAVACMD="`which java`" | ||
fi | ||
fi | ||
|
||
if [ ! -x "$JAVACMD" ] ; then | ||
echo "Error: JAVA_HOME is not defined correctly." >&2 | ||
echo " We cannot execute $JAVACMD" >&2 | ||
exit 1 | ||
fi | ||
|
||
if [ -z "$JAVA_HOME" ] ; then | ||
echo "Warning: JAVA_HOME environment variable is not set." | ||
fi | ||
|
||
CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher | ||
|
||
# traverses directory structure from process work directory to filesystem root | ||
# first directory with .mvn subdirectory is considered project base directory | ||
find_maven_basedir() { | ||
local basedir=$(pwd) | ||
local wdir=$(pwd) | ||
while [ "$wdir" != '/' ] ; do | ||
if [ -d "$wdir"/.mvn ] ; then | ||
basedir=$wdir | ||
break | ||
fi | ||
wdir=$(cd "$wdir/.."; pwd) | ||
done | ||
echo "${basedir}" | ||
} | ||
|
||
# concatenates all lines of a file | ||
concat_lines() { | ||
if [ -f "$1" ]; then | ||
echo "$(tr -s '\n' ' ' < "$1")" | ||
fi | ||
} | ||
|
||
export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-$(find_maven_basedir)} | ||
MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" | ||
|
||
# For Cygwin, switch paths to Windows format before running java | ||
if $cygwin; then | ||
[ -n "$M2_HOME" ] && | ||
M2_HOME=`cygpath --path --windows "$M2_HOME"` | ||
[ -n "$JAVA_HOME" ] && | ||
JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` | ||
[ -n "$CLASSPATH" ] && | ||
CLASSPATH=`cygpath --path --windows "$CLASSPATH"` | ||
[ -n "$MAVEN_PROJECTBASEDIR" ] && | ||
MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` | ||
fi | ||
|
||
# Provide a "standardized" way to retrieve the CLI args that will | ||
# work with both Windows and non-Windows executions. | ||
MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" | ||
export MAVEN_CMD_LINE_ARGS | ||
|
||
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain | ||
|
||
# avoid using MAVEN_CMD_LINE_ARGS below since that would loose parameter escaping in $@ | ||
exec "$JAVACMD" \ | ||
$MAVEN_OPTS \ | ||
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ | ||
"-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ | ||
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" |
Oops, something went wrong.