--- layout: ocpj8-notes title: Java SE 8 Programmer II - Java Concurrency permalink: /:path/:basename ---
We can create a thread by passing an implementation of Runnable to a Thread constructor. There are three ways to do it:
class Task implements Runnable {
@Override
public void run() {
System.out.println("Running");
}
}
public class Test {
public static void main(String args[]) {
Runnable r = new Task();
Thread thread = new Thread(r);
thread.start();
}
}
Or with an anonymous class:
public class Test {
public static void main(String args[]) {
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("Running");
}
};
Thread thread = new Thread(r);
thread.start();
}
}
Or with a lambda expression:
public class Test {
public static void main(String args[]) {
Runnable r = () -> System.out.println("Running");
Thread thread = new Thread(r);
thread.start();
}
}
The Callable interface is similar to Runnable, they're both designed to be executed by another thread, a Runnable however, does not return a result and cannot throw a checked exception. We can create a Callable in three ways:
class Task implements Callable<Integer> {
@Override
public Integer call() {
int n = 0;
for(int i = 0; i < 100; i++) { n += i; }
return n;
}
}
public class Test {
public static void main(String args[]) {
ExecutorService executor = Executors.newSingleThreadExecutor();
Callable c = new Task();
Future<Long> future = executor.submit(c);
try {
Long result = future.get(); //waits for the thread to complete
System.out.println(result);
} catch (ExecutionException e) {
e.printStackTrace();
}
executor.shutdown();
}
}
Or with an anonymous class:
public class Test {
public static void main(String args[]) {
ExecutorService executor = Executors.newSingleThreadExecutor();
Callable c = new Callable<Integer>() {
public Integer call() {
int n = 0;
for(int i = 0; i < 100; i++) { n += i; }
return n;
}
};
Future<Long> future = executor.submit(c);
try {
Long result = future.get(); //waits for the thread to complete
System.out.println(result);
} catch (ExecutionException e) {
e.printStackTrace();
}
executor.shutdown();
}
}
Or with a lambda expression:
public class Test {
public static void main(String args[]) {
ExecutorService executor = Executors.newSingleThreadExecutor();
Callable c = () -> {
int n = 0;
for(int i = 0; i < 100; i++) { n += i; }
return n;
};
Future<Long> future = executor.submit(c);
try {
Long result = future.get(); //waits for the thread to complete
System.out.println(result);
} catch (ExecutionException e) {
e.printStackTrace();
}
executor.shutdown();
}
}
The ExecutorService interface represents a mechanism that executes tasks in the background.
You can use the Executors factory class to create ExecutorService implementations. Some examples are:
// Creates an Executor that uses a single worker thread operating off an unbounded queue.
ExecutorService es1 = Executors.newSingleThreadExecutor();
// Creates a thread pool that reuses a fixed number of threads operating off a shared unbounded queue.
ExecutorService es2 = Executors.newFixedThreadPool(10);
// Creates a thread pool that can schedule commands to run after a given delay, or to execute periodically.
ExecutorService es3 = Executors.newScheduledThreadPool(10);
There are a few methods to execute task with an ExecutorService:
The execute method takes a Runnable, and executes it asynchronously:
executorService.execute(new Runnable() {
public void run() {
System.out.println("A task");
}
});
executorService.shutdown();
This method takes a Runnable but returns a Future object. This object returns null when the Runnable has finished executing:
Future future = executorService.submit(new Runnable() {
public void run() {
System.out.println("A task");
}
});
future.get(); //Blocks until the Runnable has finished
executorService.shutdown();
This version of the method takes a Callable, and returns a Future object with a result when it has finished executing:
Future future = executorService.submit(new Callable<String>() {
public String call() {
return "A callable";
}
});
System.out.println(future.get()); //Blocks until the Callable has finished
executorService.shutdown();
This method executes the given tasks returning the result of one that has completed successfully. You have no guarantee about which of the Callable's results you'll get, just one of the ones that finish. When one of the tasks complete or throws an exception, the rest are canceled. For example:
List<Callable<String>> callables = new ArrayList<Callable<String>>();
callables.add(new Callable<String>() {
public String call() {
return "Callable 1";
}
});
callables.add(new Callable<String>() {
public String call() {
return "Callable 2";
}
});
callables.add(new Callable<String>() {
public String call() {
return "Callable 3";
}
});
String result = executorService.invokeAny(callables);
System.out.println(result);
executorService.shutdown();
Sometimes it will print "Callable 1", sometimes "Callable 2", and other times "Callable 3".
This method executes the given tasks, returning a list of Futures holding their status and results when all complete. Future.isDone()
is true for each element of the returned list. A completed task could have terminated either normally or by throwing an exception:
List<Callable<String>> callables = new ArrayList<Callable<String>>();
callables.add(new Callable<String>() {
public String call() {
return "Callable 1";
}
});
callables.add(new Callable<String>() {
public String call() {
return "Callable 2";
}
});
callables.add(new Callable<String>() {
public String call() {
return "Callable 3";
}
});
List<Future<String>> futures = executorService.invokeAll(callables);
for(Future<String> f : futures){
System.out.println(f.get());
}
executorService.shutdown();
When you are done using the ExecutorService you should shut it down, so the threads do not keep running. To terminate the threads inside the ExecutorService you call its shutdown()
method. The ExecutorService will not shut down immediately, but it will no longer accept new tasks, and once all threads have finished current tasks, the ExecutorService shuts down. If you want to shut down the ExecutorService immediately, you can call the shutdownNow()
method. This will attempt to stop all executing tasks right away, and skips all non-processed tasks.
Deadlock describes a situation where two or more threads are blocked forever, waiting for each other. Example:
public class TestThread {
public static Object lock1 = new Object();
public static Object lock2 = new Object();
public static void main(String args[]) {
Thread t1 = new Thread(new Task1());
Thread t2 = new Thread(new Task2);
t1.start();
t2.start();
}
private static class Task1 implements Runnable {
public void run() {
synchronized (lock1) {
System.out.println("Task 1: Holding lock 1...");
try {
Thread.sleep(10);
}
catch (InterruptedException e) {}
System.out.println("Task 1: Waiting for lock 2...");
synchronized (lock2) {
System.out.println("Task 1: Holding lock 1 & 2...");
}
}
}
}
private static class Task2 implements Runnable {
public void run() {
synchronized (lock2) {
System.out.println("Task 2: Holding lock 2...");
try {
Thread.sleep(10);
}
catch (InterruptedException e) {}
System.out.println("Task 2: Waiting for lock 1...");
synchronized (lock1) {
System.out.println("Task 2: Holding lock 1 & 2...");
}
}
}
}
}
Lock starvation occurs when a thread, having lesser priority than other ones, is constantly waiting for a lock, never able to take it because other thread(s) with higher priority are constantly acquiring the lock.
A LiveLock is like a deadlock in the sense that two (or more) threads are blocking each others. But with the livelock, each thread is waiting "actively", trying to resolve the problem on its own. A live lock occurs when the combination of these processes' efforts to resolve the problem makes it impossible for them to ever terminate. For example, if two threads detect a deadlock, and try to "step aside" for each other, without proper care, they will end up being stuck in a loop always "stepping aside" and never managing to move forwards.
A race condition is a situation where two threads compete for the same resource and they try to change it at the same time, doing it in a way that causes unexpected results. The problem happens when for example, one thread checks if the value is X, then do something that depends on that value and another thread does something to the value in between the check and the do.
You have to be careful when multiple threads access shared variables, since it can result in a race condition. For example, in a method like this:
int n = 0;
void m() {
this.n = this.n + 1;
}
The increment of variable n is vulnerable to concurrency. We can use the synchronized keyword to fix this. We can, for example, synchronize the method:
int n = 0;
synchronized void m() {
this.n = this.n + 1;
}
Or just a block of code:
int n = 0;
void m() {
synchronized (this) {
this.n = this.n + 1;
}
}
Internally, Java uses a so monitor or lock to manage synchronization. This monitor is bound to an object. For synchronized instance methods, the lock is on the instance of the corresponding object. For static methods, it's the class. For synchronized blocks, the object can be specified (the example use this to refer to the instance the method belongs to). Only the thread that acquires the lock has access to the method (or block).
java.concurrent.atomic contains classes to perform atomic operations. With an atomic operation, you can safely perform the operation in parallel on multiple threads without using the synchronized keyword or locks.
We have for example:
The synchronized example above can be changed to use an AtomicInteger in this way:
AtomicInteger n = new AtomicInteger(); // creates an AtomicInteger with the initial value 0.
void m() {
n.incrementAndGet();
}
Here are some common operations for the atomic classes:
AtomicInteger ai = new AtomicInteger(10);
int val = ai.get(); // Get the value
ai.set(15); // Set the value
int expectedValue = 15;
int newValue = 20;
// If the value of ai equals expectedValue, ai is set to newValue
ai.compareAndSet(expectedValue, newValue);
ai = new AtomicInteger(10);
val = ai.getAndAdd(10); // val contains 10 but ai contains 20
val = ai.addAndGet(10); // val and ai contain 30
val = ai.getAndDecrement(); // val contains 30 but ai contains 29
val = ai.decrementAndGet(); // val and ai contain 28
val = ai.getAndIncrement(); // val contains 28 but ai contains 29
val = ai.incrementAndGet(); // val and ai contain 30
The methods updateAndGet()
and getAndUpdate()
accept a lambda expression in order to perform a function (an IntUnaryOperator in the case of AtomicInteger) upon the value, for example:
AtomicInteger ai = new AtomicInteger(10);
ai.updateAndGet(i -> i * 5); // ai contains 50
The methods accumulateAndGet()
and getAndAccumulate()
accept a lambda expression of type IntBinaryOperator (in the case of AtomicInteger) that updates the current value with the results of applying the given function to the current and given values. The function is applied with the current value as its first argument, and the given value as the second argument. For example:
AtomicInteger ai = new AtomicInteger(10);
atomicInt.accumulateAndGet(5, (a, b) -> a + b) // ai contains 15
In the case of LongAdder and DoubleAdder, they can be used to consecutively add values to a number. For example:
ExecutorService executor = Executors.newFixedThreadPool(3);
LongAdder la = new LongAdder();
IntStream.range(0, 1000)
.forEach(i -> executor.submit(la::increment)); //Adds one to la, 1000 times
System.out.println(la.sum()); // la contains 1000
This class provides the methods add(long)
(adds the given value) and increment()
(add one) and is thread-safe. But instead of just summing up a single result, this class maintains a set of variables internally to reduce contention over threads. The result can be retrieved by calling sum()
or sumThenReset()
(gets the value and reset the sum to zero). This class is prefered over the atomic classes when updates from multiple threads are more common than reads.
LongAccumulator and DoubleAccumulator are a more generalized version of the previous classes. Here's an example:
LongAccumulator acc = new LongAccumulator((a, b) -> a + b , 1L);
ExecutorService executor = Executors.newFixedThreadPool(2);
IntStream.range(0, 5)
.forEach(i -> executor.submit(() -> acc.accumulate(i)));
System.out.println(acc.getThenReset()); //acc contains 15
In the example, a LongAccumulator is created with the function a + b
and an initial value of one. With every call to accumulate(i), both the current result and the value i are passed as parameters to the lambda expression. A LongAccumulator also maintains a set of variables internally to reduce contention over threads. The result can be retrieved by calling get()
or getThenReset()
(gets the value and reset the variables to zero).
The BlockingQueue interface represents a thread-safe queue. Generally, a thread produces objects, while another thread consumes them.
A BlockingQueue has four forms of methods:
| Throws Exception | Special Value | Blocks | Times Out | |
|---|---|---|---|---|
| Insert | add(e) |
offer(e) |
put(e) |
offer(e, timeout, timeunit) |
| Remove | remove() |
poll() |
take() |
poll(timeout, timeunit) |
| Examine | element() |
peek() |
Throws Exception: If the attempted operation is not possible immediately, an exception is thrown.
Special Value: If the attempted operation is not possible immediately, a special value is returned (often true / false).
Blocks: If the attempted operation is not possible immediately, the method call blocks until it is.
Times Out: If the attempted operation is not possible immediately, the method call blocks until it is, but waits no longer than the given timeout.
It is not possible to insert null into a BlockingQueue. If you try to insert null, the BlockingQueue will throw a NullPointerException.
The implementations of the BlockingQueue are:
Here's an example using ArrayBlockingQueue:
class Producer implements Runnable {
private BlockingQueue<String> queue = null;
public Producer(BlockingQueue<String> queue) {
this.queue = queue;
}
public void run() {
try {
// The sleeps calls will cause the Consumer to block while waiting for objects in the queue.
queue.put("1");
Thread.sleep(1000);
queue.put("2");
Thread.sleep(1000);
queue.put("3");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Consumer implements Runnable {
private BlockingQueue<String> queue = null;
public Consumer(BlockingQueue<String> queue) {
this.queue = queue;
}
public void run() {
try {
System.out.println(queue.take());
System.out.println(queue.take());
System.out.println(queue.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class Test {
public static void main(String[] args) throws Exception {
BlockingQueue<String> queue = new ArrayBlockingQueue<>(1024);
Producer producer = new Producer(queue);
Consumer consumer = new Consumer(queue);
new Thread(producer).start();
new Thread(consumer).start();
Thread.sleep(4000);
}
}
The BlockingDeque interface in the java.util.concurrent class represents a thread-safe deque. A deque is a "Double Ended Queue", a queue which you can insert and take elements from, in both ends.
The implementation of the BlockingDeque is:
Like a BlockingQueue, a BlockingDeque has four forms of methods:
For the First Element:
| Throws Exception | Special Value | Blocks | Times Out | |
|---|---|---|---|---|
| Insert | addFirst(e) |
offerFirst(e) |
putFirst(e) |
offerFirst(e, timeout, timeunit) |
| Remove | removeFirst() |
pollFirst() |
takeFirst() |
pollFirst(timeout, timeunit) |
| Examine | getFirst() |
peekFirst() |
For the Last Element:
| Throws Exception | Special Value | Blocks | Times Out | |
|---|---|---|---|---|
| Insert | addLast(e) |
offerLast(e) |
putLast(e) |
offerLast(e, timeout, timeunit) |
| Remove | removeLast() |
pollLast() |
takeLast() |
pollLast(timeout, timeunit) |
| Examine | getLast() |
peekLast() |
For example:
BlockingDeque<String> deque = new LinkedBlockingDeque<>();
deque.addFirst("a");
deque.addLast("b");
String b = deque.takeLast();
String a = deque.takeFirst();
The ConcurrentMap interface represents a Map that can handle concurrent access.
The implementation of the ConcurrentMap is:
Since it extends form Map, it has the same methods as a normal map and some others for concurrent access:
ConcurrentMap<String, String> concurrentMap = new ConcurrentHashMap<>();
concurrentMap.put("key", "value");
Object value = concurrentMap.get("key");
// Puts a new value into the map only if no value exists for the given key
String val = map.putIfAbsent("key2", "value2");
// Returns the value for the given key. If doesn't exist, the passed default value is returned
value = map.getOrDefault("hi", "or not");
However, Java 8 adds new methods that support functional programming.
The method forEach()
accepts a BiConsumer lambda expression with both the key and value of the map passed as parameters. It replaces for-each loops:
concurrentMap.forEach((key, value) -> System.out.println(key + "=" + value));
The method replaceAll()
accepts a BiFunction lambda expression. The function is called with the key and the value of each map entry returning a new value to be assigned for the current key:
concurrentMap.replaceAll((key, value) -> value.toUpperCase());
To transform a single entry, use compute()
. The method accepts both the key to be computed and a bi-function. There are two variations, computeIfAbsent()
and computeIfPresent()
, that work only if the key is absent or present respectively:
concurrentMap.compute("key", (key, value) -> value.toUpperCase());
The method merge()
can be used to unify a new value with an existing value in the map. It accepts a key, the new value to be merged into the existing entry and a bi-function to specify the merging behavior of both values:
concurrentMap.merge("key", "newVal", (oldVal, newVal) -> oldVal + " merged with " + newVal);
System.out.println(concurrentMap.get("key")); // It prints "value merged with newVal"
The ConcurrentNavigableMap interface is a java.util.NavigableMap with support for concurrent access and for its submaps. The submaps are the maps returned by various methods like headMap()
, subMap()
and tailMap()
.
The implementation of ConcurrentNavigableMap is:
The headMap(T toKey)
method returns a view of the map containing the keys which are strictly less than the given key. Changes to the original map are reflected in the head map:
ConcurrentNavigableMap<String, String> map = new ConcurrentSkipListMap<>();
map.put("1", "one");
map.put("2", "two");
map.put("3", "three");
ConcurrentNavigableMap headMap = map.headMap("2");
headMap contains a ConcurrentNavigableMap with the key "1", since only this key is strictly less than "2".
The tailMap(T fromKey)
method returns a view of the map containing the keys which are greater than or equal to the given fromKey.Changes to the original map are reflected in the head map:
ConcurrentNavigableMap<String, String> map = new ConcurrentSkipListMap<>();
map.put("1", "one");
map.put("2", "two");
map.put("3", "three");
ConcurrentNavigableMap tailMap = map.tailMap("2");
tailMap contains the keys "2" and "3" because these two keys are greater than or equal to "2".
The subMap()
method returns a view of the original map which contains all keys from (including) to (excluding) two keys given as parameters to the method:
ConcurrentNavigableMap<String, String> map = new ConcurrentSkipListMap<>();
map.put("1", "one");
map.put("2", "two");
map.put("3", "three");
ConcurrentNavigableMap subMap = map.subMap("2", "3");
submap contains only the key "2", because only this key is greater than or equal to "2" and smaller than "3".
The CyclicBarrier class is a synchronization mechanism that allows a set of threads to all wait for each other to reach a common barrier point. The barrier is called cyclic because it can be re-used after the waiting threads are released.
The waiting threads wait at the CyclicBarrier until either:
await()
)CyclicBarrier.reset()
method is called by some external thread.When you create a CyclicBarrier you specify how many threads wait for it, before releasing them:
CyclicBarrier barrier = new CyclicBarrier(2);
The CyclicBarrier supports a barrier action, which is a Runnable that is executed once the last thread arrives. You pass tit in its constructor:
Runnable barrierAction = () -> System.out.println("Barrier Action") ;
CyclicBarrier barrier = new CyclicBarrier(2, barrierAction);
And here is how a thread waits at a CyclicBarrier:
barrier.await();
// Specifying a 20 seconds timeout to release the threads, even if not all threads are waiting at the CyclicBarrier
barrier.await(10, TimeUnit.SECONDS);
You can see a complete example in the javadoc.
The CopyOnWriteArrayList class is a thread-safe variant of ArrayList in which all mutative operations (add, set, and so on) are implemented by making a fresh copy of the underlying array.
The iterator of CopyOnWriteArrayList is fail-safe and doesn't throw a ConcurrentModificationException even if underlying CopyOnWriteArrayList is modified once the iteration begins, because the iterator is operating on a separate copy of ArrayList. For that reason, all the updates made on CopyOnWriteArrayList are not available to the iterator. However, element-changing operations on iterators themselves (remove, set, and add) are not supported. These methods throw an UnsupportedOperationException.
With CopyOnWriteArrayList, there is no lock on read, so this operation is faster. Because of this, CopyOnWriteArrayList is most useful when you have few updates and inserts and many concurrent reads than using, for example, Collections.synchronizedList(arrayList)
.
The Fork/Join Framework is designed for work that can be broken down into smaller tasks, with its results combined to produce the final result. One important concept is that ideally no worker thread is idle, idle workers steal the work from those workers who are busy, this is known as work-stealing.
It follows this algorithm:
if (problem is small)
directly solve problem
else {
split problem into independent parts
fork new subtasks to solve each part
join all subtasks
compose result from subresults
}
The core classes of the Fork-Join framework are ForkJoinPool and ForkJoinTask.
ForkJoinPool is an implementation of ExecutorService that employs the work-stealing algorithm. It can be created like this:
ForkJoinPool pool = new ForkJoinPool(int); //creates a ForkJoinPool with the indicated parallelism level (number of initial threads in the pool)
ForkJoinPool pool = new ForkJoinPool(); //equivalent to new ForkJoinPool(Runtime.availableProcessors())
There are different ways of submitting a task to the ForkJoinPool:
void execute(ForkJoinTask<?> task)
Arranges for (asynchronous) execution of the given task.
void execute(Runnable task)
Executes the given command at some time in the future.
<T> T invoke(ForkJoinTask<T> task)
Performs the given task, returning its result upon completion.
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
Executes the given tasks, returning a list of Futures holding their status and results when all complete.
<T> ForkJoinTask<T> submit(Callable<T> task)
Submits a value-returning task for execution and returns a Future representing the pending results of the task.
<T> ForkJoinTask<T> submit(ForkJoinTask<T> task)
Submits a ForkJoinTask for execution.
ForkJoinTask<?> submit(Runnable task)
Submits a Runnable task for execution and returns a Future representing that task.
<T> ForkJoinTask<T> submit(Runnable task, T result)
Submits a Runnable task for execution and returns a Future representing that task.
ForkJoinTask is an abstract class for creating tasks that run within a ForkJoinPool. RecursiveAction and RecursiveTask are its subclasses. The only difference between these two classes is that the RecursiveAction does not return a value while RecursiveTask does.
The main methods of ForkJoinTask are:
fork()
method allows a ForkJoinTask to be planned for asynchronous execution. A new task can be created with this method.In this example, the program finds the minimum number from a large array:
public class MinimumTaskFinder extends RecursiveTask<Integer> {
private static final int SEQUENTIAL_THRESHOLD = 5;
private final int[] data;
private final int start;
private final int end;
public MinimumTaskFinder(int[] data, int start, int end) {
this.data = data;
this.start = start;
this.end = end;
}
public MinimumTaskFinder(int[] data) {
this(data, 0, data.length);
}
@Override
protected Integer compute() {
final int length = end - start;
if (length < SEQUENTIAL_THRESHOLD) {
return computeDirectly();
}
final int split = length / 2;
final MinimumTaskFinder left = new MinimumTaskFinder(data, start, start + split);
left.fork();
final MinimumTaskFinder right = new MinimumTaskFinder(data, start + split, end);
return Math.min(right.compute(), left.join());
}
private Integer computeDirectly() {
int min = Integer.MAX_VALUE;
for (int i = start; i < end; i++) {
if (data[i] < min) {
min = data[i];
}
}
return min;
}
public static void main(String[] args) {
int[] data = new int[10000];
Random random = new Random();
for (int i = 0; i < data.length; i++) {
data[i] = random.nextInt(1000);
}
ForkJoinPool pool = new ForkJoinPool();
MinimumTaskFinder task = new MinimumTaskFinder(data);
System.out.println(pool.invoke(task));
}
}
If the size of the array is less than a threshold, then find the minimum directly by iterating over the array. Otherwise, since the problem can be broken into chunks, split the array into two halves, recurse on each half and wait for them to complete (join). Once the value is reduced to the threshold, the tasks are not further divided for parallelism. Finally, once we have the result of each half, we can find the minimum of the two and return it.
You can execute streams in parallel so Java partitions the stream into multiple substreams. Aggregate operations iterate over and process these substreams in parallel and then combine the results. It's important that the operations are stateless and can be executed in an arbitrary order.
A stream is not parallel by default. To make a parallel stream, invoke the method Collection.parallelStream
(if you're working with a collection) or BaseStream.parallel
:
List l = new ArrayList();
l.parallelStream().forEach(System.out:println);
// Or
Stream.of("1", "2", "3").parallel().forEach(System.out:println);
Parallel streams use a common ForkJoinPool available via the ForkJoinPool.commonPool()
method. The size of the thread-pool depends on the amount of available physical CPU cores:
ForkJoinPool commonPool = ForkJoinPool.commonPool();
System.out.println(commonPool.getParallelism());
The value can be modified by setting the following JVM parameter to a non-negative integer:
-Djava.util.concurrent.ForkJoinPool.common.parallelism=4
A reduction operation combines all elements into a single result, such as finding the sum or maximum of a set of numbers, or accumulating elements into a list. So in addition to reduce()
, collect()
, sum()
, max()
, or count()
are also reduction operations.
The reduce()
method has the following versions:
Optional<T> reduce(BinaryOperator<T> accumulator)
Performs a reduction on the elements of this stream, using an associative accumulation function, and returns an Optional describing the reduced value, if any.
T reduce(T identity, BinaryOperator<T> accumulator)
Performs a reduction on the elements of this stream, using the provided identity value and an associative accumulation function, and returns the reduced value.
<U> U reduce(U identity, BiFunction<U,? super T,U> accumulator, BinaryOperator<U> combiner)
Performs a reduction on the elements of this stream, using the provided identity, accumulation and combining functions.
A reduce operation is parallelizable as long as the function(s) used to process the elements are associative and stateless. For example:
int sum = numbers.parallelStream().reduce(0, (x,y) -> x+y);
Can be parallelized with no modification:
int sum = numbers.parallelStream().reduce(0, (x,y) -> x+y);
Reduction can operate on subsets of the data in parallel, and then combine the intermediate results to get the final answer.
A reduce operation on elements of type <T> yielding a result of type <U> requires three parameters:
<U> U reduce(U identity,
BiFunction<U, ? super T, U> accumulator,
BinaryOperator<U> combiner);
Here, the identity element is both an initial seed value for the reduction and a default result if there are no input elements. The accumulator function takes a partial result and the next element and produces a new partial result. The combiner function combines two partial results to produce a new partial (or the final) result. Example:
int sum = numbers.parallelStream()
.reduce(0,
(sum, x) -> sum + x,
(x, y) -> x + y);


Code Quiz!
Test your skills and answer the questions below while you try to beat the clock.
Code Quiz!


| Architecture | Hybrid Application |
| Application domain type | m-Health |
| Authentication | Username and Password |
| Has DB | Yes |
| Type of data storage | SQL |
| Which DB | MySQL |
| Type of data stored | Personal Information ; Confidential Data ; Critical Data |
| User Registration | Yes |
| Type of Registration | The users will register themselves |
| Programming Languages | HTML5 ; Javascript ; PHP |
| Input Forms | Yes |
| Upload Files | Yes |
| The system has logs | Yes |
| The system has regular updates | Yes |
| The system has third-party | Yes |
| System Cloud Environments | Public Cloud |
| Hardware Specification | Yes |
| HW Authentication | Basic Authentication (user/pass) |
| HW Wireless Tech | 3G ; 4G/LTE ; 5G ; Bluetooth ; Wi-Fi ; GPS ; NFC |
| Data Center Phisical Access | Yes |
In order to avoid or prevent Botnet, DoS and DDoS Attacks, the following security tests should be performed.
| Test Parameter | Testing Types | Testing Methods | Tools | ||
|---|---|---|---|---|---|
| Both | Android | iOS | |||
| Add-ons | White Box | Static Analysis via Forensic Mobile | Addons Detector | ||
| DoS, DDoS Attacks | Black Box | Dinamic Analysis via Penetration Test | NMAP, SlowBot Net, MetaSploit, LOlC and Kali Linux |
In order to avoid or prevent Botnet, DoS, DDoS, Phishing, MITM, Spoofing and Sniffing Attacks, the following security tests should be performed.
| Test Parameter | Testing Types | Testing Methods | Tools | ||
|---|---|---|---|---|---|
| Both | Android | iOS | |||
| Mobile decryption, unpacking & conversion | White Box | Static Analysis via Test Penetration | Dex2jar | Clutch | |
| Secure backup and logging | Grey Box | Dinamica Analysis via Proxies | adb | ||
| Data leakage and Breach | Grey Box | Dinamic analysis via Proxies | Wireshark | tPacketCapturepro, AFWall+, | |
| Grey Box | Dinamic Analysis via Penetration Testing | VASTO | |||
| White Box | Dnamic Analysis via Stressing Testing (fuzzing) | Webfuzz, SPI Fuzzer, Wfuzz |
In order to avoid or prevent SQLi, XSS, Spoofing and CSRF attacks, the following security tests should be performed.
| Test Parameter | Testing Types | Testing Methods | Tools | ||
|---|---|---|---|---|---|
| Both | Android | iOS | |||
| Authentication and Authorization | Grey Box | Dinamic analysis via Vulnerability Scanner | OWASP WebScarab, OWASP Berretta, Nikto, Wikto, Paros Proxy, Spike Proxy, EOR, Pantera | ||
| Access Control | Grey Box | Dinamic Analysis via Penetration Test | NMAP and Kali Linux |
In order to avoid or prevent Sniffing, Botnet, Phishing and Spoofing Attacks, the following security tests should be performed.
| Test Parameter | Testing Types | Testing Methods | Tools | ||
|---|---|---|---|---|---|
| Both | Android | iOS | |||
| Use of encryption | White Box | Static Analysis via Forensic Mobile | OpenSSL | ||
| Poor use of certificate parameters | Grey Box | Dinamic analysis via Vulnerability Scanner | Acunetix, Web3af, Nikto, IBM Security AppScan Standard and HP WebInspect | ||
| Grey Box | Dinamic Analysis via Penetration Test | TCPDump, Wireshak | idb tool | ||
| Secure backup and logging | Black Box | Dinamic Analysis via Proxies | adb |
In order to avoid or prevent Botnet, Spoofing and Sniffing attacks, the following security tests should be performed.
| Test Parameter | Testing Types | Testing Methods | Tools | ||
|---|---|---|---|---|---|
| Both | Android | iOS | |||
| Exploit Database Vulnerabilities | White Box | Manual Dinamic Analysis via Penetration Test | SQLite browser | Xcode | |
| Proper SSL usage and Use of encryption | Black Box | Dinamic Analysis via Proxies | WebScarab | ||
| Database frangibility scanner | Grey Box | Dinamic Analisys via Vulnerability Scanner | Database Scanner of Internet Security Systems Co. and MetaCortex | ||
| Find Bugs | White Box | Static Analysis via Bytecode Scanner | FindBugs, BugScan of LogicLab Co. | ||
| White Box | Static Analysis via source code Analyser | C++Test, RATS, C Code Analyzer(CCA) | |||
| White Box | Static Analysis via Binary code Scanner | BugScan of Logi- cLab Co. and Fx- Cop;BugScam | |||
| Input validation of user SID | Grey Box | Manual Dinamic Analysis Checking input fields in GUI | |||
| Runtime manipulation: code injection, patching | Grey Box | Static Analysis via Test Penetration | Cydia Substrate | Cycript |
In order to avoid or prevent Malicious Insider and VM-Migration attacks, the following security tests should be performed.
| Test Parameter | Testing Types | Testing Methods | Tools | ||
|---|---|---|---|---|---|
| Both | Android | iOS | |||
| Input validation | Grey Box | Static Analysis via Forensic Mobile | Slueth Kit+Autopsy Browser | AndroGuard, Drozer, apktool, Amandroid |
In order to avoid or prevent Malware injection and Side-channel Attacks, the following security tests should be performed.
| Test Parameter | Testing Types | Testing Methods | Tools | ||
|---|---|---|---|---|---|
| Both | Android | iOS | |||
| Debug flag | White Box | Static Analysis via Forensic Mobile | BlackBag Blacklight, Encase forensics | AndroGuard, Drozer, FindBugs, Andriller | |
| Content providers | White Box | Static Analysis via Forensic Mobile | Slueth Kit+Autopsy Browser | AndroGuard, Drozer, apktool | |
| Code quality | White Box | Static Analysis via Byte- code Scanner | FindBugs, BugScan of LogicLab Co. | ||
| White Box | Static Analysis via source code Analyser | C++Test, RATS, C Code Analyzer(CCA) | |||
| White Box | Static Analysis via source code Analyser | BugScan of LogicLab Co. and Fx- Cop, BugScam | class-dump-z |
In order to avoid or prevent physical attacks, the following security tests should be performed.
| Test Parameter | Test Approach |
Test Method | Tools | ||
|---|---|---|---|---|---|
| Both | Android | iOS | |||
| Debug flag, Content providers, Code quality | White Box | Static Analysis via Forensic Mobile | AndroGuard, Drozer, FindBugs | ||
| Leak, Breach and data Loss | Black Box | Manual Dinamic Analysis Checking input fields from device and GUI |


Moving to Alma Config
closed
by None at 2023-04-19 17:56:24.That latest change makes the checkbox disappear in Resources, while remaining with label "Notable" in Accessions. This again leads me to believe that boolean_1 is not distinct in the modules but there is one across the app, and by defining two different labels we're introducing a conflict. Working to confirm this suspicion.
https://github.com/archivesspace/archivesspace/blob/master/common/locales/en.yml#L11
closing in favor of https://github.com/pulibrary/lib_jobs/issues/495
labeled
by Christina Chortaria at 2023-04-19 21:16:57.assigned
by Christina Chortaria at 2023-04-19 21:17:04.labeled
by Kevin Reiss at 2023-04-19 22:07:59.superseded by https://github.com/pulibrary/command_line_curriculum/pull/17
closed
by Francis Kayiwa at 2023-04-19 16:36:07.head_ref_deleted
by Francis Kayiwa at 2023-04-19 16:36:11.review_requested
by Francis Kayiwa at 2023-04-19 17:01:09.head_ref_force_pushed
by Francis Kayiwa at 2023-04-19 16:34:05.review_requested
by Francis Kayiwa at 2023-04-19 16:34:27.head_ref_force_pushed
by Francis Kayiwa at 2023-04-19 16:35:31.review_requested
by Francis Kayiwa at 2023-04-19 16:36:50.assigned
by Jane Sandberg at 2023-04-19 20:50:42.assigned
by Christina Chortaria at 2023-04-19 20:50:42.I will ensure that the reporting user is directed to lsupport
for future DataSpace support requests.
The user account permissions have been updated, and I have enquired of the user as to whether or not there are additional permissions which might be required.
assigned
by James R. Griffin III at 2023-04-19 16:46:42.ready_for_review
by Chun Ly at 2023-04-19 17:40:45.review_requested
by Chun Ly at 2023-04-19 17:41:11.Per discussions with @kelynch, for now this is not critical for the migration but at a later point, we might decide to populate it in PDC.
labeled
by Chun Ly at 2023-04-19 18:19:29.labeled
by Chun Ly at 2023-04-19 18:19:29.assigned
by Chun Ly at 2023-04-19 20:04:02.mentioned
by Kate Lynch at 2023-04-19 20:04:55.subscribed
by Kate Lynch at 2023-04-19 20:04:55.referenced
by Chun Ly at 2023-04-19 20:16:51.deployed
by None at 2023-04-19 16:17:12.referenced
by None at 2023-04-19 16:25:57.merged
by None at 2023-04-19 16:25:57.closed
by None at 2023-04-19 16:25:58.head_ref_deleted
by None at 2023-04-19 16:25:59.This was ingested from Mudd/AC116
it should look like https://findingaids.princeton.edu/catalog/AC116_c60112-61836
labeled
by Trey Pendragon at 2023-04-19 15:31:39.labeled
by Trey Pendragon at 2023-04-19 15:31:45.assigned
by Trey Pendragon at 2023-04-19 15:53:30.referenced
by Trey Pendragon at 2023-04-19 15:54:32.closed
by None at 2023-04-19 16:25:59.deployed
by None at 2023-04-18 22:09:48.deployed
by None at 2023-04-18 22:25:30.assigned
by Robert-Anthony Lee-Faison at 2023-04-19 15:05:32.referenced
by Bess Sadler at 2023-04-19 19:43:15.merged
by Bess Sadler at 2023-04-19 19:43:15.closed
by Bess Sadler at 2023-04-19 19:43:15.head_ref_deleted
by Bess Sadler at 2023-04-19 19:43:17.it looks like we'll have to update the circleci config to run yarn install. that means it'll need a box with node installed, if we don't already.
Ha, y'all were fixing it right when I was writing that comment
review_requested
by Robert-Anthony Lee-Faison at 2023-04-19 17:55:31.ready_for_review
by Bess Sadler at 2023-04-19 21:05:04.referenced
by Bess Sadler at 2023-04-19 21:05:55.merged
by Bess Sadler at 2023-04-19 21:05:55.closed
by Bess Sadler at 2023-04-19 21:05:55.head_ref_deleted
by Bess Sadler at 2023-04-19 21:05:56.review_requested
by Robert-Anthony Lee-Faison at 2023-04-19 21:37:38.per @mzelesky this is a good model to follow https://github.com/pulibrary/lib_jobs/tree/main/app/models/peoplesoft_voucher
transferred
by Christina Chortaria at 2023-04-19 19:55:32.assigned
by Jane Sandberg at 2023-04-19 19:55:42.assigned
by None at 2023-04-19 19:55:42.mentioned
by None at 2023-04-19 19:57:06.subscribed
by None at 2023-04-19 19:57:06.review_requested
by None at 2023-04-19 20:03:39.deployed
by None at 2023-04-19 21:03:11.referenced
by Jane Sandberg at 2023-04-19 21:10:03.merged
by Jane Sandberg at 2023-04-19 21:10:03.closed
by Jane Sandberg at 2023-04-19 21:10:03.head_ref_deleted
by Jane Sandberg at 2023-04-19 21:10:04.closed
by Jane Sandberg at 2023-04-19 21:10:04.assigned
by Kate Lynch at 2023-04-19 11:45:26.unassigned
by Kate Lynch at 2023-04-19 11:45:29.assigned
by Kate Lynch at 2023-04-19 15:14:23.labeled
by None at 2023-04-19 15:54:43.Looking at new WAF that devs can interact with being up this summer (June).
unassigned
by Kevin Reiss at 2023-04-19 15:05:40.unassigned
by Alicia Cozine at 2023-04-19 15:05:40.labeled
by Kevin Reiss at 2023-04-19 15:31:21.Need some clarification on how the desired outcome for maps relate to the display and behavior of non-map Multi-volume works.
@tpendragon @eliotjordan - am I understanding correctly that multi-volume works should have multiple viewers, but "ScannedMap" (per graphql) resources should have a single viewer?
@maxkadel For documentation, https://github.com/pulibrary/orangelight/pull/3286 is the PR where I broke this.
I think it's this:
If I get back two resources and one of them is in the member_ids
of another, don't display the child.
There's never a case where we want to display the MVW manifest -and- the volume manifest on the same page.
We used to filter it out so if there was a MVW and a Volume then it'd only display MVWs, but finding if something is a MVW is pretty expensive and that isn't a precise enough calculation anyways.
@tpendragon That PR is part of why I'm confused.
So, https://catalog.princeton.edu/catalog/9950403683506421 should still have 2 viewers after whatever changes I make, since there is
* 1 physical object with a recto and verso
* 1 catalog record for that object
* 2 Figgy objects
* 1 Figgy object is a simple object (not nested) with 2 images, one of the recto and one of the verso, which translates to one iiif viewer (see https://figgy.princeton.edu/catalog/bbc6f6c4-3b92-4ae9-8461-1a14c113af8c)
* This is represented in the iiif manifest as @type: "sc:Manifest"
* 1 Figgy object is a complex object with two nested "members" (see https://figgy.princeton.edu/catalog/54b399c7-f28c-46f6-a7b4-c835a60516c4)
* Each "member" is a set of multi-spectral images
* Both members are represented in a single iiif manifest as @type: "sc:Collection"
, resulting in a single viewer
https://catalog.princeton.edu/catalog/9968107933506421 - Should have a single viewer after whatever changes I make
* 1 conceptual object in six pieces (1 map, 6 sheets)
* 1 catalog record
* 1 Figgy object
* Complex object with 7 nested "Child Scanned Maps" (one for each sheet, plus one of all of the sheets digitally stitched together)
* Each manifest that Orangelight fetches has @type: "sc:Manifest"
. The one that has all of the images has multiple canvases under Sequences: Canvases, whereas the single images on have on canvas.
So, could we say that the number of viewers should match the number of (parent?) Figgy objects?
mentioned
by Eliot Jordan at 2023-04-19 15:51:01.subscribed
by Eliot Jordan at 2023-04-19 15:51:01.mentioned
by Trey Pendragon at 2023-04-19 15:51:01.subscribed
by Trey Pendragon at 2023-04-19 15:51:01.mentioned
by Max Kadel at 2023-04-19 16:01:49.subscribed
by Max Kadel at 2023-04-19 16:01:49.mentioned
by Trey Pendragon at 2023-04-19 19:51:27.subscribed
by Trey Pendragon at 2023-04-19 19:51:27.deployed
by None at 2023-04-19 21:36:59.ready_for_review
by Jane Sandberg at 2023-04-19 21:44:13.deployed
by None at 2023-04-19 21:45:58.referenced
by Christina Chortaria at 2023-04-19 21:47:43.merged
by Christina Chortaria at 2023-04-19 21:47:43.closed
by Christina Chortaria at 2023-04-19 21:47:43.head_ref_deleted
by Christina Chortaria at 2023-04-19 21:47:44.labeled
by Jane Sandberg at 2023-04-19 21:25:00.assigned
by Jane Sandberg at 2023-04-19 21:26:22.closed
by Christina Chortaria at 2023-04-19 21:47:44.labeled
by Kevin Reiss at 2023-04-19 22:10:57.related issue #3523
To do:
labeled
by Kevin Reiss at 2023-04-19 15:30:20.assigned
by Jane Sandberg at 2023-04-19 15:31:57.head_ref_force_pushed
by None at 2023-04-19 13:48:41.head_ref_force_pushed
by None at 2023-04-19 14:11:37.referenced
by Bess Sadler at 2023-04-19 14:58:25.merged
by Bess Sadler at 2023-04-19 14:58:25.closed
by Bess Sadler at 2023-04-19 14:58:25.head_ref_deleted
by Bess Sadler at 2023-04-19 14:58:26.referenced
by None at 2023-04-19 13:23:04.referenced
by None at 2023-04-19 13:32:35.referenced
by None at 2023-04-19 13:48:40.referenced
by None at 2023-04-19 14:11:37.closed
by Bess Sadler at 2023-04-19 14:58:27.referenced
by Bess Sadler at 2023-04-19 14:58:27.assigned
by Hector Correa at 2023-04-19 15:14:28.labeled
by None at 2023-04-19 15:18:30.labeled
by None at 2023-04-19 15:18:55.labeled
by None at 2023-04-19 15:20:38.Display the first two and then # others
@hhh409, @mcj12, and 11 others
This may be a duplicate ticket.
PR where this was fixed: https://github.com/pulibrary/pdc_describe/pull/1042
closed
by None at 2023-04-19 15:27:02.I think this is still related to the VPN in the URL.
closed
by None at 2023-04-19 15:31:42.closed
by None at 2023-04-19 15:31:51.closed
by None at 2023-04-19 15:32:16.closed
by None at 2023-04-19 15:38:39.closed
by None at 2023-04-19 15:39:29.closed
by None at 2023-04-19 15:42:33.We got rid of local storage. We believe this is no longer an issue
closed
by None at 2023-04-19 15:45:51.labeled
by None at 2023-04-19 15:48:06.labeled
by None at 2023-04-19 15:48:07.labeled
by None at 2023-04-19 15:48:07.Add this to the dspace data rake task
labeled
by None at 2023-04-19 15:48:07.labeled
by None at 2023-04-19 15:48:08.labeled
by None at 2023-04-19 15:48:08.labeled
by None at 2023-04-19 15:48:08.labeled
by None at 2023-04-19 15:48:09.labeled
by None at 2023-04-19 15:48:09.labeled
by None at 2023-04-19 15:48:10.labeled
by None at 2023-04-19 15:48:10.labeled
by None at 2023-04-19 15:48:11.labeled
by Bess Sadler at 2023-04-19 18:17:34.labeled
by Bess Sadler at 2023-04-19 18:17:34.renamed
by Bess Sadler at 2023-04-19 18:34:34.renamed
by Bess Sadler at 2023-04-19 18:35:43.referenced
by None at 2023-04-19 19:09:55.merged
by None at 2023-04-19 19:09:55.closed
by None at 2023-04-19 19:09:55.head_ref_deleted
by None at 2023-04-19 19:09:56.labeled
by Bess Sadler at 2023-04-19 17:44:19.labeled
by Bess Sadler at 2023-04-19 17:44:30.assigned
by Bess Sadler at 2023-04-19 17:44:32.closed
by None at 2023-04-19 19:09:57.There is pagination, but it does not seem to be working: https://github.com/pulibrary/pdc_describe/blob/main/app/services/s3_query_service.rb#L235-L244
Found this in relation to the dspace container listing
labeled
by None at 2023-04-19 14:29:57.labeled
by None at 2023-04-19 15:48:06.assigned
by None at 2023-04-19 17:50:44.closed
by None at 2023-04-19 19:17:18.referenced
by None at 2023-04-19 19:17:16.merged
by None at 2023-04-19 19:17:16.closed
by None at 2023-04-19 19:17:16.head_ref_deleted
by None at 2023-04-19 19:17:18.head_ref_force_pushed
by None at 2023-04-19 19:18:12.mentioned
by Francis Kayiwa at 2023-04-19 18:57:45.subscribed
by Francis Kayiwa at 2023-04-19 18:57:45.convert_to_draft
by Hector Correa at 2023-04-19 18:59:13.ready_for_review
by Francis Kayiwa at 2023-04-19 19:03:30.referenced
by Francis Kayiwa at 2023-04-19 19:45:44.merged
by Francis Kayiwa at 2023-04-19 19:45:44.closed
by Francis Kayiwa at 2023-04-19 19:45:44.head_ref_deleted
by Francis Kayiwa at 2023-04-19 19:45:46.head_ref_force_pushed
by Francis Kayiwa at 2023-04-19 12:44:42.referenced
by Bess Sadler at 2023-04-19 12:49:30.merged
by Bess Sadler at 2023-04-19 12:49:30.closed
by Bess Sadler at 2023-04-19 12:49:30.head_ref_deleted
by Bess Sadler at 2023-04-19 12:49:31.labeled
by None at 2023-04-19 15:48:07.referenced
by Francis Kayiwa at 2023-04-19 12:12:28.merged
by Francis Kayiwa at 2023-04-19 12:12:28.closed
by Francis Kayiwa at 2023-04-19 12:12:28.head_ref_deleted
by Francis Kayiwa at 2023-04-19 12:12:29.closed
by Francis Kayiwa at 2023-04-19 12:12:29.referenced
by Bess Sadler at 2023-04-19 12:48:38.merged
by Bess Sadler at 2023-04-19 12:48:38.closed
by Bess Sadler at 2023-04-19 12:48:39.head_ref_deleted
by Bess Sadler at 2023-04-19 12:48:40.ready_for_review
by Francis Kayiwa at 2023-04-19 13:03:38.head_ref_force_pushed
by Francis Kayiwa at 2023-04-19 13:11:33.referenced
by Rebecca Sutton Koeser at 2023-04-19 14:49:26.merged
by Rebecca Sutton Koeser at 2023-04-19 14:49:26.closed
by Rebecca Sutton Koeser at 2023-04-19 14:49:26.head_ref_deleted
by Rebecca Sutton Koeser at 2023-04-19 14:49:28.closed
by Rebecca Sutton Koeser at 2023-04-19 14:49:28.renamed
by None at 2023-04-19 17:13:27.referenced
by Bess Sadler at 2023-04-19 17:30:04.merged
by Bess Sadler at 2023-04-19 17:30:04.closed
by Bess Sadler at 2023-04-19 17:30:04.head_ref_deleted
by Bess Sadler at 2023-04-19 17:30:05.Tested on staging servers with @acozine , @leefaisonr and @VickieKarasic
mentioned
by Alicia Cozine at 2023-04-19 20:09:55.subscribed
by Alicia Cozine at 2023-04-19 20:09:55.mentioned
by Vickie Karasic at 2023-04-19 20:09:55.subscribed
by Vickie Karasic at 2023-04-19 20:09:55.mentioned
by Robert-Anthony Lee-Faison at 2023-04-19 20:09:55.subscribed
by Robert-Anthony Lee-Faison at 2023-04-19 20:09:55.referenced
by Bess Sadler at 2023-04-19 20:15:04.merged
by Bess Sadler at 2023-04-19 20:15:04.closed
by Bess Sadler at 2023-04-19 20:15:04.head_ref_deleted
by Bess Sadler at 2023-04-19 20:15:05.referenced
by James R. Griffin III at 2023-04-19 20:43:15.merged
by James R. Griffin III at 2023-04-19 20:43:15.closed
by James R. Griffin III at 2023-04-19 20:43:15.head_ref_deleted
by James R. Griffin III at 2023-04-19 20:43:16.review_requested
by Francis Kayiwa at 2023-04-19 21:03:24.Once this PR is merged, the procedure for enabling Tower alerts to a new channel will be:
1. add TowerNotifications as a member of the channel
2. add the channel to the list of options in the Capistrano deploy
template's survey question about slack channels
labeled
by None at 2023-04-19 19:05:38.This document is in review with Matt. Additional tickets will be made as needed to finalize and share moving forward.
closed
by Kate Lynch at 2023-04-19 11:40:00.labeled
by None at 2023-04-19 21:20:21.labeled
by None at 2023-04-19 21:20:21.Moving out of sprint until MF301 training is confirmed and API-focused format is finalized.
closed
by None at 2023-04-19 15:03:39.closed
by None at 2023-04-19 15:04:19.


Sphere (1998)
Director: Barry Levinson Written by: Stephen Hauser, Paul Attanasio Producers: Michael Crichton, Barry Levinson Cast: Dustin Hoffman, Sharon Stone, Samuel L. Jackson, Peter Coyote, Queen Latifah, Liev Schreiber, Marga Gomez Runtime: 135 min. Production Company: Warner Bros. Rated PG-13: Language, intense scenes, sci-fi violence
By Nathaniel R. Atcheson<EMAIL_ADDRESS>As I wrote in my review for the egregiously underrated Event Horizon, I hate being alone when it comes to opinions on films. And here I am again, in the position of having loved a film that most people--critics and audiences--are likely to despise across the board. I read reviews of Sphere before seeing it, and I was expecting a bad film. I read them again afterwards, and now I simply disagree with every word. This film apparently struck me differently than it did everyone else--when they said "boring," I was saying "captivating." When they said "rushed," I said "intense." In fact, there's nothing I didn't like about Sphere: to me, this is everything that a big-budget thriller should be--suspenseful, interesting, atmospheric, well-acted, and well-written.
I saw Sphere with four friends. Each one of them had read the Crichton book, and I, obviously, had not (and still haven't, and probably never will...). My less-discerning friends thought the film was a good translation of the book, and enjoyed both equally. My opinion-heavy friends, who loved the book, hated the movie. In fact, one of my friends even went so far as to describe Sphere as a bigger disappointment than Congo. I had to draw the line there.
Sphere opens with the gathering of four professionals--psychologist Norman Goodman (Dustin Hoffman), mathematician Harry Adams (Samuel L. Jackson), astrophysicist Ted Fielding (Liev Schreiber), and biologist Beth Halperin (Sharon Stone). They are gathered as a contact group for a suspected alien spacecraft found 1000 feet below the surface of the ocean. When they go down to check out the enormous craft, they find (you guessed it) a big golden ball! Actually, it's more precise than that--it's a perfect sphere. As the characters try to figure out what the sphere is, they apparently get on-line with an alien being called Jerry...and all hell breaks loose. The majority of the film is spent in chaos.
Well, let me get on with why I was fooled by this apparently-horrible film. First, I'm talking suspense. I can't remember the last film I saw that was this suspenseful. Looking at my fingers now, I see that I mindlessly chewed them to a pulp as I was watching. Director Barry Levinson does such an extremely good job of building suspense throughout the film that, by the end, I felt totally exhilarated. Some of the scenes, such as an attack by a giant squid summoned by Jerry, are chaotic without being incoherent, and the result is an array of staggeringly claustrophobic action sequences taking place inside the small underwater habitat.
Another common critical point with which I fundamentally disagree is the suggestion of the character-less characters. Now, keep in mind that I went into Sphere expecting to dislike it. I was looking for reasons to dislike it, but I couldn't find a one. This includes the characters--the five main characters (the fifth being the military man Barnes, played by Peter Coyote), by action film standards, are all extremely well-written. And it doesn't hurt that the film has a God-granted cast to play the parts. Hoffman is excellent in the main role: he is convincing as a psychologist (well, Hoffman is convincing as anything), and in the scenes in which he begins to lose his mind, he acts just the way I would expect a psychotic psychologist to act.
Sharon Stone is wonderful here--her character is fascinatingly paranoid, and her condition is only accentuated by the effects of living in an underwater habitat. The relationship between Norman and Beth, too, is well-developed (though I understand that this aspect is not in the book) and by the end of the film, I was truly concerned for the characters and wanted them to live. Jackson, as the mathematician, is also sharp in his role, and in later scenes he manages to be truly terrifying just by smiling. The supporting performances, particularly from Schreiber, are good as well.
Since I haven't read the book, I have no idea what magical words it contains to warrant such an enormously negative response from fans of it. All I know is that films never follow the books closely, and that's because there is a lot of information that can't possibly be naturally stated in the film without bogging down the audience. Sphere is already long--well over two hours. I don't know what could have been possibly left out, because the themes and plot turns in this film are fascinating and engrossing, and at the end of the film I had no questions--everything was clear. As far as I'm concerned, screenwriters Stephan Hauser and Paul Attanasio have done a great job writing the film.
So, here I am again, alone in my opinion. Perhaps it's a mistake to form a review as a paranoid decree of possible misunderstanding. That, in effect, is what I am doing--if I were so sure that there is nothing wrong with Sphere, I probably would not have mentioned the Other Critics. Maybe I'm so self-conscious of it because I continually like films that are generally lambasted by everyone else. This time, however, I'm standing my ground. I'm not changing my rating or my review no matter how many negative views I read or hear about. You see, I simply can not understand why everyone hates Sphere. I loved every bit of it--I didn't want it to end. For me, it did everything right. And I'll probably see it over and over again, and with each viewing it is likely that my curiostiy as to what, exactly, makes this such a bad film will inflate exponentially.
>From 0-10: 8 Grade: B+
Visit FILM PSYCHOSIS at http://www.pyramid.net/natesmovies
Nathaniel R. Atcheson
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


Interface IReadOnlySpatialMap<T>
See ISpatialMap documentation. Similar in principle to the C# standard IReadOnlyList/IReadOnlyCollection interface. Simply exposes only those functions of the ISpatialMap interface that do not allow direct modification of the data (eg. adding/moving/removing items). This can allow for direct exposure of an ISpatialMap as a property of type IReadOnlySpatialMap, without allowing such an exposure to break data encapsulation principles of something like a game map.
Inherited Members
Namespace: GoRogue
Assembly: GoRogue.dll
Syntax
public interface IReadOnlySpatialMap<T> : IEnumerable<ISpatialTuple<T>>, IEnumerable
Type Parameters
| Name | Description |
|---|---|
| T |
Properties
| Improve this Doc View SourceCount
The number of items in the data structure.
Declaration
int Count { get; }
Property Value
| Type | Description |
|---|---|
| System.Int32 |
Items
Enumerable of the items stored in the data structure: for use to iterate over all items,
eg:
foreach (var item in mySpatialMap.Items)
// Do stuff
Declaration
IEnumerable<T> Items { get; }
Property Value
| Type | Description |
|---|---|
| System.Collections.Generic.IEnumerable<T> |
Positions
Enumerable of all positions that contain items. Likely this won't be used as much, since most objects that are contained in a spatial map implementation will record their position as a member, however in case that is not the case for a particular use, or just as a convenience if you only care about the coordinates, this is provided.
Declaration
IEnumerable<Coord> Positions { get; }
Property Value
| Type | Description |
|---|---|
| System.Collections.Generic.IEnumerable<Coord> |
Methods
| Improve this Doc View SourceAsReadOnly()
Returns a read-only reference to the data structure. Convenient for "safely" exposing the structure as a property.
Declaration
IReadOnlySpatialMap<T> AsReadOnly()
Returns
| Type | Description |
|---|---|
| IReadOnlySpatialMap<T> | The current data structure, as a "read-only" reference. |
Contains(T)
Returns whether or not the data structure contains the given item.
Declaration
bool Contains(T item)
Parameters
| Type | Name | Description |
|---|---|---|
| T | item | The item to check for. |
Returns
| Type | Description |
|---|---|
| System.Boolean | True if the given item is in the data structure, false if not. |
Contains(Coord)
Returns if there is an item in the data structure at the given position or not.
Declaration
bool Contains(Coord position)
Parameters
| Type | Name | Description |
|---|---|---|
| Coord | position | The position to check for. |
Returns
| Type | Description |
|---|---|
| System.Boolean | True if there is some item at the given position, false if not. |
Contains(Int32, Int32)
Returns if there is an item in the data structure at the given position or not.
Declaration
bool Contains(int x, int y)
Parameters
| Type | Name | Description |
|---|---|---|
| System.Int32 | x | The x-value of the position to check for. |
| System.Int32 | y | The y-value of the position to check for. |
Returns
| Type | Description |
|---|---|
| System.Boolean | True if there is some item at the given position, false if not. |
GetItems(Coord)
Gets the item(s) associated with the given position if there are any items, or returns nothing if there is nothing at that position.
Declaration
IEnumerable<T> GetItems(Coord position)
Parameters
| Type | Name | Description |
|---|---|---|
| Coord | position | The position to return the item(s) for. |
Returns
| Type | Description |
|---|---|
| System.Collections.Generic.IEnumerable<T> | The item(s) at the given position if there are any items, or nothing if there is nothing at that position. |
GetItems(Int32, Int32)
Gets the item(s) associated with the given position if there are any items, or returns nothing if there is nothing at that position.
Declaration
IEnumerable<T> GetItems(int x, int y)
Parameters
| Type | Name | Description |
|---|---|---|
| System.Int32 | x | The x-value of the position to return the item(s) for. |
| System.Int32 | y | The y-value of the position to return the item(s) for. |
Returns
| Type | Description |
|---|---|
| System.Collections.Generic.IEnumerable<T> | The item(s) at the given position if there are any items, or nothing if there is nothing at that position. |
GetPosition(T)
Gets the position associated with the item in the data structure, or null if that item is not found.
Declaration
Coord GetPosition(T item)
Parameters
| Type | Name | Description |
|---|---|---|
| T | item | The item to get the position for. |
Returns
| Type | Description |
|---|---|
| Coord | The position associated with the given item, if it exists in the data structure, or null if the item does not exist. |
ToString(Func<T, String>)
Returns a string representation of the IReadOnlySpatialMap, allowing display of the SpatialMap's items in a specified way.
Declaration
string ToString(Func<T, string> itemStringifier)
Parameters
| Type | Name | Description |
|---|---|---|
| System.Func<T, System.String> | itemStringifier | Function that turns an item into a string. |
Returns
| Type | Description |
|---|---|
| System.String | A string representation of the SpatialMap. |


Measure Each Live Oyster
In this step, you'll enter the length (mm) of each live oyster into the table below. Enter one oyster measurement per cell.
Note: If you see a red background in a cell, check your numbers! "Oyster Length" accepts values from 1-250.


--- layout: page title: "Erro 404: Page not found" slug: error404 permalink: 404.html ---
Sorry, it seems that this URL is pointing to a page that does not exist. Try to return to the Home and try again.


DBC Introduction Page
Chad E. Howard
June 2, 2014
Chicago Cohort
Coyotes
About Me
Hello everyone!
I'm Chad Howard and I'm super excited to be a part of DBC!
I can't wait to meet everyone!
Personal Info
I've been married for 12 years
I have 2 beautiful daughters
Interests
- Spending time with my family
- Ohio State Football and Basketball
- Camping
- Whitewater Rafting
Biggest Fears
- Heights
- Snakes
- Clowns
- Bunnies - long story


Revised: 26 February 2003 (US EPA moved sites)
Laboratory methods are available from reference manuals in the laboratory, on CDROM and on-line, as well as the specific methods included in this manual (Contents). Further assistance is available in Field and Test Methods. This bibliography is not meant to be exhaustive, only indicative.
| Standard Methods for the Examination of Water and Wastewater (St Kilda bookcase) |
| CRC Handbook of Chemistry and Physics (St Kilda bookcase) |
| Australian Laboratory Handbook of Soil and Water Methods (St Kilda bookcase) |
| Colorimetric Chemical Analytical Methods (St Kilda bookcase) |
| Guidelines for the Laboratory Analysis of Contaminated Soils (St Kilda bookcase) |
| SW-846 US EPA Test Methods for Evaluating Solid Waste - Chemical and Physical Methods (CDROM in St Kilda CDROM files) |
| US EPA Solid Waste Test Methods |
| US EPA Test Methods(search for laboratory QA, standard operating procedures etc as well as field methods) |
| US EPA Environmental Test Methods |
| Nutrient Analysis Manual |
| General Laboratory Methods |
| Plankton and macroinvertebrate identification: assorted volumes in bookcases (St Kilda bookcase) |
Return to Management System Contents Page


New Alerts
Bacon ipsum dolor sit amet pancetta meatloaf eiusmod laborum commodo officia ex exercitation bacon. Sunt magna duis ex prosciutto nostrud. Tri-tip ball tip sausage spare ribs sirloin sunt officia anim magna eiusmod turducken sint velit meatball ham hock. Exercitation culpa pork chop rump, short loin meatball ut aute tenderloin.
Bacon ipsum dolor sit amet pancetta meatloaf eiusmod laborum commodo officia ex exercitation bacon. Sunt magna duis ex prosciutto nostrud. Tri-tip ball tip sausage spare ribs sirloin sunt officia anim magna eiusmod turducken sint velit meatball ham hock. Exercitation culpa pork chop rump, short loin meatball ut aute tenderloin.
Acknowledged Alerts
Acknowledged alerts are stored in your
Event Logs.
New Alerts
You do not have any new alerts.
Acknowledged Alerts
Acknowledged alerts are stored in your
Event Logs.
New Alerts
Bacon ipsum dolor sit amet pancetta meatloaf eiusmod laborum commodo officia ex exercitation bacon. Sunt magna duis ex prosciutto nostrud. Tri-tip ball tip sausage spare ribs sirloin sunt officia anim magna eiusmod turducken sint velit meatball ham hock. Exercitation culpa pork chop rump, short loin meatball ut aute tenderloin.
Acknowledged Alerts
Acknowledged alerts are stored in your
Event Logs.


--- layout: default title: Welcome ---
This is the home of the workshop Introduction ot Neural Networks
in FS2020 at the Faculty of Psychology, University of Basel.
Before the workshop's first session on May 28, please visit the
Installation page and follow the instructions.
Looking forward to a productive workshop neural networks!
Dirk Wulff


We'll send you a message as soon as the beta is ready.
Your feedback is invaluable to us. We'd really appreciate it if you could answer the following questions (all fields are optional).


--- layout: post permalink: birdalog.html Tags: Array NameOfCoupon: Birdalog Cash Back Summary: See our Birdalog Coupon Code, Birdalog Rebate, Birdalog Promo Code, Birdalog Discount, Birdalog Coupon Cash Back Rebate here. MetaKeywords: Birdalog Coupon Code, Birdalog Rebate, Birdalog Promo Code, Birdalog Cash Back Rebate, Birdalog Discount, Birdalog Coupon Image: images/9410.gif LinkURL: http://www.shareasale.com/r.cfm?b=49686&u=412002&m=9410 affiliate_url_link: http://www.icouponblog.com/jane.php?id=1938 thesis_readmore: See the Birdalog Coupon thesis_thumb: http://www.icouponblog.com/tn.php?merchantURL=birdalog.com Title: Save 5% - Birdalog Coupon Code for birdalog.com. Birdalog Rebate & Discount thesis_description: Our Birdalog Discount Coupon Code for birdalog.com. We have the best Birdalog Rebate anywhere. thesis_keywords: Birdalog, Birdalog Coupon Code, Birdalog Discount, Birdalog Rebate product_name: Birdalog hop_url: http://www.icouponblog.com/hop.php?id=1938 ---
Do you love gazing out of your window and observing the majestic wings of the crows, finches and sparrows in your backyard? Do your ears long to hear the sweet melodies of birds? Do you even have a few pet birds of your own? If you answered yes to these questions, then you will definitely love Birdalog. Birdalog is an online shop that carries over 800 items for your pet birds. You’ll enjoy finding everything you need for your precious feathered friend, all in one place!
Spoil your little birdies with a selection of bird toys. With jungle vines, snack sacks and chewing toys, your bird will be the ruler of its birdcage. There are tons of items to choose from all in one convenient place. The only thing you’ll love more than Birdalog is the money you’ll save with the Birdalog Coupon above! Pick out some nice snacks for your birds and give them a tasty treat. Birdalog will quickly become your favorite shop to treat your pet birds.
Birdalog is a great website to buy toys for your pet birds. There are over 800 toys to choose from. These toys will help your birds stay agile and fit and happy. It emulates some of the many natural actions of the birds. There are many toys that will bring down the aggressiveness in birds, for instance some birds like parrots become problem biters. A gentle toy will help control the aggressiveness. Check out Birdalog online and save money by using our discount coupons.


Rock Paper Scissors - First to Five
Select Rock, Paper, or Scissors and Click Play to Start
Rock
Paper
Scissors
Player Wins: 0
Computer Wins: 0


Resources
Mountain Bike Organizations (Oregon)
Team Dirt has several sister organizations around Oregon. In addition to sharing build knowledge and trail information, all clubs share a commitment to riding in Oregon and promoting mountain biking. Check out the following list for information about each club and their upcoming events.
Local Bike Outfitters
Corvallis is host to, no less than, 4 full service bike shops that outfit quality mountain biking merchandise. All of these LBS (local bike shops) offer technical repair and maintenance. Bike brand distribution is pretty well diversified across the shops, so most bike brands are represented.
Local Bike Resources
A few great organizations are present around Corvallis, which support the general biking community.


Q12 Correlations to Actor Engagement - Introduction
Apr 27, 2008
In a previous career, I was the manager of training and development for the upper midwest region of a large corporation. Part of that responsibility was the training and implementation of the Gallup Employee Engagement Survey - which is officially know as the Q12. It is named such because of the twelve questions which make up the survey. These questions have been refined through the years to provide an effective measurement of employee engagement in the workplace. This is not to say that these questions measure happiness - though there are obvious correlations - but rather employees who are engaged and committed in their role in the organization.
The questions are copyright of the Gallup Organization and a detailed analysis of each question can be found in the excellent book First, Break All the Rules: What the World's Greatest Managers Do Differently by Marcus Buckingham, Curt Coffman, but for the sake of posterity the twelve questions (better termed as statements which employees rate from 1 to 4) used on the survey are as follows:
- I know what is expected of me at work.
- I have the materials and equipment I need to do my work right.
- At work, I have the opportunity to do what I do best every day.
- In the last seven days, I have received recognition or praise for doing good work.
- My supervisor, or someone at work, seems to care about me as a person.
- There is someone at work who encourages my development.
- At work, my opinions seem to count.
- The mission/purpose of my company makes me feel my job is important.
- My associates (fellow employees) committed to doing quality work.
- I have a best friend at work.
- In the last six months, someone at work talked to me about my progress.
- In the last year, I have had opportunities at work to learn and grow.
As may be evident, these questions are not entirely applicable to a student or volunteer environment, though it's arguable that they can be made to be. Part of understanding the impact of these questions, however is to understand the journey of engagement which every employee goes through - in full or to a degree. It is in this journey or what the Gallup School of Management refers to as the pyramid of employee engagement that I find very direct correlations in the director to actor/crew relationships of a theatrical production.
In essence, as any new employee enters a job or undergoes a significant change in job responsibilities they must answer the four "journey questions" for themselves in the affirmative. There are four of them, and the questions of the Q12 are sub-segments of these four journey-based questions:
- What do I get?
- What do I give?
- Do I belong?
- How can we grow? (emphasis mine)
In both my personal experience as an actor, and my more recent experience as a director, I continue to notice that the journey of an actor as they become part of an ensemble - a process which starts anew with each production (no matter how often the actors have worked together previously) - is identical. In the workplace, if any one of these questions are not answered in the affirmative, full employee engagement is impossible. Likewise, as we look at the journey and actor or member of a production crew makes in becoming part of a more powerful ensemble, if any one of these questions are not answered, the individual's engagement in the greater whole of the production is reduced. In the next three segments, I will focus in on each of these questions and how they translate to the fundamental journey that every actor or member of a production crew makes through the course of the production.


Activity Name
Error
Activity Price
Error
Add activity
Activity Name
Error
Activity Price
Error
Edit activity


1. (50 min) What's new in ClickHouse 23.5.
2. (10 min) Q&A.
ClickHouse May Release.
— 29 new features 🌿
— 25 performance optimizations 🚴
— 83 bug fixes 🐝
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
:) SELECT * FROM numbers(10)
INTO OUTFILE 'numbers.tsv'
Ok.
:) SELECT * FROM numbers(10)
INTO OUTFILE 'numbers.tsv'
Cannot open file numbers.tsv, errno: 17,
strerror: File exists. -- this is fine
:) SELECT * FROM numbers(10)
INTO OUTFILE 'numbers.tsv' APPEND
Ok.
Developer: Manas Alekar.
Preparing data inside staging tables
and attaching it in one large batch.
CREATE TEMPORARY TABLE src (x UInt64) ENGINE = MergeTree ORDER BY x;
INSERT INTO src SELECT * FROM numbers(1000000);
...
ALTER TABLE dst ATTACH PARTITION () FROM src;
Works with REPLACE PARTITION as well.
Developer: Roman Vasin.
SELECT * FROM generateRandom('x UInt8, y String') LIMIT 10;
CREATE TEMPORARY TABLE test (x UInt8, y String);
INSERT INTO test SELECT * FROM generateRandom() LIMIT 10;
SELECT * FROM generateRandom() LIMIT 10;
DESCRIBE (SELECT * FROM generateRandom());
Demo
Developer: Pavel Kruglov.
For MySQL compatibility.
SHOW INDEX FROM hits
Row 1:
──────
table: hits
non_unique: 0
key_name: PRIMARY
seq_in_index: ᴺᵁᴸᴸ
column_name: ᴺᵁᴸᴸ
collation: A
cardinality: ᴺᵁᴸᴸ
sub_part: ᴺᵁᴸᴸ
packed: ᴺᵁᴸᴸ
null: ᴺᵁᴸᴸ
index_type: primary
comment: ᴺᵁᴸᴸ
index_comment: ᴺᵁᴸᴸ
visible: YES
expression: CounterID, EventDate, UserID, EventTime, WatchID
Developer: Robert Schulze.
system.user_processes
— current memory usage and resource counters for every user.
Demo
Developer: Kovi Benjamin Antal.
SELECT *
FROM system.zookeeper_connection
Row 1:
──────
name: default
host: <IP_ADDRESS>
port: 9181
index: 0
connected_time: 1970-01-01 01:25:00
is_expired: 0
keeper_api_version: 3
client_id: 122
Developer: Mateng915.
— bcrypt for password hashing;
— allow configuring the default password hashing;
CREATE USER test IDENTIFIED BY 'my_password';
config.d/password_type.yaml:
default_password_type: sha256_password
Developer: Nikolai Degterinskiy.
— BACKUP and RESTORE works with encryption-at-rest
without decryption and re-ecryption.
Developer: Vitaly Baranov.
— space function;
— for compatibility with Spark;
Demo
Developer: Robert Schulze.
Table engine:
CREATE TABLE test ... ENGINE = AzureBlobStorage(
'https://alesapintestazure.blob.core.windows.net',
'container', 'path.tsv');
SELECT * FROM test;
INSERT INTO test ...;
Table function:
SELECT * FROM azure_blob_storage('...', 'container', 'path.tsv');
INSERT INTO FUNCTION azure_blob_storage('...', 'container', 'path.tsv');
Developer: Alexander Sapin, Smita Kulkarni.
SELECT ... FROM s3(
'https://bucket.s3.amazonaws.com/data*.parquet.zst')
SELECT ... FROM s3Cluster(
cluster, 'https://bucket.s3.amazonaws.com/data*.parquet.zst')
Since version 23.5:
SELECT ... FROM url(
'https://bucket.s3.amazonaws.com/data{01..99}.parquet.zst')
SELECT ... FROM urlCluster(
cluster, 'https://bucket.s3.amazonaws.com/data{01..99}.parquet.zst')
Developer: Attack204, Pavel Kruglov.
clickhouse keeper-client
— a tool inside ClickHouse to introspect your Keeper or ZooKeeper.
Demo
Developer: Artem Brustovetskii.
Query Results Cache
— securely separated between users by default;
— normalized queries to their AST;
— respects query settings, and non-deterministic functions;
— controllable in size for each element, or in total;
— can be enabled for active and passive usage;
— production ready since 23.5!
Geographical Data Types
— Point, Ring, Polygon, and MultiPolygon data types;
— distance, area, perimeter, union, intersection, convex hull, etc. functions;
— cartesian and spherical coordinates;
— read from WKT, output into SVG;
— production ready since 23.5!
Compressed marks and indices on disk
— available since 22.9;
— improves the speed of first queries after server startup;
— enabled by default in 23.5.
New server settings to control memory usage:
merges_mutations_memory_usage_soft_limit and
merges_mutations_memory_usage_to_ram_ratio = 0.5
Merges and mutations will not start if more than half
of server memory is already consumed by background operations.
Developer: Dmitri Novik.
New table settings to lower memory usage:
merge_max_block_size_bytes and vertical_merge_algorithm_min_bytes_to_activate
— save memory when merging tables with large rows;
Developer: Nikita Mikhaylov.
The Official Tableau Connector:
https://github.com/ClickHouse/clickhouse-tableau-connector-jdbc
Originally developed by Analytika Plus.
Updates for Grafana, Metabase, Kafka Connect, Node.js, and Go drivers.
GCP
— ClickHouse Cloud is now available in Google Cloud!
API
— now you can control your services programmatically!
— easy to use and complete REST API for services, organizations, etc.
OpenAPI; Swagger endpoint available;
— upcoming: Terraform provider;
IAM
— secure access to your S3 buckets from ClickHouse Cloud.
— Vector Search In ClickHouse
— CDC From Postgres To ClickHouse
— ClickHouse For Observability with SigNoz
— Optimization of Hash Tables
— JOINs in ClickHouse: a deep dive
ClickHouse Meetups in
New York, Berlin, Barcelona, London,
San-Francisco, Bengaluru.
ClickHouse for AI - Vectors, Embedding, Semantic Search, and more...
Video Recordings: https://www.youtube.com/c/ClickHouseDB
Now available in
— free 30-day trial with $300 credits up to 10 TB of data;
— affordable clusters for developers with full HA < $100/month
Try it! https://clickhouse.cloud/.


@import idapiclient.responses.Error @( page: model.Page, idRequest: services.IdentityRequest, idUrlBuilder: services.IdentityUrlBuilder, accountDeletionForm: Form[(String, Option[String])], errors: List[Error], user: com.gu.identity.model.User )(implicit request: RequestHeader, messages: play.api.i18n.Messages, context: model.ApplicationContext) @import form.IdFormHelpers._ @import views.html.fragments.form.inputField @import views.html.fragments.form.radioField @import views.html.fragments.registrationFooter @emailIsValidated = @{ user.statusFields.userEmailValidated.fold(false)(identity) }
Please read the following paragraphs carefully to understand how account deletion affects any Guardian products you may have. If at any point you require further clarification please email our Userhelp who will be happy to help.
Deleting your account removes your personal information from our database.
If you have posted comments your comment profile will be removed, however the posted comments will remain underneath the articles. Comments are part of the historical record, but if want your comments to be removed please contact the Moderation Team. Please note that requests are considered on a case-by-case basis and your comments will not be automatically deleted.
If you have previously been banned, watched or premoderated due to inappropriate commenting behaviour, these restrictions will still be in place if you create a new account with the same email address.
Deleting your account does not cancel paid Membership. If you would like to cancel your membership please click here.
Deleting your account does not cancel paid Subscriptions. If you would like to cancel your subscription, please email the Subscriptions Team.
Deleting your account does not cancel Guardian in-app purchases made through Google, Apple or Amazon app stores. For further queries please contact respective App Store.

Deleting your account will unsubscribe you from all mailing lists.

Before you can delete your account you need to validate your email address by resetting your password. Once you have validated, please reload this page and you will be able to delete your account.
Reset your password


Why Does Shuffle leave empty spaces?
The algorithm used to place items does not keep track of empty space nor try to fill them. If you require this functionality, I suggest packery.
The algorithm used to place items does not keep track of empty space nor try to fill them. If you require this functionality, I suggest packery.
If the size of your items are dependent on images, they can overlap if shuffle is initialized before all the images have loaded. Check out this demo to see how to fix it.
They are very similar, but I think Shuffle's filtering and sorting are easier to customize, which is the main reason I created this plugin. Isotope has a much larger community, is battle-tested, and has many stackoverflow answers.
The padding is ignored by Shuffle because it creates complexities with absolute positioning the shuffle-items when they have a percentage width as well as setting the height of the shuffle container because of box-sizing. To fix this, wrap the shuffle element in another element which has the padding on it.
Nope. Shuffle is heavily based on columns for layout. You can add “empty” items to achieve a similar effect.
Check yo' self
Try looking at the javascript files for the demos or searching the issues on GitHub.


Maximum Risk
Maximum Risk is a movie starring Jean-Claude Van Damme, Natasha Henstridge, and Jean-Hugues Anglade. A cop/flic discovers that he had a twin who just got murdered in Nice, France. In order to find out who did it, he takes his place...


Football: Hong Kong turn backs on anthem then cheer team to first win
DUBAI: Hong Kong fans turned their backs to the Chinese national anthem once again but supported their team and were rewarded with a 2-0 win in Asian qualifying over Cambodia on Tuesday (Nov 19).
Before the match, home fans jeered and turned their backs to the pitch as the Chinese national anthem played. FIFA fined the Hong Kong Football Association 15,000 Swiss francs (13,700 euros or HK$117,944) following a similar incident before the Sep 10 match against Iran.
On Tuesday, James Ha put the hosts ahead with a close-range half-volley in the 21st minute.
Cambodia, under pressure for most of the match, were reduced to 10 men in the 78th minute when Soeuy Visal was sent off after flicking the ball out of the goalkeeper's hands to collect a second yellow card.
Despite the disparity in numbers, the hard-working Roberto Affonso Junior was still surrounded by four Cambodian defenders when he spun on the edge of the box five minutes later and curled the ball into the net.
Hong Kong have five points in Group C, while Cambodia stayed bottom with one.
Iraq, playing against Bahrain at the neutral venue of the Amman International Stadium in Jordan, remained on top of Group C with 11 points despite being held to a goalless draw.
Across town, at the King Abdullah II International Stadium, Jordan secured the biggest win of the day when they beat Chinese Taipei, 5-0. Jordan moved level with Kuwait in Group B at 10 points, two behind leaders Australia who have played one fewer match.
Qatar, the 2022 World Cup hosts, secured their third successive win in Group E with a 1-0 away triumph over a battling Afghanistan. The all-important goal at the neutral venue in Dushanbe, Tajikistan, was scored by forward Akram Afif when he converted a penalty in the 76th minute.
Also in Group E, Oman beat India, 1-0, with a goal by Mohsin Al Ghassani in the 33rd minute. Oman have 12 points from five matches, one behind the Qatar. India, who needed a win to keep their hopes alive, are fourth behind Afghanistan with three points from three draws in five matches.
In Group G in Kuala Lumpur, Safawi Rasid brought joy to hosts Malaysia with goals on either side of the break. The 2-0 win, in front of 80,000 fans, moved the hosts to second place in the group with three wins and nine points.
Vietnam, who lead the group with 11 points, were held to a goalless draw by Thailand in Hanoi.
The next round of matches is scheduled for Thursday, Mar 26, next year.
MORE: Our coverage of the Hong Kong protests
Follow us on Telegram for the latest on Hong Kong: https://cna.asia/telegram


1/25-2/4: INTENSIVE PHOTOGRAPHY WORKSHOP - (Central Austin) classes
1/19-1/29: Limited Time Only - (austin Texas) events
5/18: 2013 Austin's Miss Heart of the USA - (Greater Austin Area) events
12/29-12/30: Arabic Classes - (USA) classes
12/29-12/30: Arabic Classes - (USA) classes
1/22-1/26: Earn $4-$35 Per Study - Participants Needed ASAP - events
1/10-1/23: publicist is seeking new PR clients to add to his roster - (austin) events
1/26-2/9: Spring Registration! t-ball, baseball, and softball - (Northeast Austin) events
1/23: Naughty Girl Craft Nights - (The Sugar Factory) classes
1/22-1/23: African Bead Trader coming to The SugarFactory - (1800 West Koenig Lane near Burnet) events
1/22-2/5: Tienes mucho Talento pero MUCHO talento? - (Austin) events
5/12-5/25: Austin Kids Party Clowns Rental Elmo Dora Explorer Yo Gabba Costumes! - (Voted BEST! 888-501-4FUN (4386)!) events
4/12-4/26: Austin Clowns Kid Party Rentals Elmo Dora Explorer Yo Gabba Characters - (BEST in TX! 888-501-4FUN (4386)!) events
1/29: First Cash Pawn Job Fair! 1/29 (10a -2p) - (1800 S. Mays, Round Rock TX 78664) img events
1/22-1/24: Healthcare - Classes Begin Soon. Classes in Austin - ( Austin ) classes
1/22-2/5: MAD MUSIC "OPEN MiC" @8pm - (1206 Parkway @12th and Lamar) events
1/14-1/24: Business Dinner Etiq Camp Class Before You Eat = Class While You Eat - (School of Etiquette Austin<PHONE_NUMBER>) classes
1/15-1/25: Business Dressing Etiquette Camp Things Someone Meant to Tell You - (Outshine Tues in UT BaESoE<PHONE_NUMBER>)) classes
1/19-1/29: Free Week Etiquette Lessons for College and University Students - (School of Etiquette in Austin(512)8212699) classes
1/19-1/29: Free Week Etiquette Lessons for College and University Students - (School of Etiquette in Austin(512)8212699) classes
1/19-1/29: Free Week Etiquette Lessons for College and University Students - (School of Etiquette in Austin(512)8212699) events
1/19-1/29: Free Week Etiquette Lessons for College and University Students - (School of Etiquette in Austin(512)8212699) classes
2/25: Project Management Certificate - (St. Edward's Professional Education) classes
1/22: Blingo!!! - (Smokey Mo's Georgetown) events
1/20-1/21: Ladies Bootcamp-Huge Discount- 1 spot left - (Austin) classes
1/20-1/24: Ladies Bootcamp-Huge Discount- 1 spot left - (Austin) events
3/8-3/17: Space available for SXSW - (5th and I35, Austin) events
1/25: Amazing line-up! - (Club 1808) events
1/24: Free Essential Oils Mini Workshop - (La Madeleine Westlake Hills) map events
3/22: Photography Class for Austinites! - (Mayfield Park) img classes
1/22-2/4: Get a Degree in Massage Therapy - ( austin) classes
1/22: *Start a Degree in Health and Wellness or Health Care Administration* - classes
6/17-6/21: SUMMER GIRLS' KARATE CAMP - (4534 Westgate Blvd., Ste. 101, 78745) classes
2/14: Advanced Business & Technical Writing - (St. Edward's University Professional Edu) classes
2/23: SELF DEFENSE FOR TEENS AND ADULTS - (4534 WEST GATE BLVD. STE 101) classes
1/26: Garage Sale - 3 Family - (Wimberley, Texas) events
1/9-1/23: THE Ultimate Couple's Swinger Cruise!!! - events
1/22-2/4: **Working Moms get the degree that is right for you** - ( austin ) classes
3/9: Co-ed Social Sand Volleyball League @ Hanover's Saturdays 4:00pm - (Austin, TX) img events
1/22-1/30: ★★█▓▒ Local RE investing Workshops - img classes
1/22-1/24: Careers in Demand. Medical Admin Assistant Classes Starting Soon - ( Austin) classes
1/17-1/29: ★HOMESCHOOL HELP - INDIVIDUALS & GROUPS - REGULAR & SPECIAL ED. - (Austin and Surrounding Areas) classes
1/26: Music Video Extras Needed - (6th Street, Austin) events
1/18-2/1: Best tire prices for the new year - (Ricks Tire Service) events
1/19-1/31: Vendor opp for vintage, used, new, flea, farmers, etc - (6300 W. Hwy 290, Austin TX) events
1/22-2/5: Poker Instruction and Coaching - (Austin/Skype) classes
1/22-2/4: Get a College Degree in Criminal Justice - ( austin ) classes
1/10-1/24: Renew license - cosmetologist, estheticians & nail technicians - (Several States) classes
1/8-1/22: New! 180 Hour TREC 6 course required package! Real Estate - (TEXAS) classes
1/8-1/22: Real Estate Courses Online -- 15% Off!! - (Texas) classes
1/26-1/27: Come learn Polocrosse this weekend! - (Coupland (east of Austin)) events
1/22-2/4: ***Learn about how much student financial aid you may be eligible for* - ( austin ) classes
2/16-2/17: BBW Valentine's Day Dance - (Holiday Inn Austin Midtown) events
1/22-2/5: UT Austin Lab Seeks Families to Participate in Problem Solving Study - (Campus) events
1/22-2/5: Learn Spirit Entity Removal Work - (austin) classes
2/1-2/14: Zumba Class Pass - (South Austin) classes
2/1-2/10: Zumba Class Pass - (South Austin) classes
1/21-2/3: QUANTOS HEAVY MACHINERY AUCTION!!! -Registration now open! - events
1/21-2/1: Need a Career Boost? - img classes
1/21-1/26: moonwalks rentals - (georgetown) events
1/21-1/26: party rental/canopyies/tents pinatas - (georgetown/round rock) classes
1/21-1/25: party rental/canopyies/tents pinatas - (georgetown/round rock) events
1/21-1/24: 40x20 commercial tent for rent - (georgetown/roundrock) events
1/21-1/25: party rental/canopyies/tents pinatas - (georgetown/round rock) events
1/21-1/26: party rental/canopyies/tents pinatas - (georgetown/round rock) classes
1/31-2/2: Get Paid To Travel - Job Workshop - (Austin) classes
1/21-1/31: Home Staging Careers Start Here... - classes
1/15-1/29: Free Concert - (Anywhere USA) events
1/21: Mary Kay Skin Care Class - (South Austin) classes
2/1-2/15: Quick Start Work At Home Seminar - (Online ) classes
1/30: Renewed Health Acupuncture - (Austin Area) events
1/25-1/26: Church Garage Sale - (Monte Moriah Church) events
1/21-2/4: ★★█▓▒FREE Real Estate Investing Workshop - events
1/26: Career Testing Workshop - (south austin) classes
1/21-1/29: ★★█▓▒FREE Real Estate Investing Workshop - events
1/21-1/29: need up to THREE Accountability patrners for Weight Loss Resolution Group. - (Austin) classes
1/21-2/3: * Free College Course * - classes
2/3-2/16: Plan Her a Special Event Today- Add Romance - events
1/21-1/26: ★★█▓▒FREE Real Estate Investing Workshop - events
1/21-1/27: ★★█▓▒FREE Real Estate Investing Workshop - events
1/21-1/27: ★★█▓▒FREE Real Estate Investing Workshop - img events
1/21-2/3: Earn Cash By playing online games - ( austin ) img events
1/21-2/3: Earn Cash By taking surveys - ( austin ) img events
1/21-2/3: Earn Cash By reading emails - ( austin ) img events
3/11-3/17: British Virgin Islands Spring Break Sailing Adventure - (British Virgin Islands) events
1/15-1/29: Cocktail Music - (Austin and Hill Country) events
1/21-2/3: ~~~~~~~~~~~~~~~~~~~~~~Strength Training For Seniors - (Austin/Arboretum) classes
1/31: How to Build Passive Income - classes
1/14-1/28: Poker Instruction and Coaching - (Austin/Skype) classes
1/21-1/23: AUSTIN EVENT CALENDAR - (Austin) img events
1/14-1/28: Pre-Nursing Tutoring - (Austin) classes
1/13-1/23: ★★█▓▒FREE Real Estate Investing Workshop - img events
1/13-1/21: ★★█▓▒FREE Real Estate Investing Workshop - img events
1/20-1/29: ★★█▓▒FREE Real Estate Investing Workshop - img events
1/20-1/26: ★★█▓▒FREE Real Estate Investing Workshop - img events
1/20-2/3: The Secret to Making Money! - ($$$$$$$$ USA $$$$$$$$) classes
1/20-2/2: **Get a Degree in Massage Therapy** - ( austin ) classes
1/21-2/2: ★HOMESCHOOL HELP - INDIVIDUALS & GROUPS - REGULAR & SPECIAL ED. - (Austin and Surrounding Areas) classes
1/25-1/26: Free Austin Franchise Expo - events
1/14-1/26: Poker Instruction and Coaching - (Austin/Skype) classes


MODULE DEFAULT_obs_def_mod
TERMS OF USE
Overview
Beginning with the I-release of DART, a more flexible, powerful (and
complicated) mechanism for incorporating new types of observations is part of
DART. The DEFAULT_obs_def module being described here is used by the program
preprocess to create
obs_def_mod.f90.
To read more detailed instructions for adding your own new
observation types, see the documentation for
obs_def_mod.
The process does not involve altering this
DEFAULT_obs_def_mod.F90 file. Instead, new obs_def
files are specified as input to the preprocess program
by namelist,
and a new obs_def_mod.f90 file is generated. The rest
of the documentation here describes the internals of how the
preprocess program uses the template file to
do the code generation.
Information from zero or more special obs_def modules, such as
obs_def_1d_state_mod.f90 or
obs_def_reanalyis_bufr_mod.f90,
(also documented in this directory) are incorporated into the template
provided by DEFAULT_obs_def_mod. If no special obs_def files are included in
the preprocessor namelist, a minimal
obs_def_mod.f90 is created which can only
support identity forward observation operators. Any identity observations on
the obs_seq.out file will be assimilated, regardless of the obs types specified in
assimilate_these_obs_types.
This documentation file only describes the special formatting that is included
in the DEFAULT_obs_def_mod in order to guide the preprocess program. Up to
seven sections of code are inserted into the DEFAULT_obs_def_mod from each of
the special obs_def modules that are requested. The insertion point for each
section is denoted by a special comment line that must be included VERBATIM in
DEFAULT_obs_def_mod.F90.
These special comment lines and their significance are:
-
! DART PREPROCESS MODULE CODE INSERTED HERE
Some special observation definition modules (see for instance
obs_def_1d_state_mod.f90)
contain code for evaluating forward observation
operators, reading or writing special information about an observation
definition to an obs sequence file, or for interactive definition of an
observation. The entire module code section is inserted here,
so the resulting output file will be completely self-contained.
Fortran 90 allows multiple modules to be defined in a single source
file, and subsequent module code can use previously defined modules,
so this statement must preceed the rest of the other comment lines.
-
! DART PREPROCESS USE FOR OBS_QTY_MOD INSERTED HERE
Integer identifiers with a unique integer value corresponding to each
available observation quantity are defined in a table in the obs_kind_mod which
is also created by the preprocessor. The use statements for these entries are
inserted here.
-
! DART PREPROCESS USE OF SPECIAL OBS_DEF MODULE INSERTED HERE
Some special observation definition modules (see for instance
obs_def_1d_state_mod.f90)
contain code for evaluating forward observation
operators, reading or writing special information about an observation
definition to an obs sequence file, or for interactive definition of an
observation. The use statements for these routines from the special
observation definition modules are inserted here.
-
! DART PREPROCESS GET_EXPECTED_OBS_FROM_DEF INSERTED HERE
Special observation definition modules must contain case statement code saying
what to do to evaluate a forward observation operator for each observation type
that they define.
This code is inserted here.
-
! DART PREPROCESS READ_OBS_DEF INSERTED HERE
Special observation definition modules must contain case statement code saying
what to do to read any additional information required for each observation type
that they define from an observation sequence file.
This code is inserted here.
-
! DART PREPROCESS WRITE_OBS_DEF INSERTED HERE
Special observation definition modules must contain case statement code saying
what to do to write any additional information required for each observation
type that they define to an observation sequence file.
This code is inserted here.
-
! DART PREPROCESS INTERACTIVE_OBS_DEF INSERTED HERE
Special observation definition modules must contain case statement code saying
what to do to interactively create any additional information required for each
observation type that they define.
This code is inserted here.
Terms of Use
DART software - Copyright UCAR. This open source software is provided
by UCAR, "as is", without charge, subject to all terms of use at
http://www.image.ucar.edu/DAReS/DART/DART_download


{% from "govuk-jinja-components/components/panel/macro.jinja" import govukPanel -%} {{ govukPanel({ "titleText": "Application complete", "html": "Your reference numberHDJ2123F" }) }}


My home
$80
2 Guest
1 Bedroom
1 Bathroom
Owner: Carlos Barros
This is a lovely 1 bedrrom and 1 bathroom apartment that can accommodate 2 people. It locates at the center of Shanghai and next to subway line 1, stop to People Square, 2 stops to Bund, 3 stops to Jingan Temple.
Amenities
- TV
- Wifi
- Pets
2 Reviews
-
From Bob Dylan the 27th January 2017
Runshi is an epic host. Nothing more I can say. 5 star!
-
From Connor the 4th January 2017
Highly recommended!


|
||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | ENUM CONSTANTS | FIELD | METHOD | DETAIL: ENUM CONSTANTS | FIELD | METHOD |
java.lang.Object java.lang.Enum<Pitch> net.parallaxed.bluejam.Pitch
public enum Pitch
This enumeration represents the pitches and can be used to determine enharmonic equivalence between pitch classes.
| Enum Constant Summary | |
|---|---|
A
|
|
Ab
|
|
As
|
|
B
|
|
Bb
|
|
C
|
|
Cs
|
|
D
|
|
Db
|
|
Ds
|
|
E
|
|
Eb
|
|
F
|
|
Fs
|
|
G
|
|
Gb
|
|
Gs
|
|
R
R is a special kind of parameter, defining relative pitch. |
| Method Summary | |
|---|---|
boolean |
equals(Pitch p)
Determines enharmonic equivalence a given pitch. |
Accidental |
eval()
Evaluates which accidental is present on a given pitch. |
static java.lang.String |
getName(Pitch pitch)
|
static Pitch |
getPitch(java.lang.String pitch)
|
static Pitch |
valueOf(java.lang.String name)
Returns the enum constant of this type with the specified name. |
static Pitch[] |
values()
Returns an array containing the constants of this enum type, in the order they're declared. |
| Methods inherited from class java.lang.Enum |
|---|
clone, compareTo, equals, getDeclaringClass, hashCode, name, ordinal, toString, valueOf |
| Methods inherited from class java.lang.Object |
|---|
finalize, getClass, notify, notifyAll, wait, wait, wait |
| Enum Constant Detail |
|---|
public static final Pitch C
public static final Pitch Cs
public static final Pitch Db
public static final Pitch D
public static final Pitch Ds
public static final Pitch Eb
public static final Pitch E
public static final Pitch F
public static final Pitch Fs
public static final Pitch Gb
public static final Pitch G
public static final Pitch Gs
public static final Pitch Ab
public static final Pitch A
public static final Pitch As
public static final Pitch Bb
public static final Pitch B
public static final Pitch R
| Method Detail |
|---|
public static final Pitch[] values()
for(Pitch c : Pitch.values()) System.out.println(c);
public static Pitch valueOf(java.lang.String name)
name
- the name of the enum constant to be returned.
java.lang.IllegalArgumentException
- if this enum type has no constant
with the specified namepublic final boolean equals(Pitch p)
p
- The pitch to compare with
public final Accidental eval()
public static final Pitch getPitch(java.lang.String pitch)
public static final java.lang.String getName(Pitch pitch)
|
||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | ENUM CONSTANTS | FIELD | METHOD | DETAIL: ENUM CONSTANTS | FIELD | METHOD |