Search This Blog

Loading...

Monday, June 30, 2014

Java SE 8 new features tour: Functional programming with Lambda Expression.

Understanding lambda expressions....

This article of the “Java SE 8 new features tour” series will deep dive into understanding Lambda expressions. I will show you a few different uses of Lambda Expressions. They all have in common the implementation of functional interfaces. I will explain how the compiler is inferring information from code, such as specific types of variables and what is really happening in the background.

In the previous article “Java SE 8 new features tour: The Big change, in Java Development world”, where I have talked about what we are going to explore during this series. I have started by an introduction to Java SE 8 main features, followed by installation process of JDK8 on both Microsoft windows and Apple Mac OS X platforms, with important advices and notice to take care of.

Finally, we went through a development of a console application powered by Lambda expression to make sure that we have installed Java SE 8 probably.

Source code is hosted on my Github account: Clone from HERE.

What is Lambda expression?

Perhaps the best-known new feature of Java SE 8 is called Project Lambda, an effort to bring Java into the world of functional programming.

In computer science terminology;

A Lambda is an anonymous function. That is, a function without a name.
In Java;
All functions are members of classes, and are referred to as methods. To create a method, you need to define the class of which it's a member.

A lambda expression in Java SE 8 lets you define a class and a single method with very concise syntax implementing an interface that has a single abstract method.

Let's figure out the idea.

Lambda Expressions lets developers simplify and shorten their code. Making it more readable and maintainable. This leads to remove more verbose class declarations.

Let's take a look at a few code snippets.

  1. Implementing an interface:

    Prior to Java SE 8, if you wanted to create a thread, you'd first define a class that implements the runnable interface. This is an interface that has a single abstract method named Run that accepts no arguments. You might define the class in its own code file. A file named by MyRunnable.java. And you might name the class, MyRunnable, as I've done here. And then you'd implement the single abstract method.

    In this example, my implementation outputs a literal string to the console. You would then take that object, and pass it to an instance of the thread class. I'm instantiating my runnable as an object named r1. Passing it to the thread's constructor and calling the thread's start method. My code will now run in its own thread and its own memory space.

  2. Implementing an inner class:

    You could improve on this code a bit, instead of declaring your class in a separate file, you might declare it as single use class, known as an inner class, local to the method in which it's used.

    So now, I'm once again creating an object named r1, but I'm calling the interface's constructor method directly. And once again, implementing it's single abstract method. Then I'm passing the object to the thread's constructor.

  3. Implementing an anonymous class:

    And you can make it even more concise, by declaring the class as an anonymous class, so named because it's never given a name. I'm instantiating the runnable interface and immediately passing it to the thread constructor. I'm still implementing the run method and I'm still calling the thread's start method.

  4. Using lambda expression:

    In Java SE 8 you can re-factor this code to significantly reduce it and make it a lot more readable. The lambda version might look like this.

    I'm declaring an object with a type of runnable but now I'm using a single line of code to declare the single abstract method implementation and then once again I'm passing the object to the Thread's constructor. You are still implementing the runnable interface and calling it's run method but you're doing it with a lot less code. In addition, it could be improved as the following:

    Here is an important quote from an early specs document about Project Lambda.
    Lambda expressions can only appear in places where they will be assigned to a variable whose type is a functional interface.

    Quote By Brian Goetz
    Let's break this down to understand what's happening.

What are the functional interfaces?

A functional interface is an interface that has only a single custom abstract method. That is, one that is not inherited from the object class. Java has many of these interfaces such as Runnable, Comparable, Callable, TimerTask and many others.

Prior to Java 8, they were known as Single Abstract Method or SAM interfaces. In Java 8 we now call them functional interfaces.

Lambda Expression syntax:


This lambda expression is returning an implementation of the runnable interface; it has two parts separated by a new bit of syntax called the arrow token or the Lambda operator. The first part of the lambda expression, before the arrow token, is the signature of the method you're implementing.

In this example, it's a no arguments method so it's represented just by parentheses. But if I'm implementing a method that accepts arguments, I would simply give the arguments names. I don't have to declare their types.

Because the interface has only a single abstract method, the data types are already known. And one of the goals of a lambda expression is to eliminate unnecessary syntax. The second part of the expression, after the arrow token, is the implementation of the single method's body.

