Windows Phone App Smokers Anonymous

need a few more tweeks, been up the walls at work with Cfengine!

65 days off the smokes!

http://www.windowsphone.com/en-IE/apps/4cbe6f50-2967-421c-bfd9-cf54698db444





Share this article

Android AppWidget TableLayout

As most developers have found out, appwidgets break the normal rules when it comes to widget development.
Due to the abstract class ( appwidgetProvider ) and the updating through RemoteViews

You’re quite limited in the use of the different layout controls that are available.
namely :

  • FrameLayout
  • LinearLayout
  • RelativeLayout

So how do we get a table layout, that automatically expands or fills the available space?

The answer is clever use of of the weight attributes of linearLayout and the children components.
Here is an example of a timetable.

9 – 6 / Mon – friday.

Note* i have an image up the top right, you may wont to replace this with something else!

Scroll to the end for an example on how to loop through the cells

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="fill_parent" android:layout_height="fill_parent"
	android:padding="0px" android:orientation="vertical">
	
	<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
		android:orientation="horizontal" android:layout_width="fill_parent"
		android:layout_margin="0px" android:layout_height="wrap_content">

		<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
			android:src="@drawable/ul"
			android:layout_width="fill_parent"
  			android:layout_height="wrap_content"
  			android:layout_weight="1"
  			android:layout_marginTop="6dp"
  			android:adjustViewBounds="true"
  			android:maxHeight="30px"/>

		<TextView xmlns:android="http://schemas.android.com/apk/res/android"
			android:layout_width="fill_parent" android:layout_height="wrap_content"
			android:layout_weight="1" android:text="Mon" android:gravity="center"
		/>

		<TextView xmlns:android="http://schemas.android.com/apk/res/android"
			android:layout_width="fill_parent" android:layout_height="wrap_content"
			android:layout_weight="1" android:text="Tue" android:gravity="center"
		/>

		<TextView xmlns:android="http://schemas.android.com/apk/res/android"
			android:layout_width="fill_parent" android:layout_height="wrap_content"
			android:layout_weight="1" android:text="Wed" android:gravity="center"
		/>

		<TextView xmlns:android="http://schemas.android.com/apk/res/android"
			android:layout_width="fill_parent" android:layout_height="wrap_content"
			android:layout_weight="1" android:text="Thu" android:gravity="center"
		/>

		<TextView xmlns:android="http://schemas.android.com/apk/res/android"
			android:layout_width="fill_parent" android:layout_height="wrap_content"
			android:layout_weight="1" android:text="Fri" android:gravity="center"
		/>

	</LinearLayout>

	<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
		android:orientation="vertical" android:layout_width="fill_parent"
		android:layout_height="fill_parent"
		android:layout_margin="0px" android:layout_weight="1.0" android:id="@+id/mainTable">	

		<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
			android:orientation="horizontal" android:layout_width="match_parent"
			android:layout_height="wrap_content" android:layout_weight="1.0">

			<TextView xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:gravity="center" android:layout_weight="1" android:text="09:00" />

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/mon9"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/ue9"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/wed9"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/hu9"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/fri9"/>

		</LinearLayout>

		<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
			android:orientation="horizontal" android:layout_width="match_parent"
			android:layout_height="wrap_content" android:layout_weight="1.0">

			<TextView xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:gravity="center" android:layout_weight="1" android:text="10:00" />

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/mon10"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/ue10"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/wed10"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/hu10"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/fri10"/>

		</LinearLayout>

		<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
			android:orientation="horizontal" android:layout_width="match_parent"
			android:layout_height="wrap_content" android:layout_weight="1.0">

			<TextView xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:gravity="center" android:layout_weight="1" android:text="11:00" />

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/mon11"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/ue11"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/wed11"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/hu11"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1"android:id="@+id/fri11"/>

		</LinearLayout>

		<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
			android:orientation="horizontal" android:layout_width="match_parent"
			android:layout_height="wrap_content" android:layout_weight="1.0">

			<TextView xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:gravity="center" android:layout_weight="1" android:text="12:00" />

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/mon12"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/ue12"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/wed12"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/hu12"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/fri12"/>

		</LinearLayout>

		<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
			android:orientation="horizontal" android:layout_width="match_parent"
			android:layout_height="wrap_content" android:layout_weight="1.0">

			<TextView xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:gravity="center" android:layout_weight="1" android:text="13:00" />

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/mon13"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/ue13"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/wed13"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/hu13"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/fri13"/>

		</LinearLayout>

		<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
			android:orientation="horizontal" android:layout_width="match_parent"
			android:layout_height="wrap_content" android:layout_weight="1.0">

			<TextView xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:gravity="center" android:layout_weight="1" android:text="14:00" />

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/mon14"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/ue14"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/wed14"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/hu14"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/fri14"/>

		</LinearLayout>

		<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
			android:orientation="horizontal" android:layout_width="match_parent"
			android:layout_height="wrap_content" android:layout_weight="1.0">

			<TextView xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:gravity="center" android:layout_weight="1" android:text="15:00" />

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/mon15"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/ue15"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/wed15"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/hu15"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/fri15"/>

		</LinearLayout>

		<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
			android:orientation="horizontal" android:layout_width="match_parent"
			android:layout_height="wrap_content" android:layout_weight="1.0">

			<TextView xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:gravity="center" android:layout_weight="1" android:text="16:00" />

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/mon16"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/thu17"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/wed16"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/hu16"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/fri16"/>

		</LinearLayout>

		<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
			android:orientation="horizontal" android:layout_width="match_parent"
			android:layout_height="wrap_content" android:layout_weight="1.0">

			<TextView xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:gravity="center" android:layout_weight="1" android:text="17:00" />

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/mon17"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/ue17"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/wed17"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/thu17"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/fri17"/>

		</LinearLayout>

	</LinearLayout>

