Category Archives: Java / Android

Long time no write – Cloud9IDE

It’s been quite a while I didn’t write anything, mostly due to the fact I simply didn’t take the time to do so. I will try and get back into the habit of making this at least a weekly thing, but we’ll see if that’s realistic 🙂

Cloud9IDE

cloud9ide logo

 

For the past couple of weeks, I have been trying out Cloud9 IDE over the weekends and am really happy I did. I made the switch to a full cloud work environment about 6 months ago, but hadn’t tried actually developing that way (my current job doesn’t require me to do a lot of actual coding) so I thought it a good idea to give it a go with a small project and see how it would work.

Starter: Sign-up to new project

The initial sign-up is very smooth and quick. Not many details to fill-in and, most importantly: they do not force you to give a credit card (A REAL TRIAL! :)). You can then go on and create 1 private (as in, without anyone else being able to look at your source code) project with the free account and that is where the real fun starts.

When you create a new project, this is called a “Workspace” in Cloud9. You can choose from a variety of starter packs (that pre-configure your workspace for the types of technology you’re going to use) or simply go for something “custom”. The first interesting thing I saw whilst creating this workspace was “clone from url”. This option enabled me to specify a github url and create a workspace directly linked to it (pulling the code and letting me commit without a problem). That was a really nice surprise to start off with, as I was anxious as to how I would solve problems with getting stuff into the cloud during my development process.

First steps

The IDE looks pretty neat from the first try. Here is an example of both the first page you see (upon project creation — node.js here) and some syntax highlighting

cloud9 new project screenCloud 9 screen with syntax highlights

The editor is really smooth and definitely works as nicely as any text-editor I have used natively (granted, I haven’t tried a 3000 line file yet, but still). It is very easy to create files, write code and most importantly… run it…

Running your code

It is in running, testing and debugging my code that I see the enormous benefit of using cloud9. A couple of things quickly jump to mind:

  1. Live-preview in the same browser tab. It simply updates as you save your files
  2. SauceLabs integration enables you to test in ANY browser you want – MOBILE INCLUDED. Yup, you heard that right: it takes 10 seconds to save your file and have it run on both an emulated android and an ios device…

cloud9 mobile testing with saucelabs

  1. Live link. If the “live preview” is not good enough for you and you want to test your code outside of the cloud9IDE preview, you can simply take the link and open it up in another tab, to test it the old fashioned way.

Wonderful easter-eggs

Whilst getting to grips with Cloud9, I was trying to learn a little on html5 mobile app development at the same time, so I wanted to use phonegap and, more specifically, ionic (a framework based around phonegap for html5 mobile development). That is when the power of the terminal became really apparent. I thought I would have to go through all the trouble to get node.js installed and then make it work with phonegap, but no. Node.js was already fully running and the only command I had to put into the terminal was “npm install -g cordova ionic”. That was it… and I’m not even kidding… No errors, no hassle, everything simply installed and my whole workspace was set-up to start developing apps for mobile…

Another useful thing was that at some point I wanted a public URL for my app. As it was HTML5 I also wanted to support normal browsers so I decided to get a heroku app and push it there. Again, I thought I would have to set up the heroku toolbelt and some other things to get this working, but no… IT WAS ALREADY THERE. This meant that the whole process of pushing my code live on a new heroku app took under a minute (setting up the new heroku app INCLUDED).

Conclusion

After 3 days (over the space of 3 weeks) with Cloud9IDE, I am completely sold. I think it is one of the better applications I have tried out over the last years and definitely feels like a major leap forward in the development landscape in general.

I haven’t tried out very heavy set-ups yet, so I’m not saying this is for everyone and every project, but I am definitely recommending this for small to medium-scale web development and any html5 mobile development.

Hope this overview was useful, but let me know if you have any thoughts / comments!

 

 

Development of an Android Application for Moodle – Pre-development (1)

As I am approaching the end of my time at King’s College London, I have to write a BSc project. In my case, I decided to write an Android application that interfaces with Moodle and a timetabling solution, to give students a nice client when they forgot to download their slides, take notes and interact with fellow students. As my work might someday be useful to someone, I thought I’d just start writing about it as it goes along. Most of the parts of what will be written here are parts of my report, so please do excuse me if they seem a bit formal. This post is the first of two that outline my considerations before I started developing.