If it's just a single line of code, as with this example, you don't need anything else. To implement a method body with multiple statements, wrap them in braces.

Lambda Goals:

Lambda Expressions can reduce the amount of code you need to write and the number of custom classes you have to create and maintain.

If you're implementing an interface for one-time use, it doesn't always make sense to create yet another code file or yet another named class. A Lambda Expression can define an anonymous implementation for one time use and significantly streamline your code.

Defining and instantiating a functional interface

To get started learning about Lambda expressions, I'll create a brand new functional interface. An interface with a single abstract method, and then I'll implement that interface with the Lambda expression.

You can use my source code project "JavaSE8-Features" hosted on github to navigate the project code.

  1. Method without any argument, Lambda implementation

    In my source code, I'll actually put the interface into its own sub-package ending with lambda.interfaces. And I'll name the interface, HelloInterface.

    In order to implement an interface with a lambda expression, it must have a single abstract method. I will declare a public method that returns void, and I'll name it doGreeting. It won't accept any arguments.

    That is all you need to do to make an interface that's usable with Lambda expressions. If you want, you can use a new annotation, that's added to Java SE 8, named Functional Interface.

    Now I am ready to create a new class UseHelloInterface under lambda.impl package, which will instantiate my functional interface (HelloInterface) as the following:

    Run the file and check the result, it should run and output the following.

    So that's what the code can look like when you're working with a single abstract method that doesn't accept any arguments. Let's take a look at what it looks like with arguments.

  2. Method with any argument, Lambda implementation

    Under lambda.interfaces. I'll create a new interface and name it CalculatorInterface. Then I will declare a public method that returns void, and I will name it doCalculate, which will receive two integer arguments value1 and value2.


    Now I am ready to create a new class Use CalculatorInterface under lambda.impl package, which will instantiate my functional interface (CalculatorInterface) as the following:

    Note the doCalculate() arguments, they were named value1 and value2 in the interface, but you can name them anything here. I'll name them v1 and v2. I don't need to put in int before the argument names; that information is already known, because the compiler can infer this information from the functional interface method signature.

    Run the file and check the result, it should run and output the following.

    Always bear in mind the following rule:
    Again, you have to follow that rule that the interface can only have one abstract method. Then that interface and its single abstract method can be implemented with a lambda expression.
  3. Using built-in functional interfaces with lambdas

    I've previously described how to use a lambda expression to implement an interface that you've created yourself.

    Now, I'll show lambda expressions with built in interfaces. Interfaces that are a part of the Java runtime. I'll use two examples. I'm working in a package called lambda.builtin, that's a part of the exercise files. And I'll start with this class. UseThreading. In this class, I'm implementing the Runnable interface. This interface's a part of the multithreaded architecture of Java.

    My focus here is on how you code, not in how it operates. I'm going to show how to use lambda expressions to replace these inner classes. I'll comment out the code that's declaring the two objects. Then I'll re-declare them and do the implementation with lambdas. So let's start.

    Let's look at another example. I will use a Comparator. The Comparator is another functional interface in Java, which has a single abstract method. This method is the compare method.

    Open the file UseComparator class, and check the commented bit of code, which is the actual code before refactoring it to lambda expression.

    As before, it doesn't provide you any performance benefit. The underlying functionality is exactly the same. Whether you declare your own classes, use inner or anonymous inner classes, or lambda expressions, is completely up to you.

In the next article of this series, we will explore and code how to traverse the collections using lambda expression, filtering collections with Predicate interfaces, Traversing collections with method references, implementing default methods in interfaces, and finally implementing static methods in interfaces.


Resources:
  1. The Java Tutorials, Lambda Expressions
  2. JSR 310: Date and Time API
  3. JSR 337: Java SE 8 Release Contents
  4. OpenJDK website
  5. Java Platform, Standard Edition 8, API Specification


Monday, June 16, 2014

Java SE 8 new features tour: The Big change, in Java Development world.

I am proudly one of the adopt-OpenJDK members like others professional team members, but joined from last 8 months, during this period, we went through all the stages of Java SE 8 development, compilations, building, coding, and many discussions … etc., until we bring it to the life. And it is released on March 18th 2014 and it is now available for you.

I am happy to announce about this series “Java SE 8 new features tour”, which I am going to write it, supported with examples to streamline the Java SE 8knowledge gaining of most of new features, and APIs, development experience that will leverage your knowledge, enhancing the way you code, and increase your productivity as well. I hope you enjoy it ;) as I am doing when writing it.

