Category Archives: WSU CS

HDP Sandbox Startup Problems?

When I installed the Hortonworks HDP 2.2 Sandbox in my VMware Player, I had a problem after connecting to the first web page indicated on the startup screen. That web page had bad links.

The quick and dirty solution is to explicitly include the port number 8888 in your URL.

If you want to see more detailed description of the problem (as I saw it) and the workaround (that worked for me), go to this blog entry:

https://kevpfowler.wordpress.com/2015/01/28/bad-links-in-hortonworks-hdp-2-2-sandbox-startup/

From the blog kevpfowler » wsu-cs by kevpfowler and used with permission of the author. All other rights reserved by the author.

Hadoop MapReduce Clusters

The assigned MapReduce tutorial on YDN provided a detailed lesson on MapReduce execution and the basics of coding the MapClass and Reduce classes. I thought it was clearly presented and the checkpoint assignment was effective, if not too challenging. As another blogger noted, it may be necessary to reload the tutorial several times to get it to load successfully. But the persistence was worth it.

The article linked below includes a MapReduce example but is more focused on the cluster components and how the Hadoop architecture operates both to provide the HDFS and to execute MapReduce jobs. I found it helpful to understand a bit more of the bigger Hadoop picture in the context of a MapReduce job execution.

http://bradhedlund.com/2011/09/10/understanding-hadoop-clusters-and-the-network/

From the blog kevpfowler » wsu-cs by kevpfowler and used with permission of the author. All other rights reserved by the author.

CS-383 Intro Post

My name is Kevin Fowler and this is my intro post on my CS-383 blog.

I  am a software engineer in the Networking division at Dell. My experience is all in legacy languages, tools and infrastructure. I’m taking this course to learn newer technology concepts and capabilities. Not sure what I will do with it yet – just taking the first step.

From the blog kevpfowler » wsu-cs by kevpfowler and used with permission of the author. All other rights reserved by the author.

my new post

My name is Nico and i am a computer science student currently taken CS 382.

From the blog nicomagic » WSU.CS by enyihnico and used with permission of the author. All other rights reserved by the author.

End Of the Semester

For Jon and I this is the end of the road for undergrad.  This Android project was a great way to end it.  All three of us want to continue to work on the app after school ends, we still have plans for it.

 

I’ve learned quite a bit over the course of the semester, not just coding with Android but how to work with a team.   We all became pretty good at using git, although sometimes the project still hates me and doesn’t want to work but that’s ok.  We have hundreds and hundreds of emails over the past few months talking about the app.  We also took advantage of the library TVs and did a bit of code review at our (bi)-weekly meetings.  Of course, we all learned Java for Android quite a bit, too and attempting to use the GUI for XML.

 

This was a great experience and a great way to end my undergraduate degree.

 

 

Thanks to everyone who helped along the way,

 

James Celona

From the blog jamescelona » WSU CS by jamescelona and used with permission of the author. All other rights reserved by the author.

Using 3rd Party Libraries

Task Butler uses two open source third party libraries: ActionBar Sherlock and AmbilWarna

ActionBarSherlock is an excellent library that emulates the Ice Cream Sandwich action bar in older versions of Android. This was crucial for our app because we were developing for 2.2+, and having to design an entirely different UI would have been inelegant and a massive amount of extra work. Jake Wharton’s ABS uses the same API calls as Android’s official library, so one can follow Google’s API specification to use his library. Google has its own support library with limited features available, but ABS is a much more complete solution. It was critical to the design of our UI and I thank him for developing it and releasing it for free.

The AmbilWarna color picker dialog is a neat piece of code that provides a color selector for users. We needed a way for users to pick colors for their categories and this seemed like a much nicer solution than giving users limited choices like other apps do. Picture attached.

ColorPicker_1

From the blog Code Your Enthusiasm » WSU CS by Jon and used with permission of the author. All other rights reserved by the author.

Task Butler available on Google Play!

As of this writing, our summer/fall project Task Butler is available to be downloaded on the Google Play store! I am very proud of what we accomplished and I invite anyone with an Android device to check it out. Feedback is always appreciated, of course.

 

Grab it here.

From the blog Code Your Enthusiasm » WSU CS by Jon and used with permission of the author. All other rights reserved by the author.

Using IntentService With AlarmManager to Schedule Alarms

Many Linux developers look for a cron like service when starting to develop on Android, well luckily it exists in the form of AlarmManager. AlarmManager allows you to schedule your application to run at a time in the future, however it is cleared on boot–should/can be re registered with the system through OnBoot BroadcastReceiver.

