Tuesday, January 10, 2017

New Course - WEB303 2-Day Linux System Administration


With the recent push to open source software development, the importance of Linux can no longer be ignored. Linux is everywhere – on your phone, IoT devices, the entertainment systems on your flight, fridge, TVs, routers, etc. For developers, Linux is gaining a lot of tractions on the server side, and a large percentage of Amazon Web Services (AWS) EC2 instances and Azure Virtual Machines are running Linux.

In this 2-day course, participants will learn how to install a specific distribution of Linux onto a brand new laptop and learn how to administer the system. 
WEB303 - Linux System Administration
Course Fee
S$1697 (nett; no GST)
If your company is sponsoring you for the training, your company can enjoy 400% tax deductions/ allowances and/or 40% cash payout for investment in innovation and productivity improvements under the Productivity and Innovation Credit (PIC) scheme. For more details, check out the Productivity and Innovation Credit page. 
Schedules
Start DateEnd DateCourse Outline and Application FormCategory
Wed Mar 29 2017Thu Mar 30 2017

Learn how to install Linux on a brand new laptop and administer it; Laptop provided 
Venue
Hotel Grand Pacific Singapore
101 Victoria Street
Singapore 188018

If your company requires in-house training, you can contact us to customize the topics to meet your training requirements. We train worldwide! We have conducted customized classes in the United States, Canada, Norway, Denmark, Japan, China, Hong Kong, Taiwan, and Thailand. 

Tuesday, January 03, 2017

Course Roadmap for 2017




 


 

  



 


IOT101 - Programming Internet of Things (IoT) using Raspberry Pi

In this course, explore the many IoT projects you can build using the Raspberry Pi and the Unix-based Raspbian OS. You will learn:

  • How to run a Web server on the Raspberry Pi
  • How to install and run PHP and MySQL applications on the Raspberry Pi
  • How to run Python scripts on the Raspberry Pi
  • Using Python to connect to the various sensors (such as motion, ultrasound, NFC, and more)
  • Connect the Raspberry Pi to WiFi, Bluetooth LE, and Ethernet
  • Implement Amazon's Alexa Voice Service using the Raspberry Pi
This course comes with latest Raspberry Pi 3 as well as numerous sensors and accessories.  

IOT104 - Programming Internet of Things (IoT) using Arduino

In this course, you will learn how to program Internet of Things (IoT) applications using the Arduino platform. In this fast-paced course, you will learn the building blocks of:

  • Connecting the Arduino to sensors and display devices
  • Connecting the Arduino to the WiFi network
  • Programming wireless communications using infrared, ZigBee, and Bluetooth Low Energy
  • Connect to RESTful services using secure HTTP

Instead of following the hands-on exercises directly, participants will learn how to build real-life projects based on the various lab exercises.

This course comes with numerous Arduino boards as well as more than 30 sensors and accessories. 

Thursday, December 15, 2016

IOT106 - Programming Internet of Things (IoT) using Android Things

For those of you who live life on the edge, I just wanted to tell you that I have planned a new course on the latest Android Things. This is a 2-day course similar in structure to the IOT101 (Raspberry Pi) and IOT104 (Arduino).


Android Things is the latest offering from Google that attempts to draw Android developers to the burgeoning IoT market. Instead of using Raspbian or Windows IoT Core to power your Raspberry Pi, you now use Android. The key benefits of using Android Things is that it uses the Android programming framework, and thus it should be easy for Android developers to migrate to this platform.

As usual, you can expect a boat load of sensors to come with the course. For this course, we are using the Raspberry Pi.

We are currently outlining the course structure, so be sure to check this page often. In the meantime, here is the upcoming schedule:
IOT106 - Programming Internet of Things (IoT) using Android Things
Course Fee
S$1897 (nett; no GST)
If your company is sponsoring you for the training, your company can enjoy 400% tax deductions/ allowances and/or 40% cash payout for investment in innovation and productivity improvements under the Productivity and Innovation Credit (PIC) scheme. For more details, check out the Productivity and Innovation Credit page. 
Schedules
Start DateEnd DateCourse Outline and Application FormCategory
Mon Apr 03 2017Tue Apr 04 2017
Venue
Hotel Grand Pacific Singapore
101 Victoria Street
Singapore 188018

If your company requires in-house training, you can contact us to customize the topics to meet your training requirements. We train worldwide! We have conducted customized classes in the United States, Canada, Norway, Denmark, Japan, China, Hong Kong, Taiwan, and Thailand. 

Thursday, December 01, 2016

IOT202 - Introduction to Data Science using Jupyter Notebook (Anaconda)

"Without data you're just another person with an opinion"
W. Edwards Deming, Data Scientist

Learn how to visualise and analyse your data using Python and its associated libraries. In this course, you will learn how to use Jupyter Notebook from the Anaconda package, and learn how to:

  • Visualise data using matplotlib
  • Clean data sets using NumPy
  • Perform Data Analytics using Pandas