Building on top of an existing project

In today’s globalised and internet-enabled world, people are starting and abandoning projects all the time. By nature, developers are builders and our first instinct is to start from scratch no matter what we do. However, this leads to massive time-wasting, creating the same software over and over again without even taking the time to see what is already out there. Re-inventing the wheel is not productive and should be avoided as much as possible.

As the open-source movement has exploded in the past couple of years, there are many projects available whose authors are more than happy for you to hack around with their existing source code, as long as they are attributed the credit where appropriate. For this reason, I owed it to the credibility of the project to find out if there was an existing basis that I could build my application on top of and my search was fruitful.

As my background research pointed out, at the start of my project there were two Android applications available that properly integrated with Moodle. One of them turned out to be fully open-sourced and its main developer more than happy to help out.

Moodle-for-Android (initial project)

Moodle-for-Android[1] is a project that was started by a group of Monash IT students in collaboration with Yew Cheung International School Puxi Campus and presents very similar features to my initial project specifications

Features

The application is working, although a little buggy and currently integrates the following functionality

Authenticating a user through Moodle

The application provides a way for the user to authenticate to the correct Moodle instance, obtains a token and uses it to authenticate its requests for information at later stages. This authentication method is also referred to as oAuth[2].

Obtaining and displaying the user’s subscribed courses

Once the user is authenticated, he / she has access to a list of courses they are enrolled in through Moodle.

Obtaining the documents related to the user’s courses

The user has access to all of the documents that are uploaded on Moodle, related to the courses they are enrolled in.

Offline storage of documents

The user can decide to download his / her course documents and store them for offline reference. We will be performing a full offline synchronization, meaning that the application checks for updates of documents on the server and re-downloads them when appropriate.

Automatic downloading of documents

The user has a possibility to specify that the application should (or should not) download all of the course documents accessible to it, automatically, for offline usage.

Showing course assignment details and deadlines

The user has access to all of the course assignments that are present on Moodle, related to the courses they are enrolled in. We will only be handling showing the course assignments, meaning the user cannot use any real interaction (like uploading a document).

Providing web-access to forums

Direct access to the web-forums from within the application is not available. However, a list of the existing forums (available to the user on the Moodle platform) is provided, but with web links to them. This enables the user to access these forums on the browser of his / her mobile device (it does mean the user has to re-authenticate him / herself to Moodle within the browser).


[1] https://github.com/M0nk3yofdoom/Moodle-for-Android

[2] http://oauth.net/

A developer / entrepreneurial Windows setup

As I’ve now been under Windows 7 for a couple of months, I’ve had to struggle really getting adapted from my previous Linux setup and thought I’d share my resulting setup, in the hopes it might help someone else out. I will write this in two posts, as it would become a little too long if I didn’t Smile.

VirtualBox

Many years back, when I started developing under WIndows, I was using EasyPHP and so that was my first reaction as soon as I was back. However, now that I am so used to my flexible environment in Linux, EasyPHP simply didn’t do the job any more. Luckily there is VirtualBox and with some tweaking, I managed to set up a really neat development environment.

  • Ubuntu Server 12.04
  • VirtualBox network configured to pass requests for localhost on to the virtual machine
  • Windows host file used to provide actual development names for my websites
  • Map /var/www/ to /sf_media/www, which is a share folder in virtualbox, linking to a folder under my Windows (host) machine

This enables me to go to mydevelopmentdomain.dev in windows and it will serve-up the website in /var/www/mydevelopmentdomain on my virtual development server. I get to fully develop under my Windows environment and still have the full power of a linux server to tweak / debug.

Zend Studio / Eclipse

Without these tools, my life would be a lot harder. Luckily, they are as much available under Windows as they are under Linux, so no real change here. I user Zend for my Web development and Eclipse for any other development.

Github

I had a hard time getting on to it, but I have finally taken the plunge and haven’t regretted it. Github is now my go-to place for source control and luckily they have a very good Windows app available, providing me full git command-line functionality even under Windows ! (or UI if you prefer that).