We will take a tour of the new major and important features in Java SE 8 (projects and APIs), the platform designed to support faster, and easier Java development. We will learn about Project Lambda, a new syntax to support lambda expressions in Java code.

Checking the new Stream API for processing collections and managing parallel processing.

Calculating timespans with The DateTime API for representing, managing and calculating date and time values.

In addition to Nashorn, a new engine to better support the use of JavaScript code with the Java Virtual Machine.

Finally, I will also cover some lesser-known features such as new methods for joining strings into lists and other more features that will help you in daily tasks.

For more about Java SE 8 features and tutorials, I advise you to consult the Java Tutorial the official site and Java SE 8 java API documentation too.

The topics we are going to cover during this series will include:

  1. Installing Java SE 8, notes and advices.
  2. Introducing Java SE 8 main features, the big change.
  3. Working with lambda expressions and method references.
  4. Traversing collections with streams.
  5. Calculating timespans with the new DateTime API
  6. Running JavaScript from Java with Nashorn.
  7. Miscellaneous new features and API changes.
  1. Installing Java SE 8, notes and advices.

    1. Installing Java SE 8 on Windows

      In order to run Java SE 8 on Microsoft Windows, first check which version you have. Java SE 8 is supported on Windows 8, 7, Vista, and XP. Specifically, you'll need these versions. For Windows 8 or 8.1, you'll need the desktop version of Windows. Windows RT is not supported. You can run Java SE 8 on any version of Windows 7, and on the most recent versions of Windows Vista and Windows XP. On Server based versions of Windows, you can run 2008 and the 64-bit version of 2012.

      If you want to work on Java Applets you'll need a 64-bit browser, these can include Internet Explorer 7.0 and above, Firefox 3.6 and above, and Google Chrome which is supported on Windows, but not on Mac.

      You can download the Java Developer Kit for Java SE 8 from

      1. URL java.oracle.com That will take you to the current Java home page.
      2. Click Java SE.
      3. Under Top Downloads. Then click the Download link for Java 8.

    2. Installing Java SE 8 on Mac

      In order to work with Java SE 8 on Mac OS X, you must have an Intel-based Mac running Mac OS X 10.7.3, that's Lion, or later. If you have older versions of Mac, you won't be able to program or run Java 8 applications. In order to install Java SE 8 you'll need administrative privileges on your Mac. And in order to run Java applets within a browser you'll need to use a 64 bit browser, such as Safari or Firefox.

      Google Chrome is a 32 bit browser, and won't work for this purpose.

      As described earlier on installing Java SE on windows, the same website has the MAC OS .dmg version to download and install. Actually contains all operating systems versions. However, our focus here would be on windows and MAC.

    Now you're ready to start programming with Java SE 8 on both Windows and MAC OS X platforms.

    After we have installed Java SE 8 probably, let's dive into the first point and have a look at Java SE 8 main features in a nutshell, to begin our coding tour on our favorite IDE.

  2. Introducing Java SE 8 main features, the big change.

    An overview of the JSR 337: Java SE 8 Release Contents
    Java SE 8 is a major release for the Java programming language and the Java virtual machine. It includes many changes. Some have gotten more coverage than others like Lambda expression, but I'm going to talk about both the major changes and a few of the minor ones.

    JSR 335: Lambda Expressions
    Probably the most attention has gone to Project Lambda, a set of new syntactical capabilities that let Java developers work as functional programmers. This includes lambda expressions, method references and a few other capabilities.

    JSR 310: Date and Time API
    There is a new API for managing dates and times. Replacing the older classes. Those older classes are still in the Java Runtime, but as you build new applications, you might want to move to this new set of capabilities, which let you streamline your code and be a little more intuitive in how you program. There are new classes to manage local dates and times and time zones and for calculating differences between different times.

    The Stream API
    Adds new tools for managing collections including lists, maps, sets, and so on.

    A stream allows you to deal with each item in a collection without having to write explicit looping code. It also lets you break your processing into multiple CPUs. So, for large, complex data sets you can see significant performance improvement.

    Project Nashorn
    The Nashorn JavaScript engine is new to Java SE 8 too. This is a completely new JavaScript engine written from scratch that lets you code in JavaScript but lets you integrate Java classes and objects.

    Nashorn's goal is to implement a lightweight high-performance JavaScript runtime in Java with a native JVM. This Project intends to enable Java developers embedding of JavaScript in Java applications via JSR-223 and to develop freestanding JavaScript applications using the jrunscript command-line tool.

    In the article on Nashorn, I'll describe how to run Nashorn code from the command line. But also how to write JavaScript in separate files, and then execute those files from your Java code.

    Concurrency API enhancements.
    There are also enhancements to the concurrency framework, which lets you manage and accumulate values in multiple threads. There are lots of smaller changes as well.

    String, numbers has new tools
    There are new tools for creating delimited lists in the string class and other new classes. There are tools for aggregating numbers including integers, lungs, doubles, and so on.

    Miscellaneous New Features
    There are also tools for doing a better job of detecting null situations, and I'll describe all of these during the series.

    And I'll describe how to work with files, using new convenience methods.