IOT202 - Introduction to Data Science using Python
Course Fee
S$1297 (nett; no GST)
If your company is sponsoring you for the training, your company can enjoy 400% tax deductions/ allowances and/or 40% cash payout for investment in innovation and productivity improvements under the Productivity and Innovation Credit (PIC) scheme. For more details, check out the Productivity and Innovation Credit page. 
Schedules
Start DateEnd DateCourse Outline and Application FormCategory
Mon Dec 05 2016 CONFIRMEDTue Dec 06 2016
Thu Feb 16 2017Fri Feb 17 2017
Thu Mar 23 2017Fri Mar 24 2017
Venue
Hotel Grand Pacific Singapore
101 Victoria Street
Singapore 188018

If your company requires in-house training, you can contact us to customize the topics to meet your training requirements. We train worldwide! We have conducted customized classes in the United States, Canada, Norway, Denmark, Japan, China, Hong Kong, Taiwan, and Thailand.

Sunday, November 27, 2016

Wednesday, November 23, 2016

Swift Tip: Understanding and using Closures

In Swift, closures are self-contained blocks of code that can be passed around and used in your code. Think of closures as anonymous functions in JavaScript, lambda expressions in C#, and blocks in C and Objective-C. Here is an example of closure in action in Swift:

        let alertController = UIAlertController(
            title: "Hello!",
            message: "Hello, World!",
            preferredStyle: UIAlertControllerStyle.alert)
        
        let okAction = UIAlertAction(
            title: "OK",
            style: UIAlertActionStyle.default) {
                (action) -> Void in
                print("Tapped on OK")
        }
        
        alertController.addAction(okAction)
        self.present(alertController,

                     animated: true, completion: nil)

In the above code snippet, when the OK button in the alert is tapped, you handle the action using a closure:

        {
                (action) -> Void in
                print("Tapped on OK")
        }

This closure takes in a single parameter - action, and does not return any value (Void). The body of the closure is a single statement that prints a string to the Output window. You can of course have more than one statement in the body of the closure. This works just like a usual function without the func keyword and the function name.

Besides this example, what are the real advantages of closures? Let's consider the classic example of the bubble sort:

    func bubbleSort(items:inout [Int])  {
        for j in 0 ..< items.count-1 {
            var swapped = false
            for i in 0 ..< items.count-1-j {
                if (items[i] > items[i+1]) {
                    let temp=items[i+1]
                    items[i+1]=items[i]
                    items[i]=temp
                    swapped=true
                }
            }
            if !swapped {
                break
            }
        }

    }

The above code snippet contains a function that takes in an array and then performs a bubble sort on it:

        var numbers = [5,2,8,7,9,4,3,1]
        bubbleSort(items: &numbers)

        print (numbers) // [1, 2, 3, 4, 5, 7, 8, 9]

There are two potential disadvantages with this implementation:

  • What happens if you want to sort non-integer values, such as string, doubles, etc? You need to rewrite the code to sort different data types. To solve this, you can use generics
  • What happens if you want to sort the values in descending order? You need to rewrite the code to perform the appropriate logic for swapping. And what happens if you have different criteria to determine the sort order for different data types? 

A better approach would be to rewrite the bubbleSort() function using a closure so that the caller of this method can provide its own implementation for the sort order. The rewritten function would look like this:

    func bubbleSort(items:inout [T],
        compareFunction:(T, T) -> Bool)  {
        for j in 0 ..< items.count-1 {
            var swapped = false
            for i in 0 ..< items.count-1-j {
                //---if the two numbers need to be swapped---
                if compareFunction(items[i],items[i+1]) {
                    let temp=items[i+1]
                    items[i+1]=items[i]
                    items[i]=temp
                    swapped=true
                }
            }
            if !swapped {
                break
            }
        }

    }

Observe that:

  • The function now has a second parameter (compareFunction:) of function type (T,T) -> Bool where T is a generic type. Caller of this function are expected to pass in a closure with two input parameters and return a Bool result.
  • Within the bubbleSort() function, it will call the closure passed into it and use its result to determine if a variable swap is needed.
To use the rewritten bubbleSort()function, you can call it like this:

        var numbers = [5,2,8,7,9,4,3,1]
        bubbleSort(items: &numbers,
                   compareFunction: {
                (num1:Int, num2:Int) -> Bool in
                    //--if num1 > num2, need to swap--
                    return num1 > num2
        })

        print (numbers) // [1, 2, 3, 4, 5, 7, 8, 9]

Note the closure highlighted in bold. In essence, you are passing in a function with two parameters. This function will return a true if the first number is greater than the second number. Essentially, you are sorting the numbers in ascending order. If you want to sort the numbers in descending order, simply change the comparison operator to <:

        var numbers = [5,2,8,7,9,4,3,1]
        bubbleSort(items: &numbers,
                   compareFunction: {
                (num1:Int, num2:Int) -> Bool in
                    //--if num1 > num2, need to swap--
                    return num1 < num2
        })

        print (numbers) // [9, 8, 7, 5, 4, 3, 2, 1]