AndroidManifest.xml; you need to register the two BroadcastReceivers, and the service. Also get permission to use the WakeLock, and to get Boot_Completed signal.

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
<application>
     <receiver android:name=".service.OnBootReceiver" >
         <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
         </intent-filter>
     </receiver>

     <receiver android:name=".service.OnAlarmReceiver" >
     </receiver>

     <service android:name=".service.TaskButlerService" >
     </service>
</application>

This is a BroadcastReceiver for the OnBoot complete, used to reschedule alarms with the AlarmManager since after boot the alarms are flashed out. There is only 2 lines of code in the onReceive() method, that is due to your own onReceive() needing to be short. The first line acquires a partial WakeLock to keep the CPU running, while our IntentService is executing.

package edu.worcester.cs499summer2012.service;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

/**
 * BroadCastReceiver for android.intent.action.BOOT_COMPLETED
 * passes all responsibility to TaskButlerService.
 * @author Dhimitraq Jorgji
 *
 */
public class OnBootReceiver extends BroadcastReceiver{
	@Override
	public void onReceive(Context context, Intent intent) {

		WakefulIntentService.acquireStaticLock(context); //acquire a partial WakeLock
		context.startService(new Intent(context, TaskButlerService.class)); //start TaskButlerService
	}
}

IntentService is my favorite way of getting things done in the background, separate from the main thread of my application. Usually I don’t inherit IntentService directly, and I suggest you do the same; define a synchronized method to acquire a WakeLock before you continue on with whatever you need to accomplish.

package edu.worcester.cs499summer2012.service;

import android.app.IntentService;
import android.content.Context;
import android.content.Intent;
import android.os.PowerManager;

/**
 * Acquires a partial WakeLock, allows TaskButtlerService to keep the CPU alive
 * until the work is done.
 * @author Dhimitraq Jorgji
 *
 */
public class WakefulIntentService extends IntentService {
	public static final String
	LOCK_NAME_STATIC="edu.worcester.cs499summer2012.TaskButlerService.Static";;
	public static final String
	LOCK_NAME_LOCAL="edu.worcester.cs499summer2012.TaskButlerService.Local";
	private static PowerManager.WakeLock lockStatic=null;
	private PowerManager.WakeLock lockLocal=null;

	public WakefulIntentService(String name) {
		super(name);
	}
	/**
	 * Acquire a partial static WakeLock, you need too call this within the class
	 * that calls startService()
	 * @param context
	 */
	public static void acquireStaticLock(Context context) {
		getLock(context).acquire();
	}

	synchronized private static PowerManager.WakeLock getLock(Context context) {
		if (lockStatic==null) {
			PowerManager
			mgr=(PowerManager)context.getSystemService(Context.POWER_SERVICE);
			lockStatic=mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
					LOCK_NAME_STATIC);
			lockStatic.setReferenceCounted(true);
		}
		return(lockStatic);
	}

	@Override
	public void onCreate() {
		super.onCreate();
		PowerManager mgr=(PowerManager)getSystemService(Context.POWER_SERVICE);
		lockLocal=mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
				LOCK_NAME_LOCAL);
		lockLocal.setReferenceCounted(true);
	}

	@Override
	public void onStart(Intent intent, final int startId) {
		lockLocal.acquire();
		super.onStart(intent, startId);
		getLock(this).release();
	}

	@Override
	protected void onHandleIntent(Intent intent) {
		lockLocal.release();
	}
}

Now we can simply inheriting the WakeFulIntentService, and do all our work with in one simple method onHandleIntent(Intent). The method can be called from within anywhere in your program and it will handle everything on a background thread like any Service, also safely since it holds a WakeLock until the method completes at which point it returns the lock and exits nicely.

package edu.worcester.cs499summer2012.service;

import java.util.List;

import android.content.Intent;

import edu.worcester.cs499summer2012.database.TasksDataSource;
import edu.worcester.cs499summer2012.task.Task;

/**
 * An IntentService that takes care of setting up alarms for Task Butler
 * to remind the user of upcoming events
 * @author Dhimitraq Jorgji
 *
 */
public class TaskButlerService extends WakefulIntentService{

	public TaskButlerService() {
		super("TaskButlerService");
	}

