Social networks
You can find me on:
   
Open sharing content

These articles are available under Creative Commons license BY-SA-3.0

Author Archive

The numpy module features some useful functions for statistics, like “mean()” and “median()”:

https://docs.scipy.org/doc/numpy/reference/routines.statistics.html

For example let´s consider a 2D array with age and height of some people and print out some statistics:

#! /usr/bin/env python
import numpy as np

#age, height in meters
person = [[11,1.56],[4, 0.80], [44, 1.88], [23, 1.68], [55, 1.74]]

np_person = np.array(person)

print(np_person)

age = np_person[:,0]

height = np_person[:,1]
 
 #average
print("average age: " + str(np.mean(age)))
print("average height: " + str(np.mean(height)))

#the standard deviation is also rounded to two decimals only.
std_height= round(np.std(height),2)

print("standard deviation of the height: "+ str(std_height))

#correlation
corr = np.corrcoef(np_person[:,0], np_person[:,1])
print("Correlation: " + str(corr))

The code can be also found on github:
https://github.com/lauraliparulo/python-scripts/blob/master/statistics/person_stats.py

If you want to execute python scripts with Linux you need to add the shebang line: “#! /usr/bin/env python”

It must be added on top of the file.

The shebang will allow you to run the script as any other script. Among the many options to run it, assuming the script name is “script”, one is:

> ./script.py

The file must be made executable:

>  sudo chmod +x script.py

Assuming we want to print an homogenous array created with the numpy module, a script might include the module import too:

#! /usr/bin/env python

import numpy as np

array1 = np.array([1,2,3,4])

print(array1)

print(type(array1))

It will print the following lines:

[1 2 3 4]
<type ‘numpy.ndarray’>

 

 

In the previous post I told you about the old fashioned way to handle files in java.
In this article we will focus on the new API.
The File class is no longer used. We will use the “Path” class instead.
Files is a utility class to create either files or directories, that takes a path in the constructor:

	Path filePath=Paths.get("/home/laura/demo.txt");
	Files.createFile(filePath);
	
	Path dirPath=Paths.get("/home/laura/newdir");
	Files.createDirectory(dirPath);
	
	Path nestedDirPath=Paths.get("/home/laura/newdir3/newdir4");
	Files.createDirectories(nestedDirPath);

The “createDirectories” method created the whole file system structure (the nested directories).

With NIO.2 copying or deleting a file or directory have become a matter of one line of code, thanks to the very straightforward methods “copy”, “delete”, etc.

Many things can be achieved with the utility classes Files and Paths.

Let´s take a look a the classic IO file handling in java.
First let´s start with the “File” class.
The File class is not used to read or write data. It´s used to create or delete files and directories, for searching and working with paths.
So it´s not used for the files or directories content.

The File class constructor does not create anything on the hard drive. As you can see in the following snippet, you need to use the createNewFile method for it:

		File file = new File("/home/laura/demo.txt");
		System.out.println("Does the file exists?"+file.exists());
		boolean created = file.createNewFile();
		System.out.println("File created?"+created);
		System.out.println("Does the file exists?"+file.exists());

The createNewFile method returns “false” if the file already exists.

If the goal is handling text files, you don´t need to use any Stream class. All you need is a writer one. The basic option is to use the naked “FileReader” and “FileWriter” classes:

		FileWriter fileWriter= new FileWriter(file);
		fileWriter.write("hello world. this is a text file.");
		fileWriter.flush();
		fileWriter.close();
		
		FileReader fileReader= new FileReader(file);
		char[] in = new char[100];		
		int size = fileReader.read(in);
	
		System.out.println("File size:"+size);
		
		for(char c: in){
			System.out.print(c);
		}
	
		fileReader.close();

The FileReader method “read” delivers the amount of character read.

Notice that after writing the text into the file, you need to call the method “flush”. It´s necessary to call it to make sure that the whole data flows into the file before closing the writer.

So far so good. But this simple way shown above is not the most elegant solution out there, because we have been using an array (that has a fixed size)!