</LinearLayout>

And just in case your wondering how you can easily loop through them

RemoteViews views = new RemoteViews( context.getPackageName() , R.layout.widget );

for ( int i = 9 ; i < 18 ; i++ )
{
	try
	{
	        int monid = R.id.class.getField( "mon" + i ).getInt( 0 );
		views.setOnClickPendingIntent( monid , this.createOnClickPendingIntent( context ) );

		int tueid = R.id.class.getField( "tue" + i ).getInt( 0 );
		views.setOnClickPendingIntent( tueid , this.createOnClickPendingIntent( context ) );

		int wedid = R.id.class.getField( "wed" + i ).getInt( 0 );
		views.setOnClickPendingIntent( wedid , this.createOnClickPendingIntent( context ) );

		int thuid = R.id.class.getField( "thu" + i ).getInt( 0 );
		views.setOnClickPendingIntent( thuid , this.createOnClickPendingIntent( context ) );

		int friid = R.id.class.getField( "fri" + i ).getInt( 0 );
		views.setOnClickPendingIntent( friid , this.createOnClickPendingIntent( context ) );

		Log.e( "done" , "Hour : " + i );
	}
	catch ( Exception k )
	{
		Log.e( "ffdsfdsfs" , "ERROR : " + k.getMessage() );
	}
}


Share this article

Android Custom Toast View from Service

Android documentation is something to be desired ;).

Given the following tutorial on creating Custom Toast Notifications.
Toast Notifications

They neglect to say how to do it from a service!

LayoutInflater inflater = ( LayoutInflater ) getSystemService( LAYOUT_INFLATER_SERVICE );
View layout = inflater.inflate( R.layout.toastview , null );

ImageView image = ( ImageView ) layout.findViewById( R.id.image );
image.setImageResource( R.drawable.meteor );
TextView text = ( TextView ) layout.findViewById( R.id.text );
text.setText( this.client.getLastError() );

Toast toast = new Toast( getApplicationContext() );
toast.setGravity( Gravity.CENTER_VERTICAL , 0 , 0 );
toast.setDuration( Toast.LENGTH_LONG );
toast.setView( layout );
toast.show();


Share this article

Chrome Linux Save Flash Files

So i came across this handy scripts.

As part of some new offensive ;), or maybe just privacy concerns for the user.
Flash now right after beginning a FLV download
deletes the file from the /tmp directory

As it still has a lock on the file descriptor, it disappears right after the flash player closes.