So, when is Java SE 8 available?
The answer is, now. It was released on March 18, 2014. For developers who use Java to build client site applications, the JavaFX rich internet application framework supports Java 8 now. And most of the Java enterprise edition vendors support Java 8 too. Whether you move to Java SE 8 right away depends on the kinds of project you're working on.

For many server and client site applications, it's available immediately.

Not for Android yet.
Android developers beware; Java SE 8 syntax and APIs are not supported in Android at this point.

It's only very recently that Android moved to some of the newest Java 7 syntax. And so, it might take some time before Android supports this newest syntax or the newest APIs. But for all other Java developers, it's worth taking a look at these new capabilities.

What about IDEs?
Java SE 8 is supported by all of the major Java development environments. Including Oracle's Netbeans, Intellij Idea, and Eclipse. For this series I'll be doing all of my demos in Netbeans, using Netbeans, version 8, which available to download from https://netbeans.org/downloads/.

However, before we start diving into this series, let’s check first that we have installed Java SE 8 probably, to start a new project under Netbeans, which will hold all of our code that we are going write during the series. Then develop a lambda code to test our project if it is working probably or not with Java SE 8 .

Alternatively you can download the series source codebase from my Github account, open it with Netbeans and follow what I am showing next, and in upcoming series code.

Project on Github: https://github.com/mohamed-taman/JavaSE8-Features

Hello world application on Java SE 8 with Lambda expression.
Steps (not required if you navigating my code):

  1. Open NetBeans 8 --> from file --> New project --> from left, and choose Maven --> from right, and choose Java Application --> Click next.

  2. Follow the following screen shoot variables definition, or change to your favorite names and values --> then click finish.

  3. If everything wents okay you should have the following structure, on project navigator:

  4. Click on Project “Java8Features” --> Click File, from upper menu --> then, Project properties.

  5. Under Category --> From left choose Source, then check that “Source/ Binary format” is 1.8. --> From left open Build, and choose Compiler, then check that “Java Platform” is pointing to your current JDK 8 installation --> Click Ok.

  6. If JDK 8 not presents then go to tools --> chooses, Java Platforms --> Add Platform --> Then chooses Java Standard Edition --> then point to your installed JDK 8.

  7. Now our project configured to work with Java 8,Hurya let's do it, add some Lambda code.

  8. On Package “eg.com.tm.java8.features”, right click, and select New from menu --> Java Interface --> Name it Printable, under overview package “eg.com.tm.java8.features.overview” --> click Finish.

  9. Implement Printable interface as the following:

  10. On the same package add the following class named “Print”, with main method (to run as application) as the following:

  11. Right click on Print class and choose Run. If every thing is okay, then you should see the following output.

  12. Congratulation your Java SE 8 project works fine, let’s explain what we have written.

    Most of this code would work on Java 7, but there's an annotation here that was added in Java SE 8, FunctionalInterface. If your Netbeans environment isn't correctly configured for Java 8, this annotation will cause an error because it won't be recognized as valid Java code. I don't see an error, so that's a good sign that Eclipse is working as I hoped.

    Next I'll open this class definition named Print.java. This is a class with a main method so I can run it as a console application and it has a critical line of new Java 8 syntax.

    It's creating an instance of that functional interface I just showed you using a lambda expression, a style of syntax that didn't exist in Java prior to Java 8. I'll explain what this syntax is doing very early in the next article.

    But all you need to know right now is that if this code isn't causing any errors, then once again, Netbeans is recognizing it as valid Java syntax. I'm creating an instance of that interface and then calling that interface's print method. And so, I'll run the code.

    I'll click the Run button on my tool bar and in my console I see a successful result. I've created an object, which is an instance of that interface using a lambda expression. And I've called its method and it's outputting a string to the console. So, if this is all working, you're in great shape. You're ready to get started programming with Java SE 8 in Netbeans. If you had any problems along the way, go back to earlier steps and walk through the steps. One step at a time.