A much better approach is wrapping it up using the classes BufferedReader and BufferedWriter:

		FileWriter fileWriter= new FileWriter(file);
		BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
		
		bufferedWriter.write("hello world. this is a text file.");
		bufferedWriter.newLine();
		bufferedWriter.write("You are using the buffered reader now!");			
		bufferedWriter.close();
		
		FileReader fileReader= new FileReader(file);
		BufferedReader bufferedReader = new BufferedReader(fileReader);
		
		String data;			
		while((data=bufferedReader.readLine())!=null){
			System.out.println(data);		
		}
		
		bufferedReader.close();

Notice that buffered reader also has a method called “readLine”, that you wouldn´t get with a simple File reader.
Once you close a writer it cannot be reopened again. You get an exception if you use it after closing it!

For testing and debugging purposes you can enable the assertions evaluation with the VM parameter “-ea” ( or “-enableassertions” if you prefer the whole thing).

The assertions remain in the code and are just ignored at runtime if you don´t enable them. You can think of them as an aid in case of need.

The following method throws an exception if the parameter given is not a String containing “Laura”:


         private void testFirstName(String firstName){
                 assert(firstName.equals("Laura"));

               System.out.println("The given first name is Laura");
         }

A string message can be displayed in the stack trace, by adding a second expression to the assertion, like :

	private void testFirstName(String firstName){
		assert(firstName.equals("Laura")) : "the name "+ firstName+ " is not Laura!";
		
		System.out.println("The given first name is Laura");
	}

The output in this second case would be something like:

Exception in thread "main" java.lang.AssertionError: the name Anna is not Laura!
at com.demo.AssertionsDemo.testFirstName(AssertionsDemo.java:15)
at com.demo.AssertionsDemo.main(AssertionsDemo.java:8)

Since Java 1.4 “assert” has become a keyword.

Assertions can be disabled with the VM option “-da” or “-disableassertions”. Although the assertions are disabled by default, the manual disabling might make sense if you don´t want to enable the assertions for all the classes.

For example if you want to run a java jar file (for example “demo.jar”), but disabling the assertions for one of its classes (ex. “com.demo.Demo.java”) you need to use the following parameters:

> java -jar -ea -da:com.demo.Demo

To disable them for the whole “com.demo” package (including subpackages):

> java -jar -ea -da:com.demo...

So entering VM parameters like “-ea:” or “-ea:” allow you to select which assertions to evaluate.

Running “apt-get update” ubuntu complains about missings ppa keys.

In my case I was trying to install Libre Office and the missing key was 83FBA1751378B444.

I couldn´t find any key running:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 83FBA1751378B444

The message that I gog in the console was:
gpg: requesting key 83FBA1751378B444 from hkp server keyserver.ubuntu.com
gpgkeys: key 83FBA1751378B444 not found on keyserver
gpg: no valid OpenPGP data found.
gpg: Total number processed: 0

The solution to me was running:

 sudo launchpad-getkeys 

and the I could finally run “apt-get update”.

The Comparable interface allows you to sort by a specific object variable that you choose for your needs.
Take a look at the following object:

public class Book implements Comparable&lt;Book&gt; {
	
	private String title;
	private String author;
	private double price;
	
	public Book(String title, String author, double price) {
		super();
		this.title = title;
		this.author = author;
		this.price = price;
	}

	public String getAuthor() {
		return author;
	}

	public void setAuthor(String author) {
		this.author = author;
	}


	public double getPrice() {
		return price;
	}

	public void setPrice(double price) {
		this.price = price;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}


	@Override
	public int compareTo(Book that) {
		return Double.valueOf(this.price).compareTo(Double.valueOf(that.price));
	}

	public String toString() {
		return &quot; \n &quot; + title + &quot; \t &quot; + author + &quot; \t &quot; + price;
		}
		
}

Notice the way the compareTo method is overriden. It´s a double primitive variable, but you need the wrapper class to compare it. The following wouldn´t work:

	@Override
	public int compareTo(Book that) {
		return this.price.compareTo(that.price);
		return 0;
	}