Let the video finish streaming and then run this script
It will save the deleted flv videos with open file descriptors into the folder where you have run the script.

#!/usr/bin/perl
# Filename:	flashcache
# Author:	David Ljung Madison <DaveSource.com>
# See License:	http://MarginalHacks.com/License/
# Description:	Copy flash files in your browsers cache
# Dependencies:	Unix command 'lsof'
use strict;

##################################################
# Setup the variables
##################################################
my $PROGNAME = $0; $PROGNAME =~ s|.*/||;

my $LSOF = 'lsof';

my $FIND = 'flash';	# Find flash files
my $POST = 'flv';	# Postfix to save to

# Where we save files
#   %f is $FIND
#   %d is the next available number
#   %p is .$POST
my $DEST = "found%f.%d%p";

##################################################
# Usage
##################################################
sub fatal {
	foreach my $msg (@_) { print STDERR "[$PROGNAME] ERROR:  $msg\n"; }
	exit(-1);
}

sub usage {
	foreach my $msg (@_) { print STDERR "ERROR:  $msg\n"; }
	print STDERR <<USAGE;

Usage:\t$PROGNAME [-d]
  Copies deleted flash files currently open in your browser's cache
  -d             Set debug mode
  -find <str>    What to search for  [default $FIND]
  -post <str>    Postfix for saving files [default $POST]
  -dest <str>    Or just specify full destination [default $DEST]
                 (see the script for meanings of %f, %d, %p)

USAGE
	exit -1;
}

sub parseArgs {
	usage("You need to be on a system that uses /proc") unless -d '/proc';

	my $opt = {
		find => $FIND,
		post => $POST,
		dest => $DEST,
	};
	while (my $arg=shift(@ARGV)) {
		if ($arg =~ /^-h$/) { usage(); }
		if ($arg =~ /^-d$/) { $MAIN::DEBUG=1; next; }
		if ($arg =~ /^-find$/) { $opt->{find} = shift(@ARGV); next; }
		if ($arg =~ /^-post$/) { $opt->{post} = shift(@ARGV); next; }
		if ($arg =~ /^-dest$/) { $opt->{dest} = shift(@ARGV); next; }
		if ($arg =~ /^-/) { usage("Unknown option: $arg"); }
		usage("Too many files specified [$arg and $opt->{file}]") if $opt->{file};
	}

	usage("You need to specify a destination with -dest")
		unless $opt->{dest};
	
	usage("You need to specify something to search for with -find")
		unless $opt->{find};
	
	$opt;
}

sub debug {
	return unless $MAIN::DEBUG;
	foreach my $msg (@_) { print STDERR "[$PROGNAME] $msg\n"; }
}

##################################################
# Main code
##################################################
sub findFiles {
	my ($opt) = @_;
	my @found;
	# 'lsof /'  (The '/' just does files, no sockets, and is faster)
	open(LSOF,"$LSOF /|") || usage("Can't run [$LSOF]");
	while (<LSOF>) {
		next unless /delete/i;
		next unless /\Q$opt->{find}\E/i;
		chomp;
		# procname  pid  user   fd
		usage("Found it, can't parse it [$_]")
			unless /^\S+\s+(\d+)\s+\S+\s+(\d+)/;
		push(@found, [$1,$2]);
	}
	usage("Couldn't find any deleted cached $opt->{find} files")
		unless @found;
	@found;
}

sub procPath {
	my ($pid,$fd) = @_;
	my $path = "/proc/$pid";
	usage("Couldn't find $path") unless -d $path;
	$path .= '/fd';
	usage("Couldn't find $path") unless -d $path;
	$path .= "/$fd";
	usage("Couldn't read $path") unless -e $path;
	$path;
}

sub destPath {
	my ($opt) = @_;
	my $p = $opt->{dest};
	$p =~ s/%f/\Q$opt->{find}\E/g;
	$p =~ s/%p/.\Q$opt->{post}\E/g;
	my $num = 0;
	my $path;
	do {
		$path = $p;  $num++;
		$path =~ s/%d/$num/g;
	} until ! -f $path;
	$path;
}