The real advantage of using closure if when you need to sort strings in your own custom order. For example, you have an array of strings like this:

        var names = ["xxx","yy","z"]

To sort the strings based on string length, you can specify your closure like this:

        bubbleSort(items: &names,
                   compareFunction: {
                    (name1:String, name2:String) -> Bool in
                    //--if length of name1 > length of name2, need to swap--
                    return name1.characters.count > name2.characters.count
        })

        print (names) // ["z", "yy", "xxx"]

For purist, the above code snippet can be rewritten like this:
        
        bubbleSort(items: &names) {
            (name1, name2) -> Bool in
            name1.characters.count > name2.characters.count
        }

        print (names)

How cool is that. Hopefully, this posting can help you better understand and appreciate closures!

Tuesday, November 22, 2016

C# Tip - Using the async and await keywords for asynchronous programming

In C#, you can use the async and await keywords for asynchronous programming (such as fetching data from a network, or saving/loading data from files). To understand how to use these 2 keywords, consider the following example:

    async Task DownloadFromWebAsync()
    {
        HttpClient client = new HttpClient();
        Task getStringAsyncTask = 
            client.GetStringAsync("http://www.google.com");
        string content = await getStringAsyncTask;         

        // control is returned to the caller 
        // of the DownloadFromWebAsync() method 
        // and resumed after getStringAsyncTask 
        // is completed    

        return content;
    } 

In the above DownloadFromWebAsync() method , it is first of all prefixed with the async keyword, which indicates that this method contains an asynchronous operation. This method returns a Task result. This represents an asynchronous operation that returns a result of type string:

    async Task DownloadFromWebAsync()

Within this method, we use the HttpClient class to help us connect to the Web:

        HttpClient client = new HttpClient();

In particular, the GetStringAsync() method connects to the specified URL and returns the content of the URL. It returns an object of type Task:

        Task getStringAsyncTask = 
            client.GetStringAsync("http://www.google.com");

Because the GetStringAsync() method could potentially take a long time, and so you need to run it asynchronously. This is achieved by using the await keyword:

        string content = await getStringAsyncTask;

At this point, the GetStringAsync() method will proceed to download the specified URL and control will return to the caller of the DownloadFromWebAsync() method. All statements after this line will only be executed after the GetStringAsync() method returns.

When the GetStringAsync() method returns, the result is passed to content, and the DownloadFromWebAsync() method will now return a string.

To call the DownloadFromWebAsync() method, you would need to use the await keyword. Also, the method from which you are calling the DownloadFromWebAsync() method must also be prefixed with the async keyword, like this:

    private async void button1_Click(object sender, EventArgs e)
    {
        string content = await DownloadFromWebAsync();
    }

Note that the 2 statements:

    Task getStringAsyncTask = 
        client.GetStringAsync("http://www.google.com");
    string content = await getStringAsyncTask;         

Can also be rewritten as:

    string content = await      
        client.GetStringAsync("http://www.google.com");

I hope this simple example makes it easier for you to understand how to use the async and await keywords.

Monday, November 21, 2016

Course Updates

Courses Confirmed for December 2016

Here is the list of courses that are confirmed for December 2016:


  • IOT202 - Introduction to Data Science using Python

  • AND101 - Fundamentals of Android Programming using Android Studio

  • IOS101 - Fundamentals of iPhone Programming using Swift



  • IOT101 - Programming Internet of Things (IoT) using Raspberry Pi


  • IOT104 - Programming Internet of Things (IoT) using Arduino

  • WEB202 - Implementing iOS and Android Push Notifications


Changes to Course Duration and Content

MOB104 - Writing Cross Platform iOS and Android Apps using Xamarin.Forms and C#


MOB104 is now a 2-day course. Due to the focus of Microsoft on the cross-platform developers' tools, Xamarin.Forms is now more important than ever. In this course, you will learn how to develop cross-platform mobile apps for Android and iOS, as well as learn some advanced techniques like:

  • Cross-platform User Interface
  • Dependency Injection
  • MVVM Architecture

IOS302 - Advanced iOS - Apple Watch Programming


With the latest watchOS from Apple, the Apple Watch is now a much more compelling wearable device. Apps now launch quicker, and battery life is much improved on the new Apple Watch series 2. We have since revised this course to 2 days, so that we have time to cover all the cool new features in watchOS 3. (Course comes with an Apple Watch Series 2 watch)

IOT201 - Python Programming


IOT201 is now titled "Python Programming". Instead of focusing just on the syntax of Python, we now cover doing interesting things with Python, such as:

  • Developing RESTful service using Flask
  • Securing your RESTful service using a SSL and Basic Authentication
  • Sockets programming using Python
  • Push notifications using Python
  • Writing your own modules

As such, the IOT201 is now a 2-day course.