Friday, April 11, 2008
Iron Speed Designer
If you are a web developer and dedicated in ASP .NET programming, you maybe feel uncomfortable about the information as follows. What I mean is that you probably could not build a .NET web application more better than it if you already have several years work experience with ASP .NET.
Check out these links.
Iron-Speed Designer Web Site:
http://www.ironspeed.com/products/Landing.aspx?c=CP02
Demo Video:
http://www.ironspeed.com/Designer/5.1.0/Videos/5MinuteVideo/5minutevideo.html
Friday, March 21, 2008
SoftRock FM 102.1
In Cleveland, SoftRock FM 102.1 is the radio channel I listen to it so often. The songs it plays are almost very popular and favorite for people. It also has web site on the Internet for listening. Click "Listen Live" and enjoy it. Here you go. http://www.wdok.com/
Thursday, March 6, 2008
Google Web Toolkit
GWT provides its APIs for developers to write Java code in the program, and then compiles to JavaScript. In the web site of GWT, it gives a lot of features about GWT, and explains how to translate Java code to JavaScript.
Some people may have an question why I need to write Java code instead of JavaScript directly? In my opinion, it is about "software engineering". It may be easy if you only have a small or not so big Ajax application. Once you have more and more projects that need to do, you probably will find that your debugging time is longer than you think and your source code is hard to be reused. Due to these issues above, Google develops this way to deal with Ajax. Using GWT, we can leverage Java's ability and Java IDE tool to build application logic through well-designed object-oriented techniques.
Saturday, March 1, 2008
To promote reusability
1. Loose Coupling
Coupling means that it refers to the degree to which classes depend upon one another, and two classes that are highly dependent upon each other are considered tightly (or highly) coupled. In other words, they cannot be used alone and also not be used for other classes. There are some examples from this book and I draw the class diagrams to explain the idea.
a.) This diagram shows that these two classes have strong coupling. They refer each other and are Bad-designed.
b.) This diagram shows that it uses an interface "FontListener" to reduce the coupling. "FontProperitesPanel" doesn't need to know who implements the interface "FontListener". It just calls the method "fontChanged()" in the interface, and "SampleTextFrame" that implements the interface will response.
c.) This diagram shows we create a "FontPropertiesFrame" class that extends "SampleTextFrame" that can eliminate "SampleTextFrame"’s references to the "FontPropertiesPanel" class and move them into a subclass of SampleTextFrame.
2. Strong Cohesion
If a class is highly cohesive, it means its responsibilities are closely related and that it’s complete. In other words, the class isn’t cohesive if it contains methods that perform unrelated functions or if some set of closely related functions is split across that class and one or more others.
So, I think that these 2 principles are quite useful when we design our classes structure.
Thursday, February 28, 2008
A glimpse of Flex
There is a point that I need to clarify. Flash and Flex is not standard Ajax-based. because both of them need to download Flash plug-in and the SWF file is executed on the plug-in player.
(Data Source from Adobe)
A typical Flex application consists of the following elements.
Flex framewor | The Adobe® Flex 2 framework contains all the components you need to build rich Internet applications, which include: Containers that you use to layout the application Controls you use to gather data from users and to manage the user interface (Text and Button, for example) Extensive data binding, formatting, and validation features An event-driven development model that provides rich user interface transformation features such as effects and transitions. The Flex framework is contained within a shared component library (SWC) file. |
MXML | Every Flex application contains at least one MXML file, known as the main application file. MXML is a markup language, an implementation of XML that was designed specifically for creating Flex applications, and you use it to declaratively define the structure of your application using tags. |
ActionScript 3.0 | You add dynamic behavior to your applications using ActionScript 3.0, which is an implementation of ECMAScript and is similar to JavaScript. You can add ActionScript to Flex applications directly in the MXML file as script blocks or you can create separate files of ActionScript functions and import them into your MXML files. |
CSS | Style attributes in visual components (buttons, list boxes, and so on) are controlled by component properties. For example, a button component has a |
Graphic assets | Like most applications, Flex applications contain a variety of graphic assets such as icons and other images. |
Data | Some components are used to display data (a combo box or data grid for example) and you can populate these components with data by using arrays, collection objects, data models, external XML data sources, and so on. |
(Data Source from Adobe)
Generating the data:
Since Flex applications do not directly connect to a database, you need to interact with data using some kind of service. In the following examples, the Flex HTTPService component is used to retrieve data from an XML file that is generated by PHP.
The first step in connecting to data is to generate the data that will be used in the Flex application. On the PHP side, you would follow these steps:
a. Create a database (MySQL for example) if one does not already exist.
b. Write a PHP script to both connect to the MySQL database and generate the XML-formatted data.P.S: These steps also apply to any other tools you might use to generate the data (ColdFusion, ASP.NET, JSP, JavaEE server, and so on).
The screen shot of Flex 2 Builder:
Thursday, February 21, 2008
A small problem in programming with Java ME
java.lang.NullPointerException
at javax.microedition.lcdui.Alert$1.commandAction(Alert.java:663)
at javax.microedition.lcdui.Alert$timeoutTask.run(Alert.java:1110)
at java.util.TimerThread.mainLoop(+237)
at java.util.TimerThread.run(Timer.java:462)
Based on this Exception message, I checked the source code of Java SE 1.6 version ( Thanks for Sun Microsystems to open the Java source ) of Timer and TimerThread because I cannot see the source in Java ME, so I use JavaSE to guess the structure of JavaME. P.S: The core APIs are still different even the package name are the same. And also, I drew a diagram as follows for myself to figure out the whole situation about my threads, alert, and timertask. This problem I guess is in "Alert" class.
Alert class allows to setup the timing for showing on the screen during it appears, and it still has a TimerThread to control seconds. TimerThread only can do one task at the same time. So there is a situation: If I let my "AlertThread" setup the alert before the alert disappear ( done its work) and it happens more than 1 task needed to do. Then it will occur the problem. After I changed the timeout of the Alert, it didn't happen the problem again.
Using the emulator of Wireless Tool kit 2.5.2 to run TimerMIDlet:
Friday, February 15, 2008
New Android SDK is released!
Thursday, February 14, 2008
A simple Google Android application Part II
main.xml
<Button android:id="@+id/MainButton1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="OK"
android:layout_x="10px" android:layout_y="102px">
</Button>
<Button android:id="@+id/MainButton2"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="Cancel"
android:layout_x="80px" android:layout_y="102px">
</Button>
queen.xml:
<Button android:id="@+id/QueenButton1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="OK"
android:layout_gravity="right">
</Button>
MainActivity.java
package csu.android.applications;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.text.method.*;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
private EditText myEText;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
myEText = (EditText) findViewById(R.id.MainEditText1);
myEText.setInputMethod(DigitsInputMethod.getInstance());
Button okButton = (Button) findViewById(R.id.MainButton1);
Button cancelButton = (Button) findViewById(R.id.MainButton2);
okButton.setOnClickListener(mOKListener);
cancelButton.setOnClickListener(mCancelListener);
}
private OnClickListener mOKListener = new OnClickListener() {
public void onClick(View v) {
String tmp = myEText.getText().toString();
if (!myEText.getText().toString().equals("")) {
int Qnum = Integer.parseInt(tmp);
if (Qnum <= 9) {
// Here we start up the main entry point
Intent intent = new Intent(MainActivity.this, Queen.class);
intent.putExtra("NumKey", tmp);
startActivity(intent);
finish();
} else {
showAlert("The number is bigger than 9!", 0, "Try again!",
"OK", true);
myEText.setText("");
return;
}
}
}
};
private OnClickListener mCancelListener = new OnClickListener() {
public void onClick(View v) {
myEText.setText("");
}
};
}
Queen.java
package csu.android.applications;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import java.util.*;
public class Queen extends Activity {
EditText myEText;
int QueenNum;
int totalcount = 0; // the total number of distinct results.
int uniquecount = 0; // the total number of unique results.
boolean[][] arr;
// Record the scores for mapping
ArrayList
// For check the duplicate solutions
int[][] arrRotation0;
int[][] arrRotation90;
int[][] arrRotation180;
int[][] arrRotation270;
int[][] arrMirror;
private StringBuilder sb;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.queen);
myEText = (EditText) findViewById(R.id.QueenEditText1);
Button backButton = (Button) findViewById(R.id.QueenButton1);
backButton.setOnClickListener(this.mBackListener);
Bundle extras = getIntent().getExtras();
if (extras != null) {
QueenNum = Integer.parseInt(extras.getString("NumKey"));
startCalculation();
myEText.setText(sb.toString());
} else {
showAlert("There is no input!", 0, "Click me", "OK", true);
Intent intent = new Intent(Queen.this, MainActivity.class);
startActivity(intent);
finish();
}
}
private OnClickListener mBackListener = new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(Queen.this, MainActivity.class);
startActivity(intent);
finish();
}
};
/*
* startCalculation This method implements recursion for N*N Queen problem.
*/
public void startCalculation() {
sb = new StringBuilder();
// Array for N*N Queens problem
arr = new boolean[QueenNum][QueenNum];
// Array for calculating the duplicate result.
arrRotation0 = new int[QueenNum][QueenNum];
arrRotation90 = new int[QueenNum][QueenNum];
arrRotation180 = new int[QueenNum][QueenNum];
arrRotation270 = new int[QueenNum][QueenNum];
arrMirror = new int[QueenNum][QueenNum];
al = new ArrayList
// Prepare random numbers inserted into arrays
// for the calculation of the duplication .
prepareRotationData();
// Do recursions
putQtoArray(QueenNum - 1);
}
/*
* putQtoArray This method implements recursion for N*N Queen problem.
* @param: QueenNum
*/
public void putQtoArray(int myNum) {
if (myNum == -1) {
// Find a distinct result.
totalcount++;
// Display the result.
showMe();
return;
}
for (int i = 0; i <>
if (!checkRule(i, myNum)) {
arr[i][myNum] = true;
// Recursion
putQtoArray(myNum - 1);
arr[i][myNum] = false;
}
}
}
}
Because Activity "Queen" will be started by Activity "MainActivity" using Intent, we also need to add a line into AndroidManifest.xml as below, then that is all set. <activity android:name="Queen" android:label="@string/app_name">