sub main {
	my $opt = parseArgs();
	
	my @found = findFiles($opt);
	foreach my $found ( @found ) {
		my $src = procPath(@$found);
		my $dest = destPath($opt);
		print "$src -> $dest\n";
		system("/bin/cp",$src,$dest);
	}
}
main();


Share this article

Meteor Desktop Texting C# WPF

Take advantage of those 300 texts that are sitting there for free!

You know what i mean, meteor is horrible for managing contacts etc.
With this app, you can do it from the comfort of your desktop!

  • Shows a dropdownlist of your contacts
  • Imports contacts from CSV
  • Multiple recipients

Download Solution



Share this article

Android API & Java

So I’m kinda pissed

I bought a new Android HTC Desire HD which I’m fairly happy with.

I bought it with the intent of developing an application over the next year as part of my FYP for college.
During my dabbling in the first few hours, I began to realize why I hate Java and its every growing obscure complexity.

Lets look at 3 separate blunders from a fundamental level, in learning this new technology.

1.

First of all, lets leave Java aside a moment and focus on the Android.
intent, view, remoteview, activity, context, ApplicationContext, ActionBar, Fragment, IntentService, ListActivity …

If your a programmer and never looked at the Android API your probably wondering what these mean exactly?
EXACTLY – epic fail number one, this is the type of stuff you would expect from the Java community,
bizarre names to describe b****y windows and controls!

Coming from the Linux world i have no problem with odd programs with odd names, you get quiet used to it.
But to be fair in a programming world, the concepts, techniques etc are all the same regardless of the language.

That said, why change the name of Window / Frame / whatever to Activity, an activity could mean 200 bloody things!

From the Android API
” An activity is a single, focused thing that the user can do. Almost all activities interact with the user,
so the Activity class takes care of creating a window for you in which you can place your UI with setContentView(View). “

It’s a f******g window, why oh why did you have to go with these bizarre names,
as you get further into the API the names just get weired and weirder, its like learning French, who cares about French!

This reminds me of SOAP in Java, JAX-WS, POJO, SEI, WSDL, GlassFish
and the list goes on with every increasing obscurity to define very simple web concepts.

2.

One more thing on Android API that i really wish they would get rid of
@‘ what about @?

As you start too look through the Java XML files, you start seeing all these @’s’
Soon enough, after some files, you realize that the @ symbol is some whatever overloaded depending on the context.

One moment its referencing a string element and in another an actual XML file.
As your code is ever growing, you start to see @‘s all over the place.
Your following @‘s along and by the time to find what exactly you’ve been trying to figure out,
You can’t remember were you were @.

3.

Modifiability, extensibility and dependency management.
Many of the controls which i have describe are implemented from almost concrete implementations.
Which means its very difficult to overload anything or change the behavior of a widget to do what you want.

Not only this, but when the API changes it breaks all previous code, and suddenly your left with code samples
on the android site, that simply don’t work, and you spend half your time figuring out what has changed in order to fix it!

 

Conclusion

These guys could actually learn something from Microsoft.
Yes these guys took Java and made something usable out of it C#.

Take a look at Windows Presentation Foundation Applications. The XAML makes sense
and the attributes of the elements make sense..

 

 



Share this article

Konane MiniMax Algorythm

As part of intelligent systems i wrote a minimax algorithm

Here my implementation

Note* I’ve already submitted this, wouldn’t recommend you pawn it off as your own!

This report explains the implementation

import java.util.ArrayList;
import ie.ul.konane.Konane;
import ie.ul.konane.KonaneMove;
import ie.ul.konane.Player;

/**
 * MiniMax DFS Implementation to play Konane
 *
 * @author David O Neill ( 0813001 )
 * @version 4.0
 */

public class C0813001 extends Player
{
	private Konane currentState;

	/**
	 * Constructor
	 *
	 * @param pName ( The name Associated with the user )
	 */

	public C0813001( String pName )
	{
		super( pName );
	}

	/* (non-Javadoc)
	 * @see ie.ul.konane.Player#initialize(char)
	 */

	@Override
	public void initialize( char pColour )
	{
		this.name = "0813001";
		this.colour = pColour;
	}

	/**
	 * Instantiates the tree and gets the best move
	 *
	 * @return KonaneMove ( the next best move )
	 */