Resources:
  1. The Java Tutorials, Lambda Expressions
  2. JSR 310: Date and Time API
  3. JSR 337: Java SE 8 Release Contents
  4. OpenJDK website
  5. Java Platform, Standard Edition 8, API Specification

Monday, June 9, 2014

Speaking activities during year 2014

Here are my speaking activities, during this year of 2014, Thanks for inviting organizations, JUGs, and international conferences.

I hope to see you all in my sessions, workshop, answers your questions and added value to you.


List of places, dates, and sessions titles:

Deliver and present the following talks in many conferences world wide, as part of sharing my experiences and evangelist the technologies especially JavaEE, JSRs, adopt-a-JSR, OpenJDK, Mobile development and others.
  1. Esprit JUG 2014 - Tunis, Tunisia. On the 7th & 8th of May

    Delivers the following sessions:
    1. What is new in Java SE, EE, ME, Embedded world, & new Strategy?
    2. Drive yourself, community with JCP & adopts to professionalism.
    3. Developing Native & Hybrid Android mobile Apps, with Netbeans 8.
    4. Yeah, TRUE real time web applications, no more hacks (a hack session).
    5. Hybrid Mobile development without IDE from CLI (Workshop).

  2. JCP executive committee F2F meeting 2014 - London, UK. On the 13th & 14th of May

    Delivers the following session:
    1. United Nations UNHCR/WFP case study (JavaEE, JavaCard, JavaSE success story).

  3. JEEConf 2014 - Kiev, Ukraine. On the 23th & 24th of May

    Talks: http://jeeconf.com/program/

    Delivers the following sessions:
    1. Yeah, TRUE real time web applications, no more hacks (a hack session).
    2. Developing Native & Hybrid Android mobile Apps, with Netbeans 8.

  4. 33rd Degree 2014 - Krakow, Poland. On the 9th to 11th of June.

    Talks: http://2014.33degree.org/speaker/show/41

    Delivers the following sessions:
    1. Architecting Hybrid mobile apps with PhoneGap.
    2. JavaSE NIO.2 API features, a walkthrough (The essential Stuff).

  5. JavaOne 2014 - San Francisco, California, USA. On the 28 Sep to 2 of October 2014.

    Delivers the following sessions:
    1. United Nations UNHCR/WFP case study (JavaEE, JavaCard, JavaSE success story).

  6. JMaghreb 3.0 2014 - Casablanca, Morocco. On the 7th & 8th of November

    Delivers the following sessions:
    1. Architecting Hybrid mobile apps with PhoneGap.
    2. Top 10 Key Performance Techniques for Hybrid mobile Apps.

Sunday, June 8, 2014

JEEConf 2014, Kiev, Ukraine trip report


Very busy May.

This May 2014 was a very busy month for me, I was so busy at work but thankfully I have finished all my heavy-duty tasks and left other managed tasks to my team to finish it till my back from my international trips.

My Trips

In last May 2014, first I went to Tunis, Tunisia, speaking at Esprit JUG Day 2014 on 7th and 8th of May, delivering the following 4 sessions:
1- What is new in Java SE, EE, ME, Embedded world, & new Strategy?
2- Drive yourself, community with JCP & adopts to professionalism.
3- Developing Native & Hybrid Android mobile Apps, with Netbeans 7.4+.
4- Yeah, TRUE real time web applications, no more hacks (a hack session).
5- Hybrid Mobile development without IDE from CLI (Workshop) (Cordova framework).
My JCP EC F2F meeting

After that I have traveled to London, United Kingdom, to attend my JCP executive committee F2F meeting 2014 on the 13th & 14th of May as I am a JCP EC member, and delivered the following session:

1. United Nations UNHCR/WFP case study (JavaEE, JavaCard, JavaSE success story).

Trip to Ukraine