Next week

This weeks post was focused mostly on the Development setup. Next week I’ll be diving deeper into all the rest (Twitter, Outlook, etc.).

Robot Control Software through Player / Stage

This semester, we had to write some Robot Control Software for a Vacuum cleaning robot based on the Player / Stage environment.

The robot is :

  • Dynamically mapping the environment
  • Cleaning the area while it moves along
  • Avoiding obstacles when it finds them on it’s path

Everything is written in Java and pretty well documented. (Code to be added soon)

Here is a quick video of the final software running :

Android voice control

I have been playing with Android development for quite a while, but two weeks ago I finally finished my first Application. I thought that Text-to-Speech and Speech-to-Text were pretty amazingly easy to integrate and thought I could make everyone benefit from a few snippits, so here is my code (it was almost all done in a single class) :


package com.findarato.cyanide;

import java.util.ArrayList;
import java.util.HashMap;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.speech.RecognizerIntent;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;
import android.speech.tts.TextToSpeech.OnUtteranceCompletedListener;
import android.view.*;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class CyanideRobotActivity extends Activity implements OnClickListener, OnInitListener, OnUtteranceCompletedListener {

private static final int VOICE_RECOGNITION_REQUEST_CODE = 12345;

EditText server = null;
EditText port = null;

TextToSpeech tts = null;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);

final Button buttonStart = (Button) findViewById(R.id.button_start);
final Button buttonStop = (Button) findViewById(R.id.button_stop);
final Button buttonSpeech = (Button) findViewById(R.id.button_speech);
tts = new TextToSpeech(this, this);
tts.setOnUtteranceCompletedListener(this);
server = (EditText) findViewById(R.id.text_ip);
port = (EditText) findViewById(R.id.text_port);

port.setText("9002");

buttonStart.setOnClickListener(this);
buttonStop.setOnClickListener(this);
buttonSpeech.setOnClickListener(this);

}

private void startVoiceRecognitionActivity() {
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, getClass().getPackage().getName());
intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Please tell the robot what to do.");
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 20);
startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE);
}

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
String serverString = server.getText().toString();
int portInt = Integer.parseInt(port.getText().toString());

if(requestCode == VOICE_RECOGNITION_REQUEST_CODE && resultCode == RESULT_OK) {
ArrayList<String> matches = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
for(String match : matches) {
if(match.equalsIgnoreCase("start robot") || match.equalsIgnoreCase("start") || match.equalsIgnoreCase("start cleaning")) {
tts.speak("Starting cleaning now", TextToSpeech.QUEUE_FLUSH, null);
new networkRequest(serverString, portInt, "START").execute();
}
else if(match.equalsIgnoreCase("stop robot") || match.equalsIgnoreCase("stop") || match.equalsIgnoreCase("stop cleaning")) {
tts.speak("Stopping cleaning now, returning to my charging dock.", TextToSpeech.QUEUE_FLUSH, null);
new networkRequest(serverString, portInt, "STOP", true).execute();
}
}
super.onActivityResult(requestCode, resultCode, data);
}
}

@Override
public void onClick(View v) {

String serverString = server.getText().toString();
int portInt = Integer.parseInt(port.getText().toString());

switch(v.getId()) {
case R.id.button_start :
new networkRequest(serverString, portInt, "START").execute();
break;
case R.id.button_stop :
new networkRequest(serverString, portInt, "STOP").execute();
break;
case R.id.button_speech :
HashMap<String, String> extra = new HashMap<String, String>();
extra.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "start voice recognition");
tts.speak("Hello master, what would you like me to do ?", TextToSpeech.QUEUE_ADD, extra);
break;
default:
break;
}

}

@Override
public void onInit(int status) {
// TODO Auto-generated method stub

}

@Override
public void onUtteranceCompleted(String utteranceId) {
if(utteranceId.equals("start voice recognition"))
startVoiceRecognitionActivity();
}
}

The interesting parts are the methods startVoiceRecognitionActivity() and onClick(View v) -> switch statement R.id.button_speech

EDIT : I have created a gihub repo for this, if anyone is interested : https://github.com/JoshuaWohle/Android-Voice-Control