	private KonaneMove decideMyMove()
	{
		KonaneMove move = null;

		if( this.currentState.generateMoves( this.colour ).size() == 0 )
		{
			KonaneMove gameOver = new KonaneMove( 0 , 0 );
			gameOver.lostGame();
			return gameOver;
		}

		try
		{
			Tree tree = new Tree( this.currentState , this.colour );
			move = tree.getNextMove();
		}
		catch ( Exception e )
		{
			move = this.currentState.generateMoves( this.colour ).get( 0 );
			System.out.println( e.getMessage() );
			e.printStackTrace();
		}

		return move;
	}

	/* (non-Javadoc)
	 * @see ie.ul.konane.Player#makeMove(ie.ul.konane.Konane)
	 */

	@Override
	public KonaneMove makeMove( Konane game )
	{
		this.currentState = game;
		KonaneMove m = this.decideMyMove();
		return m;
	}

}

/**
 * MiniMax DFS Implementation to play Konane
 *
 * @author David O Neill ( 0813001 )
 * @version 4.0
 */

class Tree
{
	public static char PLAYER;
	public static char OPPONENT;
	public static int MAXDEPTH;
	public static int MAXVALUE;
	public static int MINVALUE;
	public static char heurisitic;
	private Node head;

	/**
	 * Java's version of a static constructor
	 */

	static
	{
		Tree.MAXDEPTH = 4;
		Tree.MAXVALUE = Integer.MAX_VALUE - ( Tree.MAXDEPTH * 5000 );
		Tree.MINVALUE = Integer.MIN_VALUE + ( Tree.MAXDEPTH * 5000 );
		Tree.heurisitic = 'b';
	}

	/**
	 * Constructor for the Tree
	 *
	 * @param board ( the current Konane )
	 * @param me ( the char representing my color )
	 */

	public Tree( Konane board , char me )
	{
		Tree.PLAYER = me;
		Tree.OPPONENT = ( me == 'w' ) ? 'b' : 'w';
		this.head = new Node( board );
	}

	/**
	 * After the tree has completed evaluating itself
	 * This is use to get the move that was pushed to the top
	 *
	 * @return KonaneMove ( the best move )
	 */

	public KonaneMove getNextMove()
	{
		return this.head.getBestChild().getLastMove();
	}
}

/**
 * MiniMax DFS Implementation to play Konane
 *
 * @author David O Neill ( 0813001 )
 * @version 4.0
 */

class Node
{
	private boolean max;

	private Konane currentBoard;
	private int currentDepth = 0;

	private ArrayList< Node > nextNodes = null;
	private ArrayList< KonaneMove > nextMoves = null;

	private KonaneMove moveThatCreatedState = null;
	private Node parentNode = null;
	private Node bestChildNode = null;

	private int heuristicValue = 0;

	/**
	 * Default constructor for the Head	 *
	 * This is the current state ( not considered a move )
	 * Begins the recursive generation of the Tree
	 *
	 * @param board ( Konane the current state )
	 */

	public Node( Konane board )
	{
		this.max = false;
		this.nextNodes = new ArrayList< Node >();
		this.currentBoard = board;
		this.currentDepth = 0;
		this.generateNextNodes( Tree.PLAYER , this.max );
	}

	/**
	 * Overloaded constructor
	 * Recursively generates next moves until MAXDEPTH is reached
	 * The base case is, if this node's heuristic value is better than its parents
	 * Then push this child Node to its parent's Node
	 *
	 * @param board ( Konane, that was generate for the next possible move )
	 * @param depth ( The depth of this Node )
	 * @param isMax ( Indicates whether its a min or max node )
	 * @param move ( The KonaneMove that generated this state )
	 * @param parent ( The parent of this state )
	 * @param whichPlayer ( The player at this depth )
	 */