Implementing the Comparable interface affects the sorting criteria. For example:

import java.util.Arrays;

public class ComparableTest{
	
	public static void main(String[] args) {
		
		Book[] books= {
		new Book(&quot;The capital&quot;,&quot;Marx,Karl&quot;,10.5),
		new Book(&quot;Interpretation of dreams&quot;,&quot;Freud, S.&quot;,12.5),
		new Book(&quot;Killed by Death&quot;,&quot;Kilmister, Lemmy&quot;,8)
		};
		
		System.out.println(&quot;Before sorting: \n&quot;+Arrays.toString(books));

	Arrays.sort(books);
	System.out.println(&quot;\n After sorting: \n&quot;+Arrays.toString(books));
	
	}
	
}

The output is:

Before sorting:
[
The capital Marx,Karl 10.5,
Interpretation of dreams Freud, S. 12.5,
Killed by Death Kilmister, Lemmy 8.0]


After sorting:
[
Killed by Death Kilmister, Lemmy 8.0,
The capital Marx,Karl 10.5,
Interpretation of dreams Freud, S. 12.5]

 

If you need to do a more complex comparison, you can make your own comparator by extending the Comparator interface (not “Comparable”).
For example you can create your own Comparator:

public class BookComparator implements Comparator&lt;Book&gt; {

	@Override
	public int compare(Book b1, Book b2) {
		
		int comparePrice = Double.valueOf(b1.getPrice()).compareTo(Double.valueOf(b2.getPrice()));
		if (comparePrice!=0) 
			{return comparePrice;
			}
		else return b1.getAuthor().compareTo(b2.getAuthor());
	}

}

It tries to order by price first, but ifthe books have the same price, they will be sorted by the author name too.