On 23th and 24th I had the opportunity for the second time, to attend and speak at JEEConf 2014 in Kiev, Ukraine. This is my one of the favourite conferences I like to attends and share my experience there as well. As I was there in 2013. Among speakers from Ukraine there were a lot from other countries like UK, USA, Switzerland, Germany, Egypt (me), Greece, Sweden, Poland, Netherlands and Russia etc.

Problems

All my friends, colleagues, and work managers advised me to not travel to Ukraine, because of the political situation it has, my only words to reply are:
We already had this experience in Egypt since three years ago, so there is nothing to worry about ☺.
I love Ukraine, especially Kiev, because I have many friends there from attendees, speakers (Victor Polischuk), colleagues from Ukraine JUG Andrii Rodionov as I am EGJUG lead and MoroccoJUG member so we attends many JUG events together, and EBAM employees Olena Syrota.

Therefore I felt that I was in my country and not as a foreign guy.

Hanging out

After my arrival by a day before the event, I have decided to hangout alone to see the city and take some pictures. Then at the hotel reception I have found my friends I have met last year from Oracle Russia Speakers (Alexey Fyodorov, Alexander Belokrylov, and Sergey Kuksenko) and others (Gleb Smirnov from Deutsche Bank, Russia) and finally Ivan Krylov from Azul Systems Russia, then we hanged out together to have a dinner a Ukrainian local restaurant.



Also we went to Khreschatyk Midan (Square), where the revolution began, and here are some pictures







My talks

I have attended many English sessions, and delivered the following sessions as well:

1- Yeah, TRUE real time web applications, no more hacks (a hack session).



2- Developing Native & Hybrid Android mobile Apps, with Netbeans 8.



The first talk (Developing Native & Hybrid Android mobile Apps, with Netbeans 8.) went okay and I have found a lot of interesting questions, and response from people.

But for the second talk (Yeah, TRUE real time web applications, no more hacks (a hack session)) there were many attendees about 100+, and I couldn't take one photo to tweet it, so I have decided to take a panorama one as the following.




It was very interesting to them, and I heard many times that the talk was the best of the day. It was a master session and there were many very good and interesting questions (around 40+ questions) to answer (Thanks God, you helped me to answer all the question and satisfies the attendees).

Therefore at the end of the session, I got many Thanks cards about 41+ cards. It was a great feeling the all attendees had the experience of the talk, mastered the topic, and the hack code (application) get their interest. download it from here, download the zip file from File --> Download, it is netbeans based project.

I think both talks received a warm welcome from the audience, but I cannot be the judge of that, of course. I have just written down what I have heard, got (Thanks cards), and seen from their faces ☺ actions.


Event and Organizers

Thanks for event organizers you did a tremendous work. The hotel was very nice providing excellent services, breakfast, speedy Internet, and complementary shuttle service to any location you would like (I have chosen to drive me to the airport).

Its location was very near from the city centre, and most popular locations, restaurants, and metro stations. The event could be reached by just 4 stations about 13 min from the hotel.

Here are some pictures from my room and hotel:





And I had this great and tasty berry pie in my breakfast at my last day for me at Ukraine


Really the event was very well organized and managed, although the country passes by critical political situation.

I need to mention that there were even lunch for attendees as well as speakers, and many interesting activities. I am so happy to be part of the event successful story.

I had the opportunity to hang out with many speakers, friends, and EPAM employees, and I have enjoyed also the guided tour to many interesting places in Kiev for around three hours with the following speakers Peter Ledbrook, Nicolas Fränkel, Evgeny Borisov and his wife.




Talk to publish

After my return I got message from EPAM Educational head manager on my LinkedIn profile, they asked about my Websocket talk link, to mention it in EPAM magazine in article about JEEConf to be one of the most interesting talk in JEEConf 2014.

My hope

Thanks for this year invitation and looking forward to be part of JEEConf 2015 ☺.


Wednesday, May 14, 2014

Interview with me in Tunisian Hannibal TV about Esprit JUG DAY 2014


This is an interview with me in Tunisian Hannibal TV about Esprit JUG DAY 2014, my participation, what I liked and what I would like to see in future EsprIT Jug days.

It is my pleasure and a great value to me that you proud of me, I am proud to be part of my Tunisian people and I consider it my country, changing our experience, I liked your school and the way you teach the great students you have.