	public Node( Konane board , int depth , boolean isMax , KonaneMove move , Node parent , char whichPlayer )
	{
		this.parentNode = parent;
		this.moveThatCreatedState = move;
		this.max = isMax;
		this.currentDepth = depth;
		this.nextNodes = new ArrayList< Node >();
		this.currentBoard = board;
		this.generateNextNodes( whichPlayer , this.max );

		if( parent.getBestChild() == null )
		{
			parent.setHeurisiticValue( this.heuristicValue , this );
		}
		else
		{
			if( this.max )
			{
				if( this.heuristicValue > parent.getHeurisiticValue() )
				{
					parent.setHeurisiticValue( this.heuristicValue , this );
				}
			}
			else
			{
				if( this.heuristicValue < parent.getHeurisiticValue() )
				{
					parent.setHeurisiticValue( this.heuristicValue , this );
				}
			}
		}
		this.nextMoves.clear();
		this.nextNodes.clear();
	}

	/**
	 * Gets the list of possible moves
	 * And generates the next Node states for each move
	 *
	 * @param whichPlayer ( The player at this depth )
	 * @param isMax ( is max or min )
	 */

	private void generateNextNodes( char whichPlayer , boolean isMax )
	{
		Konane newBoard;
		Node tempNode;
		KonaneMove possibleMove;

		this.nextMoves = this.currentBoard.generateMoves( whichPlayer );

		this.calculateHeuristicValue();

		if( this.currentDepth == Tree.MAXDEPTH )
		{
			return;
		}
		else
		{
			for ( int counter = 0 ; counter < this.nextMoves.size() ; counter++ )
			{
				newBoard = new Konane( this.currentBoard );
				possibleMove = new KonaneMove( this.nextMoves.get( counter ) );

				try
				{
					newBoard.makeMove( whichPlayer , possibleMove );
				}
				catch ( Exception e )
				{
					e.printStackTrace();
				}

				tempNode = new Node( newBoard , this.currentDepth + 1 , !isMax , possibleMove , this , ( whichPlayer == Tree.PLAYER ) ? Tree.OPPONENT : Tree.PLAYER );
				this.nextNodes.add( tempNode );
			}
		}
	}

	/**
	 * Calculates the heuristic value of this Node
	 */

	private void calculateHeuristicValue()
	{
		int mymoves = 1;
		int opmoves = 1;
		int heuristic = this.currentDepth;
		int mypieces = this.currentBoard.countSymbol( Tree.PLAYER );
		int oppieces = this.currentBoard.countSymbol( Tree.OPPONENT );

		if( this.currentDepth > 0 )
		{
			mymoves = ( this.max ) ? this.parentNode.getParentMoveCount() + 1 : this.nextMoves.size() + 1;
			opmoves = ( this.max ) ? this.nextMoves.size() + 1 : this.parentNode.getParentMoveCount() + 1;
		}

		if( this.currentDepth != Tree.MAXDEPTH && this.nextMoves.size() == 0 )
		{
			heuristic += ( this.max == true ) ? Tree.MAXVALUE : Tree.MINVALUE;
		}

		if( Tree.heurisitic == 'a' )
		{
			heuristic += ( int ) Math.round( mymoves - ( opmoves * 3 ) );
		}
		else if( Tree.heurisitic == 'b' )
		{
			heuristic += mymoves - opmoves;
		}
		else if( Tree.heurisitic == 'c' )
		{
			heuristic += ( int ) Math.round( mymoves / ( opmoves * 3 ) );
		}
		else if( Tree.heurisitic == 'd' )
		{
			heuristic += ( int ) Math.round( mymoves / opmoves );
		}
		else if( Tree.heurisitic == 'e' )
		{
			heuristic += ( int ) Math.round( mypieces / ( oppieces * 3 ) );
		}
		else if( Tree.heurisitic == 'f' )
		{
			heuristic += ( int ) Math.round( mypieces / oppieces );
		}
		else
		{
			heuristic += this.nextMoves.size();
		}

		this.heuristicValue = heuristic;
	}

	/**
	 * Gets a count of the moves for this Node
	 * @return ( number of possible moves )
	 */

	public int getParentMoveCount()
	{
		return this.nextMoves.size();
	}

	/**
	 * Gets the heuristic of this Node
	 *
	 * @return ( Heuristic Value )
	 */

	public int getHeurisiticValue()
	{
		return this.heuristicValue;
	}

	/**
	 * Gets the move that created this state
	 *
	 * @return ( The move )
	 */