If you runt the following main method:

	public static void main(String[] args) {

		ArrayList&lt;Book&gt; booksList = new ArrayList&lt;Book&gt;();
		booksList.add(new Book(&quot;The capital&quot;, &quot;Marx,Karl&quot;, 10.5));
		booksList.add(new Book(&quot;Peace and War&quot;, &quot;Tostoj. L.&quot;, 12.5));
		booksList.add(new Book(&quot;Interpretation of dreams&quot;, &quot;Freud, S.&quot;, 12.5));
		booksList.add(new Book(&quot;Killed by Death&quot;, &quot;Kilmister, Lemmy&quot;, 8));
		
		System.out.println(&quot;before sorting:&quot;);
		for (Book book : booksList) {
			 System.out.println( book.toString());

		}

		Collections.sort(booksList, new BookComparator());
		System.out.println(&quot;&quot;
				+ &quot;\n after sorting:&quot;);
		
		for (Book book : booksList) {
			 System.out.println(book.toString());

		}

Then you see the following output:

before sorting:
The capital Marx,Karl 10.5
Peace and War Tostoj. L. 12.5
Interpretation of dreams Freud, S. 12.5
Killed by Death Kilmister, Lemmy 8.0

after sorting:
Killed by Death Kilmister, Lemmy 8.0
The capital Marx,Karl 10.5
Interpretation of dreams Freud, S. 12.5
Peace and War Tostoj. L. 12.5

Notice the order of the last two books.

 

To learn about Java threads and concurrency I have decided to represent a Call Center. The customers making the phone calls to a call center can be represented as threads.
To simulate the real world scenario I will use Semaphores and a Cyclic Barrier to simulate the standby situation.

It´s a simple Producer/Consumer scenario. The producers are the operators working in a call centers.
The critical block is the phone call, simulated with a thread sleep method.

First of all let´s start with semaphores.

Semaphores can control access to more than one resource at a time. They enable a certain amount of threads in a program block.
In the semaphore constructor you can specify the number of threads that can access the resource at the same time.
With the method acquire() the thread tries to get the resource. If the resource is busy, the thread will wait.
The release() method frees the resource from the thread.

CyclicBarrier offers an elegant way to trigger an event if all the operators are busy.

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.Semaphore;

public class Customer extends Thread {

	CyclicBarrier standByMessage;
	private Semaphore operators;

	public Customer(Semaphore operators, CyclicBarrier standByMessage,
			String name) {
		this.standByMessage = standByMessage;
		this.operators = operators;
		this.setName(name);
		this.start();
	}

	@Override
	public void run() {

		// simulate the time required for the phone call (between one and six seconds...
		long duration = ThreadLocalRandom.current().nextLong(1,10);

		try {

			System.out.println(getName()
					+ &amp;quot; is waiting to speak to the operator...&amp;quot;);

			standByMessage.await();
			// if you put acquire first and then await the operators are not
			// free and all the customers are not called

			operators.acquire();

			System.out.println(getName()
					+ &amp;quot; is getting the connection to the operator ...&amp;quot;);
                        //using TimeUnit enumeration to make the code more readable
			Thread.sleep(TimeUnit.SECONDS.toMillis(duration));
			
			System.out.println(getName()
					+ &amp;quot;´s phone call with the operator ending.&amp;quot;);
			operators.release();
			
			System.out.println(&amp;quot;Available operators=&amp;quot;
					+ operators.availablePermits());
			
		} catch (InterruptedException | BrokenBarrierException e) {
			System.err.println(e);
		} 

	}
}

Take a look at the way the duration of the call is generated. I am using the ThreadLocalRandom class, that in a multithreading context it´s helpful to get the job done much faster.
At first I tried it with Math.random() and it was MUCH slower!

The call center has 3 operators:

import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.Semaphore;

public class CallCenter {

	public static void main(String[] args) {
		
		Semaphore operators = new Semaphore(3);
		
		CyclicBarrier standbyMessage = new CyclicBarrier(3, new StandBy());
	
		System.out.println(&amp;quot;The call center is ready to answer phone calls&amp;quot;);
		
        System.out.println(&amp;quot;Available operators initially=&amp;quot; + operators.availablePermits() );
        
		new Customer(operators,standbyMessage,&amp;quot;Laura&amp;quot;);
		new Customer(operators,standbyMessage,&amp;quot;Mario&amp;quot;);
		new Customer(operators,standbyMessage,&amp;quot;Luigi&amp;quot;);
		new Customer(operators,standbyMessage,&amp;quot;Paola&amp;quot;);
		new Customer(operators,standbyMessage,&amp;quot;Alfonso&amp;quot;);
		new Customer(operators,standbyMessage,&amp;quot;Anna&amp;quot;);
		new Customer(operators,standbyMessage,&amp;quot;Giorgio&amp;quot;);
		new Customer(operators,standbyMessage,&amp;quot;Francesca&amp;quot;);
		new Customer(operators,standbyMessage,&amp;quot;Pietro&amp;quot;);
		new Customer(operators,standbyMessage,&amp;quot;Antonio&amp;quot;);
		new Customer(operators,standbyMessage,&amp;quot;Marco&amp;quot;);
		new Customer(operators,standbyMessage,&amp;quot;Giovanna&amp;quot;);
		new Customer(operators,standbyMessage,&amp;quot;Daniele&amp;quot;);
		new Customer(operators,standbyMessage,&amp;quot;Giorgio&amp;quot;);
	}

}

The Cyclic barrier takes a Thread as argument for the constructor:

public class StandBy implements Runnable {

	@Override
	public void run() {
    System.out.println(&amp;quot;All operators are busy at the moment - playing MUSIC ...&amp;quot;);
	}

}

 

The output is something like:

The call center is ready to answer phone calls
Available operators initially=3
Alfonso is waiting to speak to the operator...
Laura is waiting to speak to the operator...
Paola is waiting to speak to the operator...
Luigi is waiting to speak to the operator...
Anna is waiting to speak to the operator...
Mario is waiting to speak to the operator...
Giorgio is waiting to speak to the operator...
All operators are busy at the moment - playing MUSIC ...
Francesca is waiting to speak to the operator...
Pietro is waiting to speak to the operator...
All operators are busy at the moment - playing MUSIC ...
Paola is getting the connection to the operator ...
Giovanna is waiting to speak to the operator...
Luigi is getting the connection to the operator ...
Marco is waiting to speak to the operator...
Antonio is waiting to speak to the operator...
Giorgio is waiting to speak to the operator...
All operators are busy at the moment - playing MUSIC ...
Daniele is waiting to speak to the operator...
Mario is getting the connection to the operator ...
All operators are busy at the moment - playing MUSIC ...
Luigi´s phone call with the operator ending.
Available operators=1
Alfonso is getting the connection to the operator ...
Mario´s phone call with the operator ending.
Available operators=1
Laura is getting the connection to the operator ...
Paola´s phone call with the operator ending.
Available operators=1
Francesca is getting the connection to the operator ...
Alfonso´s phone call with the operator ending.
Available operators=1
Pietro is getting the connection to the operator ...
Laura´s phone call with the operator ending.
Available operators=1
Marco is getting the connection to the operator ...
Francesca´s phone call with the operator ending.
Available operators=1
Anna is getting the connection to the operator ...
Pietro´s phone call with the operator ending.
Available operators=1
Giovanna is getting the connection to the operator ...
Anna´s phone call with the operator ending.
Available operators=1
Daniele is getting the connection to the operator ...
Marco´s phone call with the operator ending.
Available operators=1
Giorgio is getting the connection to the operator ...
Giorgio´s phone call with the operator ending.
Available operators=1
Giovanna´s phone call with the operator ending.
Available operators=2
Daniele´s phone call with the operator ending.
Available operators=3

The thread class provides some methods to define the threads behavior.
Two important methods to consider are:
join(), to make the other instanced threads to wait for it to day. You can provide a timeout as parameter.
sleep();

The sleep() method throws a checked exception called “InterruptedException”,each time the thread receives an interrupt request. You have to handle in the code by wrapping the method in a try-catch block.

The following code will make you understand the join method.
We define a MyThread thread:

public class MyThread implements Runnable {

	public void run() {
		Thread thread= Thread.currentThread();
		System.out.println("Implementing the runnable interface"
				+ " - Thread name: " + thread.getName()
				+ " - priority: " + thread.getPriority()
				+ " - group: " + thread.getThreadGroup().getName());

	}

}

Then we can observe the behaviour running the following main:

		public static void main(String[] args) {

		// extending Thread
		Thread myThread = new Thread(new MyThread());
		Thread myJoiningThread = new Thread(new MyThread());

		myThread.setName("myThread");
		myJoiningThread.setName("myJoiningThread");

		System.out.println("Threads will be started...");

		myJoiningThread.start();

		try {
			// waits for this thread to die
			myJoiningThread.join();
		} catch (InterruptedException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		myThread.start();

	}

Without the try-catch block in which the join method is invoked the threads would be started asynchronously (the order is not predictable) and in the console you might get either:
Threads will be started...
Implementing the runnable interface - Thread name: myThread - priority: 5 - group: main
Implementing the runnable interface - Thread name: myJoiningThread - priority: 5 - group: main

or:

Threads will be started...
Implementing the runnable interface - Thread name: myJoiningThread - priority: 5 - group: main
Implementing the runnable interface - Thread name: myThread - priority: 5 - group: main

But if you include the try-catch block, the myJoiningThread will always be invoked first.

To understand the sleep method you can create a MySleepingThread:

public class MySleepingThread implements Runnable {

	public void run() {
		Thread thread= Thread.currentThread();
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("Implementing the runnable interface"
				+ " - Thread name: " + thread.getName()
				+ " - priority: " + thread.getPriority()
				+ " - group: " + thread.getThreadGroup().getName());

	}

}

Then you can run the following main method:

public static void main(String[] args) {

		// extending Thread
		Thread myThread = new Thread(new MyThread());
		Thread mySleepingThread = new Thread(new MySleepingThread());
		myThread.setName("myThread");
		mySleepingThread.setName("mySleepingThread");

		System.out.println("Threads will be started...");

		mySleepingThread.start();
		myThread.start();

	}

You can see in the console that the sleeping thread will be started after 3 seconds.

The sleep method is static. By invoking “Thread.sleep(3000)” you are delaying the creation of the current thread.

If you use the method in the main method, the sleeping thread will be “main”.

I am learning for the Java OCP 7 and summarizing some relevant infos about Multithreading.
For now I am referring to chapter 13 in the book by G.Ganesh.

You can create threads in 2 ways: extending the Thread class or implementing the Runnable interface
Extending the Thread class is more convenient if you don´t need to extend another class that is not “Thread” (since in java you can only extend one class), because you can use the class methods directly (like “getName()“).
If you implement the Runnable interface (preferred way because of inheritance) you will have to use the static method “currentThread()” of the Thread class to do your operations on the thread (like setting or getting the name).

The two fundamental methods to know are:
run(): like a main method, necessary to enable the execution of a thread.
start(): that creates the thread.

The thread will be terminated when the run method execution is complete. It´s invoked implicitly by the JVM (DON´T invoke it explicitly!).
The main method starts a Thread called “main“. If you create and start your own thread it will have default names like “Thread-0“, “Thread-1“.

If you extend the thread class you need to override the run() method (otherwise it does nothing). If you implement the Runnable interface you will have to implement the run() method (mandatory)

The following code will help you to understand more about these first concepts.

public class MyThread1 extends Thread {

	public void run() {
		System.out.println("Extending the Thread class - Thread name: "
				+ getName() + " - priority: " + getPriority() + " - group: "
				+ getThreadGroup().getName());

	}

}
public class MyThread2 implements Runnable {

	public void run() {
		Thread thread= Thread.currentThread();
		System.out.println("Implementing the runnable interface"
				+ " - Thread name: " + thread.getName()
				+ " - priority: " + thread.getPriority()
				+ " - group: " + thread.getThreadGroup().getName());

	}

}
public class ThreadsDemo {

	public static void main(String[] args) {

		// extending Thread
		Thread myThread1 = new MyThread1();
		// implementing Runnable
		Thread myThread2 = new Thread(new MyThread2());

		System.out.println("Threads defined. Default properties: ");
		//name, priority, group returned by the toString method 
		System.out.println(myThread1);
		System.out.println(myThread2);
		System.out.println("Changing default names...");
		myThread1.setName("Thread_1");
		myThread2.setName("Thread_2");
		System.out.println("Threads will be started...");
		myThread1.start();
		myThread2.start();

	}

}

The output of the main method should be something like:

Threads defined. Default properties:
Thread[Thread-0,5,main]
Thread[Thread-1,5,main]
Threads will be started...
Extending the Thread class - Thread name: Thread-0 - priority: 5 - group: main
Implementing the runnable interface - Thread name: Thread-1 - priority: 5 - group: main

Launching the main program you see that the threads are started asynchronously. Sometimes you see:
Implementing the runnable interface - Thread name: Thread-1
Extending the Thread class - Thread name: Thread-0

Sometimes it´s:
Extending the Thread class - Thread name: Thread-0
Implementing the runnable interface - Thread name: Thread-1

You can quickly proof it in Eclipse launching the program with the shortcut Ctlr+11.

To change this “random” behaviour you can set the priority with the setPriority() method, from 1, the lowest, to 10, the highest. The default is 5. They can be all retrieved by the static members:
– Thread.NORM_PRIORITY ;
– Thread.MAX_PRIORITY ;
– Thread.MIN_PRIORITY .

Threads can be in one of the following states:
– NEW (created)
– RUNNABLE (started)
– TERMINATED
– BLOCKED (waiting to acquire the lock)
– WAITING (waiting for notifications)
– TIMED_WAITING (sleep() invoked and the thread is sleeping or if wait() with timeout)

States are defined with the Thread.State enumeration.
You can get the state with the getState() method.