	@Override
	protected void onHandleIntent(Intent intent) {
		TasksDataSource db = TasksDataSource.getInstance(this); //get access to the instance of TasksDataSource
		TaskAlarm alarm = new TaskAlarm();

		List<Task> tasks = db.getAllTasks(); //Get a list of all the tasks there
		for (Task task : tasks) {
			// Cancel existing alarm
			alarm.cancelAlarm(this, task.getID());

			//Procrastinator and Reminder alarm
			if(task.isPastDue()){
				alarm.setReminder(this, task.getID());
			}

			//handle repeat alarms
			if(task.isRepeating() && task.isCompleted()){
				task = alarm.setRepeatingAlarm(this, task.getID());
			}

			//regular alarms
			if(!task.isCompleted() && (task.getDateDue() >= System.currentTimeMillis())){
				alarm.setAlarm(this, task);
			}
		}
		super.onHandleIntent(intent);
	}
}

At this point you just need a BroadcastReceiver to receive your alarms.

package edu.worcester.cs499summer2012.service;

import edu.worcester.cs499summer2012.database.TasksDataSource;
import edu.worcester.cs499summer2012.task.Task;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;

/**
 * BroadCastReceiver for Alarms, displays notifications as it receives alarm
 * and then starts TaskButlerService to update alarm schedule with AlarmManager
 * @author Dhimitraq Jorgji
 *
 */
public class OnAlarmReceiver extends BroadcastReceiver {
	@Override
	public void onReceive(Context context, Intent intent) {
		WakefulIntentService.acquireStaticLock(context); //acquire a partial WakeLock

		//send notification, bundle intent with taskID
		NotificationHelper notification = new NotificationHelper();
		Bundle bundle = intent.getExtras();
		int id = bundle.getInt(Task.EXTRA_TASK_ID);
		TasksDataSource db = TasksDataSource.getInstance(context);
		Task task = db.getTask(id);

		if(task.hasFinalDateDue() || task.getPriority() == Task.URGENT){
			notification.sendPersistentNotification(context, task); // send basic notification
		} else {
			notification.sendBasicNotification(context, task); // send basic notification
		}

		context.startService(new Intent(context, TaskButlerService.class)); //start TaskButlerService
	}
}

The setAlarm method:
NOTE:I use a method to create PendingIntent so my pending intents mach if the id passed in is the same, and because of of the FLAG_UPDATE_CURRENT the pending intent updates a possibly existing PendingIntent rather than duplicating.

	/**
	 * Set a One Time Alarm using the taskID
	 * @param context
	 * @param id id of task to retrieve task from SQLite database
	 */
	public void setAlarm(Context context, int id){
		TasksDataSource db = TasksDataSource.getInstance(context);
		Task task = db.getTask(id);
		AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
		am.set(AlarmManager.RTC_WAKEUP, task.getDateDue(), getPendingIntent(context, id));
	}

	//get a PendingIntent
	PendingIntent getPendingIntent(Context context, int id) {
		Intent intent =  new Intent(context, OnAlarmReceiver.class)
		.putExtra(Task.EXTRA_TASK_ID, id);
		return PendingIntent.getBroadcast(context, id, intent, PendingIntent.FLAG_UPDATE_CURRENT);
	}

All of the source code for Task Butler can be found on GitHub, including the above code.

Any questions shoot away in the comments bellow.

From the blog Live and Code » WSU CS by dhimitraq and used with permission of the author. All other rights reserved by the author.

QA Testing

The release candidate is ready to go and so starts the crazy amount of bug testing we will need to do.  We need to assure we check all the edge cases and all the scenarios in which the user could break our app.  It reminds me of the last time working before a Mahadev assignment is due and checking if anything could go wrong.  We need to make sure things like:

repeating alarms actually set to the proper date.

what happens if you delete a task right before it’s due, does the alarm still go off? What about deleting it before looking at the notification? (we corrected this one earlier)

What happens if you set something to go off in the past, how will our app handle it?

Do the notifications stack correctly if it repeats frequently?

Does the app do anything about SQL injection?

Does anything happen if a task has all the same information?

what about categories, does the name matter?

If you create a category in a different activity can you use it in addTaskActivity?

———

The list seems to be endless and ones where we need to create like 20 tasks to make sure everything works at that high of a load is up to Jon/Dhimitri since my VM doesn’t really play nice.

Questions like these are a great way to test to make sure the app is functional.  I’ll doing another write up about what google would like our app to.

From the blog jamescelona » WSU CS by jamescelona and used with permission of the author. All other rights reserved by the author.

Library’s TV is Very Useful

Who would have thought our Library’s TV could be so useful for group projects involving programming. James had an idea to bring a HDMI cable in to allow us to show code each other easier; we don’t have to crowd behind one person’s laptop, this was a lot more comfortable. The meeting went longer than expected, however it helped us set the direction we wanted to go with the app, as well as debug, and write some code.

From the blog Live and Code » WSU CS by dhimitraq and used with permission of the author. All other rights reserved by the author.