	public KonaneMove getLastMove()
	{
		return this.moveThatCreatedState;
	}

	/**
	 * Sets the parent of a Node's, Heuristic value and besctChild
	 *
	 * @param betterHeuristicValue ( the heuristic of the child )
	 * @param betterChildNode ( the child )
	 */

	public void setHeurisiticValue( int betterHeuristicValue , Node betterChildNode )
	{
		this.heuristicValue = betterHeuristicValue;
		this.bestChildNode = betterChildNode;
	}

	/**
	 * Gets the parent of a Node
	 *
	 * @return ( the parent Node )
	 */

	public Node getParent()
	{
		return this.parentNode;
	}

	/**
	 * Gets the best child from a Node
	 * Typically used with the Head
	 *
	 * @return ( the best child )
	 */

	public Node getBestChild()
	{
		return this.bestChildNode;
	}

}


Share this article

UL Clashing Timetable

So i got bored!,

I made this application that will fetch modules, courses or just plane students
timetables and overlay them onto one timetable showing free times.

You never know might come in handy?!

Download Visual Studio 2010 Solution



Share this article

C# Mysql Project

I wrote thisĀ applicationĀ as part of Database Systems module

Features

  1. Syntax highlighting
  2. SQL Validation
  3. File Management
  4. history
  5. much much more

If you want to extend it to work with other databases
just implement a concrete implementation of SQLDatabase

Download Visual Studio 2010 Solution



Share this article

Rooting && Flashing the HTC Desire HD

One of the perks of flashing, is better battery life and more responsiveness

This is were i learned ( for HTC DESIRE HD ) REVOLUTION ROM
http://forum.xda-developers.com/showthread.php?t=984045



BEFORE YOU START

In general you want USB debugging on
you find it in the settings somewhere on your phone ( google it )

ROOT

 

  1. Market Place Download – VISIONary
  2. open VISIONary , hit TEMPROOT
  3. if successful hit PERMROOT

POSSIBLE DOWNGRADE

 

  1. If fail then stop
  2. go to the HD revolution page and read, If you need to downgrade, then follow the instructions on that page to do it

CHANGING THE BOOT LOADER

 

  1. Market Place Download – Rom manager
  2. Rom manager will replace your recovery boot loader with clockwork
  3. if you want to see the boot loader, turn off the phone, holding the ( VOL +- ) and POWER ( comes on about 10 seconds later )
  4. the HTC boot manager will load, using the VOL +- to navigate up / down, POWER button to select RECOVERY
  5. the RECOVERY menu has a few options

S-ENG OFF && S-RADIO OFF

 

  1. http://forum.xda-developers.com/showthread.php?t=855403
  2. http://forum.xda-developers.com/showthread.php?t=857537

BACKUP BEFORE FLASHING

 

  1. Choose BACKUP from the recovery menu – it will backup your current ROM SDCARD
  2. When the backup is complete, choose reboot
  3. Market Place Download – APN BACKUP AND RESORE
  4. Open APN and slect BACKUP to BACKUP your Mobile Providers Settings – it will save them to your SDCARD

GETTING READY FOR THE FLASH

 

  1. You should have the following
  2. ROOT ?
  3. Clockwork bootloader
  4. A BACKUP of your current rom
  5. APN BACKUP
  6. USB DEDUGGING ENABLED

THE FLASH

 

  1. Given that your new ROM (REVOLUTION) is on your SDCARD
  2. reboot and go to recovery
  3. Choose WIPE DATA
  4. DO NOT TURN OFF PHONE
  5. Choose restore from zip file
  6. choose REVOLUTION
  7. pop a champagne cork
  8. reboot and your done

POST FLASH

 

  1. Restore APN Settings, you can go onto your Cell Provider and put in these settings manually ( but we already backed them up )
  2. Download Andriod SDK
  3. SET HTC to CHARGE ONLY
  4. go to SDK folder / bin
  5. open up your browser and download APN BACKUP and restore to your pc
  6. put the APK installer file into the SDK folder
  7. CMD > sdb install ./APN installer.apk
  8. its now on your phone, you can use it to restore your APN settings


Share this article

Go to top